Overview
ETH Balance
0 ETH
Eth Value
$0.00More Info
Private Name Tags
ContractCreator
Latest 19 from a total of 19 transactions
Transaction Hash |
Method
|
Block
|
From
|
To
|
|||||
---|---|---|---|---|---|---|---|---|---|
Multi Send ERC20... | 20532866 | 24 days ago | IN | 0 ETH | 0.0013556 | ||||
Multi Send ERC20... | 20490490 | 30 days ago | IN | 0 ETH | 0.00385428 | ||||
Multi Send ERC20... | 20476433 | 32 days ago | IN | 0 ETH | 0.01143214 | ||||
Multi Send ERC20... | 20475988 | 32 days ago | IN | 0 ETH | 0.01221872 | ||||
Multi Send ERC20... | 20282401 | 59 days ago | IN | 0 ETH | 0.02348896 | ||||
Multi Send ERC20... | 20250044 | 63 days ago | IN | 0 ETH | 0.01775235 | ||||
Multi Send ERC20... | 20192026 | 71 days ago | IN | 0 ETH | 0.01856572 | ||||
Multi Send ERC20... | 20192009 | 71 days ago | IN | 0 ETH | 0.00059686 | ||||
Multi Send ERC20... | 20168687 | 75 days ago | IN | 0 ETH | 0.04147632 | ||||
Multi Send ERC20... | 20090166 | 86 days ago | IN | 0 ETH | 0.00914331 | ||||
Multi Send ERC20... | 20074312 | 88 days ago | IN | 0 ETH | 0.01340638 | ||||
Multi Send ERC20... | 20053349 | 91 days ago | IN | 0 ETH | 0.00657262 | ||||
Multi Send ERC20... | 20023939 | 95 days ago | IN | 0 ETH | 0.00518463 | ||||
Multi Send ERC20... | 20018103 | 96 days ago | IN | 0 ETH | 0.04866848 | ||||
Multi Send ERC20... | 20018018 | 96 days ago | IN | 0 ETH | 0.0453992 | ||||
Multi Send ERC20... | 20009965 | 97 days ago | IN | 0 ETH | 0.1374357 | ||||
Multi Send ERC20... | 19968741 | 103 days ago | IN | 0 ETH | 0.01098364 | ||||
Multi Send ERC20... | 19881924 | 115 days ago | IN | 0 ETH | 0.00907878 | ||||
0x60806040 | 19826225 | 123 days ago | IN | 0 ETH | 0.02448887 |
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:
MultiSenderV2
Compiler Version
v0.8.24+commit.e11b9ed9
Contract Source Code (Solidity)
/** *Submitted for verification at Etherscan.io on 2024-05-08 */ // Sources flattened with hardhat v2.22.2 https://hardhat.org // SPDX-License-Identifier: MIT // File @ironblocks/firewall-consumer/contracts/interfaces/[email protected] // See LICENSE file for full license text. // Copyright (c) Ironblocks 2024 pragma solidity ^0.8; interface IFirewall { function preExecution(address sender, bytes memory data, uint value) external; function postExecution(address sender, bytes memory data, uint value) external; function preExecutionPrivateInvariants(address sender, bytes memory data, uint value) external returns (bytes32[] calldata); function postExecutionPrivateInvariants( address sender, bytes memory data, uint value, bytes32[] calldata preValues, bytes32[] calldata postValues ) external; } // File @ironblocks/firewall-consumer/contracts/interfaces/[email protected] // See LICENSE file for full license text. // Copyright (c) Ironblocks 2024 pragma solidity ^0.8; interface IFirewallConsumer { function firewallAdmin() external returns (address); } // File @openzeppelin/contracts/utils/[email protected] // Original license: 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 Address { /** * @dev Returns true if `account` is a contract. * * [IMPORTANT] * ==== * It is unsafe to assume that an address for which this function returns * false is an externally-owned account (EOA) and not a contract. * * Among others, `isContract` will return false for the following * types of addresses: * * - an externally-owned account * - a contract in construction * - an address where a contract will be created * - an address where a contract lived, but was destroyed * * 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); } } } // File @openzeppelin/contracts/utils/[email protected] // Original license: SPDX_License_Identifier: MIT // OpenZeppelin Contracts (last updated v4.9.4) (utils/Context.sol) pragma solidity ^0.8.0; /** * @dev Provides information about the current execution context, including the * sender of the transaction and its data. While these are generally available * via msg.sender and msg.data, they should not be accessed in such a direct * manner, since when dealing with meta-transactions the account sending and * paying for execution may not be the actual sender (as far as an application * is concerned). * * This contract is only required for intermediate, library-like contracts. */ abstract contract Context { function _msgSender() internal view virtual returns (address) { return msg.sender; } function _msgData() internal view virtual returns (bytes calldata) { return msg.data; } function _contextSuffixLength() internal view virtual returns (uint256) { return 0; } } // File @ironblocks/firewall-consumer/contracts/[email protected] // See LICENSE file for full license text. // Copyright (c) Ironblocks 2024 pragma solidity ^0.8; /** * @title Firewall Consumer Base Contract * @author David Benchimol @ Ironblocks * @dev This contract is a parent contract that can be used to add firewall protection to any contract. * * The contract must define a firewall contract which will manage the policies that are applied to the contract. * It also must define a firewall admin which will be able to add and remove policies. * */ contract FirewallConsumerBase is IFirewallConsumer, Context { bytes32 private constant FIREWALL_STORAGE_SLOT = bytes32(uint256(keccak256("eip1967.firewall")) - 1); bytes32 private constant FIREWALL_ADMIN_STORAGE_SLOT = bytes32(uint256(keccak256("eip1967.firewall.admin")) - 1); bytes32 private constant NEW_FIREWALL_ADMIN_STORAGE_SLOT = bytes32(uint256(keccak256("eip1967.new.firewall.admin")) - 1); // This slot is special since it's used for mappings and not a single value bytes32 private constant APPROVED_TARGETS_MAPPING_SLOT = bytes32(uint256(keccak256("eip1967.approved.targets")) - 1); /** * @dev modifier that will run the preExecution and postExecution hooks of the firewall, applying each of * the subscribed policies. */ modifier firewallProtected() { address firewall = _getAddressBySlot(FIREWALL_STORAGE_SLOT); if (firewall == address(0)) { _; return; } uint value = _msgValue(); IFirewall(firewall).preExecution(msg.sender, msg.data, value); _; IFirewall(firewall).postExecution(msg.sender, msg.data, value); } /** * @dev modifier that will run the preExecution and postExecution hooks of the firewall, applying each of * the subscribed policies. Allows passing custom data to the firewall, not necessarily msg.data. * Useful for checking internal function calls */ modifier firewallProtectedCustom(bytes memory data) { address firewall = _getAddressBySlot(FIREWALL_STORAGE_SLOT); if (firewall == address(0)) { _; return; } uint value = _msgValue(); IFirewall(firewall).preExecution(msg.sender, data, value); _; IFirewall(firewall).postExecution(msg.sender, data, value); } /** * @dev identical to the rest of the modifiers in terms of logic, but makes it more * aesthetic when all you want to pass are signatures/unique identifiers. */ modifier firewallProtectedSig(bytes4 selector) { address firewall = _getAddressBySlot(FIREWALL_STORAGE_SLOT); if (firewall == address(0)) { _; return; } uint value = _msgValue(); IFirewall(firewall).preExecution(msg.sender, abi.encodePacked(selector), value); _; IFirewall(firewall).postExecution(msg.sender, abi.encodePacked(selector), value); } /** * @dev modifier that will run the preExecution and postExecution hooks of the firewall invariant policy, * applying the subscribed invariant policy */ modifier invariantProtected() { address firewall = _getAddressBySlot(FIREWALL_STORAGE_SLOT); if (firewall == address(0)) { _; return; } uint value = _msgValue(); bytes32[] memory storageSlots = IFirewall(firewall).preExecutionPrivateInvariants(msg.sender, msg.data, value); bytes32[] memory preValues = _readStorage(storageSlots); _; bytes32[] memory postValues = _readStorage(storageSlots); IFirewall(firewall).postExecutionPrivateInvariants(msg.sender, msg.data, value, preValues, postValues); } /** * @dev modifier asserting that the target is approved */ modifier onlyApprovedTarget(address target) { // We use the same logic that solidity uses for mapping locations, but we add a pseudorandom // constant "salt" instead of a constant placeholder so that there are no storage collisions // if adding this to an upgradeable contract implementation bytes32 _slot = keccak256(abi.encode(APPROVED_TARGETS_MAPPING_SLOT, target)); bool isApprovedTarget = _getValueBySlot(_slot) != bytes32(0); require(isApprovedTarget, "FirewallConsumer: Not approved target"); _; } /** * @dev modifier similar to onlyOwner, but for the firewall admin. */ modifier onlyFirewallAdmin() { require(msg.sender == _getAddressBySlot(FIREWALL_ADMIN_STORAGE_SLOT), "FirewallConsumer: not firewall admin"); _; } /** * @dev Initializes a contract protected by a firewall, with a firewall address and a firewall admin. * * IMPORTENT: need to add _setAddressBySlot(FIREWALL_ADMIN_STORAGE_SLOT, _firewallAdmin); in the initializer for upgradable contracts */ /// @custom:oz-upgrades-unsafe-allow constructor constructor( address _firewall, address _firewallAdmin ) { _setAddressBySlot(FIREWALL_STORAGE_SLOT, _firewall); _setAddressBySlot(FIREWALL_ADMIN_STORAGE_SLOT, _firewallAdmin); } /** * @dev Allows calling an approved external target before executing a method. * * This can be used for multiple purposes, but the initial one is to call `approveCallsViaSignature` before * executing a function, allowing synchronous transaction approvals. */ function safeFunctionCall( address target, bytes calldata targetPayload, bytes calldata data ) external payable onlyApprovedTarget(target) { (bool success, ) = target.call(targetPayload); require(success); require(msg.sender == _msgSender(), "FirewallConsumer: No meta transactions"); Address.functionDelegateCall(address(this), data); } /** * @dev Allows firewall admin to set approved targets. * IMPORTANT: Only set approved target if you know what you're doing. Anyone can cause this contract * to send any data to an approved target. */ function setApprovedTarget(address target, bool status) external onlyFirewallAdmin { bytes32 _slot = keccak256(abi.encode(APPROVED_TARGETS_MAPPING_SLOT, target)); assembly { sstore(_slot, status) } } /** * @dev View function for the firewall admin */ function firewallAdmin() external view returns (address) { return _getAddressBySlot(FIREWALL_ADMIN_STORAGE_SLOT); } /** * @dev Admin only function allowing the consumers admin to set the firewall address. */ function setFirewall(address _firewall) external onlyFirewallAdmin { _setAddressBySlot(FIREWALL_STORAGE_SLOT, _firewall); } /** * @dev Admin only function, sets new firewall admin. New admin must accept. */ function setFirewallAdmin(address _firewallAdmin) external onlyFirewallAdmin { require(_firewallAdmin != address(0), "FirewallConsumer: zero address"); _setAddressBySlot(NEW_FIREWALL_ADMIN_STORAGE_SLOT, _firewallAdmin); } /** * @dev Accept the role as firewall admin. */ function acceptFirewallAdmin() external { require(msg.sender == _getAddressBySlot(NEW_FIREWALL_ADMIN_STORAGE_SLOT), "FirewallConsumer: not new admin"); _setAddressBySlot(FIREWALL_ADMIN_STORAGE_SLOT, msg.sender); } function _msgValue() internal view returns (uint value) { // We do this because msg.value can only be accessed in payable functions. assembly { value := callvalue() } } function _readStorage(bytes32[] memory storageSlots) internal view returns (bytes32[] memory) { uint256 slotsLength = storageSlots.length; bytes32[] memory values = new bytes32[](slotsLength); for (uint256 i = 0; i < slotsLength; i++) { bytes32 slotValue = _getValueBySlot(storageSlots[i]); values[i] = slotValue; } return values; } function _setAddressBySlot(bytes32 _slot, address _address) internal { assembly { sstore(_slot, _address) } } function _getAddressBySlot(bytes32 _slot) internal view returns (address _address) { assembly { _address := sload(_slot) } } function _getValueBySlot(bytes32 _slot) internal view returns (bytes32 _value) { assembly { _value := sload(_slot) } } } // File @ironblocks/firewall-consumer/contracts/[email protected] // See LICENSE file for full license text. // Copyright (c) Ironblocks 2024 pragma solidity ^0.8; /** * @title Firewall Consumer * @author David Benchimol @ Ironblocks * @dev This contract is a parent contract that can be used to add firewall protection to any contract. * * The contract must initializes with the firewall contract disabled, and the deployer * as the firewall admin. * */ contract FirewallConsumer is FirewallConsumerBase(address(0), msg.sender) { } // File @openzeppelin/contracts/access/[email protected] // Original license: SPDX_License_Identifier: MIT // OpenZeppelin Contracts (last updated v4.9.0) (access/Ownable.sol) pragma solidity ^0.8.0; /** * @dev Contract module which provides a basic access control mechanism, where * there is an account (an owner) that can be granted exclusive access to * specific functions. * * By default, the owner account will be the one that deploys the contract. This * can later be changed with {transferOwnership}. * * This module is used through inheritance. It will make available the modifier * `onlyOwner`, which can be applied to your functions to restrict their use to * the owner. */ abstract contract Ownable is Context { address private _owner; event OwnershipTransferred(address indexed previousOwner, address indexed newOwner); /** * @dev Initializes the contract setting the deployer as the initial owner. */ constructor() { _transferOwnership(_msgSender()); } /** * @dev 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); } } // File @openzeppelin/contracts/security/[email protected] // Original license: SPDX_License_Identifier: MIT // OpenZeppelin Contracts (last updated v4.7.0) (security/Pausable.sol) pragma solidity ^0.8.0; /** * @dev Contract module which allows children to implement an emergency stop * mechanism that can be triggered by an authorized account. * * This module is used through inheritance. It will make available the * modifiers `whenNotPaused` and `whenPaused`, which can be applied to * the functions of your contract. Note that they will not be pausable by * simply including this module, only once the modifiers are put in place. */ abstract contract Pausable is Context { /** * @dev Emitted when the pause is triggered by `account`. */ event Paused(address account); /** * @dev Emitted when the pause is lifted by `account`. */ event Unpaused(address account); bool private _paused; /** * @dev Initializes the contract in unpaused state. */ constructor() { _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()); } } // File @openzeppelin/contracts/token/ERC20/[email protected] // Original license: SPDX_License_Identifier: MIT // OpenZeppelin Contracts (last updated v4.9.0) (token/ERC20/IERC20.sol) pragma solidity ^0.8.0; /** * @dev Interface of the ERC20 standard as defined in the EIP. */ interface IERC20 { /** * @dev Emitted when `value` tokens are moved from one account (`from`) to * another (`to`). * * Note that `value` may be zero. */ event Transfer(address indexed from, address indexed to, uint256 value); /** * @dev Emitted when the allowance of a `spender` for an `owner` is set by * a call to {approve}. `value` is the new allowance. */ event Approval(address indexed owner, address indexed spender, uint256 value); /** * @dev Returns the amount of tokens in existence. */ function totalSupply() external view returns (uint256); /** * @dev Returns the amount of tokens owned by `account`. */ function balanceOf(address account) external view returns (uint256); /** * @dev Moves `amount` tokens from the caller's account to `to`. * * Returns a boolean value indicating whether the operation succeeded. * * Emits a {Transfer} event. */ function transfer(address to, uint256 amount) external returns (bool); /** * @dev Returns the remaining number of tokens that `spender` will be * allowed to spend on behalf of `owner` through {transferFrom}. This is * zero by default. * * This value changes when {approve} or {transferFrom} are called. */ function allowance(address owner, address spender) external view returns (uint256); /** * @dev Sets `amount` as the allowance of `spender` over the caller's tokens. * * Returns a boolean value indicating whether the operation succeeded. * * IMPORTANT: Beware that changing an allowance with this method brings the risk * that someone may use both the old and the new allowance by unfortunate * transaction ordering. One possible solution to mitigate this race * condition is to first reduce the spender's allowance to 0 and set the * desired value afterwards: * https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729 * * Emits an {Approval} event. */ function approve(address spender, uint256 amount) external returns (bool); /** * @dev Moves `amount` tokens from `from` to `to` using the * allowance mechanism. `amount` is then deducted from the caller's * allowance. * * Returns a boolean value indicating whether the operation succeeded. * * Emits a {Transfer} event. */ function transferFrom(address from, address to, uint256 amount) external returns (bool); } // File @openzeppelin/contracts/token/ERC20/extensions/[email protected] // Original license: SPDX_License_Identifier: MIT // OpenZeppelin Contracts v4.4.1 (token/ERC20/extensions/IERC20Metadata.sol) pragma solidity ^0.8.0; /** * @dev Interface for the optional metadata functions from the ERC20 standard. * * _Available since v4.1._ */ interface IERC20Metadata is IERC20 { /** * @dev Returns the name of the token. */ function name() external view returns (string memory); /** * @dev Returns the symbol of the token. */ function symbol() external view returns (string memory); /** * @dev Returns the decimals places of the token. */ function decimals() external view returns (uint8); } // File @openzeppelin/contracts/token/ERC20/[email protected] // Original license: SPDX_License_Identifier: MIT // OpenZeppelin Contracts (last updated v4.9.0) (token/ERC20/ERC20.sol) pragma solidity ^0.8.0; /** * @dev Implementation of the {IERC20} interface. * * This implementation is agnostic to the way tokens are created. This means * that a supply mechanism has to be added in a derived contract using {_mint}. * For a generic mechanism see {ERC20PresetMinterPauser}. * * TIP: For a detailed writeup see our guide * https://forum.openzeppelin.com/t/how-to-implement-erc20-supply-mechanisms/226[How * to implement supply mechanisms]. * * The default value of {decimals} is 18. To change this, you should override * this function so it returns a different value. * * We have followed general OpenZeppelin Contracts guidelines: functions revert * instead returning `false` on failure. This behavior is nonetheless * conventional and does not conflict with the expectations of ERC20 * applications. * * Additionally, an {Approval} event is emitted on calls to {transferFrom}. * This allows applications to reconstruct the allowance for all accounts just * by listening to said events. Other implementations of the EIP may not emit * these events, as it isn't required by the specification. * * Finally, the non-standard {decreaseAllowance} and {increaseAllowance} * functions have been added to mitigate the well-known issues around setting * allowances. See {IERC20-approve}. */ contract ERC20 is Context, IERC20, IERC20Metadata { mapping(address => uint256) private _balances; mapping(address => mapping(address => uint256)) private _allowances; uint256 private _totalSupply; string private _name; string private _symbol; /** * @dev Sets the values for {name} and {symbol}. * * All two of these values are immutable: they can only be set once during * construction. */ constructor(string memory name_, string memory symbol_) { _name = name_; _symbol = symbol_; } /** * @dev Returns the name of the token. */ function name() public view virtual override returns (string memory) { return _name; } /** * @dev Returns the symbol of the token, usually a shorter version of the * name. */ function symbol() public view virtual override returns (string memory) { return _symbol; } /** * @dev Returns the number of decimals used to get its user representation. * For example, if `decimals` equals `2`, a balance of `505` tokens should * be displayed to a user as `5.05` (`505 / 10 ** 2`). * * Tokens usually opt for a value of 18, imitating the relationship between * Ether and Wei. This is the default value returned by this function, unless * it's overridden. * * NOTE: This information is only used for _display_ purposes: it in * no way affects any of the arithmetic of the contract, including * {IERC20-balanceOf} and {IERC20-transfer}. */ function decimals() public view virtual override returns (uint8) { return 18; } /** * @dev See {IERC20-totalSupply}. */ function totalSupply() public view virtual override returns (uint256) { return _totalSupply; } /** * @dev See {IERC20-balanceOf}. */ function balanceOf(address account) public view virtual override returns (uint256) { return _balances[account]; } /** * @dev See {IERC20-transfer}. * * Requirements: * * - `to` cannot be the zero address. * - the caller must have a balance of at least `amount`. */ function transfer(address to, uint256 amount) public virtual override returns (bool) { address owner = _msgSender(); _transfer(owner, to, amount); return true; } /** * @dev See {IERC20-allowance}. */ function allowance(address owner, address spender) public view virtual override returns (uint256) { return _allowances[owner][spender]; } /** * @dev See {IERC20-approve}. * * NOTE: If `amount` is the maximum `uint256`, the allowance is not updated on * `transferFrom`. This is semantically equivalent to an infinite approval. * * Requirements: * * - `spender` cannot be the zero address. */ function approve(address spender, uint256 amount) public virtual override returns (bool) { address owner = _msgSender(); _approve(owner, spender, amount); return true; } /** * @dev See {IERC20-transferFrom}. * * Emits an {Approval} event indicating the updated allowance. This is not * required by the EIP. See the note at the beginning of {ERC20}. * * NOTE: Does not update the allowance if the current allowance * is the maximum `uint256`. * * Requirements: * * - `from` and `to` cannot be the zero address. * - `from` must have a balance of at least `amount`. * - the caller must have allowance for ``from``'s tokens of at least * `amount`. */ function transferFrom(address from, address to, uint256 amount) public virtual override returns (bool) { address spender = _msgSender(); _spendAllowance(from, spender, amount); _transfer(from, to, amount); return true; } /** * @dev Atomically increases the allowance granted to `spender` by the caller. * * This is an alternative to {approve} that can be used as a mitigation for * problems described in {IERC20-approve}. * * Emits an {Approval} event indicating the updated allowance. * * Requirements: * * - `spender` cannot be the zero address. */ function increaseAllowance(address spender, uint256 addedValue) public virtual returns (bool) { address owner = _msgSender(); _approve(owner, spender, allowance(owner, spender) + addedValue); return true; } /** * @dev Atomically decreases the allowance granted to `spender` by the caller. * * This is an alternative to {approve} that can be used as a mitigation for * problems described in {IERC20-approve}. * * Emits an {Approval} event indicating the updated allowance. * * Requirements: * * - `spender` cannot be the zero address. * - `spender` must have allowance for the caller of at least * `subtractedValue`. */ function decreaseAllowance(address spender, uint256 subtractedValue) public virtual returns (bool) { address owner = _msgSender(); uint256 currentAllowance = allowance(owner, spender); require(currentAllowance >= subtractedValue, "ERC20: decreased allowance below zero"); unchecked { _approve(owner, spender, currentAllowance - subtractedValue); } return true; } /** * @dev Moves `amount` of tokens from `from` to `to`. * * This internal function is equivalent to {transfer}, and can be used to * e.g. implement automatic token fees, slashing mechanisms, etc. * * Emits a {Transfer} event. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `from` must have a balance of at least `amount`. */ function _transfer(address from, address to, uint256 amount) internal virtual { require(from != address(0), "ERC20: transfer from the zero address"); require(to != address(0), "ERC20: transfer to the zero address"); _beforeTokenTransfer(from, to, amount); uint256 fromBalance = _balances[from]; require(fromBalance >= amount, "ERC20: transfer amount exceeds balance"); unchecked { _balances[from] = fromBalance - amount; // Overflow not possible: the sum of all balances is capped by totalSupply, and the sum is preserved by // decrementing then incrementing. _balances[to] += amount; } emit Transfer(from, to, amount); _afterTokenTransfer(from, to, amount); } /** @dev Creates `amount` tokens and assigns them to `account`, increasing * the total supply. * * Emits a {Transfer} event with `from` set to the zero address. * * Requirements: * * - `account` cannot be the zero address. */ function _mint(address account, uint256 amount) internal virtual { require(account != address(0), "ERC20: mint to the zero address"); _beforeTokenTransfer(address(0), account, amount); _totalSupply += amount; unchecked { // Overflow not possible: balance + amount is at most totalSupply + amount, which is checked above. _balances[account] += amount; } emit Transfer(address(0), account, amount); _afterTokenTransfer(address(0), account, amount); } /** * @dev Destroys `amount` tokens from `account`, reducing the * total supply. * * Emits a {Transfer} event with `to` set to the zero address. * * Requirements: * * - `account` cannot be the zero address. * - `account` must have at least `amount` tokens. */ function _burn(address account, uint256 amount) internal virtual { require(account != address(0), "ERC20: burn from the zero address"); _beforeTokenTransfer(account, address(0), amount); uint256 accountBalance = _balances[account]; require(accountBalance >= amount, "ERC20: burn amount exceeds balance"); unchecked { _balances[account] = accountBalance - amount; // Overflow not possible: amount <= accountBalance <= totalSupply. _totalSupply -= amount; } emit Transfer(account, address(0), amount); _afterTokenTransfer(account, address(0), amount); } /** * @dev Sets `amount` as the allowance of `spender` over the `owner` s tokens. * * This internal function is equivalent to `approve`, and can be used to * e.g. set automatic allowances for certain subsystems, etc. * * Emits an {Approval} event. * * Requirements: * * - `owner` cannot be the zero address. * - `spender` cannot be the zero address. */ function _approve(address owner, address spender, uint256 amount) internal virtual { require(owner != address(0), "ERC20: approve from the zero address"); require(spender != address(0), "ERC20: approve to the zero address"); _allowances[owner][spender] = amount; emit Approval(owner, spender, amount); } /** * @dev Updates `owner` s allowance for `spender` based on spent `amount`. * * Does not update the allowance amount in case of infinite allowance. * Revert if not enough allowance is available. * * Might emit an {Approval} event. */ function _spendAllowance(address owner, address spender, uint256 amount) internal virtual { uint256 currentAllowance = allowance(owner, spender); if (currentAllowance != type(uint256).max) { require(currentAllowance >= amount, "ERC20: insufficient allowance"); unchecked { _approve(owner, spender, currentAllowance - amount); } } } /** * @dev Hook that is called before any transfer of tokens. This includes * minting and burning. * * Calling conditions: * * - when `from` and `to` are both non-zero, `amount` of ``from``'s tokens * will be transferred to `to`. * - when `from` is zero, `amount` tokens will be minted for `to`. * - when `to` is zero, `amount` of ``from``'s tokens will be burned. * - `from` and `to` are never both zero. * * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks]. */ function _beforeTokenTransfer(address from, address to, uint256 amount) internal virtual {} /** * @dev Hook that is called after any transfer of tokens. This includes * minting and burning. * * Calling conditions: * * - when `from` and `to` are both non-zero, `amount` of ``from``'s tokens * has been transferred to `to`. * - when `from` is zero, `amount` tokens have been minted for `to`. * - when `to` is zero, `amount` of ``from``'s tokens have been burned. * - `from` and `to` are never both zero. * * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks]. */ function _afterTokenTransfer(address from, address to, uint256 amount) internal virtual {} } // File @poolzfinance/poolz-helper-v2/contracts/[email protected] // Original license: SPDX_License_Identifier: MIT pragma solidity ^0.8.0; contract ERC20Helper is FirewallConsumer { event TransferOut(uint256 Amount, address To, address Token); event TransferIn(uint256 Amount, address From, address Token); modifier TestAllowance( address _token, address _owner, uint256 _amount ) { require( ERC20(_token).allowance(_owner, address(this)) >= _amount, "ERC20Helper: no allowance" ); _; } function TransferToken( address _Token, address _Reciver, uint256 _Amount ) internal firewallProtectedSig(0x3844b707) { uint256 OldBalance = ERC20(_Token).balanceOf(address(this)); emit TransferOut(_Amount, _Reciver, _Token); ERC20(_Token).transfer(_Reciver, _Amount); require( (ERC20(_Token).balanceOf(address(this)) + _Amount) == OldBalance, "ERC20Helper: sent incorrect amount" ); } function TransferInToken( address _Token, address _Subject, uint256 _Amount ) internal TestAllowance(_Token, _Subject, _Amount) { require(_Amount > 0); uint256 OldBalance = ERC20(_Token).balanceOf(address(this)); ERC20(_Token).transferFrom(_Subject, address(this), _Amount); emit TransferIn(_Amount, _Subject, _Token); require( (OldBalance + _Amount) == ERC20(_Token).balanceOf(address(this)), "ERC20Helper: Received Incorrect Amount" ); } function ApproveAllowanceERC20( address _Token, address _Subject, uint256 _Amount ) internal firewallProtectedSig(0x91251680) { require(_Amount > 0); ERC20(_Token).approve(_Subject, _Amount); } } // File @poolzfinance/poolz-helper-v2/contracts/[email protected] // Original license: SPDX_License_Identifier: MIT pragma solidity ^0.8.0; contract GovManager is Ownable, FirewallConsumer { event GovernorUpdated ( address indexed oldGovernor, address indexed newGovernor ); address public GovernorContract; modifier onlyOwnerOrGov() { require( msg.sender == owner() || msg.sender == GovernorContract, "Authorization Error" ); _; } function setGovernorContract(address _address) external firewallProtected onlyOwnerOrGov { address oldGov = GovernorContract; GovernorContract = _address; emit GovernorUpdated(oldGov, GovernorContract); } constructor() { GovernorContract = address(0); } } // File @poolzfinance/poolz-helper-v2/contracts/interfaces/[email protected] // Original license: SPDX_License_Identifier: MIT pragma solidity ^0.8.0; //For whitelist, interface IWhiteList { function Check(address _Subject, uint256 _Id) external view returns(uint); function Register(address _Subject,uint256 _Id,uint256 _Amount) external; function LastRoundRegister(address _Subject,uint256 _Id) external; function CreateManualWhiteList(uint256 _ChangeUntil, address _Contract) external payable returns(uint256 Id); function ChangeCreator(uint256 _Id, address _NewCreator) external; function AddAddress(uint256 _Id, address[] calldata _Users, uint256[] calldata _Amount) external; function RemoveAddress(uint256 _Id, address[] calldata _Users) external; } // File @poolzfinance/poolz-helper-v2/contracts/Fee/[email protected] // Original license: SPDX_License_Identifier: MIT pragma solidity ^0.8.0; abstract contract WhiteListHelper is GovManager { error WhiteListNotSet(); uint public WhiteListId; address public WhiteListAddress; modifier WhiteListSet { if(WhiteListAddress == address(0) || WhiteListId == 0) revert WhiteListNotSet(); _; } function getCredits(address _user) public view returns(uint) { if(WhiteListAddress == address(0) || WhiteListId == 0) return 0; return IWhiteList(WhiteListAddress).Check(_user, WhiteListId); } function setupNewWhitelist(address _whiteListAddress) external firewallProtected onlyOwnerOrGov { WhiteListAddress = _whiteListAddress; WhiteListId = IWhiteList(_whiteListAddress).CreateManualWhiteList(type(uint256).max, address(this)); } function addUsers(address[] calldata _users, uint256[] calldata _credits) external firewallProtected onlyOwnerOrGov WhiteListSet { IWhiteList(WhiteListAddress).AddAddress(WhiteListId, _users, _credits); } function removeUsers(address[] calldata _users) external firewallProtected onlyOwnerOrGov WhiteListSet { IWhiteList(WhiteListAddress).RemoveAddress(WhiteListId, _users); } function _whiteListRegister(address _user, uint _credits) internal { IWhiteList(WhiteListAddress).Register(_user, WhiteListId, _credits); } } // File @poolzfinance/poolz-helper-v2/contracts/Fee/[email protected] // Original license: SPDX_License_Identifier: MIT pragma solidity ^0.8.0; abstract contract FeeBaseHelper is ERC20Helper, WhiteListHelper { event TransferInETH(uint Amount, address From); event NewFeeAmount(uint NewFeeAmount, uint OldFeeAmount); event NewFeeToken(address NewFeeToken, address OldFeeToken); error NotEnoughFeeProvided(); error FeeAmountIsZero(); error TransferFailed(); uint public FeeAmount; address public FeeToken; mapping(address => uint) public FeeReserve; function TakeFee() internal virtual firewallProtected returns(uint feeToPay){ feeToPay = FeeAmount; if(feeToPay == 0) return 0; uint credits = getCredits(msg.sender); if(credits > 0) { _whiteListRegister(msg.sender, credits < feeToPay ? credits : feeToPay); if(credits < feeToPay) { feeToPay -= credits; } else { return 0; } } _TakeFee(feeToPay); } function _TakeFee(uint _fee) private { address _feeToken = FeeToken; // cache storage reads if (_feeToken == address(0)) { if (msg.value < _fee) revert NotEnoughFeeProvided(); emit TransferInETH(msg.value, msg.sender); } else { TransferInToken(_feeToken, msg.sender, _fee); } FeeReserve[_feeToken] += _fee; } function setFee(address _token, uint _amount) external firewallProtected onlyOwnerOrGov { FeeToken = _token; FeeAmount = _amount; } function WithdrawFee(address _token, address _to) external firewallProtected onlyOwnerOrGov { if (FeeReserve[_token] == 0) revert FeeAmountIsZero(); uint feeAmount = FeeReserve[_token]; FeeReserve[_token] = 0; if (_token == address(0)) { (bool success, ) = _to.call{value: feeAmount}(""); if (!success) revert TransferFailed(); } else { TransferToken(_token, _to, feeAmount); } } } // File contracts/MultiManageable.sol // Original license: SPDX_License_Identifier: MIT pragma solidity ^0.8.0; /// @title MultiManageable: An abstract contract for managing MultiSenderV2 with administrative controls abstract contract MultiManageable is FeeBaseHelper, Pausable { event MultiTransferredERC20( address indexed token, uint256 indexed userCount, uint256 indexed totalAmount ); event MultiTransferredETH(uint256 indexed userCount, uint256 indexed totalAmount); error ETHTransferFail(address user, uint amount); error ArrayZeroLength(); error NoZeroAddress(); error TotalMismatch(uint amountProvided, uint amountRequired); struct MultiSendData { address user; uint amount; } /// @notice Ensures token is not paused and the address is not zero before proceeding /// @dev Modifier that calls `_baseStartUp` with token address checks modifier erc20FullCheck(address _token) { _baseStartUp(_token); _; } /// @notice Starts base operations, checks for paused state and zero address, and takes fee /// @dev Private function called by the `erc20FullCheck` modifier function _baseStartUp(address _token) private whenNotPaused { if (_token == address(0)) revert NoZeroAddress(); TakeFee(); } /// @notice Checks if a number is not zero, returns the same number if true /// @dev Internal pure function for validating non-zero values function _notZero( uint256 _number ) internal pure returns (uint256 _sameNumber) { if (_number == 0) revert ArrayZeroLength(); return _number; } /// @notice Validates that the value after fee deduction matches the expected value /// @dev Takes a fee and compares the provided value with transaction value minus the fee function _validateValueAfterFee(uint _value) internal { uint feeTaken = TakeFee(); _validateEqual(_value, msg.value - feeTaken); } /// @notice Validates that two values are equal, reverts if not /// @dev Internal pure function for value comparison function _validateEqual(uint _value, uint _value2) internal pure { if (_value != _value2) revert TotalMismatch(_value2, _value); } /// @notice Transfers ETH based on `MultiSendData` /// @dev Wraps `_sendETH` call to provide value return function _sendETH( MultiSendData calldata _multiSendData ) internal returns (uint value) { _sendETH(_multiSendData.user, _multiSendData.amount); return _multiSendData.amount; } /// @notice Calls ERC20 `transferFrom` to collect tokens before distribution /// @dev Allows contract to collect the specified amount of ERC20 tokens from the sender function _getERC20(address _token, uint _amount) internal { IERC20(_token).transferFrom(msg.sender, address(this), _amount); } /// @notice Transfers ERC20 tokens based on `MultiSendData` /// @dev Wraps `_sendERC20` call to provide value return function _sendERC20( address _token, MultiSendData calldata _multiSendData ) internal returns (uint value) { _sendERC20(_token, _multiSendData.user, _multiSendData.amount); return _multiSendData.amount; } /// @notice Directly transfers ERC20 tokens to a user /// @dev Uses ERC20 `transfer` to send specified amount to user function _sendERC20(address _token, address _user, uint _amount) internal { IERC20(_token).transfer(_user, _amount); } /// @notice Transfers ERC20 tokens from sender to recipient based on `MultiSendData` /// @dev Wraps `_sendERC20From` call for direct use in other functions function _sendERC20From( address _token, MultiSendData calldata _multiSendData ) internal returns (uint value) { _sendERC20From(_token, _multiSendData.user, _multiSendData.amount); return _multiSendData.amount; } /// @notice Allows contract to transfer ERC20 tokens from sender to a specified recipient /// @dev Uses ERC20 `transferFrom` for token distribution function _sendERC20From( address _token, address _to, uint _amount ) internal { IERC20(_token).transferFrom(msg.sender, _to, _amount); } /// @notice Sends ETH to a specified address, reverts on failure /// @dev Performs a low-level call to transfer ETH and handle failure function _sendETH(address _user, uint _amount) internal { (bool success, ) = _user.call{value: _amount}(""); if (!success) revert ETHTransferFail(_user, _amount); } /// @notice Pauses the contract, disabling certain functions /// @dev Only callable by the owner or governance, wraps OpenZeppelin's `_pause` function Pause() external onlyOwnerOrGov { _pause(); } /// @notice Unpauses the contract, re-enabling certain functions /// @dev Only callable by the owner or governance, wraps OpenZeppelin's `_unpause` function Unpause() external onlyOwnerOrGov { _unpause(); } } // File contracts/MultiSenderETH.sol // Original license: SPDX_License_Identifier: MIT pragma solidity ^0.8.0; /// @title Main multi transfer settings contract /// @dev Extends `MultiManageable` to enable multi-sending of ETH with various utilities. /// @author The-Poolz contract team contract MultiSenderETH is MultiManageable { /// @notice Sends ETH to multiple addresses with different amounts. /// @dev Iterates over the `_multiSendData` array, sending ETH to each specified address. /// Requires the contract not to be paused. /// @param _multiSendData An array of `MultiSendData` structs, each containing an address and the amount of ETH to send. /// @return sum The total amount of ETH sent. function MultiSendETH( MultiSendData[] calldata _multiSendData ) external payable whenNotPaused returns (uint256 sum) { uint length = _notZero(_multiSendData.length); for (uint256 i; i < length; ) { MultiSendData calldata data = _multiSendData[i]; sum += _sendETH(data); unchecked { ++i; } } _validateValueAfterFee(sum); emit MultiTransferredETH(length, sum); } /// @notice Sends the same amount of ETH to multiple addresses. /// @dev Iterates over the `_users` array, sending the specified `_amount` of ETH to each. /// Requires the contract not to be paused. /// @param _users An array of addresses to receive ETH. /// @param _amount The amount of ETH to send to each address. function MultiSendETHSameValue( address[] calldata _users, uint _amount ) external payable whenNotPaused { uint length = _notZero(_users.length); _validateValueAfterFee(_amount * length); for (uint256 i; i < length; ) { address user = _users[i]; _sendETH(user, _amount); unchecked { ++i; } } emit MultiTransferredETH(length, _amount * length); } } // File contracts/MultiSenderERC20Direct.sol // Original license: SPDX_License_Identifier: MIT pragma solidity ^0.8.0; /// @title A contract for batch sending ERC20 tokens directly to multiple addresses /// @notice This contract extends MultiSenderETH to support direct ERC20 token transfers, where token are sent from the sender directly to recipients /// @author The-Poolz contract team contract MultiSenderERC20Direct is MultiSenderETH { /// @notice Sends specified amounts of an ERC20 token to multiple addresses /// @param _token The ERC20 token address to send /// @param _multiSendData An array of `MultiSendData` structs containing recipient addresses and amounts /// @return sum The total amount of tokens sent /// @dev Emits a `MultiTransferredERC20` event upon completion function MultiSendERC20Direct( address _token, MultiSendData[] calldata _multiSendData ) external payable erc20FullCheck(_token) returns (uint256 sum) { uint length = _notZero(_multiSendData.length); for (uint256 i; i < length; ) { MultiSendData calldata data = _multiSendData[i]; sum += _sendERC20From(_token, data); unchecked { ++i; } } emit MultiTransferredERC20(_token, length, sum); } /// @notice Sends the same amount of an ERC20 token to multiple addresses /// @param _token The ERC20 token address to send /// @param _users An array of recipient addresses /// @param _amount The amount of tokens to send to each address /// @dev Emits a `MultiTransferredERC20` event upon completion with the total tokens sent function MultiSendERC20DirectSameValue( address _token, address[] calldata _users, uint _amount ) external payable erc20FullCheck(_token) { uint length = _notZero(_users.length); for (uint256 i; i < length; ) { address user = _users[i]; _sendERC20From(_token, user, _amount); unchecked { ++i; } } emit MultiTransferredERC20(_token, length, _amount * length); } } // File contracts/MultiSender.sol // Original license: SPDX_License_Identifier: MIT pragma solidity ^0.8.0; /// @title A contract for batch sending ERC20 tokens indirectly to multiple addresses /// @notice This contract extends MultiSenderERC20Direct to support indirect ERC20 token transfers, where tokens are first collected from the sender then distributed /// @author The-Poolz contract team contract MultiSenderV2 is MultiSenderERC20Direct { /// @notice Collects a specified total amount of ERC20 tokens from the sender and sends varying amounts to multiple addresses /// @param _token The ERC20 token address to be sent /// @param _totalAmount The total amount of ERC20 tokens to collect from the sender /// @param _multiSendData An array of `MultiSendData` structs containing recipient addresses and amounts /// @return sum The total amount of tokens distributed /// @dev Ensures the total collected amount equals the sum of individual amounts sent; emits a `MultiTransferredERC20` event function MultiSendERC20Indirect( address _token, uint256 _totalAmount, MultiSendData[] calldata _multiSendData ) external payable erc20FullCheck(_token) returns (uint256 sum) { uint length = _notZero(_multiSendData.length); _getERC20(_token, _totalAmount); for (uint256 i; i < length; ) { MultiSendData calldata data = _multiSendData[i]; sum += _sendERC20(_token, data); unchecked { ++i; } } _validateEqual(sum, _totalAmount); emit MultiTransferredERC20(_token, length, sum); } /// @notice Collects a total amount of ERC20 tokens from the sender based on a fixed amount per recipient, and sends this amount to each address /// @param _token The ERC20 token address to be sent /// @param _users An array of recipient addresses /// @param _amount The amount of tokens to send to each address /// @dev Calculates the total amount by multiplying the number of users by the fixed amount; emits a `MultiTransferredERC20` event function MultiSendERC20IndirectSameValue( address _token, address[] calldata _users, uint _amount ) external payable erc20FullCheck(_token) { uint length = _notZero(_users.length); uint sum = _amount * length; _getERC20(_token, sum); for (uint256 i; i < length; ) { address user = _users[i]; _sendERC20(_token, user, _amount); unchecked{ ++i; } } emit MultiTransferredERC20(_token, length, sum); } }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"inputs":[],"name":"ArrayZeroLength","type":"error"},{"inputs":[{"internalType":"address","name":"user","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"ETHTransferFail","type":"error"},{"inputs":[],"name":"FeeAmountIsZero","type":"error"},{"inputs":[],"name":"NoZeroAddress","type":"error"},{"inputs":[],"name":"NotEnoughFeeProvided","type":"error"},{"inputs":[{"internalType":"uint256","name":"amountProvided","type":"uint256"},{"internalType":"uint256","name":"amountRequired","type":"uint256"}],"name":"TotalMismatch","type":"error"},{"inputs":[],"name":"TransferFailed","type":"error"},{"inputs":[],"name":"WhiteListNotSet","type":"error"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"oldGovernor","type":"address"},{"indexed":true,"internalType":"address","name":"newGovernor","type":"address"}],"name":"GovernorUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"token","type":"address"},{"indexed":true,"internalType":"uint256","name":"userCount","type":"uint256"},{"indexed":true,"internalType":"uint256","name":"totalAmount","type":"uint256"}],"name":"MultiTransferredERC20","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"userCount","type":"uint256"},{"indexed":true,"internalType":"uint256","name":"totalAmount","type":"uint256"}],"name":"MultiTransferredETH","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"NewFeeAmount","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"OldFeeAmount","type":"uint256"}],"name":"NewFeeAmount","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"NewFeeToken","type":"address"},{"indexed":false,"internalType":"address","name":"OldFeeToken","type":"address"}],"name":"NewFeeToken","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":false,"internalType":"uint256","name":"Amount","type":"uint256"},{"indexed":false,"internalType":"address","name":"From","type":"address"},{"indexed":false,"internalType":"address","name":"Token","type":"address"}],"name":"TransferIn","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"Amount","type":"uint256"},{"indexed":false,"internalType":"address","name":"From","type":"address"}],"name":"TransferInETH","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"Amount","type":"uint256"},{"indexed":false,"internalType":"address","name":"To","type":"address"},{"indexed":false,"internalType":"address","name":"Token","type":"address"}],"name":"TransferOut","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"account","type":"address"}],"name":"Unpaused","type":"event"},{"inputs":[],"name":"FeeAmount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"FeeReserve","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"FeeToken","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"GovernorContract","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_token","type":"address"},{"components":[{"internalType":"address","name":"user","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"internalType":"struct MultiManageable.MultiSendData[]","name":"_multiSendData","type":"tuple[]"}],"name":"MultiSendERC20Direct","outputs":[{"internalType":"uint256","name":"sum","type":"uint256"}],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"_token","type":"address"},{"internalType":"address[]","name":"_users","type":"address[]"},{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"MultiSendERC20DirectSameValue","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"_token","type":"address"},{"internalType":"uint256","name":"_totalAmount","type":"uint256"},{"components":[{"internalType":"address","name":"user","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"internalType":"struct MultiManageable.MultiSendData[]","name":"_multiSendData","type":"tuple[]"}],"name":"MultiSendERC20Indirect","outputs":[{"internalType":"uint256","name":"sum","type":"uint256"}],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"_token","type":"address"},{"internalType":"address[]","name":"_users","type":"address[]"},{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"MultiSendERC20IndirectSameValue","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"components":[{"internalType":"address","name":"user","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"internalType":"struct MultiManageable.MultiSendData[]","name":"_multiSendData","type":"tuple[]"}],"name":"MultiSendETH","outputs":[{"internalType":"uint256","name":"sum","type":"uint256"}],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address[]","name":"_users","type":"address[]"},{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"MultiSendETHSameValue","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"Pause","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"Unpause","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"WhiteListAddress","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"WhiteListId","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_token","type":"address"},{"internalType":"address","name":"_to","type":"address"}],"name":"WithdrawFee","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"acceptFirewallAdmin","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address[]","name":"_users","type":"address[]"},{"internalType":"uint256[]","name":"_credits","type":"uint256[]"}],"name":"addUsers","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"firewallAdmin","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_user","type":"address"}],"name":"getCredits","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"paused","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address[]","name":"_users","type":"address[]"}],"name":"removeUsers","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"target","type":"address"},{"internalType":"bytes","name":"targetPayload","type":"bytes"},{"internalType":"bytes","name":"data","type":"bytes"}],"name":"safeFunctionCall","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"target","type":"address"},{"internalType":"bool","name":"status","type":"bool"}],"name":"setApprovedTarget","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_token","type":"address"},{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"setFee","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_firewall","type":"address"}],"name":"setFirewall","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_firewallAdmin","type":"address"}],"name":"setFirewallAdmin","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_address","type":"address"}],"name":"setGovernorContract","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_whiteListAddress","type":"address"}],"name":"setupNewWhitelist","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"}]
Contract Creation Code
60806040523480156200001157600080fd5b506000336200002081620000ae565b620000566200005160017f5dd2e3b890564a8f99f7f203f226a27a8aa59aee19a4ece5cf5eaa77ab91f662620000fe565b839055565b6200008c6200008760017f29982a6ac507a2a707ced6dee5d76285dd49725db977de83d9702c628c974136620000fe565b829055565b5050600180546001600160a01b03191690556007805460ff1916905562000126565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b818103818111156200012057634e487b7160e01b600052601160045260246000fd5b92915050565b61367180620001366000396000f3fe6080604052600436106101d85760003560e01c80637c65c38b11610102578063b7f9a74811610095578063e55156b511610064578063e55156b5146104e7578063e76bb75614610507578063f05c85821461051d578063f2fde38b1461053257600080fd5b8063b7f9a74814610474578063be256bfb14610494578063db16cfb0146104b4578063dede40a7146104c757600080fd5b80638da5cb5b116100d15780638da5cb5b1461040d57806391cdd78b1461042b578063933454991461044b5780639b87893d1461045e57600080fd5b80637c65c38b146103a55780638447b23b146103ba5780638baa9f9c146103cd5780638c36d02d146103ed57600080fd5b80635620a94b1161017a578063716f20f911610149578063716f20f91461033d578063734b7198146103505780637805862f146103705780637a14583a1461038557600080fd5b80635620a94b146102dd5780635c975abb146102f05780636985a02214610313578063715018a61461032857600080fd5b80632f8f1328116101b65780632f8f1328146102325780633ae4f003146102725780633b66e9f614610285578063481531e9146102a557600080fd5b806306c49822146101dd5780631a8828f4146101ff5780632be4a90314610212575b600080fd5b3480156101e957600080fd5b506101fd6101f8366004612e5c565b610552565b005b6101fd61020d366004612ec0565b610796565b34801561021e57600080fd5b506101fd61022d366004612f86565b61091e565b34801561023e57600080fd5b5061025f61024d366004612e5c565b60066020526000908152604090205481565b6040519081526020015b60405180910390f35b6101fd610280366004612fc8565b610bbc565b34801561029157600080fd5b5061025f6102a0366004612e5c565b610c54565b3480156102b157600080fd5b506005546102c5906001600160a01b031681565b6040516001600160a01b039091168152602001610269565b6101fd6102eb366004612fc8565b610cfa565b3480156102fc57600080fd5b5060075460ff166040519015158152602001610269565b34801561031f57600080fd5b506101fd610da3565b34801561033457600080fd5b506101fd610dec565b6101fd61034b366004613022565b610dfe565b34801561035c57600080fd5b506101fd61036b366004612e5c565b610eaa565b34801561037c57600080fd5b506101fd610f82565b34801561039157600080fd5b506001546102c5906001600160a01b031681565b3480156103b157600080fd5b506101fd610fc9565b61025f6103c83660046130b3565b611078565b3480156103d957600080fd5b506101fd6103e83660046130e9565b611111565b3480156103f957600080fd5b506101fd610408366004612e5c565b611434565b34801561041957600080fd5b506000546001600160a01b03166102c5565b34801561043757600080fd5b506003546102c5906001600160a01b031681565b61025f61045936600461311c565b61149c565b34801561046a57600080fd5b5061025f60045481565b34801561048057600080fd5b506101fd61048f36600461317d565b61152a565b3480156104a057600080fd5b506101fd6104af3660046131b4565b6115e0565b61025f6104c2366004613220565b6118b4565b3480156104d357600080fd5b506101fd6104e2366004612e5c565b611957565b3480156104f357600080fd5b506101fd61050236600461326e565b611bc9565b34801561051357600080fd5b5061025f60025481565b34801561052957600080fd5b506102c5611d6a565b34801561053e57600080fd5b506101fd61054d366004612e5c565b611d8d565b600061057461057060016000805160206135d58339815191526132ae565b5490565b90506001600160a01b03811661061f576000546001600160a01b03163314806105a757506001546001600160a01b031633145b6105cc5760405162461bcd60e51b81526004016105c3906132c1565b60405180910390fd5b600180546001600160a01b038481166001600160a01b0319831681179093556040519116919082907f5af6a85e864342d4f108c43dd574d98480c91f1de0ac2a9f66d826dee49bd9bb90600090a3505050565b604051631bf8659f60e21b815234906001600160a01b03831690636fe1967c90610654903390600090369087906004016132ee565b600060405180830381600087803b15801561066e57600080fd5b505af1158015610682573d6000803e3d6000fd5b505050506106986000546001600160a01b031690565b6001600160a01b0316336001600160a01b031614806106c157506001546001600160a01b031633145b6106dd5760405162461bcd60e51b81526004016105c3906132c1565b600180546001600160a01b038581166001600160a01b0319831681179093556040519116919082907f5af6a85e864342d4f108c43dd574d98480c91f1de0ac2a9f66d826dee49bd9bb90600090a3506040516393163a9160e01b81526001600160a01b038316906393163a919061075f903390600090369087906004016132ee565b600060405180830381600087803b15801561077957600080fd5b505af115801561078d573d6000803e3d6000fd5b50505050505050565b8460006107c460017fbee718c342db2a725c831b0c655757cef911f31a4454aacc1b8b75f39bda09a96132ae565b6040805160208101929092526001600160a01b0384169082015260600160405160208183030381529060405280519060200120905060008060001b610807835490565b14159050806108665760405162461bcd60e51b815260206004820152602560248201527f4669726577616c6c436f6e73756d65723a204e6f7420617070726f7665642074604482015264185c99d95d60da1b60648201526084016105c3565b6000886001600160a01b03168888604051610882929190613338565b6000604051808303816000865af19150503d80600081146108bf576040519150601f19603f3d011682016040523d82523d6000602084013e6108c4565b606091505b50509050806108d257600080fd5b6109123087878080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250611e0392505050565b50505050505050505050565b600061093c61057060016000805160206135d58339815191526132ae565b90506001600160a01b0381166109f6576000546001600160a01b031633148061096f57506001546001600160a01b031633145b61098b5760405162461bcd60e51b81526004016105c3906132c1565b6003546001600160a01b031615806109a35750600254155b156109c1576040516363af9b0360e11b815260040160405180910390fd5b6003546002546040516301ad22f960e01b81526001600160a01b03909216916301ad22f99161075f918790879060040161338f565b604051631bf8659f60e21b815234906001600160a01b03831690636fe1967c90610a2b903390600090369087906004016132ee565b600060405180830381600087803b158015610a4557600080fd5b505af1158015610a59573d6000803e3d6000fd5b50505050610a6f6000546001600160a01b031690565b6001600160a01b0316336001600160a01b03161480610a9857506001546001600160a01b031633145b610ab45760405162461bcd60e51b81526004016105c3906132c1565b6003546001600160a01b03161580610acc5750600254155b15610aea576040516363af9b0360e11b815260040160405180910390fd5b6003546002546040516301ad22f960e01b81526001600160a01b03909216916301ad22f991610b1f918890889060040161338f565b600060405180830381600087803b158015610b3957600080fd5b505af1158015610b4d573d6000803e3d6000fd5b50506040516393163a9160e01b81526001600160a01b03851692506393163a919150610b84903390600090369087906004016132ee565b600060405180830381600087803b158015610b9e57600080fd5b505af1158015610bb2573d6000803e3d6000fd5b5050505050505050565b83610bc681611e2f565b6000610bd184611e6a565b905060005b81811015610c1d576000868683818110610bf257610bf26133b2565b9050602002016020810190610c079190612e5c565b9050610c14888287611e91565b50600101610bd6565b50610c2881846133c8565b60405182906001600160a01b038916906000805160206135b583398151915290600090a4505050505050565b6003546000906001600160a01b03161580610c6f5750600254155b15610c7c57506000919050565b60035460025460405163cc44919b60e01b81526001600160a01b038581166004830152602482019290925291169063cc44919b90604401602060405180830381865afa158015610cd0573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610cf491906133df565b92915050565b83610d0481611e2f565b6000610d0f84611e6a565b90506000610d1d82856133c8565b9050610d298782611f0b565b60005b82811015610d73576000878783818110610d4857610d486133b2565b9050602002016020810190610d5d9190612e5c565b9050610d6a898288611f87565b50600101610d2c565b508082886001600160a01b03166000805160206135b583398151915260405160405180910390a450505050505050565b6000546001600160a01b0316331480610dc657506001546001600160a01b031633145b610de25760405162461bcd60e51b81526004016105c3906132c1565b610dea611fbc565b565b610df4612016565b610dea6000612070565b610e066120c0565b6000610e1183611e6a565b9050610e25610e2082846133c8565b612106565b60005b81811015610e6e576000858583818110610e4457610e446133b2565b9050602002016020810190610e599190612e5c565b9050610e658185612125565b50600101610e28565b50610e7981836133c8565b60405182907f0e5fe6f6a28b4cdb21bb2673b7ff7c8695a8463d5dd0b00b888026def1ea11d490600090a350505050565b610ec6610570600160008051602061361c8339815191526132ae565b6001600160a01b0316336001600160a01b031614610ef65760405162461bcd60e51b81526004016105c3906133f8565b6001600160a01b038116610f4c5760405162461bcd60e51b815260206004820152601e60248201527f4669726577616c6c436f6e73756d65723a207a65726f2061646472657373000060448201526064016105c3565b610f7f610f7a60017f8583d637b7eb6415d11ef26648cf0702cf161a357dfe51b6ff7a332110d4bdd36132ae565b829055565b50565b6000546001600160a01b0316331480610fa557506001546001600160a01b031633145b610fc15760405162461bcd60e51b81526004016105c3906132c1565b610dea6121ab565b610ff761057060017f8583d637b7eb6415d11ef26648cf0702cf161a357dfe51b6ff7a332110d4bdd36132ae565b6001600160a01b0316336001600160a01b0316146110575760405162461bcd60e51b815260206004820152601f60248201527f4669726577616c6c436f6e73756d65723a206e6f74206e65772061646d696e0060448201526064016105c3565b610dea611073600160008051602061361c8339815191526132ae565b339055565b60006110826120c0565b600061108d83611e6a565b905060005b818110156110d357368585838181106110ad576110ad6133b2565b90506040020190506110be816121e4565b6110c8908561343c565b935050600101611092565b506110dd82612106565b604051829082907f0e5fe6f6a28b4cdb21bb2673b7ff7c8695a8463d5dd0b00b888026def1ea11d490600090a35092915050565b600061112f61057060016000805160206135d58339815191526132ae565b90506001600160a01b038116611263576000546001600160a01b031633148061116257506001546001600160a01b031633145b61117e5760405162461bcd60e51b81526004016105c3906132c1565b6001600160a01b03831660009081526006602052604081205490036111b657604051633027fed560e01b815260040160405180910390fd5b6001600160a01b0383166000818152600660205260408120805491905590611252576000836001600160a01b03168260405160006040518083038185875af1925050503d8060008114611225576040519150601f19603f3d011682016040523d82523d6000602084013e61122a565b606091505b505090508061124c576040516312171d8360e31b815260040160405180910390fd5b5061125d565b61125d848483612208565b50505050565b604051631bf8659f60e21b815234906001600160a01b03831690636fe1967c90611298903390600090369087906004016132ee565b600060405180830381600087803b1580156112b257600080fd5b505af11580156112c6573d6000803e3d6000fd5b505050506112dc6000546001600160a01b031690565b6001600160a01b0316336001600160a01b0316148061130557506001546001600160a01b031633145b6113215760405162461bcd60e51b81526004016105c3906132c1565b6001600160a01b038416600090815260066020526040812054900361135957604051633027fed560e01b815260040160405180910390fd5b6001600160a01b03841660008181526006602052604081208054919055906113f5576000846001600160a01b03168260405160006040518083038185875af1925050503d80600081146113c8576040519150601f19603f3d011682016040523d82523d6000602084013e6113cd565b606091505b50509050806113ef576040516312171d8360e31b815260040160405180910390fd5b50611400565b611400858583612208565b506040516393163a9160e01b81526001600160a01b038316906393163a9190610b84903390600090369087906004016132ee565b611450610570600160008051602061361c8339815191526132ae565b6001600160a01b0316336001600160a01b0316146114805760405162461bcd60e51b81526004016105c3906133f8565b610f7f610f7a60016000805160206135d58339815191526132ae565b6000836114a881611e2f565b60006114b384611e6a565b905060005b818110156114fa57368686838181106114d3576114d36133b2565b90506040020190506114e5888261269d565b6114ef908661343c565b9450506001016114b8565b508281876001600160a01b03166000805160206135b583398151915260405160405180910390a450509392505050565b611546610570600160008051602061361c8339815191526132ae565b6001600160a01b0316336001600160a01b0316146115765760405162461bcd60e51b81526004016105c3906133f8565b60006115a360017fbee718c342db2a725c831b0c655757cef911f31a4454aacc1b8b75f39bda09a96132ae565b6040805160208101929092526001600160a01b03851690820152606001604051602081830303815290604052805190602001209050818155505050565b60006115fe61057060016000805160206135d58339815191526132ae565b90506001600160a01b0381166116f4576000546001600160a01b031633148061163157506001546001600160a01b031633145b61164d5760405162461bcd60e51b81526004016105c3906132c1565b6003546001600160a01b031615806116655750600254155b15611683576040516363af9b0360e11b815260040160405180910390fd5b600354600254604051635c989d4960e11b81526001600160a01b039092169163b9313a92916116bc91899089908990899060040161344f565b600060405180830381600087803b1580156116d657600080fd5b505af11580156116ea573d6000803e3d6000fd5b505050505061125d565b604051631bf8659f60e21b815234906001600160a01b03831690636fe1967c90611729903390600090369087906004016132ee565b600060405180830381600087803b15801561174357600080fd5b505af1158015611757573d6000803e3d6000fd5b5050505061176d6000546001600160a01b031690565b6001600160a01b0316336001600160a01b0316148061179657506001546001600160a01b031633145b6117b25760405162461bcd60e51b81526004016105c3906132c1565b6003546001600160a01b031615806117ca5750600254155b156117e8576040516363af9b0360e11b815260040160405180910390fd5b600354600254604051635c989d4960e11b81526001600160a01b039092169163b9313a9291611821918a908a908a908a9060040161344f565b600060405180830381600087803b15801561183b57600080fd5b505af115801561184f573d6000803e3d6000fd5b50506040516393163a9160e01b81526001600160a01b03851692506393163a919150611886903390600090369087906004016132ee565b600060405180830381600087803b1580156118a057600080fd5b505af1158015610912573d6000803e3d6000fd5b6000846118c081611e2f565b60006118cb84611e6a565b90506118d78787611f0b565b60005b8181101561191c57368686838181106118f5576118f56133b2565b905060400201905061190789826126c4565b611911908661343c565b9450506001016118da565b5061192783876126e1565b8281886001600160a01b03166000805160206135b583398151915260405160405180910390a45050949350505050565b600061197561057060016000805160206135d58339815191526132ae565b90506001600160a01b038116611a50576000546001600160a01b03163314806119a857506001546001600160a01b031633145b6119c45760405162461bcd60e51b81526004016105c3906132c1565b600380546001600160a01b0319166001600160a01b0384169081179091556040516313d0ca6f60e21b81526000196004820152306024820152634f4329bc906044016020604051808303816000875af1158015611a25573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611a4991906133df565b6002555050565b604051631bf8659f60e21b815234906001600160a01b03831690636fe1967c90611a85903390600090369087906004016132ee565b600060405180830381600087803b158015611a9f57600080fd5b505af1158015611ab3573d6000803e3d6000fd5b50505050611ac96000546001600160a01b031690565b6001600160a01b0316336001600160a01b03161480611af257506001546001600160a01b031633145b611b0e5760405162461bcd60e51b81526004016105c3906132c1565b600380546001600160a01b0319166001600160a01b0385169081179091556040516313d0ca6f60e21b81526000196004820152306024820152634f4329bc906044016020604051808303816000875af1158015611b6f573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611b9391906133df565b6002556040516393163a9160e01b81526001600160a01b038316906393163a919061075f903390600090369087906004016132ee565b6000611be761057060016000805160206135d58339815191526132ae565b90506001600160a01b038116611c5d576000546001600160a01b0316331480611c1a57506001546001600160a01b031633145b611c365760405162461bcd60e51b81526004016105c3906132c1565b50600580546001600160a01b0319166001600160a01b039390931692909217909155600455565b604051631bf8659f60e21b815234906001600160a01b03831690636fe1967c90611c92903390600090369087906004016132ee565b600060405180830381600087803b158015611cac57600080fd5b505af1158015611cc0573d6000803e3d6000fd5b50505050611cd66000546001600160a01b031690565b6001600160a01b0316336001600160a01b03161480611cff57506001546001600160a01b031633145b611d1b5760405162461bcd60e51b81526004016105c3906132c1565b600580546001600160a01b0319166001600160a01b038681169190911790915560048481556040516393163a9160e01b8152918416916393163a9191610b8491339160009136918891016132ee565b6000611d88610570600160008051602061361c8339815191526132ae565b905090565b611d95612016565b6001600160a01b038116611dfa5760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b60648201526084016105c3565b610f7f81612070565b6060611e2883836040518060600160405280602781526020016135f56027913961270b565b9392505050565b611e376120c0565b6001600160a01b038116611e5e5760405163ddbadd5f60e01b815260040160405180910390fd5b611e66612783565b5050565b600081600003611e8d5760405163093ad0d360e21b815260040160405180910390fd5b5090565b6040516323b872dd60e01b81523360048201526001600160a01b038381166024830152604482018390528416906323b872dd906064015b6020604051808303816000875af1158015611ee7573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061125d91906134a2565b6040516323b872dd60e01b8152336004820152306024820152604481018290526001600160a01b038316906323b872dd906064016020604051808303816000875af1158015611f5e573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611f8291906134a2565b505050565b60405163a9059cbb60e01b81526001600160a01b0383811660048301526024820183905284169063a9059cbb90604401611ec8565b611fc46120c0565b6007805460ff191660011790557f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a258611ff93390565b6040516001600160a01b03909116815260200160405180910390a1565b6000546001600160a01b03163314610dea5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064016105c3565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b60075460ff1615610dea5760405162461bcd60e51b815260206004820152601060248201526f14185d5cd8589b194e881c185d5cd95960821b60448201526064016105c3565b6000612110612783565b9050611e668261212083346132ae565b6126e1565b6000826001600160a01b03168260405160006040518083038185875af1925050503d8060008114612172576040519150601f19603f3d011682016040523d82523d6000602084013e612177565b606091505b5050905080611f8257604051635a5e037360e11b81526001600160a01b0384166004820152602481018390526044016105c3565b6121b361295a565b6007805460ff191690557f5db9ee0a495bf2e6ff9c91a7834c1ba4fdd244a5e8aa4e537bd38aeae4b073aa33611ff9565b60006122006121f66020840184612e5c565b8360200135612125565b506020013590565b633844b70760e01b600061222e61057060016000805160206135d58339815191526132ae565b90506001600160a01b038116612404576040516370a0823160e01b81523060048201526000906001600160a01b038716906370a0823190602401602060405180830381865afa158015612285573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906122a991906133df565b604080518681526001600160a01b03888116602083015289168183015290519192507fe4d818e6f992efbd60db553f3edce819a199baec79a784b95c89bc8ee86f2584919081900360600190a160405163a9059cbb60e01b81526001600160a01b0386811660048301526024820186905287169063a9059cbb906044016020604051808303816000875af1158015612345573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061236991906134a2565b506040516370a0823160e01b8152306004820152819085906001600160a01b038916906370a0823190602401602060405180830381865afa1580156123b2573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906123d691906133df565b6123e0919061343c565b146123fd5760405162461bcd60e51b81526004016105c3906134bf565b505061125d565b604080516001600160e01b031984166020820152815160048183030181526024820192839052631bf8659f60e21b90925234916001600160a01b03841691636fe1967c91612459913391908690602801613551565b600060405180830381600087803b15801561247357600080fd5b505af1158015612487573d6000803e3d6000fd5b50506040516370a0823160e01b8152306004820152600092506001600160a01b03891691506370a0823190602401602060405180830381865afa1580156124d2573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906124f691906133df565b604080518781526001600160a01b0389811660208301528a168183015290519192507fe4d818e6f992efbd60db553f3edce819a199baec79a784b95c89bc8ee86f2584919081900360600190a160405163a9059cbb60e01b81526001600160a01b0387811660048301526024820187905288169063a9059cbb906044016020604051808303816000875af1158015612592573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906125b691906134a2565b506040516370a0823160e01b8152306004820152819086906001600160a01b038a16906370a0823190602401602060405180830381865afa1580156125ff573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061262391906133df565b61262d919061343c565b1461264a5760405162461bcd60e51b81526004016105c3906134bf565b50604080516001600160e01b0319851660208201528151600481830301815260248201928390526393163a9160e01b9092526001600160a01b038416916393163a91916118869133918690602801613551565b60006126ba836126b06020850185612e5c565b8460200135611e91565b5060200135919050565b60006126ba836126d76020850185612e5c565b8460200135611f87565b808214611e66576040516306f4750f60e41b815260048101829052602481018390526044016105c3565b6060600080856001600160a01b0316856040516127289190613585565b600060405180830381855af49150503d8060008114612763576040519150601f19603f3d011682016040523d82523d6000602084013e612768565b606091505b5091509150612779868383876129a3565b9695505050505050565b6000806127a261057060016000805160206135d58339815191526132ae565b90506001600160a01b038116612821576004549150816000036127c757600091505090565b60006127d233610c54565b90508015612813576127f1338483106127eb5784612a24565b82612a24565b8281101561280a5761280381846132ae565b9250612813565b60009250505090565b61281c83612a98565b505090565b604051631bf8659f60e21b815234906001600160a01b03831690636fe1967c90612856903390600090369087906004016132ee565b600060405180830381600087803b15801561287057600080fd5b505af1158015612884573d6000803e3d6000fd5b5050505060045492508260000361289e57600092506128f0565b60006128a933610c54565b905080156128e5576128c2338583106127eb5785612a24565b838110156128db576128d481856132ae565b93506128e5565b60009350506128f0565b6128ee84612a98565b505b6040516393163a9160e01b81526001600160a01b038316906393163a9190612923903390600090369087906004016132ee565b600060405180830381600087803b15801561293d57600080fd5b505af1158015612951573d6000803e3d6000fd5b50505050505090565b60075460ff16610dea5760405162461bcd60e51b815260206004820152601460248201527314185d5cd8589b194e881b9bdd081c185d5cd95960621b60448201526064016105c3565b60608315612a12578251600003612a0b576001600160a01b0385163b612a0b5760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e747261637400000060448201526064016105c3565b5081612a1c565b612a1c8383612b43565b949350505050565b600354600254604051630ebacfd960e11b81526001600160a01b038581166004830152602482019290925260448101849052911690631d759fb290606401600060405180830381600087803b158015612a7c57600080fd5b505af1158015612a90573d6000803e3d6000fd5b505050505050565b6005546001600160a01b031680612b075781341015612aca5760405163cc361e3d60e01b815260040160405180910390fd5b604080513481523360208201527f3a32cdd14cdfd431946dfa0b2aef5ace661340411aaadcaee6aef6738d302326910160405180910390a1612b12565b612b12813384612b6d565b6001600160a01b03811660009081526006602052604081208054849290612b3a90849061343c565b90915550505050565b815115612b535781518083602001fd5b8060405162461bcd60e51b81526004016105c391906135a1565b604051636eb1769f60e11b81526001600160a01b038084166004830152306024830152849184918491829185169063dd62ed3e90604401602060405180830381865afa158015612bc1573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612be591906133df565b1015612c335760405162461bcd60e51b815260206004820152601960248201527f455243323048656c7065723a206e6f20616c6c6f77616e63650000000000000060448201526064016105c3565b60008411612c4057600080fd5b6040516370a0823160e01b81523060048201526000906001600160a01b038816906370a0823190602401602060405180830381865afa158015612c87573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612cab91906133df565b6040516323b872dd60e01b81526001600160a01b03888116600483015230602483015260448201889052919250908816906323b872dd906064016020604051808303816000875af1158015612d04573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612d2891906134a2565b50604080518681526001600160a01b03888116602083015289168183015290517f1fecf4702e692891a7c2f0d328779b085efb5edd094fa5558bd5cd147a1679229181900360600190a16040516370a0823160e01b81523060048201526001600160a01b038816906370a0823190602401602060405180830381865afa158015612db6573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612dda91906133df565b612de4868361343c565b1461078d5760405162461bcd60e51b815260206004820152602660248201527f455243323048656c7065723a20526563656976656420496e636f727265637420604482015265105b5bdd5b9d60d21b60648201526084016105c3565b80356001600160a01b0381168114612e5757600080fd5b919050565b600060208284031215612e6e57600080fd5b611e2882612e40565b60008083601f840112612e8957600080fd5b50813567ffffffffffffffff811115612ea157600080fd5b602083019150836020828501011115612eb957600080fd5b9250929050565b600080600080600060608688031215612ed857600080fd5b612ee186612e40565b9450602086013567ffffffffffffffff80821115612efe57600080fd5b612f0a89838a01612e77565b90965094506040880135915080821115612f2357600080fd5b50612f3088828901612e77565b969995985093965092949392505050565b60008083601f840112612f5357600080fd5b50813567ffffffffffffffff811115612f6b57600080fd5b6020830191508360208260051b8501011115612eb957600080fd5b60008060208385031215612f9957600080fd5b823567ffffffffffffffff811115612fb057600080fd5b612fbc85828601612f41565b90969095509350505050565b60008060008060608587031215612fde57600080fd5b612fe785612e40565b9350602085013567ffffffffffffffff81111561300357600080fd5b61300f87828801612f41565b9598909750949560400135949350505050565b60008060006040848603121561303757600080fd5b833567ffffffffffffffff81111561304e57600080fd5b61305a86828701612f41565b909790965060209590950135949350505050565b60008083601f84011261308057600080fd5b50813567ffffffffffffffff81111561309857600080fd5b6020830191508360208260061b8501011115612eb957600080fd5b600080602083850312156130c657600080fd5b823567ffffffffffffffff8111156130dd57600080fd5b612fbc8582860161306e565b600080604083850312156130fc57600080fd5b61310583612e40565b915061311360208401612e40565b90509250929050565b60008060006040848603121561313157600080fd5b61313a84612e40565b9250602084013567ffffffffffffffff81111561315657600080fd5b6131628682870161306e565b9497909650939450505050565b8015158114610f7f57600080fd5b6000806040838503121561319057600080fd5b61319983612e40565b915060208301356131a98161316f565b809150509250929050565b600080600080604085870312156131ca57600080fd5b843567ffffffffffffffff808211156131e257600080fd5b6131ee88838901612f41565b9096509450602087013591508082111561320757600080fd5b5061321487828801612f41565b95989497509550505050565b6000806000806060858703121561323657600080fd5b61323f85612e40565b935060208501359250604085013567ffffffffffffffff81111561326257600080fd5b6132148782880161306e565b6000806040838503121561328157600080fd5b61328a83612e40565b946020939093013593505050565b634e487b7160e01b600052601160045260246000fd5b81810381811115610cf457610cf4613298565b60208082526013908201527220baba3437b934bd30ba34b7b71022b93937b960691b604082015260600190565b6001600160a01b038516815260606020820181905281018390528284608083013760006080848301015260006080601f19601f860116830101905082604083015295945050505050565b8183823760009101908152919050565b8183526000602080850194508260005b85811015613384576001600160a01b0361337183612e40565b1687529582019590820190600101613358565b509495945050505050565b8381526040602082015260006133a9604083018486613348565b95945050505050565b634e487b7160e01b600052603260045260246000fd5b8082028115828204841417610cf457610cf4613298565b6000602082840312156133f157600080fd5b5051919050565b60208082526024908201527f4669726577616c6c436f6e73756d65723a206e6f74206669726577616c6c20616040820152633236b4b760e11b606082015260800190565b80820180821115610cf457610cf4613298565b858152606060208201526000613469606083018688613348565b82810360408401528381526001600160fb1b0384111561348857600080fd5b8360051b8086602084013701602001979650505050505050565b6000602082840312156134b457600080fd5b8151611e288161316f565b60208082526022908201527f455243323048656c7065723a2073656e7420696e636f727265637420616d6f756040820152611b9d60f21b606082015260800190565b60005b8381101561351c578181015183820152602001613504565b50506000910152565b6000815180845261353d816020860160208601613501565b601f01601f19169290920160200192915050565b6001600160a01b038416815260606020820181905260009061357590830185613525565b9050826040830152949350505050565b60008251613597818460208701613501565b9190910192915050565b602081526000611e28602083018461352556febd92d122ffb1b8cecbdfdc76285b361b1ab09e8a58b0406b65326589ee1d65ef5dd2e3b890564a8f99f7f203f226a27a8aa59aee19a4ece5cf5eaa77ab91f662416464726573733a206c6f772d6c6576656c2064656c65676174652063616c6c206661696c656429982a6ac507a2a707ced6dee5d76285dd49725db977de83d9702c628c974136a264697066735822122057ba9d84968badcaf1be197d2b8395432838f82ae7d26ff0f8692b83a87f47b264736f6c63430008180033
Deployed Bytecode
0x6080604052600436106101d85760003560e01c80637c65c38b11610102578063b7f9a74811610095578063e55156b511610064578063e55156b5146104e7578063e76bb75614610507578063f05c85821461051d578063f2fde38b1461053257600080fd5b8063b7f9a74814610474578063be256bfb14610494578063db16cfb0146104b4578063dede40a7146104c757600080fd5b80638da5cb5b116100d15780638da5cb5b1461040d57806391cdd78b1461042b578063933454991461044b5780639b87893d1461045e57600080fd5b80637c65c38b146103a55780638447b23b146103ba5780638baa9f9c146103cd5780638c36d02d146103ed57600080fd5b80635620a94b1161017a578063716f20f911610149578063716f20f91461033d578063734b7198146103505780637805862f146103705780637a14583a1461038557600080fd5b80635620a94b146102dd5780635c975abb146102f05780636985a02214610313578063715018a61461032857600080fd5b80632f8f1328116101b65780632f8f1328146102325780633ae4f003146102725780633b66e9f614610285578063481531e9146102a557600080fd5b806306c49822146101dd5780631a8828f4146101ff5780632be4a90314610212575b600080fd5b3480156101e957600080fd5b506101fd6101f8366004612e5c565b610552565b005b6101fd61020d366004612ec0565b610796565b34801561021e57600080fd5b506101fd61022d366004612f86565b61091e565b34801561023e57600080fd5b5061025f61024d366004612e5c565b60066020526000908152604090205481565b6040519081526020015b60405180910390f35b6101fd610280366004612fc8565b610bbc565b34801561029157600080fd5b5061025f6102a0366004612e5c565b610c54565b3480156102b157600080fd5b506005546102c5906001600160a01b031681565b6040516001600160a01b039091168152602001610269565b6101fd6102eb366004612fc8565b610cfa565b3480156102fc57600080fd5b5060075460ff166040519015158152602001610269565b34801561031f57600080fd5b506101fd610da3565b34801561033457600080fd5b506101fd610dec565b6101fd61034b366004613022565b610dfe565b34801561035c57600080fd5b506101fd61036b366004612e5c565b610eaa565b34801561037c57600080fd5b506101fd610f82565b34801561039157600080fd5b506001546102c5906001600160a01b031681565b3480156103b157600080fd5b506101fd610fc9565b61025f6103c83660046130b3565b611078565b3480156103d957600080fd5b506101fd6103e83660046130e9565b611111565b3480156103f957600080fd5b506101fd610408366004612e5c565b611434565b34801561041957600080fd5b506000546001600160a01b03166102c5565b34801561043757600080fd5b506003546102c5906001600160a01b031681565b61025f61045936600461311c565b61149c565b34801561046a57600080fd5b5061025f60045481565b34801561048057600080fd5b506101fd61048f36600461317d565b61152a565b3480156104a057600080fd5b506101fd6104af3660046131b4565b6115e0565b61025f6104c2366004613220565b6118b4565b3480156104d357600080fd5b506101fd6104e2366004612e5c565b611957565b3480156104f357600080fd5b506101fd61050236600461326e565b611bc9565b34801561051357600080fd5b5061025f60025481565b34801561052957600080fd5b506102c5611d6a565b34801561053e57600080fd5b506101fd61054d366004612e5c565b611d8d565b600061057461057060016000805160206135d58339815191526132ae565b5490565b90506001600160a01b03811661061f576000546001600160a01b03163314806105a757506001546001600160a01b031633145b6105cc5760405162461bcd60e51b81526004016105c3906132c1565b60405180910390fd5b600180546001600160a01b038481166001600160a01b0319831681179093556040519116919082907f5af6a85e864342d4f108c43dd574d98480c91f1de0ac2a9f66d826dee49bd9bb90600090a3505050565b604051631bf8659f60e21b815234906001600160a01b03831690636fe1967c90610654903390600090369087906004016132ee565b600060405180830381600087803b15801561066e57600080fd5b505af1158015610682573d6000803e3d6000fd5b505050506106986000546001600160a01b031690565b6001600160a01b0316336001600160a01b031614806106c157506001546001600160a01b031633145b6106dd5760405162461bcd60e51b81526004016105c3906132c1565b600180546001600160a01b038581166001600160a01b0319831681179093556040519116919082907f5af6a85e864342d4f108c43dd574d98480c91f1de0ac2a9f66d826dee49bd9bb90600090a3506040516393163a9160e01b81526001600160a01b038316906393163a919061075f903390600090369087906004016132ee565b600060405180830381600087803b15801561077957600080fd5b505af115801561078d573d6000803e3d6000fd5b50505050505050565b8460006107c460017fbee718c342db2a725c831b0c655757cef911f31a4454aacc1b8b75f39bda09a96132ae565b6040805160208101929092526001600160a01b0384169082015260600160405160208183030381529060405280519060200120905060008060001b610807835490565b14159050806108665760405162461bcd60e51b815260206004820152602560248201527f4669726577616c6c436f6e73756d65723a204e6f7420617070726f7665642074604482015264185c99d95d60da1b60648201526084016105c3565b6000886001600160a01b03168888604051610882929190613338565b6000604051808303816000865af19150503d80600081146108bf576040519150601f19603f3d011682016040523d82523d6000602084013e6108c4565b606091505b50509050806108d257600080fd5b6109123087878080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250611e0392505050565b50505050505050505050565b600061093c61057060016000805160206135d58339815191526132ae565b90506001600160a01b0381166109f6576000546001600160a01b031633148061096f57506001546001600160a01b031633145b61098b5760405162461bcd60e51b81526004016105c3906132c1565b6003546001600160a01b031615806109a35750600254155b156109c1576040516363af9b0360e11b815260040160405180910390fd5b6003546002546040516301ad22f960e01b81526001600160a01b03909216916301ad22f99161075f918790879060040161338f565b604051631bf8659f60e21b815234906001600160a01b03831690636fe1967c90610a2b903390600090369087906004016132ee565b600060405180830381600087803b158015610a4557600080fd5b505af1158015610a59573d6000803e3d6000fd5b50505050610a6f6000546001600160a01b031690565b6001600160a01b0316336001600160a01b03161480610a9857506001546001600160a01b031633145b610ab45760405162461bcd60e51b81526004016105c3906132c1565b6003546001600160a01b03161580610acc5750600254155b15610aea576040516363af9b0360e11b815260040160405180910390fd5b6003546002546040516301ad22f960e01b81526001600160a01b03909216916301ad22f991610b1f918890889060040161338f565b600060405180830381600087803b158015610b3957600080fd5b505af1158015610b4d573d6000803e3d6000fd5b50506040516393163a9160e01b81526001600160a01b03851692506393163a919150610b84903390600090369087906004016132ee565b600060405180830381600087803b158015610b9e57600080fd5b505af1158015610bb2573d6000803e3d6000fd5b5050505050505050565b83610bc681611e2f565b6000610bd184611e6a565b905060005b81811015610c1d576000868683818110610bf257610bf26133b2565b9050602002016020810190610c079190612e5c565b9050610c14888287611e91565b50600101610bd6565b50610c2881846133c8565b60405182906001600160a01b038916906000805160206135b583398151915290600090a4505050505050565b6003546000906001600160a01b03161580610c6f5750600254155b15610c7c57506000919050565b60035460025460405163cc44919b60e01b81526001600160a01b038581166004830152602482019290925291169063cc44919b90604401602060405180830381865afa158015610cd0573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610cf491906133df565b92915050565b83610d0481611e2f565b6000610d0f84611e6a565b90506000610d1d82856133c8565b9050610d298782611f0b565b60005b82811015610d73576000878783818110610d4857610d486133b2565b9050602002016020810190610d5d9190612e5c565b9050610d6a898288611f87565b50600101610d2c565b508082886001600160a01b03166000805160206135b583398151915260405160405180910390a450505050505050565b6000546001600160a01b0316331480610dc657506001546001600160a01b031633145b610de25760405162461bcd60e51b81526004016105c3906132c1565b610dea611fbc565b565b610df4612016565b610dea6000612070565b610e066120c0565b6000610e1183611e6a565b9050610e25610e2082846133c8565b612106565b60005b81811015610e6e576000858583818110610e4457610e446133b2565b9050602002016020810190610e599190612e5c565b9050610e658185612125565b50600101610e28565b50610e7981836133c8565b60405182907f0e5fe6f6a28b4cdb21bb2673b7ff7c8695a8463d5dd0b00b888026def1ea11d490600090a350505050565b610ec6610570600160008051602061361c8339815191526132ae565b6001600160a01b0316336001600160a01b031614610ef65760405162461bcd60e51b81526004016105c3906133f8565b6001600160a01b038116610f4c5760405162461bcd60e51b815260206004820152601e60248201527f4669726577616c6c436f6e73756d65723a207a65726f2061646472657373000060448201526064016105c3565b610f7f610f7a60017f8583d637b7eb6415d11ef26648cf0702cf161a357dfe51b6ff7a332110d4bdd36132ae565b829055565b50565b6000546001600160a01b0316331480610fa557506001546001600160a01b031633145b610fc15760405162461bcd60e51b81526004016105c3906132c1565b610dea6121ab565b610ff761057060017f8583d637b7eb6415d11ef26648cf0702cf161a357dfe51b6ff7a332110d4bdd36132ae565b6001600160a01b0316336001600160a01b0316146110575760405162461bcd60e51b815260206004820152601f60248201527f4669726577616c6c436f6e73756d65723a206e6f74206e65772061646d696e0060448201526064016105c3565b610dea611073600160008051602061361c8339815191526132ae565b339055565b60006110826120c0565b600061108d83611e6a565b905060005b818110156110d357368585838181106110ad576110ad6133b2565b90506040020190506110be816121e4565b6110c8908561343c565b935050600101611092565b506110dd82612106565b604051829082907f0e5fe6f6a28b4cdb21bb2673b7ff7c8695a8463d5dd0b00b888026def1ea11d490600090a35092915050565b600061112f61057060016000805160206135d58339815191526132ae565b90506001600160a01b038116611263576000546001600160a01b031633148061116257506001546001600160a01b031633145b61117e5760405162461bcd60e51b81526004016105c3906132c1565b6001600160a01b03831660009081526006602052604081205490036111b657604051633027fed560e01b815260040160405180910390fd5b6001600160a01b0383166000818152600660205260408120805491905590611252576000836001600160a01b03168260405160006040518083038185875af1925050503d8060008114611225576040519150601f19603f3d011682016040523d82523d6000602084013e61122a565b606091505b505090508061124c576040516312171d8360e31b815260040160405180910390fd5b5061125d565b61125d848483612208565b50505050565b604051631bf8659f60e21b815234906001600160a01b03831690636fe1967c90611298903390600090369087906004016132ee565b600060405180830381600087803b1580156112b257600080fd5b505af11580156112c6573d6000803e3d6000fd5b505050506112dc6000546001600160a01b031690565b6001600160a01b0316336001600160a01b0316148061130557506001546001600160a01b031633145b6113215760405162461bcd60e51b81526004016105c3906132c1565b6001600160a01b038416600090815260066020526040812054900361135957604051633027fed560e01b815260040160405180910390fd5b6001600160a01b03841660008181526006602052604081208054919055906113f5576000846001600160a01b03168260405160006040518083038185875af1925050503d80600081146113c8576040519150601f19603f3d011682016040523d82523d6000602084013e6113cd565b606091505b50509050806113ef576040516312171d8360e31b815260040160405180910390fd5b50611400565b611400858583612208565b506040516393163a9160e01b81526001600160a01b038316906393163a9190610b84903390600090369087906004016132ee565b611450610570600160008051602061361c8339815191526132ae565b6001600160a01b0316336001600160a01b0316146114805760405162461bcd60e51b81526004016105c3906133f8565b610f7f610f7a60016000805160206135d58339815191526132ae565b6000836114a881611e2f565b60006114b384611e6a565b905060005b818110156114fa57368686838181106114d3576114d36133b2565b90506040020190506114e5888261269d565b6114ef908661343c565b9450506001016114b8565b508281876001600160a01b03166000805160206135b583398151915260405160405180910390a450509392505050565b611546610570600160008051602061361c8339815191526132ae565b6001600160a01b0316336001600160a01b0316146115765760405162461bcd60e51b81526004016105c3906133f8565b60006115a360017fbee718c342db2a725c831b0c655757cef911f31a4454aacc1b8b75f39bda09a96132ae565b6040805160208101929092526001600160a01b03851690820152606001604051602081830303815290604052805190602001209050818155505050565b60006115fe61057060016000805160206135d58339815191526132ae565b90506001600160a01b0381166116f4576000546001600160a01b031633148061163157506001546001600160a01b031633145b61164d5760405162461bcd60e51b81526004016105c3906132c1565b6003546001600160a01b031615806116655750600254155b15611683576040516363af9b0360e11b815260040160405180910390fd5b600354600254604051635c989d4960e11b81526001600160a01b039092169163b9313a92916116bc91899089908990899060040161344f565b600060405180830381600087803b1580156116d657600080fd5b505af11580156116ea573d6000803e3d6000fd5b505050505061125d565b604051631bf8659f60e21b815234906001600160a01b03831690636fe1967c90611729903390600090369087906004016132ee565b600060405180830381600087803b15801561174357600080fd5b505af1158015611757573d6000803e3d6000fd5b5050505061176d6000546001600160a01b031690565b6001600160a01b0316336001600160a01b0316148061179657506001546001600160a01b031633145b6117b25760405162461bcd60e51b81526004016105c3906132c1565b6003546001600160a01b031615806117ca5750600254155b156117e8576040516363af9b0360e11b815260040160405180910390fd5b600354600254604051635c989d4960e11b81526001600160a01b039092169163b9313a9291611821918a908a908a908a9060040161344f565b600060405180830381600087803b15801561183b57600080fd5b505af115801561184f573d6000803e3d6000fd5b50506040516393163a9160e01b81526001600160a01b03851692506393163a919150611886903390600090369087906004016132ee565b600060405180830381600087803b1580156118a057600080fd5b505af1158015610912573d6000803e3d6000fd5b6000846118c081611e2f565b60006118cb84611e6a565b90506118d78787611f0b565b60005b8181101561191c57368686838181106118f5576118f56133b2565b905060400201905061190789826126c4565b611911908661343c565b9450506001016118da565b5061192783876126e1565b8281886001600160a01b03166000805160206135b583398151915260405160405180910390a45050949350505050565b600061197561057060016000805160206135d58339815191526132ae565b90506001600160a01b038116611a50576000546001600160a01b03163314806119a857506001546001600160a01b031633145b6119c45760405162461bcd60e51b81526004016105c3906132c1565b600380546001600160a01b0319166001600160a01b0384169081179091556040516313d0ca6f60e21b81526000196004820152306024820152634f4329bc906044016020604051808303816000875af1158015611a25573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611a4991906133df565b6002555050565b604051631bf8659f60e21b815234906001600160a01b03831690636fe1967c90611a85903390600090369087906004016132ee565b600060405180830381600087803b158015611a9f57600080fd5b505af1158015611ab3573d6000803e3d6000fd5b50505050611ac96000546001600160a01b031690565b6001600160a01b0316336001600160a01b03161480611af257506001546001600160a01b031633145b611b0e5760405162461bcd60e51b81526004016105c3906132c1565b600380546001600160a01b0319166001600160a01b0385169081179091556040516313d0ca6f60e21b81526000196004820152306024820152634f4329bc906044016020604051808303816000875af1158015611b6f573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611b9391906133df565b6002556040516393163a9160e01b81526001600160a01b038316906393163a919061075f903390600090369087906004016132ee565b6000611be761057060016000805160206135d58339815191526132ae565b90506001600160a01b038116611c5d576000546001600160a01b0316331480611c1a57506001546001600160a01b031633145b611c365760405162461bcd60e51b81526004016105c3906132c1565b50600580546001600160a01b0319166001600160a01b039390931692909217909155600455565b604051631bf8659f60e21b815234906001600160a01b03831690636fe1967c90611c92903390600090369087906004016132ee565b600060405180830381600087803b158015611cac57600080fd5b505af1158015611cc0573d6000803e3d6000fd5b50505050611cd66000546001600160a01b031690565b6001600160a01b0316336001600160a01b03161480611cff57506001546001600160a01b031633145b611d1b5760405162461bcd60e51b81526004016105c3906132c1565b600580546001600160a01b0319166001600160a01b038681169190911790915560048481556040516393163a9160e01b8152918416916393163a9191610b8491339160009136918891016132ee565b6000611d88610570600160008051602061361c8339815191526132ae565b905090565b611d95612016565b6001600160a01b038116611dfa5760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b60648201526084016105c3565b610f7f81612070565b6060611e2883836040518060600160405280602781526020016135f56027913961270b565b9392505050565b611e376120c0565b6001600160a01b038116611e5e5760405163ddbadd5f60e01b815260040160405180910390fd5b611e66612783565b5050565b600081600003611e8d5760405163093ad0d360e21b815260040160405180910390fd5b5090565b6040516323b872dd60e01b81523360048201526001600160a01b038381166024830152604482018390528416906323b872dd906064015b6020604051808303816000875af1158015611ee7573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061125d91906134a2565b6040516323b872dd60e01b8152336004820152306024820152604481018290526001600160a01b038316906323b872dd906064016020604051808303816000875af1158015611f5e573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611f8291906134a2565b505050565b60405163a9059cbb60e01b81526001600160a01b0383811660048301526024820183905284169063a9059cbb90604401611ec8565b611fc46120c0565b6007805460ff191660011790557f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a258611ff93390565b6040516001600160a01b03909116815260200160405180910390a1565b6000546001600160a01b03163314610dea5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064016105c3565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b60075460ff1615610dea5760405162461bcd60e51b815260206004820152601060248201526f14185d5cd8589b194e881c185d5cd95960821b60448201526064016105c3565b6000612110612783565b9050611e668261212083346132ae565b6126e1565b6000826001600160a01b03168260405160006040518083038185875af1925050503d8060008114612172576040519150601f19603f3d011682016040523d82523d6000602084013e612177565b606091505b5050905080611f8257604051635a5e037360e11b81526001600160a01b0384166004820152602481018390526044016105c3565b6121b361295a565b6007805460ff191690557f5db9ee0a495bf2e6ff9c91a7834c1ba4fdd244a5e8aa4e537bd38aeae4b073aa33611ff9565b60006122006121f66020840184612e5c565b8360200135612125565b506020013590565b633844b70760e01b600061222e61057060016000805160206135d58339815191526132ae565b90506001600160a01b038116612404576040516370a0823160e01b81523060048201526000906001600160a01b038716906370a0823190602401602060405180830381865afa158015612285573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906122a991906133df565b604080518681526001600160a01b03888116602083015289168183015290519192507fe4d818e6f992efbd60db553f3edce819a199baec79a784b95c89bc8ee86f2584919081900360600190a160405163a9059cbb60e01b81526001600160a01b0386811660048301526024820186905287169063a9059cbb906044016020604051808303816000875af1158015612345573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061236991906134a2565b506040516370a0823160e01b8152306004820152819085906001600160a01b038916906370a0823190602401602060405180830381865afa1580156123b2573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906123d691906133df565b6123e0919061343c565b146123fd5760405162461bcd60e51b81526004016105c3906134bf565b505061125d565b604080516001600160e01b031984166020820152815160048183030181526024820192839052631bf8659f60e21b90925234916001600160a01b03841691636fe1967c91612459913391908690602801613551565b600060405180830381600087803b15801561247357600080fd5b505af1158015612487573d6000803e3d6000fd5b50506040516370a0823160e01b8152306004820152600092506001600160a01b03891691506370a0823190602401602060405180830381865afa1580156124d2573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906124f691906133df565b604080518781526001600160a01b0389811660208301528a168183015290519192507fe4d818e6f992efbd60db553f3edce819a199baec79a784b95c89bc8ee86f2584919081900360600190a160405163a9059cbb60e01b81526001600160a01b0387811660048301526024820187905288169063a9059cbb906044016020604051808303816000875af1158015612592573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906125b691906134a2565b506040516370a0823160e01b8152306004820152819086906001600160a01b038a16906370a0823190602401602060405180830381865afa1580156125ff573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061262391906133df565b61262d919061343c565b1461264a5760405162461bcd60e51b81526004016105c3906134bf565b50604080516001600160e01b0319851660208201528151600481830301815260248201928390526393163a9160e01b9092526001600160a01b038416916393163a91916118869133918690602801613551565b60006126ba836126b06020850185612e5c565b8460200135611e91565b5060200135919050565b60006126ba836126d76020850185612e5c565b8460200135611f87565b808214611e66576040516306f4750f60e41b815260048101829052602481018390526044016105c3565b6060600080856001600160a01b0316856040516127289190613585565b600060405180830381855af49150503d8060008114612763576040519150601f19603f3d011682016040523d82523d6000602084013e612768565b606091505b5091509150612779868383876129a3565b9695505050505050565b6000806127a261057060016000805160206135d58339815191526132ae565b90506001600160a01b038116612821576004549150816000036127c757600091505090565b60006127d233610c54565b90508015612813576127f1338483106127eb5784612a24565b82612a24565b8281101561280a5761280381846132ae565b9250612813565b60009250505090565b61281c83612a98565b505090565b604051631bf8659f60e21b815234906001600160a01b03831690636fe1967c90612856903390600090369087906004016132ee565b600060405180830381600087803b15801561287057600080fd5b505af1158015612884573d6000803e3d6000fd5b5050505060045492508260000361289e57600092506128f0565b60006128a933610c54565b905080156128e5576128c2338583106127eb5785612a24565b838110156128db576128d481856132ae565b93506128e5565b60009350506128f0565b6128ee84612a98565b505b6040516393163a9160e01b81526001600160a01b038316906393163a9190612923903390600090369087906004016132ee565b600060405180830381600087803b15801561293d57600080fd5b505af1158015612951573d6000803e3d6000fd5b50505050505090565b60075460ff16610dea5760405162461bcd60e51b815260206004820152601460248201527314185d5cd8589b194e881b9bdd081c185d5cd95960621b60448201526064016105c3565b60608315612a12578251600003612a0b576001600160a01b0385163b612a0b5760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e747261637400000060448201526064016105c3565b5081612a1c565b612a1c8383612b43565b949350505050565b600354600254604051630ebacfd960e11b81526001600160a01b038581166004830152602482019290925260448101849052911690631d759fb290606401600060405180830381600087803b158015612a7c57600080fd5b505af1158015612a90573d6000803e3d6000fd5b505050505050565b6005546001600160a01b031680612b075781341015612aca5760405163cc361e3d60e01b815260040160405180910390fd5b604080513481523360208201527f3a32cdd14cdfd431946dfa0b2aef5ace661340411aaadcaee6aef6738d302326910160405180910390a1612b12565b612b12813384612b6d565b6001600160a01b03811660009081526006602052604081208054849290612b3a90849061343c565b90915550505050565b815115612b535781518083602001fd5b8060405162461bcd60e51b81526004016105c391906135a1565b604051636eb1769f60e11b81526001600160a01b038084166004830152306024830152849184918491829185169063dd62ed3e90604401602060405180830381865afa158015612bc1573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612be591906133df565b1015612c335760405162461bcd60e51b815260206004820152601960248201527f455243323048656c7065723a206e6f20616c6c6f77616e63650000000000000060448201526064016105c3565b60008411612c4057600080fd5b6040516370a0823160e01b81523060048201526000906001600160a01b038816906370a0823190602401602060405180830381865afa158015612c87573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612cab91906133df565b6040516323b872dd60e01b81526001600160a01b03888116600483015230602483015260448201889052919250908816906323b872dd906064016020604051808303816000875af1158015612d04573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612d2891906134a2565b50604080518681526001600160a01b03888116602083015289168183015290517f1fecf4702e692891a7c2f0d328779b085efb5edd094fa5558bd5cd147a1679229181900360600190a16040516370a0823160e01b81523060048201526001600160a01b038816906370a0823190602401602060405180830381865afa158015612db6573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612dda91906133df565b612de4868361343c565b1461078d5760405162461bcd60e51b815260206004820152602660248201527f455243323048656c7065723a20526563656976656420496e636f727265637420604482015265105b5bdd5b9d60d21b60648201526084016105c3565b80356001600160a01b0381168114612e5757600080fd5b919050565b600060208284031215612e6e57600080fd5b611e2882612e40565b60008083601f840112612e8957600080fd5b50813567ffffffffffffffff811115612ea157600080fd5b602083019150836020828501011115612eb957600080fd5b9250929050565b600080600080600060608688031215612ed857600080fd5b612ee186612e40565b9450602086013567ffffffffffffffff80821115612efe57600080fd5b612f0a89838a01612e77565b90965094506040880135915080821115612f2357600080fd5b50612f3088828901612e77565b969995985093965092949392505050565b60008083601f840112612f5357600080fd5b50813567ffffffffffffffff811115612f6b57600080fd5b6020830191508360208260051b8501011115612eb957600080fd5b60008060208385031215612f9957600080fd5b823567ffffffffffffffff811115612fb057600080fd5b612fbc85828601612f41565b90969095509350505050565b60008060008060608587031215612fde57600080fd5b612fe785612e40565b9350602085013567ffffffffffffffff81111561300357600080fd5b61300f87828801612f41565b9598909750949560400135949350505050565b60008060006040848603121561303757600080fd5b833567ffffffffffffffff81111561304e57600080fd5b61305a86828701612f41565b909790965060209590950135949350505050565b60008083601f84011261308057600080fd5b50813567ffffffffffffffff81111561309857600080fd5b6020830191508360208260061b8501011115612eb957600080fd5b600080602083850312156130c657600080fd5b823567ffffffffffffffff8111156130dd57600080fd5b612fbc8582860161306e565b600080604083850312156130fc57600080fd5b61310583612e40565b915061311360208401612e40565b90509250929050565b60008060006040848603121561313157600080fd5b61313a84612e40565b9250602084013567ffffffffffffffff81111561315657600080fd5b6131628682870161306e565b9497909650939450505050565b8015158114610f7f57600080fd5b6000806040838503121561319057600080fd5b61319983612e40565b915060208301356131a98161316f565b809150509250929050565b600080600080604085870312156131ca57600080fd5b843567ffffffffffffffff808211156131e257600080fd5b6131ee88838901612f41565b9096509450602087013591508082111561320757600080fd5b5061321487828801612f41565b95989497509550505050565b6000806000806060858703121561323657600080fd5b61323f85612e40565b935060208501359250604085013567ffffffffffffffff81111561326257600080fd5b6132148782880161306e565b6000806040838503121561328157600080fd5b61328a83612e40565b946020939093013593505050565b634e487b7160e01b600052601160045260246000fd5b81810381811115610cf457610cf4613298565b60208082526013908201527220baba3437b934bd30ba34b7b71022b93937b960691b604082015260600190565b6001600160a01b038516815260606020820181905281018390528284608083013760006080848301015260006080601f19601f860116830101905082604083015295945050505050565b8183823760009101908152919050565b8183526000602080850194508260005b85811015613384576001600160a01b0361337183612e40565b1687529582019590820190600101613358565b509495945050505050565b8381526040602082015260006133a9604083018486613348565b95945050505050565b634e487b7160e01b600052603260045260246000fd5b8082028115828204841417610cf457610cf4613298565b6000602082840312156133f157600080fd5b5051919050565b60208082526024908201527f4669726577616c6c436f6e73756d65723a206e6f74206669726577616c6c20616040820152633236b4b760e11b606082015260800190565b80820180821115610cf457610cf4613298565b858152606060208201526000613469606083018688613348565b82810360408401528381526001600160fb1b0384111561348857600080fd5b8360051b8086602084013701602001979650505050505050565b6000602082840312156134b457600080fd5b8151611e288161316f565b60208082526022908201527f455243323048656c7065723a2073656e7420696e636f727265637420616d6f756040820152611b9d60f21b606082015260800190565b60005b8381101561351c578181015183820152602001613504565b50506000910152565b6000815180845261353d816020860160208601613501565b601f01601f19169290920160200192915050565b6001600160a01b038416815260606020820181905260009061357590830185613525565b9050826040830152949350505050565b60008251613597818460208701613501565b9190910192915050565b602081526000611e28602083018461352556febd92d122ffb1b8cecbdfdc76285b361b1ab09e8a58b0406b65326589ee1d65ef5dd2e3b890564a8f99f7f203f226a27a8aa59aee19a4ece5cf5eaa77ab91f662416464726573733a206c6f772d6c6576656c2064656c65676174652063616c6c206661696c656429982a6ac507a2a707ced6dee5d76285dd49725db977de83d9702c628c974136a264697066735822122057ba9d84968badcaf1be197d2b8395432838f82ae7d26ff0f8692b83a87f47b264736f6c63430008180033
Deployed Bytecode Sourcemap
60964:2313:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;46149:236;;;;;;;;;;-1:-1:-1;46149:236:0;;;;;:::i;:::-;;:::i;:::-;;17587:410;;;;;;:::i;:::-;;:::i;48462:185::-;;;;;;;;;;-1:-1:-1;48462:185:0;;;;;:::i;:::-;;:::i;49392:42::-;;;;;;;;;;-1:-1:-1;49392:42:0;;;;;:::i;:::-;;;;;;;;;;;;;;;;;2491:25:1;;;2479:2;2464:18;49392:42:0;;;;;;;;60047:502;;;;;;:::i;:::-;;:::i;47736:215::-;;;;;;;;;;-1:-1:-1;47736:215:0;;;;;:::i;:::-;;:::i;49356:23::-;;;;;;;;;;-1:-1:-1;49356:23:0;;;;-1:-1:-1;;;;;49356:23:0;;;;;;-1:-1:-1;;;;;3275:32:1;;;3257:51;;3245:2;3230:18;49356:23:0;3111:203:1;62717:557:0;;;;;;:::i;:::-;;:::i;25785:86::-;;;;;;;;;;-1:-1:-1;25856:7:0;;;;25785:86;;3484:14:1;;3477:22;3459:41;;3447:2;3432:18;25785:86:0;3319:187:1;55938:68:0;;;;;;;;;;;;;:::i;23240:103::-;;;;;;;;;;;;;:::i;57839:487::-;;;;;;:::i;:::-;;:::i;19048:244::-;;;;;;;;;;-1:-1:-1;19048:244:0;;;;;:::i;:::-;;:::i;56172:72::-;;;;;;;;;;;;;:::i;45920:31::-;;;;;;;;;;-1:-1:-1;45920:31:0;;;;-1:-1:-1;;;;;45920:31:0;;;19366:236;;;;;;;;;;;;;:::i;56995:494::-;;;;;;:::i;:::-;;:::i;50513:477::-;;;;;;;;;;-1:-1:-1;50513:477:0;;;;;:::i;:::-;;:::i;18803:137::-;;;;;;;;;;-1:-1:-1;18803:137:0;;;;;:::i;:::-;;:::i;22599:87::-;;;;;;;;;;-1:-1:-1;22645:7:0;22672:6;-1:-1:-1;;;;;22672:6:0;22599:87;;47556:31;;;;;;;;;;-1:-1:-1;47556:31:0;;;;-1:-1:-1;;;;;47556:31:0;;;59164:522;;;;;;:::i;:::-;;:::i;49328:21::-;;;;;;;;;;;;;;;;18237:244;;;;;;;;;;-1:-1:-1;18237:244:0;;;;;:::i;:::-;;:::i;48228:226::-;;;;;;;;;;-1:-1:-1;48228:226:0;;;;;:::i;:::-;;:::i;61604:637::-;;;;;;:::i;:::-;;:::i;47959:261::-;;;;;;;;;;-1:-1:-1;47959:261:0;;;;;:::i;:::-;;:::i;50351:154::-;;;;;;;;;;-1:-1:-1;50351:154:0;;;;;:::i;:::-;;:::i;47526:23::-;;;;;;;;;;;;;;;;18557:129;;;;;;;;;;;;;:::i;23498:201::-;;;;;;;;;;-1:-1:-1;23498:201:0;;;;;:::i;:::-;;:::i;46149:236::-;13325:16;13344:40;12619:42;12660:1;-1:-1:-1;;;;;;;;;;;12619:42:0;:::i;:::-;20532:12;;20402:160;13344:40;13325:59;-1:-1:-1;;;;;;13399:22:0;;13395:77;;22645:7;22672:6;-1:-1:-1;;;;;22672:6:0;46019:10:::1;:21;::::0;:55:::1;;-1:-1:-1::0;46058:16:0::1;::::0;-1:-1:-1;;;;;46058:16:0::1;46044:10;:30;46019:55;45997:124;;;;-1:-1:-1::0;;;45997:124:0::1;;;;;;;:::i;:::-;;;;;;;;;46266:16:::2;::::0;;-1:-1:-1;;;;;46293:27:0;;::::2;-1:-1:-1::0;;;;;;46293:27:0;::::2;::::0;::::2;::::0;;;46336:41:::2;::::0;46266:16;::::2;::::0;46293:27;46266:16;;46336:41:::2;::::0;46249:14:::2;::::0;46336:41:::2;46238:147;13454:7:::0;46149:236;:::o;13395:77::-;13517:61;;-1:-1:-1;;;13517:61:0;;19794:11;;-1:-1:-1;;;;;13517:32:0;;;;;:61;;13550:10;;13482;;13562:8;;19794:11;;13517:61;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;46033:7:::1;22645::::0;22672:6;-1:-1:-1;;;;;22672:6:0;;22599:87;46033:7:::1;-1:-1:-1::0;;;;;46019:21:0::1;:10;-1:-1:-1::0;;;;;46019:21:0::1;;:55;;;-1:-1:-1::0;46058:16:0::1;::::0;-1:-1:-1;;;;;46058:16:0::1;46044:10;:30;46019:55;45997:124;;;;-1:-1:-1::0;;;45997:124:0::1;;;;;;;:::i;:::-;46266:16:::2;::::0;;-1:-1:-1;;;;;46293:27:0;;::::2;-1:-1:-1::0;;;;;;46293:27:0;::::2;::::0;::::2;::::0;;;46336:41:::2;::::0;46266:16;::::2;::::0;46293:27;46266:16;;46336:41:::2;::::0;46249:14:::2;::::0;46336:41:::2;-1:-1:-1::0;13602:62:0;;-1:-1:-1;;;13602:62:0;;-1:-1:-1;;;;;13602:33:0;;;;;:62;;13636:10;;13648:8;;;;13658:5;;13602:62;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;13314:358;;46149:236;:::o;17587:410::-;17750:6;16214:13;13063:50;13112:1;13071:37;13063:50;:::i;:::-;16240:49;;;;;;9218:25:1;;;;-1:-1:-1;;;;;9279:32:1;;9259:18;;;9252:60;9191:18;;16240:49:0;;;;;;;;;;;;16230:60;;;;;;16214:76;;16301:21;16359:1;16351:10;;16325:22;16341:5;20532:12;;20402:160;16325:22;:36;;16301:60;;16380:16;16372:66;;;;-1:-1:-1;;;16372:66:0;;9525:2:1;16372:66:0;;;9507:21:1;9564:2;9544:18;;;9537:30;9603:34;9583:18;;;9576:62;-1:-1:-1;;;9654:18:1;;;9647:35;9699:19;;16372:66:0;9323:401:1;16372:66:0;17770:12:::1;17788:6;-1:-1:-1::0;;;;;17788:11:0::1;17800:13;;17788:26;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;17769:45;;;17833:7;17825:16;;;::::0;::::1;;17940:49;17977:4;17984;;17940:49;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;::::0;;;;-1:-1:-1;17940:28:0::1;::::0;-1:-1:-1;;;17940:49:0:i:1;:::-;;17758:239;15929:529:::0;;17587:410;;;;;;:::o;48462:185::-;13325:16;13344:40;12619:42;12660:1;-1:-1:-1;;;;;;;;;;;12619:42:0;:::i;13344:40::-;13325:59;-1:-1:-1;;;;;;13399:22:0;;13395:77;;22645:7;22672:6;-1:-1:-1;;;;;22672:6:0;46019:10:::1;:21;::::0;:55:::1;;-1:-1:-1::0;46058:16:0::1;::::0;-1:-1:-1;;;;;46058:16:0::1;46044:10;:30;46019:55;45997:124;;;;-1:-1:-1::0;;;45997:124:0::1;;;;;;;:::i;:::-;47632:16:::2;::::0;-1:-1:-1;;;;;47632:16:0::2;:30:::0;;:50:::2;;-1:-1:-1::0;47666:11:0::2;::::0;:16;47632:50:::2;47629:79;;;47691:17;;-1:-1:-1::0;;;47691:17:0::2;;;;;;;;;;;47629:79;48587:16:::3;::::0;48619:11:::3;::::0;48576:63:::3;::::0;-1:-1:-1;;;48576:63:0;;-1:-1:-1;;;;;48587:16:0;;::::3;::::0;48576:42:::3;::::0;:63:::3;::::0;48632:6;;;;48576:63:::3;;;:::i;13395:77::-:0;13517:61;;-1:-1:-1;;;13517:61:0;;19794:11;;-1:-1:-1;;;;;13517:32:0;;;;;:61;;13550:10;;13482;;13562:8;;19794:11;;13517:61;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;46033:7:::1;22645::::0;22672:6;-1:-1:-1;;;;;22672:6:0;;22599:87;46033:7:::1;-1:-1:-1::0;;;;;46019:21:0::1;:10;-1:-1:-1::0;;;;;46019:21:0::1;;:55;;;-1:-1:-1::0;46058:16:0::1;::::0;-1:-1:-1;;;;;46058:16:0::1;46044:10;:30;46019:55;45997:124;;;;-1:-1:-1::0;;;45997:124:0::1;;;;;;;:::i;:::-;47632:16:::2;::::0;-1:-1:-1;;;;;47632:16:0::2;:30:::0;;:50:::2;;-1:-1:-1::0;47666:11:0::2;::::0;:16;47632:50:::2;47629:79;;;47691:17;;-1:-1:-1::0;;;47691:17:0::2;;;;;;;;;;;47629:79;48587:16:::3;::::0;48619:11:::3;::::0;48576:63:::3;::::0;-1:-1:-1;;;48576:63:0;;-1:-1:-1;;;;;48587:16:0;;::::3;::::0;48576:42:::3;::::0;:63:::3;::::0;48632:6;;;;48576:63:::3;;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::3;;;;;;;;;;;;::::0;::::3;;;;;-1:-1:-1::0;;13602:62:0;;-1:-1:-1;;;13602:62:0;;-1:-1:-1;;;;;13602:33:0;;;-1:-1:-1;13602:33:0;;-1:-1:-1;13602:62:0;;13636:10;;13648:8;;;;13658:5;;13602:62;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;13314:358;;48462:185;;:::o;60047:502::-;60209:6;52017:20;52030:6;52017:12;:20::i;:::-;60228:11:::1;60242:23;60251:6:::0;60242:8:::1;:23::i;:::-;60228:37;;60281:9;60276:195;60296:6;60292:1;:10;60276:195;;;60321:12;60336:6;;60343:1;60336:9;;;;;;;:::i;:::-;;;;;;;;;;;;;;:::i;:::-;60321:24;;60360:37;60375:6;60383:4;60389:7;60360:14;:37::i;:::-;-1:-1:-1::0;60441:3:0::1;;60276:195;;;-1:-1:-1::0;60524:16:0::1;60534:6:::0;60524:7;:16:::1;:::i;:::-;60486:55;::::0;60516:6;;-1:-1:-1;;;;;60486:55:0;::::1;::::0;-1:-1:-1;;;;;;;;;;;60486:55:0;;;::::1;60217:332;60047:502:::0;;;;;:::o;47736:215::-;47811:16;;47791:4;;-1:-1:-1;;;;;47811:16:0;:30;;:50;;-1:-1:-1;47845:11:0;;:16;47811:50;47808:63;;;-1:-1:-1;47870:1:0;;47736:215;-1:-1:-1;47736:215:0:o;47808:63::-;47900:16;;47931:11;;47889:54;;-1:-1:-1;;;47889:54:0;;-1:-1:-1;;;;;11727:32:1;;;47889:54:0;;;11709:51:1;11776:18;;;11769:34;;;;47900:16:0;;;47889:34;;11682:18:1;;47889:54:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;47882:61;47736:215;-1:-1:-1;;47736:215:0:o;62717:557::-;62881:6;52017:20;52030:6;52017:12;:20::i;:::-;62900:11:::1;62914:23;62923:6:::0;62914:8:::1;:23::i;:::-;62900:37:::0;-1:-1:-1;62948:8:0::1;62959:16;62900:37:::0;62959:7;:16:::1;:::i;:::-;62948:27;;62986:22;62996:6;63004:3;62986:9;:22::i;:::-;63024:9;63019:190;63039:6;63035:1;:10;63019:190;;;63064:12;63079:6;;63086:1;63079:9;;;;;;;:::i;:::-;;;;;;;;;;;;;;:::i;:::-;63064:24;;63103:33;63114:6;63122:4;63128:7;63103:10;:33::i;:::-;-1:-1:-1::0;63179:3:0::1;;63019:190;;;;63262:3;63254:6;63246;-1:-1:-1::0;;;;;63224:42:0::1;-1:-1:-1::0;;;;;;;;;;;63224:42:0::1;;;;;;;;;62889:385;;62717:557:::0;;;;;:::o;55938:68::-;22645:7;22672:6;-1:-1:-1;;;;;22672:6:0;46019:10;:21;;:55;;-1:-1:-1;46058:16:0;;-1:-1:-1;;;;;46058:16:0;46044:10;:30;46019:55;45997:124;;;;-1:-1:-1;;;45997:124:0;;;;;;;:::i;:::-;55990:8:::1;:6;:8::i;:::-;55938:68::o:0;23240:103::-;22485:13;:11;:13::i;:::-;23305:30:::1;23332:1;23305:18;:30::i;57839:487::-:0;25390:19;:17;:19::i;:::-;57978:11:::1;57992:23;58001:6:::0;57992:8:::1;:23::i;:::-;57978:37:::0;-1:-1:-1;58026:40:0::1;58049:16;57978:37:::0;58049:7;:16:::1;:::i;:::-;58026:22;:40::i;:::-;58082:9;58077:181;58097:6;58093:1;:10;58077:181;;;58122:12;58137:6;;58144:1;58137:9;;;;;;;:::i;:::-;;;;;;;;;;;;;;:::i;:::-;58122:24;;58161:23;58170:4;58176:7;58161:8;:23::i;:::-;-1:-1:-1::0;58228:3:0::1;;58077:181;;;-1:-1:-1::0;58301:16:0::1;58311:6:::0;58301:7;:16:::1;:::i;:::-;58273:45;::::0;58293:6;;58273:45:::1;::::0;;;::::1;57967:359;57839:487:::0;;;:::o;19048:244::-;16618:46;12732:48;12779:1;-1:-1:-1;;;;;;;;;;;12732:48:0;:::i;16618:46::-;-1:-1:-1;;;;;16604:60:0;:10;-1:-1:-1;;;;;16604:60:0;;16596:109;;;;-1:-1:-1;;;16596:109:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;19144:28:0;::::1;19136:71;;;::::0;-1:-1:-1;;;19136:71:0;;12610:2:1;19136:71:0::1;::::0;::::1;12592:21:1::0;12649:2;12629:18;;;12622:30;12688:32;12668:18;;;12661:60;12738:18;;19136:71:0::1;12408:354:1::0;19136:71:0::1;19218:66;12855:52;12906:1;12863:39;12855:52;:::i;:::-;19269:14:::0;20353:23;;20249:145;19218:66:::1;19048:244:::0;:::o;56172:72::-;22645:7;22672:6;-1:-1:-1;;;;;22672:6:0;46019:10;:21;;:55;;-1:-1:-1;46058:16:0;;-1:-1:-1;;;;;46058:16:0;46044:10;:30;46019:55;45997:124;;;;-1:-1:-1;;;45997:124:0;;;;;;;:::i;:::-;56226:10:::1;:8;:10::i;19366:236::-:0;19439:50;12855:52;12906:1;12863:39;12855:52;:::i;19439:50::-;-1:-1:-1;;;;;19425:64:0;:10;-1:-1:-1;;;;;19425:64:0;;19417:108;;;;-1:-1:-1;;;19417:108:0;;12969:2:1;19417:108:0;;;12951:21:1;13008:2;12988:18;;;12981:30;13047:33;13027:18;;;13020:61;13098:18;;19417:108:0;12767:355:1;19417:108:0;19536:58;12732:48;12779:1;-1:-1:-1;;;;;;;;;;;12732:48:0;:::i;:::-;19583:10;20353:23;;20249:145;56995:494;57114:11;25390:19;:17;:19::i;:::-;57138:11:::1;57152:31;57161:14:::0;57152:8:::1;:31::i;:::-;57138:45;;57199:9;57194:202;57214:6;57210:1;:10;57194:202;;;57239:27;57269:14;;57284:1;57269:17;;;;;;;:::i;:::-;;;;;;57239:47;;57308:14;57317:4;57308:8;:14::i;:::-;57301:21;::::0;;::::1;:::i;:::-;::::0;-1:-1:-1;;57366:3:0::1;;57194:202;;;;57406:27;57429:3;57406:22;:27::i;:::-;57449:32;::::0;57477:3;;57469:6;;57449:32:::1;::::0;;;::::1;57127:362;56995:494:::0;;;;:::o;50513:477::-;13325:16;13344:40;12619:42;12660:1;-1:-1:-1;;;;;;;;;;;12619:42:0;:::i;13344:40::-;13325:59;-1:-1:-1;;;;;;13399:22:0;;13395:77;;22645:7;22672:6;-1:-1:-1;;;;;22672:6:0;46019:10:::1;:21;::::0;:55:::1;;-1:-1:-1::0;46058:16:0::1;::::0;-1:-1:-1;;;;;46058:16:0::1;46044:10;:30;46019:55;45997:124;;;;-1:-1:-1::0;;;45997:124:0::1;;;;;;;:::i;:::-;-1:-1:-1::0;;;;;50620:18:0;::::2;;::::0;;;:10:::2;:18;::::0;;;;;:23;;50616:53:::2;;50652:17;;-1:-1:-1::0;;;50652:17:0::2;;;;;;;;;;;50616:53;-1:-1:-1::0;;;;;50697:18:0;::::2;50680:14;50697:18:::0;;;:10:::2;:18;::::0;;;;;;50726:22;;;50697:18;50759:224:::2;;50801:12;50819:3;-1:-1:-1::0;;;;;50819:8:0::2;50835:9;50819:30;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;50800:49;;;50869:7;50864:37;;50885:16;;-1:-1:-1::0;;;50885:16:0::2;;;;;;;;;;;50864:37;50785:128;50759:224;;;50934:37;50948:6;50956:3;50961:9;50934:13;:37::i;:::-;50605:385;13454:7:::0;50513:477;;:::o;13395:77::-;13517:61;;-1:-1:-1;;;13517:61:0;;19794:11;;-1:-1:-1;;;;;13517:32:0;;;;;:61;;13550:10;;13482;;13562:8;;19794:11;;13517:61;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;46033:7:::1;22645::::0;22672:6;-1:-1:-1;;;;;22672:6:0;;22599:87;46033:7:::1;-1:-1:-1::0;;;;;46019:21:0::1;:10;-1:-1:-1::0;;;;;46019:21:0::1;;:55;;;-1:-1:-1::0;46058:16:0::1;::::0;-1:-1:-1;;;;;46058:16:0::1;46044:10;:30;46019:55;45997:124;;;;-1:-1:-1::0;;;45997:124:0::1;;;;;;;:::i;:::-;-1:-1:-1::0;;;;;50620:18:0;::::2;;::::0;;;:10:::2;:18;::::0;;;;;:23;;50616:53:::2;;50652:17;;-1:-1:-1::0;;;50652:17:0::2;;;;;;;;;;;50616:53;-1:-1:-1::0;;;;;50697:18:0;::::2;50680:14;50697:18:::0;;;:10:::2;:18;::::0;;;;;;50726:22;;;50697:18;50759:224:::2;;50801:12;50819:3;-1:-1:-1::0;;;;;50819:8:0::2;50835:9;50819:30;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;50800:49;;;50869:7;50864:37;;50885:16;;-1:-1:-1::0;;;50885:16:0::2;;;;;;;;;;;50864:37;50785:128;50759:224;;;50934:37;50948:6;50956:3;50961:9;50934:13;:37::i;:::-;-1:-1:-1::0;13602:62:0;;-1:-1:-1;;;13602:62:0;;-1:-1:-1;;;;;13602:33:0;;;;;:62;;13636:10;;13648:8;;;;13658:5;;13602:62;;;:::i;18803:137::-;16618:46;12732:48;12779:1;-1:-1:-1;;;;;;;;;;;12732:48:0;:::i;16618:46::-;-1:-1:-1;;;;;16604:60:0;:10;-1:-1:-1;;;;;16604:60:0;;16596:109;;;;-1:-1:-1;;;16596:109:0;;;;;;;:::i;:::-;18881:51:::1;12619:42;12660:1;-1:-1:-1::0;;;;;;;;;;;12619:42:0::1;:::i;59164:522::-:0;59325:11;59308:6;52017:20;52030:6;52017:12;:20::i;:::-;59349:11:::1;59363:31;59372:14:::0;59363:8:::1;:31::i;:::-;59349:45;;59410:9;59405:216;59425:6;59421:1;:10;59405:216;;;59450:27;59480:14;;59495:1;59480:17;;;;;;;:::i;:::-;;;;;;59450:47;;59519:28;59534:6;59542:4;59519:14;:28::i;:::-;59512:35;::::0;;::::1;:::i;:::-;::::0;-1:-1:-1;;59591:3:0::1;;59405:216;;;;59674:3;59666:6;59658;-1:-1:-1::0;;;;;59636:42:0::1;-1:-1:-1::0;;;;;;;;;;;59636:42:0::1;;;;;;;;;59338:348;59164:522:::0;;;;;;:::o;18237:244::-;16618:46;12732:48;12779:1;-1:-1:-1;;;;;;;;;;;12732:48:0;:::i;16618:46::-;-1:-1:-1;;;;;16604:60:0;:10;-1:-1:-1;;;;;16604:60:0;;16596:109;;;;-1:-1:-1;;;16596:109:0;;;;;;;:::i;:::-;18331:13:::1;13063:50;13112:1;13071:37;13063:50;:::i;:::-;18357:49;::::0;;::::1;::::0;::::1;9218:25:1::0;;;;-1:-1:-1;;;;;9279:32:1;;9259:18;;;9252:60;9191:18;;18357:49:0::1;;;;;;;;;;;;18347:60;;;;;;18331:76;;18456:6;18449:5;18442:21;18427:47;18237:244:::0;;:::o;48228:226::-;13325:16;13344:40;12619:42;12660:1;-1:-1:-1;;;;;;;;;;;12619:42:0;:::i;13344:40::-;13325:59;-1:-1:-1;;;;;;13399:22:0;;13395:77;;22645:7;22672:6;-1:-1:-1;;;;;22672:6:0;46019:10:::1;:21;::::0;:55:::1;;-1:-1:-1::0;46058:16:0::1;::::0;-1:-1:-1;;;;;46058:16:0::1;46044:10;:30;46019:55;45997:124;;;;-1:-1:-1::0;;;45997:124:0::1;;;;;;;:::i;:::-;47632:16:::2;::::0;-1:-1:-1;;;;;47632:16:0::2;:30:::0;;:50:::2;;-1:-1:-1::0;47666:11:0::2;::::0;:16;47632:50:::2;47629:79;;;47691:17;;-1:-1:-1::0;;;47691:17:0::2;;;;;;;;;;;47629:79;48387:16:::3;::::0;48416:11:::3;::::0;48376:70:::3;::::0;-1:-1:-1;;;48376:70:0;;-1:-1:-1;;;;;48387:16:0;;::::3;::::0;48376:39:::3;::::0;:70:::3;::::0;48429:6;;;;48437:8;;;;48376:70:::3;;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::3;;;;;;;;;;;;::::0;::::3;;;;;;;;;13454:7:::0;;;13395:77;13517:61;;-1:-1:-1;;;13517:61:0;;19794:11;;-1:-1:-1;;;;;13517:32:0;;;;;:61;;13550:10;;13482;;13562:8;;19794:11;;13517:61;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;46033:7:::1;22645::::0;22672:6;-1:-1:-1;;;;;22672:6:0;;22599:87;46033:7:::1;-1:-1:-1::0;;;;;46019:21:0::1;:10;-1:-1:-1::0;;;;;46019:21:0::1;;:55;;;-1:-1:-1::0;46058:16:0::1;::::0;-1:-1:-1;;;;;46058:16:0::1;46044:10;:30;46019:55;45997:124;;;;-1:-1:-1::0;;;45997:124:0::1;;;;;;;:::i;:::-;47632:16:::2;::::0;-1:-1:-1;;;;;47632:16:0::2;:30:::0;;:50:::2;;-1:-1:-1::0;47666:11:0::2;::::0;:16;47632:50:::2;47629:79;;;47691:17;;-1:-1:-1::0;;;47691:17:0::2;;;;;;;;;;;47629:79;48387:16:::3;::::0;48416:11:::3;::::0;48376:70:::3;::::0;-1:-1:-1;;;48376:70:0;;-1:-1:-1;;;;;48387:16:0;;::::3;::::0;48376:39:::3;::::0;:70:::3;::::0;48429:6;;;;48437:8;;;;48376:70:::3;;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::3;;;;;;;;;;;;::::0;::::3;;;;;-1:-1:-1::0;;13602:62:0;;-1:-1:-1;;;13602:62:0;;-1:-1:-1;;;;;13602:33:0;;;-1:-1:-1;13602:33:0;;-1:-1:-1;13602:62:0;;13636:10;;13648:8;;;;13658:5;;13602:62;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;61604:637;61798:11;61781:6;52017:20;52030:6;52017:12;:20::i;:::-;61822:11:::1;61836:31;61845:14:::0;61836:8:::1;:31::i;:::-;61822:45;;61878:31;61888:6;61896:12;61878:9;:31::i;:::-;61925:9;61920:212;61940:6;61936:1;:10;61920:212;;;61965:27;61995:14;;62010:1;61995:17;;;;;;;:::i;:::-;;;;;;61965:47;;62034:24;62045:6;62053:4;62034:10;:24::i;:::-;62027:31;::::0;;::::1;:::i;:::-;::::0;-1:-1:-1;;62102:3:0::1;;61920:212;;;;62142:33;62157:3;62162:12;62142:14;:33::i;:::-;62229:3;62221:6;62213;-1:-1:-1::0;;;;;62191:42:0::1;-1:-1:-1::0;;;;;;;;;;;62191:42:0::1;;;;;;;;;61811:430;61604:637:::0;;;;;;;:::o;47959:261::-;13325:16;13344:40;12619:42;12660:1;-1:-1:-1;;;;;;;;;;;12619:42:0;:::i;13344:40::-;13325:59;-1:-1:-1;;;;;;13399:22:0;;13395:77;;22645:7;22672:6;-1:-1:-1;;;;;22672:6:0;46019:10:::1;:21;::::0;:55:::1;;-1:-1:-1::0;46058:16:0::1;::::0;-1:-1:-1;;;;;46058:16:0::1;46044:10;:30;46019:55;45997:124;;;;-1:-1:-1::0;;;45997:124:0::1;;;;;;;:::i;:::-;48066:16:::2;:36:::0;;-1:-1:-1;;;;;;48066:36:0::2;-1:-1:-1::0;;;;;48066:36:0;::::2;::::0;;::::2;::::0;;;48127:85:::2;::::0;-1:-1:-1;;;48127:85:0;;-1:-1:-1;;48127:85:0::2;::::0;::::2;9218:25:1::0;48206:4:0::2;9259:18:1::0;;;9252:60;48127:51:0::2;::::0;9191:18:1;;48127:85:0::2;;;;;;;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;48113:11;:99:::0;-1:-1:-1;;47959:261:0:o;13395:77::-;13517:61;;-1:-1:-1;;;13517:61:0;;19794:11;;-1:-1:-1;;;;;13517:32:0;;;;;:61;;13550:10;;13482;;13562:8;;19794:11;;13517:61;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;46033:7:::1;22645::::0;22672:6;-1:-1:-1;;;;;22672:6:0;;22599:87;46033:7:::1;-1:-1:-1::0;;;;;46019:21:0::1;:10;-1:-1:-1::0;;;;;46019:21:0::1;;:55;;;-1:-1:-1::0;46058:16:0::1;::::0;-1:-1:-1;;;;;46058:16:0::1;46044:10;:30;46019:55;45997:124;;;;-1:-1:-1::0;;;45997:124:0::1;;;;;;;:::i;:::-;48066:16:::2;:36:::0;;-1:-1:-1;;;;;;48066:36:0::2;-1:-1:-1::0;;;;;48066:36:0;::::2;::::0;;::::2;::::0;;;48127:85:::2;::::0;-1:-1:-1;;;48127:85:0;;-1:-1:-1;;48127:85:0::2;::::0;::::2;9218:25:1::0;48206:4:0::2;9259:18:1::0;;;9252:60;48127:51:0::2;::::0;9191:18:1;;48127:85:0::2;;;;;;;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;48113:11;:99:::0;13602:62;;-1:-1:-1;;;13602:62:0;;-1:-1:-1;;;;;13602:33:0;;;;;:62;;13636:10;;13648:8;;;;13658:5;;13602:62;;;:::i;50351:154::-;13325:16;13344:40;12619:42;12660:1;-1:-1:-1;;;;;;;;;;;12619:42:0;:::i;13344:40::-;13325:59;-1:-1:-1;;;;;;13399:22:0;;13395:77;;22645:7;22672:6;-1:-1:-1;;;;;22672:6:0;46019:10:::1;:21;::::0;:55:::1;;-1:-1:-1::0;46058:16:0::1;::::0;-1:-1:-1;;;;;46058:16:0::1;46044:10;:30;46019:55;45997:124;;;;-1:-1:-1::0;;;45997:124:0::1;;;;;;;:::i;:::-;-1:-1:-1::0;50450:8:0::2;:17:::0;;-1:-1:-1;;;;;;50450:17:0::2;-1:-1:-1::0;;;;;50450:17:0;;;::::2;::::0;;;::::2;::::0;;;50478:9:::2;:19:::0;50351:154::o;13395:77::-;13517:61;;-1:-1:-1;;;13517:61:0;;19794:11;;-1:-1:-1;;;;;13517:32:0;;;;;:61;;13550:10;;13482;;13562:8;;19794:11;;13517:61;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;46033:7:::1;22645::::0;22672:6;-1:-1:-1;;;;;22672:6:0;;22599:87;46033:7:::1;-1:-1:-1::0;;;;;46019:21:0::1;:10;-1:-1:-1::0;;;;;46019:21:0::1;;:55;;;-1:-1:-1::0;46058:16:0::1;::::0;-1:-1:-1;;;;;46058:16:0::1;46044:10;:30;46019:55;45997:124;;;;-1:-1:-1::0;;;45997:124:0::1;;;;;;;:::i;:::-;50450:8:::2;:17:::0;;-1:-1:-1;;;;;;50450:17:0::2;-1:-1:-1::0;;;;;50450:17:0;;::::2;::::0;;;::::2;::::0;;;50478:9:::2;:19:::0;;;13602:62;;-1:-1:-1;;;13602:62:0;;:33;;;;;;:62;;13636:10;;-1:-1:-1;;13648:8:0;;13658:5;;13602:62;;:::i;18557:129::-;18605:7;18632:46;12732:48;12779:1;-1:-1:-1;;;;;;;;;;;12732:48:0;:::i;18632:46::-;18625:53;;18557:129;:::o;23498:201::-;22485:13;:11;:13::i;:::-;-1:-1:-1;;;;;23587:22:0;::::1;23579:73;;;::::0;-1:-1:-1;;;23579:73:0;;14692:2:1;23579:73:0::1;::::0;::::1;14674:21:1::0;14731:2;14711:18;;;14704:30;14770:34;14750:18;;;14743:62;-1:-1:-1;;;14821:18:1;;;14814:36;14867:19;;23579:73:0::1;14490:402:1::0;23579:73:0::1;23663:28;23682:8;23663:18;:28::i;8047:200::-:0;8130:12;8162:77;8183:6;8191:4;8162:77;;;;;;;;;;;;;;;;;:20;:77::i;:::-;8155:84;8047:200;-1:-1:-1;;;8047:200:0:o;52235:147::-;25390:19;:17;:19::i;:::-;-1:-1:-1;;;;;52310:20:0;::::1;52306:48;;52339:15;;-1:-1:-1::0;;;52339:15:0::1;;;;;;;;;;;52306:48;52365:9;:7;:9::i;:::-;;52235:147:::0;:::o;52539:181::-;52613:19;52649:7;52660:1;52649:12;52645:42;;52670:17;;-1:-1:-1;;;52670:17:0;;;;;;;;;;;52645:42;-1:-1:-1;52705:7:0;52539:181::o;55256:182::-;55377:53;;-1:-1:-1;;;55377:53:0;;55405:10;55377:53;;;15137:34:1;-1:-1:-1;;;;;15207:15:1;;;15187:18;;;15180:43;15239:18;;;15232:34;;;55377:27:0;;;;;15072:18:1;;55377:53:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;53865:140::-;53934:63;;-1:-1:-1;;;53934:63:0;;53962:10;53934:63;;;15137:34:1;53982:4:0;15187:18:1;;;15180:43;15239:18;;;15232:34;;;-1:-1:-1;;;;;53934:27:0;;;;;15072:18:1;;53934:63:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;53865:140;;:::o;54526:132::-;54611:39;;-1:-1:-1;;;54611:39:0;;-1:-1:-1;;;;;11727:32:1;;;54611:39:0;;;11709:51:1;11776:18;;;11769:34;;;54611:23:0;;;;;11682:18:1;;54611:39:0;11535:274:1;26381:118:0;25390:19;:17;:19::i;:::-;26441:7:::1;:14:::0;;-1:-1:-1;;26441:14:0::1;26451:4;26441:14;::::0;;26471:20:::1;26478:12;11645:10:::0;;11565:98;26478:12:::1;26471:20;::::0;-1:-1:-1;;;;;3275:32:1;;;3257:51;;3245:2;3230:18;26471:20:0::1;;;;;;;26381:118::o:0;22764:132::-;22645:7;22672:6;-1:-1:-1;;;;;22672:6:0;11645:10;22828:23;22820:68;;;;-1:-1:-1;;;22820:68:0;;15729:2:1;22820:68:0;;;15711:21:1;;;15748:18;;;15741:30;15807:34;15787:18;;;15780:62;15859:18;;22820:68:0;15527:356:1;23859:191:0;23933:16;23952:6;;-1:-1:-1;;;;;23969:17:0;;;-1:-1:-1;;;;;;23969:17:0;;;;;;24002:40;;23952:6;;;;;;;24002:40;;23933:16;24002:40;23922:128;23859:191;:::o;25944:108::-;25856:7;;;;26014:9;26006:38;;;;-1:-1:-1;;;26006:38:0;;16090:2:1;26006:38:0;;;16072:21:1;16129:2;16109:18;;;16102:30;-1:-1:-1;;;16148:18:1;;;16141:46;16204:18;;26006:38:0;15888:340:1;52912:153:0;52977:13;52993:9;:7;:9::i;:::-;52977:25;-1:-1:-1;53013:44:0;53028:6;53036:20;52977:25;53036:9;:20;:::i;:::-;53013:14;:44::i;55591:187::-;55659:12;55677:5;-1:-1:-1;;;;;55677:10:0;55695:7;55677:30;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;55658:49;;;55723:7;55718:52;;55739:31;;-1:-1:-1;;;55739:31:0;;-1:-1:-1;;;;;11727:32:1;;55739:31:0;;;11709:51:1;11776:18;;;11769:34;;;11682:18;;55739:31:0;11535:274:1;26640:120:0;25649:16;:14;:16::i;:::-;26699:7:::1;:15:::0;;-1:-1:-1;;26699:15:0::1;::::0;;26730:22:::1;11645:10:::0;26739:12:::1;11565:98:::0;53468:213;53559:10;53582:52;53591:19;;;;:14;:19;:::i;:::-;53612:14;:21;;;53582:8;:52::i;:::-;-1:-1:-1;53652:21:0;;;;53468:213::o;44273:493::-;-1:-1:-1;;;14618:16:0;14637:40;12619:42;12660:1;-1:-1:-1;;;;;;;;;;;12619:42:0;:::i;14637:40::-;14618:59;-1:-1:-1;;;;;;14692:22:0;;14688:77;;44455:38:::1;::::0;-1:-1:-1;;;44455:38:0;;44487:4:::1;44455:38;::::0;::::1;3257:51:1::0;44434:18:0::1;::::0;-1:-1:-1;;;;;44455:23:0;::::1;::::0;::::1;::::0;3230:18:1;;44455:38:0::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;44509;::::0;;16435:25:1;;;-1:-1:-1;;;;;16534:15:1;;;16529:2;16514:18;;16507:43;16586:15;;16566:18;;;16559:43;44509:38:0;;44434:59;;-1:-1:-1;44509:38:0::1;::::0;;;;;16423:2:1;44509:38:0;;::::1;44558:41;::::0;-1:-1:-1;;;44558:41:0;;-1:-1:-1;;;;;11727:32:1;;;44558:41:0::1;::::0;::::1;11709:51:1::0;11776:18;;;11769:34;;;44558:22:0;::::1;::::0;::::1;::::0;11682:18:1;;44558:41:0::1;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1::0;44633:38:0::1;::::0;-1:-1:-1;;;44633:38:0;;44665:4:::1;44633:38;::::0;::::1;3257:51:1::0;44686:10:0;;44674:7;;-1:-1:-1;;;;;44633:23:0;::::1;::::0;::::1;::::0;3230:18:1;;44633:38:0::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:48;;;;:::i;:::-;44632:64;44610:148;;;;-1:-1:-1::0;;;44610:148:0::1;;;;;;;:::i;:::-;44423:343;14747:7:::0;;;14688:77;14855:26;;;-1:-1:-1;;;;;;17155:33:1;;14855:26:0;;;17143:46:1;14855:26:0;;;;;;;;;17205:11:1;;;14855:26:0;;;;-1:-1:-1;;;14810:79:0;;;19794:11;;-1:-1:-1;;;;;14810:32:0;;;;;:79;;14843:10;;14855:26;19794:11;;14810:79;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;44455:38:0::1;::::0;-1:-1:-1;;;44455:38:0;;44487:4:::1;44455:38;::::0;::::1;3257:51:1::0;44434:18:0::1;::::0;-1:-1:-1;;;;;;44455:23:0;::::1;::::0;-1:-1:-1;44455:23:0::1;::::0;3230:18:1;;44455:38:0::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;44509;::::0;;16435:25:1;;;-1:-1:-1;;;;;16534:15:1;;;16529:2;16514:18;;16507:43;16586:15;;16566:18;;;16559:43;44509:38:0;;44434:59;;-1:-1:-1;44509:38:0::1;::::0;;;;;16423:2:1;44509:38:0;;::::1;44558:41;::::0;-1:-1:-1;;;44558:41:0;;-1:-1:-1;;;;;11727:32:1;;;44558:41:0::1;::::0;::::1;11709:51:1::0;11776:18;;;11769:34;;;44558:22:0;::::1;::::0;::::1;::::0;11682:18:1;;44558:41:0::1;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1::0;44633:38:0::1;::::0;-1:-1:-1;;;44633:38:0;;44665:4:::1;44633:38;::::0;::::1;3257:51:1::0;44686:10:0;;44674:7;;-1:-1:-1;;;;;44633:23:0;::::1;::::0;::::1;::::0;3230:18:1;;44633:38:0::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:48;;;;:::i;:::-;44632:64;44610:148;;;;-1:-1:-1::0;;;44610:148:0::1;;;;;;;:::i;:::-;-1:-1:-1::0;14959:26:0;;;-1:-1:-1;;;;;;17155:33:1;;14959:26:0;;;17143:46:1;14959:26:0;;;;;;;;;17205:11:1;;;14959:26:0;;;;-1:-1:-1;;;14913:80:0;;;-1:-1:-1;;;;;14913:33:0;;;;;:80;;14947:10;;14987:5;;14913:80;;;:::i;54832:258::-;54954:10;54977:66;54992:6;55000:19;;;;:14;:19;:::i;:::-;55021:14;:21;;;54977:14;:66::i;:::-;-1:-1:-1;55061:21:0;;;;54832:258;-1:-1:-1;54832:258:0:o;54140:250::-;54258:10;54281:62;54292:6;54300:19;;;;:14;:19;:::i;:::-;54321:14;:21;;;54281:10;:62::i;53200:144::-;53290:7;53280:6;:17;53276:60;;53306:30;;-1:-1:-1;;;53306:30:0;;;;;18321:25:1;;;18362:18;;;18355:34;;;18294:18;;53306:30:0;18147:248:1;8441:332:0;8586:12;8612;8626:23;8653:6;-1:-1:-1;;;;;8653:19:0;8673:4;8653:25;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8611:67;;;;8696:69;8723:6;8731:7;8740:10;8752:12;8696:26;:69::i;:::-;8689:76;8441:332;-1:-1:-1;;;;;;8441:332:0:o;49443:493::-;49505:13;;13344:40;12619:42;12660:1;-1:-1:-1;;;;;;;;;;;12619:42:0;:::i;13344:40::-;13325:59;-1:-1:-1;;;;;;13399:22:0;;13395:77;;49541:9:::1;;49530:20;;49564:8;49576:1;49564:13:::0;49561:26:::1;;49586:1;49579:8;;13454:7:::0;49443:493;:::o;49561:26::-:1;49598:12;49613:22;49624:10;49613;:22::i;:::-;49598:37:::0;-1:-1:-1;49649:11:0;;49646:254:::1;;49677:71;49696:10;49718:8;49708:7;:18;:39;;49739:8;49677:18;:71::i;49708:39::-;49729:7;49677:18;:71::i;:::-;49776:8;49766:7;:18;49763:126;;;49805:19;49817:7:::0;49805:19;::::1;:::i;:::-;;;49763:126;;;49872:1;49865:8;;;13454:7:::0;49443:493;:::o;49763:126::-:1;49910:18;49919:8;49910;:18::i;:::-;49519:417;13454:7:::0;49443:493;:::o;13395:77::-;13517:61;;-1:-1:-1;;;13517:61:0;;19794:11;;-1:-1:-1;;;;;13517:32:0;;;;;:61;;13550:10;;13482;;13562:8;;19794:11;;13517:61;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;49541:9:::1;;49530:20;;49564:8;49576:1;49564:13:::0;49561:26:::1;;49586:1;49579:8;;;;49561:26;49598:12;49613:22;49624:10;49613;:22::i;:::-;49598:37:::0;-1:-1:-1;49649:11:0;;49646:254:::1;;49677:71;49696:10;49718:8;49708:7;:18;:39;;49739:8;49677:18;:71::i;:::-;49776:8;49766:7;:18;49763:126;;;49805:19;49817:7:::0;49805:19;::::1;:::i;:::-;;;49763:126;;;49872:1;49865:8;;;;;49763:126;49910:18;49919:8;49910;:18::i;:::-;49519:417;13589:1;13602:62:::0;;-1:-1:-1;;;13602:62:0;;-1:-1:-1;;;;;13602:33:0;;;;;:62;;13636:10;;13648:8;;;;13658:5;;13602:62;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;13314:358;;49443:493;:::o;26129:108::-;25856:7;;;;26188:41;;;;-1:-1:-1;;;26188:41:0;;18894:2:1;26188:41:0;;;18876:21:1;18933:2;18913:18;;;18906:30;-1:-1:-1;;;18952:18:1;;;18945:50;19012:18;;26188:41:0;18692:344:1;9069:644:0;9254:12;9283:7;9279:427;;;9311:10;:17;9332:1;9311:22;9307:290;;-1:-1:-1;;;;;2950:19:0;;;9521:60;;;;-1:-1:-1;;;9521:60:0;;19243:2:1;9521:60:0;;;19225:21:1;19282:2;19262:18;;;19255:30;19321:31;19301:18;;;19294:59;19370:18;;9521:60:0;19041:353:1;9521:60:0;-1:-1:-1;9618:10:0;9611:17;;9279:427;9661:33;9669:10;9681:12;9661:7;:33::i;:::-;9069:644;;;;;;:::o;48655:153::-;48744:16;;48778:11;;48733:67;;-1:-1:-1;;;48733:67:0;;-1:-1:-1;;;;;19619:32:1;;;48733:67:0;;;19601:51:1;19668:18;;;19661:34;;;;19711:18;;;19704:34;;;48744:16:0;;;48733:37;;19574:18:1;;48733:67:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;48655:153;;:::o;49944:399::-;50012:8;;-1:-1:-1;;;;;50012:8:0;;50056:240;;50116:4;50104:9;:16;50100:51;;;50129:22;;-1:-1:-1;;;50129:22:0;;;;;;;;;;;50100:51;50171:36;;;50185:9;9218:25:1;;50196:10:0;9274:2:1;9259:18;;9252:60;50171:36:0;;9191:18:1;50171:36:0;;;;;;;50056:240;;;50240:44;50256:9;50267:10;50279:4;50240:15;:44::i;:::-;-1:-1:-1;;;;;50306:21:0;;;;;;:10;:21;;;;;:29;;50331:4;;50306:21;:29;;50331:4;;50306:29;:::i;:::-;;;;-1:-1:-1;;;;49944:399:0:o;10255:552::-;10416:17;;:21;10412:388;;10648:10;10642:17;10705:15;10692:10;10688:2;10684:19;10677:44;10412:388;10775:12;10768:20;;-1:-1:-1;;;10768:20:0;;;;;;;;:::i;44774:556::-;44135:46;;-1:-1:-1;;;44135:46:0;;-1:-1:-1;;;;;20203:15:1;;;44135:46:0;;;20185:34:1;44175:4:0;20235:18:1;;;20228:43;44907:6:0;;44915:8;;44925:7;;;;44135:23;;;;;20120:18:1;;44135:46:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:57;;44113:132;;;;-1:-1:-1;;;44113:132:0;;20484:2:1;44113:132:0;;;20466:21:1;20523:2;20503:18;;;20496:30;20562:27;20542:18;;;20535:55;20607:18;;44113:132:0;20282:349:1;44113:132:0;44963:1:::1;44953:7;:11;44945:20;;;::::0;::::1;;44997:38;::::0;-1:-1:-1;;;44997:38:0;;45029:4:::1;44997:38;::::0;::::1;3257:51:1::0;44976:18:0::1;::::0;-1:-1:-1;;;;;44997:23:0;::::1;::::0;::::1;::::0;3230:18:1;;44997:38:0::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;45046:60;::::0;-1:-1:-1;;;45046:60:0;;-1:-1:-1;;;;;15155:15:1;;;45046:60:0::1;::::0;::::1;15137:34:1::0;45091:4:0::1;15187:18:1::0;;;15180:43;15239:18;;;15232:34;;;44976:59:0;;-1:-1:-1;45046:26:0;;::::1;::::0;::::1;::::0;15072:18:1;;45046:60:0::1;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1::0;45122:37:0::1;::::0;;16435:25:1;;;-1:-1:-1;;;;;16534:15:1;;;16529:2;16514:18;;16507:43;16586:15;;16566:18;;;16559:43;45122:37:0;;::::1;::::0;;;;16423:2:1;45122:37:0;;::::1;45218:38;::::0;-1:-1:-1;;;45218:38:0;;45250:4:::1;45218:38;::::0;::::1;3257:51:1::0;-1:-1:-1;;;;;45218:23:0;::::1;::::0;::::1;::::0;3230:18:1;;45218:38:0::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;45193:20;45206:7:::0;45193:10;:20:::1;:::i;:::-;45192:64;45170:152;;;::::0;-1:-1:-1;;;45170:152:0;;20838:2:1;45170:152:0::1;::::0;::::1;20820:21:1::0;20877:2;20857:18;;;20850:30;20916:34;20896:18;;;20889:62;-1:-1:-1;;;20967:18:1;;;20960:36;21013:19;;45170:152:0::1;20636:402:1::0;14:173;82:20;;-1:-1:-1;;;;;131:31:1;;121:42;;111:70;;177:1;174;167:12;111:70;14:173;;;:::o;192:186::-;251:6;304:2;292:9;283:7;279:23;275:32;272:52;;;320:1;317;310:12;272:52;343:29;362:9;343:29;:::i;383:347::-;434:8;444:6;498:3;491:4;483:6;479:17;475:27;465:55;;516:1;513;506:12;465:55;-1:-1:-1;539:20:1;;582:18;571:30;;568:50;;;614:1;611;604:12;568:50;651:4;643:6;639:17;627:29;;703:3;696:4;687:6;679;675:19;671:30;668:39;665:59;;;720:1;717;710:12;665:59;383:347;;;;;:::o;735:791::-;834:6;842;850;858;866;919:2;907:9;898:7;894:23;890:32;887:52;;;935:1;932;925:12;887:52;958:29;977:9;958:29;:::i;:::-;948:39;;1038:2;1027:9;1023:18;1010:32;1061:18;1102:2;1094:6;1091:14;1088:34;;;1118:1;1115;1108:12;1088:34;1157:58;1207:7;1198:6;1187:9;1183:22;1157:58;:::i;:::-;1234:8;;-1:-1:-1;1131:84:1;-1:-1:-1;1322:2:1;1307:18;;1294:32;;-1:-1:-1;1338:16:1;;;1335:36;;;1367:1;1364;1357:12;1335:36;;1406:60;1458:7;1447:8;1436:9;1432:24;1406:60;:::i;:::-;735:791;;;;-1:-1:-1;735:791:1;;-1:-1:-1;1485:8:1;;1380:86;735:791;-1:-1:-1;;;735:791:1:o;1531:367::-;1594:8;1604:6;1658:3;1651:4;1643:6;1639:17;1635:27;1625:55;;1676:1;1673;1666:12;1625:55;-1:-1:-1;1699:20:1;;1742:18;1731:30;;1728:50;;;1774:1;1771;1764:12;1728:50;1811:4;1803:6;1799:17;1787:29;;1871:3;1864:4;1854:6;1851:1;1847:14;1839:6;1835:27;1831:38;1828:47;1825:67;;;1888:1;1885;1878:12;1903:437;1989:6;1997;2050:2;2038:9;2029:7;2025:23;2021:32;2018:52;;;2066:1;2063;2056:12;2018:52;2106:9;2093:23;2139:18;2131:6;2128:30;2125:50;;;2171:1;2168;2161:12;2125:50;2210:70;2272:7;2263:6;2252:9;2248:22;2210:70;:::i;:::-;2299:8;;2184:96;;-1:-1:-1;1903:437:1;-1:-1:-1;;;;1903:437:1:o;2527:579::-;2631:6;2639;2647;2655;2708:2;2696:9;2687:7;2683:23;2679:32;2676:52;;;2724:1;2721;2714:12;2676:52;2747:29;2766:9;2747:29;:::i;:::-;2737:39;;2827:2;2816:9;2812:18;2799:32;2854:18;2846:6;2843:30;2840:50;;;2886:1;2883;2876:12;2840:50;2925:70;2987:7;2978:6;2967:9;2963:22;2925:70;:::i;:::-;2527:579;;3014:8;;-1:-1:-1;2899:96:1;;3096:2;3081:18;3068:32;;2527:579;-1:-1:-1;;;;2527:579:1:o;3511:505::-;3606:6;3614;3622;3675:2;3663:9;3654:7;3650:23;3646:32;3643:52;;;3691:1;3688;3681:12;3643:52;3731:9;3718:23;3764:18;3756:6;3753:30;3750:50;;;3796:1;3793;3786:12;3750:50;3835:70;3897:7;3888:6;3877:9;3873:22;3835:70;:::i;:::-;3924:8;;3809:96;;-1:-1:-1;4006:2:1;3991:18;;;;3978:32;;3511:505;-1:-1:-1;;;;3511:505:1:o;4021:389::-;4106:8;4116:6;4170:3;4163:4;4155:6;4151:17;4147:27;4137:55;;4188:1;4185;4178:12;4137:55;-1:-1:-1;4211:20:1;;4254:18;4243:30;;4240:50;;;4286:1;4283;4276:12;4240:50;4323:4;4315:6;4311:17;4299:29;;4383:3;4376:4;4366:6;4363:1;4359:14;4351:6;4347:27;4343:38;4340:47;4337:67;;;4400:1;4397;4390:12;4415:492;4534:6;4542;4595:2;4583:9;4574:7;4570:23;4566:32;4563:52;;;4611:1;4608;4601:12;4563:52;4651:9;4638:23;4684:18;4676:6;4673:30;4670:50;;;4716:1;4713;4706:12;4670:50;4755:92;4839:7;4830:6;4819:9;4815:22;4755:92;:::i;4912:260::-;4980:6;4988;5041:2;5029:9;5020:7;5016:23;5012:32;5009:52;;;5057:1;5054;5047:12;5009:52;5080:29;5099:9;5080:29;:::i;:::-;5070:39;;5128:38;5162:2;5151:9;5147:18;5128:38;:::i;:::-;5118:48;;4912:260;;;;;:::o;5177:566::-;5305:6;5313;5321;5374:2;5362:9;5353:7;5349:23;5345:32;5342:52;;;5390:1;5387;5380:12;5342:52;5413:29;5432:9;5413:29;:::i;:::-;5403:39;;5493:2;5482:9;5478:18;5465:32;5520:18;5512:6;5509:30;5506:50;;;5552:1;5549;5542:12;5506:50;5591:92;5675:7;5666:6;5655:9;5651:22;5591:92;:::i;:::-;5177:566;;5702:8;;-1:-1:-1;5565:118:1;;-1:-1:-1;;;;5177:566:1:o;5748:118::-;5834:5;5827:13;5820:21;5813:5;5810:32;5800:60;;5856:1;5853;5846:12;5871:315;5936:6;5944;5997:2;5985:9;5976:7;5972:23;5968:32;5965:52;;;6013:1;6010;6003:12;5965:52;6036:29;6055:9;6036:29;:::i;:::-;6026:39;;6115:2;6104:9;6100:18;6087:32;6128:28;6150:5;6128:28;:::i;:::-;6175:5;6165:15;;;5871:315;;;;;:::o;6191:773::-;6313:6;6321;6329;6337;6390:2;6378:9;6369:7;6365:23;6361:32;6358:52;;;6406:1;6403;6396:12;6358:52;6446:9;6433:23;6475:18;6516:2;6508:6;6505:14;6502:34;;;6532:1;6529;6522:12;6502:34;6571:70;6633:7;6624:6;6613:9;6609:22;6571:70;:::i;:::-;6660:8;;-1:-1:-1;6545:96:1;-1:-1:-1;6748:2:1;6733:18;;6720:32;;-1:-1:-1;6764:16:1;;;6761:36;;;6793:1;6790;6783:12;6761:36;;6832:72;6896:7;6885:8;6874:9;6870:24;6832:72;:::i;:::-;6191:773;;;;-1:-1:-1;6923:8:1;-1:-1:-1;;;;6191:773:1:o;6969:634::-;7106:6;7114;7122;7130;7183:2;7171:9;7162:7;7158:23;7154:32;7151:52;;;7199:1;7196;7189:12;7151:52;7222:29;7241:9;7222:29;:::i;:::-;7212:39;;7298:2;7287:9;7283:18;7270:32;7260:42;;7353:2;7342:9;7338:18;7325:32;7380:18;7372:6;7369:30;7366:50;;;7412:1;7409;7402:12;7366:50;7451:92;7535:7;7526:6;7515:9;7511:22;7451:92;:::i;7608:254::-;7676:6;7684;7737:2;7725:9;7716:7;7712:23;7708:32;7705:52;;;7753:1;7750;7743:12;7705:52;7776:29;7795:9;7776:29;:::i;:::-;7766:39;7852:2;7837:18;;;;7824:32;;-1:-1:-1;;;7608:254:1:o;7867:127::-;7928:10;7923:3;7919:20;7916:1;7909:31;7959:4;7956:1;7949:15;7983:4;7980:1;7973:15;7999:128;8066:9;;;8087:11;;;8084:37;;;8101:18;;:::i;8132:343::-;8334:2;8316:21;;;8373:2;8353:18;;;8346:30;-1:-1:-1;;;8407:2:1;8392:18;;8385:49;8466:2;8451:18;;8132:343::o;8480:559::-;-1:-1:-1;;;;;8693:32:1;;8675:51;;8762:2;8757;8742:18;;8735:30;;;8781:18;;8774:34;;;8801:6;8851;8845:3;8830:19;;8817:49;8916:1;8910:3;8901:6;8890:9;8886:22;8882:32;8875:43;8656:4;8986:3;8979:2;8975:7;8970:2;8962:6;8958:15;8954:29;8943:9;8939:45;8935:55;8927:63;;9026:6;9021:2;9010:9;9006:18;8999:34;8480:559;;;;;;;:::o;9729:271::-;9912:6;9904;9899:3;9886:33;9868:3;9938:16;;9963:13;;;9938:16;9729:271;-1:-1:-1;9729:271:1:o;10412:449::-;10512:6;10507:3;10500:19;10482:3;10538:4;10567;10562:3;10558:14;10551:21;;10595:5;10618:1;10628:208;10642:6;10639:1;10636:13;10628:208;;;-1:-1:-1;;;;;10707:26:1;10726:6;10707:26;:::i;:::-;10703:52;10691:65;;10776:12;;;;10811:15;;;;10664:1;10657:9;10628:208;;;-1:-1:-1;10852:3:1;;10412:449;-1:-1:-1;;;;;10412:449:1:o;10866:359::-;11083:6;11072:9;11065:25;11126:2;11121;11110:9;11106:18;11099:30;11046:4;11146:73;11215:2;11204:9;11200:18;11192:6;11184;11146:73;:::i;:::-;11138:81;10866:359;-1:-1:-1;;;;;10866:359:1:o;11230:127::-;11291:10;11286:3;11282:20;11279:1;11272:31;11322:4;11319:1;11312:15;11346:4;11343:1;11336:15;11362:168;11435:9;;;11466;;11483:15;;;11477:22;;11463:37;11453:71;;11504:18;;:::i;11814:184::-;11884:6;11937:2;11925:9;11916:7;11912:23;11908:32;11905:52;;;11953:1;11950;11943:12;11905:52;-1:-1:-1;11976:16:1;;11814:184;-1:-1:-1;11814:184:1:o;12003:400::-;12205:2;12187:21;;;12244:2;12224:18;;;12217:30;12283:34;12278:2;12263:18;;12256:62;-1:-1:-1;;;12349:2:1;12334:18;;12327:34;12393:3;12378:19;;12003:400::o;13127:125::-;13192:9;;;13213:10;;;13210:36;;;13226:18;;:::i;13467:739::-;13772:6;13761:9;13754:25;13815:2;13810;13799:9;13795:18;13788:30;13735:4;13841:73;13910:2;13899:9;13895:18;13887:6;13879;13841:73;:::i;:::-;13950:22;;;13945:2;13930:18;;13923:50;13982:22;;;-1:-1:-1;;;;;14016:31:1;;14013:51;;;14060:1;14057;14050:12;14013:51;14094:6;14091:1;14087:14;14148:6;14140;14135:2;14127:6;14123:15;14110:45;14176:19;14197:2;14172:28;;13467:739;-1:-1:-1;;;;;;;13467:739:1:o;15277:245::-;15344:6;15397:2;15385:9;15376:7;15372:23;15368:32;15365:52;;;15413:1;15410;15403:12;15365:52;15445:9;15439:16;15464:28;15486:5;15464:28;:::i;16613:398::-;16815:2;16797:21;;;16854:2;16834:18;;;16827:30;16893:34;16888:2;16873:18;;16866:62;-1:-1:-1;;;16959:2:1;16944:18;;16937:32;17001:3;16986:19;;16613:398::o;17227:250::-;17312:1;17322:113;17336:6;17333:1;17330:13;17322:113;;;17412:11;;;17406:18;17393:11;;;17386:39;17358:2;17351:10;17322:113;;;-1:-1:-1;;17469:1:1;17451:16;;17444:27;17227:250::o;17482:270::-;17523:3;17561:5;17555:12;17588:6;17583:3;17576:19;17604:76;17673:6;17666:4;17661:3;17657:14;17650:4;17643:5;17639:16;17604:76;:::i;:::-;17734:2;17713:15;-1:-1:-1;;17709:29:1;17700:39;;;;17741:4;17696:50;;17482:270;-1:-1:-1;;17482:270:1:o;17757:385::-;-1:-1:-1;;;;;17960:32:1;;17942:51;;18029:2;18024;18009:18;;18002:30;;;-1:-1:-1;;18049:44:1;;18074:18;;18066:6;18049:44;:::i;:::-;18041:52;;18129:6;18124:2;18113:9;18109:18;18102:34;17757:385;;;;;;:::o;18400:287::-;18529:3;18567:6;18561:13;18583:66;18642:6;18637:3;18630:4;18622:6;18618:17;18583:66;:::i;:::-;18665:16;;;;;18400:287;-1:-1:-1;;18400:287:1:o;19749:219::-;19898:2;19887:9;19880:21;19861:4;19918:44;19958:2;19947:9;19943:18;19935:6;19918:44;:::i
Swarm Source
ipfs://57ba9d84968badcaf1be197d2b8395432838f82ae7d26ff0f8692b83a87f47b2
Loading...
Loading
Loading...
Loading
Multichain Portfolio | 26 Chains
Chain | Token | Portfolio % | Price | Amount | Value |
---|
Loading...
Loading
[ Download: CSV Export ]
A contract address hosts a smart contract, which is a set of code stored on the blockchain that runs when predetermined conditions are met. Learn more about addresses in our Knowledge Base.