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 | 19037398 | 244 days ago | IN | 0 ETH | 0.14884776 |
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 Source Code Verified (Exact Match)
Contract Name:
FabricaToken
Compiler Version
v0.8.23+commit.f704f362
Contract Source Code (Solidity)
/** *Submitted for verification at Etherscan.io on 2024-01-19 */ // Dependency file: @openzeppelin/contracts-upgradeable/utils/AddressUpgradeable.sol // SPDX-License-Identifier: MIT // OpenZeppelin Contracts (last updated v4.9.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 * * Furthermore, `isContract` will also return true if the target contract within * the same transaction is already scheduled for destruction by `SELFDESTRUCT`, * which only has an effect at the end of a transaction. * ==== * * [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://consensys.net/diligence/blog/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.8.0/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern]. */ function sendValue(address payable recipient, uint256 amount) internal { require(address(this).balance >= amount, "Address: insufficient balance"); (bool success, ) = recipient.call{value: amount}(""); require(success, "Address: unable to send value, recipient may have reverted"); } /** * @dev Performs a Solidity function call using a low level `call`. A * plain `call` is an unsafe replacement for a function call: use this * function instead. * * If `target` reverts with a revert reason, it is bubbled up by this * function (like regular Solidity function calls). * * Returns the raw returned data. To convert to the expected return value, * use https://solidity.readthedocs.io/en/latest/units-and-global-variables.html?highlight=abi.decode#abi-encoding-and-decoding-functions[`abi.decode`]. * * Requirements: * * - `target` must be a contract. * - calling `target` with `data` must not revert. * * _Available since v3.1._ */ function functionCall(address target, bytes memory data) internal returns (bytes memory) { return functionCallWithValue(target, data, 0, "Address: low-level call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], but with * `errorMessage` as a fallback revert reason when `target` reverts. * * _Available since v3.1._ */ function functionCall( address target, bytes memory data, string memory errorMessage ) internal returns (bytes memory) { return functionCallWithValue(target, data, 0, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but also transferring `value` wei to `target`. * * Requirements: * * - the calling contract must have an ETH balance of at least `value`. * - the called Solidity function must be `payable`. * * _Available since v3.1._ */ function functionCallWithValue(address target, bytes memory data, uint256 value) internal returns (bytes memory) { return functionCallWithValue(target, data, value, "Address: low-level call with value failed"); } /** * @dev Same as {xref-Address-functionCallWithValue-address-bytes-uint256-}[`functionCallWithValue`], but * with `errorMessage` as a fallback revert reason when `target` reverts. * * _Available since v3.1._ */ function functionCallWithValue( address target, bytes memory data, uint256 value, string memory errorMessage ) internal returns (bytes memory) { require(address(this).balance >= value, "Address: insufficient balance for call"); (bool success, bytes memory returndata) = target.call{value: value}(data); return verifyCallResultFromTarget(target, success, returndata, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but performing a static call. * * _Available since v3.3._ */ function functionStaticCall(address target, bytes memory data) internal view returns (bytes memory) { return functionStaticCall(target, data, "Address: low-level static call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`], * but performing a static call. * * _Available since v3.3._ */ function functionStaticCall( address target, bytes memory data, string memory errorMessage ) internal view returns (bytes memory) { (bool success, bytes memory returndata) = target.staticcall(data); return verifyCallResultFromTarget(target, success, returndata, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but performing a delegate call. * * _Available since v3.4._ */ function functionDelegateCall(address target, bytes memory data) internal returns (bytes memory) { return functionDelegateCall(target, data, "Address: low-level delegate call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`], * but performing a delegate call. * * _Available since v3.4._ */ function functionDelegateCall( address target, bytes memory data, string memory errorMessage ) internal returns (bytes memory) { (bool success, bytes memory returndata) = target.delegatecall(data); return verifyCallResultFromTarget(target, success, returndata, errorMessage); } /** * @dev Tool to verify that a low level call to smart-contract was successful, and revert (either by bubbling * the revert reason or using the provided one) in case of unsuccessful call or if target was not a contract. * * _Available since v4.8._ */ function verifyCallResultFromTarget( address target, bool success, bytes memory returndata, string memory errorMessage ) internal view returns (bytes memory) { if (success) { if (returndata.length == 0) { // only check isContract if the call was successful and the return data is empty // otherwise we already know that it was a contract require(isContract(target), "Address: call to non-contract"); } return returndata; } else { _revert(returndata, errorMessage); } } /** * @dev Tool to verify that a low level call was successful, and revert if it wasn't, either by bubbling the * revert reason or using the provided one. * * _Available since v4.3._ */ function verifyCallResult( bool success, bytes memory returndata, string memory errorMessage ) internal pure returns (bytes memory) { if (success) { return returndata; } else { _revert(returndata, errorMessage); } } function _revert(bytes memory returndata, string memory errorMessage) private pure { // Look for revert reason and bubble it up if present if (returndata.length > 0) { // The easiest way to bubble the revert reason is using memory via assembly /// @solidity memory-safe-assembly assembly { let returndata_size := mload(returndata) revert(add(32, returndata), returndata_size) } } else { revert(errorMessage); } } } // Dependency file: @openzeppelin/contracts-upgradeable/proxy/utils/Initializable.sol // OpenZeppelin Contracts (last updated v4.9.0) (proxy/utils/Initializable.sol) // pragma solidity ^0.8.2; // import "@openzeppelin/contracts-upgradeable/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] * ```solidity * 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. * * Similar to `reinitializer(1)`, except that functions marked with `initializer` can be nested in the context of a * constructor. * * Emits an {Initialized} event. */ 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. * * 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. * * When `version` is 1, this modifier is similar to `initializer`, except that functions marked with `reinitializer` * cannot be nested. If one is invoked in the context of another, execution will revert. * * 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. * * WARNING: setting the version to 255 will prevent any future reinitialization. * * Emits an {Initialized} event. */ 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. * * Emits an {Initialized} event the first time it is successfully executed. */ function _disableInitializers() internal virtual { require(!_initializing, "Initializable: contract is initializing"); if (_initialized != type(uint8).max) { _initialized = type(uint8).max; emit Initialized(type(uint8).max); } } /** * @dev Returns the highest version that has been initialized. See {reinitializer}. */ function _getInitializedVersion() internal view returns (uint8) { return _initialized; } /** * @dev Returns `true` if the contract is currently initializing. See {onlyInitializing}. */ function _isInitializing() internal view returns (bool) { return _initializing; } } // Dependency file: @openzeppelin/contracts-upgradeable/utils/ContextUpgradeable.sol // OpenZeppelin Contracts (last updated v4.9.4) (utils/Context.sol) // pragma solidity ^0.8.0; // import {Initializable} from "@openzeppelin/contracts-upgradeable/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; } function _contextSuffixLength() internal view virtual returns (uint256) { return 0; } /** * @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; } // Dependency file: @openzeppelin/contracts-upgradeable/access/OwnableUpgradeable.sol // OpenZeppelin Contracts (last updated v4.9.0) (access/Ownable.sol) // pragma solidity ^0.8.0; // import "@openzeppelin/contracts-upgradeable/utils/ContextUpgradeable.sol"; // import {Initializable} from "@openzeppelin/contracts-upgradeable/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. Can only be called by the current owner. * * NOTE: Renouncing ownership will leave the contract without an owner, * thereby disabling 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; } // Dependency file: @openzeppelin/contracts-upgradeable/security/PausableUpgradeable.sol // OpenZeppelin Contracts (last updated v4.7.0) (security/Pausable.sol) // pragma solidity ^0.8.0; // import "@openzeppelin/contracts-upgradeable/utils/ContextUpgradeable.sol"; // import {Initializable} from "@openzeppelin/contracts-upgradeable/proxy/utils/Initializable.sol"; /** * @dev Contract module which allows children to implement an emergency stop * mechanism that can be triggered by an authorized account. * * This module is used through inheritance. It will make available the * modifiers `whenNotPaused` and `whenPaused`, which can be applied to * the functions of your contract. Note that they will not be pausable by * simply including this module, only once the modifiers are put in place. */ abstract contract PausableUpgradeable is Initializable, ContextUpgradeable { /** * @dev Emitted when the pause is triggered by `account`. */ event Paused(address account); /** * @dev Emitted when the pause is lifted by `account`. */ event Unpaused(address account); bool private _paused; /** * @dev Initializes the contract in unpaused state. */ function __Pausable_init() internal onlyInitializing { __Pausable_init_unchained(); } function __Pausable_init_unchained() internal onlyInitializing { _paused = false; } /** * @dev Modifier to make a function callable only when the contract is not paused. * * Requirements: * * - The contract must not be paused. */ modifier whenNotPaused() { _requireNotPaused(); _; } /** * @dev Modifier to make a function callable only when the contract is paused. * * Requirements: * * - The contract must be paused. */ modifier whenPaused() { _requirePaused(); _; } /** * @dev Returns true if the contract is paused, and false otherwise. */ function paused() public view virtual returns (bool) { return _paused; } /** * @dev Throws if the contract is paused. */ function _requireNotPaused() internal view virtual { require(!paused(), "Pausable: paused"); } /** * @dev Throws if the contract is not paused. */ function _requirePaused() internal view virtual { require(paused(), "Pausable: not paused"); } /** * @dev Triggers stopped state. * * Requirements: * * - The contract must not be paused. */ function _pause() internal virtual whenNotPaused { _paused = true; emit Paused(_msgSender()); } /** * @dev Returns to normal state. * * Requirements: * * - The contract must be paused. */ function _unpause() internal virtual whenPaused { _paused = false; emit Unpaused(_msgSender()); } /** * @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; } // Dependency file: @openzeppelin/contracts-upgradeable/utils/introspection/IERC165Upgradeable.sol // OpenZeppelin Contracts v4.4.1 (utils/introspection/IERC165.sol) // pragma solidity ^0.8.0; /** * @dev Interface of the ERC165 standard, as defined in the * https://eips.ethereum.org/EIPS/eip-165[EIP]. * * Implementers can declare support of contract interfaces, which can then be * queried by others ({ERC165Checker}). * * For an implementation, see {ERC165}. */ interface 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); } // Dependency file: @openzeppelin/contracts-upgradeable/token/ERC1155/IERC1155Upgradeable.sol // OpenZeppelin Contracts (last updated v4.9.0) (token/ERC1155/IERC1155.sol) // pragma solidity ^0.8.0; // import "@openzeppelin/contracts-upgradeable/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; } // Dependency file: @openzeppelin/contracts-upgradeable/token/ERC1155/IERC1155ReceiverUpgradeable.sol // OpenZeppelin Contracts (last updated v4.5.0) (token/ERC1155/IERC1155Receiver.sol) // pragma solidity ^0.8.0; // import "@openzeppelin/contracts-upgradeable/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); } // Dependency file: @openzeppelin/contracts-upgradeable/token/ERC1155/extensions/IERC1155MetadataURIUpgradeable.sol // OpenZeppelin Contracts v4.4.1 (token/ERC1155/extensions/IERC1155MetadataURI.sol) // pragma solidity ^0.8.0; // import "@openzeppelin/contracts-upgradeable/token/ERC1155/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); } // Dependency file: @openzeppelin/contracts-upgradeable/utils/introspection/ERC165Upgradeable.sol // OpenZeppelin Contracts v4.4.1 (utils/introspection/ERC165.sol) // pragma solidity ^0.8.0; // import "@openzeppelin/contracts-upgradeable/utils/introspection/IERC165Upgradeable.sol"; // import {Initializable} from "@openzeppelin/contracts-upgradeable/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; } // Dependency file: @openzeppelin/contracts-upgradeable/token/ERC1155/ERC1155Upgradeable.sol // OpenZeppelin Contracts (last updated v4.9.0) (token/ERC1155/ERC1155.sol) // pragma solidity ^0.8.0; // import "@openzeppelin/contracts-upgradeable/token/ERC1155/IERC1155Upgradeable.sol"; // import "@openzeppelin/contracts-upgradeable/token/ERC1155/IERC1155ReceiverUpgradeable.sol"; // import "@openzeppelin/contracts-upgradeable/token/ERC1155/extensions/IERC1155MetadataURIUpgradeable.sol"; // import "@openzeppelin/contracts-upgradeable/utils/AddressUpgradeable.sol"; // import "@openzeppelin/contracts-upgradeable/utils/ContextUpgradeable.sol"; // import "@openzeppelin/contracts-upgradeable/utils/introspection/ERC165Upgradeable.sol"; // import {Initializable} from "@openzeppelin/contracts-upgradeable/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 or approved" ); _safeTransferFrom(from, to, id, amount, data); } /** * @dev See {IERC1155-safeBatchTransferFrom}. */ function safeBatchTransferFrom( address from, address to, uint256[] memory ids, uint256[] memory amounts, bytes memory data ) public virtual override { require( from == _msgSender() || isApprovedForAll(from, _msgSender()), "ERC1155: caller is not token owner or approved" ); _safeBatchTransferFrom(from, to, ids, amounts, data); } /** * @dev Transfers `amount` tokens of token type `id` from `from` to `to`. * * Emits a {TransferSingle} event. * * Requirements: * * - `to` cannot be the zero address. * - `from` must have a balance of tokens of type `id` of at least `amount`. * - If `to` refers to a smart contract, it must implement {IERC1155Receiver-onERC1155Received} and return the * acceptance magic value. */ function _safeTransferFrom( address from, address to, uint256 id, uint256 amount, bytes memory data ) internal virtual { require(to != address(0), "ERC1155: transfer to the zero address"); address operator = _msgSender(); uint256[] memory ids = _asSingletonArray(id); uint256[] memory amounts = _asSingletonArray(amount); _beforeTokenTransfer(operator, from, to, ids, amounts, data); uint256 fromBalance = _balances[id][from]; require(fromBalance >= amount, "ERC1155: insufficient balance for transfer"); unchecked { _balances[id][from] = fromBalance - amount; } _balances[id][to] += amount; emit TransferSingle(operator, from, to, id, amount); _afterTokenTransfer(operator, from, to, ids, amounts, data); _doSafeTransferAcceptanceCheck(operator, from, to, id, amount, data); } /** * @dev xref:ROOT:erc1155.adoc#batch-operations[Batched] version of {_safeTransferFrom}. * * Emits a {TransferBatch} event. * * Requirements: * * - If `to` refers to a smart contract, it must implement {IERC1155Receiver-onERC1155BatchReceived} and return the * acceptance magic value. */ function _safeBatchTransferFrom( address from, address to, uint256[] memory ids, uint256[] memory amounts, bytes memory data ) internal virtual { require(ids.length == amounts.length, "ERC1155: ids and amounts length mismatch"); require(to != address(0), "ERC1155: transfer to the zero address"); address operator = _msgSender(); _beforeTokenTransfer(operator, from, to, ids, amounts, data); for (uint256 i = 0; i < ids.length; ++i) { uint256 id = ids[i]; uint256 amount = amounts[i]; uint256 fromBalance = _balances[id][from]; require(fromBalance >= amount, "ERC1155: insufficient balance for transfer"); unchecked { _balances[id][from] = fromBalance - amount; } _balances[id][to] += amount; } emit TransferBatch(operator, from, to, ids, amounts); _afterTokenTransfer(operator, from, to, ids, amounts, data); _doSafeBatchTransferAcceptanceCheck(operator, from, to, ids, amounts, data); } /** * @dev Sets a new URI for all token types, by relying on the token type ID * substitution mechanism * https://eips.ethereum.org/EIPS/eip-1155#metadata[defined in the EIP]. * * By this mechanism, any occurrence of the `\{id\}` substring in either the * URI or any of the amounts in the JSON file at said URI will be replaced by * clients with the token type ID. * * For example, the `https://token-cdn-domain/\{id\}.json` URI would be * interpreted by clients as * `https://token-cdn-domain/000000000000000000000000000000000000000000000000000000000004cce0.json` * for token type ID 0x4cce0. * * See {uri}. * * Because these URIs cannot be meaningfully represented by the {URI} event, * this function emits no events. */ function _setURI(string memory newuri) internal virtual { _uri = newuri; } /** * @dev Creates `amount` tokens of token type `id`, and assigns them to `to`. * * Emits a {TransferSingle} event. * * Requirements: * * - `to` cannot be the zero address. * - If `to` refers to a smart contract, it must implement {IERC1155Receiver-onERC1155Received} and return the * acceptance magic value. */ function _mint(address to, uint256 id, uint256 amount, bytes memory data) internal virtual { require(to != address(0), "ERC1155: mint to the zero address"); address operator = _msgSender(); uint256[] memory ids = _asSingletonArray(id); uint256[] memory amounts = _asSingletonArray(amount); _beforeTokenTransfer(operator, address(0), to, ids, amounts, data); _balances[id][to] += amount; emit TransferSingle(operator, address(0), to, id, amount); _afterTokenTransfer(operator, address(0), to, ids, amounts, data); _doSafeTransferAcceptanceCheck(operator, address(0), to, id, amount, data); } /** * @dev xref:ROOT:erc1155.adoc#batch-operations[Batched] version of {_mint}. * * Emits a {TransferBatch} event. * * Requirements: * * - `ids` and `amounts` must have the same length. * - If `to` refers to a smart contract, it must implement {IERC1155Receiver-onERC1155BatchReceived} and return the * acceptance magic value. */ function _mintBatch( address to, uint256[] memory ids, uint256[] memory amounts, bytes memory data ) internal virtual { require(to != address(0), "ERC1155: mint to the zero address"); require(ids.length == amounts.length, "ERC1155: ids and amounts length mismatch"); address operator = _msgSender(); _beforeTokenTransfer(operator, address(0), to, ids, amounts, data); for (uint256 i = 0; i < ids.length; i++) { _balances[ids[i]][to] += amounts[i]; } emit TransferBatch(operator, address(0), to, ids, amounts); _afterTokenTransfer(operator, address(0), to, ids, amounts, data); _doSafeBatchTransferAcceptanceCheck(operator, address(0), to, ids, amounts, data); } /** * @dev Destroys `amount` tokens of token type `id` from `from` * * Emits a {TransferSingle} event. * * Requirements: * * - `from` cannot be the zero address. * - `from` must have at least `amount` tokens of token type `id`. */ function _burn(address from, uint256 id, uint256 amount) internal virtual { require(from != address(0), "ERC1155: burn from the zero address"); address operator = _msgSender(); uint256[] memory ids = _asSingletonArray(id); uint256[] memory amounts = _asSingletonArray(amount); _beforeTokenTransfer(operator, from, address(0), ids, amounts, ""); uint256 fromBalance = _balances[id][from]; require(fromBalance >= amount, "ERC1155: burn amount exceeds balance"); unchecked { _balances[id][from] = fromBalance - amount; } emit TransferSingle(operator, from, address(0), id, amount); _afterTokenTransfer(operator, from, address(0), ids, amounts, ""); } /** * @dev xref:ROOT:erc1155.adoc#batch-operations[Batched] version of {_burn}. * * Emits a {TransferBatch} event. * * Requirements: * * - `ids` and `amounts` must have the same length. */ function _burnBatch(address from, uint256[] memory ids, uint256[] memory amounts) internal virtual { require(from != address(0), "ERC1155: burn from the zero address"); require(ids.length == amounts.length, "ERC1155: ids and amounts length mismatch"); address operator = _msgSender(); _beforeTokenTransfer(operator, from, address(0), ids, amounts, ""); for (uint256 i = 0; i < ids.length; i++) { uint256 id = ids[i]; uint256 amount = amounts[i]; uint256 fromBalance = _balances[id][from]; require(fromBalance >= amount, "ERC1155: burn amount exceeds balance"); unchecked { _balances[id][from] = fromBalance - amount; } } emit TransferBatch(operator, from, address(0), ids, amounts); _afterTokenTransfer(operator, from, address(0), ids, amounts, ""); } /** * @dev Approve `operator` to operate on all of `owner` tokens * * Emits an {ApprovalForAll} event. */ function _setApprovalForAll(address owner, address operator, bool approved) internal virtual { require(owner != operator, "ERC1155: setting approval status for self"); _operatorApprovals[owner][operator] = approved; emit ApprovalForAll(owner, operator, approved); } /** * @dev Hook that is called before any token transfer. This includes minting * and burning, as well as batched variants. * * The same hook is called on both single and batched variants. For single * transfers, the length of the `ids` and `amounts` arrays will be 1. * * Calling conditions (for each `id` and `amount` pair): * * - When `from` and `to` are both non-zero, `amount` of ``from``'s tokens * of token type `id` will be transferred to `to`. * - When `from` is zero, `amount` tokens of token type `id` will be minted * for `to`. * - when `to` is zero, `amount` of ``from``'s tokens of token type `id` * will be burned. * - `from` and `to` are never both zero. * - `ids` and `amounts` have the same, non-zero length. * * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks]. */ function _beforeTokenTransfer( address operator, address from, address to, uint256[] memory ids, uint256[] memory amounts, bytes memory data ) internal virtual {} /** * @dev Hook that is called after any token transfer. This includes minting * and burning, as well as batched variants. * * The same hook is called on both single and batched variants. For single * transfers, the length of the `id` and `amount` arrays will be 1. * * Calling conditions (for each `id` and `amount` pair): * * - When `from` and `to` are both non-zero, `amount` of ``from``'s tokens * of token type `id` will be transferred to `to`. * - When `from` is zero, `amount` tokens of token type `id` will be minted * for `to`. * - when `to` is zero, `amount` of ``from``'s tokens of token type `id` * will be burned. * - `from` and `to` are never both zero. * - `ids` and `amounts` have the same, non-zero length. * * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks]. */ function _afterTokenTransfer( address operator, address from, address to, uint256[] memory ids, uint256[] memory amounts, bytes memory data ) internal virtual {} function _doSafeTransferAcceptanceCheck( address operator, address from, address to, uint256 id, uint256 amount, bytes memory data ) private { if (to.isContract()) { try 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; } // Dependency file: @openzeppelin/contracts-upgradeable/utils/introspection/ERC165CheckerUpgradeable.sol // OpenZeppelin Contracts (last updated v4.9.0) (utils/introspection/ERC165Checker.sol) // pragma solidity ^0.8.0; // import "@openzeppelin/contracts-upgradeable/utils/introspection/IERC165Upgradeable.sol"; /** * @dev Library used to query support of an interface declared via {IERC165}. * * Note that these functions return the actual result of the query: they do not * `revert` if an interface is not supported. It is up to the caller to decide * what to do in these cases. */ library ERC165CheckerUpgradeable { // As per the EIP-165 spec, no interface should ever match 0xffffffff bytes4 private constant _INTERFACE_ID_INVALID = 0xffffffff; /** * @dev Returns true if `account` supports the {IERC165} interface. */ function supportsERC165(address account) internal view returns (bool) { // Any contract that implements ERC165 must explicitly indicate support of // InterfaceId_ERC165 and explicitly indicate non-support of InterfaceId_Invalid return supportsERC165InterfaceUnchecked(account, type(IERC165Upgradeable).interfaceId) && !supportsERC165InterfaceUnchecked(account, _INTERFACE_ID_INVALID); } /** * @dev Returns true if `account` supports the interface defined by * `interfaceId`. Support for {IERC165} itself is queried automatically. * * See {IERC165-supportsInterface}. */ function supportsInterface(address account, bytes4 interfaceId) internal view returns (bool) { // query support of both ERC165 as per the spec and support of _interfaceId return supportsERC165(account) && supportsERC165InterfaceUnchecked(account, interfaceId); } /** * @dev Returns a boolean array where each value corresponds to the * interfaces passed in and whether they're supported or not. This allows * you to batch check interfaces for a contract where your expectation * is that some interfaces may not be supported. * * See {IERC165-supportsInterface}. * * _Available since v3.4._ */ function getSupportedInterfaces( address account, bytes4[] memory interfaceIds ) internal view returns (bool[] memory) { // an array of booleans corresponding to interfaceIds and whether they're supported or not bool[] memory interfaceIdsSupported = new bool[](interfaceIds.length); // query support of ERC165 itself if (supportsERC165(account)) { // query support of each interface in interfaceIds for (uint256 i = 0; i < interfaceIds.length; i++) { interfaceIdsSupported[i] = supportsERC165InterfaceUnchecked(account, interfaceIds[i]); } } return interfaceIdsSupported; } /** * @dev Returns true if `account` supports all the interfaces defined in * `interfaceIds`. Support for {IERC165} itself is queried automatically. * * Batch-querying can lead to gas savings by skipping repeated checks for * {IERC165} support. * * See {IERC165-supportsInterface}. */ function supportsAllInterfaces(address account, bytes4[] memory interfaceIds) internal view returns (bool) { // query support of ERC165 itself if (!supportsERC165(account)) { return false; } // query support of each interface in interfaceIds for (uint256 i = 0; i < interfaceIds.length; i++) { if (!supportsERC165InterfaceUnchecked(account, interfaceIds[i])) { return false; } } // all interfaces supported return true; } /** * @notice Query if a contract implements an interface, does not check ERC165 support * @param account The address of the contract to query for support of an interface * @param interfaceId The interface identifier, as specified in ERC-165 * @return true if the contract at account indicates support of the interface with * identifier interfaceId, false otherwise * @dev Assumes that account contains a contract that supports ERC165, otherwise * the behavior of this method is undefined. This precondition can be checked * with {supportsERC165}. * * Some precompiled contracts will falsely indicate support for a given interface, so caution * should be exercised when using this function. * * Interface identification is specified in ERC-165. */ function supportsERC165InterfaceUnchecked(address account, bytes4 interfaceId) internal view returns (bool) { // prepare call bytes memory encodedParams = abi.encodeWithSelector(IERC165Upgradeable.supportsInterface.selector, interfaceId); // perform static call bool success; uint256 returnSize; uint256 returnValue; assembly { success := staticcall(30000, account, add(encodedParams, 0x20), mload(encodedParams), 0x00, 0x20) returnSize := returndatasize() returnValue := mload(0x00) } return success && returnSize >= 0x20 && returnValue > 0; } } // Dependency file: @openzeppelin/contracts-upgradeable/utils/math/MathUpgradeable.sol // OpenZeppelin Contracts (last updated v4.9.0) (utils/math/Math.sol) // pragma solidity ^0.8.0; /** * @dev Standard math utilities missing in the Solidity language. */ library MathUpgradeable { enum Rounding { Down, // Toward negative infinity Up, // Toward infinity Zero // Toward zero } /** * @dev Returns the largest of two numbers. */ function max(uint256 a, uint256 b) internal pure returns (uint256) { return a > b ? a : b; } /** * @dev Returns the smallest of two numbers. */ function min(uint256 a, uint256 b) internal pure returns (uint256) { return a < b ? a : b; } /** * @dev Returns the average of two numbers. The result is rounded towards * zero. */ function average(uint256 a, uint256 b) internal pure returns (uint256) { // (a + b) / 2 can overflow. return (a & b) + (a ^ b) / 2; } /** * @dev Returns the ceiling of the division of two numbers. * * This differs from standard division with `/` in that it rounds up instead * of rounding down. */ function ceilDiv(uint256 a, uint256 b) internal pure returns (uint256) { // (a + b - 1) / b can overflow on addition, so we distribute. return a == 0 ? 0 : (a - 1) / b + 1; } /** * @notice Calculates floor(x * y / denominator) with full precision. Throws if result overflows a uint256 or denominator == 0 * @dev Original credit to Remco Bloemen under MIT license (https://xn--2-umb.com/21/muldiv) * with further edits by Uniswap Labs also under MIT license. */ function mulDiv(uint256 x, uint256 y, uint256 denominator) internal pure returns (uint256 result) { unchecked { // 512-bit multiply [prod1 prod0] = x * y. Compute the product mod 2^256 and mod 2^256 - 1, then use // use the Chinese Remainder Theorem to reconstruct the 512 bit result. The result is stored in two 256 // variables such that product = prod1 * 2^256 + prod0. uint256 prod0; // Least significant 256 bits of the product uint256 prod1; // Most significant 256 bits of the product assembly { let mm := mulmod(x, y, not(0)) prod0 := mul(x, y) prod1 := sub(sub(mm, prod0), lt(mm, prod0)) } // Handle non-overflow cases, 256 by 256 division. if (prod1 == 0) { // Solidity will revert if denominator == 0, unlike the div opcode on its own. // The surrounding unchecked block does not change this fact. // See https://docs.soliditylang.org/en/latest/control-structures.html#checked-or-unchecked-arithmetic. return prod0 / denominator; } // Make sure the result is less than 2^256. Also prevents denominator == 0. require(denominator > prod1, "Math: mulDiv overflow"); /////////////////////////////////////////////// // 512 by 256 division. /////////////////////////////////////////////// // Make division exact by subtracting the remainder from [prod1 prod0]. uint256 remainder; assembly { // Compute remainder using mulmod. remainder := mulmod(x, y, denominator) // Subtract 256 bit number from 512 bit number. prod1 := sub(prod1, gt(remainder, prod0)) prod0 := sub(prod0, remainder) } // Factor powers of two out of denominator and compute largest power of two divisor of denominator. Always >= 1. // See https://cs.stackexchange.com/q/138556/92363. // Does not overflow because the denominator cannot be zero at this stage in the function. uint256 twos = denominator & (~denominator + 1); assembly { // Divide denominator by twos. denominator := div(denominator, twos) // Divide [prod1 prod0] by twos. prod0 := div(prod0, twos) // Flip twos such that it is 2^256 / twos. If twos is zero, then it becomes one. twos := add(div(sub(0, twos), twos), 1) } // Shift in bits from prod1 into prod0. prod0 |= prod1 * twos; // Invert denominator mod 2^256. Now that denominator is an odd number, it has an inverse modulo 2^256 such // that denominator * inv = 1 mod 2^256. Compute the inverse by starting with a seed that is correct for // four bits. That is, denominator * inv = 1 mod 2^4. uint256 inverse = (3 * denominator) ^ 2; // Use the Newton-Raphson iteration to improve the precision. Thanks to Hensel's lifting lemma, this also works // in modular arithmetic, doubling the correct bits in each step. inverse *= 2 - denominator * inverse; // inverse mod 2^8 inverse *= 2 - denominator * inverse; // inverse mod 2^16 inverse *= 2 - denominator * inverse; // inverse mod 2^32 inverse *= 2 - denominator * inverse; // inverse mod 2^64 inverse *= 2 - denominator * inverse; // inverse mod 2^128 inverse *= 2 - denominator * inverse; // inverse mod 2^256 // Because the division is now exact we can divide by multiplying with the modular inverse of denominator. // This will give us the correct result modulo 2^256. Since the preconditions guarantee that the outcome is // less than 2^256, this is the final result. We don't need to compute the high bits of the result and prod1 // is no longer required. result = prod0 * inverse; return result; } } /** * @notice Calculates x * y / denominator with full precision, following the selected rounding direction. */ function mulDiv(uint256 x, uint256 y, uint256 denominator, Rounding rounding) internal pure returns (uint256) { uint256 result = mulDiv(x, y, denominator); if (rounding == Rounding.Up && mulmod(x, y, denominator) > 0) { result += 1; } return result; } /** * @dev Returns the square root of a number. If the number is not a perfect square, the value is rounded down. * * Inspired by Henry S. Warren, Jr.'s "Hacker's Delight" (Chapter 11). */ function sqrt(uint256 a) internal pure returns (uint256) { if (a == 0) { return 0; } // For our first guess, we get the biggest power of 2 which is smaller than the square root of the target. // // We know that the "msb" (most significant bit) of our target number `a` is a power of 2 such that we have // `msb(a) <= a < 2*msb(a)`. This value can be written `msb(a)=2**k` with `k=log2(a)`. // // This can be rewritten `2**log2(a) <= a < 2**(log2(a) + 1)` // → `sqrt(2**k) <= sqrt(a) < sqrt(2**(k+1))` // → `2**(k/2) <= sqrt(a) < 2**((k+1)/2) <= 2**(k/2 + 1)` // // Consequently, `2**(log2(a) / 2)` is a good first approximation of `sqrt(a)` with at least 1 correct bit. uint256 result = 1 << (log2(a) >> 1); // At this point `result` is an estimation with one bit of precision. We know the true value is a uint128, // since it is the square root of a uint256. Newton's method converges quadratically (precision doubles at // every iteration). We thus need at most 7 iteration to turn our partial result with one bit of precision // into the expected uint128 result. unchecked { result = (result + a / result) >> 1; result = (result + a / result) >> 1; result = (result + a / result) >> 1; result = (result + a / result) >> 1; result = (result + a / result) >> 1; result = (result + a / result) >> 1; result = (result + a / result) >> 1; return min(result, a / result); } } /** * @notice Calculates sqrt(a), following the selected rounding direction. */ function sqrt(uint256 a, Rounding rounding) internal pure returns (uint256) { unchecked { uint256 result = sqrt(a); return result + (rounding == Rounding.Up && result * result < a ? 1 : 0); } } /** * @dev Return the log in base 2, rounded down, of a positive value. * Returns 0 if given 0. */ function log2(uint256 value) internal pure returns (uint256) { uint256 result = 0; unchecked { if (value >> 128 > 0) { value >>= 128; result += 128; } if (value >> 64 > 0) { value >>= 64; result += 64; } if (value >> 32 > 0) { value >>= 32; result += 32; } if (value >> 16 > 0) { value >>= 16; result += 16; } if (value >> 8 > 0) { value >>= 8; result += 8; } if (value >> 4 > 0) { value >>= 4; result += 4; } if (value >> 2 > 0) { value >>= 2; result += 2; } if (value >> 1 > 0) { result += 1; } } return result; } /** * @dev Return the log in base 2, following the selected rounding direction, of a positive value. * Returns 0 if given 0. */ function log2(uint256 value, Rounding rounding) internal pure returns (uint256) { unchecked { uint256 result = log2(value); return result + (rounding == Rounding.Up && 1 << result < value ? 1 : 0); } } /** * @dev Return the log in base 10, rounded down, of a positive value. * Returns 0 if given 0. */ function log10(uint256 value) internal pure returns (uint256) { uint256 result = 0; unchecked { if (value >= 10 ** 64) { value /= 10 ** 64; result += 64; } if (value >= 10 ** 32) { value /= 10 ** 32; result += 32; } if (value >= 10 ** 16) { value /= 10 ** 16; result += 16; } if (value >= 10 ** 8) { value /= 10 ** 8; result += 8; } if (value >= 10 ** 4) { value /= 10 ** 4; result += 4; } if (value >= 10 ** 2) { value /= 10 ** 2; result += 2; } if (value >= 10 ** 1) { result += 1; } } return result; } /** * @dev Return the log in base 10, following the selected rounding direction, of a positive value. * Returns 0 if given 0. */ function log10(uint256 value, Rounding rounding) internal pure returns (uint256) { unchecked { uint256 result = log10(value); return result + (rounding == Rounding.Up && 10 ** result < value ? 1 : 0); } } /** * @dev Return the log in base 256, rounded down, of a positive value. * Returns 0 if given 0. * * Adding one to the result gives the number of pairs of hex symbols needed to represent `value` as a hex string. */ function log256(uint256 value) internal pure returns (uint256) { uint256 result = 0; unchecked { if (value >> 128 > 0) { value >>= 128; result += 16; } if (value >> 64 > 0) { value >>= 64; result += 8; } if (value >> 32 > 0) { value >>= 32; result += 4; } if (value >> 16 > 0) { value >>= 16; result += 2; } if (value >> 8 > 0) { result += 1; } } return result; } /** * @dev Return the log in base 256, following the selected rounding direction, of a positive value. * Returns 0 if given 0. */ function log256(uint256 value, Rounding rounding) internal pure returns (uint256) { unchecked { uint256 result = log256(value); return result + (rounding == Rounding.Up && 1 << (result << 3) < value ? 1 : 0); } } } // Dependency file: @openzeppelin/contracts-upgradeable/utils/math/SignedMathUpgradeable.sol // OpenZeppelin Contracts (last updated v4.8.0) (utils/math/SignedMath.sol) // pragma solidity ^0.8.0; /** * @dev Standard signed math utilities missing in the Solidity language. */ library SignedMathUpgradeable { /** * @dev Returns the largest of two signed numbers. */ function max(int256 a, int256 b) internal pure returns (int256) { return a > b ? a : b; } /** * @dev Returns the smallest of two signed numbers. */ function min(int256 a, int256 b) internal pure returns (int256) { return a < b ? a : b; } /** * @dev Returns the average of two signed numbers without overflow. * The result is rounded towards zero. */ function average(int256 a, int256 b) internal pure returns (int256) { // Formula from the book "Hacker's Delight" int256 x = (a & b) + ((a ^ b) >> 1); return x + (int256(uint256(x) >> 255) & (a ^ b)); } /** * @dev Returns the absolute unsigned value of a signed value. */ function abs(int256 n) internal pure returns (uint256) { unchecked { // must be unchecked in order to support `n = type(int256).min` return uint256(n >= 0 ? n : -n); } } } // Dependency file: @openzeppelin/contracts-upgradeable/utils/StringsUpgradeable.sol // OpenZeppelin Contracts (last updated v4.9.0) (utils/Strings.sol) // pragma solidity ^0.8.0; // import "@openzeppelin/contracts-upgradeable/utils/math/MathUpgradeable.sol"; // import "@openzeppelin/contracts-upgradeable/utils/math/SignedMathUpgradeable.sol"; /** * @dev String operations. */ library StringsUpgradeable { bytes16 private constant _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) { unchecked { uint256 length = MathUpgradeable.log10(value) + 1; string memory buffer = new string(length); uint256 ptr; /// @solidity memory-safe-assembly assembly { ptr := add(buffer, add(32, length)) } while (true) { ptr--; /// @solidity memory-safe-assembly assembly { mstore8(ptr, byte(mod(value, 10), _SYMBOLS)) } value /= 10; if (value == 0) break; } return buffer; } } /** * @dev Converts a `int256` to its ASCII `string` decimal representation. */ function toString(int256 value) internal pure returns (string memory) { return string(abi.encodePacked(value < 0 ? "-" : "", toString(SignedMathUpgradeable.abs(value)))); } /** * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation. */ function toHexString(uint256 value) internal pure returns (string memory) { unchecked { return toHexString(value, MathUpgradeable.log256(value) + 1); } } /** * @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] = _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); } /** * @dev Returns true if the two strings are equal. */ function equal(string memory a, string memory b) internal pure returns (bool) { return keccak256(bytes(a)) == keccak256(bytes(b)); } } // Dependency file: @openzeppelin/contracts-upgradeable/interfaces/draft-IERC1822Upgradeable.sol // 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); } // Dependency file: @openzeppelin/contracts-upgradeable/proxy/beacon/IBeaconUpgradeable.sol // 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); } // Dependency file: @openzeppelin/contracts-upgradeable/interfaces/IERC1967Upgradeable.sol // OpenZeppelin Contracts (last updated v4.9.0) (interfaces/IERC1967.sol) // pragma solidity ^0.8.0; /** * @dev ERC-1967: Proxy Storage Slots. This interface contains the events defined in the ERC. * * _Available since v4.8.3._ */ interface IERC1967Upgradeable { /** * @dev Emitted when the implementation is upgraded. */ event Upgraded(address indexed implementation); /** * @dev Emitted when the admin account has changed. */ event AdminChanged(address previousAdmin, address newAdmin); /** * @dev Emitted when the beacon is changed. */ event BeaconUpgraded(address indexed beacon); } // Dependency file: @openzeppelin/contracts-upgradeable/utils/StorageSlotUpgradeable.sol // OpenZeppelin Contracts (last updated v4.9.0) (utils/StorageSlot.sol) // This file was procedurally generated from scripts/generate/templates/StorageSlot.js. // 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: * ```solidity * 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`, `uint256`._ * _Available since v4.9 for `string`, `bytes`._ */ library StorageSlotUpgradeable { struct AddressSlot { address value; } struct BooleanSlot { bool value; } struct Bytes32Slot { bytes32 value; } struct Uint256Slot { uint256 value; } struct StringSlot { string value; } struct BytesSlot { bytes 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 } } /** * @dev Returns an `StringSlot` with member `value` located at `slot`. */ function getStringSlot(bytes32 slot) internal pure returns (StringSlot storage r) { /// @solidity memory-safe-assembly assembly { r.slot := slot } } /** * @dev Returns an `StringSlot` representation of the string storage pointer `store`. */ function getStringSlot(string storage store) internal pure returns (StringSlot storage r) { /// @solidity memory-safe-assembly assembly { r.slot := store.slot } } /** * @dev Returns an `BytesSlot` with member `value` located at `slot`. */ function getBytesSlot(bytes32 slot) internal pure returns (BytesSlot storage r) { /// @solidity memory-safe-assembly assembly { r.slot := slot } } /** * @dev Returns an `BytesSlot` representation of the bytes storage pointer `store`. */ function getBytesSlot(bytes storage store) internal pure returns (BytesSlot storage r) { /// @solidity memory-safe-assembly assembly { r.slot := store.slot } } } // Dependency file: @openzeppelin/contracts-upgradeable/proxy/ERC1967/ERC1967UpgradeUpgradeable.sol // OpenZeppelin Contracts (last updated v4.9.0) (proxy/ERC1967/ERC1967Upgrade.sol) // pragma solidity ^0.8.2; // import "@openzeppelin/contracts-upgradeable/proxy/beacon/IBeaconUpgradeable.sol"; // import "@openzeppelin/contracts-upgradeable/interfaces/IERC1967Upgradeable.sol"; // import "@openzeppelin/contracts-upgradeable/interfaces/draft-IERC1822Upgradeable.sol"; // import "@openzeppelin/contracts-upgradeable/utils/AddressUpgradeable.sol"; // import "@openzeppelin/contracts-upgradeable/utils/StorageSlotUpgradeable.sol"; // import {Initializable} from "@openzeppelin/contracts-upgradeable/proxy/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._ */ abstract contract ERC1967UpgradeUpgradeable is Initializable, IERC1967Upgradeable { // 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; function __ERC1967Upgrade_init() internal onlyInitializing { } function __ERC1967Upgrade_init_unchained() internal onlyInitializing { } /** * @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) { AddressUpgradeable.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 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 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) { AddressUpgradeable.functionDelegateCall(IBeaconUpgradeable(newBeacon).implementation(), 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; } // Dependency file: @openzeppelin/contracts-upgradeable/proxy/utils/UUPSUpgradeable.sol // OpenZeppelin Contracts (last updated v4.9.0) (proxy/utils/UUPSUpgradeable.sol) // pragma solidity ^0.8.0; // import "@openzeppelin/contracts-upgradeable/interfaces/draft-IERC1822Upgradeable.sol"; // import "@openzeppelin/contracts-upgradeable/proxy/ERC1967/ERC1967UpgradeUpgradeable.sol"; // import {Initializable} from "@openzeppelin/contracts-upgradeable/proxy/utils/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 { /// @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"); _; } function __UUPSUpgradeable_init() internal onlyInitializing { } function __UUPSUpgradeable_init_unchained() internal onlyInitializing { } /** * @dev Implementation of the ERC1822 {proxiableUUID} function. This returns the storage slot used by the * implementation. It is used to validate the implementation's compatibility when performing 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. * * @custom:oz-upgrades-unsafe-allow-reachable delegatecall */ function upgradeTo(address newImplementation) public 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. * * @custom:oz-upgrades-unsafe-allow-reachable delegatecall */ function upgradeToAndCall(address newImplementation, bytes memory data) public 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; } // Dependency file: src/FabricaUUPSUpgradeable.sol // pragma solidity ^0.8.23; // import "@openzeppelin/contracts-upgradeable/proxy/utils/Initializable.sol"; // import "@openzeppelin/contracts-upgradeable/proxy/utils/UUPSUpgradeable.sol"; // import "@openzeppelin/contracts-upgradeable/utils/ContextUpgradeable.sol"; abstract contract FabricaUUPSUpgradeable is Initializable, ContextUpgradeable, UUPSUpgradeable { function __FabricaUUPSUpgradeable_init() internal onlyInitializing { __Context_init(); __UUPSUpgradeable_init(); } function __FabricaUUPSUpgradeable_init_unchained() internal onlyInitializing { __Context_init(); __UUPSUpgradeable_init_unchained(); } function _authorizeUpgrade(address) internal view override { _checkProxyAdmin(); } function implementation() public view returns (address) { return _getImplementation(); } /** * @dev Throws if called by any account other than the proxy admin */ modifier onlyProxyAdmin() { _checkProxyAdmin(); _; } /** * @dev Throws if the sender is not the proxy admin. */ function _checkProxyAdmin() internal view virtual { require(_getAdmin() == _msgSender(), "FabricaUUPSUpgradeable: caller is not the proxy admin"); } /** * @dev Returns the current proxy admin address. */ function proxyAdmin() public view returns (address) { return ERC1967UpgradeUpgradeable._getAdmin(); } /** * @dev Updates the current admin address. */ function setProxyAdmin(address _newProxyAdmin) public onlyProxyAdmin { // _setAdmin() doesn't emit the Upgraded event; _changeAdmin() does. ERC1967UpgradeUpgradeable._changeAdmin(_newProxyAdmin); } } // Dependency file: src/IFabricaValidator.sol // Validator smart contract interface for Fabrica // pragma solidity ^0.8.23; interface IFabricaValidator { function uri(uint256 id) external view returns (string memory); } // Root file: src/FabricaToken.sol pragma solidity ^0.8.23; // import "@openzeppelin/contracts-upgradeable/access/OwnableUpgradeable.sol"; // import "@openzeppelin/contracts-upgradeable/proxy/utils/Initializable.sol"; // import "@openzeppelin/contracts-upgradeable/security/PausableUpgradeable.sol"; // import "@openzeppelin/contracts-upgradeable/token/ERC1155/ERC1155Upgradeable.sol"; // import "@openzeppelin/contracts-upgradeable/utils/introspection/ERC165Upgradeable.sol"; // import "@openzeppelin/contracts-upgradeable/utils/introspection/ERC165CheckerUpgradeable.sol"; // import "@openzeppelin/contracts-upgradeable/utils/math/MathUpgradeable.sol"; // import "@openzeppelin/contracts-upgradeable/utils/ContextUpgradeable.sol"; // import "@openzeppelin/contracts-upgradeable/utils/StringsUpgradeable.sol"; // import "src/FabricaUUPSUpgradeable.sol"; // import "src/IFabricaValidator.sol"; /** * @dev Implementation of the Fabrica ERC1155 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 FabricaToken is Initializable, ContextUpgradeable, ERC165Upgradeable, IERC1155Upgradeable, IERC1155MetadataURIUpgradeable, OwnableUpgradeable, PausableUpgradeable, FabricaUUPSUpgradeable { using AddressUpgradeable for address; constructor() { _disableInitializers(); } function initialize() public initializer { __ERC165_init(); // __FabricaUUPSUpgradeable_init() calls __Context_init(), so we skip calling that here. __FabricaUUPSUpgradeable_init(); __Ownable_init(); __Pausable_init(); } function initializeV2() public reinitializer(2) { // Mainnet if (_property[5584360490195809515].supply > 0) { _property[5584360490195809515].supply = 0; } if (_property[121246195489681167].supply > 0) { _property[121246195489681167].supply = 0; } // Sepolia if (_property[5713958517081774245].supply > 0) { _property[5713958517081774245].supply = 0; } if (_property[1976155942521829550].supply > 0) { _property[1976155942521829550].supply = 0; } if (_property[16379083226107479501].supply > 0) { _property[16379083226107479501].supply = 0; } if (_property[17173656843293713364].supply > 0) { _property[17173656843293713364].supply = 0; } if (_property[17599246889068243423].supply > 0) { _property[17599246889068243423].supply = 0; } } // Struct needed to avoid stack too deep error struct Property { uint256 supply; string operatingAgreement; string definition; string configuration; address validator; } // 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; // Mapping from token ID to property info mapping(uint256 => Property) public _property; address private _defaultValidator; // On-chain data update event UpdateConfiguration(uint256, string newData); event UpdateOperatingAgreement(uint256, string newData); event UpdateValidator(uint256 tokenId, string dataType, address validator); /** * @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); } function pause() public onlyOwner whenNotPaused { _pause(); } function unpause() public onlyOwner whenPaused { _unpause(); } function setDefaultValidator(address newDefaultValidator) public onlyOwner { _defaultValidator = newDefaultValidator; } function defaultValidator() public view returns (address) { return _defaultValidator; } /** * @dev Delegate to the validator contract: default to the Fabrica validator */ function uri(uint256 id) override public view returns (string memory) { address validator = _property[id].validator == address(0) ? _defaultValidator : _property[id].validator; return IFabricaValidator(validator).uri(id); } /** * @dev `mint` allows users to mint to 3rd party (although it allows to mint to self as well) */ function mint( address[] memory recipients, uint256 sessionId, uint256[] memory amounts, string memory definition, string memory operatingAgreement, string memory configuration, address validator ) public whenNotPaused returns (uint256) { uint256 supply = 0; for (uint256 i = 0; i < amounts.length; i++) { uint256 amount = amounts[i]; require(amount > 0, 'Each amount must be greater than zero'); supply += amount; } Property memory property; property.supply = supply; property.operatingAgreement = operatingAgreement; property.definition = definition; property.configuration = configuration; property.validator = validator; uint256 id = _mint(recipients, sessionId, amounts, property, ""); return id; } /** * @dev `mintBatch` allows users to mint in bulk */ function mintBatch( address[] memory recipients, uint256[] memory sessionIds, uint256[] memory amounts, string[] memory definitions, string[] memory operatingAgreements, string[] memory configurations, address[] memory validators ) public whenNotPaused returns (uint256[] memory ids) { uint256 supply = 0; for (uint256 i = 0; i < amounts.length; i++) { uint256 amount = amounts[i]; require(amount > 0, 'Each amount must be greater than zero'); supply += amount; } uint256 size = sessionIds.length; Property[] memory properties = new Property[](size); for (uint256 i = 0; i < size; i++) { properties[i].supply = supply; properties[i].operatingAgreement = operatingAgreements[i]; properties[i].definition = definitions[i]; properties[i].configuration = configurations[i]; properties[i].validator = validators[i]; } ids = _mintBatch(recipients, sessionIds, amounts, properties, ""); } function burn( address from, uint256 id, uint256 amount ) public whenNotPaused returns (bool success) { _burn(from, id, amount); success = true; } function burnBatch( address from, uint256[] memory ids, uint256[] memory amounts ) public whenNotPaused returns (bool success) { _burnBatch(from, ids, amounts); success = true; } /** * @dev generate token id (to avoid frontrunning) */ function generateId(address operator, uint256 sessionId, string memory operatingAgreement) public view whenNotPaused returns(uint256) { /** * @dev hash operator address with sessionId and chainId to generate unique token Id * format: string(sender_address) + string(sessionId) => hash to byte32 => cast to uint */ string memory operatorString = StringsUpgradeable.toHexString(uint(uint160(operator)), 20); string memory idString = string.concat( StringsUpgradeable.toString(block.chainid), StringsUpgradeable.toHexString(address(this)), operatorString, StringsUpgradeable.toString(sessionId), operatingAgreement ); uint256 bigId = uint256(keccak256(abi.encodePacked(idString))); uint64 smallId = uint64(bigId); return uint256(smallId); } /** * @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 whenNotPaused { _setApprovalForAll(_msgSender(), operator, approved); } /** * @dev See {IERC1155-isApprovedForAll}. */ function isApprovedForAll(address account, address operator) public view virtual override whenNotPaused 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 whenNotPaused { require( from == _msgSender() || isApprovedForAll(from, _msgSender()), "ERC1155: caller is not token owner or approved" ); _safeTransferFrom(from, to, id, amount, data); } /** * @dev See {IERC1155-safeBatchTransferFrom}. */ function safeBatchTransferFrom( address from, address to, uint256[] memory ids, uint256[] memory amounts, bytes memory data ) public virtual override whenNotPaused { require( from == _msgSender() || isApprovedForAll(from, _msgSender()), "ERC1155: caller is not token owner or approved" ); _safeBatchTransferFrom(from, to, ids, amounts, data); } // @dev only executable by > 70% owner function updateOperatingAgreement(string memory operatingAgreement, uint256 id) public whenNotPaused returns (bool) { require(_percentOwner(_msgSender(), id, 70), "Only > 70% can update"); _property[id].operatingAgreement = operatingAgreement; emit UpdateOperatingAgreement(id, operatingAgreement); return true; } // @dev only executable by > 50% owner function updateConfiguration(string memory configuration, uint256 id) public whenNotPaused returns (bool) { require(_percentOwner(_msgSender(), id, 50), "Only > 50% can update"); _property[id].configuration = configuration; emit UpdateConfiguration(id, configuration); return true; } // @dev only executable by > 70% owner function updateValidator(address validator, uint256 id) public whenNotPaused returns (bool) { require(_percentOwner(_msgSender(), id, 70), "Only > 70% can update"); _property[id].validator = validator; emit UpdateValidator(id, "validator", validator); return true; } // @dev `threshold`: percentage threshold function _percentOwner(address wallet, uint256 id, uint256 threshold) internal virtual returns (bool) { uint256 shares = _balances[id][wallet]; if (shares == 0) { return false; } uint256 supply = _property[id].supply; if (supply == 0) { return false; } uint256 percent = MathUpgradeable.mulDiv(shares, 100, supply); return percent > threshold; } /** * @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 whenNotPaused { require(to != address(0), "ERC1155: transfer to the zero address"); address operator = _msgSender(); 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); _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 whenNotPaused { require(ids.length == amounts.length, "ERC1155: ids and amounts length mismatch"); require(to != address(0), "ERC1155: transfer to the zero address"); address operator = _msgSender(); 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); _doSafeBatchTransferAcceptanceCheck(operator, from, to, ids, amounts, data); } /** * @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. * - `definition` cannot be null. */ function _mint( address[] memory recipients, uint sessionId, uint256[] memory amounts, Property memory property, bytes memory data ) internal virtual whenNotPaused returns(uint256) { require(bytes(property.definition).length > 0, "Definition is required"); require(sessionId > 0, "Valid sessionId is required"); require(property.supply > 0, "Minimum supply is 1"); require(recipients.length == amounts.length, 'Number of recipients and amounts must match'); // If validator is not specified during mint, use default validator address if (property.validator == address(0)) { // set default validator address property.validator = _defaultValidator; } uint256 id = generateId(_msgSender(), sessionId, property.operatingAgreement); require(_property[id].supply == 0, "Session ID already exist, please use a different one"); for (uint256 i = 0; i < recipients.length; i++) { address to = recipients[i]; require(to != address(0), "ERC1155: mint to the zero address"); uint256 amount = amounts[i]; _balances[id][to] += amount; _doSafeTransferAcceptanceCheck(_msgSender(), address(0), to, id, amount, data); emit TransferSingle(_msgSender(), address(0), to, id, amount); } // Update property data _property[id] = property; return id; } /** * @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[] memory recipients, uint256[] memory sessionIds, uint256[] memory amounts, Property[] memory properties, bytes memory data ) internal virtual whenNotPaused returns(uint256[] memory) { require(recipients.length == amounts.length, 'Number of recipients and amounts must match'); require(sessionIds.length == properties.length, "sessionIds and properties length mismatch"); // hit stack too deep error when using more variables, so we use sessionsIds.length in multiple // places instead of creating new variables uint256[] memory ids = new uint256[](sessionIds.length); for (uint256 i = 0; i < sessionIds.length; i++) { require(bytes(properties[i].definition).length > 0, "Definition is required"); require(sessionIds[i] > 0, "Valid sessionId is required"); require(properties[i].supply > 0, "Minimum supply is 1"); uint256 id = generateId(_msgSender(), sessionIds[i], properties[i].operatingAgreement); for (uint256 j = 0; j < recipients.length; j++) { address to = recipients[j]; require(to != address(0), "ERC1155: mint to the zero address"); uint256 amount = amounts[j]; _balances[id][to] += amount; uint256[] memory amountsForRecipient = new uint256[](ids.length); for (uint256 k = 0; k < ids.length; k++) { amountsForRecipient[k] = amount; } _doSafeBatchTransferAcceptanceCheck(_msgSender(), address(0), to, ids, amountsForRecipient, data); emit TransferBatch(_msgSender(), address(0), to, ids, amountsForRecipient); } require(_property[id].supply == 0, "Session ID already exist, please use a different one"); // If validator is not specified during mint, use default validator address if (properties[i].validator == address(0)) { // set default validator address properties[i].validator = _defaultValidator; } ids[i] = id; // Update property data _property[id] = properties[i]; } return ids; } /** * @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(); require(operator == from, "ERC1155: operator can only burn own token supply"); uint256 fromBalance = _balances[id][from]; uint256 fromSupply = _property[id].supply; require(fromBalance >= amount, "ERC1155: burn amount exceeds balance"); require(fromSupply >= amount, "ERC1155: burn amount exceeds supply"); unchecked { _balances[id][from] = fromBalance - amount; _property[id].supply = fromSupply - amount; } emit TransferSingle(operator, from, address(0), id, amount); _doSafeTransferAcceptanceCheck(operator, from, address(0), id, amount, ""); } /** * @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(); require(operator == from, "ERC1155: operator can only burn own token supply"); for (uint256 i = 0; i < ids.length; i++) { uint256 id = ids[i]; uint256 amount = amounts[i]; uint256 fromBalance = _balances[id][from]; uint256 fromSupply = _property[id].supply; require(fromBalance >= amount, "ERC1155: burn amount exceeds balance"); require(fromSupply >= amount, "ERC1155: burn amount exceeds supply"); unchecked { _balances[id][from] = fromBalance - amount; _property[id].supply = fromSupply - amount; } } emit TransferBatch(operator, from, address(0), ids, amounts); _doSafeBatchTransferAcceptanceCheck(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 whenNotPaused { require(owner != operator, "ERC1155: setting approval status for self"); _operatorApprovals[owner][operator] = approved; emit ApprovalForAll(owner, operator, approved); } function _doSafeTransferAcceptanceCheck( address operator, address from, address to, uint256 id, uint256 amount, bytes memory data ) private whenNotPaused { if (to.isContract()) { try IERC1155ReceiverUpgradeable(to).onERC1155Received(operator, from, id, amount, data) returns (bytes4 response) { if (response != IERC1155ReceiverUpgradeable.onERC1155Received.selector) { revert("ERC1155: ERC1155ReceiverUpgradeable rejected tokens"); } } catch Error(string memory reason) { revert(reason); } catch { revert("ERC1155: transfer to non-ERC1155ReceiverUpgradeable implementer"); } } } function _doSafeBatchTransferAcceptanceCheck( address operator, address from, address to, uint256[] memory ids, uint256[] memory amounts, bytes memory data ) private whenNotPaused { if (to.isContract()) { try IERC1155ReceiverUpgradeable(to).onERC1155BatchReceived(operator, from, ids, amounts, data) returns ( bytes4 response ) { if (response != IERC1155ReceiverUpgradeable.onERC1155BatchReceived.selector) { revert("ERC1155: ERC1155ReceiverUpgradeable rejected tokens"); } } catch Error(string memory reason) { revert(reason); } catch { revert("ERC1155: transfer to non-ERC1155ReceiverUpgradeable implementer"); } } } }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"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":"account","type":"address"}],"name":"Paused","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256[]","name":"ids","type":"uint256[]"},{"indexed":false,"internalType":"uint256[]","name":"values","type":"uint256[]"}],"name":"TransferBatch","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"id","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"TransferSingle","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"string","name":"value","type":"string"},{"indexed":true,"internalType":"uint256","name":"id","type":"uint256"}],"name":"URI","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"account","type":"address"}],"name":"Unpaused","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"","type":"uint256"},{"indexed":false,"internalType":"string","name":"newData","type":"string"}],"name":"UpdateConfiguration","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"","type":"uint256"},{"indexed":false,"internalType":"string","name":"newData","type":"string"}],"name":"UpdateOperatingAgreement","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"tokenId","type":"uint256"},{"indexed":false,"internalType":"string","name":"dataType","type":"string"},{"indexed":false,"internalType":"address","name":"validator","type":"address"}],"name":"UpdateValidator","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"implementation","type":"address"}],"name":"Upgraded","type":"event"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"_property","outputs":[{"internalType":"uint256","name":"supply","type":"uint256"},{"internalType":"string","name":"operatingAgreement","type":"string"},{"internalType":"string","name":"definition","type":"string"},{"internalType":"string","name":"configuration","type":"string"},{"internalType":"address","name":"validator","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"uint256","name":"id","type":"uint256"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address[]","name":"accounts","type":"address[]"},{"internalType":"uint256[]","name":"ids","type":"uint256[]"}],"name":"balanceOfBatch","outputs":[{"internalType":"uint256[]","name":"","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"uint256","name":"id","type":"uint256"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"burn","outputs":[{"internalType":"bool","name":"success","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"uint256[]","name":"ids","type":"uint256[]"},{"internalType":"uint256[]","name":"amounts","type":"uint256[]"}],"name":"burnBatch","outputs":[{"internalType":"bool","name":"success","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"defaultValidator","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"uint256","name":"sessionId","type":"uint256"},{"internalType":"string","name":"operatingAgreement","type":"string"}],"name":"generateId","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"implementation","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"initialize","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"initializeV2","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":[{"internalType":"address[]","name":"recipients","type":"address[]"},{"internalType":"uint256","name":"sessionId","type":"uint256"},{"internalType":"uint256[]","name":"amounts","type":"uint256[]"},{"internalType":"string","name":"definition","type":"string"},{"internalType":"string","name":"operatingAgreement","type":"string"},{"internalType":"string","name":"configuration","type":"string"},{"internalType":"address","name":"validator","type":"address"}],"name":"mint","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address[]","name":"recipients","type":"address[]"},{"internalType":"uint256[]","name":"sessionIds","type":"uint256[]"},{"internalType":"uint256[]","name":"amounts","type":"uint256[]"},{"internalType":"string[]","name":"definitions","type":"string[]"},{"internalType":"string[]","name":"operatingAgreements","type":"string[]"},{"internalType":"string[]","name":"configurations","type":"string[]"},{"internalType":"address[]","name":"validators","type":"address[]"}],"name":"mintBatch","outputs":[{"internalType":"uint256[]","name":"ids","type":"uint256[]"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"pause","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"paused","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"proxiableUUID","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"proxyAdmin","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256[]","name":"ids","type":"uint256[]"},{"internalType":"uint256[]","name":"amounts","type":"uint256[]"},{"internalType":"bytes","name":"data","type":"bytes"}],"name":"safeBatchTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"id","type":"uint256"},{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"bytes","name":"data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newDefaultValidator","type":"address"}],"name":"setDefaultValidator","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_newProxyAdmin","type":"address"}],"name":"setProxyAdmin","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":[],"name":"unpause","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"configuration","type":"string"},{"internalType":"uint256","name":"id","type":"uint256"}],"name":"updateConfiguration","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"operatingAgreement","type":"string"},{"internalType":"uint256","name":"id","type":"uint256"}],"name":"updateOperatingAgreement","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"validator","type":"address"},{"internalType":"uint256","name":"id","type":"uint256"}],"name":"updateValidator","outputs":[{"internalType":"bool","name":"","type":"bool"}],"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":"id","type":"uint256"}],"name":"uri","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"}]
Contract Creation Code
60a06040523060805234801562000014575f80fd5b506200001f62000025565b620000e3565b5f54610100900460ff1615620000915760405162461bcd60e51b815260206004820152602760248201527f496e697469616c697a61626c653a20636f6e747261637420697320696e697469604482015266616c697a696e6760c81b606482015260840160405180910390fd5b5f5460ff90811614620000e1575f805460ff191660ff9081179091556040519081527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b565b608051614896620001185f395f818161085f0152818161089f01528181610a7e01528181610abe0152610b3901526148965ff3fe60806040526004361061017c575f3560e01c8062fdd58e1461018057806301ffc9a7146101b25780630e89341c146101e15780631117a0981461020d578063122796131461022e5780632eb2c2d61461024d5780633659cfe61461026c5780633e47158c1461028b5780633f4ba83a146102ac57806347c02661146102c05780634e1273f4146102df5780634f1ef2861461030b57806352d1902d1461031e5780635c60da1b146103325780635c975abb146103465780635cd8a76b1461035d5780636a982298146103715780636b20c454146103a1578063715018a6146103c05780638129fc1c146103d45780638456cb59146103e85780638da5cb5b146103fc57806394e2c9e314610410578063a1cca8411461042e578063a22cb4651461044d578063b20b607b1461046c578063b36c9db51461048b578063dc5180e6146104aa578063e6635f5d146104c9578063e985e9c5146104e8578063f242432a14610507578063f2fde38b14610526578063f5298aca14610545575b5f80fd5b34801561018b575f80fd5b5061019f61019a3660046133b9565b610564565b6040519081526020015b60405180910390f35b3480156101bd575f80fd5b506101d16101cc3660046133f6565b6105fe565b60405190151581526020016101a9565b3480156101ec575f80fd5b506102006101fb366004613411565b61064d565b6040516101a99190613475565b348015610218575f80fd5b5061022c610227366004613487565b610712565b005b348015610239575f80fd5b5061019f610248366004613657565b61073d565b348015610258575f80fd5b5061022c610267366004613738565b610801565b348015610277575f80fd5b5061022c610286366004613487565b610855565b348015610296575f80fd5b5061029f61091c565b6040516101a991906137da565b3480156102b7575f80fd5b5061022c61092a565b3480156102cb575f80fd5b5061022c6102da366004613487565b610944565b3480156102ea575f80fd5b506102fe6102f93660046137ee565b610955565b6040516101a99190613887565b61022c610319366004613899565b610a74565b348015610329575f80fd5b5061019f610b2d565b34801561033d575f80fd5b5061029f610bda565b348015610351575f80fd5b5060975460ff166101d1565b348015610368575f80fd5b5061022c610be3565b34801561037c575f80fd5b5061039061038b366004613411565b610e5b565b6040516101a99594939291906138d9565b3480156103ac575f80fd5b506101d16103bb366004613932565b611025565b3480156103cb575f80fd5b5061022c611043565b3480156103df575f80fd5b5061022c611054565b3480156103f3575f80fd5b5061022c61111d565b348015610407575f80fd5b5061029f611135565b34801561041b575f80fd5b50610130546001600160a01b031661029f565b348015610439575f80fd5b5061019f6104483660046139a0565b611144565b348015610458575f80fd5b5061022c6104673660046139e8565b6111e5565b348015610477575f80fd5b506102fe610486366004613aa6565b6111f8565b348015610496575f80fd5b506101d16104a5366004613bb4565b611400565b3480156104b5575f80fd5b506101d16104c4366004613bb4565b611490565b3480156104d4575f80fd5b506101d16104e33660046133b9565b611536565b3480156104f3575f80fd5b506101d1610502366004613bf5565b6115f5565b348015610512575f80fd5b5061022c610521366004613c26565b61162d565b348015610531575f80fd5b5061022c610540366004613487565b61167a565b348015610550575f80fd5b506101d161055f366004613c85565b6116f0565b5f6001600160a01b0383166105d35760405162461bcd60e51b815260206004820152602a60248201527f455243313135353a2061646472657373207a65726f206973206e6f742061207660448201526930b634b21037bbb732b960b11b60648201526084015b60405180910390fd5b505f81815261012d602090815260408083206001600160a01b03861684529091529020545b92915050565b5f6001600160e01b03198216636cdb3d1360e11b148061062e57506001600160e01b031982166303a24d0760e21b145b806105f857506301ffc9a760e01b6001600160e01b03198316146105f8565b5f81815261012f6020526040812060040154606091906001600160a01b031615610691575f83815261012f60205260409020600401546001600160a01b031661069f565b610130546001600160a01b03165b6040516303a24d0760e21b8152600481018590529091506001600160a01b03821690630e89341c906024015f60405180830381865afa1580156106e4573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f1916820160405261070b9190810190613cb5565b9392505050565b61071a611704565b61013080546001600160a01b0319166001600160a01b0392909216919091179055565b5f610746611763565b5f805b87518110156107a3575f88828151811061076557610765613d27565b602002602001015190505f811161078e5760405162461bcd60e51b81526004016105ca90613d3b565b6107988184613d94565b925050600101610749565b506107ac613368565b81815260208082018790526040808301899052606083018790526001600160a01b0386166080840152805191820190525f808252906107f2908c908c908c9086906117a9565b9b9a5050505050505050505050565b610809611763565b6001600160a01b038516331480610825575061082585336115f5565b6108415760405162461bcd60e51b81526004016105ca90613da7565b61084e8585858585611a21565b5050505050565b6001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016300361089d5760405162461bcd60e51b81526004016105ca90613df5565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03166108cf611bab565b6001600160a01b0316146108f55760405162461bcd60e51b81526004016105ca90613e2e565b6108fe81611bca565b604080515f8082526020820190925261091991839190611bd2565b50565b5f610925611d41565b905090565b610932611704565b61093a611d55565b610942611d9e565b565b61094c611dea565b61091981611e67565b606081518351146109ba5760405162461bcd60e51b815260206004820152602960248201527f455243313135353a206163636f756e747320616e6420696473206c656e677468604482015268040dad2e6dac2e8c6d60bb1b60648201526084016105ca565b5f83516001600160401b038111156109d4576109d46134a0565b6040519080825280602002602001820160405280156109fd578160200160208202803683370190505b5090505f5b8451811015610a6c57610a47858281518110610a2057610a20613d27565b6020026020010151858381518110610a3a57610a3a613d27565b6020026020010151610564565b828281518110610a5957610a59613d27565b6020908102919091010152600101610a02565b509392505050565b6001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000163003610abc5760405162461bcd60e51b81526004016105ca90613df5565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316610aee611bab565b6001600160a01b031614610b145760405162461bcd60e51b81526004016105ca90613e2e565b610b1d82611bca565b610b2982826001611bd2565b5050565b5f306001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614610bc75760405162461bcd60e51b815260206004820152603860248201527f555550535570677261646561626c653a206d757374206e6f742062652063616c6044820152771b1959081d1a1c9bdd59da0819195b1959d85d1958d85b1b60421b60648201526084016105ca565b505f805160206147da8339815191525b90565b5f610925611bab565b5f54600290610100900460ff16158015610c0357505f5460ff8083169116105b610c1f5760405162461bcd60e51b81526004016105ca90613e67565b5f805461ffff191660ff831617610100178155674d7fa24753d8f4eb905261012f6020525f8051602061475a8339815191525415610c7a57674d7fa24753d8f4eb5f90815261012f6020525f8051602061475a833981519152555b6701aec0c5bc87af0f5f5261012f6020525f805160206146ba8339815191525415610cc2576701aec0c5bc87af0f5f90815261012f6020525f805160206146ba833981519152555b674f4c0eff57fa18a55f5261012f6020525f8051602061471a8339815191525415610d0a57674f4c0eff57fa18a55f90815261012f6020525f8051602061471a833981519152555b671b6cb75c0eca78ae5f5261012f6020525f805160206146fa8339815191525415610d5257671b6cb75c0eca78ae5f90815261012f6020525f805160206146fa833981519152555b67e34e3169feb205cd5f5261012f6020525f8051602061473a8339815191525415610d9a5767e34e3169feb205cd5f90815261012f6020525f8051602061473a833981519152555b67ee5515e8b6fa63d45f5261012f6020525f8051602061479a8339815191525415610de25767ee5515e8b6fa63d45f90815261012f6020525f8051602061479a833981519152555b67f43d15cd014fa9df5f5261012f6020525f805160206147fa8339815191525415610e2a5767f43d15cd014fa9df5f90815261012f6020525f805160206147fa833981519152555b5f805461ff001916905560405160ff821681525f8051602061481a833981519152906020015b60405180910390a150565b61012f6020525f908152604090208054600182018054919291610e7d90613eb5565b80601f0160208091040260200160405190810160405280929190818152602001828054610ea990613eb5565b8015610ef45780601f10610ecb57610100808354040283529160200191610ef4565b820191905f5260205f20905b815481529060010190602001808311610ed757829003601f168201915b505050505090806002018054610f0990613eb5565b80601f0160208091040260200160405190810160405280929190818152602001828054610f3590613eb5565b8015610f805780601f10610f5757610100808354040283529160200191610f80565b820191905f5260205f20905b815481529060010190602001808311610f6357829003601f168201915b505050505090806003018054610f9590613eb5565b80601f0160208091040260200160405190810160405280929190818152602001828054610fc190613eb5565b801561100c5780601f10610fe35761010080835404028352916020019161100c565b820191905f5260205f20905b815481529060010190602001808311610fef57829003601f168201915b505050600490930154919250506001600160a01b031685565b5f61102e611763565b611039848484611ebb565b5060019392505050565b61104b611704565b6109425f612088565b5f54610100900460ff161580801561107257505f54600160ff909116105b806110925750611081306120d9565b15801561109257505f5460ff166001145b6110ae5760405162461bcd60e51b81526004016105ca90613e67565b5f805460ff1916600117905580156110cf575f805461ff0019166101001790555b6110d76120e8565b6110df61210e565b6110e7612144565b6110ef612172565b8015610919575f805461ff0019169055604051600181525f8051602061481a83398151915290602001610e50565b611125611704565b61112d611763565b6109426121a0565b6065546001600160a01b031690565b5f61114d611763565b5f611162856001600160a01b031660146121dd565b90505f61116e46612372565b61117730612401565b8361118188612372565b87604051602001611196959493929190613eed565b60405160208183030381529060405290505f816040516020016111b99190613f57565b60408051808303601f1901815291905280516020909101206001600160401b0316979650505050505050565b6111ed611763565b610b29338383612417565b6060611202611763565b5f805b875181101561125f575f88828151811061122157611221613d27565b602002602001015190505f811161124a5760405162461bcd60e51b81526004016105ca90613d3b565b6112548184613d94565b925050600101611205565b5087515f816001600160401b0381111561127b5761127b6134a0565b6040519080825280602002602001820160405280156112b457816020015b6112a1613368565b8152602001906001900390816112995790505b5090505f5b828110156113e457838282815181106112d4576112d4613d27565b60200260200101515f0181815250508781815181106112f5576112f5613d27565b602002602001015182828151811061130f5761130f613d27565b60200260200101516020018190525088818151811061133057611330613d27565b602002602001015182828151811061134a5761134a613d27565b60200260200101516040018190525086818151811061136b5761136b613d27565b602002602001015182828151811061138557611385613d27565b6020026020010151606001819052508581815181106113a6576113a6613d27565b60200260200101518282815181106113c0576113c0613d27565b60209081029190910101516001600160a01b039091166080909101526001016112b9565b506107f28b8b8b8460405180602001604052805f8152506124ff565b5f611409611763565b611416335b8360466129c8565b6114325760405162461bcd60e51b81526004016105ca90613f72565b5f82815261012f6020526040902060010161144d8482613fe5565b507f6b491e3cbe1a3d27a215d960a465834cf22a7e3e87ffe8be5724ab67f72583fb828460405161147f9291906140a0565b60405180910390a150600192915050565b5f611499611763565b6114a5338360326129c8565b6114e95760405162461bcd60e51b81526020600482015260156024820152744f6e6c79203e203530252063616e2075706461746560581b60448201526064016105ca565b5f82815261012f602052604090206003016115048482613fe5565b507fb56c2e2e610c525cd60429993be20aab298f5bc84e28ad1a0b8eb2c2ca855920828460405161147f9291906140a0565b5f61153f611763565b6115483361140e565b6115645760405162461bcd60e51b81526004016105ca90613f72565b5f82815261012f60205260409081902060040180546001600160a01b0386166001600160a01b0319909116179055517f56137a68f73d3785a7a236d27a378cb92851e1b1d68317de555fc4fde9c17add9061147f9084908690918252606060208301819052600990830152683b30b634b230ba37b960b91b60808301526001600160a01b0316604082015260a00190565b5f6115fe611763565b506001600160a01b039182165f90815261012e6020908152604080832093909416825291909152205460ff1690565b611635611763565b6001600160a01b038516331480611651575061165185336115f5565b61166d5760405162461bcd60e51b81526004016105ca90613da7565b61084e8585858585612a36565b611682611704565b6001600160a01b0381166116e75760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b60648201526084016105ca565b61091981612088565b5f6116f9611763565b611039848484612b3e565b3361170d611135565b6001600160a01b0316146109425760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064016105ca565b60975460ff16156109425760405162461bcd60e51b815260206004820152601060248201526f14185d5cd8589b194e881c185d5cd95960821b60448201526064016105ca565b5f6117b2611763565b5f836040015151116117d65760405162461bcd60e51b81526004016105ca906140b8565b5f85116117f55760405162461bcd60e51b81526004016105ca906140e8565b82516118135760405162461bcd60e51b81526004016105ca9061411d565b83518651146118345760405162461bcd60e51b81526004016105ca9061414a565b60808301516001600160a01b031661185957610130546001600160a01b031660808401525b5f61186933878660200151611144565b5f81815261012f6020526040902054909150156118985760405162461bcd60e51b81526004016105ca90614195565b5f5b8751811015611997575f8882815181106118b6576118b6613d27565b602002602001015190505f6001600160a01b0316816001600160a01b0316036118f15760405162461bcd60e51b81526004016105ca906141e9565b5f87838151811061190457611904613d27565b6020908102919091018101515f86815261012d835260408082206001600160a01b0387168352909352918220805491935083929091611944908490613d94565b909155506119589050335f8487858b612c78565b60408051858152602081018390526001600160a01b038416915f9133915f805160206146da833981519152910160405180910390a4505060010161189a565b505f81815261012f60209081526040909120855181559085015185919060018201906119c39082613fe5565b50604082015160028201906119d89082613fe5565b50606082015160038201906119ed9082613fe5565b5060809190910151600490910180546001600160a01b0319166001600160a01b039092169190911790559695505050505050565b611a29611763565b8151835114611a4a5760405162461bcd60e51b81526004016105ca9061422a565b6001600160a01b038416611a705760405162461bcd60e51b81526004016105ca90614272565b335f5b8451811015611b50575f858281518110611a8f57611a8f613d27565b602002602001015190505f858381518110611aac57611aac613d27565b6020908102919091018101515f84815261012d835260408082206001600160a01b038e168352909352919091205490915081811015611afd5760405162461bcd60e51b81526004016105ca906142b7565b5f83815261012d602090815260408083206001600160a01b038e8116855292528083208585039055908b16825281208054849290611b3c908490613d94565b909155505060019093019250611a73915050565b50846001600160a01b0316866001600160a01b0316826001600160a01b03165f8051602061469a8339815191528787604051611b8d929190614301565b60405180910390a4611ba3818787878787612dea565b505050505050565b5f5f805160206147da8339815191525b546001600160a01b0316919050565b610919611dea565b7f4910fdfa16fed3260ed0e7147f7cc6da11a60208b5b9406d12a635614ffd91435460ff1615611c0a57611c0583612eb3565b505050565b826001600160a01b03166352d1902d6040518163ffffffff1660e01b8152600401602060405180830381865afa925050508015611c64575060408051601f3d908101601f19168201909252611c619181019061432e565b60015b611cc75760405162461bcd60e51b815260206004820152602e60248201527f45524331393637557067726164653a206e657720696d706c656d656e7461746960448201526d6f6e206973206e6f74205555505360901b60648201526084016105ca565b5f805160206147da8339815191528114611d355760405162461bcd60e51b815260206004820152602960248201527f45524331393637557067726164653a20756e737570706f727465642070726f786044820152681a58589b195555525160ba1b60648201526084016105ca565b50611c05838383612f4f565b5f5f8051602061477a833981519152611bbb565b60975460ff166109425760405162461bcd60e51b815260206004820152601460248201527314185d5cd8589b194e881b9bdd081c185d5cd95960621b60448201526064016105ca565b611da6611d55565b6097805460ff191690557f5db9ee0a495bf2e6ff9c91a7834c1ba4fdd244a5e8aa4e537bd38aeae4b073aa335b604051611de091906137da565b60405180910390a1565b33611df3611d41565b6001600160a01b0316146109425760405162461bcd60e51b815260206004820152603560248201527f46616272696361555550535570677261646561626c653a2063616c6c6572206960448201527439903737ba103a343290383937bc3c9030b236b4b760591b60648201526084016105ca565b7f7e644d79422f17c01e4894b5f4f588d331ebfa28653d42ae832dc59e38c9798f611e90611d41565b604080516001600160a01b03928316815291841660208301520160405180910390a161091981612f73565b6001600160a01b038316611ee15760405162461bcd60e51b81526004016105ca90614345565b8051825114611f025760405162461bcd60e51b81526004016105ca9061422a565b336001600160a01b0384168114611f2b5760405162461bcd60e51b81526004016105ca90614388565b5f5b8351811015612021575f848281518110611f4957611f49613d27565b602002602001015190505f848381518110611f6657611f66613d27565b6020908102919091018101515f84815261012d835260408082206001600160a01b038c16835284528082205486835261012f90945290205490925082821015611fc15760405162461bcd60e51b81526004016105ca906143d8565b82811015611fe15760405162461bcd60e51b81526004016105ca9061441c565b5f84815261012d602090815260408083206001600160a01b038d16845282528083209486900390945594815261012f909452922091039055600101611f2d565b505f6001600160a01b0316846001600160a01b0316826001600160a01b03165f8051602061469a833981519152868660405161205e929190614301565b60405180910390a461208281855f868660405180602001604052805f815250612dea565b50505050565b606580546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0905f90a35050565b6001600160a01b03163b151590565b5f54610100900460ff166109425760405162461bcd60e51b81526004016105ca9061445f565b5f54610100900460ff166121345760405162461bcd60e51b81526004016105ca9061445f565b61213c6120e8565b6109426120e8565b5f54610100900460ff1661216a5760405162461bcd60e51b81526004016105ca9061445f565b610942612fec565b5f54610100900460ff166121985760405162461bcd60e51b81526004016105ca9061445f565b61094261301b565b6121a8611763565b6097805460ff191660011790557f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a258611dd33390565b60605f6121eb8360026144aa565b6121f6906002613d94565b6001600160401b0381111561220d5761220d6134a0565b6040519080825280601f01601f191660200182016040528015612237576020820181803683370190505b509050600360fc1b815f8151811061225157612251613d27565b60200101906001600160f81b03191690815f1a905350600f60fb1b8160018151811061227f5761227f613d27565b60200101906001600160f81b03191690815f1a9053505f6122a18460026144aa565b6122ac906001613d94565b90505b6001811115612323576f181899199a1a9b1b9c1cb0b131b232b360811b85600f16601081106122e0576122e0613d27565b1a60f81b8282815181106122f6576122f6613d27565b60200101906001600160f81b03191690815f1a90535060049490941c9361231c816144c1565b90506122af565b50831561070b5760405162461bcd60e51b815260206004820181905260248201527f537472696e67733a20686578206c656e67746820696e73756666696369656e7460448201526064016105ca565b60605f61237e8361304d565b60010190505f816001600160401b0381111561239c5761239c6134a0565b6040519080825280601f01601f1916602001820160405280156123c6576020820181803683370190505b5090508181016020015b5f19016f181899199a1a9b1b9c1cb0b131b232b360811b600a86061a8153600a85049450846123d057509392505050565b60606105f86001600160a01b03831660146121dd565b61241f611763565b816001600160a01b0316836001600160a01b0316036124925760405162461bcd60e51b815260206004820152602960248201527f455243313135353a2073657474696e6720617070726f76616c20737461747573604482015268103337b91039b2b63360b91b60648201526084016105ca565b6001600160a01b038381165f81815261012e6020908152604080832094871680845294825291829020805460ff191686151590811790915591519182527f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a3505050565b6060612509611763565b835186511461252a5760405162461bcd60e51b81526004016105ca9061414a565b825185511461258d5760405162461bcd60e51b815260206004820152602960248201527f73657373696f6e49647320616e642070726f70657274696573206c656e677468604482015268040dad2e6dac2e8c6d60bb1b60648201526084016105ca565b5f85516001600160401b038111156125a7576125a76134a0565b6040519080825280602002602001820160405280156125d0578160200160208202803683370190505b5090505f5b86518110156129bd575f8582815181106125f1576125f1613d27565b602002602001015160400151511161261b5760405162461bcd60e51b81526004016105ca906140b8565b5f87828151811061262e5761262e613d27565b6020026020010151116126535760405162461bcd60e51b81526004016105ca906140e8565b5f85828151811061266657612666613d27565b60200260200101515f01511161268e5760405162461bcd60e51b81526004016105ca9061411d565b5f6126d0338984815181106126a5576126a5613d27565b60200260200101518885815181106126bf576126bf613d27565b602002602001015160200151611144565b90505f5b8951811015612850575f8a82815181106126f0576126f0613d27565b602002602001015190505f6001600160a01b0316816001600160a01b03160361272b5760405162461bcd60e51b81526004016105ca906141e9565b5f89838151811061273e5761273e613d27565b6020908102919091018101515f86815261012d835260408082206001600160a01b038716835290935291822080549193508392909161277e908490613d94565b909155505085515f906001600160401b0381111561279e5761279e6134a0565b6040519080825280602002602001820160405280156127c7578160200160208202803683370190505b5090505f5b87518110156127fb57828282815181106127e8576127e8613d27565b60209081029190910101526001016127cc565b5061280a335f858a858e612dea565b6001600160a01b0383165f336001600160a01b03165f8051602061469a8339815191528a8560405161283d929190614301565b60405180910390a45050506001016126d4565b505f81815261012f60205260409020541561287d5760405162461bcd60e51b81526004016105ca90614195565b5f6001600160a01b031686838151811061289957612899613d27565b6020026020010151608001516001600160a01b0316036128fc576101305486516001600160a01b03909116908790849081106128d7576128d7613d27565b6020026020010151608001906001600160a01b031690816001600160a01b0316815250505b8083838151811061290f5761290f613d27565b60200260200101818152505085828151811061292d5761292d613d27565b6020908102919091018101515f83815261012f835260409020815181559181015190919060018201906129609082613fe5565b50604082015160028201906129759082613fe5565b506060820151600382019061298a9082613fe5565b5060809190910151600490910180546001600160a01b0319166001600160a01b03909216919091179055506001016125d5565b509695505050505050565b5f82815261012d602090815260408083206001600160a01b03871684529091528120548082036129fb575f91505061070b565b5f84815261012f602052604081205490819003612a1c575f9250505061070b565b5f612a2983606484613122565b9094109695505050505050565b612a3e611763565b6001600160a01b038416612a645760405162461bcd60e51b81526004016105ca90614272565b5f83815261012d602090815260408083206001600160a01b0389168452909152902054339083811015612aa95760405162461bcd60e51b81526004016105ca906142b7565b5f85815261012d602090815260408083206001600160a01b038b8116855292528083208785039055908816825281208054869290612ae8908490613d94565b909155505060408051868152602081018690526001600160a01b03808916928a821692918616915f805160206146da833981519152910160405180910390a4612b35828888888888612c78565b50505050505050565b6001600160a01b038316612b645760405162461bcd60e51b81526004016105ca90614345565b336001600160a01b0384168114612b8d5760405162461bcd60e51b81526004016105ca90614388565b5f83815261012d602090815260408083206001600160a01b038816845282528083205486845261012f9092529091205483821015612bdd5760405162461bcd60e51b81526004016105ca906143d8565b83811015612bfd5760405162461bcd60e51b81526004016105ca9061441c565b5f85815261012d602090815260408083206001600160a01b038a8116808652918452828520898803905589855261012f8452828520898703905582518a81529384018990529092908716915f805160206146da833981519152910160405180910390a4611ba383875f888860405180602001604052805f8152505b612c80611763565b612c92846001600160a01b03166120d9565b15611ba35760405163f23a6e6160e01b81526001600160a01b0385169063f23a6e6190612ccb90899089908890889088906004016144ea565b6020604051808303815f875af1925050508015612d05575060408051601f3d908101601f19168201909252612d029181019061452e565b60015b612dba57612d11614549565b806308c379a003612d4a5750612d25614561565b80612d305750612d4c565b8060405162461bcd60e51b81526004016105ca9190613475565b505b60405162461bcd60e51b815260206004820152603f60248201527f455243313135353a207472616e7366657220746f206e6f6e2d4552433131353560448201527f52656365697665725570677261646561626c6520696d706c656d656e7465720060648201526084016105ca565b6001600160e01b0319811663f23a6e6160e01b14612b355760405162461bcd60e51b81526004016105ca906145e9565b612df2611763565b612e04846001600160a01b03166120d9565b15611ba35760405163bc197c8160e01b81526001600160a01b0385169063bc197c8190612e3d908990899088908890889060040161463c565b6020604051808303815f875af1925050508015612e77575060408051601f3d908101601f19168201909252612e749181019061452e565b60015b612e8357612d11614549565b6001600160e01b0319811663bc197c8160e01b14612b355760405162461bcd60e51b81526004016105ca906145e9565b612ebc816120d9565b612f1e5760405162461bcd60e51b815260206004820152602d60248201527f455243313936373a206e657720696d706c656d656e746174696f6e206973206e60448201526c1bdd08184818dbdb9d1c9858dd609a1b60648201526084016105ca565b805f805160206147da8339815191525b80546001600160a01b0319166001600160a01b039290921691909117905550565b612f5883613207565b5f82511180612f645750805b15611c05576120828383613246565b6001600160a01b038116612fd85760405162461bcd60e51b815260206004820152602660248201527f455243313936373a206e65772061646d696e20697320746865207a65726f206160448201526564647265737360d01b60648201526084016105ca565b805f8051602061477a833981519152612f2e565b5f54610100900460ff166130125760405162461bcd60e51b81526004016105ca9061445f565b61094233612088565b5f54610100900460ff166130415760405162461bcd60e51b81526004016105ca9061445f565b6097805460ff19169055565b5f8072184f03e93ff9f4daa797ed6e38ed64bf6a1f0160401b831061308b5772184f03e93ff9f4daa797ed6e38ed64bf6a1f0160401b830492506040015b6904ee2d6d415b85acef8160201b83106130b5576904ee2d6d415b85acef8160201b830492506020015b662386f26fc1000083106130d357662386f26fc10000830492506010015b6305f5e10083106130eb576305f5e100830492506008015b61271083106130ff57612710830492506004015b60648310613111576064830492506002015b600a83106105f85760010192915050565b5f80805f19858709858702925082811083820303915050805f036131595783828161314f5761314f6144d6565b049250505061070b565b8084116131a05760405162461bcd60e51b81526020600482015260156024820152744d6174683a206d756c446976206f766572666c6f7760581b60448201526064016105ca565b5f8486880960026001871981018816978890046003810283188082028403028082028403028082028403028082028403028082028403029081029092039091025f889003889004909101858311909403939093029303949094049190911702949350505050565b61321081612eb3565b6040516001600160a01b038216907fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b905f90a250565b606061070b838360405180606001604052806027815260200161483a6027913960605f80856001600160a01b0316856040516132829190613f57565b5f60405180830381855af49150503d805f81146132ba576040519150601f19603f3d011682016040523d82523d5f602084013e6132bf565b606091505b50915091506132d0868383876132da565b9695505050505050565b606083156133465782515f0361333f576132f3856120d9565b61333f5760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e747261637400000060448201526064016105ca565b5081613350565b6133508383613358565b949350505050565b815115612d305781518083602001fd5b6040518060a001604052805f81526020016060815260200160608152602001606081526020015f6001600160a01b031681525090565b80356001600160a01b03811681146133b4575f80fd5b919050565b5f80604083850312156133ca575f80fd5b6133d38361339e565b946020939093013593505050565b6001600160e01b031981168114610919575f80fd5b5f60208284031215613406575f80fd5b813561070b816133e1565b5f60208284031215613421575f80fd5b5035919050565b5f5b8381101561344257818101518382015260200161342a565b50505f910152565b5f8151808452613461816020860160208601613428565b601f01601f19169290920160200192915050565b602081525f61070b602083018461344a565b5f60208284031215613497575f80fd5b61070b8261339e565b634e487b7160e01b5f52604160045260245ffd5b601f8201601f191681016001600160401b03811182821017156134d9576134d96134a0565b6040525050565b5f6001600160401b038211156134f8576134f86134a0565b5060051b60200190565b5f82601f830112613511575f80fd5b8135602061351e826134e0565b60405161352b82826134b4565b80915083815260208101915060208460051b87010193508684111561354e575f80fd5b602086015b848110156129bd576135648161339e565b8352918301918301613553565b5f82601f830112613580575f80fd5b8135602061358d826134e0565b60405161359a82826134b4565b80915083815260208101915060208460051b8701019350868411156135bd575f80fd5b602086015b848110156129bd57803583529183019183016135c2565b5f6001600160401b038211156135f1576135f16134a0565b50601f01601f191660200190565b5f82601f83011261360e575f80fd5b8135613619816135d9565b60405161362682826134b4565b82815285602084870101111561363a575f80fd5b826020860160208301375f92810160200192909252509392505050565b5f805f805f805f60e0888a03121561366d575f80fd5b87356001600160401b0380821115613683575f80fd5b61368f8b838c01613502565b985060208a0135975060408a01359150808211156136ab575f80fd5b6136b78b838c01613571565b965060608a01359150808211156136cc575f80fd5b6136d88b838c016135ff565b955060808a01359150808211156136ed575f80fd5b6136f98b838c016135ff565b945060a08a013591508082111561370e575f80fd5b5061371b8a828b016135ff565b92505061372a60c0890161339e565b905092959891949750929550565b5f805f805f60a0868803121561374c575f80fd5b6137558661339e565b94506137636020870161339e565b935060408601356001600160401b038082111561377e575f80fd5b61378a89838a01613571565b9450606088013591508082111561379f575f80fd5b6137ab89838a01613571565b935060808801359150808211156137c0575f80fd5b506137cd888289016135ff565b9150509295509295909350565b6001600160a01b0391909116815260200190565b5f80604083850312156137ff575f80fd5b82356001600160401b0380821115613815575f80fd5b61382186838701613502565b93506020850135915080821115613836575f80fd5b5061384385828601613571565b9150509250929050565b5f815180845260208085019450602084015f5b8381101561387c57815187529582019590820190600101613860565b509495945050505050565b602081525f61070b602083018461384d565b5f80604083850312156138aa575f80fd5b6138b38361339e565b915060208301356001600160401b038111156138cd575f80fd5b613843858286016135ff565b85815260a060208201525f6138f160a083018761344a565b8281036040840152613903818761344a565b90508281036060840152613917818661344a565b91505060018060a01b03831660808301529695505050505050565b5f805f60608486031215613944575f80fd5b61394d8461339e565b925060208401356001600160401b0380821115613968575f80fd5b61397487838801613571565b93506040860135915080821115613989575f80fd5b5061399686828701613571565b9150509250925092565b5f805f606084860312156139b2575f80fd5b6139bb8461339e565b92506020840135915060408401356001600160401b038111156139dc575f80fd5b613996868287016135ff565b5f80604083850312156139f9575f80fd5b613a028361339e565b915060208301358015158114613a16575f80fd5b809150509250929050565b5f82601f830112613a30575f80fd5b81356020613a3d826134e0565b604051613a4a82826134b4565b83815260059390931b8501820192828101915086841115613a69575f80fd5b8286015b848110156129bd5780356001600160401b03811115613a8a575f80fd5b613a988986838b01016135ff565b845250918301918301613a6d565b5f805f805f805f60e0888a031215613abc575f80fd5b87356001600160401b0380821115613ad2575f80fd5b613ade8b838c01613502565b985060208a0135915080821115613af3575f80fd5b613aff8b838c01613571565b975060408a0135915080821115613b14575f80fd5b613b208b838c01613571565b965060608a0135915080821115613b35575f80fd5b613b418b838c01613a21565b955060808a0135915080821115613b56575f80fd5b613b628b838c01613a21565b945060a08a0135915080821115613b77575f80fd5b613b838b838c01613a21565b935060c08a0135915080821115613b98575f80fd5b50613ba58a828b01613502565b91505092959891949750929550565b5f8060408385031215613bc5575f80fd5b82356001600160401b03811115613bda575f80fd5b613be6858286016135ff565b95602094909401359450505050565b5f8060408385031215613c06575f80fd5b613c0f8361339e565b9150613c1d6020840161339e565b90509250929050565b5f805f805f60a08688031215613c3a575f80fd5b613c438661339e565b9450613c516020870161339e565b9350604086013592506060860135915060808601356001600160401b03811115613c79575f80fd5b6137cd888289016135ff565b5f805f60608486031215613c97575f80fd5b613ca08461339e565b95602085013595506040909401359392505050565b5f60208284031215613cc5575f80fd5b81516001600160401b03811115613cda575f80fd5b8201601f81018413613cea575f80fd5b8051613cf5816135d9565b604051613d0282826134b4565b828152866020848601011115613d16575f80fd5b6132d0836020830160208701613428565b634e487b7160e01b5f52603260045260245ffd5b60208082526025908201527f4561636820616d6f756e74206d7573742062652067726561746572207468616e604082015264207a65726f60d81b606082015260800190565b634e487b7160e01b5f52601160045260245ffd5b808201808211156105f8576105f8613d80565b6020808252602e908201527f455243313135353a2063616c6c6572206973206e6f7420746f6b656e206f776e60408201526d195c881bdc88185c1c1c9bdd995960921b606082015260800190565b6020808252602c908201525f805160206147ba83398151915260408201526b19195b1959d85d1958d85b1b60a21b606082015260800190565b6020808252602c908201525f805160206147ba83398151915260408201526b6163746976652070726f787960a01b606082015260800190565b6020808252602e908201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160408201526d191e481a5b9a5d1a585b1a5e995960921b606082015260800190565b600181811c90821680613ec957607f821691505b602082108103613ee757634e487b7160e01b5f52602260045260245ffd5b50919050565b5f8651613efe818460208b01613428565b865190830190613f12818360208b01613428565b8651910190613f25818360208a01613428565b8551910190613f38818360208901613428565b8451910190613f4b818360208801613428565b01979650505050505050565b5f8251613f68818460208701613428565b9190910192915050565b6020808252601590820152744f6e6c79203e203730252063616e2075706461746560581b604082015260600190565b601f821115611c0557805f5260205f20601f840160051c81016020851015613fc65750805b601f840160051c820191505b8181101561084e575f8155600101613fd2565b81516001600160401b03811115613ffe57613ffe6134a0565b6140128161400c8454613eb5565b84613fa1565b602080601f831160018114614045575f841561402e5750858301515b5f19600386901b1c1916600185901b178555611ba3565b5f85815260208120601f198616915b8281101561407357888601518255948401946001909101908401614054565b508582101561409057878501515f19600388901b60f8161c191681555b5050505050600190811b01905550565b828152604060208201525f613350604083018461344a565b6020808252601690820152751119599a5b9a5d1a5bdb881a5cc81c995c5d5a5c995960521b604082015260600190565b6020808252601b908201527a15985b1a59081cd95cdcda5bdb9259081a5cc81c995c5d5a5c9959602a1b604082015260600190565b6020808252601390820152724d696e696d756d20737570706c79206973203160681b604082015260600190565b6020808252602b908201527f4e756d626572206f6620726563697069656e747320616e6420616d6f756e747360408201526a040daeae6e840dac2e8c6d60ab1b606082015260800190565b60208082526034908201527f53657373696f6e20494420616c72656164792065786973742c20706c6561736560408201527320757365206120646966666572656e74206f6e6560601b606082015260800190565b60208082526021908201527f455243313135353a206d696e7420746f20746865207a65726f206164647265736040820152607360f81b606082015260800190565b60208082526028908201527f455243313135353a2069647320616e6420616d6f756e7473206c656e677468206040820152670dad2e6dac2e8c6d60c31b606082015260800190565b60208082526025908201527f455243313135353a207472616e7366657220746f20746865207a65726f206164604082015264647265737360d81b606082015260800190565b6020808252602a908201527f455243313135353a20696e73756666696369656e742062616c616e636520666f60408201526939103a3930b739b332b960b11b606082015260800190565b604081525f614313604083018561384d565b8281036020840152614325818561384d565b95945050505050565b5f6020828403121561433e575f80fd5b5051919050565b60208082526023908201527f455243313135353a206275726e2066726f6d20746865207a65726f206164647260408201526265737360e81b606082015260800190565b60208082526030908201527f455243313135353a206f70657261746f722063616e206f6e6c79206275726e2060408201526f6f776e20746f6b656e20737570706c7960801b606082015260800190565b60208082526024908201527f455243313135353a206275726e20616d6f756e7420657863656564732062616c604082015263616e636560e01b606082015260800190565b60208082526023908201527f455243313135353a206275726e20616d6f756e74206578636565647320737570604082015262706c7960e81b606082015260800190565b6020808252602b908201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960408201526a6e697469616c697a696e6760a81b606082015260800190565b80820281158282048414176105f8576105f8613d80565b5f816144cf576144cf613d80565b505f190190565b634e487b7160e01b5f52601260045260245ffd5b6001600160a01b03868116825285166020820152604081018490526060810183905260a0608082018190525f906145239083018461344a565b979650505050505050565b5f6020828403121561453e575f80fd5b815161070b816133e1565b5f60033d1115610bd75760045f803e505f5160e01c90565b5f60443d101561456e5790565b6040516003193d81016004833e81513d6001600160401b03808311602484018310171561459d57505050505090565b82850191508151818111156145b55750505050505090565b843d87010160208285010111156145cf5750505050505090565b6145de602082860101876134b4565b509095945050505050565b60208082526033908201527f455243313135353a204552433131353552656365697665725570677261646561604082015272626c652072656a656374656420746f6b656e7360681b606082015260800190565b6001600160a01b0386811682528516602082015260a0604082018190525f906146679083018661384d565b8281036060840152614679818661384d565b9050828103608084015261468d818561344a565b9897505050505050505056fe4a39dc06d4c0dbc64b70af90fd698a233a518aa5d07e595d983b8c0526c8f7fba931009702e5c9178e55b3ba8179910e320f57ebc99d25da686ceeca819dd1adc3d58168c5ae7397731d063d5bbf3d657854427343f4c083240f7aacaa2d0f62c309dd0214e20b4ac09f4e6fbf0bea77bc3c29dd5de5f151356fee38818f1de3526b6140088b86dac1c566c0ebf11be98a0e2e497db676b624c6c4e0836ff7e0dc07c69254c2987eeca5c449653b00bab034cb3277b3f9bd9a96a9e667bfacad4f2c77207bd96f127d8828e58585416f7035f8e7773b3407a511605e506e0314b53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d6103cf2d78cb9587d5b497e3dc0bfe7080a6347891e05f592c02873a63e91ea5e29946756e6374696f6e206d7573742062652063616c6c6564207468726f75676820360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc30dcc2f89abd6ea125b7e46c7d3e5b01c5261885095c2306141ab05c1c030e2f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb3847402498416464726573733a206c6f772d6c6576656c2064656c65676174652063616c6c206661696c6564a26469706673582212206d5361b524ddcd98313581827d5304c3d6f4ad874adecfaf20812212f8a7239664736f6c63430008170033
Deployed Bytecode
0x60806040526004361061017c575f3560e01c8062fdd58e1461018057806301ffc9a7146101b25780630e89341c146101e15780631117a0981461020d578063122796131461022e5780632eb2c2d61461024d5780633659cfe61461026c5780633e47158c1461028b5780633f4ba83a146102ac57806347c02661146102c05780634e1273f4146102df5780634f1ef2861461030b57806352d1902d1461031e5780635c60da1b146103325780635c975abb146103465780635cd8a76b1461035d5780636a982298146103715780636b20c454146103a1578063715018a6146103c05780638129fc1c146103d45780638456cb59146103e85780638da5cb5b146103fc57806394e2c9e314610410578063a1cca8411461042e578063a22cb4651461044d578063b20b607b1461046c578063b36c9db51461048b578063dc5180e6146104aa578063e6635f5d146104c9578063e985e9c5146104e8578063f242432a14610507578063f2fde38b14610526578063f5298aca14610545575b5f80fd5b34801561018b575f80fd5b5061019f61019a3660046133b9565b610564565b6040519081526020015b60405180910390f35b3480156101bd575f80fd5b506101d16101cc3660046133f6565b6105fe565b60405190151581526020016101a9565b3480156101ec575f80fd5b506102006101fb366004613411565b61064d565b6040516101a99190613475565b348015610218575f80fd5b5061022c610227366004613487565b610712565b005b348015610239575f80fd5b5061019f610248366004613657565b61073d565b348015610258575f80fd5b5061022c610267366004613738565b610801565b348015610277575f80fd5b5061022c610286366004613487565b610855565b348015610296575f80fd5b5061029f61091c565b6040516101a991906137da565b3480156102b7575f80fd5b5061022c61092a565b3480156102cb575f80fd5b5061022c6102da366004613487565b610944565b3480156102ea575f80fd5b506102fe6102f93660046137ee565b610955565b6040516101a99190613887565b61022c610319366004613899565b610a74565b348015610329575f80fd5b5061019f610b2d565b34801561033d575f80fd5b5061029f610bda565b348015610351575f80fd5b5060975460ff166101d1565b348015610368575f80fd5b5061022c610be3565b34801561037c575f80fd5b5061039061038b366004613411565b610e5b565b6040516101a99594939291906138d9565b3480156103ac575f80fd5b506101d16103bb366004613932565b611025565b3480156103cb575f80fd5b5061022c611043565b3480156103df575f80fd5b5061022c611054565b3480156103f3575f80fd5b5061022c61111d565b348015610407575f80fd5b5061029f611135565b34801561041b575f80fd5b50610130546001600160a01b031661029f565b348015610439575f80fd5b5061019f6104483660046139a0565b611144565b348015610458575f80fd5b5061022c6104673660046139e8565b6111e5565b348015610477575f80fd5b506102fe610486366004613aa6565b6111f8565b348015610496575f80fd5b506101d16104a5366004613bb4565b611400565b3480156104b5575f80fd5b506101d16104c4366004613bb4565b611490565b3480156104d4575f80fd5b506101d16104e33660046133b9565b611536565b3480156104f3575f80fd5b506101d1610502366004613bf5565b6115f5565b348015610512575f80fd5b5061022c610521366004613c26565b61162d565b348015610531575f80fd5b5061022c610540366004613487565b61167a565b348015610550575f80fd5b506101d161055f366004613c85565b6116f0565b5f6001600160a01b0383166105d35760405162461bcd60e51b815260206004820152602a60248201527f455243313135353a2061646472657373207a65726f206973206e6f742061207660448201526930b634b21037bbb732b960b11b60648201526084015b60405180910390fd5b505f81815261012d602090815260408083206001600160a01b03861684529091529020545b92915050565b5f6001600160e01b03198216636cdb3d1360e11b148061062e57506001600160e01b031982166303a24d0760e21b145b806105f857506301ffc9a760e01b6001600160e01b03198316146105f8565b5f81815261012f6020526040812060040154606091906001600160a01b031615610691575f83815261012f60205260409020600401546001600160a01b031661069f565b610130546001600160a01b03165b6040516303a24d0760e21b8152600481018590529091506001600160a01b03821690630e89341c906024015f60405180830381865afa1580156106e4573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f1916820160405261070b9190810190613cb5565b9392505050565b61071a611704565b61013080546001600160a01b0319166001600160a01b0392909216919091179055565b5f610746611763565b5f805b87518110156107a3575f88828151811061076557610765613d27565b602002602001015190505f811161078e5760405162461bcd60e51b81526004016105ca90613d3b565b6107988184613d94565b925050600101610749565b506107ac613368565b81815260208082018790526040808301899052606083018790526001600160a01b0386166080840152805191820190525f808252906107f2908c908c908c9086906117a9565b9b9a5050505050505050505050565b610809611763565b6001600160a01b038516331480610825575061082585336115f5565b6108415760405162461bcd60e51b81526004016105ca90613da7565b61084e8585858585611a21565b5050505050565b6001600160a01b037f000000000000000000000000ac060b48bdd8680b7fccb8563d78e1b85219485b16300361089d5760405162461bcd60e51b81526004016105ca90613df5565b7f000000000000000000000000ac060b48bdd8680b7fccb8563d78e1b85219485b6001600160a01b03166108cf611bab565b6001600160a01b0316146108f55760405162461bcd60e51b81526004016105ca90613e2e565b6108fe81611bca565b604080515f8082526020820190925261091991839190611bd2565b50565b5f610925611d41565b905090565b610932611704565b61093a611d55565b610942611d9e565b565b61094c611dea565b61091981611e67565b606081518351146109ba5760405162461bcd60e51b815260206004820152602960248201527f455243313135353a206163636f756e747320616e6420696473206c656e677468604482015268040dad2e6dac2e8c6d60bb1b60648201526084016105ca565b5f83516001600160401b038111156109d4576109d46134a0565b6040519080825280602002602001820160405280156109fd578160200160208202803683370190505b5090505f5b8451811015610a6c57610a47858281518110610a2057610a20613d27565b6020026020010151858381518110610a3a57610a3a613d27565b6020026020010151610564565b828281518110610a5957610a59613d27565b6020908102919091010152600101610a02565b509392505050565b6001600160a01b037f000000000000000000000000ac060b48bdd8680b7fccb8563d78e1b85219485b163003610abc5760405162461bcd60e51b81526004016105ca90613df5565b7f000000000000000000000000ac060b48bdd8680b7fccb8563d78e1b85219485b6001600160a01b0316610aee611bab565b6001600160a01b031614610b145760405162461bcd60e51b81526004016105ca90613e2e565b610b1d82611bca565b610b2982826001611bd2565b5050565b5f306001600160a01b037f000000000000000000000000ac060b48bdd8680b7fccb8563d78e1b85219485b1614610bc75760405162461bcd60e51b815260206004820152603860248201527f555550535570677261646561626c653a206d757374206e6f742062652063616c6044820152771b1959081d1a1c9bdd59da0819195b1959d85d1958d85b1b60421b60648201526084016105ca565b505f805160206147da8339815191525b90565b5f610925611bab565b5f54600290610100900460ff16158015610c0357505f5460ff8083169116105b610c1f5760405162461bcd60e51b81526004016105ca90613e67565b5f805461ffff191660ff831617610100178155674d7fa24753d8f4eb905261012f6020525f8051602061475a8339815191525415610c7a57674d7fa24753d8f4eb5f90815261012f6020525f8051602061475a833981519152555b6701aec0c5bc87af0f5f5261012f6020525f805160206146ba8339815191525415610cc2576701aec0c5bc87af0f5f90815261012f6020525f805160206146ba833981519152555b674f4c0eff57fa18a55f5261012f6020525f8051602061471a8339815191525415610d0a57674f4c0eff57fa18a55f90815261012f6020525f8051602061471a833981519152555b671b6cb75c0eca78ae5f5261012f6020525f805160206146fa8339815191525415610d5257671b6cb75c0eca78ae5f90815261012f6020525f805160206146fa833981519152555b67e34e3169feb205cd5f5261012f6020525f8051602061473a8339815191525415610d9a5767e34e3169feb205cd5f90815261012f6020525f8051602061473a833981519152555b67ee5515e8b6fa63d45f5261012f6020525f8051602061479a8339815191525415610de25767ee5515e8b6fa63d45f90815261012f6020525f8051602061479a833981519152555b67f43d15cd014fa9df5f5261012f6020525f805160206147fa8339815191525415610e2a5767f43d15cd014fa9df5f90815261012f6020525f805160206147fa833981519152555b5f805461ff001916905560405160ff821681525f8051602061481a833981519152906020015b60405180910390a150565b61012f6020525f908152604090208054600182018054919291610e7d90613eb5565b80601f0160208091040260200160405190810160405280929190818152602001828054610ea990613eb5565b8015610ef45780601f10610ecb57610100808354040283529160200191610ef4565b820191905f5260205f20905b815481529060010190602001808311610ed757829003601f168201915b505050505090806002018054610f0990613eb5565b80601f0160208091040260200160405190810160405280929190818152602001828054610f3590613eb5565b8015610f805780601f10610f5757610100808354040283529160200191610f80565b820191905f5260205f20905b815481529060010190602001808311610f6357829003601f168201915b505050505090806003018054610f9590613eb5565b80601f0160208091040260200160405190810160405280929190818152602001828054610fc190613eb5565b801561100c5780601f10610fe35761010080835404028352916020019161100c565b820191905f5260205f20905b815481529060010190602001808311610fef57829003601f168201915b505050600490930154919250506001600160a01b031685565b5f61102e611763565b611039848484611ebb565b5060019392505050565b61104b611704565b6109425f612088565b5f54610100900460ff161580801561107257505f54600160ff909116105b806110925750611081306120d9565b15801561109257505f5460ff166001145b6110ae5760405162461bcd60e51b81526004016105ca90613e67565b5f805460ff1916600117905580156110cf575f805461ff0019166101001790555b6110d76120e8565b6110df61210e565b6110e7612144565b6110ef612172565b8015610919575f805461ff0019169055604051600181525f8051602061481a83398151915290602001610e50565b611125611704565b61112d611763565b6109426121a0565b6065546001600160a01b031690565b5f61114d611763565b5f611162856001600160a01b031660146121dd565b90505f61116e46612372565b61117730612401565b8361118188612372565b87604051602001611196959493929190613eed565b60405160208183030381529060405290505f816040516020016111b99190613f57565b60408051808303601f1901815291905280516020909101206001600160401b0316979650505050505050565b6111ed611763565b610b29338383612417565b6060611202611763565b5f805b875181101561125f575f88828151811061122157611221613d27565b602002602001015190505f811161124a5760405162461bcd60e51b81526004016105ca90613d3b565b6112548184613d94565b925050600101611205565b5087515f816001600160401b0381111561127b5761127b6134a0565b6040519080825280602002602001820160405280156112b457816020015b6112a1613368565b8152602001906001900390816112995790505b5090505f5b828110156113e457838282815181106112d4576112d4613d27565b60200260200101515f0181815250508781815181106112f5576112f5613d27565b602002602001015182828151811061130f5761130f613d27565b60200260200101516020018190525088818151811061133057611330613d27565b602002602001015182828151811061134a5761134a613d27565b60200260200101516040018190525086818151811061136b5761136b613d27565b602002602001015182828151811061138557611385613d27565b6020026020010151606001819052508581815181106113a6576113a6613d27565b60200260200101518282815181106113c0576113c0613d27565b60209081029190910101516001600160a01b039091166080909101526001016112b9565b506107f28b8b8b8460405180602001604052805f8152506124ff565b5f611409611763565b611416335b8360466129c8565b6114325760405162461bcd60e51b81526004016105ca90613f72565b5f82815261012f6020526040902060010161144d8482613fe5565b507f6b491e3cbe1a3d27a215d960a465834cf22a7e3e87ffe8be5724ab67f72583fb828460405161147f9291906140a0565b60405180910390a150600192915050565b5f611499611763565b6114a5338360326129c8565b6114e95760405162461bcd60e51b81526020600482015260156024820152744f6e6c79203e203530252063616e2075706461746560581b60448201526064016105ca565b5f82815261012f602052604090206003016115048482613fe5565b507fb56c2e2e610c525cd60429993be20aab298f5bc84e28ad1a0b8eb2c2ca855920828460405161147f9291906140a0565b5f61153f611763565b6115483361140e565b6115645760405162461bcd60e51b81526004016105ca90613f72565b5f82815261012f60205260409081902060040180546001600160a01b0386166001600160a01b0319909116179055517f56137a68f73d3785a7a236d27a378cb92851e1b1d68317de555fc4fde9c17add9061147f9084908690918252606060208301819052600990830152683b30b634b230ba37b960b91b60808301526001600160a01b0316604082015260a00190565b5f6115fe611763565b506001600160a01b039182165f90815261012e6020908152604080832093909416825291909152205460ff1690565b611635611763565b6001600160a01b038516331480611651575061165185336115f5565b61166d5760405162461bcd60e51b81526004016105ca90613da7565b61084e8585858585612a36565b611682611704565b6001600160a01b0381166116e75760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b60648201526084016105ca565b61091981612088565b5f6116f9611763565b611039848484612b3e565b3361170d611135565b6001600160a01b0316146109425760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064016105ca565b60975460ff16156109425760405162461bcd60e51b815260206004820152601060248201526f14185d5cd8589b194e881c185d5cd95960821b60448201526064016105ca565b5f6117b2611763565b5f836040015151116117d65760405162461bcd60e51b81526004016105ca906140b8565b5f85116117f55760405162461bcd60e51b81526004016105ca906140e8565b82516118135760405162461bcd60e51b81526004016105ca9061411d565b83518651146118345760405162461bcd60e51b81526004016105ca9061414a565b60808301516001600160a01b031661185957610130546001600160a01b031660808401525b5f61186933878660200151611144565b5f81815261012f6020526040902054909150156118985760405162461bcd60e51b81526004016105ca90614195565b5f5b8751811015611997575f8882815181106118b6576118b6613d27565b602002602001015190505f6001600160a01b0316816001600160a01b0316036118f15760405162461bcd60e51b81526004016105ca906141e9565b5f87838151811061190457611904613d27565b6020908102919091018101515f86815261012d835260408082206001600160a01b0387168352909352918220805491935083929091611944908490613d94565b909155506119589050335f8487858b612c78565b60408051858152602081018390526001600160a01b038416915f9133915f805160206146da833981519152910160405180910390a4505060010161189a565b505f81815261012f60209081526040909120855181559085015185919060018201906119c39082613fe5565b50604082015160028201906119d89082613fe5565b50606082015160038201906119ed9082613fe5565b5060809190910151600490910180546001600160a01b0319166001600160a01b039092169190911790559695505050505050565b611a29611763565b8151835114611a4a5760405162461bcd60e51b81526004016105ca9061422a565b6001600160a01b038416611a705760405162461bcd60e51b81526004016105ca90614272565b335f5b8451811015611b50575f858281518110611a8f57611a8f613d27565b602002602001015190505f858381518110611aac57611aac613d27565b6020908102919091018101515f84815261012d835260408082206001600160a01b038e168352909352919091205490915081811015611afd5760405162461bcd60e51b81526004016105ca906142b7565b5f83815261012d602090815260408083206001600160a01b038e8116855292528083208585039055908b16825281208054849290611b3c908490613d94565b909155505060019093019250611a73915050565b50846001600160a01b0316866001600160a01b0316826001600160a01b03165f8051602061469a8339815191528787604051611b8d929190614301565b60405180910390a4611ba3818787878787612dea565b505050505050565b5f5f805160206147da8339815191525b546001600160a01b0316919050565b610919611dea565b7f4910fdfa16fed3260ed0e7147f7cc6da11a60208b5b9406d12a635614ffd91435460ff1615611c0a57611c0583612eb3565b505050565b826001600160a01b03166352d1902d6040518163ffffffff1660e01b8152600401602060405180830381865afa925050508015611c64575060408051601f3d908101601f19168201909252611c619181019061432e565b60015b611cc75760405162461bcd60e51b815260206004820152602e60248201527f45524331393637557067726164653a206e657720696d706c656d656e7461746960448201526d6f6e206973206e6f74205555505360901b60648201526084016105ca565b5f805160206147da8339815191528114611d355760405162461bcd60e51b815260206004820152602960248201527f45524331393637557067726164653a20756e737570706f727465642070726f786044820152681a58589b195555525160ba1b60648201526084016105ca565b50611c05838383612f4f565b5f5f8051602061477a833981519152611bbb565b60975460ff166109425760405162461bcd60e51b815260206004820152601460248201527314185d5cd8589b194e881b9bdd081c185d5cd95960621b60448201526064016105ca565b611da6611d55565b6097805460ff191690557f5db9ee0a495bf2e6ff9c91a7834c1ba4fdd244a5e8aa4e537bd38aeae4b073aa335b604051611de091906137da565b60405180910390a1565b33611df3611d41565b6001600160a01b0316146109425760405162461bcd60e51b815260206004820152603560248201527f46616272696361555550535570677261646561626c653a2063616c6c6572206960448201527439903737ba103a343290383937bc3c9030b236b4b760591b60648201526084016105ca565b7f7e644d79422f17c01e4894b5f4f588d331ebfa28653d42ae832dc59e38c9798f611e90611d41565b604080516001600160a01b03928316815291841660208301520160405180910390a161091981612f73565b6001600160a01b038316611ee15760405162461bcd60e51b81526004016105ca90614345565b8051825114611f025760405162461bcd60e51b81526004016105ca9061422a565b336001600160a01b0384168114611f2b5760405162461bcd60e51b81526004016105ca90614388565b5f5b8351811015612021575f848281518110611f4957611f49613d27565b602002602001015190505f848381518110611f6657611f66613d27565b6020908102919091018101515f84815261012d835260408082206001600160a01b038c16835284528082205486835261012f90945290205490925082821015611fc15760405162461bcd60e51b81526004016105ca906143d8565b82811015611fe15760405162461bcd60e51b81526004016105ca9061441c565b5f84815261012d602090815260408083206001600160a01b038d16845282528083209486900390945594815261012f909452922091039055600101611f2d565b505f6001600160a01b0316846001600160a01b0316826001600160a01b03165f8051602061469a833981519152868660405161205e929190614301565b60405180910390a461208281855f868660405180602001604052805f815250612dea565b50505050565b606580546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0905f90a35050565b6001600160a01b03163b151590565b5f54610100900460ff166109425760405162461bcd60e51b81526004016105ca9061445f565b5f54610100900460ff166121345760405162461bcd60e51b81526004016105ca9061445f565b61213c6120e8565b6109426120e8565b5f54610100900460ff1661216a5760405162461bcd60e51b81526004016105ca9061445f565b610942612fec565b5f54610100900460ff166121985760405162461bcd60e51b81526004016105ca9061445f565b61094261301b565b6121a8611763565b6097805460ff191660011790557f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a258611dd33390565b60605f6121eb8360026144aa565b6121f6906002613d94565b6001600160401b0381111561220d5761220d6134a0565b6040519080825280601f01601f191660200182016040528015612237576020820181803683370190505b509050600360fc1b815f8151811061225157612251613d27565b60200101906001600160f81b03191690815f1a905350600f60fb1b8160018151811061227f5761227f613d27565b60200101906001600160f81b03191690815f1a9053505f6122a18460026144aa565b6122ac906001613d94565b90505b6001811115612323576f181899199a1a9b1b9c1cb0b131b232b360811b85600f16601081106122e0576122e0613d27565b1a60f81b8282815181106122f6576122f6613d27565b60200101906001600160f81b03191690815f1a90535060049490941c9361231c816144c1565b90506122af565b50831561070b5760405162461bcd60e51b815260206004820181905260248201527f537472696e67733a20686578206c656e67746820696e73756666696369656e7460448201526064016105ca565b60605f61237e8361304d565b60010190505f816001600160401b0381111561239c5761239c6134a0565b6040519080825280601f01601f1916602001820160405280156123c6576020820181803683370190505b5090508181016020015b5f19016f181899199a1a9b1b9c1cb0b131b232b360811b600a86061a8153600a85049450846123d057509392505050565b60606105f86001600160a01b03831660146121dd565b61241f611763565b816001600160a01b0316836001600160a01b0316036124925760405162461bcd60e51b815260206004820152602960248201527f455243313135353a2073657474696e6720617070726f76616c20737461747573604482015268103337b91039b2b63360b91b60648201526084016105ca565b6001600160a01b038381165f81815261012e6020908152604080832094871680845294825291829020805460ff191686151590811790915591519182527f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a3505050565b6060612509611763565b835186511461252a5760405162461bcd60e51b81526004016105ca9061414a565b825185511461258d5760405162461bcd60e51b815260206004820152602960248201527f73657373696f6e49647320616e642070726f70657274696573206c656e677468604482015268040dad2e6dac2e8c6d60bb1b60648201526084016105ca565b5f85516001600160401b038111156125a7576125a76134a0565b6040519080825280602002602001820160405280156125d0578160200160208202803683370190505b5090505f5b86518110156129bd575f8582815181106125f1576125f1613d27565b602002602001015160400151511161261b5760405162461bcd60e51b81526004016105ca906140b8565b5f87828151811061262e5761262e613d27565b6020026020010151116126535760405162461bcd60e51b81526004016105ca906140e8565b5f85828151811061266657612666613d27565b60200260200101515f01511161268e5760405162461bcd60e51b81526004016105ca9061411d565b5f6126d0338984815181106126a5576126a5613d27565b60200260200101518885815181106126bf576126bf613d27565b602002602001015160200151611144565b90505f5b8951811015612850575f8a82815181106126f0576126f0613d27565b602002602001015190505f6001600160a01b0316816001600160a01b03160361272b5760405162461bcd60e51b81526004016105ca906141e9565b5f89838151811061273e5761273e613d27565b6020908102919091018101515f86815261012d835260408082206001600160a01b038716835290935291822080549193508392909161277e908490613d94565b909155505085515f906001600160401b0381111561279e5761279e6134a0565b6040519080825280602002602001820160405280156127c7578160200160208202803683370190505b5090505f5b87518110156127fb57828282815181106127e8576127e8613d27565b60209081029190910101526001016127cc565b5061280a335f858a858e612dea565b6001600160a01b0383165f336001600160a01b03165f8051602061469a8339815191528a8560405161283d929190614301565b60405180910390a45050506001016126d4565b505f81815261012f60205260409020541561287d5760405162461bcd60e51b81526004016105ca90614195565b5f6001600160a01b031686838151811061289957612899613d27565b6020026020010151608001516001600160a01b0316036128fc576101305486516001600160a01b03909116908790849081106128d7576128d7613d27565b6020026020010151608001906001600160a01b031690816001600160a01b0316815250505b8083838151811061290f5761290f613d27565b60200260200101818152505085828151811061292d5761292d613d27565b6020908102919091018101515f83815261012f835260409020815181559181015190919060018201906129609082613fe5565b50604082015160028201906129759082613fe5565b506060820151600382019061298a9082613fe5565b5060809190910151600490910180546001600160a01b0319166001600160a01b03909216919091179055506001016125d5565b509695505050505050565b5f82815261012d602090815260408083206001600160a01b03871684529091528120548082036129fb575f91505061070b565b5f84815261012f602052604081205490819003612a1c575f9250505061070b565b5f612a2983606484613122565b9094109695505050505050565b612a3e611763565b6001600160a01b038416612a645760405162461bcd60e51b81526004016105ca90614272565b5f83815261012d602090815260408083206001600160a01b0389168452909152902054339083811015612aa95760405162461bcd60e51b81526004016105ca906142b7565b5f85815261012d602090815260408083206001600160a01b038b8116855292528083208785039055908816825281208054869290612ae8908490613d94565b909155505060408051868152602081018690526001600160a01b03808916928a821692918616915f805160206146da833981519152910160405180910390a4612b35828888888888612c78565b50505050505050565b6001600160a01b038316612b645760405162461bcd60e51b81526004016105ca90614345565b336001600160a01b0384168114612b8d5760405162461bcd60e51b81526004016105ca90614388565b5f83815261012d602090815260408083206001600160a01b038816845282528083205486845261012f9092529091205483821015612bdd5760405162461bcd60e51b81526004016105ca906143d8565b83811015612bfd5760405162461bcd60e51b81526004016105ca9061441c565b5f85815261012d602090815260408083206001600160a01b038a8116808652918452828520898803905589855261012f8452828520898703905582518a81529384018990529092908716915f805160206146da833981519152910160405180910390a4611ba383875f888860405180602001604052805f8152505b612c80611763565b612c92846001600160a01b03166120d9565b15611ba35760405163f23a6e6160e01b81526001600160a01b0385169063f23a6e6190612ccb90899089908890889088906004016144ea565b6020604051808303815f875af1925050508015612d05575060408051601f3d908101601f19168201909252612d029181019061452e565b60015b612dba57612d11614549565b806308c379a003612d4a5750612d25614561565b80612d305750612d4c565b8060405162461bcd60e51b81526004016105ca9190613475565b505b60405162461bcd60e51b815260206004820152603f60248201527f455243313135353a207472616e7366657220746f206e6f6e2d4552433131353560448201527f52656365697665725570677261646561626c6520696d706c656d656e7465720060648201526084016105ca565b6001600160e01b0319811663f23a6e6160e01b14612b355760405162461bcd60e51b81526004016105ca906145e9565b612df2611763565b612e04846001600160a01b03166120d9565b15611ba35760405163bc197c8160e01b81526001600160a01b0385169063bc197c8190612e3d908990899088908890889060040161463c565b6020604051808303815f875af1925050508015612e77575060408051601f3d908101601f19168201909252612e749181019061452e565b60015b612e8357612d11614549565b6001600160e01b0319811663bc197c8160e01b14612b355760405162461bcd60e51b81526004016105ca906145e9565b612ebc816120d9565b612f1e5760405162461bcd60e51b815260206004820152602d60248201527f455243313936373a206e657720696d706c656d656e746174696f6e206973206e60448201526c1bdd08184818dbdb9d1c9858dd609a1b60648201526084016105ca565b805f805160206147da8339815191525b80546001600160a01b0319166001600160a01b039290921691909117905550565b612f5883613207565b5f82511180612f645750805b15611c05576120828383613246565b6001600160a01b038116612fd85760405162461bcd60e51b815260206004820152602660248201527f455243313936373a206e65772061646d696e20697320746865207a65726f206160448201526564647265737360d01b60648201526084016105ca565b805f8051602061477a833981519152612f2e565b5f54610100900460ff166130125760405162461bcd60e51b81526004016105ca9061445f565b61094233612088565b5f54610100900460ff166130415760405162461bcd60e51b81526004016105ca9061445f565b6097805460ff19169055565b5f8072184f03e93ff9f4daa797ed6e38ed64bf6a1f0160401b831061308b5772184f03e93ff9f4daa797ed6e38ed64bf6a1f0160401b830492506040015b6904ee2d6d415b85acef8160201b83106130b5576904ee2d6d415b85acef8160201b830492506020015b662386f26fc1000083106130d357662386f26fc10000830492506010015b6305f5e10083106130eb576305f5e100830492506008015b61271083106130ff57612710830492506004015b60648310613111576064830492506002015b600a83106105f85760010192915050565b5f80805f19858709858702925082811083820303915050805f036131595783828161314f5761314f6144d6565b049250505061070b565b8084116131a05760405162461bcd60e51b81526020600482015260156024820152744d6174683a206d756c446976206f766572666c6f7760581b60448201526064016105ca565b5f8486880960026001871981018816978890046003810283188082028403028082028403028082028403028082028403028082028403029081029092039091025f889003889004909101858311909403939093029303949094049190911702949350505050565b61321081612eb3565b6040516001600160a01b038216907fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b905f90a250565b606061070b838360405180606001604052806027815260200161483a6027913960605f80856001600160a01b0316856040516132829190613f57565b5f60405180830381855af49150503d805f81146132ba576040519150601f19603f3d011682016040523d82523d5f602084013e6132bf565b606091505b50915091506132d0868383876132da565b9695505050505050565b606083156133465782515f0361333f576132f3856120d9565b61333f5760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e747261637400000060448201526064016105ca565b5081613350565b6133508383613358565b949350505050565b815115612d305781518083602001fd5b6040518060a001604052805f81526020016060815260200160608152602001606081526020015f6001600160a01b031681525090565b80356001600160a01b03811681146133b4575f80fd5b919050565b5f80604083850312156133ca575f80fd5b6133d38361339e565b946020939093013593505050565b6001600160e01b031981168114610919575f80fd5b5f60208284031215613406575f80fd5b813561070b816133e1565b5f60208284031215613421575f80fd5b5035919050565b5f5b8381101561344257818101518382015260200161342a565b50505f910152565b5f8151808452613461816020860160208601613428565b601f01601f19169290920160200192915050565b602081525f61070b602083018461344a565b5f60208284031215613497575f80fd5b61070b8261339e565b634e487b7160e01b5f52604160045260245ffd5b601f8201601f191681016001600160401b03811182821017156134d9576134d96134a0565b6040525050565b5f6001600160401b038211156134f8576134f86134a0565b5060051b60200190565b5f82601f830112613511575f80fd5b8135602061351e826134e0565b60405161352b82826134b4565b80915083815260208101915060208460051b87010193508684111561354e575f80fd5b602086015b848110156129bd576135648161339e565b8352918301918301613553565b5f82601f830112613580575f80fd5b8135602061358d826134e0565b60405161359a82826134b4565b80915083815260208101915060208460051b8701019350868411156135bd575f80fd5b602086015b848110156129bd57803583529183019183016135c2565b5f6001600160401b038211156135f1576135f16134a0565b50601f01601f191660200190565b5f82601f83011261360e575f80fd5b8135613619816135d9565b60405161362682826134b4565b82815285602084870101111561363a575f80fd5b826020860160208301375f92810160200192909252509392505050565b5f805f805f805f60e0888a03121561366d575f80fd5b87356001600160401b0380821115613683575f80fd5b61368f8b838c01613502565b985060208a0135975060408a01359150808211156136ab575f80fd5b6136b78b838c01613571565b965060608a01359150808211156136cc575f80fd5b6136d88b838c016135ff565b955060808a01359150808211156136ed575f80fd5b6136f98b838c016135ff565b945060a08a013591508082111561370e575f80fd5b5061371b8a828b016135ff565b92505061372a60c0890161339e565b905092959891949750929550565b5f805f805f60a0868803121561374c575f80fd5b6137558661339e565b94506137636020870161339e565b935060408601356001600160401b038082111561377e575f80fd5b61378a89838a01613571565b9450606088013591508082111561379f575f80fd5b6137ab89838a01613571565b935060808801359150808211156137c0575f80fd5b506137cd888289016135ff565b9150509295509295909350565b6001600160a01b0391909116815260200190565b5f80604083850312156137ff575f80fd5b82356001600160401b0380821115613815575f80fd5b61382186838701613502565b93506020850135915080821115613836575f80fd5b5061384385828601613571565b9150509250929050565b5f815180845260208085019450602084015f5b8381101561387c57815187529582019590820190600101613860565b509495945050505050565b602081525f61070b602083018461384d565b5f80604083850312156138aa575f80fd5b6138b38361339e565b915060208301356001600160401b038111156138cd575f80fd5b613843858286016135ff565b85815260a060208201525f6138f160a083018761344a565b8281036040840152613903818761344a565b90508281036060840152613917818661344a565b91505060018060a01b03831660808301529695505050505050565b5f805f60608486031215613944575f80fd5b61394d8461339e565b925060208401356001600160401b0380821115613968575f80fd5b61397487838801613571565b93506040860135915080821115613989575f80fd5b5061399686828701613571565b9150509250925092565b5f805f606084860312156139b2575f80fd5b6139bb8461339e565b92506020840135915060408401356001600160401b038111156139dc575f80fd5b613996868287016135ff565b5f80604083850312156139f9575f80fd5b613a028361339e565b915060208301358015158114613a16575f80fd5b809150509250929050565b5f82601f830112613a30575f80fd5b81356020613a3d826134e0565b604051613a4a82826134b4565b83815260059390931b8501820192828101915086841115613a69575f80fd5b8286015b848110156129bd5780356001600160401b03811115613a8a575f80fd5b613a988986838b01016135ff565b845250918301918301613a6d565b5f805f805f805f60e0888a031215613abc575f80fd5b87356001600160401b0380821115613ad2575f80fd5b613ade8b838c01613502565b985060208a0135915080821115613af3575f80fd5b613aff8b838c01613571565b975060408a0135915080821115613b14575f80fd5b613b208b838c01613571565b965060608a0135915080821115613b35575f80fd5b613b418b838c01613a21565b955060808a0135915080821115613b56575f80fd5b613b628b838c01613a21565b945060a08a0135915080821115613b77575f80fd5b613b838b838c01613a21565b935060c08a0135915080821115613b98575f80fd5b50613ba58a828b01613502565b91505092959891949750929550565b5f8060408385031215613bc5575f80fd5b82356001600160401b03811115613bda575f80fd5b613be6858286016135ff565b95602094909401359450505050565b5f8060408385031215613c06575f80fd5b613c0f8361339e565b9150613c1d6020840161339e565b90509250929050565b5f805f805f60a08688031215613c3a575f80fd5b613c438661339e565b9450613c516020870161339e565b9350604086013592506060860135915060808601356001600160401b03811115613c79575f80fd5b6137cd888289016135ff565b5f805f60608486031215613c97575f80fd5b613ca08461339e565b95602085013595506040909401359392505050565b5f60208284031215613cc5575f80fd5b81516001600160401b03811115613cda575f80fd5b8201601f81018413613cea575f80fd5b8051613cf5816135d9565b604051613d0282826134b4565b828152866020848601011115613d16575f80fd5b6132d0836020830160208701613428565b634e487b7160e01b5f52603260045260245ffd5b60208082526025908201527f4561636820616d6f756e74206d7573742062652067726561746572207468616e604082015264207a65726f60d81b606082015260800190565b634e487b7160e01b5f52601160045260245ffd5b808201808211156105f8576105f8613d80565b6020808252602e908201527f455243313135353a2063616c6c6572206973206e6f7420746f6b656e206f776e60408201526d195c881bdc88185c1c1c9bdd995960921b606082015260800190565b6020808252602c908201525f805160206147ba83398151915260408201526b19195b1959d85d1958d85b1b60a21b606082015260800190565b6020808252602c908201525f805160206147ba83398151915260408201526b6163746976652070726f787960a01b606082015260800190565b6020808252602e908201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160408201526d191e481a5b9a5d1a585b1a5e995960921b606082015260800190565b600181811c90821680613ec957607f821691505b602082108103613ee757634e487b7160e01b5f52602260045260245ffd5b50919050565b5f8651613efe818460208b01613428565b865190830190613f12818360208b01613428565b8651910190613f25818360208a01613428565b8551910190613f38818360208901613428565b8451910190613f4b818360208801613428565b01979650505050505050565b5f8251613f68818460208701613428565b9190910192915050565b6020808252601590820152744f6e6c79203e203730252063616e2075706461746560581b604082015260600190565b601f821115611c0557805f5260205f20601f840160051c81016020851015613fc65750805b601f840160051c820191505b8181101561084e575f8155600101613fd2565b81516001600160401b03811115613ffe57613ffe6134a0565b6140128161400c8454613eb5565b84613fa1565b602080601f831160018114614045575f841561402e5750858301515b5f19600386901b1c1916600185901b178555611ba3565b5f85815260208120601f198616915b8281101561407357888601518255948401946001909101908401614054565b508582101561409057878501515f19600388901b60f8161c191681555b5050505050600190811b01905550565b828152604060208201525f613350604083018461344a565b6020808252601690820152751119599a5b9a5d1a5bdb881a5cc81c995c5d5a5c995960521b604082015260600190565b6020808252601b908201527a15985b1a59081cd95cdcda5bdb9259081a5cc81c995c5d5a5c9959602a1b604082015260600190565b6020808252601390820152724d696e696d756d20737570706c79206973203160681b604082015260600190565b6020808252602b908201527f4e756d626572206f6620726563697069656e747320616e6420616d6f756e747360408201526a040daeae6e840dac2e8c6d60ab1b606082015260800190565b60208082526034908201527f53657373696f6e20494420616c72656164792065786973742c20706c6561736560408201527320757365206120646966666572656e74206f6e6560601b606082015260800190565b60208082526021908201527f455243313135353a206d696e7420746f20746865207a65726f206164647265736040820152607360f81b606082015260800190565b60208082526028908201527f455243313135353a2069647320616e6420616d6f756e7473206c656e677468206040820152670dad2e6dac2e8c6d60c31b606082015260800190565b60208082526025908201527f455243313135353a207472616e7366657220746f20746865207a65726f206164604082015264647265737360d81b606082015260800190565b6020808252602a908201527f455243313135353a20696e73756666696369656e742062616c616e636520666f60408201526939103a3930b739b332b960b11b606082015260800190565b604081525f614313604083018561384d565b8281036020840152614325818561384d565b95945050505050565b5f6020828403121561433e575f80fd5b5051919050565b60208082526023908201527f455243313135353a206275726e2066726f6d20746865207a65726f206164647260408201526265737360e81b606082015260800190565b60208082526030908201527f455243313135353a206f70657261746f722063616e206f6e6c79206275726e2060408201526f6f776e20746f6b656e20737570706c7960801b606082015260800190565b60208082526024908201527f455243313135353a206275726e20616d6f756e7420657863656564732062616c604082015263616e636560e01b606082015260800190565b60208082526023908201527f455243313135353a206275726e20616d6f756e74206578636565647320737570604082015262706c7960e81b606082015260800190565b6020808252602b908201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960408201526a6e697469616c697a696e6760a81b606082015260800190565b80820281158282048414176105f8576105f8613d80565b5f816144cf576144cf613d80565b505f190190565b634e487b7160e01b5f52601260045260245ffd5b6001600160a01b03868116825285166020820152604081018490526060810183905260a0608082018190525f906145239083018461344a565b979650505050505050565b5f6020828403121561453e575f80fd5b815161070b816133e1565b5f60033d1115610bd75760045f803e505f5160e01c90565b5f60443d101561456e5790565b6040516003193d81016004833e81513d6001600160401b03808311602484018310171561459d57505050505090565b82850191508151818111156145b55750505050505090565b843d87010160208285010111156145cf5750505050505090565b6145de602082860101876134b4565b509095945050505050565b60208082526033908201527f455243313135353a204552433131353552656365697665725570677261646561604082015272626c652072656a656374656420746f6b656e7360681b606082015260800190565b6001600160a01b0386811682528516602082015260a0604082018190525f906146679083018661384d565b8281036060840152614679818661384d565b9050828103608084015261468d818561344a565b9897505050505050505056fe4a39dc06d4c0dbc64b70af90fd698a233a518aa5d07e595d983b8c0526c8f7fba931009702e5c9178e55b3ba8179910e320f57ebc99d25da686ceeca819dd1adc3d58168c5ae7397731d063d5bbf3d657854427343f4c083240f7aacaa2d0f62c309dd0214e20b4ac09f4e6fbf0bea77bc3c29dd5de5f151356fee38818f1de3526b6140088b86dac1c566c0ebf11be98a0e2e497db676b624c6c4e0836ff7e0dc07c69254c2987eeca5c449653b00bab034cb3277b3f9bd9a96a9e667bfacad4f2c77207bd96f127d8828e58585416f7035f8e7773b3407a511605e506e0314b53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d6103cf2d78cb9587d5b497e3dc0bfe7080a6347891e05f592c02873a63e91ea5e29946756e6374696f6e206d7573742062652063616c6c6564207468726f75676820360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc30dcc2f89abd6ea125b7e46c7d3e5b01c5261885095c2306141ab05c1c030e2f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb3847402498416464726573733a206c6f772d6c6576656c2064656c65676174652063616c6c206661696c6564a26469706673582212206d5361b524ddcd98313581827d5304c3d6f4ad874adecfaf20812212f8a7239664736f6c63430008170033
Deployed Bytecode Sourcemap
99705:23510:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;107189:230;;;;;;;;;;-1:-1:-1;107189:230:0;;;;;:::i;:::-;;:::i;:::-;;;597:25:1;;;585:2;570:18;107189:230:0;;;;;;;;102202:354;;;;;;;;;;-1:-1:-1;102202:354:0;;;;;:::i;:::-;;:::i;:::-;;;1184:14:1;;1177:22;1159:41;;1147:2;1132:18;102202:354:0;1019:187:1;103081:272:0;;;;;;;;;;-1:-1:-1;103081:272:0;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;102731:133::-;;;;;;;;;;-1:-1:-1;102731:133:0;;;;;:::i;:::-;;:::i;:::-;;103478:914;;;;;;;;;;-1:-1:-1;103478:914:0;;;;;:::i;:::-;;:::i;109168:452::-;;;;;;;;;;-1:-1:-1;109168:452:0;;;;;:::i;:::-;;:::i;94912:198::-;;;;;;;;;;-1:-1:-1;94912:198:0;;;;;:::i;:::-;;:::i;97909:115::-;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;102647:76::-;;;;;;;;;;;;;:::i;98098:220::-;;;;;;;;;;-1:-1:-1;98098:220:0;;;;;:::i;:::-;;:::i;107585:518::-;;;;;;;;;;-1:-1:-1;107585:518:0;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;95441:223::-;;;;;;:::i;:::-;;:::i;94518:133::-;;;;;;;;;;;;;:::i;97308:102::-;;;;;;;;;;;;;:::i;23719:86::-;;;;;;;;;;-1:-1:-1;23790:7:0;;;;23719:86;;100294:975;;;;;;;;;;;;;:::i;101811:45::-;;;;;;;;;;-1:-1:-1;101811:45:0;;;;;:::i;:::-;;:::i;:::-;;;;;;;;;;;:::i;105819:233::-;;;;;;;;;;-1:-1:-1;105819:233:0;;;;;:::i;:::-;;:::i;20521:103::-;;;;;;;;;;;;;:::i;100016:270::-;;;;;;;;;;;;;:::i;102564:75::-;;;;;;;;;;;;;:::i;19880:87::-;;;;;;;;;;;;;:::i;102872:101::-;;;;;;;;;;-1:-1:-1;102948:17:0;;-1:-1:-1;;;;;102948:17:0;102872:101;;106133:905;;;;;;;;;;-1:-1:-1;106133:905:0;;;;;:::i;:::-;;:::i;108176:169::-;;;;;;;;;;-1:-1:-1;108176:169:0;;;;;:::i;:::-;;:::i;104472:1130::-;;;;;;;;;;-1:-1:-1;104472:1130:0;;;;;:::i;:::-;;:::i;109672:354::-;;;;;;;;;;-1:-1:-1;109672:354:0;;;;;:::i;:::-;;:::i;110078:324::-;;;;;;;;;;-1:-1:-1;110078:324:0;;;;;:::i;:::-;;:::i;110454:307::-;;;;;;;;;;-1:-1:-1;110454:307:0;;;;;:::i;:::-;;:::i;108417:182::-;;;;;;;;;;-1:-1:-1;108417:182:0;;;;;:::i;:::-;;:::i;108671:420::-;;;;;;;;;;-1:-1:-1;108671:420:0;;;;;:::i;:::-;;:::i;20779:201::-;;;;;;;;;;-1:-1:-1;20779:201:0;;;;;:::i;:::-;;:::i;105610:::-;;;;;;;;;;-1:-1:-1;105610:201:0;;;;;:::i;:::-;;:::i;107189:230::-;107275:7;-1:-1:-1;;;;;107303:21:0;;107295:76;;;;-1:-1:-1;;;107295:76:0;;16159:2:1;107295:76:0;;;16141:21:1;16198:2;16178:18;;;16171:30;16237:34;16217:18;;;16210:62;-1:-1:-1;;;16288:18:1;;;16281:40;16338:19;;107295:76:0;;;;;;;;;-1:-1:-1;107389:13:0;;;;:9;:13;;;;;;;;-1:-1:-1;;;;;107389:22:0;;;;;;;;;;107189:230;;;;;:::o;102202:354::-;102326:4;-1:-1:-1;;;;;;102363:52:0;;-1:-1:-1;;;102363:52:0;;:132;;-1:-1:-1;;;;;;;102432:63:0;;-1:-1:-1;;;102432:63:0;102363:132;:185;;;-1:-1:-1;;;;;;;;;;35208:51:0;;;102512:36;35099:168;103081:272;103162:17;103182:13;;;:9;:13;;;;;:23;;;103136:13;;103162:17;-1:-1:-1;;;;;103182:23:0;:37;:109;;103268:13;;;;:9;:13;;;;;:23;;;-1:-1:-1;;;;;103268:23:0;103182:109;;;103235:17;;-1:-1:-1;;;;;103235:17:0;103182:109;103309:36;;-1:-1:-1;;;103309:36:0;;;;;597:25:1;;;103162:129:0;;-1:-1:-1;;;;;;103309:32:0;;;;;570:18:1;;103309:36:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;103309:36:0;;;;;;;;;;;;:::i;:::-;103302:43;103081:272;-1:-1:-1;;;103081:272:0:o;102731:133::-;19766:13;:11;:13::i;:::-;102817:17:::1;:39:::0;;-1:-1:-1;;;;;;102817:39:0::1;-1:-1:-1::0;;;;;102817:39:0;;;::::1;::::0;;;::::1;::::0;;102731:133::o;103478:914::-;103774:7;23324:19;:17;:19::i;:::-;103794:14:::1;103828:9:::0;103823:205:::1;103847:7;:14;103843:1;:18;103823:205;;;103883:14;103900:7;103908:1;103900:10;;;;;;;;:::i;:::-;;;;;;;103883:27;;103942:1;103933:6;:10;103925:60;;;;-1:-1:-1::0;;;103925:60:0::1;;;;;;;:::i;:::-;104000:16;104010:6:::0;104000:16;::::1;:::i;:::-;::::0;-1:-1:-1;;103863:3:0::1;;103823:205;;;;104038:24;;:::i;:::-;104073::::0;;;104108:27:::1;::::0;;::::1;:48:::0;;;104167:19:::1;::::0;;::::1;:32:::0;;;104210:22:::1;::::0;::::1;:38:::0;;;-1:-1:-1;;;;;104259:30:0;::::1;:18;::::0;::::1;:30:::0;104313:51;;;;::::1;::::0;;104073:15:::1;104313:51:::0;;;104073:15;104313:51:::1;::::0;104319:10;;104331:9;;104342:7;;104073:8;;104313:5:::1;:51::i;:::-;104300:64:::0;103478:914;-1:-1:-1;;;;;;;;;;;103478:914:0:o;109168:452::-;23324:19;:17;:19::i;:::-;-1:-1:-1;;;;;109415:20:0;::::1;17699:10:::0;109415:20:::1;::::0;:60:::1;;-1:-1:-1::0;109439:36:0::1;109456:4:::0;17699:10;108417:182;:::i;109439:36::-:1;109393:156;;;;-1:-1:-1::0;;;109393:156:0::1;;;;;;;:::i;:::-;109560:52;109583:4;109589:2;109593:3;109598:7;109607:4;109560:22;:52::i;:::-;109168:452:::0;;;;;:::o;94912:198::-;-1:-1:-1;;;;;93228:6:0;93211:23;93219:4;93211:23;93203:80;;;;-1:-1:-1;;;93203:80:0;;;;;;;:::i;:::-;93326:6;-1:-1:-1;;;;;93302:30:0;:20;:18;:20::i;:::-;-1:-1:-1;;;;;93302:30:0;;93294:87;;;;-1:-1:-1;;;93294:87:0;;;;;;;:::i;:::-;94994:36:::1;95012:17;94994;:36::i;:::-;95082:12;::::0;;95092:1:::1;95082:12:::0;;;::::1;::::0;::::1;::::0;;;95041:61:::1;::::0;95063:17;;95082:12;95041:21:::1;:61::i;:::-;94912:198:::0;:::o;97909:115::-;97952:7;97979:37;:35;:37::i;:::-;97972:44;;97909:115;:::o;102647:76::-;19766:13;:11;:13::i;:::-;23583:16:::1;:14;:16::i;:::-;102705:10:::2;:8;:10::i;:::-;102647:76::o:0;98098:220::-;97545:18;:16;:18::i;:::-;98256:54:::1;98295:14;98256:38;:54::i;107585:518::-:0;107741:16;107802:3;:10;107783:8;:15;:29;107775:83;;;;-1:-1:-1;;;107775:83:0;;19320:2:1;107775:83:0;;;19302:21:1;19359:2;19339:18;;;19332:30;19398:34;19378:18;;;19371:62;-1:-1:-1;;;19449:18:1;;;19442:39;19498:19;;107775:83:0;19118:405:1;107775:83:0;107869:30;107916:8;:15;-1:-1:-1;;;;;107902:30:0;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;107902:30:0;;107869:63;;107948:9;107943:122;107967:8;:15;107963:1;:19;107943:122;;;108023:30;108033:8;108042:1;108033:11;;;;;;;;:::i;:::-;;;;;;;108046:3;108050:1;108046:6;;;;;;;;:::i;:::-;;;;;;;108023:9;:30::i;:::-;108004:13;108018:1;108004:16;;;;;;;;:::i;:::-;;;;;;;;;;:49;107984:3;;107943:122;;;-1:-1:-1;108082:13:0;107585:518;-1:-1:-1;;;107585:518:0:o;95441:223::-;-1:-1:-1;;;;;93228:6:0;93211:23;93219:4;93211:23;93203:80;;;;-1:-1:-1;;;93203:80:0;;;;;;;:::i;:::-;93326:6;-1:-1:-1;;;;;93302:30:0;:20;:18;:20::i;:::-;-1:-1:-1;;;;;93302:30:0;;93294:87;;;;-1:-1:-1;;;93294:87:0;;;;;;;:::i;:::-;95557:36:::1;95575:17;95557;:36::i;:::-;95604:52;95626:17;95645:4;95651;95604:21;:52::i;:::-;95441:223:::0;;:::o;94518:133::-;94596:7;93664:4;-1:-1:-1;;;;;93673:6:0;93656:23;;93648:92;;;;-1:-1:-1;;;93648:92:0;;19730:2:1;93648:92:0;;;19712:21:1;19769:2;19749:18;;;19742:30;19808:34;19788:18;;;19781:62;-1:-1:-1;;;19859:18:1;;;19852:54;19923:19;;93648:92:0;19528:420:1;93648:92:0;-1:-1:-1;;;;;;;;;;;;93751:1:0::1;94518:133:::0;:::o;97308:102::-;97355:7;97382:20;:18;:20::i;100294:975::-;14807:13;;100339:1;;14807:13;;;;;14806:14;:40;;;;-1:-1:-1;14824:12:0;;:22;;;;:12;;:22;14806:40;14798:99;;;;-1:-1:-1;;;14798:99:0;;;;;;;:::i;:::-;14908:12;:22;;-1:-1:-1;;14941:20:0;14908:22;;;14941:20;14908:22;14941:20;;;100387:19:::1;100377:30:::0;;:9:::1;:30;::::0;-1:-1:-1;;;;;;;;;;;100377:37:0;:41;100373:115:::1;;100445:19;100475:1;100435:30:::0;;;:9:::1;:30;::::0;-1:-1:-1;;;;;;;;;;;100435:41:0;100373:115:::1;100512:18;100541:1;100502:29:::0;:9:::1;:29;::::0;-1:-1:-1;;;;;;;;;;;100502:36:0;:40;100498:113:::1;;100569:18;100598:1;100559:29:::0;;;:9:::1;:29;::::0;-1:-1:-1;;;;;;;;;;;100559:40:0;100498:113:::1;100655:19;100685:1;100645:30:::0;:9:::1;:30;::::0;-1:-1:-1;;;;;;;;;;;100645:37:0;:41;100641:115:::1;;100713:19;100743:1;100703:30:::0;;;:9:::1;:30;::::0;-1:-1:-1;;;;;;;;;;;100703:41:0;100641:115:::1;100780:19;100810:1;100770:30:::0;:9:::1;:30;::::0;-1:-1:-1;;;;;;;;;;;100770:37:0;:41;100766:115:::1;;100838:19;100868:1;100828:30:::0;;;:9:::1;:30;::::0;-1:-1:-1;;;;;;;;;;;100828:41:0;100766:115:::1;100905:20;100936:1;100895:31:::0;:9:::1;:31;::::0;-1:-1:-1;;;;;;;;;;;100895:38:0;:42;100891:117:::1;;100964:20;100995:1;100954:31:::0;;;:9:::1;:31;::::0;-1:-1:-1;;;;;;;;;;;100954:42:0;100891:117:::1;101032:20;101063:1;101022:31:::0;:9:::1;:31;::::0;-1:-1:-1;;;;;;;;;;;101022:38:0;:42;101018:117:::1;;101091:20;101122:1;101081:31:::0;;;:9:::1;:31;::::0;-1:-1:-1;;;;;;;;;;;101081:42:0;101018:117:::1;101159:20;101190:1;101149:31:::0;:9:::1;:31;::::0;-1:-1:-1;;;;;;;;;;;101149:38:0;:42;101145:117:::1;;101218:20;101249:1;101208:31:::0;;;:9:::1;:31;::::0;-1:-1:-1;;;;;;;;;;;101208:42:0;101145:117:::1;15000:5:::0;14984:21;;-1:-1:-1;;14984:21:0;;;15021:20;;20540:4:1;20528:17;;20510:36;;-1:-1:-1;;;;;;;;;;;15021:20:0;20498:2:1;20483:18;15021:20:0;;;;;;;;100294:975;:::o;101811:45::-;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;101811:45:0;;;;;;;-1:-1:-1;;;;;;;101811:45:0;;:::o;105819:233::-;105964:12;23324:19;:17;:19::i;:::-;105989:30:::1;106000:4;106006:3;106011:7;105989:10;:30::i;:::-;-1:-1:-1::0;106040:4:0::1;::::0;105819:233;-1:-1:-1;;;105819:233:0:o;20521:103::-;19766:13;:11;:13::i;:::-;20586:30:::1;20613:1;20586:18;:30::i;100016:270::-:0;13169:19;13192:13;;;;;;13191:14;;13239:34;;;;-1:-1:-1;13257:12:0;;13272:1;13257:12;;;;:16;13239:34;13238:108;;;;13280:44;13318:4;13280:29;:44::i;:::-;13279:45;:66;;;;-1:-1:-1;13328:12:0;;;;;:17;13279:66;13216:204;;;;-1:-1:-1;;;13216:204:0;;;;;;;:::i;:::-;13431:12;:16;;-1:-1:-1;;13431:16:0;13446:1;13431:16;;;13458:67;;;;13493:13;:20;;-1:-1:-1;;13493:20:0;;;;;13458:67;100068:15:::1;:13;:15::i;:::-;100192:31;:29;:31::i;:::-;100234:16;:14;:16::i;:::-;100261:17;:15;:17::i;:::-;13551:14:::0;13547:102;;;13598:5;13582:21;;-1:-1:-1;;13582:21:0;;;13623:14;;-1:-1:-1;20510:36:1;;-1:-1:-1;;;;;;;;;;;13623:14:0;20498:2:1;20483:18;13623:14:0;20368:184:1;102564:75:0;19766:13;:11;:13::i;:::-;23324:19:::1;:17;:19::i;:::-;102623:8:::2;:6;:8::i;19880:87::-:0;19953:6;;-1:-1:-1;;;;;19953:6:0;;19880:87::o;106133:905::-;106258:7;23324:19;:17;:19::i;:::-;106500:28:::1;106531:59;106575:8;-1:-1:-1::0;;;;;106562:23:0::1;106587:2;106531:30;:59::i;:::-;106500:90;;106601:22;106654:42;106682:13;106654:27;:42::i;:::-;106711:45;106750:4;106711:30;:45::i;:::-;106771:14;106800:38;106828:9;106800:27;:38::i;:::-;106853:18;106626:256;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;106601:281;;106893:13;106944:8;106927:26;;;;;;;;:::i;:::-;;::::0;;;;::::1;-1:-1:-1::0;;106927:26:0;;;;;;106917:37;;106927:26:::1;106917:37:::0;;::::1;::::0;-1:-1:-1;;;;;107014:16:0::1;::::0;106133:905;-1:-1:-1;;;;;;;106133:905:0:o;108176:169::-;23324:19;:17;:19::i;:::-;108285:52:::1;17699:10:::0;108318:8:::1;108328;108285:18;:52::i;104472:1130::-:0;104802:20;23324:19;:17;:19::i;:::-;104835:14:::1;104869:9:::0;104864:205:::1;104888:7;:14;104884:1;:18;104864:205;;;104924:14;104941:7;104949:1;104941:10;;;;;;;;:::i;:::-;;;;;;;104924:27;;104983:1;104974:6;:10;104966:60;;;;-1:-1:-1::0;;;104966:60:0::1;;;;;;;:::i;:::-;105041:16;105051:6:::0;105041:16;::::1;:::i;:::-;::::0;-1:-1:-1;;104904:3:0::1;;104864:205;;;-1:-1:-1::0;105094:17:0;;105079:12:::1;105094:17:::0;-1:-1:-1;;;;;105153:20:0;::::1;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;105122:51;;105189:9;105184:335;105208:4;105204:1;:8;105184:335;;;105257:6;105234:10;105245:1;105234:13;;;;;;;;:::i;:::-;;;;;;;:20;;:29;;;::::0;::::1;105313:19;105333:1;105313:22;;;;;;;;:::i;:::-;;;;;;;105278:10;105289:1;105278:13;;;;;;;;:::i;:::-;;;;;;;:32;;:57;;;;105377:11;105389:1;105377:14;;;;;;;;:::i;:::-;;;;;;;105350:10;105361:1;105350:13;;;;;;;;:::i;:::-;;;;;;;:24;;:41;;;;105436:14;105451:1;105436:17;;;;;;;;:::i;:::-;;;;;;;105406:10;105417:1;105406:13;;;;;;;;:::i;:::-;;;;;;;:27;;:47;;;;105494:10;105505:1;105494:13;;;;;;;;:::i;:::-;;;;;;;105468:10;105479:1;105468:13;;;;;;;;:::i;:::-;;::::0;;::::1;::::0;;;;;;-1:-1:-1;;;;;105468:39:0;;::::1;:23;::::0;;::::1;:39:::0;105214:3:::1;;105184:335;;;;105535:59;105546:10;105558;105570:7;105579:10;105535:59;;;;;;;;;;;::::0;:10:::1;:59::i;109672:354::-:0;109782:4;23324:19;:17;:19::i;:::-;109807:35:::1;17699:10:::0;109821:12:::1;109835:2;109839;109807:13;:35::i;:::-;109799:69;;;;-1:-1:-1::0;;;109799:69:0::1;;;;;;;:::i;:::-;109879:13;::::0;;;:9:::1;:13;::::0;;;;:32:::1;;:53;109914:18:::0;109879:32;:53:::1;:::i;:::-;;109948:48;109973:2;109977:18;109948:48;;;;;;;:::i;:::-;;;;;;;;-1:-1:-1::0;110014:4:0::1;109672:354:::0;;;;:::o;110078:324::-;110178:4;23324:19;:17;:19::i;:::-;110203:35:::1;17699:10:::0;110231:2:::1;110235;110203:13;:35::i;:::-;110195:69;;;::::0;-1:-1:-1;;;110195:69:0;;25575:2:1;110195:69:0::1;::::0;::::1;25557:21:1::0;25614:2;25594:18;;;25587:30;-1:-1:-1;;;25633:18:1;;;25626:51;25694:18;;110195:69:0::1;25373:345:1::0;110195:69:0::1;110275:13;::::0;;;:9:::1;:13;::::0;;;;:27:::1;;:43;110305:13:::0;110275:27;:43:::1;:::i;:::-;;110334:38;110354:2;110358:13;110334:38;;;;;;;:::i;110454:307::-:0;110540:4;23324:19;:17;:19::i;:::-;110565:35:::1;17699:10:::0;110579:12:::1;17619:98:::0;110565:35:::1;110557:69;;;;-1:-1:-1::0;;;110557:69:0::1;;;;;;;:::i;:::-;110637:13;::::0;;;:9:::1;:13;::::0;;;;;;:23:::1;;:35:::0;;-1:-1:-1;;;;;110637:35:0;::::1;-1:-1:-1::0;;;;;;110637:35:0;;::::1;;::::0;;110688:43;::::1;::::0;::::1;::::0;110647:2;;110663:9;;25963:25:1;;;26024:2;26019;26004:18;;25997:30;;;26063:1;26043:18;;;26036:29;-1:-1:-1;;;26096:3:1;26081:19;;26074:40;-1:-1:-1;;;;;26186:32:1;26181:2;26166:18;;26159:60;26146:3;26131:19;;25723:502;108417:182:0;108530:4;23324:19;:17;:19::i;:::-;-1:-1:-1;;;;;;108554:27:0;;::::1;;::::0;;;:18:::1;:27;::::0;;;;;;;:37;;;::::1;::::0;;;;;;;;::::1;;::::0;108417:182::o;108671:420::-;23324:19;:17;:19::i;:::-;-1:-1:-1;;;;;108893:20:0;::::1;17699:10:::0;108893:20:::1;::::0;:60:::1;;-1:-1:-1::0;108917:36:0::1;108934:4:::0;17699:10;108417:182;:::i;108917:36::-:1;108871:156;;;;-1:-1:-1::0;;;108871:156:0::1;;;;;;;:::i;:::-;109038:45;109056:4;109062:2;109066;109070:6;109078:4;109038:17;:45::i;20779:201::-:0;19766:13;:11;:13::i;:::-;-1:-1:-1;;;;;20868:22:0;::::1;20860:73;;;::::0;-1:-1:-1;;;20860:73:0;;26432:2:1;20860:73:0::1;::::0;::::1;26414:21:1::0;26471:2;26451:18;;;26444:30;26510:34;26490:18;;;26483:62;-1:-1:-1;;;26561:18:1;;;26554:36;26607:19;;20860:73:0::1;26230:402:1::0;20860:73:0::1;20944:28;20963:8;20944:18;:28::i;105610:201::-:0;105730:12;23324:19;:17;:19::i;:::-;105755:23:::1;105761:4;105767:2;105771:6;105755:5;:23::i;20045:132::-:0;17699:10;20109:7;:5;:7::i;:::-;-1:-1:-1;;;;;20109:23:0;;20101:68;;;;-1:-1:-1;;;20101:68:0;;26839:2:1;20101:68:0;;;26821:21:1;;;26858:18;;;26851:30;26917:34;26897:18;;;26890:62;26969:18;;20101:68:0;26637:356:1;23878:108:0;23790:7;;;;23948:9;23940:38;;;;-1:-1:-1;;;23940:38:0;;27200:2:1;23940:38:0;;;27182:21:1;27239:2;27219:18;;;27212:30;-1:-1:-1;;;27258:18:1;;;27251:46;27314:18;;23940:38:0;26998:340:1;114233:1512:0;114455:7;23324:19;:17;:19::i;:::-;114519:1:::1;114489:8;:19;;;114483:33;:37;114475:72;;;;-1:-1:-1::0;;;114475:72:0::1;;;;;;;:::i;:::-;114578:1;114566:9;:13;114558:53;;;;-1:-1:-1::0;;;114558:53:0::1;;;;;;;:::i;:::-;114630:15:::0;;114622:51:::1;;;;-1:-1:-1::0;;;114622:51:0::1;;;;;;;:::i;:::-;114713:7;:14;114692:10;:17;:35;114684:91;;;;-1:-1:-1::0;;;114684:91:0::1;;;;;;;:::i;:::-;114875:18;::::0;::::1;::::0;-1:-1:-1;;;;;114875:32:0::1;114871:149;;114991:17;::::0;-1:-1:-1;;;;;114991:17:0::1;114970:18;::::0;::::1;:38:::0;114871:149:::1;115030:10;115043:64;17699:10:::0;115068:9:::1;115079:8;:27;;;115043:10;:64::i;:::-;115126:13;::::0;;;:9:::1;:13;::::0;;;;:20;115030:77;;-1:-1:-1;115126:25:0;115118:90:::1;;;;-1:-1:-1::0;;;115118:90:0::1;;;;;;;:::i;:::-;115224:9;115219:431;115243:10;:17;115239:1;:21;115219:431;;;115282:10;115295;115306:1;115295:13;;;;;;;;:::i;:::-;;;;;;;115282:26;;115345:1;-1:-1:-1::0;;;;;115331:16:0::1;:2;-1:-1:-1::0;;;;;115331:16:0::1;::::0;115323:62:::1;;;;-1:-1:-1::0;;;115323:62:0::1;;;;;;;:::i;:::-;115400:14;115417:7;115425:1;115417:10;;;;;;;;:::i;:::-;;::::0;;::::1;::::0;;;;;;;115442:13:::1;::::0;;;:9:::1;:13:::0;;;;;;-1:-1:-1;;;;;115442:17:0;::::1;::::0;;;;;;;;:27;;115417:10;;-1:-1:-1;115417:10:0;;115442:17;;:27:::1;::::0;115417:10;;115442:27:::1;:::i;:::-;::::0;;;-1:-1:-1;115484:78:0::1;::::0;-1:-1:-1;17699:10:0;115537:1:::1;115541:2;115545;115549:6;115557:4;115484:30;:78::i;:::-;115582:56;::::0;;29807:25:1;;;29863:2;29848:18;;29841:34;;;-1:-1:-1;;;;;115582:56:0;::::1;::::0;115619:1:::1;::::0;17699:10;;-1:-1:-1;;;;;;;;;;;115582:56:0;29780:18:1;115582:56:0::1;;;;;;;-1:-1:-1::0;;115262:3:0::1;;115219:431;;;-1:-1:-1::0;115693:13:0::1;::::0;;;:9:::1;:13;::::0;;;;;;;:24;;;;;;::::1;::::0;115709:8;;115693:13;:24:::1;::::0;::::1;::::0;::::1;::::0;;::::1;:::i;:::-;-1:-1:-1::0;115693:24:0::1;::::0;::::1;::::0;::::1;::::0;::::1;::::0;::::1;::::0;;::::1;:::i;:::-;-1:-1:-1::0;115693:24:0::1;::::0;::::1;::::0;::::1;::::0;::::1;::::0;::::1;::::0;;::::1;:::i;:::-;-1:-1:-1::0;115693:24:0::1;::::0;;;::::1;::::0;::::1;::::0;;::::1;::::0;;-1:-1:-1;;;;;;115693:24:0::1;-1:-1:-1::0;;;;;115693:24:0;;::::1;::::0;;;::::1;::::0;;115735:2;114233:1512;-1:-1:-1;;;;;;114233:1512:0:o;112803:1005::-;23324:19;:17;:19::i;:::-;113044:7:::1;:14;113030:3;:10;:28;113022:81;;;;-1:-1:-1::0;;;113022:81:0::1;;;;;;;:::i;:::-;-1:-1:-1::0;;;;;113122:16:0;::::1;113114:66;;;;-1:-1:-1::0;;;113114:66:0::1;;;;;;;:::i;:::-;17699:10:::0;113191:16:::1;113233:419;113257:3;:10;113253:1;:14;113233:419;;;113289:10;113302:3;113306:1;113302:6;;;;;;;;:::i;:::-;;;;;;;113289:19;;113323:14;113340:7;113348:1;113340:10;;;;;;;;:::i;:::-;;::::0;;::::1;::::0;;;;;;;113365:19:::1;113387:13:::0;;;:9:::1;:13:::0;;;;;;-1:-1:-1;;;;;113387:19:0;::::1;::::0;;;;;;;;;;113340:10;;-1:-1:-1;113429:21:0;;::::1;;113421:76;;;;-1:-1:-1::0;;;113421:76:0::1;;;;;;;:::i;:::-;113541:13;::::0;;;:9:::1;:13;::::0;;;;;;;-1:-1:-1;;;;;113541:19:0;;::::1;::::0;;;;;;;113563:20;;::::1;113541:42:::0;;113613:17;;::::1;::::0;;;;:27;;113563:20;;113541:13;113613:27:::1;::::0;113563:20;;113613:27:::1;:::i;:::-;::::0;;;-1:-1:-1;;113269:3:0::1;::::0;;::::1;::::0;-1:-1:-1;113233:419:0::1;::::0;-1:-1:-1;;113233:419:0::1;;;113697:2;-1:-1:-1::0;;;;;113667:47:0::1;113691:4;-1:-1:-1::0;;;;;113667:47:0::1;113681:8;-1:-1:-1::0;;;;;113667:47:0::1;-1:-1:-1::0;;;;;;;;;;;113701:3:0::1;113706:7;113667:47;;;;;;;:::i;:::-;;;;;;;;113725:75;113761:8;113771:4;113777:2;113781:3;113786:7;113795:4;113725:35;:75::i;:::-;113011:797;112803:1005:::0;;;;;:::o;85784:153::-;85837:7;-1:-1:-1;;;;;;;;;;;85864:59:0;:65;-1:-1:-1;;;;;85864:65:0;;85784:153;-1:-1:-1;85784:153:0:o;97204:96::-;97274:18;:16;:18::i;87186:958::-;85128:66;87606:59;;;87602:535;;;87682:37;87701:17;87682:18;:37::i;:::-;87186:958;;;:::o;87602:535::-;87785:17;-1:-1:-1;;;;;87756:61:0;;:63;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;87756:63:0;;;;;;;;-1:-1:-1;;87756:63:0;;;;;;;;;;;;:::i;:::-;;;87752:306;;87986:56;;-1:-1:-1;;;87986:56:0;;31973:2:1;87986:56:0;;;31955:21:1;32012:2;31992:18;;;31985:30;32051:34;32031:18;;;32024:62;-1:-1:-1;;;32102:18:1;;;32095:44;32156:19;;87986:56:0;31771:410:1;87752:306:0;-1:-1:-1;;;;;;;;;;;87870:28:0;;87862:82;;;;-1:-1:-1;;;87862:82:0;;32388:2:1;87862:82:0;;;32370:21:1;32427:2;32407:18;;;32400:30;32466:34;32446:18;;;32439:62;-1:-1:-1;;;32517:18:1;;;32510:39;32566:19;;87862:82:0;32186:405:1;87862:82:0;87820:140;88072:53;88090:17;88109:4;88115:9;88072:17;:53::i;88524:135::-;88568:7;-1:-1:-1;;;;;;;;;;;88595:50:0;81652:195;24063:108;23790:7;;;;24122:41;;;;-1:-1:-1;;;24122:41:0;;32798:2:1;24122:41:0;;;32780:21:1;32837:2;32817:18;;;32810:30;-1:-1:-1;;;32856:18:1;;;32849:50;32916:18;;24122:41:0;32596:344:1;24574:120:0;23583:16;:14;:16::i;:::-;24633:7:::1;:15:::0;;-1:-1:-1;;24633:15:0::1;::::0;;24664:22:::1;17699:10:::0;24673:12:::1;24664:22;;;;;;:::i;:::-;;;;;;;;24574:120::o:0;97667:162::-;17699:10;97736:11;:9;:11::i;:::-;-1:-1:-1;;;;;97736:27:0;;97728:93;;;;-1:-1:-1;;;97728:93:0;;33147:2:1;97728:93:0;;;33129:21:1;33186:2;33166:18;;;33159:30;33225:34;33205:18;;;33198:62;-1:-1:-1;;;33276:18:1;;;33269:51;33337:19;;97728:93:0;32945:417:1;89079:138:0;89144:35;89157:11;:9;:11::i;:::-;89144:35;;;-1:-1:-1;;;;;33597:15:1;;;33579:34;;33649:15;;;33644:2;33629:18;;33622:43;33514:18;89144:35:0;;;;;;;89190:19;89200:8;89190:9;:19::i;119885:1150::-;-1:-1:-1;;;;;120003:18:0;;119995:66;;;;-1:-1:-1;;;119995:66:0;;;;;;;:::i;:::-;120094:7;:14;120080:3;:10;:28;120072:81;;;;-1:-1:-1;;;120072:81:0;;;;;;;:::i;:::-;17699:10;-1:-1:-1;;;;;120214:16:0;;;;120206:77;;;;-1:-1:-1;;;120206:77:0;;;;;;;:::i;:::-;120299:9;120294:571;120318:3;:10;120314:1;:14;120294:571;;;120350:10;120363:3;120367:1;120363:6;;;;;;;;:::i;:::-;;;;;;;120350:19;;120384:14;120401:7;120409:1;120401:10;;;;;;;;:::i;:::-;;;;;;;;;;;;120426:19;120448:13;;;:9;:13;;;;;;-1:-1:-1;;;;;120448:19:0;;;;;;;;;;120503:13;;;:9;:13;;;;;:20;120401:10;;-1:-1:-1;120546:21:0;;;;120538:70;;;;-1:-1:-1;;;120538:70:0;;;;;;;:::i;:::-;120645:6;120631:10;:20;;120623:68;;;;-1:-1:-1;;;120623:68:0;;;;;;;:::i;:::-;120735:13;;;;:9;:13;;;;;;;;-1:-1:-1;;;;;120735:19:0;;;;;;;;;120757:20;;;;120735:42;;;120796:13;;;:9;:13;;;;;120819:19;;120796:42;;120330:3;;120294:571;;;;120918:1;-1:-1:-1;;;;;120880:55:0;120904:4;-1:-1:-1;;;;;120880:55:0;120894:8;-1:-1:-1;;;;;120880:55:0;-1:-1:-1;;;;;;;;;;;120922:3:0;120927:7;120880:55;;;;;;;:::i;:::-;;;;;;;;120946:81;120982:8;120992:4;121006:1;121010:3;121015:7;120946:81;;;;;;;;;;;;:35;:81::i;:::-;119984:1051;119885:1150;;;:::o;21140:191::-;21233:6;;;-1:-1:-1;;;;;21250:17:0;;;-1:-1:-1;;;;;;21250:17:0;;;;;;;21283:40;;21233:6;;;21250:17;21233:6;;21283:40;;21214:16;;21283:40;21203:128;21140:191;:::o;1553:326::-;-1:-1:-1;;;;;1848:19:0;;:23;;;1553:326::o;34893:59::-;15312:13;;;;;;;15304:69;;;;-1:-1:-1;;;15304:69:0;;;;;;;:::i;96894:137::-;15312:13;;;;;;;15304:69;;;;-1:-1:-1;;;15304:69:0;;;;;;;:::i;:::-;96972:16:::1;:14;:16::i;:::-;96999:24;:22;:24::i;19423:97::-:0;15312:13;;;;;;;15304:69;;;;-1:-1:-1;;;15304:69:0;;;;;;;:::i;:::-;19486:26:::1;:24;:26::i;22889:99::-:0;15312:13;;;;;;;15304:69;;;;-1:-1:-1;;;15304:69:0;;;;;;;:::i;:::-;22953:27:::1;:25;:27::i;24315:118::-:0;23324:19;:17;:19::i;:::-;24375:7:::1;:14:::0;;-1:-1:-1;;24375:14:0::1;24385:4;24375:14;::::0;;24405:20:::1;24412:12;17699:10:::0;;17619:98;76365:447;76440:13;76466:19;76498:10;76502:6;76498:1;:10;:::i;:::-;:14;;76511:1;76498:14;:::i;:::-;-1:-1:-1;;;;;76488:25:0;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;76488:25:0;;76466:47;;-1:-1:-1;;;76524:6:0;76531:1;76524:9;;;;;;;;:::i;:::-;;;;:15;-1:-1:-1;;;;;76524:15:0;;;;;;;;;-1:-1:-1;;;76550:6:0;76557:1;76550:9;;;;;;;;:::i;:::-;;;;:15;-1:-1:-1;;;;;76550:15:0;;;;;;;;-1:-1:-1;76581:9:0;76593:10;76597:6;76593:1;:10;:::i;:::-;:14;;76606:1;76593:14;:::i;:::-;76581:26;;76576:131;76613:1;76609;:5;76576:131;;;-1:-1:-1;;;76657:5:0;76665:3;76657:11;76648:21;;;;;;;:::i;:::-;;;;76636:6;76643:1;76636:9;;;;;;;;:::i;:::-;;;;:33;-1:-1:-1;;;;;76636:33:0;;;;;;;;-1:-1:-1;76694:1:0;76684:11;;;;;76616:3;;;:::i;:::-;;;76576:131;;;-1:-1:-1;76725:10:0;;76717:55;;;;-1:-1:-1;;;76717:55:0;;36234:2:1;76717:55:0;;;36216:21:1;;;36253:18;;;36246:30;36312:34;36292:18;;;36285:62;36364:18;;76717:55:0;36032:356:1;74920:727:0;74976:13;75027:14;75044:28;75066:5;75044:21;:28::i;:::-;75075:1;75044:32;75027:49;;75091:20;75125:6;-1:-1:-1;;;;;75114:18:0;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;75114:18:0;-1:-1:-1;75091:41:0;-1:-1:-1;75256:28:0;;;75272:2;75256:28;75313:288;-1:-1:-1;;75345:5:0;-1:-1:-1;;;75482:2:0;75471:14;;75466:30;75345:5;75453:44;75543:2;75534:11;;;-1:-1:-1;75564:21:0;75313:288;75564:21;-1:-1:-1;75622:6:0;74920:727;-1:-1:-1;;;74920:727:0:o;76969:151::-;77027:13;77060:52;-1:-1:-1;;;;;77072:22:0;;74811:2;77060:11;:52::i;121178:345::-;23324:19;:17;:19::i;:::-;121347:8:::1;-1:-1:-1::0;;;;;121338:17:0::1;:5;-1:-1:-1::0;;;;;121338:17:0::1;::::0;121330:71:::1;;;::::0;-1:-1:-1;;;121330:71:0;;36727:2:1;121330:71:0::1;::::0;::::1;36709:21:1::0;36766:2;36746:18;;;36739:30;36805:34;36785:18;;;36778:62;-1:-1:-1;;;36856:18:1;;;36849:39;36905:19;;121330:71:0::1;36525:405:1::0;121330:71:0::1;-1:-1:-1::0;;;;;121412:25:0;;::::1;;::::0;;;:18:::1;:25;::::0;;;;;;;:35;;::::1;::::0;;;;;;;;;;:46;;-1:-1:-1;;121412:46:0::1;::::0;::::1;;::::0;;::::1;::::0;;;121474:41;;1159::1;;;121474::0::1;::::0;1132:18:1;121474:41:0::1;;;;;;;121178:345:::0;;;:::o;116148:2335::-;116392:16;23324:19;:17;:19::i;:::-;116450:7:::1;:14;116429:10;:17;:35;116421:91;;;;-1:-1:-1::0;;;116421:91:0::1;;;;;;;:::i;:::-;116552:10;:17;116531:10;:17;:38;116523:92;;;::::0;-1:-1:-1;;;116523:92:0;;37137:2:1;116523:92:0::1;::::0;::::1;37119:21:1::0;37176:2;37156:18;;;37149:30;37215:34;37195:18;;;37188:62;-1:-1:-1;;;37266:18:1;;;37259:39;37315:19;;116523:92:0::1;36935:405:1::0;116523:92:0::1;116784:20;116821:10;:17;-1:-1:-1::0;;;;;116807:32:0::1;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;-1:-1:-1;116807:32:0::1;;116784:55;;116855:9;116850:1603;116874:10;:17;116870:1;:21;116850:1603;;;116962:1;116927:10;116938:1;116927:13;;;;;;;;:::i;:::-;;;;;;;:24;;;116921:38;:42;116913:77;;;;-1:-1:-1::0;;;116913:77:0::1;;;;;;;:::i;:::-;117029:1;117013:10;117024:1;117013:13;;;;;;;;:::i;:::-;;;;;;;:17;117005:57;;;;-1:-1:-1::0;;;117005:57:0::1;;;;;;;:::i;:::-;117108:1;117085:10;117096:1;117085:13;;;;;;;;:::i;:::-;;;;;;;:20;;;:24;117077:56;;;;-1:-1:-1::0;;;117077:56:0::1;;;;;;;:::i;:::-;117148:10;117161:73;17699:10:::0;117186::::1;117197:1;117186:13;;;;;;;;:::i;:::-;;;;;;;117201:10;117212:1;117201:13;;;;;;;;:::i;:::-;;;;;;;:32;;;117161:10;:73::i;:::-;117148:86;;117254:9;117249:707;117273:10;:17;117269:1;:21;117249:707;;;117316:10;117329;117340:1;117329:13;;;;;;;;:::i;:::-;;;;;;;117316:26;;117383:1;-1:-1:-1::0;;;;;117369:16:0::1;:2;-1:-1:-1::0;;;;;117369:16:0::1;::::0;117361:62:::1;;;;-1:-1:-1::0;;;117361:62:0::1;;;;;;;:::i;:::-;117442:14;117459:7;117467:1;117459:10;;;;;;;;:::i;:::-;;::::0;;::::1;::::0;;;;;;;117488:13:::1;::::0;;;:9:::1;:13:::0;;;;;;-1:-1:-1;;;;;117488:17:0;::::1;::::0;;;;;;;;:27;;117459:10;;-1:-1:-1;117459:10:0;;117488:17;;:27:::1;::::0;117459:10;;117488:27:::1;:::i;:::-;::::0;;;-1:-1:-1;;117587:10:0;;117534:36:::1;::::0;-1:-1:-1;;;;;117573:25:0;::::1;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;-1:-1:-1;117573:25:0::1;;117534:64;;117622:9;117617:115;117641:3;:10;117637:1;:14;117617:115;;;117706:6;117681:19;117701:1;117681:22;;;;;;;;:::i;:::-;;::::0;;::::1;::::0;;;;;:31;117653:3:::1;;117617:115;;;-1:-1:-1::0;117750:97:0::1;17699:10:::0;117808:1:::1;117812:2;117816:3;117821:19;117842:4;117750:35;:97::i;:::-;-1:-1:-1::0;;;;;117871:69:0;::::1;117907:1;17699:10:::0;-1:-1:-1;;;;;117871:69:0::1;-1:-1:-1::0;;;;;;;;;;;117915:3:0::1;117920:19;117871:69;;;;;;;:::i;:::-;;;;;;;;-1:-1:-1::0;;;117292:3:0::1;;117249:707;;;-1:-1:-1::0;117978:13:0::1;::::0;;;:9:::1;:13;::::0;;;;:20;:25;117970:90:::1;;;;-1:-1:-1::0;;;117970:90:0::1;;;;;;;:::i;:::-;118203:1;-1:-1:-1::0;;;;;118168:37:0::1;:10;118179:1;118168:13;;;;;;;;:::i;:::-;;;;;;;:23;;;-1:-1:-1::0;;;;;118168:37:0::1;::::0;118164:171:::1;;118302:17;::::0;118276:13;;-1:-1:-1;;;;;118302:17:0;;::::1;::::0;118276:10;;118287:1;;118276:13;::::1;;;;;:::i;:::-;;;;;;;:23;;:43;-1:-1:-1::0;;;;;118276:43:0::1;;;-1:-1:-1::0;;;;;118276:43:0::1;;;::::0;::::1;118164:171;118358:2;118349:3;118353:1;118349:6;;;;;;;;:::i;:::-;;;;;;:11;;;::::0;::::1;118428:10;118439:1;118428:13;;;;;;;;:::i;:::-;;::::0;;::::1;::::0;;;;;;;118412::::1;::::0;;;:9:::1;:13:::0;;;;;:29;;;;;;::::1;::::0;118428:13;;118412;:29:::1;::::0;::::1;::::0;::::1;::::0;;::::1;:::i;:::-;-1:-1:-1::0;118412:29:0::1;::::0;::::1;::::0;::::1;::::0;::::1;::::0;::::1;::::0;;::::1;:::i;:::-;-1:-1:-1::0;118412:29:0::1;::::0;::::1;::::0;::::1;::::0;::::1;::::0;::::1;::::0;;::::1;:::i;:::-;-1:-1:-1::0;118412:29:0::1;::::0;;;::::1;::::0;::::1;::::0;;::::1;::::0;;-1:-1:-1;;;;;;118412:29:0::1;-1:-1:-1::0;;;;;118412:29:0;;::::1;::::0;;;::::1;::::0;;-1:-1:-1;;116893:3:0::1;116850:1603;;;-1:-1:-1::0;118472:3:0;116148:2335;-1:-1:-1;;;;;;116148:2335:0:o;110816:448::-;110912:4;110946:13;;;:9;:13;;;;;;;;-1:-1:-1;;;;;110946:21:0;;;;;;;;;;110982:11;;;110978:56;;111017:5;111010:12;;;;;110978:56;111044:14;111061:13;;;:9;:13;;;;;:20;;111096:11;;;111092:56;;111131:5;111124:12;;;;;;111092:56;111158:15;111176:43;111199:6;111207:3;111212:6;111176:22;:43::i;:::-;-1:-1:-1;;;;110816:448:0;-1:-1:-1;;;;;;110816:448:0:o;111728:717::-;23324:19;:17;:19::i;:::-;-1:-1:-1;;;;;111930:16:0;::::1;111922:66;;;;-1:-1:-1::0;;;111922:66:0::1;;;;;;;:::i;:::-;111999:16;112063:13:::0;;;:9:::1;:13;::::0;;;;;;;-1:-1:-1;;;;;112063:19:0;::::1;::::0;;;;;;;;17699:10;;112101:21;;::::1;;112093:76;;;;-1:-1:-1::0;;;112093:76:0::1;;;;;;;:::i;:::-;112205:13;::::0;;;:9:::1;:13;::::0;;;;;;;-1:-1:-1;;;;;112205:19:0;;::::1;::::0;;;;;;;112227:20;;::::1;112205:42:::0;;112269:17;;::::1;::::0;;;;:27;;112227:20;;112205:13;112269:27:::1;::::0;112227:20;;112269:27:::1;:::i;:::-;::::0;;;-1:-1:-1;;112312:46:0::1;::::0;;29807:25:1;;;29863:2;29848:18;;29841:34;;;-1:-1:-1;;;;;112312:46:0;;::::1;::::0;;;::::1;::::0;;;::::1;::::0;-1:-1:-1;;;;;;;;;;;112312:46:0;29780:18:1;112312:46:0::1;;;;;;;112369:68;112400:8;112410:4;112416:2;112420;112424:6;112432:4;112369:30;:68::i;:::-;111911:534;;111728:717:::0;;;;;:::o;118781:854::-;-1:-1:-1;;;;;118874:18:0;;118866:66;;;;-1:-1:-1;;;118866:66:0;;;;;;;:::i;:::-;17699:10;-1:-1:-1;;;;;118993:16:0;;;;118985:77;;;;-1:-1:-1;;;118985:77:0;;;;;;;:::i;:::-;119073:19;119095:13;;;:9;:13;;;;;;;;-1:-1:-1;;;;;119095:19:0;;;;;;;;;;119146:13;;;:9;:13;;;;;;:20;119185:21;;;;119177:70;;;;-1:-1:-1;;;119177:70:0;;;;;;;:::i;:::-;119280:6;119266:10;:20;;119258:68;;;;-1:-1:-1;;;119258:68:0;;;;;;;:::i;:::-;119362:13;;;;:9;:13;;;;;;;;-1:-1:-1;;;;;119362:19:0;;;;;;;;;;;;119384:20;;;119362:42;;119419:13;;;:9;:13;;;;;119442:19;;;119419:42;;119488:54;;29807:25:1;;;29848:18;;;29841:34;;;119362:19:0;;119488:54;;;;-1:-1:-1;;;;;;;;;;;119488:54:0;29780:18:1;119488:54:0;;;;;;;119553:74;119584:8;119594:4;119608:1;119612:2;119616:6;119553:74;;;;;;;;;;;;121531:802;23324:19;:17;:19::i;:::-;121760:15:::1;:2;-1:-1:-1::0;;;;;121760:13:0::1;;:15::i;:::-;121756:570;;;121796:83;::::0;-1:-1:-1;;;121796:83:0;;-1:-1:-1;;;;;121796:49:0;::::1;::::0;::::1;::::0;:83:::1;::::0;121846:8;;121856:4;;121862:2;;121866:6;;121874:4;;121796:83:::1;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;-1:-1:-1::0;121796:83:0::1;::::0;;::::1;;::::0;;::::1;-1:-1:-1::0;;121796:83:0::1;::::0;::::1;::::0;;;::::1;::::0;;::::1;::::0;::::1;:::i;:::-;;;121792:523;;;;:::i;:::-;;;::::0;::::1;;;;;:::i;:::-;;;;;;;;122177:6;122170:14;;-1:-1:-1::0;;;122170:14:0::1;;;;;;;;:::i;121792:523::-;;;122226:73;::::0;-1:-1:-1;;;122226:73:0;;39227:2:1;122226:73:0::1;::::0;::::1;39209:21:1::0;39266:2;39246:18;;;39239:30;39305:34;39285:18;;;39278:62;39376:33;39356:18;;;39349:61;39427:19;;122226:73:0::1;39025:427:1::0;121792:523:0::1;-1:-1:-1::0;;;;;;121929:66:0;::::1;-1:-1:-1::0;;;121929:66:0::1;121925:176;;122020:61;;-1:-1:-1::0;;;122020:61:0::1;;;;;;;:::i;122341:871::-:0;23324:19;:17;:19::i;:::-;122595:15:::1;:2;-1:-1:-1::0;;;;;122595:13:0::1;;:15::i;:::-;122591:614;;;122631:90;::::0;-1:-1:-1;;;122631:90:0;;-1:-1:-1;;;;;122631:54:0;::::1;::::0;::::1;::::0;:90:::1;::::0;122686:8;;122696:4;;122702:3;;122707:7;;122716:4;;122631:90:::1;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;-1:-1:-1::0;122631:90:0::1;::::0;;::::1;;::::0;;::::1;-1:-1:-1::0;;122631:90:0::1;::::0;::::1;::::0;;;::::1;::::0;;::::1;::::0;::::1;:::i;:::-;;;122627:567;;;;:::i;:::-;-1:-1:-1::0;;;;;;122803:71:0;::::1;-1:-1:-1::0;;;122803:71:0::1;122799:181;;122899:61;;-1:-1:-1::0;;;122899:61:0::1;;;;;;;:::i;86033:284::-:0;86115:48;86145:17;86115:29;:48::i;:::-;86107:106;;;;-1:-1:-1;;;86107:106:0;;40911:2:1;86107:106:0;;;40893:21:1;40950:2;40930:18;;;40923:30;40989:34;40969:18;;;40962:62;-1:-1:-1;;;41040:18:1;;;41033:43;41093:19;;86107:106:0;40709:409:1;86107:106:0;86292:17;-1:-1:-1;;;;;;;;;;;86224:59:0;:85;;-1:-1:-1;;;;;;86224:85:0;-1:-1:-1;;;;;86224:85:0;;;;;;;;;;-1:-1:-1;86033:284:0:o;86726:281::-;86835:29;86846:17;86835:10;:29::i;:::-;86893:1;86879:4;:11;:15;:28;;;;86898:9;86879:28;86875:125;;;86924:64;86964:17;86983:4;86924:39;:64::i;88746:215::-;-1:-1:-1;;;;;88810:22:0;;88802:73;;;;-1:-1:-1;;;88802:73:0;;41325:2:1;88802:73:0;;;41307:21:1;41364:2;41344:18;;;41337:30;41403:34;41383:18;;;41376:62;-1:-1:-1;;;41454:18:1;;;41447:36;41500:19;;88802:73:0;41123:402:1;88802:73:0;88945:8;-1:-1:-1;;;;;;;;;;;88886:50:0;81652:195;19528:113;15312:13;;;;;;;15304:69;;;;-1:-1:-1;;;15304:69:0;;;;;;;:::i;:::-;19601:32:::1;17699:10:::0;19601:18:::1;:32::i;22996:97::-:0;15312:13;;;;;;;15304:69;;;;-1:-1:-1;;;15304:69:0;;;;;;;:::i;:::-;23070:7:::1;:15:::0;;-1:-1:-1;;23070:15:0::1;::::0;;22996:97::o;70153:948::-;70206:7;;-1:-1:-1;;;70284:17:0;;70280:106;;-1:-1:-1;;;70322:17:0;;;-1:-1:-1;70368:2:0;70358:12;70280:106;-1:-1:-1;;;70404:5:0;:17;70400:106;;-1:-1:-1;;;70442:17:0;;;-1:-1:-1;70488:2:0;70478:12;70400:106;70533:8;70524:5;:17;70520:106;;70571:8;70562:17;;;-1:-1:-1;70608:2:0;70598:12;70520:106;70653:7;70644:5;:16;70640:103;;70690:7;70681:16;;;-1:-1:-1;70726:1:0;70716:11;70640:103;70770:7;70761:5;:16;70757:103;;70807:7;70798:16;;;-1:-1:-1;70843:1:0;70833:11;70757:103;70887:7;70878:5;:16;70874:103;;70924:7;70915:16;;;-1:-1:-1;70960:1:0;70950:11;70874:103;71004:7;70995:5;:16;70991:68;;71042:1;71032:11;71087:6;70153:948;-1:-1:-1;;70153:948:0:o;61484:4292::-;61566:14;;;-1:-1:-1;;62111:1:0;62108;62101:20;62155:1;62152;62148:9;62139:18;;62211:5;62207:2;62204:13;62196:5;62192:2;62188:14;62184:34;62175:43;;;62317:5;62326:1;62317:10;62313:373;;62659:11;62651:5;:19;;;;;:::i;:::-;;62644:26;;;;;;62313:373;62813:5;62799:11;:19;62791:53;;;;-1:-1:-1;;;62791:53:0;;41732:2:1;62791:53:0;;;41714:21:1;41771:2;41751:18;;;41744:30;-1:-1:-1;;;41790:18:1;;;41783:51;41851:18;;62791:53:0;41530:345:1;62791:53:0;63107:17;63245:11;63242:1;63239;63232:25;64652:1;63804;63789:12;;:16;;63774:32;;63912:22;;;;64633:1;:15;;64632:21;;64889;;;64885:25;;64874:36;64959:21;;;64955:25;;64944:36;65030:21;;;65026:25;;65015:36;65101:21;;;65097:25;;65086:36;65172:21;;;65168:25;;65157:36;65244:21;;;65240:25;;;65229:36;;;63759:12;64163;;;64159:23;;;64155:31;;;63362:20;;;63351:32;;;64279:12;;;;63410:21;;64013:16;;;;64270:21;;;;65714:15;;;-1:-1:-1;;;;61484:4292:0:o;86430:155::-;86497:37;86516:17;86497:18;:37::i;:::-;86550:27;;-1:-1:-1;;;;;86550:27:0;;;;;;;;86430:155;:::o;6945:200::-;7028:12;7060:77;7081:6;7089:4;7060:77;;;;;;;;;;;;;;;;;7484:12;7510;7524:23;7551:6;-1:-1:-1;;;;;7551:19:0;7571:4;7551:25;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;7509:67;;;;7594:69;7621:6;7629:7;7638:10;7650:12;7594:26;:69::i;:::-;7587:76;7339:332;-1:-1:-1;;;;;;7339:332:0:o;7967:644::-;8152:12;8181:7;8177:427;;;8209:10;:17;8230:1;8209:22;8205:290;;8427:18;8438:6;8427:10;:18::i;:::-;8419:60;;;;-1:-1:-1;;;8419:60:0;;42374:2:1;8419:60:0;;;42356:21:1;42413:2;42393:18;;;42386:30;42452:31;42432:18;;;42425:59;42501:18;;8419:60:0;42172:353:1;8419:60:0;-1:-1:-1;8516:10:0;8509:17;;8177:427;8559:33;8567:10;8579:12;8559:7;:33::i;:::-;7967:644;;;;;;:::o;9153:552::-;9314:17;;:21;9310:388;;9546:10;9540:17;9603:15;9590:10;9586:2;9582:19;9575:44;-1:-1:-1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::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:180::-;1270:6;1323:2;1311:9;1302:7;1298:23;1294:32;1291:52;;;1339:1;1336;1329:12;1291:52;-1:-1:-1;1362:23:1;;1211:180;-1:-1:-1;1211:180:1:o;1396:250::-;1481:1;1491:113;1505:6;1502:1;1499:13;1491:113;;;1581:11;;;1575:18;1562:11;;;1555:39;1527:2;1520:10;1491:113;;;-1:-1:-1;;1638:1:1;1620:16;;1613:27;1396:250::o;1651:271::-;1693:3;1731:5;1725:12;1758:6;1753:3;1746:19;1774:76;1843:6;1836:4;1831:3;1827:14;1820:4;1813:5;1809:16;1774:76;:::i;:::-;1904:2;1883:15;-1:-1:-1;;1879:29:1;1870:39;;;;1911:4;1866:50;;1651:271;-1:-1:-1;;1651:271:1:o;1927:220::-;2076:2;2065:9;2058:21;2039:4;2096:45;2137:2;2126:9;2122:18;2114:6;2096:45;:::i;2152:186::-;2211:6;2264:2;2252:9;2243:7;2239:23;2235:32;2232:52;;;2280:1;2277;2270:12;2232:52;2303:29;2322:9;2303:29;:::i;2343:127::-;2404:10;2399:3;2395:20;2392:1;2385:31;2435:4;2432:1;2425:15;2459:4;2456:1;2449:15;2475:249;2585:2;2566:13;;-1:-1:-1;;2562:27:1;2550:40;;-1:-1:-1;;;;;2605:34:1;;2641:22;;;2602:62;2599:88;;;2667:18;;:::i;:::-;2703:2;2696:22;-1:-1:-1;;2475:249:1:o;2729:183::-;2789:4;-1:-1:-1;;;;;2811:30:1;;2808:56;;;2844:18;;:::i;:::-;-1:-1:-1;2889:1:1;2885:14;2901:4;2881:25;;2729:183::o;2917:736::-;2971:5;3024:3;3017:4;3009:6;3005:17;3001:27;2991:55;;3042:1;3039;3032:12;2991:55;3078:6;3065:20;3104:4;3127:43;3167:2;3127:43;:::i;:::-;3199:2;3193:9;3211:31;3239:2;3231:6;3211:31;:::i;:::-;3262:6;3251:17;;3292:2;3284:6;3277:18;3323:4;3315:6;3311:17;3304:24;;3380:4;3374:2;3371:1;3367:10;3359:6;3355:23;3351:34;3337:48;;3408:3;3400:6;3397:15;3394:35;;;3425:1;3422;3415:12;3394:35;3461:4;3453:6;3449:17;3475:148;3491:6;3486:3;3483:15;3475:148;;;3557:23;3576:3;3557:23;:::i;:::-;3545:36;;3601:12;;;;3508;;3475:148;;3658:730;3712:5;3765:3;3758:4;3750:6;3746:17;3742:27;3732:55;;3783:1;3780;3773:12;3732:55;3819:6;3806:20;3845:4;3868:43;3908:2;3868:43;:::i;:::-;3940:2;3934:9;3952:31;3980:2;3972:6;3952:31;:::i;:::-;4003:6;3992:17;;4033:2;4025:6;4018:18;4064:4;4056:6;4052:17;4045:24;;4121:4;4115:2;4112:1;4108:10;4100:6;4096:23;4092:34;4078:48;;4149:3;4141:6;4138:15;4135:35;;;4166:1;4163;4156:12;4135:35;4202:4;4194:6;4190:17;4216:142;4232:6;4227:3;4224:15;4216:142;;;4298:17;;4286:30;;4336:12;;;;4249;;4216:142;;4393:187;4442:4;-1:-1:-1;;;;;4464:30:1;;4461:56;;;4497:18;;:::i;:::-;-1:-1:-1;4563:2:1;4542:15;-1:-1:-1;;4538:29:1;4569:4;4534:40;;4393:187::o;4585:510::-;4628:5;4681:3;4674:4;4666:6;4662:17;4658:27;4648:55;;4699:1;4696;4689:12;4648:55;4735:6;4722:20;4761:32;4790:2;4761:32;:::i;:::-;4822:2;4816:9;4834:31;4862:2;4854:6;4834:31;:::i;:::-;4889:2;4881:6;4874:18;4935:3;4928:4;4923:2;4915:6;4911:15;4907:26;4904:35;4901:55;;;4952:1;4949;4942:12;4901:55;5016:2;5009:4;5001:6;4997:17;4990:4;4982:6;4978:17;4965:54;5063:1;5039:15;;;5056:4;5035:26;5028:37;;;;-1:-1:-1;5043:6:1;4585:510;-1:-1:-1;;;4585:510:1:o;5100:1341::-;5293:6;5301;5309;5317;5325;5333;5341;5394:3;5382:9;5373:7;5369:23;5365:33;5362:53;;;5411:1;5408;5401:12;5362:53;5438:23;;-1:-1:-1;;;;;5510:14:1;;;5507:34;;;5537:1;5534;5527:12;5507:34;5560:61;5613:7;5604:6;5593:9;5589:22;5560:61;:::i;:::-;5550:71;;5668:2;5657:9;5653:18;5640:32;5630:42;;5725:2;5714:9;5710:18;5697:32;5681:48;;5754:2;5744:8;5741:16;5738:36;;;5770:1;5767;5760:12;5738:36;5793:63;5848:7;5837:8;5826:9;5822:24;5793:63;:::i;:::-;5783:73;;5909:2;5898:9;5894:18;5881:32;5865:48;;5938:2;5928:8;5925:16;5922:36;;;5954:1;5951;5944:12;5922:36;5977:52;6021:7;6010:8;5999:9;5995:24;5977:52;:::i;:::-;5967:62;;6082:3;6071:9;6067:19;6054:33;6038:49;;6112:2;6102:8;6099:16;6096:36;;;6128:1;6125;6118:12;6096:36;6151:52;6195:7;6184:8;6173:9;6169:24;6151:52;:::i;:::-;6141:62;;6256:3;6245:9;6241:19;6228:33;6212:49;;6286:2;6276:8;6273:16;6270:36;;;6302:1;6299;6292:12;6270:36;;6325:52;6369:7;6358:8;6347:9;6343:24;6325:52;:::i;:::-;6315:62;;;6396:39;6430:3;6419:9;6415:19;6396:39;:::i;:::-;6386:49;;5100:1341;;;;;;;;;;:::o;6446:944::-;6600:6;6608;6616;6624;6632;6685:3;6673:9;6664:7;6660:23;6656:33;6653:53;;;6702:1;6699;6692:12;6653:53;6725:29;6744:9;6725:29;:::i;:::-;6715:39;;6773:38;6807:2;6796:9;6792:18;6773:38;:::i;:::-;6763:48;-1:-1:-1;6862:2:1;6847:18;;6834:32;-1:-1:-1;;;;;6915:14:1;;;6912:34;;;6942:1;6939;6932:12;6912:34;6965:61;7018:7;7009:6;6998:9;6994:22;6965:61;:::i;:::-;6955:71;;7079:2;7068:9;7064:18;7051:32;7035:48;;7108:2;7098:8;7095:16;7092:36;;;7124:1;7121;7114:12;7092:36;7147:63;7202:7;7191:8;7180:9;7176:24;7147:63;:::i;:::-;7137:73;;7263:3;7252:9;7248:19;7235:33;7219:49;;7293:2;7283:8;7280:16;7277:36;;;7309:1;7306;7299:12;7277:36;;7332:52;7376:7;7365:8;7354:9;7350:24;7332:52;:::i;:::-;7322:62;;;6446:944;;;;;;;;:::o;7395:203::-;-1:-1:-1;;;;;7559:32:1;;;;7541:51;;7529:2;7514:18;;7395:203::o;7603:595::-;7721:6;7729;7782:2;7770:9;7761:7;7757:23;7753:32;7750:52;;;7798:1;7795;7788:12;7750:52;7825:23;;-1:-1:-1;;;;;7897:14:1;;;7894:34;;;7924:1;7921;7914:12;7894:34;7947:61;8000:7;7991:6;7980:9;7976:22;7947:61;:::i;:::-;7937:71;;8061:2;8050:9;8046:18;8033:32;8017:48;;8090:2;8080:8;8077:16;8074:36;;;8106:1;8103;8096:12;8074:36;;8129:63;8184:7;8173:8;8162:9;8158:24;8129:63;:::i;:::-;8119:73;;;7603:595;;;;;:::o;8203:439::-;8256:3;8294:5;8288:12;8321:6;8316:3;8309:19;8347:4;8376;8371:3;8367:14;8360:21;;8415:4;8408:5;8404:16;8438:1;8448:169;8462:6;8459:1;8456:13;8448:169;;;8523:13;;8511:26;;8557:12;;;;8592:15;;;;8484:1;8477:9;8448:169;;;-1:-1:-1;8633:3:1;;8203:439;-1:-1:-1;;;;;8203:439:1:o;8647:261::-;8826:2;8815:9;8808:21;8789:4;8846:56;8898:2;8887:9;8883:18;8875:6;8846:56;:::i;8913:395::-;8990:6;8998;9051:2;9039:9;9030:7;9026:23;9022:32;9019:52;;;9067:1;9064;9057:12;9019:52;9090:29;9109:9;9090:29;:::i;:::-;9080:39;-1:-1:-1;9170:2:1;9155:18;;9142:32;-1:-1:-1;;;;;9186:30:1;;9183:50;;;9229:1;9226;9219:12;9183:50;9252;9294:7;9285:6;9274:9;9270:22;9252:50;:::i;9495:717::-;9796:6;9785:9;9778:25;9839:3;9834:2;9823:9;9819:18;9812:31;9759:4;9866:46;9907:3;9896:9;9892:19;9884:6;9866:46;:::i;:::-;9960:9;9952:6;9948:22;9943:2;9932:9;9928:18;9921:50;9994:33;10020:6;10012;9994:33;:::i;:::-;9980:47;;10075:9;10067:6;10063:22;10058:2;10047:9;10043:18;10036:50;10103:33;10129:6;10121;10103:33;:::i;:::-;10095:41;;;10202:1;10198;10193:3;10189:11;10185:19;10177:6;10173:32;10167:3;10156:9;10152:19;10145:61;9495:717;;;;;;;;:::o;10217:669::-;10344:6;10352;10360;10413:2;10401:9;10392:7;10388:23;10384:32;10381:52;;;10429:1;10426;10419:12;10381:52;10452:29;10471:9;10452:29;:::i;:::-;10442:39;-1:-1:-1;10532:2:1;10517:18;;10504:32;-1:-1:-1;;;;;10585:14:1;;;10582:34;;;10612:1;10609;10602:12;10582:34;10635:61;10688:7;10679:6;10668:9;10664:22;10635:61;:::i;:::-;10625:71;;10749:2;10738:9;10734:18;10721:32;10705:48;;10778:2;10768:8;10765:16;10762:36;;;10794:1;10791;10784:12;10762:36;;10817:63;10872:7;10861:8;10850:9;10846:24;10817:63;:::i;:::-;10807:73;;;10217:669;;;;;:::o;10891:464::-;10978:6;10986;10994;11047:2;11035:9;11026:7;11022:23;11018:32;11015:52;;;11063:1;11060;11053:12;11015:52;11086:29;11105:9;11086:29;:::i;:::-;11076:39;-1:-1:-1;11162:2:1;11147:18;;11134:32;;-1:-1:-1;11217:2:1;11202:18;;11189:32;-1:-1:-1;;;;;11233:30:1;;11230:50;;;11276:1;11273;11266:12;11230:50;11299;11341:7;11332:6;11321:9;11317:22;11299:50;:::i;11360:347::-;11425:6;11433;11486:2;11474:9;11465:7;11461:23;11457:32;11454:52;;;11502:1;11499;11492:12;11454:52;11525:29;11544:9;11525:29;:::i;:::-;11515:39;;11604:2;11593:9;11589:18;11576:32;11651:5;11644:13;11637:21;11630:5;11627:32;11617:60;;11673:1;11670;11663:12;11617:60;11696:5;11686:15;;;11360:347;;;;;:::o;11712:880::-;11765:5;11818:3;11811:4;11803:6;11799:17;11795:27;11785:55;;11836:1;11833;11826:12;11785:55;11872:6;11859:20;11898:4;11921:43;11961:2;11921:43;:::i;:::-;11993:2;11987:9;12005:31;12033:2;12025:6;12005:31;:::i;:::-;12071:18;;;12163:1;12159:10;;;;12147:23;;12143:32;;;12105:15;;;;-1:-1:-1;12187:15:1;;;12184:35;;;12215:1;12212;12205:12;12184:35;12251:2;12243:6;12239:15;12263:299;12279:6;12274:3;12271:15;12263:299;;;12352:17;;-1:-1:-1;;;;;12385:35:1;;12382:55;;;12433:1;12430;12423:12;12382:55;12462:57;12515:3;12510:2;12496:11;12488:6;12484:24;12480:33;12462:57;:::i;:::-;12450:70;;-1:-1:-1;12540:12:1;;;;12296;;12263:299;;12597:1756;12915:6;12923;12931;12939;12947;12955;12963;13016:3;13004:9;12995:7;12991:23;12987:33;12984:53;;;13033:1;13030;13023:12;12984:53;13060:23;;-1:-1:-1;;;;;13132:14:1;;;13129:34;;;13159:1;13156;13149:12;13129:34;13182:61;13235:7;13226:6;13215:9;13211:22;13182:61;:::i;:::-;13172:71;;13296:2;13285:9;13281:18;13268:32;13252:48;;13325:2;13315:8;13312:16;13309:36;;;13341:1;13338;13331:12;13309:36;13364:63;13419:7;13408:8;13397:9;13393:24;13364:63;:::i;:::-;13354:73;;13480:2;13469:9;13465:18;13452:32;13436:48;;13509:2;13499:8;13496:16;13493:36;;;13525:1;13522;13515:12;13493:36;13548:63;13603:7;13592:8;13581:9;13577:24;13548:63;:::i;:::-;13538:73;;13664:2;13653:9;13649:18;13636:32;13620:48;;13693:2;13683:8;13680:16;13677:36;;;13709:1;13706;13699:12;13677:36;13732:62;13786:7;13775:8;13764:9;13760:24;13732:62;:::i;:::-;13722:72;;13847:3;13836:9;13832:19;13819:33;13803:49;;13877:2;13867:8;13864:16;13861:36;;;13893:1;13890;13883:12;13861:36;13916:62;13970:7;13959:8;13948:9;13944:24;13916:62;:::i;:::-;13906:72;;14031:3;14020:9;14016:19;14003:33;13987:49;;14061:2;14051:8;14048:16;14045:36;;;14077:1;14074;14067:12;14045:36;14100:62;14154:7;14143:8;14132:9;14128:24;14100:62;:::i;:::-;14090:72;;14215:3;14204:9;14200:19;14187:33;14171:49;;14245:2;14235:8;14232:16;14229:36;;;14261:1;14258;14251:12;14229:36;;14284:63;14339:7;14328:8;14317:9;14313:24;14284:63;:::i;:::-;14274:73;;;12597:1756;;;;;;;;;;:::o;14358:390::-;14436:6;14444;14497:2;14485:9;14476:7;14472:23;14468:32;14465:52;;;14513:1;14510;14503:12;14465:52;14540:23;;-1:-1:-1;;;;;14575:30:1;;14572:50;;;14618:1;14615;14608:12;14572:50;14641;14683:7;14674:6;14663:9;14659:22;14641:50;:::i;:::-;14631:60;14738:2;14723:18;;;;14710:32;;-1:-1:-1;;;;14358:390:1:o;14753:260::-;14821:6;14829;14882:2;14870:9;14861:7;14857:23;14853:32;14850:52;;;14898:1;14895;14888:12;14850:52;14921:29;14940:9;14921:29;:::i;:::-;14911:39;;14969:38;15003:2;14992:9;14988:18;14969:38;:::i;:::-;14959:48;;14753:260;;;;;:::o;15018:607::-;15122:6;15130;15138;15146;15154;15207:3;15195:9;15186:7;15182:23;15178:33;15175:53;;;15224:1;15221;15214:12;15175:53;15247:29;15266:9;15247:29;:::i;:::-;15237:39;;15295:38;15329:2;15318:9;15314:18;15295:38;:::i;:::-;15285:48;-1:-1:-1;15380:2:1;15365:18;;15352:32;;-1:-1:-1;15431:2:1;15416:18;;15403:32;;-1:-1:-1;15486:3:1;15471:19;;15458:33;-1:-1:-1;;;;;15503:30:1;;15500:50;;;15546:1;15543;15536:12;15500:50;15569;15611:7;15602:6;15591:9;15587:22;15569:50;:::i;15630:322::-;15707:6;15715;15723;15776:2;15764:9;15755:7;15751:23;15747:32;15744:52;;;15792:1;15789;15782:12;15744:52;15815:29;15834:9;15815:29;:::i;:::-;15805:39;15891:2;15876:18;;15863:32;;-1:-1:-1;15942:2:1;15927:18;;;15914:32;;15630:322;-1:-1:-1;;;15630:322:1:o;16368:704::-;16448:6;16501:2;16489:9;16480:7;16476:23;16472:32;16469:52;;;16517:1;16514;16507:12;16469:52;16544:16;;-1:-1:-1;;;;;16572:30:1;;16569:50;;;16615:1;16612;16605:12;16569:50;16638:22;;16691:4;16683:13;;16679:27;-1:-1:-1;16669:55:1;;16720:1;16717;16710:12;16669:55;16749:2;16743:9;16771:32;16800:2;16771:32;:::i;:::-;16832:2;16826:9;16844:31;16872:2;16864:6;16844:31;:::i;:::-;16899:2;16891:6;16884:18;16939:7;16934:2;16929;16925;16921:11;16917:20;16914:33;16911:53;;;16960:1;16957;16950:12;16911:53;16973:68;17038:2;17033;17025:6;17021:15;17016:2;17012;17008:11;16973:68;:::i;17077:127::-;17138:10;17133:3;17129:20;17126:1;17119:31;17169:4;17166:1;17159:15;17193:4;17190:1;17183:15;17209:401;17411:2;17393:21;;;17450:2;17430:18;;;17423:30;17489:34;17484:2;17469:18;;17462:62;-1:-1:-1;;;17555:2:1;17540:18;;17533:35;17600:3;17585:19;;17209:401::o;17615:127::-;17676:10;17671:3;17667:20;17664:1;17657:31;17707:4;17704:1;17697:15;17731:4;17728:1;17721:15;17747:125;17812:9;;;17833:10;;;17830:36;;;17846:18;;:::i;17877:410::-;18079:2;18061:21;;;18118:2;18098:18;;;18091:30;18157:34;18152:2;18137:18;;18130:62;-1:-1:-1;;;18223:2:1;18208:18;;18201:44;18277:3;18262:19;;17877:410::o;18292:408::-;18494:2;18476:21;;;18533:2;18513:18;;;18506:30;-1:-1:-1;;;;;;;;;;;18567:2:1;18552:18;;18545:62;-1:-1:-1;;;18638:2:1;18623:18;;18616:42;18690:3;18675:19;;18292:408::o;18705:::-;18907:2;18889:21;;;18946:2;18926:18;;;18919:30;-1:-1:-1;;;;;;;;;;;18980:2:1;18965:18;;18958:62;-1:-1:-1;;;19051:2:1;19036:18;;19029:42;19103:3;19088:19;;18705:408::o;19953:410::-;20155:2;20137:21;;;20194:2;20174:18;;;20167:30;20233:34;20228:2;20213:18;;20206:62;-1:-1:-1;;;20299:2:1;20284:18;;20277:44;20353:3;20338:19;;19953:410::o;20557:380::-;20636:1;20632:12;;;;20679;;;20700:61;;20754:4;20746:6;20742:17;20732:27;;20700:61;20807:2;20799:6;20796:14;20776:18;20773:38;20770:161;;20853:10;20848:3;20844:20;20841:1;20834:31;20888:4;20885:1;20878:15;20916:4;20913:1;20906:15;20770:161;;20557:380;;;:::o;21141:1117::-;21464:3;21502:6;21496:13;21518:66;21577:6;21572:3;21565:4;21557:6;21553:17;21518:66;:::i;:::-;21647:13;;21606:16;;;;21669:70;21647:13;21606:16;21716:4;21704:17;;21669:70;:::i;:::-;21806:13;;21761:20;;;21828:70;21806:13;21761:20;21875:4;21863:17;;21828:70;:::i;:::-;21965:13;;21920:20;;;21987:70;21965:13;21920:20;22034:4;22022:17;;21987:70;:::i;:::-;22124:13;;22079:20;;;22146:70;22124:13;22079:20;22193:4;22181:17;;22146:70;:::i;:::-;22232:20;;21141:1117;-1:-1:-1;;;;;;;21141:1117:1:o;22263:289::-;22394:3;22432:6;22426:13;22448:66;22507:6;22502:3;22495:4;22487:6;22483:17;22448:66;:::i;:::-;22530:16;;;;;22263:289;-1:-1:-1;;22263:289:1:o;22557:345::-;22759:2;22741:21;;;22798:2;22778:18;;;22771:30;-1:-1:-1;;;22832:2:1;22817:18;;22810:51;22893:2;22878:18;;22557:345::o;23033:518::-;23135:2;23130:3;23127:11;23124:421;;;23171:5;23168:1;23161:16;23215:4;23212:1;23202:18;23285:2;23273:10;23269:19;23266:1;23262:27;23256:4;23252:38;23321:4;23309:10;23306:20;23303:47;;;-1:-1:-1;23344:4:1;23303:47;23399:2;23394:3;23390:12;23387:1;23383:20;23377:4;23373:31;23363:41;;23454:81;23472:2;23465:5;23462:13;23454:81;;;23531:1;23517:16;;23498:1;23487:13;23454:81;;23727:1345;23847:10;;-1:-1:-1;;;;;23869:30:1;;23866:56;;;23902:18;;:::i;:::-;23931:97;24021:6;23981:38;24013:4;24007:11;23981:38;:::i;:::-;23975:4;23931:97;:::i;:::-;24083:4;;24140:2;24129:14;;24157:1;24152:663;;;;24859:1;24876:6;24873:89;;;-1:-1:-1;24928:19:1;;;24922:26;24873:89;-1:-1:-1;;23684:1:1;23680:11;;;23676:24;23672:29;23662:40;23708:1;23704:11;;;23659:57;24975:81;;24122:944;;24152:663;22980:1;22973:14;;;23017:4;23004:18;;-1:-1:-1;;24188:20:1;;;24306:236;24320:7;24317:1;24314:14;24306:236;;;24409:19;;;24403:26;24388:42;;24501:27;;;;24469:1;24457:14;;;;24336:19;;24306:236;;;24310:3;24570:6;24561:7;24558:19;24555:201;;;24631:19;;;24625:26;-1:-1:-1;;24714:1:1;24710:14;;;24726:3;24706:24;24702:37;24698:42;24683:58;24668:74;;24555:201;-1:-1:-1;;;;;24802:1:1;24786:14;;;24782:22;24769:36;;-1:-1:-1;23727:1345:1:o;25077:291::-;25254:6;25243:9;25236:25;25297:2;25292;25281:9;25277:18;25270:30;25217:4;25317:45;25358:2;25347:9;25343:18;25335:6;25317:45;:::i;27343:346::-;27545:2;27527:21;;;27584:2;27564:18;;;27557:30;-1:-1:-1;;;27618:2:1;27603:18;;27596:52;27680:2;27665:18;;27343:346::o;27694:351::-;27896:2;27878:21;;;27935:2;27915:18;;;27908:30;-1:-1:-1;;;27969:2:1;27954:18;;27947:57;28036:2;28021:18;;27694:351::o;28050:343::-;28252:2;28234:21;;;28291:2;28271:18;;;28264:30;-1:-1:-1;;;28325:2:1;28310:18;;28303:49;28384:2;28369:18;;28050:343::o;28398:407::-;28600:2;28582:21;;;28639:2;28619:18;;;28612:30;28678:34;28673:2;28658:18;;28651:62;-1:-1:-1;;;28744:2:1;28729:18;;28722:41;28795:3;28780:19;;28398:407::o;28810:416::-;29012:2;28994:21;;;29051:2;29031:18;;;29024:30;29090:34;29085:2;29070:18;;29063:62;-1:-1:-1;;;29156:2:1;29141:18;;29134:50;29216:3;29201:19;;28810:416::o;29231:397::-;29433:2;29415:21;;;29472:2;29452:18;;;29445:30;29511:34;29506:2;29491:18;;29484:62;-1:-1:-1;;;29577:2:1;29562:18;;29555:31;29618:3;29603:19;;29231:397::o;29886:404::-;30088:2;30070:21;;;30127:2;30107:18;;;30100:30;30166:34;30161:2;30146:18;;30139:62;-1:-1:-1;;;30232:2:1;30217:18;;30210:38;30280:3;30265:19;;29886:404::o;30295:401::-;30497:2;30479:21;;;30536:2;30516:18;;;30509:30;30575:34;30570:2;30555:18;;30548:62;-1:-1:-1;;;30641:2:1;30626:18;;30619:35;30686:3;30671:19;;30295:401::o;30701:406::-;30903:2;30885:21;;;30942:2;30922:18;;;30915:30;30981:34;30976:2;30961:18;;30954:62;-1:-1:-1;;;31047:2:1;31032:18;;31025:40;31097:3;31082:19;;30701:406::o;31112:465::-;31369:2;31358:9;31351:21;31332:4;31395:56;31447:2;31436:9;31432:18;31424:6;31395:56;:::i;:::-;31499:9;31491:6;31487:22;31482:2;31471:9;31467:18;31460:50;31527:44;31564:6;31556;31527:44;:::i;:::-;31519:52;31112:465;-1:-1:-1;;;;;31112:465:1:o;31582:184::-;31652:6;31705:2;31693:9;31684:7;31680:23;31676:32;31673:52;;;31721:1;31718;31711:12;31673:52;-1:-1:-1;31744:16:1;;31582:184;-1:-1:-1;31582:184:1:o;33676:399::-;33878:2;33860:21;;;33917:2;33897:18;;;33890:30;33956:34;33951:2;33936:18;;33929:62;-1:-1:-1;;;34022:2:1;34007:18;;34000:33;34065:3;34050:19;;33676:399::o;34080:412::-;34282:2;34264:21;;;34321:2;34301:18;;;34294:30;34360:34;34355:2;34340:18;;34333:62;-1:-1:-1;;;34426:2:1;34411:18;;34404:46;34482:3;34467:19;;34080:412::o;34497:400::-;34699:2;34681:21;;;34738:2;34718:18;;;34711:30;34777:34;34772:2;34757:18;;34750:62;-1:-1:-1;;;34843:2:1;34828:18;;34821:34;34887:3;34872:19;;34497:400::o;34902:399::-;35104:2;35086:21;;;35143:2;35123:18;;;35116:30;35182:34;35177:2;35162:18;;35155:62;-1:-1:-1;;;35248:2:1;35233:18;;35226:33;35291:3;35276:19;;34902:399::o;35306:407::-;35508:2;35490:21;;;35547:2;35527:18;;;35520:30;35586:34;35581:2;35566:18;;35559:62;-1:-1:-1;;;35652:2:1;35637:18;;35630:41;35703:3;35688:19;;35306:407::o;35718:168::-;35791:9;;;35822;;35839:15;;;35833:22;;35819:37;35809:71;;35860:18;;:::i;35891:136::-;35930:3;35958:5;35948:39;;35967:18;;:::i;:::-;-1:-1:-1;;;36003:18:1;;35891:136::o;36393:127::-;36454:10;36449:3;36445:20;36442:1;36435:31;36485:4;36482:1;36475:15;36509:4;36506:1;36499:15;37345:561;-1:-1:-1;;;;;37642:15:1;;;37624:34;;37694:15;;37689:2;37674:18;;37667:43;37741:2;37726:18;;37719:34;;;37784:2;37769:18;;37762:34;;;37604:3;37827;37812:19;;37805:32;;;37567:4;;37854:46;;37880:19;;37872:6;37854:46;:::i;:::-;37846:54;37345:561;-1:-1:-1;;;;;;;37345:561:1:o;37911:249::-;37980:6;38033:2;38021:9;38012:7;38008:23;38004:32;38001:52;;;38049:1;38046;38039:12;38001:52;38081:9;38075:16;38100:30;38124:5;38100:30;:::i;38165:179::-;38200:3;38242:1;38224:16;38221:23;38218:120;;;38288:1;38285;38282;38267:23;-1:-1:-1;38325:1:1;38319:8;38314:3;38310:18;38165:179;:::o;38349:671::-;38388:3;38430:4;38412:16;38409:26;38406:39;;;38349:671;:::o;38406:39::-;38472:2;38466:9;-1:-1:-1;;38537:16:1;38533:25;;38530:1;38466:9;38509:50;38582:11;;38612:16;-1:-1:-1;;;;;38680:14:1;;;38711:4;38699:17;;38696:25;-1:-1:-1;38677:45:1;38674:58;;;38725:5;;;;;38349:671;:::o;38674:58::-;38762:6;38756:4;38752:17;38741:28;;38798:3;38792:10;38825:2;38817:6;38814:14;38811:27;;;38831:5;;;;;;38349:671;:::o;38811:27::-;38915:2;38896:16;38890:4;38886:27;38882:36;38875:4;38866:6;38861:3;38857:16;38853:27;38850:69;38847:82;;;38922:5;;;;;;38349:671;:::o;38847:82::-;38938:57;38989:4;38980:6;38972;38968:19;38964:30;38958:4;38938:57;:::i;:::-;-1:-1:-1;39011:3:1;;38349:671;-1:-1:-1;;;;;38349:671:1:o;39457:415::-;39659:2;39641:21;;;39698:2;39678:18;;;39671:30;39737:34;39732:2;39717:18;;39710:62;-1:-1:-1;;;39803:2:1;39788:18;;39781:49;39862:3;39847:19;;39457:415::o;39877:827::-;-1:-1:-1;;;;;40274:15:1;;;40256:34;;40326:15;;40321:2;40306:18;;40299:43;40236:3;40373:2;40358:18;;40351:31;;;40199:4;;40405:57;;40442:19;;40434:6;40405:57;:::i;:::-;40510:9;40502:6;40498:22;40493:2;40482:9;40478:18;40471:50;40544:44;40581:6;40573;40544:44;:::i;:::-;40530:58;;40637:9;40629:6;40625:22;40619:3;40608:9;40604:19;40597:51;40665:33;40691:6;40683;40665:33;:::i;:::-;40657:41;39877:827;-1:-1:-1;;;;;;;;39877:827:1:o
Swarm Source
ipfs://6d5361b524ddcd98313581827d5304c3d6f4ad874adecfaf20812212f8a72396
Loading...
Loading
Loading...
Loading
Multichain Portfolio | 27 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.