More Info
Private Name Tags
ContractCreator
Latest 8 internal transactions
Loading...
Loading
Contract Name:
Refuel
Compiler Version
v0.8.20+commit.a1b79de6
Contract Source Code (Solidity)
/** *Submitted for verification at SonicScan.org on 2025-01-24 */ // SPDX-License-Identifier: UNLICENSED pragma solidity ^0.8.18 ^0.8.20; // node_modules/@openzeppelin/contracts/access/IAccessControl.sol // OpenZeppelin Contracts (last updated v5.0.0) (access/IAccessControl.sol) /** * @dev External interface of AccessControl declared to support ERC165 detection. */ interface IAccessControl { /** * @dev The `account` is missing a role. */ error AccessControlUnauthorizedAccount(address account, bytes32 neededRole); /** * @dev The caller of a function is not the expected one. * * NOTE: Don't confuse with {AccessControlUnauthorizedAccount}. */ error AccessControlBadConfirmation(); /** * @dev Emitted when `newAdminRole` is set as ``role``'s admin role, replacing `previousAdminRole` * * `DEFAULT_ADMIN_ROLE` is the starting admin for all roles, despite * {RoleAdminChanged} not being emitted signaling this. */ event RoleAdminChanged(bytes32 indexed role, bytes32 indexed previousAdminRole, bytes32 indexed newAdminRole); /** * @dev Emitted when `account` is granted `role`. * * `sender` is the account that originated the contract call, an admin role * bearer except when using {AccessControl-_setupRole}. */ event RoleGranted(bytes32 indexed role, address indexed account, address indexed sender); /** * @dev Emitted when `account` is revoked `role`. * * `sender` is the account that originated the contract call: * - if using `revokeRole`, it is the admin role bearer * - if using `renounceRole`, it is the role bearer (i.e. `account`) */ event RoleRevoked(bytes32 indexed role, address indexed account, address indexed sender); /** * @dev Returns `true` if `account` has been granted `role`. */ function hasRole(bytes32 role, address account) external view returns (bool); /** * @dev Returns the admin role that controls `role`. See {grantRole} and * {revokeRole}. * * To change a role's admin, use {AccessControl-_setRoleAdmin}. */ function getRoleAdmin(bytes32 role) external view returns (bytes32); /** * @dev Grants `role` to `account`. * * If `account` had not been already granted `role`, emits a {RoleGranted} * event. * * Requirements: * * - the caller must have ``role``'s admin role. */ function grantRole(bytes32 role, address account) external; /** * @dev Revokes `role` from `account`. * * If `account` had been granted `role`, emits a {RoleRevoked} event. * * Requirements: * * - the caller must have ``role``'s admin role. */ function revokeRole(bytes32 role, address account) external; /** * @dev Revokes `role` from the calling account. * * Roles are often managed via {grantRole} and {revokeRole}: this function's * purpose is to provide a mechanism for accounts to lose their privileges * if they are compromised (such as when a trusted device is misplaced). * * If the calling account had been granted `role`, emits a {RoleRevoked} * event. * * Requirements: * * - the caller must be `callerConfirmation`. */ function renounceRole(bytes32 role, address callerConfirmation) external; } // node_modules/@openzeppelin/contracts/token/ERC20/IERC20.sol // OpenZeppelin Contracts (last updated v5.0.0) (token/ERC20/IERC20.sol) /** * @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 value of tokens in existence. */ function totalSupply() external view returns (uint256); /** * @dev Returns the value of tokens owned by `account`. */ function balanceOf(address account) external view returns (uint256); /** * @dev Moves a `value` amount of 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 value) 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 a `value` amount of tokens 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 value) external returns (bool); /** * @dev Moves a `value` amount of tokens from `from` to `to` using the * allowance mechanism. `value` 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 value) external returns (bool); } // node_modules/@openzeppelin/contracts/token/ERC20/extensions/IERC20Permit.sol // OpenZeppelin Contracts (last updated v5.0.0) (token/ERC20/extensions/IERC20Permit.sol) /** * @dev Interface of the ERC20 Permit extension allowing approvals to be made via signatures, as defined in * https://eips.ethereum.org/EIPS/eip-2612[EIP-2612]. * * Adds the {permit} method, which can be used to change an account's ERC20 allowance (see {IERC20-allowance}) by * presenting a message signed by the account. By not relying on {IERC20-approve}, the token holder account doesn't * need to send a transaction, and thus is not required to hold Ether at all. * * ==== Security Considerations * * There are two important considerations concerning the use of `permit`. The first is that a valid permit signature * expresses an allowance, and it should not be assumed to convey additional meaning. In particular, it should not be * considered as an intention to spend the allowance in any specific way. The second is that because permits have * built-in replay protection and can be submitted by anyone, they can be frontrun. A protocol that uses permits should * take this into consideration and allow a `permit` call to fail. Combining these two aspects, a pattern that may be * generally recommended is: * * ```solidity * function doThingWithPermit(..., uint256 value, uint256 deadline, uint8 v, bytes32 r, bytes32 s) public { * try token.permit(msg.sender, address(this), value, deadline, v, r, s) {} catch {} * doThing(..., value); * } * * function doThing(..., uint256 value) public { * token.safeTransferFrom(msg.sender, address(this), value); * ... * } * ``` * * Observe that: 1) `msg.sender` is used as the owner, leaving no ambiguity as to the signer intent, and 2) the use of * `try/catch` allows the permit to fail and makes the code tolerant to frontrunning. (See also * {SafeERC20-safeTransferFrom}). * * Additionally, note that smart contract wallets (such as Argent or Safe) are not able to produce permit signatures, so * contracts should have entry points that don't rely on permit. */ interface IERC20Permit { /** * @dev Sets `value` as the allowance of `spender` over ``owner``'s tokens, * given ``owner``'s signed approval. * * IMPORTANT: The same issues {IERC20-approve} has related to transaction * ordering also apply here. * * Emits an {Approval} event. * * Requirements: * * - `spender` cannot be the zero address. * - `deadline` must be a timestamp in the future. * - `v`, `r` and `s` must be a valid `secp256k1` signature from `owner` * over the EIP712-formatted function arguments. * - the signature must use ``owner``'s current nonce (see {nonces}). * * For more information on the signature format, see the * https://eips.ethereum.org/EIPS/eip-2612#specification[relevant EIP * section]. * * CAUTION: See Security Considerations above. */ function permit( address owner, address spender, uint256 value, uint256 deadline, uint8 v, bytes32 r, bytes32 s ) external; /** * @dev Returns the current nonce for `owner`. This value must be * included whenever a signature is generated for {permit}. * * Every successful call to {permit} increases ``owner``'s nonce by one. This * prevents a signature from being used multiple times. */ function nonces(address owner) external view returns (uint256); /** * @dev Returns the domain separator used in the encoding of the signature for {permit}, as defined by {EIP712}. */ // solhint-disable-next-line func-name-mixedcase function DOMAIN_SEPARATOR() external view returns (bytes32); } // node_modules/@openzeppelin/contracts/utils/Address.sol // OpenZeppelin Contracts (last updated v5.0.0) (utils/Address.sol) /** * @dev Collection of functions related to the address type */ library Address { /** * @dev The ETH balance of the account is not enough to perform the operation. */ error AddressInsufficientBalance(address account); /** * @dev There's no code at `target` (it is not a contract). */ error AddressEmptyCode(address target); /** * @dev A call to an address target failed. The target may have reverted. */ error FailedInnerCall(); /** * @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.20/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern]. */ function sendValue(address payable recipient, uint256 amount) internal { if (address(this).balance < amount) { revert AddressInsufficientBalance(address(this)); } (bool success, ) = recipient.call{value: amount}(""); if (!success) { revert FailedInnerCall(); } } /** * @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 or custom error, it is bubbled * up by this function (like regular Solidity function calls). However, if * the call reverted with no returned reason, this function reverts with a * {FailedInnerCall} error. * * 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. */ function functionCall(address target, bytes memory data) internal returns (bytes memory) { return functionCallWithValue(target, data, 0); } /** * @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`. */ function functionCallWithValue(address target, bytes memory data, uint256 value) internal returns (bytes memory) { if (address(this).balance < value) { revert AddressInsufficientBalance(address(this)); } (bool success, bytes memory returndata) = target.call{value: value}(data); return verifyCallResultFromTarget(target, success, returndata); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but performing a static call. */ function functionStaticCall(address target, bytes memory data) internal view returns (bytes memory) { (bool success, bytes memory returndata) = target.staticcall(data); return verifyCallResultFromTarget(target, success, returndata); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but performing a delegate call. */ function functionDelegateCall(address target, bytes memory data) internal returns (bytes memory) { (bool success, bytes memory returndata) = target.delegatecall(data); return verifyCallResultFromTarget(target, success, returndata); } /** * @dev Tool to verify that a low level call to smart-contract was successful, and reverts if the target * was not a contract or bubbling up the revert reason (falling back to {FailedInnerCall}) in case of an * unsuccessful call. */ function verifyCallResultFromTarget( address target, bool success, bytes memory returndata ) internal view returns (bytes memory) { if (!success) { _revert(returndata); } else { // only check if target is a contract if the call was successful and the return data is empty // otherwise we already know that it was a contract if (returndata.length == 0 && target.code.length == 0) { revert AddressEmptyCode(target); } return returndata; } } /** * @dev Tool to verify that a low level call was successful, and reverts if it wasn't, either by bubbling the * revert reason or with a default {FailedInnerCall} error. */ function verifyCallResult(bool success, bytes memory returndata) internal pure returns (bytes memory) { if (!success) { _revert(returndata); } else { return returndata; } } /** * @dev Reverts with returndata if present. Otherwise reverts with {FailedInnerCall}. */ function _revert(bytes memory returndata) 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 FailedInnerCall(); } } } // node_modules/@openzeppelin/contracts/utils/Context.sol // OpenZeppelin Contracts (last updated v5.0.0) (utils/Context.sol) /** * @dev Provides information about the current execution context, including the * sender of the transaction and its data. While these are generally available * via msg.sender and msg.data, they should not be accessed in such a direct * manner, since when dealing with meta-transactions the account sending and * paying for execution may not be the actual sender (as far as an application * is concerned). * * This contract is only required for intermediate, library-like contracts. */ abstract contract Context { function _msgSender() internal view virtual returns (address) { return msg.sender; } function _msgData() internal view virtual returns (bytes calldata) { return msg.data; } } // node_modules/@openzeppelin/contracts/utils/introspection/IERC165.sol // OpenZeppelin Contracts (last updated v5.0.0) (utils/introspection/IERC165.sol) /** * @dev Interface of the ERC165 standard, as defined in the * https://eips.ethereum.org/EIPS/eip-165[EIP]. * * Implementers can declare support of contract interfaces, which can then be * queried by others ({ERC165Checker}). * * For an implementation, see {ERC165}. */ interface IERC165 { /** * @dev Returns true if this contract implements the interface defined by * `interfaceId`. See the corresponding * https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified[EIP section] * to learn more about how these ids are created. * * This function call must use less than 30 000 gas. */ function supportsInterface(bytes4 interfaceId) external view returns (bool); } // node_modules/@openzeppelin/contracts/utils/math/Math.sol // OpenZeppelin Contracts (last updated v5.0.0) (utils/math/Math.sol) /** * @dev Standard math utilities missing in the Solidity language. */ library Math { /** * @dev Muldiv operation overflow. */ error MathOverflowedMulDiv(); enum Rounding { Floor, // Toward negative infinity Ceil, // Toward positive infinity Trunc, // Toward zero Expand // Away from zero } /** * @dev Returns the addition of two unsigned integers, with an overflow flag. */ function tryAdd(uint256 a, uint256 b) internal pure returns (bool, uint256) { unchecked { uint256 c = a + b; if (c < a) return (false, 0); return (true, c); } } /** * @dev Returns the subtraction of two unsigned integers, with an overflow flag. */ function trySub(uint256 a, uint256 b) internal pure returns (bool, uint256) { unchecked { if (b > a) return (false, 0); return (true, a - b); } } /** * @dev Returns the multiplication of two unsigned integers, with an overflow flag. */ function tryMul(uint256 a, uint256 b) internal pure returns (bool, uint256) { unchecked { // Gas optimization: this is cheaper than requiring 'a' not being zero, but the // benefit is lost if 'b' is also tested. // See: https://github.com/OpenZeppelin/openzeppelin-contracts/pull/522 if (a == 0) return (true, 0); uint256 c = a * b; if (c / a != b) return (false, 0); return (true, c); } } /** * @dev Returns the division of two unsigned integers, with a division by zero flag. */ function tryDiv(uint256 a, uint256 b) internal pure returns (bool, uint256) { unchecked { if (b == 0) return (false, 0); return (true, a / b); } } /** * @dev Returns the remainder of dividing two unsigned integers, with a division by zero flag. */ function tryMod(uint256 a, uint256 b) internal pure returns (bool, uint256) { unchecked { if (b == 0) return (false, 0); return (true, a % b); } } /** * @dev Returns the largest of two numbers. */ function max(uint256 a, uint256 b) internal pure returns (uint256) { return a > b ? a : b; } /** * @dev Returns the smallest of two numbers. */ function min(uint256 a, uint256 b) internal pure returns (uint256) { return a < b ? a : b; } /** * @dev Returns the average of two numbers. The result is rounded towards * zero. */ function average(uint256 a, uint256 b) internal pure returns (uint256) { // (a + b) / 2 can overflow. return (a & b) + (a ^ b) / 2; } /** * @dev Returns the ceiling of the division of two numbers. * * This differs from standard division with `/` in that it rounds towards infinity instead * of rounding towards zero. */ function ceilDiv(uint256 a, uint256 b) internal pure returns (uint256) { if (b == 0) { // Guarantee the same behavior as in a regular Solidity division. return a / b; } // (a + b - 1) / b can overflow on addition, so we distribute. return a == 0 ? 0 : (a - 1) / b + 1; } /** * @notice Calculates floor(x * y / denominator) with full precision. Throws if result overflows a uint256 or * denominator == 0. * @dev Original credit to Remco Bloemen under MIT license (https://xn--2-umb.com/21/muldiv) with further edits by * Uniswap Labs also under MIT license. */ function mulDiv(uint256 x, uint256 y, uint256 denominator) internal pure returns (uint256 result) { unchecked { // 512-bit multiply [prod1 prod0] = x * y. Compute the product mod 2^256 and mod 2^256 - 1, then use // use the Chinese Remainder Theorem to reconstruct the 512 bit result. The result is stored in two 256 // variables such that product = prod1 * 2^256 + prod0. uint256 prod0 = x * y; // Least significant 256 bits of the product uint256 prod1; // Most significant 256 bits of the product assembly { let mm := mulmod(x, y, not(0)) prod1 := sub(sub(mm, prod0), lt(mm, prod0)) } // Handle non-overflow cases, 256 by 256 division. if (prod1 == 0) { // Solidity will revert if denominator == 0, unlike the div opcode on its own. // The surrounding unchecked block does not change this fact. // See https://docs.soliditylang.org/en/latest/control-structures.html#checked-or-unchecked-arithmetic. return prod0 / denominator; } // Make sure the result is less than 2^256. Also prevents denominator == 0. if (denominator <= prod1) { revert MathOverflowedMulDiv(); } /////////////////////////////////////////////// // 512 by 256 division. /////////////////////////////////////////////// // Make division exact by subtracting the remainder from [prod1 prod0]. uint256 remainder; assembly { // Compute remainder using mulmod. remainder := mulmod(x, y, denominator) // Subtract 256 bit number from 512 bit number. prod1 := sub(prod1, gt(remainder, prod0)) prod0 := sub(prod0, remainder) } // Factor powers of two out of denominator and compute largest power of two divisor of denominator. // Always >= 1. See https://cs.stackexchange.com/q/138556/92363. uint256 twos = denominator & (0 - denominator); assembly { // Divide denominator by twos. denominator := div(denominator, twos) // Divide [prod1 prod0] by twos. prod0 := div(prod0, twos) // Flip twos such that it is 2^256 / twos. If twos is zero, then it becomes one. twos := add(div(sub(0, twos), twos), 1) } // Shift in bits from prod1 into prod0. prod0 |= prod1 * twos; // Invert denominator mod 2^256. Now that denominator is an odd number, it has an inverse modulo 2^256 such // that denominator * inv = 1 mod 2^256. Compute the inverse by starting with a seed that is correct for // four bits. That is, denominator * inv = 1 mod 2^4. uint256 inverse = (3 * denominator) ^ 2; // Use the Newton-Raphson iteration to improve the precision. Thanks to Hensel's lifting lemma, this also // works in modular arithmetic, doubling the correct bits in each step. inverse *= 2 - denominator * inverse; // inverse mod 2^8 inverse *= 2 - denominator * inverse; // inverse mod 2^16 inverse *= 2 - denominator * inverse; // inverse mod 2^32 inverse *= 2 - denominator * inverse; // inverse mod 2^64 inverse *= 2 - denominator * inverse; // inverse mod 2^128 inverse *= 2 - denominator * inverse; // inverse mod 2^256 // Because the division is now exact we can divide by multiplying with the modular inverse of denominator. // This will give us the correct result modulo 2^256. Since the preconditions guarantee that the outcome is // less than 2^256, this is the final result. We don't need to compute the high bits of the result and prod1 // is no longer required. result = prod0 * inverse; return result; } } /** * @notice Calculates x * y / denominator with full precision, following the selected rounding direction. */ function mulDiv(uint256 x, uint256 y, uint256 denominator, Rounding rounding) internal pure returns (uint256) { uint256 result = mulDiv(x, y, denominator); if (unsignedRoundsUp(rounding) && mulmod(x, y, denominator) > 0) { result += 1; } return result; } /** * @dev Returns the square root of a number. If the number is not a perfect square, the value is rounded * towards zero. * * Inspired by Henry S. Warren, Jr.'s "Hacker's Delight" (Chapter 11). */ function sqrt(uint256 a) internal pure returns (uint256) { if (a == 0) { return 0; } // For our first guess, we get the biggest power of 2 which is smaller than the square root of the target. // // We know that the "msb" (most significant bit) of our target number `a` is a power of 2 such that we have // `msb(a) <= a < 2*msb(a)`. This value can be written `msb(a)=2**k` with `k=log2(a)`. // // This can be rewritten `2**log2(a) <= a < 2**(log2(a) + 1)` // → `sqrt(2**k) <= sqrt(a) < sqrt(2**(k+1))` // → `2**(k/2) <= sqrt(a) < 2**((k+1)/2) <= 2**(k/2 + 1)` // // Consequently, `2**(log2(a) / 2)` is a good first approximation of `sqrt(a)` with at least 1 correct bit. uint256 result = 1 << (log2(a) >> 1); // At this point `result` is an estimation with one bit of precision. We know the true value is a uint128, // since it is the square root of a uint256. Newton's method converges quadratically (precision doubles at // every iteration). We thus need at most 7 iteration to turn our partial result with one bit of precision // into the expected uint128 result. unchecked { result = (result + a / result) >> 1; result = (result + a / result) >> 1; result = (result + a / result) >> 1; result = (result + a / result) >> 1; result = (result + a / result) >> 1; result = (result + a / result) >> 1; result = (result + a / result) >> 1; return min(result, a / result); } } /** * @notice Calculates sqrt(a), following the selected rounding direction. */ function sqrt(uint256 a, Rounding rounding) internal pure returns (uint256) { unchecked { uint256 result = sqrt(a); return result + (unsignedRoundsUp(rounding) && result * result < a ? 1 : 0); } } /** * @dev Return the log in base 2 of a positive value rounded towards zero. * Returns 0 if given 0. */ function log2(uint256 value) internal pure returns (uint256) { uint256 result = 0; unchecked { if (value >> 128 > 0) { value >>= 128; result += 128; } if (value >> 64 > 0) { value >>= 64; result += 64; } if (value >> 32 > 0) { value >>= 32; result += 32; } if (value >> 16 > 0) { value >>= 16; result += 16; } if (value >> 8 > 0) { value >>= 8; result += 8; } if (value >> 4 > 0) { value >>= 4; result += 4; } if (value >> 2 > 0) { value >>= 2; result += 2; } if (value >> 1 > 0) { result += 1; } } return result; } /** * @dev Return the log in base 2, following the selected rounding direction, of a positive value. * Returns 0 if given 0. */ function log2(uint256 value, Rounding rounding) internal pure returns (uint256) { unchecked { uint256 result = log2(value); return result + (unsignedRoundsUp(rounding) && 1 << result < value ? 1 : 0); } } /** * @dev Return the log in base 10 of a positive value rounded towards zero. * Returns 0 if given 0. */ function log10(uint256 value) internal pure returns (uint256) { uint256 result = 0; unchecked { if (value >= 10 ** 64) { value /= 10 ** 64; result += 64; } if (value >= 10 ** 32) { value /= 10 ** 32; result += 32; } if (value >= 10 ** 16) { value /= 10 ** 16; result += 16; } if (value >= 10 ** 8) { value /= 10 ** 8; result += 8; } if (value >= 10 ** 4) { value /= 10 ** 4; result += 4; } if (value >= 10 ** 2) { value /= 10 ** 2; result += 2; } if (value >= 10 ** 1) { result += 1; } } return result; } /** * @dev Return the log in base 10, following the selected rounding direction, of a positive value. * Returns 0 if given 0. */ function log10(uint256 value, Rounding rounding) internal pure returns (uint256) { unchecked { uint256 result = log10(value); return result + (unsignedRoundsUp(rounding) && 10 ** result < value ? 1 : 0); } } /** * @dev Return the log in base 256 of a positive value rounded towards zero. * Returns 0 if given 0. * * Adding one to the result gives the number of pairs of hex symbols needed to represent `value` as a hex string. */ function log256(uint256 value) internal pure returns (uint256) { uint256 result = 0; unchecked { if (value >> 128 > 0) { value >>= 128; result += 16; } if (value >> 64 > 0) { value >>= 64; result += 8; } if (value >> 32 > 0) { value >>= 32; result += 4; } if (value >> 16 > 0) { value >>= 16; result += 2; } if (value >> 8 > 0) { result += 1; } } return result; } /** * @dev Return the log in base 256, following the selected rounding direction, of a positive value. * Returns 0 if given 0. */ function log256(uint256 value, Rounding rounding) internal pure returns (uint256) { unchecked { uint256 result = log256(value); return result + (unsignedRoundsUp(rounding) && 1 << (result << 3) < value ? 1 : 0); } } /** * @dev Returns whether a provided rounding mode is considered rounding up for unsigned integers. */ function unsignedRoundsUp(Rounding rounding) internal pure returns (bool) { return uint8(rounding) % 2 == 1; } } // src/ReentrancyGuard.sol /** * @title A contract that provides modifiers to prevent reentrancy to state-changing and view-only methods. This contract * is inspired by https://github.com/OpenZeppelin/openzeppelin-contracts/blob/master/contracts/utils/ReentrancyGuard.sol * and https://github.com/balancer-labs/balancer-core/blob/master/contracts/BPool.sol. * @dev The reason why we use this local contract instead of importing from uma/contracts is because of the addition * of the internal method `functionCallStackOriginatesFromOutsideThisContract` which doesn't exist in the one exported * by uma/contracts. */ contract ReentrancyGuard { bool internal _notEntered; constructor() { // Storing an initial non-zero value makes deployment a bit more expensive, but in exchange the refund on every // call to nonReentrant will be lower in amount. Since refunds are capped to a percentage of the total // transaction's gas, it is best to keep them low in cases like this one, to increase the likelihood of the full // refund coming into effect. _notEntered = true; } /** * @dev Prevents a contract from calling itself, directly or indirectly. * Calling a nonReentrant function from another nonReentrant function is not supported. It is possible to * prevent this from happening by making the nonReentrant function external, and making it call a private * function that does the actual state modification. */ modifier nonReentrant() { _preEntranceCheck(); _preEntranceSet(); _; _postEntranceReset(); } /** * @dev Designed to prevent a view-only method from being re-entered during a call to a nonReentrant() state-changing method. */ modifier nonReentrantView() { _preEntranceCheck(); _; } /** * @dev Returns true if the contract is currently in a non-entered state, meaning that the origination of the call * came from outside the contract. This is relevant with fallback/receive methods to see if the call came from ETH * being dropped onto the contract externally or due to ETH dropped on the the contract from within a method in this * contract, such as unwrapping WETH to ETH within the contract. */ function functionCallStackOriginatesFromOutsideThisContract() internal view returns (bool) { return _notEntered; } // Internal methods are used to avoid copying the require statement's bytecode to every nonReentrant() method. // On entry into a function, _preEntranceCheck() should always be called to check if the function is being // re-entered. Then, if the function modifies state, it should call _postEntranceSet(), perform its logic, and // then call _postEntranceReset(). // View-only methods can simply call _preEntranceCheck() to make sure that it is not being re-entered. function _preEntranceCheck() internal view { // On the first call to nonReentrant, _notEntered will be true require(_notEntered, "ReentrancyGuard: reentrant call"); } function _preEntranceSet() internal { // Any calls to nonReentrant after this point will fail _notEntered = false; } function _postEntranceReset() internal { // By storing the original value once again, a refund is triggered (see // https://eips.ethereum.org/EIPS/eip-2200) _notEntered = true; } } // src/interfaces/IAssetBridge.sol /// @title Interface for Voyager contracts that support deposits and deposit executions. /// @author Router Protocol. interface IAssetBridge { //TODO: can remove some field to optimize gas event TokenTransfer( bytes32 indexed destChainIdBytes, address indexed srcTokenAddress, uint256 srcTokenAmount, bytes recipient, uint256 partnerId, uint256 depositId ); //TODO: can remove some field to optimize gas event TokenTransferWithInstruction( bytes32 indexed destChainIdBytes, address indexed srcTokenAddress, uint256 srcTokenAmount, bytes recipient, uint256 partnerId, uint64 destGasLimit, bytes instruction, uint256 depositId ); event DepositReverted( bytes32 indexed destChainIdBytes, uint256 indexed depositNonce, address indexed sender, address srcSettlementToken, uint256 srcSettlementAmount ); event Execute( uint8 executeType, bytes32 indexed sourceChainIdBytes, uint256 indexed depositNonce, address settlementToken, uint256 settlementAmount, address recipient ); event ExecuteWithMessage( uint8 executeType, bytes32 indexed sourceChainIdBytes, uint256 indexed depositNonce, address settlementToken, uint256 settlementAmount, address recipient, bool flag, bytes data ); struct ExecuteInfo { address recipient; address destTokenAddress; uint256 destTokenAmount; uint256 depositNonce; } struct DepositData { address sender; address srcTokenAddress; uint256 srcTokenAmount; uint256 depositNonce; } struct TransferPayload { bytes32 destChainIdBytes; address srcTokenAddress; uint256 srcTokenAmount; bytes recipient; uint256 widgetId; } struct SwapTransferPayload { bytes32 destChainIdBytes; address[] tokens; // index 0 will be src token and index n-1 will be to address uint256[] flags; bytes[] dataTx; uint256 srcTokenAmount; uint256 minToAmount; bytes recipient; uint256 widgetId; } function transferTokenWithInstruction( TransferPayload memory transferPayload, uint64 destGasLimit, bytes calldata instruction ) external payable; function transferToken( TransferPayload memory transferPayload ) external payable; function swapAndTransferToken( SwapTransferPayload memory transferPayload ) external payable; function swapAndTransferTokenWithInstruction( SwapTransferPayload memory transferPayload, uint64 destGasLimit, bytes calldata instruction ) external payable; } // src/interfaces/IAssetForwarder.sol /// @title Interface for handler contracts that support deposits and deposit executions. /// @author Router Protocol. interface IAssetForwarder { event FundsDeposited( uint256 partnerId, uint256 amount, bytes32 destChainIdBytes, uint256 destAmount, uint256 depositId, address srcToken, address depositor, bytes recipient, bytes destToken ); event iUSDCDeposited( uint256 partnerId, uint256 amount, bytes32 destChainIdBytes, uint256 usdcNonce, address srcToken, bytes32 recipient, address depositor ); event FundsDepositedWithMessage( uint256 partnerId, uint256 amount, bytes32 destChainIdBytes, uint256 destAmount, uint256 depositId, address srcToken, bytes recipient, address depositor, bytes destToken, bytes message ); event FundsPaid(bytes32 messageHash, address forwarder, uint256 nonce); event DepositInfoUpdate( address srcToken, uint256 feeAmount, uint256 depositId, uint256 eventNonce, bool initiatewithdrawal, address depositor ); event FundsPaidWithMessage( bytes32 messageHash, address forwarder, uint256 nonce, bool execFlag, bytes execData ); struct DestDetails { uint32 domainId; uint256 fee; bool isSet; } struct RelayData { uint256 amount; bytes32 srcChainId; uint256 depositId; address destToken; address recipient; } struct RelayDataMessage { uint256 amount; bytes32 srcChainId; uint256 depositId; address destToken; address recipient; bytes message; } struct DepositData { uint256 partnerId; uint256 amount; uint256 destAmount; address srcToken; address refundRecipient; bytes32 destChainIdBytes; } function iDepositUSDC( uint256 partnerId, bytes32 destChainIdBytes, bytes32 recipient, uint256 amount ) external payable; function iDeposit( DepositData memory depositData, bytes memory destToken, bytes memory recipient ) external payable; function iDepositInfoUpdate( address srcToken, uint256 feeAmount, uint256 depositId, bool initiatewithdrawal ) external payable; function iDepositMessage( DepositData memory depositData, bytes memory destToken, bytes memory recipient, bytes memory message ) external payable; function iRelay(RelayData memory relayData) external payable; function iRelayMessage(RelayDataMessage memory relayData) external payable; } // src/interfaces/IDexSpan.sol contract IDexSpanConsts { // flags = FLAG_DISABLE_UNISWAP + FLAG_DISABLE_BANCOR + ... uint256 internal constant FLAG_DISABLE_UNISWAP = 0x400; uint256 internal constant FLAG_DISABLE_SPLIT_RECALCULATION = 0x800000000000; uint256 internal constant FLAG_DISABLE_ALL_SPLIT_SOURCES = 0x20000000; uint256 internal constant FLAG_DISABLE_UNISWAP_V2_ALL = 0x400; uint256 internal constant FLAG_DISABLE_EMPTY = 0x100000000000; uint256 internal constant FLAG_DISABLE_DFYN = 0x800; uint256 internal constant FLAG_DISABLE_PANCAKESWAP = 0x80; uint256 internal constant FLAG_DISABLE_QUICKSWAP = 0x40000000000; uint256 internal constant FLAG_DISABLE_SUSHISWAP = 0x1000000; uint256 internal constant FLAG_DISABLE_ONEINCH = 0x100000; } abstract contract IDexSpan is IDexSpanConsts { function getExpectedReturn( address fromToken, address destToken, uint256 amount, uint256 parts, uint256 flags // See constants in IOneSplit.sol ) public view virtual returns (uint256 returnAmount, uint256[] memory distribution); function getExpectedReturnWithGasMulti( address[] memory tokens, uint256 amount, uint256[] memory parts, uint256[] memory flags, uint256[] memory destTokenEthPriceTimesGasPrices ) public view virtual returns ( uint256[] memory returnAmounts, uint256 estimateGasAmount, uint256[] memory distribution ); function getExpectedReturnWithGas( address fromToken, address destToken, uint256 amount, uint256 parts, uint256 flags, // See constants in IOneSplit.sol uint256 destTokenEthPriceTimesGasPrice ) public view virtual returns ( uint256 returnAmount, uint256 estimateGasAmount, uint256[] memory distribution ); function setHandlerAddress( address _handlerAddress ) external virtual returns (bool); function setReserveAddress( address _reserveAddress ) external virtual returns (bool); function setBridgeAddress( address _bridgeAddress ) external virtual returns (bool); function withdraw( address tokenAddress, address recipient, uint256 amount ) public payable virtual returns (bool); function swap( address fromToken, address destToken, uint256 amount, uint256 minReturn, uint256 flags, bytes memory dataTx, bool isWrapper ) public payable virtual returns (uint256 returnAmount); function swapWithRecipient( address fromToken, address destToken, uint256 amount, uint256 minReturn, uint256 flags, bytes memory dataTx, bool isWrapper, address recipient ) public payable virtual returns (uint256 returnAmount); function swapMulti( address[] memory tokens, uint256 amount, uint256 minReturn, uint256[] memory flags, bytes[] memory dataTx, bool isWrapper ) public payable virtual returns (uint256 returnAmount); function swapMultiWithRecipient( address[] memory tokens, uint256 amount, uint256 minReturn, uint256[] memory flags, bytes[] memory dataTx, bool isWrapper, address recipient ) public payable virtual returns (uint256 returnAmount); function getExpectedReturnETH( address srcStablefromtoken, uint256 srcStableFromTokenAmount, uint256 parts, uint256 flags ) public view virtual returns (uint256 returnAmount); } // src/interfaces/IRefuel.sol interface IRefuel { event Deposit(address srcToken, uint256 amount, uint8 path); event GasLeaked( address ttoken, uint256 ttokenAmount, uint256 nativeAmount, address recipient ); struct TokenDetails { uint256 minAmount; uint256 conversionMultiplier; uint256 threshold; bool isSet; // isWhilisted } struct DepositPayload { bytes32 destChainIdBytes; uint256 srcTokenAmount; uint256 partnerId; address srcToken; address refundRecipient; uint8 path; } struct SwapPayload { uint256[] flags; uint256 minToAmount; address[] tokens; bytes[] dataTx; } } // src/interfaces/IWETH.sol interface IWETH { function deposit() external payable; function transfer(address to, uint256 value) external returns (bool); function withdraw(uint256) external; function transferFrom( address src, address dst, uint256 wad ) external returns (bool); function approve(address guy, uint256 wad) external returns (bool); } // node_modules/@openzeppelin/contracts/utils/Pausable.sol // OpenZeppelin Contracts (last updated v5.0.0) (utils/Pausable.sol) /** * @dev Contract module which allows children to implement an emergency stop * mechanism that can be triggered by an authorized account. * * This module is used through inheritance. It will make available the * modifiers `whenNotPaused` and `whenPaused`, which can be applied to * the functions of your contract. Note that they will not be pausable by * simply including this module, only once the modifiers are put in place. */ abstract contract Pausable is Context { bool private _paused; /** * @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); /** * @dev The operation failed because the contract is paused. */ error EnforcedPause(); /** * @dev The operation failed because the contract is not paused. */ error ExpectedPause(); /** * @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 { if (paused()) { revert EnforcedPause(); } } /** * @dev Throws if the contract is not paused. */ function _requirePaused() internal view virtual { if (!paused()) { revert ExpectedPause(); } } /** * @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()); } } // node_modules/@openzeppelin/contracts/utils/introspection/ERC165.sol // OpenZeppelin Contracts (last updated v5.0.0) (utils/introspection/ERC165.sol) /** * @dev Implementation of the {IERC165} interface. * * Contracts that want to implement ERC165 should inherit from this contract and override {supportsInterface} to check * for the additional interface id that will be supported. For example: * * ```solidity * function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) { * return interfaceId == type(MyInterface).interfaceId || super.supportsInterface(interfaceId); * } * ``` */ abstract contract ERC165 is IERC165 { /** * @dev See {IERC165-supportsInterface}. */ function supportsInterface(bytes4 interfaceId) public view virtual returns (bool) { return interfaceId == type(IERC165).interfaceId; } } // node_modules/@openzeppelin/contracts/token/ERC20/utils/SafeERC20.sol // OpenZeppelin Contracts (last updated v5.0.0) (token/ERC20/utils/SafeERC20.sol) /** * @title SafeERC20 * @dev Wrappers around ERC20 operations that throw on failure (when the token * contract returns false). Tokens that return no value (and instead revert or * throw on failure) are also supported, non-reverting calls are assumed to be * successful. * To use this library you can add a `using SafeERC20 for IERC20;` statement to your contract, * which allows you to call the safe operations as `token.safeTransfer(...)`, etc. */ library SafeERC20 { using Address for address; /** * @dev An operation with an ERC20 token failed. */ error SafeERC20FailedOperation(address token); /** * @dev Indicates a failed `decreaseAllowance` request. */ error SafeERC20FailedDecreaseAllowance(address spender, uint256 currentAllowance, uint256 requestedDecrease); /** * @dev Transfer `value` amount of `token` from the calling contract to `to`. If `token` returns no value, * non-reverting calls are assumed to be successful. */ function safeTransfer(IERC20 token, address to, uint256 value) internal { _callOptionalReturn(token, abi.encodeCall(token.transfer, (to, value))); } /** * @dev Transfer `value` amount of `token` from `from` to `to`, spending the approval given by `from` to the * calling contract. If `token` returns no value, non-reverting calls are assumed to be successful. */ function safeTransferFrom(IERC20 token, address from, address to, uint256 value) internal { _callOptionalReturn(token, abi.encodeCall(token.transferFrom, (from, to, value))); } /** * @dev Increase the calling contract's allowance toward `spender` by `value`. If `token` returns no value, * non-reverting calls are assumed to be successful. */ function safeIncreaseAllowance(IERC20 token, address spender, uint256 value) internal { uint256 oldAllowance = token.allowance(address(this), spender); forceApprove(token, spender, oldAllowance + value); } /** * @dev Decrease the calling contract's allowance toward `spender` by `requestedDecrease`. If `token` returns no * value, non-reverting calls are assumed to be successful. */ function safeDecreaseAllowance(IERC20 token, address spender, uint256 requestedDecrease) internal { unchecked { uint256 currentAllowance = token.allowance(address(this), spender); if (currentAllowance < requestedDecrease) { revert SafeERC20FailedDecreaseAllowance(spender, currentAllowance, requestedDecrease); } forceApprove(token, spender, currentAllowance - requestedDecrease); } } /** * @dev Set the calling contract's allowance toward `spender` to `value`. If `token` returns no value, * non-reverting calls are assumed to be successful. Meant to be used with tokens that require the approval * to be set to zero before setting it to a non-zero value, such as USDT. */ function forceApprove(IERC20 token, address spender, uint256 value) internal { bytes memory approvalCall = abi.encodeCall(token.approve, (spender, value)); if (!_callOptionalReturnBool(token, approvalCall)) { _callOptionalReturn(token, abi.encodeCall(token.approve, (spender, 0))); _callOptionalReturn(token, approvalCall); } } /** * @dev Imitates a Solidity high-level call (i.e. a regular function call to a contract), relaxing the requirement * on the return value: the return value is optional (but if data is returned, it must not be false). * @param token The token targeted by the call. * @param data The call data (encoded using abi.encode or one of its variants). */ function _callOptionalReturn(IERC20 token, bytes memory data) private { // We need to perform a low level call here, to bypass Solidity's return data size checking mechanism, since // we're implementing it ourselves. We use {Address-functionCall} to perform this call, which verifies that // the target address contains contract code and also asserts for success in the low-level call. bytes memory returndata = address(token).functionCall(data); if (returndata.length != 0 && !abi.decode(returndata, (bool))) { revert SafeERC20FailedOperation(address(token)); } } /** * @dev Imitates a Solidity high-level call (i.e. a regular function call to a contract), relaxing the requirement * on the return value: the return value is optional (but if data is returned, it must not be false). * @param token The token targeted by the call. * @param data The call data (encoded using abi.encode or one of its variants). * * This is a variant of {_callOptionalReturn} that silents catches all reverts and returns a bool instead. */ function _callOptionalReturnBool(IERC20 token, bytes memory data) private returns (bool) { // We need to perform a low level call here, to bypass Solidity's return data size checking mechanism, since // we're implementing it ourselves. We cannot use {Address-functionCall} here since this should return false // and not revert is the subcall reverts. (bool success, bytes memory returndata) = address(token).call(data); return success && (returndata.length == 0 || abi.decode(returndata, (bool))) && address(token).code.length > 0; } } // node_modules/@openzeppelin/contracts/access/AccessControl.sol // OpenZeppelin Contracts (last updated v5.0.0) (access/AccessControl.sol) /** * @dev Contract module that allows children to implement role-based access * control mechanisms. This is a lightweight version that doesn't allow enumerating role * members except through off-chain means by accessing the contract event logs. Some * applications may benefit from on-chain enumerability, for those cases see * {AccessControlEnumerable}. * * Roles are referred to by their `bytes32` identifier. These should be exposed * in the external API and be unique. The best way to achieve this is by * using `public constant` hash digests: * * ```solidity * bytes32 public constant MY_ROLE = keccak256("MY_ROLE"); * ``` * * Roles can be used to represent a set of permissions. To restrict access to a * function call, use {hasRole}: * * ```solidity * function foo() public { * require(hasRole(MY_ROLE, msg.sender)); * ... * } * ``` * * Roles can be granted and revoked dynamically via the {grantRole} and * {revokeRole} functions. Each role has an associated admin role, and only * accounts that have a role's admin role can call {grantRole} and {revokeRole}. * * By default, the admin role for all roles is `DEFAULT_ADMIN_ROLE`, which means * that only accounts with this role will be able to grant or revoke other * roles. More complex role relationships can be created by using * {_setRoleAdmin}. * * WARNING: The `DEFAULT_ADMIN_ROLE` is also its own admin: it has permission to * grant and revoke this role. Extra precautions should be taken to secure * accounts that have been granted it. We recommend using {AccessControlDefaultAdminRules} * to enforce additional security measures for this role. */ abstract contract AccessControl is Context, IAccessControl, ERC165 { struct RoleData { mapping(address account => bool) hasRole; bytes32 adminRole; } mapping(bytes32 role => RoleData) private _roles; bytes32 public constant DEFAULT_ADMIN_ROLE = 0x00; /** * @dev Modifier that checks that an account has a specific role. Reverts * with an {AccessControlUnauthorizedAccount} error including the required role. */ modifier onlyRole(bytes32 role) { _checkRole(role); _; } /** * @dev See {IERC165-supportsInterface}. */ function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) { return interfaceId == type(IAccessControl).interfaceId || super.supportsInterface(interfaceId); } /** * @dev Returns `true` if `account` has been granted `role`. */ function hasRole(bytes32 role, address account) public view virtual returns (bool) { return _roles[role].hasRole[account]; } /** * @dev Reverts with an {AccessControlUnauthorizedAccount} error if `_msgSender()` * is missing `role`. Overriding this function changes the behavior of the {onlyRole} modifier. */ function _checkRole(bytes32 role) internal view virtual { _checkRole(role, _msgSender()); } /** * @dev Reverts with an {AccessControlUnauthorizedAccount} error if `account` * is missing `role`. */ function _checkRole(bytes32 role, address account) internal view virtual { if (!hasRole(role, account)) { revert AccessControlUnauthorizedAccount(account, role); } } /** * @dev Returns the admin role that controls `role`. See {grantRole} and * {revokeRole}. * * To change a role's admin, use {_setRoleAdmin}. */ function getRoleAdmin(bytes32 role) public view virtual returns (bytes32) { return _roles[role].adminRole; } /** * @dev Grants `role` to `account`. * * If `account` had not been already granted `role`, emits a {RoleGranted} * event. * * Requirements: * * - the caller must have ``role``'s admin role. * * May emit a {RoleGranted} event. */ function grantRole(bytes32 role, address account) public virtual onlyRole(getRoleAdmin(role)) { _grantRole(role, account); } /** * @dev Revokes `role` from `account`. * * If `account` had been granted `role`, emits a {RoleRevoked} event. * * Requirements: * * - the caller must have ``role``'s admin role. * * May emit a {RoleRevoked} event. */ function revokeRole(bytes32 role, address account) public virtual onlyRole(getRoleAdmin(role)) { _revokeRole(role, account); } /** * @dev Revokes `role` from the calling account. * * Roles are often managed via {grantRole} and {revokeRole}: this function's * purpose is to provide a mechanism for accounts to lose their privileges * if they are compromised (such as when a trusted device is misplaced). * * If the calling account had been revoked `role`, emits a {RoleRevoked} * event. * * Requirements: * * - the caller must be `callerConfirmation`. * * May emit a {RoleRevoked} event. */ function renounceRole(bytes32 role, address callerConfirmation) public virtual { if (callerConfirmation != _msgSender()) { revert AccessControlBadConfirmation(); } _revokeRole(role, callerConfirmation); } /** * @dev Sets `adminRole` as ``role``'s admin role. * * Emits a {RoleAdminChanged} event. */ function _setRoleAdmin(bytes32 role, bytes32 adminRole) internal virtual { bytes32 previousAdminRole = getRoleAdmin(role); _roles[role].adminRole = adminRole; emit RoleAdminChanged(role, previousAdminRole, adminRole); } /** * @dev Attempts to grant `role` to `account` and returns a boolean indicating if `role` was granted. * * Internal function without access restriction. * * May emit a {RoleGranted} event. */ function _grantRole(bytes32 role, address account) internal virtual returns (bool) { if (!hasRole(role, account)) { _roles[role].hasRole[account] = true; emit RoleGranted(role, account, _msgSender()); return true; } else { return false; } } /** * @dev Attempts to revoke `role` to `account` and returns a boolean indicating if `role` was revoked. * * Internal function without access restriction. * * May emit a {RoleRevoked} event. */ function _revokeRole(bytes32 role, address account) internal virtual returns (bool) { if (hasRole(role, account)) { _roles[role].hasRole[account] = false; emit RoleRevoked(role, account, _msgSender()); return true; } else { return false; } } } // src/Refuel.sol contract Refuel is IRefuel, AccessControl, ReentrancyGuard, Pausable { using SafeERC20 for IERC20; using Math for uint256; address public constant NATIVE_ADDRESS = 0xEeeeeEeeeEeEeeEeEeEeeEEEeeeeEeeeeeeeEEeE; bytes32 public constant RESOURCE_SETTER = keccak256("RESOURCE_SETTER"); bytes32 public constant PAUSER = keccak256("PAUSER"); IWETH public immutable wrappedNativeToken; IAssetForwarder public forwarder; IAssetBridge public bridge; IDexSpan public dexspan; mapping(address => TokenDetails) tdetails; mapping(bytes32 => bytes) public dstRefuelMp; error InvalidArrayLength(); error TokenNotWhiteListed(); error InvalidDstChain(); error InvalidForwarderOrBridge(); error InvalidMsgValue(); error InvalidPath(); error InvalidType(); error InvalidSwapAmount(); constructor( address _bridgeAddress, address _forwarderAddress, address _dexSpan, address _wrappedNativeTokenAddress ) { _grantRole(DEFAULT_ADMIN_ROLE, msg.sender); _grantRole(RESOURCE_SETTER, msg.sender); _grantRole(PAUSER, msg.sender); forwarder = IAssetForwarder(_forwarderAddress); bridge = IAssetBridge(_bridgeAddress); dexspan = IDexSpan(_dexSpan); wrappedNativeToken = IWETH(_wrappedNativeTokenAddress); } function pause() external onlyRole(PAUSER) whenNotPaused { _pause(); } function unpause() external onlyRole(PAUSER) whenPaused { _unpause(); } function update( address fadAddress, uint8 updateType ) public onlyRole(RESOURCE_SETTER) { if (updateType == 0) forwarder = IAssetForwarder(fadAddress); if (updateType == 1) bridge = IAssetBridge(fadAddress); if (updateType == 2) dexspan = IDexSpan(fadAddress); if (updateType > 2) revert InvalidType(); } // set destination chain refuel contracts function setDstRefuelMp( bytes32[] memory chainIds, bytes[] memory dstRefuelAddresses ) public onlyRole(RESOURCE_SETTER) { if ( !(chainIds.length != 0 && chainIds.length == dstRefuelAddresses.length) ) revert InvalidArrayLength(); for (uint256 idx = 0; idx < chainIds.length; ) { dstRefuelMp[chainIds[idx]] = dstRefuelAddresses[idx]; unchecked { ++idx; } } } // update token conversion multiplier function setConversionMultiplierOrThresholds( address[] calldata tokens, uint256[] calldata conversionMultipliers, uint256[] calldata thresholds ) public onlyRole(RESOURCE_SETTER) { if ( !(tokens.length != 0 && tokens.length == conversionMultipliers.length && thresholds.length == tokens.length) ) revert InvalidArrayLength(); for (uint256 i = 0; i < tokens.length; ) { if (!tdetails[tokens[i]].isSet) revert TokenNotWhiteListed(); if (conversionMultipliers[i] != 0) tdetails[tokens[i]] .conversionMultiplier = conversionMultipliers[i]; if (thresholds[i] != 0) tdetails[tokens[i]].threshold = thresholds[i]; unchecked { ++i; } } } // update or add token info function updateTokenDetails( address[] calldata token, TokenDetails[] calldata tokenDetail ) public onlyRole(RESOURCE_SETTER) { if (!(token.length != 0 && token.length == tokenDetail.length)) revert InvalidArrayLength(); for (uint256 i = 0; i < token.length; ) { tdetails[token[i]] = tokenDetail[i]; unchecked { ++i; } } } // creates packet for dst refuel contract without any swap on dst contract function getMessagePacket( bytes memory recipient, uint256 x ) public pure returns (bytes memory) { return abi.encode(uint8(0), recipient, x); } function getTokenDetails( address[] memory tokens ) public view returns (TokenDetails[] memory) { TokenDetails[] memory td = new TokenDetails[](tokens.length); for (uint256 idx = 0; idx < tokens.length; idx++) td[idx] = tdetails[tokens[idx]]; return td; } function getDstRefuelAdresses( bytes32[] memory chainBytes ) public view returns (bytes[] memory) { bytes[] memory drAdrr = new bytes[](chainBytes.length); for (uint256 idx = 0; idx < chainBytes.length; idx++) drAdrr[idx] = dstRefuelMp[chainBytes[idx]]; return drAdrr; } // creates packet for dst refuel contract without swap on dst contract // since swap only exist on evm, so forming data only for evm chains function getMessagePacketWithSwap( bytes memory recipient, uint256 x, SwapPayload memory dstSwapPayload ) public pure returns (bytes memory) { return abi.encode( uint8(1), recipient, //bytes: end token receiver x, dstSwapPayload ); } function _beforeDeposit( address srcToken, uint256 srcAmount ) internal returns (address) { if (NATIVE_ADDRESS == srcToken) { if (msg.value != srcAmount) revert InvalidMsgValue(); wrappedNativeToken.deposit{value: msg.value}(); srcToken = address(wrappedNativeToken); } else { if (msg.value != 0) revert InvalidMsgValue(); IERC20(srcToken).safeTransferFrom( msg.sender, address(this), srcAmount ); } return srcToken; } // no swap on src_chain function depositWithOutSwap( DepositPayload memory depositData, bytes memory dstPacket, // encode [recipient,x] bytes memory extraData // for forwarder flow pass dst token and dst amount ) private { if (!tdetails[depositData.srcToken].isSet) revert TokenNotWhiteListed(); address srcToken = _beforeDeposit( depositData.srcToken, depositData.srcTokenAmount ); _afterDeposit( srcToken, depositData.srcTokenAmount, depositData, dstPacket, extraData ); } function depositWithSwap( DepositPayload memory depositData, bytes memory dstPacket, bytes memory extraData, // for forwarder flow pass dst token and dst amount SwapPayload memory srcSwapPayload ) private { address srcToken = _beforeDeposit( depositData.srcToken, depositData.srcTokenAmount ); srcSwapPayload.tokens[0] = srcToken; // not if depositing native then tokens[0] = wrappedNative IERC20(srcToken).safeIncreaseAllowance( address(dexspan), depositData.srcTokenAmount ); uint256 returnAmount = dexspan.swapMultiWithRecipient( // recipient will be address(this) srcSwapPayload.tokens, depositData.srcTokenAmount, srcSwapPayload.minToAmount, srcSwapPayload.flags, srcSwapPayload.dataTx, false, address(this) ); address returnToken = srcSwapPayload.tokens[ srcSwapPayload.tokens.length - 1 ]; if (!tdetails[returnToken].isSet) revert TokenNotWhiteListed(); _afterDeposit( returnToken, returnAmount, depositData, dstPacket, extraData ); } function _afterDeposit( address token, uint256 amount, DepositPayload memory depositData, bytes memory packet, bytes memory extraData ) internal { if (dstRefuelMp[depositData.destChainIdBytes].length == 0) revert InvalidDstChain(); // AssetForwarder if (depositData.path == 0) { (bytes memory dstToken, uint256 feeAmount) = abi.decode( extraData, (bytes, uint256) ); IERC20(token).safeIncreaseAllowance(address(forwarder), amount); forwarder.iDepositMessage( IAssetForwarder.DepositData( depositData.partnerId, amount, amount - feeAmount, token, depositData.refundRecipient, depositData.destChainIdBytes ), dstToken, dstRefuelMp[depositData.destChainIdBytes], packet ); emit Deposit(token, amount, 0); return; } // AssetBridge if (depositData.path == 1) { uint64 destGasLimit = abi.decode(extraData, (uint64)); IERC20(token).safeIncreaseAllowance(address(bridge), amount); bridge.transferTokenWithInstruction( IAssetBridge.TransferPayload( depositData.destChainIdBytes, token, amount, dstRefuelMp[depositData.destChainIdBytes], depositData.partnerId ), destGasLimit, packet ); emit Deposit(token, amount, 1); return; } revert InvalidPath(); } function iDepositInfoUpdate( address srcToken, uint256 feeAmount, uint256 depositId, bool initiatewithdrawal ) external payable nonReentrant whenNotPaused { forwarder.iDepositInfoUpdate{value: msg.value}( srcToken, feeAmount, depositId, initiatewithdrawal ); } // no swap, neither on src nor on dst chain function deposit( DepositPayload memory depositData, bytes memory dstPacket, // encode [recipient,x] bytes memory extraData // for forwarder flow pass dst token and feeAmount ) public payable whenNotPaused { depositWithOutSwap(depositData, dstPacket, extraData); } // no swap on src but swap on dst function depositAndSwap( DepositPayload memory depositData, bytes memory dstPacket, // encode [recipient,x,dstSwapPayload] bytes memory extraData // for forwarder flow pass dst token and feeAmount ) public payable whenNotPaused { depositWithOutSwap(depositData, dstPacket, extraData); } // swap on src but no swap on dst function swapAndDeposit( DepositPayload memory depositData, bytes memory dstPacket, // encode [recipient,x] bytes memory extraData, // for forwarder flow pass dst token and feeAmount SwapPayload memory srcSwapPayload ) public payable whenNotPaused { depositWithSwap(depositData, dstPacket, extraData, srcSwapPayload); } // swap on src and swap on dst function swapAndDepositAndSwap( DepositPayload memory depositData, bytes memory dstPacket, // encode [recipient,x,dstSwapPayload] bytes memory extraData, // for forwarder flow pass dst token and feeAmount SwapPayload memory srcSwapPayload // SwapPayload memory dstSwapPayload ) public payable whenNotPaused { depositWithSwap(depositData, dstPacket, extraData, srcSwapPayload); } function safeTransferNative(address to, uint256 value) internal { require(to != address(0), "safeTransferETH: transfer to address 0"); (bool success, ) = to.call{value: value}(new bytes(0)); require(success, "safeTransferETH: ETH transfer failed"); } function safeTransferToken( address token, address to, uint256 value ) internal { IERC20(token).safeTransfer(to, value); // Uncomment For Tron // if (token != 0xa614f803B6FD780986A42c78Ec9c7f77e6DeD13C) // IERC20(token).safeTransfer(to, value); // else { // (bool success, ) = token.call{gas: gasleft()}( // abi.encodeWithSelector(IERC20.transfer.selector, to, value) // ); // no check on return data for usdt on tron mainnet // require(success, "safeTransferToken: token transfer failed"); // } } function revertTx( address tokenSent, uint256 amount, address recipient ) internal { // invalid tx type then refund to recipient if (tokenSent != NATIVE_ADDRESS) safeTransferToken(tokenSent, recipient, amount); else safeTransferNative(recipient, amount); emit GasLeaked(tokenSent, amount, 0, recipient); } function _leakGas( address ttoken, uint256 tamount, uint256 namount, address recipient ) internal { if (tamount != 0) safeTransferToken(ttoken, recipient, tamount); if (namount != 0) safeTransferNative(recipient, namount); emit GasLeaked(ttoken, tamount, namount, recipient); } function handleMessage( address tokenSent, uint256 amount, bytes memory message ) external nonReentrant whenNotPaused { //Note: If wrong packet is sent then fund remains stuck in refuel if (msg.sender != address(forwarder) && msg.sender != address(bridge)) revert InvalidForwarderOrBridge(); (uint8 tx_type, bytes memory brecipient, uint256 amountToConvert) = abi .decode(message, (uint8, bytes, uint256)); address recipient = toAddress(brecipient); // invalid tx type then refund to recipient or // if token not whitelisted revert it to recipient if ((tx_type != 0 && tx_type != 1) || !tdetails[tokenSent].isSet) return revertTx(tokenSent, amount, recipient); // tx_type == 0 no swap if (tx_type == 0 && tokenSent == NATIVE_ADDRESS) // if no swap and native is sent then transfer full amount to recipient regardless of x return safeTransferNative(recipient, amount); // tx_type == 1 swap if (tx_type == 1) return handleMessageWithSwap( message, tokenSent, amount, recipient, amountToConvert ); (uint256 tamount, uint256 namount) = handleConversion( tokenSent, amount, amountToConvert ); // native balance not available, revert tx if (address(this).balance < namount) return revertTx(tokenSent, amount, recipient); _leakGas(tokenSent, tamount, namount, recipient); } function handleMessageWithSwap( bytes memory message, address tokenSent, uint256 amount, address recipient, uint256 tAmtToConvert ) internal { //Note: If wrong packet is sent then fund remains stuck in refuel (, , , uint256 swapAmount, SwapPayload memory dstSwapPayload) = abi .decode(message, (uint8, bytes, uint256, uint256, SwapPayload)); if (swapAmount > amount) { (uint256 _tamount, uint256 _namount) = handleConversion( tokenSent, amount, tAmtToConvert ); if (address(this).balance < _namount) return revertTx(tokenSent, amount, recipient); return _leakGas(tokenSent, _tamount, _namount, recipient); } (uint256 tamount, uint256 namount) = handleConversion( tokenSent, amount, amount - swapAmount ); if (address(this).balance < namount) return revertTx(tokenSent, amount, recipient); if (tokenSent == NATIVE_ADDRESS) { wrappedNativeToken.deposit{value: amount}(); dstSwapPayload.tokens[0] = address(wrappedNativeToken); } IERC20(dstSwapPayload.tokens[0]).safeIncreaseAllowance( address(dexspan), swapAmount ); (bool execFlag, ) = address(dexspan).call{gas: gasleft()}( //Note: To Ensure .call Doesn't Fail Due To Out Of Gas, Just To Check Is There Any Case Where This Cases Any Issue abi.encodeWithSelector( IDexSpan.swapMultiWithRecipient.selector, dstSwapPayload.tokens, swapAmount, dstSwapPayload.minToAmount, dstSwapPayload.flags, dstSwapPayload.dataTx, false, recipient ) ); if (!execFlag) return _leakGas(tokenSent, tamount, namount, recipient); if (namount != 0) safeTransferNative(recipient, namount); emit GasLeaked(tokenSent, tamount, namount, recipient); } function handleConversion( address tSent, uint256 amt, uint256 tAmtToConvert ) internal view returns (uint256 tamount, uint256 namount) { //NOTE: it's constant only, so doesn't matter if (tAmtToConvert > (tdetails[tSent].threshold * 12) / 10) tAmtToConvert = tdetails[tSent].threshold; if (amt > tAmtToConvert) tamount = (amt - tAmtToConvert); else tAmtToConvert = amt; namount = tAmtToConvert; if (tSent != NATIVE_ADDRESS) namount = (tAmtToConvert * tdetails[tSent].conversionMultiplier) / 1000000000; // / (10^9) } function rescue( address token, address recipient, uint256 amount ) external onlyRole(DEFAULT_ADMIN_ROLE) nonReentrant { if (token == NATIVE_ADDRESS) { if (amount == 0) amount = address(this).balance; safeTransferNative(recipient, amount); } else { if (amount == 0) amount = IERC20(token).balanceOf(address(this)); safeTransferToken(token, recipient, amount); } } function toAddress( bytes memory data ) internal pure returns (address convertedAddress) { require(data.length == 20, "Input data must be 20 bytes long"); assembly { convertedAddress := mload(add(data, 20)) } } receive() external payable {} }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"inputs":[{"internalType":"address","name":"_bridgeAddress","type":"address"},{"internalType":"address","name":"_forwarderAddress","type":"address"},{"internalType":"address","name":"_dexSpan","type":"address"},{"internalType":"address","name":"_wrappedNativeTokenAddress","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[],"name":"AccessControlBadConfirmation","type":"error"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"bytes32","name":"neededRole","type":"bytes32"}],"name":"AccessControlUnauthorizedAccount","type":"error"},{"inputs":[{"internalType":"address","name":"target","type":"address"}],"name":"AddressEmptyCode","type":"error"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"AddressInsufficientBalance","type":"error"},{"inputs":[],"name":"EnforcedPause","type":"error"},{"inputs":[],"name":"ExpectedPause","type":"error"},{"inputs":[],"name":"FailedInnerCall","type":"error"},{"inputs":[],"name":"InvalidArrayLength","type":"error"},{"inputs":[],"name":"InvalidDstChain","type":"error"},{"inputs":[],"name":"InvalidForwarderOrBridge","type":"error"},{"inputs":[],"name":"InvalidMsgValue","type":"error"},{"inputs":[],"name":"InvalidPath","type":"error"},{"inputs":[],"name":"InvalidSwapAmount","type":"error"},{"inputs":[],"name":"InvalidType","type":"error"},{"inputs":[{"internalType":"address","name":"token","type":"address"}],"name":"SafeERC20FailedOperation","type":"error"},{"inputs":[],"name":"TokenNotWhiteListed","type":"error"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"srcToken","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"},{"indexed":false,"internalType":"uint8","name":"path","type":"uint8"}],"name":"Deposit","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"ttoken","type":"address"},{"indexed":false,"internalType":"uint256","name":"ttokenAmount","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"nativeAmount","type":"uint256"},{"indexed":false,"internalType":"address","name":"recipient","type":"address"}],"name":"GasLeaked","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"account","type":"address"}],"name":"Paused","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"role","type":"bytes32"},{"indexed":true,"internalType":"bytes32","name":"previousAdminRole","type":"bytes32"},{"indexed":true,"internalType":"bytes32","name":"newAdminRole","type":"bytes32"}],"name":"RoleAdminChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"role","type":"bytes32"},{"indexed":true,"internalType":"address","name":"account","type":"address"},{"indexed":true,"internalType":"address","name":"sender","type":"address"}],"name":"RoleGranted","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"role","type":"bytes32"},{"indexed":true,"internalType":"address","name":"account","type":"address"},{"indexed":true,"internalType":"address","name":"sender","type":"address"}],"name":"RoleRevoked","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"account","type":"address"}],"name":"Unpaused","type":"event"},{"inputs":[],"name":"DEFAULT_ADMIN_ROLE","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"NATIVE_ADDRESS","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"PAUSER","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"RESOURCE_SETTER","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"bridge","outputs":[{"internalType":"contract IAssetBridge","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"components":[{"internalType":"bytes32","name":"destChainIdBytes","type":"bytes32"},{"internalType":"uint256","name":"srcTokenAmount","type":"uint256"},{"internalType":"uint256","name":"partnerId","type":"uint256"},{"internalType":"address","name":"srcToken","type":"address"},{"internalType":"address","name":"refundRecipient","type":"address"},{"internalType":"uint8","name":"path","type":"uint8"}],"internalType":"struct IRefuel.DepositPayload","name":"depositData","type":"tuple"},{"internalType":"bytes","name":"dstPacket","type":"bytes"},{"internalType":"bytes","name":"extraData","type":"bytes"}],"name":"deposit","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"components":[{"internalType":"bytes32","name":"destChainIdBytes","type":"bytes32"},{"internalType":"uint256","name":"srcTokenAmount","type":"uint256"},{"internalType":"uint256","name":"partnerId","type":"uint256"},{"internalType":"address","name":"srcToken","type":"address"},{"internalType":"address","name":"refundRecipient","type":"address"},{"internalType":"uint8","name":"path","type":"uint8"}],"internalType":"struct IRefuel.DepositPayload","name":"depositData","type":"tuple"},{"internalType":"bytes","name":"dstPacket","type":"bytes"},{"internalType":"bytes","name":"extraData","type":"bytes"}],"name":"depositAndSwap","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"dexspan","outputs":[{"internalType":"contract IDexSpan","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"name":"dstRefuelMp","outputs":[{"internalType":"bytes","name":"","type":"bytes"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"forwarder","outputs":[{"internalType":"contract IAssetForwarder","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32[]","name":"chainBytes","type":"bytes32[]"}],"name":"getDstRefuelAdresses","outputs":[{"internalType":"bytes[]","name":"","type":"bytes[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes","name":"recipient","type":"bytes"},{"internalType":"uint256","name":"x","type":"uint256"}],"name":"getMessagePacket","outputs":[{"internalType":"bytes","name":"","type":"bytes"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"bytes","name":"recipient","type":"bytes"},{"internalType":"uint256","name":"x","type":"uint256"},{"components":[{"internalType":"uint256[]","name":"flags","type":"uint256[]"},{"internalType":"uint256","name":"minToAmount","type":"uint256"},{"internalType":"address[]","name":"tokens","type":"address[]"},{"internalType":"bytes[]","name":"dataTx","type":"bytes[]"}],"internalType":"struct IRefuel.SwapPayload","name":"dstSwapPayload","type":"tuple"}],"name":"getMessagePacketWithSwap","outputs":[{"internalType":"bytes","name":"","type":"bytes"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"}],"name":"getRoleAdmin","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address[]","name":"tokens","type":"address[]"}],"name":"getTokenDetails","outputs":[{"components":[{"internalType":"uint256","name":"minAmount","type":"uint256"},{"internalType":"uint256","name":"conversionMultiplier","type":"uint256"},{"internalType":"uint256","name":"threshold","type":"uint256"},{"internalType":"bool","name":"isSet","type":"bool"}],"internalType":"struct IRefuel.TokenDetails[]","name":"","type":"tuple[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"account","type":"address"}],"name":"grantRole","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"tokenSent","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"bytes","name":"message","type":"bytes"}],"name":"handleMessage","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"account","type":"address"}],"name":"hasRole","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"srcToken","type":"address"},{"internalType":"uint256","name":"feeAmount","type":"uint256"},{"internalType":"uint256","name":"depositId","type":"uint256"},{"internalType":"bool","name":"initiatewithdrawal","type":"bool"}],"name":"iDepositInfoUpdate","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"pause","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"paused","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"callerConfirmation","type":"address"}],"name":"renounceRole","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"token","type":"address"},{"internalType":"address","name":"recipient","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"rescue","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"account","type":"address"}],"name":"revokeRole","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address[]","name":"tokens","type":"address[]"},{"internalType":"uint256[]","name":"conversionMultipliers","type":"uint256[]"},{"internalType":"uint256[]","name":"thresholds","type":"uint256[]"}],"name":"setConversionMultiplierOrThresholds","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32[]","name":"chainIds","type":"bytes32[]"},{"internalType":"bytes[]","name":"dstRefuelAddresses","type":"bytes[]"}],"name":"setDstRefuelMp","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"components":[{"internalType":"bytes32","name":"destChainIdBytes","type":"bytes32"},{"internalType":"uint256","name":"srcTokenAmount","type":"uint256"},{"internalType":"uint256","name":"partnerId","type":"uint256"},{"internalType":"address","name":"srcToken","type":"address"},{"internalType":"address","name":"refundRecipient","type":"address"},{"internalType":"uint8","name":"path","type":"uint8"}],"internalType":"struct IRefuel.DepositPayload","name":"depositData","type":"tuple"},{"internalType":"bytes","name":"dstPacket","type":"bytes"},{"internalType":"bytes","name":"extraData","type":"bytes"},{"components":[{"internalType":"uint256[]","name":"flags","type":"uint256[]"},{"internalType":"uint256","name":"minToAmount","type":"uint256"},{"internalType":"address[]","name":"tokens","type":"address[]"},{"internalType":"bytes[]","name":"dataTx","type":"bytes[]"}],"internalType":"struct IRefuel.SwapPayload","name":"srcSwapPayload","type":"tuple"}],"name":"swapAndDeposit","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"components":[{"internalType":"bytes32","name":"destChainIdBytes","type":"bytes32"},{"internalType":"uint256","name":"srcTokenAmount","type":"uint256"},{"internalType":"uint256","name":"partnerId","type":"uint256"},{"internalType":"address","name":"srcToken","type":"address"},{"internalType":"address","name":"refundRecipient","type":"address"},{"internalType":"uint8","name":"path","type":"uint8"}],"internalType":"struct IRefuel.DepositPayload","name":"depositData","type":"tuple"},{"internalType":"bytes","name":"dstPacket","type":"bytes"},{"internalType":"bytes","name":"extraData","type":"bytes"},{"components":[{"internalType":"uint256[]","name":"flags","type":"uint256[]"},{"internalType":"uint256","name":"minToAmount","type":"uint256"},{"internalType":"address[]","name":"tokens","type":"address[]"},{"internalType":"bytes[]","name":"dataTx","type":"bytes[]"}],"internalType":"struct IRefuel.SwapPayload","name":"srcSwapPayload","type":"tuple"}],"name":"swapAndDepositAndSwap","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"unpause","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"fadAddress","type":"address"},{"internalType":"uint8","name":"updateType","type":"uint8"}],"name":"update","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address[]","name":"token","type":"address[]"},{"components":[{"internalType":"uint256","name":"minAmount","type":"uint256"},{"internalType":"uint256","name":"conversionMultiplier","type":"uint256"},{"internalType":"uint256","name":"threshold","type":"uint256"},{"internalType":"bool","name":"isSet","type":"bool"}],"internalType":"struct IRefuel.TokenDetails[]","name":"tokenDetail","type":"tuple[]"}],"name":"updateTokenDetails","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"wrappedNativeToken","outputs":[{"internalType":"contract IWETH","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"stateMutability":"payable","type":"receive"}]
Contract Creation Code
60a060405234801562000010575f80fd5b5060405162003aec38038062003aec8339810160408190526200003391620001c6565b6001805461ffff1916811790556200004c5f33620000fe565b50620000797f8b9e7a9f25b0aca3f51c01b8fee30790fb16f4d4deded8385ae6643d054bb07833620000fe565b50620000a67f539440820030c4994db4e31b6b800deafd503688728f932addfe7a410515c14c33620000fe565b50600180546001600160a01b03948516620100000262010000600160b01b0319909116179055600280549484166001600160a01b03199586161790556003805492841692909416919091179092551660805262000220565b5f828152602081815260408083206001600160a01b038516845290915281205460ff16620001a1575f838152602081815260408083206001600160a01b03861684529091529020805460ff19166001179055620001583390565b6001600160a01b0316826001600160a01b0316847f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d60405160405180910390a4506001620001a4565b505f5b92915050565b80516001600160a01b0381168114620001c1575f80fd5b919050565b5f805f8060808587031215620001da575f80fd5b620001e585620001aa565b9350620001f560208601620001aa565b92506200020560408601620001aa565b91506200021560608601620001aa565b905092959194509250565b608051613897620002555f395f8181610239015281816118ed0152818161195d01528181611d580152611dc801526138975ff3fe6080604052600436106101e9575f3560e01c80638456cb5911610108578063d2dd54b41161009d578063db618e2a1161006d578063db618e2a14610574578063de28918814610594578063e19f8f3e146105b3578063e78cea92146105d2578063f645d4f9146105f1575f80fd5b8063d2dd54b4146104cf578063d547741f146104fb578063d5bcb6101461051a578063d9dc869414610541575f80fd5b8063c0e2071d116100d8578063c0e2071d146102ef578063c974976914610406578063d00a2d5f14610491578063d13f2cb2146104b0575f80fd5b80638456cb591461043857806391d148541461044c578063a217fddf1461046b578063ad7c17ee1461047e575f80fd5b8063356ac86e1161017e5780635c975abb1161014e5780635c975abb146103cb5780636cec044b146103e75780637a9f21ca1461040657806380045ed814610419575f80fd5b8063356ac86e1461034d57806336568abe1461036c5780633731f0b41461038b5780633f4ba83a146103b7575f80fd5b806325c35173116101b957806325c35173146102d05780632bc2ad20146102ef5780632f2ff15d14610302578063301ab42d14610321575f80fd5b806301ffc9a7146101f457806317fcb39b1461022857806320ff430b14610273578063248a9ca314610294575f80fd5b366101f057005b5f80fd5b3480156101ff575f80fd5b5061021361020e36600461251c565b610616565b60405190151581526020015b60405180910390f35b348015610233575f80fd5b5061025b7f000000000000000000000000000000000000000000000000000000000000000081565b6040516001600160a01b03909116815260200161021f565b34801561027e575f80fd5b5061029261028d366004612557565b61064c565b005b34801561029f575f80fd5b506102c26102ae366004612595565b5f9081526020819052604090206001015490565b60405190815260200161021f565b3480156102db575f80fd5b506102926102ea366004612790565b61073e565b6102926102fd366004612890565b6107e7565b34801561030d575f80fd5b5061029261031c366004612900565b6107ff565b34801561032c575f80fd5b5061034061033b36600461292e565b610823565b60405161021f91906129bc565b348015610358575f80fd5b506102926103673660046129ce565b610851565b348015610377575f80fd5b50610292610386366004612900565b610908565b348015610396575f80fd5b506103aa6103a53660046129fa565b61093b565b60405161021f9190612a86565b3480156103c2575f80fd5b50610292610a80565b3480156103d6575f80fd5b50600154610100900460ff16610213565b3480156103f2575f80fd5b5060035461025b906001600160a01b031681565b610292610414366004612be4565b610abd565b348015610424575f80fd5b50610292610433366004612cc0565b610ad1565b348015610443575f80fd5b50610292610b93565b348015610457575f80fd5b50610213610466366004612900565b610bcd565b348015610476575f80fd5b506102c25f81565b61029261048c366004612d5e565b610bf5565b34801561049c575f80fd5b506102926104ab366004612da5565b610c9f565b3480156104bb575f80fd5b506102926104ca366004612def565b610e2d565b3480156104da575f80fd5b506104ee6104e9366004612e81565b610ffa565b60405161021f9190612eb2565b348015610506575f80fd5b50610292610515366004612900565b61111c565b348015610525575f80fd5b5061025b73eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee81565b34801561054c575f80fd5b506102c27f539440820030c4994db4e31b6b800deafd503688728f932addfe7a410515c14c81565b34801561057f575f80fd5b506102c25f8051602061384283398151915281565b34801561059f575f80fd5b506103406105ae366004612595565b611140565b3480156105be575f80fd5b506103406105cd366004612f0a565b6111d7565b3480156105dd575f80fd5b5060025461025b906001600160a01b031681565b3480156105fc575f80fd5b5060015461025b906201000090046001600160a01b031681565b5f6001600160e01b03198216637965db0b60e01b148061064657506301ffc9a760e01b6001600160e01b03198316145b92915050565b5f6106568161120a565b61065e611214565b61066d6001805460ff19169055565b73eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeed196001600160a01b038516016106ac57815f0361069d574791505b6106a7838361126d565b610727565b815f0361071c576040516370a0823160e01b81523060048201526001600160a01b038516906370a0823190602401602060405180830381865afa1580156106f5573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906107199190612f67565b91505b610727848484611397565b6107386001805460ff191681179055565b50505050565b5f805160206138428339815191526107558161120a565b825115801590610766575081518351145b61078357604051634ec4810560e11b815260040160405180910390fd5b5f5b8351811015610738578281815181106107a0576107a0612f7e565b602002602001015160055f8684815181106107bd576107bd612f7e565b602002602001015181526020019081526020015f2090816107de919061300f565b50600101610785565b6107ef6113ab565b6107fa8383836113d4565b505050565b5f828152602081905260409020600101546108198161120a565b6107388383611439565b60605f838360405160200161083a939291906130ca565b604051602081830303815290604052905092915050565b5f805160206138428339815191526108688161120a565b8160ff165f03610895576001805462010000600160b01b031916620100006001600160a01b038616021790555b8160ff166001036108bc57600280546001600160a01b0319166001600160a01b0385161790555b8160ff166002036108e357600380546001600160a01b0319166001600160a01b0385161790555b60028260ff1611156107fa5760405163b968846160e01b815260040160405180910390fd5b6001600160a01b03811633146109315760405163334bd91960e11b815260040160405180910390fd5b6107fa82826114c8565b60605f82516001600160401b03811115610957576109576125ac565b60405190808252806020026020018201604052801561098a57816020015b60608152602001906001900390816109755790505b5090505f5b8351811015610a795760055f8583815181106109ad576109ad612f7e565b602002602001015181526020019081526020015f2080546109cd90612f92565b80601f01602080910402602001604051908101604052809291908181526020018280546109f990612f92565b8015610a445780601f10610a1b57610100808354040283529160200191610a44565b820191905f5260205f20905b815481529060010190602001808311610a2757829003601f168201915b5050505050828281518110610a5b57610a5b612f7e565b60200260200101819052508080610a7190613109565b91505061098f565b5092915050565b7f539440820030c4994db4e31b6b800deafd503688728f932addfe7a410515c14c610aaa8161120a565b610ab2611531565b610aba611559565b50565b610ac56113ab565b610738848484846115ac565b5f80516020613842833981519152610ae88161120a565b8315801590610af657508382145b610b1357604051634ec4810560e11b815260040160405180910390fd5b5f5b84811015610b8b57838382818110610b2f57610b2f612f7e565b90506080020160045f888885818110610b4a57610b4a612f7e565b9050602002016020810190610b5f9190613121565b6001600160a01b0316815260208101919091526040015f20610b81828261313c565b5050600101610b15565b505050505050565b7f539440820030c4994db4e31b6b800deafd503688728f932addfe7a410515c14c610bbd8161120a565b610bc56113ab565b610aba611722565b5f918252602082815260408084206001600160a01b0393909316845291905290205460ff1690565b610bfd611214565b610c0c6001805460ff19169055565b610c146113ab565b6001546040516356be0bf760e11b81526001600160a01b03868116600483015260248201869052604482018590528315156064830152620100009092049091169063ad7c17ee9034906084015f604051808303818588803b158015610c77575f80fd5b505af1158015610c89573d5f803e3d5ffd5b50505050506107386001805460ff191681179055565b610ca7611214565b610cb66001805460ff19169055565b610cbe6113ab565b6001546201000090046001600160a01b03163314801590610cea57506002546001600160a01b03163314155b15610d08576040516347f6b22160e01b815260040160405180910390fd5b5f805f83806020019051810190610d1f91906131be565b9250925092505f610d2f83611761565b905060ff841615801590610d4757508360ff16600114155b80610d6d57506001600160a01b0387165f9081526004602052604090206003015460ff16155b15610d8657610d7d8787836117bb565b50505050610e1c565b60ff8416158015610db357506001600160a01b03871673eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee145b15610dc257610d7d818761126d565b8360ff16600103610dda57610d7d858888848661183b565b5f80610de7898986611b34565b9150915080471015610e0957610dfe8989856117bb565b505050505050610e1c565b610e1589838386611c11565b5050505050505b6107fa6001805460ff191681179055565b5f80516020613842833981519152610e448161120a565b8515801590610e5257508584145b8015610e5d57508186145b610e7a57604051634ec4810560e11b815260040160405180910390fd5b5f5b86811015610ff05760045f898984818110610e9957610e99612f7e565b9050602002016020810190610eae9190613121565b6001600160a01b0316815260208101919091526040015f206003015460ff16610eea57604051630b84a70960e21b815260040160405180910390fd5b858582818110610efc57610efc612f7e565b905060200201355f14610f6957858582818110610f1b57610f1b612f7e565b9050602002013560045f8a8a85818110610f3757610f37612f7e565b9050602002016020810190610f4c9190613121565b6001600160a01b0316815260208101919091526040015f20600101555b838382818110610f7b57610f7b612f7e565b905060200201355f14610fe857838382818110610f9a57610f9a612f7e565b9050602002013560045f8a8a85818110610fb657610fb6612f7e565b9050602002016020810190610fcb9190613121565b6001600160a01b0316815260208101919091526040015f20600201555b600101610e7c565b5050505050505050565b60605f82516001600160401b03811115611016576110166125ac565b60405190808252806020026020018201604052801561107057816020015b61105d60405180608001604052805f81526020015f81526020015f81526020015f151581525090565b8152602001906001900390816110345790505b5090505f5b8351811015610a795760045f85838151811061109357611093612f7e565b6020908102919091018101516001600160a01b031682528181019290925260409081015f208151608081018352815481526001820154938101939093526002810154918301919091526003015460ff161515606082015282518390839081106110fe576110fe612f7e565b6020026020010181905250808061111490613109565b915050611075565b5f828152602081905260409020600101546111368161120a565b61073883836114c8565b60056020525f90815260409020805461115890612f92565b80601f016020809104026020016040519081016040528092919081815260200182805461118490612f92565b80156111cf5780601f106111a6576101008083540402835291602001916111cf565b820191905f5260205f20905b8154815290600101906020018083116111b257829003601f168201915b505050505081565b606060018484846040516020016111f19493929190613283565b60405160208183030381529060405290505b9392505050565b610aba8133611c75565b60015460ff1661126b5760405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c0060448201526064015b60405180910390fd5b565b6001600160a01b0382166112d25760405162461bcd60e51b815260206004820152602660248201527f736166655472616e736665724554483a207472616e7366657220746f2061646460448201526507265737320360d41b6064820152608401611262565b604080515f808252602082019092526001600160a01b0384169083906040516112fb9190613309565b5f6040518083038185875af1925050503d805f8114611335576040519150601f19603f3d011682016040523d82523d5f602084013e61133a565b606091505b50509050806107fa5760405162461bcd60e51b8152602060048201526024808201527f736166655472616e736665724554483a20455448207472616e736665722066616044820152631a5b195960e21b6064820152608401611262565b6107fa6001600160a01b0384168383611cb2565b600154610100900460ff161561126b5760405163d93c066560e01b815260040160405180910390fd5b60608301516001600160a01b03165f9081526004602052604090206003015460ff1661141357604051630b84a70960e21b815260040160405180910390fd5b5f61142684606001518560200151611d11565b9050610738818560200151868686611e29565b5f6114448383610bcd565b6114c1575f838152602081815260408083206001600160a01b03861684529091529020805460ff191660011790556114793390565b6001600160a01b0316826001600160a01b0316847f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d60405160405180910390a4506001610646565b505f610646565b5f6114d38383610bcd565b156114c1575f838152602081815260408083206001600160a01b0386168085529252808320805460ff1916905551339286917ff6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b9190a4506001610646565b600154610100900460ff1661126b57604051638dfc202b60e01b815260040160405180910390fd5b611561611531565b6001805461ff00191690557f5db9ee0a495bf2e6ff9c91a7834c1ba4fdd244a5e8aa4e537bd38aeae4b073aa335b6040516001600160a01b03909116815260200160405180910390a1565b5f6115bf85606001518660200151611d11565b90508082604001515f815181106115d8576115d8612f7e565b6001600160a01b0392831660209182029290920181019190915260035490870151611608928481169216906121a0565b6003546040808401516020808901519086015186516060880151945163e738aa8d60e01b81525f966001600160a01b03169563e738aa8d956116599590949093909290919089903090600401613324565b6020604051808303815f875af1158015611675573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906116999190612f67565b604084015180519192505f916116b19060019061338d565b815181106116c1576116c1612f7e565b6020908102919091018101516001600160a01b0381165f908152600490925260409091206003015490915060ff1661170c57604051630b84a70960e21b815260040160405180910390fd5b6117198183898989611e29565b50505050505050565b61172a6113ab565b6001805461ff0019166101001790557f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a25861158f3390565b5f81516014146117b35760405162461bcd60e51b815260206004820181905260248201527f496e7075742064617461206d757374206265203230206279746573206c6f6e676044820152606401611262565b506014015190565b6001600160a01b03831673eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee146117ef576117ea838284611397565b6117f9565b6117f9818361126d565b7fb533c49a97624f1eac09c983a52eb3d79e537b2bbf90d5ad83bcb0a721a9afae83835f8460405161182e94939291906133a0565b60405180910390a1505050565b5f808680602001905181019061185191906134a7565b9450945050505084821115611899575f8061186d888887611b34565b915091508047101561188d576118848888886117bb565b50505050611b2d565b61188488838389611c11565b5f806118af88886118aa878261338d565b611b34565b91509150804710156118c6576118848888886117bb565b73eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeed196001600160a01b038916016119b3577f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663d0e30db0886040518263ffffffff1660e01b81526004015f604051808303818588803b158015611944575f80fd5b505af1158015611956573d5f803e3d5ffd5b50505050507f000000000000000000000000000000000000000000000000000000000000000083604001515f8151811061199257611992612f7e565b60200260200101906001600160a01b031690816001600160a01b0316815250505b600354604084015180516119fb926001600160a01b03169187915f906119db576119db612f7e565b60200260200101516001600160a01b03166121a09092919063ffffffff16565b6003545f906001600160a01b03165a63e738aa8d60e01b8660400151888860200151895f01518a606001515f8f604051602401611a3e9796959493929190613324565b60408051601f198184030181529181526020820180516001600160e01b03166001600160e01b0319909416939093179092529051611a7c9190613309565b5f604051808303815f8787f1925050503d805f8114611ab6576040519150601f19603f3d011682016040523d82523d5f602084013e611abb565b606091505b5050905080611ada57611ad08984848a611c11565b5050505050611b2d565b8115611aea57611aea878361126d565b7fb533c49a97624f1eac09c983a52eb3d79e537b2bbf90d5ad83bcb0a721a9afae8984848a604051611b1f94939291906133a0565b60405180910390a150505050505b5050505050565b6001600160a01b0383165f908152600460205260408120600201548190600a90611b5f90600c6135fe565b611b699190613615565b831115611b8e576001600160a01b0385165f9081526004602052604090206002015492505b82841115611ba757611ba0838561338d565b9150611bab565b8392505b50816001600160a01b03851673eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee14611c09576001600160a01b0385165f90815260046020526040902060010154633b9aca0090611bfc90856135fe565b611c069190613615565b90505b935093915050565b8215611c2257611c22848285611397565b8115611c3257611c32818361126d565b7fb533c49a97624f1eac09c983a52eb3d79e537b2bbf90d5ad83bcb0a721a9afae84848484604051611c6794939291906133a0565b60405180910390a150505050565b611c7f8282610bcd565b611cae5760405163e2517d3f60e01b81526001600160a01b038216600482015260248101839052604401611262565b5050565b6040516001600160a01b038381166024830152604482018390526107fa91859182169063a9059cbb906064015b604051602081830303815290604052915060e01b6020820180516001600160e01b038381831617835250505050612227565b5f6001600160a01b03831673eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee03611dee57813414611d5657604051631841b4e160e01b815260040160405180910390fd5b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663d0e30db0346040518263ffffffff1660e01b81526004015f604051808303818588803b158015611daf575f80fd5b505af1158015611dc1573d5f803e3d5ffd5b50505050507f00000000000000000000000000000000000000000000000000000000000000009250611e22565b3415611e0d57604051631841b4e160e01b815260040160405180910390fd5b611e226001600160a01b038416333085612288565b5090919050565b82515f9081526005602052604090208054611e4390612f92565b90505f03611e64576040516338a8d85360e21b815260040160405180910390fd5b8260a0015160ff165f03611fca575f8082806020019051810190611e889190613634565b6001549193509150611ead906001600160a01b038981169162010000900416886121a0565b6001546040805160c08101825287820151815260208101899052620100009092046001600160a01b031691630421caf0918101611eea858b61338d565b81526020018a6001600160a01b0316815260200188608001516001600160a01b03168152602001885f01518152508460055f8a5f015181526020019081526020015f20886040518563ffffffff1660e01b8152600401611f4d94939291906136f0565b5f604051808303815f87803b158015611f64575f80fd5b505af1158015611f76573d5f803e3d5ffd5b5050604080516001600160a01b038b168152602081018a90525f8183015290517ff763e680fce25a97ffd55d8b705370c98b47b2285f7b3b2900c43606fd4180459350908190036060019150a15050611b2d565b8260a0015160ff16600103612187575f81806020019051810190611fee919061377e565b60025490915061200b906001600160a01b038881169116876121a0565b6002546040805160a081018252865181526001600160a01b038981166020808401919091528284018a905288515f90815260059091529290922080549290931692638121165f9260608301919061206190612f92565b80601f016020809104026020016040519081016040528092919081815260200182805461208d90612f92565b80156120d85780601f106120af576101008083540402835291602001916120d8565b820191905f5260205f20905b8154815290600101906020018083116120bb57829003601f168201915b50505050508152602001876040015181525083866040518463ffffffff1660e01b815260040161210a939291906137a4565b5f604051808303815f87803b158015612121575f80fd5b505af1158015612133573d5f803e3d5ffd5b5050604080516001600160a01b038a1681526020810189905260018183015290517ff763e680fce25a97ffd55d8b705370c98b47b2285f7b3b2900c43606fd4180459350908190036060019150a150611b2d565b6040516320db826760e01b815260040160405180910390fd5b604051636eb1769f60e11b81523060048201526001600160a01b0383811660248301525f919085169063dd62ed3e90604401602060405180830381865afa1580156121ed573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906122119190612f67565b905061073884846122228585613813565b6122c1565b5f61223b6001600160a01b03841683612350565b905080515f1415801561225f57508080602001905181019061225d9190613826565b155b156107fa57604051635274afe760e01b81526001600160a01b0384166004820152602401611262565b6040516001600160a01b0384811660248301528381166044830152606482018390526107389186918216906323b872dd90608401611cdf565b604080516001600160a01b038416602482015260448082018490528251808303909101815260649091019091526020810180516001600160e01b031663095ea7b360e01b179052612312848261235d565b610738576040516001600160a01b0384811660248301525f604483015261234691869182169063095ea7b390606401611cdf565b6107388482612227565b606061120383835f6123fe565b5f805f846001600160a01b0316846040516123789190613309565b5f604051808303815f865af19150503d805f81146123b1576040519150601f19603f3d011682016040523d82523d5f602084013e6123b6565b606091505b50915091508180156123e05750805115806123e05750808060200190518101906123e09190613826565b80156123f557505f856001600160a01b03163b115b95945050505050565b6060814710156124235760405163cd78605960e01b8152306004820152602401611262565b5f80856001600160a01b0316848660405161243e9190613309565b5f6040518083038185875af1925050503d805f8114612478576040519150601f19603f3d011682016040523d82523d5f602084013e61247d565b606091505b509150915061248d868383612497565b9695505050505050565b6060826124ac576124a7826124f3565b611203565b81511580156124c357506001600160a01b0384163b155b156124ec57604051639996b31560e01b81526001600160a01b0385166004820152602401611262565b5080611203565b8051156125035780518082602001fd5b604051630a12f52160e11b815260040160405180910390fd5b5f6020828403121561252c575f80fd5b81356001600160e01b031981168114611203575f80fd5b6001600160a01b0381168114610aba575f80fd5b5f805f60608486031215612569575f80fd5b833561257481612543565b9250602084013561258481612543565b929592945050506040919091013590565b5f602082840312156125a5575f80fd5b5035919050565b634e487b7160e01b5f52604160045260245ffd5b604051608081016001600160401b03811182821017156125e2576125e26125ac565b60405290565b604051601f8201601f191681016001600160401b0381118282101715612610576126106125ac565b604052919050565b5f6001600160401b03821115612630576126306125ac565b5060051b60200190565b5f82601f830112612649575f80fd5b8135602061265e61265983612618565b6125e8565b82815260059290921b8401810191818101908684111561267c575f80fd5b8286015b848110156126975780358352918301918301612680565b509695505050505050565b5f6001600160401b038211156126ba576126ba6125ac565b50601f01601f191660200190565b5f82601f8301126126d7575f80fd5b81356126e5612659826126a2565b8181528460208386010111156126f9575f80fd5b816020850160208301375f918101602001919091529392505050565b5f82601f830112612724575f80fd5b8135602061273461265983612618565b82815260059290921b84018101918181019086841115612752575f80fd5b8286015b848110156126975780356001600160401b03811115612774575f8081fd5b6127828986838b01016126c8565b845250918301918301612756565b5f80604083850312156127a1575f80fd5b82356001600160401b03808211156127b7575f80fd5b6127c38683870161263a565b935060208501359150808211156127d8575f80fd5b506127e585828601612715565b9150509250929050565b60ff81168114610aba575f80fd5b5f60c0828403121561280d575f80fd5b60405160c081018181106001600160401b038211171561282f5761282f6125ac565b8060405250809150823581526020830135602082015260408301356040820152606083013561285d81612543565b6060820152608083013561287081612543565b608082015260a0830135612883816127ef565b60a0919091015292915050565b5f805f61010084860312156128a3575f80fd5b6128ad85856127fd565b925060c08401356001600160401b03808211156128c8575f80fd5b6128d4878388016126c8565b935060e08601359150808211156128e9575f80fd5b506128f6868287016126c8565b9150509250925092565b5f8060408385031215612911575f80fd5b82359150602083013561292381612543565b809150509250929050565b5f806040838503121561293f575f80fd5b82356001600160401b03811115612954575f80fd5b612960858286016126c8565b95602094909401359450505050565b5f5b83811015612989578181015183820152602001612971565b50505f910152565b5f81518084526129a881602086016020860161296f565b601f01601f19169290920160200192915050565b602081525f6112036020830184612991565b5f80604083850312156129df575f80fd5b82356129ea81612543565b91506020830135612923816127ef565b5f60208284031215612a0a575f80fd5b81356001600160401b03811115612a1f575f80fd5b612a2b8482850161263a565b949350505050565b5f81518084526020808501808196508360051b810191508286015f5b85811015612a79578284038952612a67848351612991565b98850198935090840190600101612a4f565b5091979650505050505050565b602081525f6112036020830184612a33565b5f82601f830112612aa7575f80fd5b81356020612ab761265983612618565b82815260059290921b84018101918181019086841115612ad5575f80fd5b8286015b84811015612697578035612aec81612543565b8352918301918301612ad9565b5f60808284031215612b09575f80fd5b612b116125c0565b905081356001600160401b0380821115612b29575f80fd5b818401915084601f830112612b3c575f80fd5b81356020612b4c61265983612618565b82815260059290921b84018101918181019088841115612b6a575f80fd5b948201945b83861015612b8857853582529482019490820190612b6f565b8652508581013590850152506040840135915080821115612ba7575f80fd5b612bb385838601612a98565b60408401526060840135915080821115612bcb575f80fd5b50612bd884828501612715565b60608301525092915050565b5f805f806101208587031215612bf8575f80fd5b612c0286866127fd565b935060c08501356001600160401b0380821115612c1d575f80fd5b612c29888389016126c8565b945060e0870135915080821115612c3e575f80fd5b612c4a888389016126c8565b9350610100870135915080821115612c60575f80fd5b50612c6d87828801612af9565b91505092959194509250565b5f8083601f840112612c89575f80fd5b5081356001600160401b03811115612c9f575f80fd5b6020830191508360208260051b8501011115612cb9575f80fd5b9250929050565b5f805f8060408587031215612cd3575f80fd5b84356001600160401b0380821115612ce9575f80fd5b612cf588838901612c79565b90965094506020870135915080821115612d0d575f80fd5b818701915087601f830112612d20575f80fd5b813581811115612d2e575f80fd5b8860208260071b8501011115612d42575f80fd5b95989497505060200194505050565b8015158114610aba575f80fd5b5f805f8060808587031215612d71575f80fd5b8435612d7c81612543565b935060208501359250604085013591506060850135612d9a81612d51565b939692955090935050565b5f805f60608486031215612db7575f80fd5b8335612dc281612543565b92506020840135915060408401356001600160401b03811115612de3575f80fd5b6128f6868287016126c8565b5f805f805f8060608789031215612e04575f80fd5b86356001600160401b0380821115612e1a575f80fd5b612e268a838b01612c79565b90985096506020890135915080821115612e3e575f80fd5b612e4a8a838b01612c79565b90965094506040890135915080821115612e62575f80fd5b50612e6f89828a01612c79565b979a9699509497509295939492505050565b5f60208284031215612e91575f80fd5b81356001600160401b03811115612ea6575f80fd5b612a2b84828501612a98565b602080825282518282018190525f919060409081850190868401855b82811015612a79578151805185528681015187860152858101518686015260609081015115159085015260809093019290850190600101612ece565b5f805f60608486031215612f1c575f80fd5b83356001600160401b0380821115612f32575f80fd5b612f3e878388016126c8565b9450602086013593506040860135915080821115612f5a575f80fd5b506128f686828701612af9565b5f60208284031215612f77575f80fd5b5051919050565b634e487b7160e01b5f52603260045260245ffd5b600181811c90821680612fa657607f821691505b602082108103612fc457634e487b7160e01b5f52602260045260245ffd5b50919050565b601f8211156107fa575f81815260208120601f850160051c81016020861015612ff05750805b601f850160051c820191505b81811015610b8b57828155600101612ffc565b81516001600160401b03811115613028576130286125ac565b61303c816130368454612f92565b84612fca565b602080601f83116001811461306f575f84156130585750858301515b5f19600386901b1c1916600185901b178555610b8b565b5f85815260208120601f198616915b8281101561309d5788860151825594840194600190910190840161307e565b50858210156130ba57878501515f19600388901b60f8161c191681555b5050505050600190811b01905550565b60ff84168152606060208201525f6130e56060830185612991565b9050826040830152949350505050565b634e487b7160e01b5f52601160045260245ffd5b5f6001820161311a5761311a6130f5565b5060010190565b5f60208284031215613131575f80fd5b813561120381612543565b81358155602082013560018201556040820135600282015560038101606083013561316681612d51565b815490151560ff1660ff19919091161790555050565b5f82601f83011261318b575f80fd5b8151613199612659826126a2565b8181528460208386010111156131ad575f80fd5b612a2b82602083016020870161296f565b5f805f606084860312156131d0575f80fd5b83516131db816127ef565b60208501519093506001600160401b038111156131f6575f80fd5b6132028682870161317c565b925050604084015190509250925092565b5f8151808452602080850194508084015f5b8381101561324157815187529582019590820190600101613225565b509495945050505050565b5f8151808452602080850194508084015f5b838110156132415781516001600160a01b03168752958201959082019060010161325e565b60ff85168152608060208201525f61329e6080830186612991565b84604084015282810360608401528351608082526132bf6080830182613213565b905060208501516020830152604085015182820360408401526132e2828261324c565b915050606085015182820360608401526132fc8282612a33565b9998505050505050505050565b5f825161331a81846020870161296f565b9190910192915050565b60e081525f61333660e083018a61324c565b88602084015287604084015282810360608401526133548188613213565b905082810360808401526133688187612a33565b94151560a084015250506001600160a01b039190911660c09091015295945050505050565b81810381811115610646576106466130f5565b6001600160a01b03948516815260208101939093526040830191909152909116606082015260800190565b5f82601f8301126133da575f80fd5b815160206133ea61265983612618565b82815260059290921b84018101918181019086841115613408575f80fd5b8286015b8481101561269757805161341f81612543565b835291830191830161340c565b5f82601f83011261343b575f80fd5b8151602061344b61265983612618565b82815260059290921b84018101918181019086841115613469575f80fd5b8286015b848110156126975780516001600160401b0381111561348b575f8081fd5b6134998986838b010161317c565b84525091830191830161346d565b5f805f805f60a086880312156134bb575f80fd5b85516134c6816127ef565b809550506020808701516001600160401b03808211156134e4575f80fd5b6134f08a838b0161317c565b965060408901519550606089015194506080890151915080821115613513575f80fd5b908801906080828b031215613526575f80fd5b61352e6125c0565b82518281111561353c575f80fd5b8301601f81018c1361354c575f80fd5b805161355a61265982612618565b81815260059190911b8201860190868101908e831115613578575f80fd5b928701925b828410156135965783518252928701929087019061357d565b80855250505050838301518482015260408301519350818411156135b8575f80fd5b6135c48b8585016133cb565b604082015260608301519350818411156135dc575f80fd5b6135e88b85850161342c565b6060820152809450505050509295509295909350565b8082028115828204841417610646576106466130f5565b5f8261362f57634e487b7160e01b5f52601260045260245ffd5b500490565b5f8060408385031215613645575f80fd5b82516001600160401b0381111561365a575f80fd5b6136668582860161317c565b925050602083015190509250929050565b5f815461368381612f92565b8085526020600183811680156136a057600181146136ba576136e5565b60ff1985168884015283151560051b8801830195506136e5565b865f52825f205f5b858110156136dd5781548a82018601529083019084016136c2565b890184019650505b505050505092915050565b5f610120865183526020870151602084015260408701516040840152606087015160018060a01b0380821660608601528060808a0151166080860152505060a087015160a08401528060c084015261374a81840187612991565b905082810360e084015261375e8186613677565b90508281036101008401526137738185612991565b979650505050505050565b5f6020828403121561378e575f80fd5b81516001600160401b0381168114611203575f80fd5b606081528351606082015260018060a01b036020850151166080820152604084015160a08201525f606085015160a060c08401526137e6610100840182612991565b9050608086015160e08401526001600160401b0385166020840152828103604084015261248d8185612991565b80820180821115610646576106466130f5565b5f60208284031215613836575f80fd5b815161120381612d5156fe8b9e7a9f25b0aca3f51c01b8fee30790fb16f4d4deded8385ae6643d054bb078a26469706673582212204161c5cb893d0ed5e2e9249b5486d7b4a519fb06d12d0a658b80e5dcb23f9f9c64736f6c634300081400330000000000000000000000000000000000000000000000000000000000000000000000000000000000000000f0773508c585246bd09bfb401aa18b72685b03f90000000000000000000000000000000000000000000000000000000000000000000000000000000000000000039e2fb66102314ce7b64ce5ce3e5183bc94ad38
Deployed Bytecode
0x6080604052600436106101e9575f3560e01c80638456cb5911610108578063d2dd54b41161009d578063db618e2a1161006d578063db618e2a14610574578063de28918814610594578063e19f8f3e146105b3578063e78cea92146105d2578063f645d4f9146105f1575f80fd5b8063d2dd54b4146104cf578063d547741f146104fb578063d5bcb6101461051a578063d9dc869414610541575f80fd5b8063c0e2071d116100d8578063c0e2071d146102ef578063c974976914610406578063d00a2d5f14610491578063d13f2cb2146104b0575f80fd5b80638456cb591461043857806391d148541461044c578063a217fddf1461046b578063ad7c17ee1461047e575f80fd5b8063356ac86e1161017e5780635c975abb1161014e5780635c975abb146103cb5780636cec044b146103e75780637a9f21ca1461040657806380045ed814610419575f80fd5b8063356ac86e1461034d57806336568abe1461036c5780633731f0b41461038b5780633f4ba83a146103b7575f80fd5b806325c35173116101b957806325c35173146102d05780632bc2ad20146102ef5780632f2ff15d14610302578063301ab42d14610321575f80fd5b806301ffc9a7146101f457806317fcb39b1461022857806320ff430b14610273578063248a9ca314610294575f80fd5b366101f057005b5f80fd5b3480156101ff575f80fd5b5061021361020e36600461251c565b610616565b60405190151581526020015b60405180910390f35b348015610233575f80fd5b5061025b7f000000000000000000000000039e2fb66102314ce7b64ce5ce3e5183bc94ad3881565b6040516001600160a01b03909116815260200161021f565b34801561027e575f80fd5b5061029261028d366004612557565b61064c565b005b34801561029f575f80fd5b506102c26102ae366004612595565b5f9081526020819052604090206001015490565b60405190815260200161021f565b3480156102db575f80fd5b506102926102ea366004612790565b61073e565b6102926102fd366004612890565b6107e7565b34801561030d575f80fd5b5061029261031c366004612900565b6107ff565b34801561032c575f80fd5b5061034061033b36600461292e565b610823565b60405161021f91906129bc565b348015610358575f80fd5b506102926103673660046129ce565b610851565b348015610377575f80fd5b50610292610386366004612900565b610908565b348015610396575f80fd5b506103aa6103a53660046129fa565b61093b565b60405161021f9190612a86565b3480156103c2575f80fd5b50610292610a80565b3480156103d6575f80fd5b50600154610100900460ff16610213565b3480156103f2575f80fd5b5060035461025b906001600160a01b031681565b610292610414366004612be4565b610abd565b348015610424575f80fd5b50610292610433366004612cc0565b610ad1565b348015610443575f80fd5b50610292610b93565b348015610457575f80fd5b50610213610466366004612900565b610bcd565b348015610476575f80fd5b506102c25f81565b61029261048c366004612d5e565b610bf5565b34801561049c575f80fd5b506102926104ab366004612da5565b610c9f565b3480156104bb575f80fd5b506102926104ca366004612def565b610e2d565b3480156104da575f80fd5b506104ee6104e9366004612e81565b610ffa565b60405161021f9190612eb2565b348015610506575f80fd5b50610292610515366004612900565b61111c565b348015610525575f80fd5b5061025b73eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee81565b34801561054c575f80fd5b506102c27f539440820030c4994db4e31b6b800deafd503688728f932addfe7a410515c14c81565b34801561057f575f80fd5b506102c25f8051602061384283398151915281565b34801561059f575f80fd5b506103406105ae366004612595565b611140565b3480156105be575f80fd5b506103406105cd366004612f0a565b6111d7565b3480156105dd575f80fd5b5060025461025b906001600160a01b031681565b3480156105fc575f80fd5b5060015461025b906201000090046001600160a01b031681565b5f6001600160e01b03198216637965db0b60e01b148061064657506301ffc9a760e01b6001600160e01b03198316145b92915050565b5f6106568161120a565b61065e611214565b61066d6001805460ff19169055565b73eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeed196001600160a01b038516016106ac57815f0361069d574791505b6106a7838361126d565b610727565b815f0361071c576040516370a0823160e01b81523060048201526001600160a01b038516906370a0823190602401602060405180830381865afa1580156106f5573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906107199190612f67565b91505b610727848484611397565b6107386001805460ff191681179055565b50505050565b5f805160206138428339815191526107558161120a565b825115801590610766575081518351145b61078357604051634ec4810560e11b815260040160405180910390fd5b5f5b8351811015610738578281815181106107a0576107a0612f7e565b602002602001015160055f8684815181106107bd576107bd612f7e565b602002602001015181526020019081526020015f2090816107de919061300f565b50600101610785565b6107ef6113ab565b6107fa8383836113d4565b505050565b5f828152602081905260409020600101546108198161120a565b6107388383611439565b60605f838360405160200161083a939291906130ca565b604051602081830303815290604052905092915050565b5f805160206138428339815191526108688161120a565b8160ff165f03610895576001805462010000600160b01b031916620100006001600160a01b038616021790555b8160ff166001036108bc57600280546001600160a01b0319166001600160a01b0385161790555b8160ff166002036108e357600380546001600160a01b0319166001600160a01b0385161790555b60028260ff1611156107fa5760405163b968846160e01b815260040160405180910390fd5b6001600160a01b03811633146109315760405163334bd91960e11b815260040160405180910390fd5b6107fa82826114c8565b60605f82516001600160401b03811115610957576109576125ac565b60405190808252806020026020018201604052801561098a57816020015b60608152602001906001900390816109755790505b5090505f5b8351811015610a795760055f8583815181106109ad576109ad612f7e565b602002602001015181526020019081526020015f2080546109cd90612f92565b80601f01602080910402602001604051908101604052809291908181526020018280546109f990612f92565b8015610a445780601f10610a1b57610100808354040283529160200191610a44565b820191905f5260205f20905b815481529060010190602001808311610a2757829003601f168201915b5050505050828281518110610a5b57610a5b612f7e565b60200260200101819052508080610a7190613109565b91505061098f565b5092915050565b7f539440820030c4994db4e31b6b800deafd503688728f932addfe7a410515c14c610aaa8161120a565b610ab2611531565b610aba611559565b50565b610ac56113ab565b610738848484846115ac565b5f80516020613842833981519152610ae88161120a565b8315801590610af657508382145b610b1357604051634ec4810560e11b815260040160405180910390fd5b5f5b84811015610b8b57838382818110610b2f57610b2f612f7e565b90506080020160045f888885818110610b4a57610b4a612f7e565b9050602002016020810190610b5f9190613121565b6001600160a01b0316815260208101919091526040015f20610b81828261313c565b5050600101610b15565b505050505050565b7f539440820030c4994db4e31b6b800deafd503688728f932addfe7a410515c14c610bbd8161120a565b610bc56113ab565b610aba611722565b5f918252602082815260408084206001600160a01b0393909316845291905290205460ff1690565b610bfd611214565b610c0c6001805460ff19169055565b610c146113ab565b6001546040516356be0bf760e11b81526001600160a01b03868116600483015260248201869052604482018590528315156064830152620100009092049091169063ad7c17ee9034906084015f604051808303818588803b158015610c77575f80fd5b505af1158015610c89573d5f803e3d5ffd5b50505050506107386001805460ff191681179055565b610ca7611214565b610cb66001805460ff19169055565b610cbe6113ab565b6001546201000090046001600160a01b03163314801590610cea57506002546001600160a01b03163314155b15610d08576040516347f6b22160e01b815260040160405180910390fd5b5f805f83806020019051810190610d1f91906131be565b9250925092505f610d2f83611761565b905060ff841615801590610d4757508360ff16600114155b80610d6d57506001600160a01b0387165f9081526004602052604090206003015460ff16155b15610d8657610d7d8787836117bb565b50505050610e1c565b60ff8416158015610db357506001600160a01b03871673eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee145b15610dc257610d7d818761126d565b8360ff16600103610dda57610d7d858888848661183b565b5f80610de7898986611b34565b9150915080471015610e0957610dfe8989856117bb565b505050505050610e1c565b610e1589838386611c11565b5050505050505b6107fa6001805460ff191681179055565b5f80516020613842833981519152610e448161120a565b8515801590610e5257508584145b8015610e5d57508186145b610e7a57604051634ec4810560e11b815260040160405180910390fd5b5f5b86811015610ff05760045f898984818110610e9957610e99612f7e565b9050602002016020810190610eae9190613121565b6001600160a01b0316815260208101919091526040015f206003015460ff16610eea57604051630b84a70960e21b815260040160405180910390fd5b858582818110610efc57610efc612f7e565b905060200201355f14610f6957858582818110610f1b57610f1b612f7e565b9050602002013560045f8a8a85818110610f3757610f37612f7e565b9050602002016020810190610f4c9190613121565b6001600160a01b0316815260208101919091526040015f20600101555b838382818110610f7b57610f7b612f7e565b905060200201355f14610fe857838382818110610f9a57610f9a612f7e565b9050602002013560045f8a8a85818110610fb657610fb6612f7e565b9050602002016020810190610fcb9190613121565b6001600160a01b0316815260208101919091526040015f20600201555b600101610e7c565b5050505050505050565b60605f82516001600160401b03811115611016576110166125ac565b60405190808252806020026020018201604052801561107057816020015b61105d60405180608001604052805f81526020015f81526020015f81526020015f151581525090565b8152602001906001900390816110345790505b5090505f5b8351811015610a795760045f85838151811061109357611093612f7e565b6020908102919091018101516001600160a01b031682528181019290925260409081015f208151608081018352815481526001820154938101939093526002810154918301919091526003015460ff161515606082015282518390839081106110fe576110fe612f7e565b6020026020010181905250808061111490613109565b915050611075565b5f828152602081905260409020600101546111368161120a565b61073883836114c8565b60056020525f90815260409020805461115890612f92565b80601f016020809104026020016040519081016040528092919081815260200182805461118490612f92565b80156111cf5780601f106111a6576101008083540402835291602001916111cf565b820191905f5260205f20905b8154815290600101906020018083116111b257829003601f168201915b505050505081565b606060018484846040516020016111f19493929190613283565b60405160208183030381529060405290505b9392505050565b610aba8133611c75565b60015460ff1661126b5760405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c0060448201526064015b60405180910390fd5b565b6001600160a01b0382166112d25760405162461bcd60e51b815260206004820152602660248201527f736166655472616e736665724554483a207472616e7366657220746f2061646460448201526507265737320360d41b6064820152608401611262565b604080515f808252602082019092526001600160a01b0384169083906040516112fb9190613309565b5f6040518083038185875af1925050503d805f8114611335576040519150601f19603f3d011682016040523d82523d5f602084013e61133a565b606091505b50509050806107fa5760405162461bcd60e51b8152602060048201526024808201527f736166655472616e736665724554483a20455448207472616e736665722066616044820152631a5b195960e21b6064820152608401611262565b6107fa6001600160a01b0384168383611cb2565b600154610100900460ff161561126b5760405163d93c066560e01b815260040160405180910390fd5b60608301516001600160a01b03165f9081526004602052604090206003015460ff1661141357604051630b84a70960e21b815260040160405180910390fd5b5f61142684606001518560200151611d11565b9050610738818560200151868686611e29565b5f6114448383610bcd565b6114c1575f838152602081815260408083206001600160a01b03861684529091529020805460ff191660011790556114793390565b6001600160a01b0316826001600160a01b0316847f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d60405160405180910390a4506001610646565b505f610646565b5f6114d38383610bcd565b156114c1575f838152602081815260408083206001600160a01b0386168085529252808320805460ff1916905551339286917ff6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b9190a4506001610646565b600154610100900460ff1661126b57604051638dfc202b60e01b815260040160405180910390fd5b611561611531565b6001805461ff00191690557f5db9ee0a495bf2e6ff9c91a7834c1ba4fdd244a5e8aa4e537bd38aeae4b073aa335b6040516001600160a01b03909116815260200160405180910390a1565b5f6115bf85606001518660200151611d11565b90508082604001515f815181106115d8576115d8612f7e565b6001600160a01b0392831660209182029290920181019190915260035490870151611608928481169216906121a0565b6003546040808401516020808901519086015186516060880151945163e738aa8d60e01b81525f966001600160a01b03169563e738aa8d956116599590949093909290919089903090600401613324565b6020604051808303815f875af1158015611675573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906116999190612f67565b604084015180519192505f916116b19060019061338d565b815181106116c1576116c1612f7e565b6020908102919091018101516001600160a01b0381165f908152600490925260409091206003015490915060ff1661170c57604051630b84a70960e21b815260040160405180910390fd5b6117198183898989611e29565b50505050505050565b61172a6113ab565b6001805461ff0019166101001790557f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a25861158f3390565b5f81516014146117b35760405162461bcd60e51b815260206004820181905260248201527f496e7075742064617461206d757374206265203230206279746573206c6f6e676044820152606401611262565b506014015190565b6001600160a01b03831673eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee146117ef576117ea838284611397565b6117f9565b6117f9818361126d565b7fb533c49a97624f1eac09c983a52eb3d79e537b2bbf90d5ad83bcb0a721a9afae83835f8460405161182e94939291906133a0565b60405180910390a1505050565b5f808680602001905181019061185191906134a7565b9450945050505084821115611899575f8061186d888887611b34565b915091508047101561188d576118848888886117bb565b50505050611b2d565b61188488838389611c11565b5f806118af88886118aa878261338d565b611b34565b91509150804710156118c6576118848888886117bb565b73eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeed196001600160a01b038916016119b3577f000000000000000000000000039e2fb66102314ce7b64ce5ce3e5183bc94ad386001600160a01b031663d0e30db0886040518263ffffffff1660e01b81526004015f604051808303818588803b158015611944575f80fd5b505af1158015611956573d5f803e3d5ffd5b50505050507f000000000000000000000000039e2fb66102314ce7b64ce5ce3e5183bc94ad3883604001515f8151811061199257611992612f7e565b60200260200101906001600160a01b031690816001600160a01b0316815250505b600354604084015180516119fb926001600160a01b03169187915f906119db576119db612f7e565b60200260200101516001600160a01b03166121a09092919063ffffffff16565b6003545f906001600160a01b03165a63e738aa8d60e01b8660400151888860200151895f01518a606001515f8f604051602401611a3e9796959493929190613324565b60408051601f198184030181529181526020820180516001600160e01b03166001600160e01b0319909416939093179092529051611a7c9190613309565b5f604051808303815f8787f1925050503d805f8114611ab6576040519150601f19603f3d011682016040523d82523d5f602084013e611abb565b606091505b5050905080611ada57611ad08984848a611c11565b5050505050611b2d565b8115611aea57611aea878361126d565b7fb533c49a97624f1eac09c983a52eb3d79e537b2bbf90d5ad83bcb0a721a9afae8984848a604051611b1f94939291906133a0565b60405180910390a150505050505b5050505050565b6001600160a01b0383165f908152600460205260408120600201548190600a90611b5f90600c6135fe565b611b699190613615565b831115611b8e576001600160a01b0385165f9081526004602052604090206002015492505b82841115611ba757611ba0838561338d565b9150611bab565b8392505b50816001600160a01b03851673eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee14611c09576001600160a01b0385165f90815260046020526040902060010154633b9aca0090611bfc90856135fe565b611c069190613615565b90505b935093915050565b8215611c2257611c22848285611397565b8115611c3257611c32818361126d565b7fb533c49a97624f1eac09c983a52eb3d79e537b2bbf90d5ad83bcb0a721a9afae84848484604051611c6794939291906133a0565b60405180910390a150505050565b611c7f8282610bcd565b611cae5760405163e2517d3f60e01b81526001600160a01b038216600482015260248101839052604401611262565b5050565b6040516001600160a01b038381166024830152604482018390526107fa91859182169063a9059cbb906064015b604051602081830303815290604052915060e01b6020820180516001600160e01b038381831617835250505050612227565b5f6001600160a01b03831673eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee03611dee57813414611d5657604051631841b4e160e01b815260040160405180910390fd5b7f000000000000000000000000039e2fb66102314ce7b64ce5ce3e5183bc94ad386001600160a01b031663d0e30db0346040518263ffffffff1660e01b81526004015f604051808303818588803b158015611daf575f80fd5b505af1158015611dc1573d5f803e3d5ffd5b50505050507f000000000000000000000000039e2fb66102314ce7b64ce5ce3e5183bc94ad389250611e22565b3415611e0d57604051631841b4e160e01b815260040160405180910390fd5b611e226001600160a01b038416333085612288565b5090919050565b82515f9081526005602052604090208054611e4390612f92565b90505f03611e64576040516338a8d85360e21b815260040160405180910390fd5b8260a0015160ff165f03611fca575f8082806020019051810190611e889190613634565b6001549193509150611ead906001600160a01b038981169162010000900416886121a0565b6001546040805160c08101825287820151815260208101899052620100009092046001600160a01b031691630421caf0918101611eea858b61338d565b81526020018a6001600160a01b0316815260200188608001516001600160a01b03168152602001885f01518152508460055f8a5f015181526020019081526020015f20886040518563ffffffff1660e01b8152600401611f4d94939291906136f0565b5f604051808303815f87803b158015611f64575f80fd5b505af1158015611f76573d5f803e3d5ffd5b5050604080516001600160a01b038b168152602081018a90525f8183015290517ff763e680fce25a97ffd55d8b705370c98b47b2285f7b3b2900c43606fd4180459350908190036060019150a15050611b2d565b8260a0015160ff16600103612187575f81806020019051810190611fee919061377e565b60025490915061200b906001600160a01b038881169116876121a0565b6002546040805160a081018252865181526001600160a01b038981166020808401919091528284018a905288515f90815260059091529290922080549290931692638121165f9260608301919061206190612f92565b80601f016020809104026020016040519081016040528092919081815260200182805461208d90612f92565b80156120d85780601f106120af576101008083540402835291602001916120d8565b820191905f5260205f20905b8154815290600101906020018083116120bb57829003601f168201915b50505050508152602001876040015181525083866040518463ffffffff1660e01b815260040161210a939291906137a4565b5f604051808303815f87803b158015612121575f80fd5b505af1158015612133573d5f803e3d5ffd5b5050604080516001600160a01b038a1681526020810189905260018183015290517ff763e680fce25a97ffd55d8b705370c98b47b2285f7b3b2900c43606fd4180459350908190036060019150a150611b2d565b6040516320db826760e01b815260040160405180910390fd5b604051636eb1769f60e11b81523060048201526001600160a01b0383811660248301525f919085169063dd62ed3e90604401602060405180830381865afa1580156121ed573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906122119190612f67565b905061073884846122228585613813565b6122c1565b5f61223b6001600160a01b03841683612350565b905080515f1415801561225f57508080602001905181019061225d9190613826565b155b156107fa57604051635274afe760e01b81526001600160a01b0384166004820152602401611262565b6040516001600160a01b0384811660248301528381166044830152606482018390526107389186918216906323b872dd90608401611cdf565b604080516001600160a01b038416602482015260448082018490528251808303909101815260649091019091526020810180516001600160e01b031663095ea7b360e01b179052612312848261235d565b610738576040516001600160a01b0384811660248301525f604483015261234691869182169063095ea7b390606401611cdf565b6107388482612227565b606061120383835f6123fe565b5f805f846001600160a01b0316846040516123789190613309565b5f604051808303815f865af19150503d805f81146123b1576040519150601f19603f3d011682016040523d82523d5f602084013e6123b6565b606091505b50915091508180156123e05750805115806123e05750808060200190518101906123e09190613826565b80156123f557505f856001600160a01b03163b115b95945050505050565b6060814710156124235760405163cd78605960e01b8152306004820152602401611262565b5f80856001600160a01b0316848660405161243e9190613309565b5f6040518083038185875af1925050503d805f8114612478576040519150601f19603f3d011682016040523d82523d5f602084013e61247d565b606091505b509150915061248d868383612497565b9695505050505050565b6060826124ac576124a7826124f3565b611203565b81511580156124c357506001600160a01b0384163b155b156124ec57604051639996b31560e01b81526001600160a01b0385166004820152602401611262565b5080611203565b8051156125035780518082602001fd5b604051630a12f52160e11b815260040160405180910390fd5b5f6020828403121561252c575f80fd5b81356001600160e01b031981168114611203575f80fd5b6001600160a01b0381168114610aba575f80fd5b5f805f60608486031215612569575f80fd5b833561257481612543565b9250602084013561258481612543565b929592945050506040919091013590565b5f602082840312156125a5575f80fd5b5035919050565b634e487b7160e01b5f52604160045260245ffd5b604051608081016001600160401b03811182821017156125e2576125e26125ac565b60405290565b604051601f8201601f191681016001600160401b0381118282101715612610576126106125ac565b604052919050565b5f6001600160401b03821115612630576126306125ac565b5060051b60200190565b5f82601f830112612649575f80fd5b8135602061265e61265983612618565b6125e8565b82815260059290921b8401810191818101908684111561267c575f80fd5b8286015b848110156126975780358352918301918301612680565b509695505050505050565b5f6001600160401b038211156126ba576126ba6125ac565b50601f01601f191660200190565b5f82601f8301126126d7575f80fd5b81356126e5612659826126a2565b8181528460208386010111156126f9575f80fd5b816020850160208301375f918101602001919091529392505050565b5f82601f830112612724575f80fd5b8135602061273461265983612618565b82815260059290921b84018101918181019086841115612752575f80fd5b8286015b848110156126975780356001600160401b03811115612774575f8081fd5b6127828986838b01016126c8565b845250918301918301612756565b5f80604083850312156127a1575f80fd5b82356001600160401b03808211156127b7575f80fd5b6127c38683870161263a565b935060208501359150808211156127d8575f80fd5b506127e585828601612715565b9150509250929050565b60ff81168114610aba575f80fd5b5f60c0828403121561280d575f80fd5b60405160c081018181106001600160401b038211171561282f5761282f6125ac565b8060405250809150823581526020830135602082015260408301356040820152606083013561285d81612543565b6060820152608083013561287081612543565b608082015260a0830135612883816127ef565b60a0919091015292915050565b5f805f61010084860312156128a3575f80fd5b6128ad85856127fd565b925060c08401356001600160401b03808211156128c8575f80fd5b6128d4878388016126c8565b935060e08601359150808211156128e9575f80fd5b506128f6868287016126c8565b9150509250925092565b5f8060408385031215612911575f80fd5b82359150602083013561292381612543565b809150509250929050565b5f806040838503121561293f575f80fd5b82356001600160401b03811115612954575f80fd5b612960858286016126c8565b95602094909401359450505050565b5f5b83811015612989578181015183820152602001612971565b50505f910152565b5f81518084526129a881602086016020860161296f565b601f01601f19169290920160200192915050565b602081525f6112036020830184612991565b5f80604083850312156129df575f80fd5b82356129ea81612543565b91506020830135612923816127ef565b5f60208284031215612a0a575f80fd5b81356001600160401b03811115612a1f575f80fd5b612a2b8482850161263a565b949350505050565b5f81518084526020808501808196508360051b810191508286015f5b85811015612a79578284038952612a67848351612991565b98850198935090840190600101612a4f565b5091979650505050505050565b602081525f6112036020830184612a33565b5f82601f830112612aa7575f80fd5b81356020612ab761265983612618565b82815260059290921b84018101918181019086841115612ad5575f80fd5b8286015b84811015612697578035612aec81612543565b8352918301918301612ad9565b5f60808284031215612b09575f80fd5b612b116125c0565b905081356001600160401b0380821115612b29575f80fd5b818401915084601f830112612b3c575f80fd5b81356020612b4c61265983612618565b82815260059290921b84018101918181019088841115612b6a575f80fd5b948201945b83861015612b8857853582529482019490820190612b6f565b8652508581013590850152506040840135915080821115612ba7575f80fd5b612bb385838601612a98565b60408401526060840135915080821115612bcb575f80fd5b50612bd884828501612715565b60608301525092915050565b5f805f806101208587031215612bf8575f80fd5b612c0286866127fd565b935060c08501356001600160401b0380821115612c1d575f80fd5b612c29888389016126c8565b945060e0870135915080821115612c3e575f80fd5b612c4a888389016126c8565b9350610100870135915080821115612c60575f80fd5b50612c6d87828801612af9565b91505092959194509250565b5f8083601f840112612c89575f80fd5b5081356001600160401b03811115612c9f575f80fd5b6020830191508360208260051b8501011115612cb9575f80fd5b9250929050565b5f805f8060408587031215612cd3575f80fd5b84356001600160401b0380821115612ce9575f80fd5b612cf588838901612c79565b90965094506020870135915080821115612d0d575f80fd5b818701915087601f830112612d20575f80fd5b813581811115612d2e575f80fd5b8860208260071b8501011115612d42575f80fd5b95989497505060200194505050565b8015158114610aba575f80fd5b5f805f8060808587031215612d71575f80fd5b8435612d7c81612543565b935060208501359250604085013591506060850135612d9a81612d51565b939692955090935050565b5f805f60608486031215612db7575f80fd5b8335612dc281612543565b92506020840135915060408401356001600160401b03811115612de3575f80fd5b6128f6868287016126c8565b5f805f805f8060608789031215612e04575f80fd5b86356001600160401b0380821115612e1a575f80fd5b612e268a838b01612c79565b90985096506020890135915080821115612e3e575f80fd5b612e4a8a838b01612c79565b90965094506040890135915080821115612e62575f80fd5b50612e6f89828a01612c79565b979a9699509497509295939492505050565b5f60208284031215612e91575f80fd5b81356001600160401b03811115612ea6575f80fd5b612a2b84828501612a98565b602080825282518282018190525f919060409081850190868401855b82811015612a79578151805185528681015187860152858101518686015260609081015115159085015260809093019290850190600101612ece565b5f805f60608486031215612f1c575f80fd5b83356001600160401b0380821115612f32575f80fd5b612f3e878388016126c8565b9450602086013593506040860135915080821115612f5a575f80fd5b506128f686828701612af9565b5f60208284031215612f77575f80fd5b5051919050565b634e487b7160e01b5f52603260045260245ffd5b600181811c90821680612fa657607f821691505b602082108103612fc457634e487b7160e01b5f52602260045260245ffd5b50919050565b601f8211156107fa575f81815260208120601f850160051c81016020861015612ff05750805b601f850160051c820191505b81811015610b8b57828155600101612ffc565b81516001600160401b03811115613028576130286125ac565b61303c816130368454612f92565b84612fca565b602080601f83116001811461306f575f84156130585750858301515b5f19600386901b1c1916600185901b178555610b8b565b5f85815260208120601f198616915b8281101561309d5788860151825594840194600190910190840161307e565b50858210156130ba57878501515f19600388901b60f8161c191681555b5050505050600190811b01905550565b60ff84168152606060208201525f6130e56060830185612991565b9050826040830152949350505050565b634e487b7160e01b5f52601160045260245ffd5b5f6001820161311a5761311a6130f5565b5060010190565b5f60208284031215613131575f80fd5b813561120381612543565b81358155602082013560018201556040820135600282015560038101606083013561316681612d51565b815490151560ff1660ff19919091161790555050565b5f82601f83011261318b575f80fd5b8151613199612659826126a2565b8181528460208386010111156131ad575f80fd5b612a2b82602083016020870161296f565b5f805f606084860312156131d0575f80fd5b83516131db816127ef565b60208501519093506001600160401b038111156131f6575f80fd5b6132028682870161317c565b925050604084015190509250925092565b5f8151808452602080850194508084015f5b8381101561324157815187529582019590820190600101613225565b509495945050505050565b5f8151808452602080850194508084015f5b838110156132415781516001600160a01b03168752958201959082019060010161325e565b60ff85168152608060208201525f61329e6080830186612991565b84604084015282810360608401528351608082526132bf6080830182613213565b905060208501516020830152604085015182820360408401526132e2828261324c565b915050606085015182820360608401526132fc8282612a33565b9998505050505050505050565b5f825161331a81846020870161296f565b9190910192915050565b60e081525f61333660e083018a61324c565b88602084015287604084015282810360608401526133548188613213565b905082810360808401526133688187612a33565b94151560a084015250506001600160a01b039190911660c09091015295945050505050565b81810381811115610646576106466130f5565b6001600160a01b03948516815260208101939093526040830191909152909116606082015260800190565b5f82601f8301126133da575f80fd5b815160206133ea61265983612618565b82815260059290921b84018101918181019086841115613408575f80fd5b8286015b8481101561269757805161341f81612543565b835291830191830161340c565b5f82601f83011261343b575f80fd5b8151602061344b61265983612618565b82815260059290921b84018101918181019086841115613469575f80fd5b8286015b848110156126975780516001600160401b0381111561348b575f8081fd5b6134998986838b010161317c565b84525091830191830161346d565b5f805f805f60a086880312156134bb575f80fd5b85516134c6816127ef565b809550506020808701516001600160401b03808211156134e4575f80fd5b6134f08a838b0161317c565b965060408901519550606089015194506080890151915080821115613513575f80fd5b908801906080828b031215613526575f80fd5b61352e6125c0565b82518281111561353c575f80fd5b8301601f81018c1361354c575f80fd5b805161355a61265982612618565b81815260059190911b8201860190868101908e831115613578575f80fd5b928701925b828410156135965783518252928701929087019061357d565b80855250505050838301518482015260408301519350818411156135b8575f80fd5b6135c48b8585016133cb565b604082015260608301519350818411156135dc575f80fd5b6135e88b85850161342c565b6060820152809450505050509295509295909350565b8082028115828204841417610646576106466130f5565b5f8261362f57634e487b7160e01b5f52601260045260245ffd5b500490565b5f8060408385031215613645575f80fd5b82516001600160401b0381111561365a575f80fd5b6136668582860161317c565b925050602083015190509250929050565b5f815461368381612f92565b8085526020600183811680156136a057600181146136ba576136e5565b60ff1985168884015283151560051b8801830195506136e5565b865f52825f205f5b858110156136dd5781548a82018601529083019084016136c2565b890184019650505b505050505092915050565b5f610120865183526020870151602084015260408701516040840152606087015160018060a01b0380821660608601528060808a0151166080860152505060a087015160a08401528060c084015261374a81840187612991565b905082810360e084015261375e8186613677565b90508281036101008401526137738185612991565b979650505050505050565b5f6020828403121561378e575f80fd5b81516001600160401b0381168114611203575f80fd5b606081528351606082015260018060a01b036020850151166080820152604084015160a08201525f606085015160a060c08401526137e6610100840182612991565b9050608086015160e08401526001600160401b0385166020840152828103604084015261248d8185612991565b80820180821115610646576106466130f5565b5f60208284031215613836575f80fd5b815161120381612d5156fe8b9e7a9f25b0aca3f51c01b8fee30790fb16f4d4deded8385ae6643d054bb078a26469706673582212204161c5cb893d0ed5e2e9249b5486d7b4a519fb06d12d0a658b80e5dcb23f9f9c64736f6c63430008140033
Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)
0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000f0773508c585246bd09bfb401aa18b72685b03f90000000000000000000000000000000000000000000000000000000000000000000000000000000000000000039e2fb66102314ce7b64ce5ce3e5183bc94ad38
-----Decoded View---------------
Arg [0] : _bridgeAddress (address): 0x0000000000000000000000000000000000000000
Arg [1] : _forwarderAddress (address): 0xF0773508C585246BD09BfB401Aa18B72685b03F9
Arg [2] : _dexSpan (address): 0x0000000000000000000000000000000000000000
Arg [3] : _wrappedNativeTokenAddress (address): 0x039e2fB66102314Ce7b64Ce5Ce3E5183bc94aD38
-----Encoded View---------------
4 Constructor Arguments found :
Arg [0] : 0000000000000000000000000000000000000000000000000000000000000000
Arg [1] : 000000000000000000000000f0773508c585246bd09bfb401aa18b72685b03f9
Arg [2] : 0000000000000000000000000000000000000000000000000000000000000000
Arg [3] : 000000000000000000000000039e2fb66102314ce7b64ce5ce3e5183bc94ad38
Deployed Bytecode Sourcemap
65445:19036:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;60798:204;;;;;;;;;;-1:-1:-1;60798:204:0;;;;;:::i;:::-;;:::i;:::-;;;470:14:1;;463:22;445:41;;433:2;418:18;60798:204:0;;;;;;;;65822:41;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;675:32:1;;;657:51;;645:2;630:18;65822:41:0;497:217:1;83685:479:0;;;;;;;;;;-1:-1:-1;83685:479:0;;;;;:::i;:::-;;:::i;:::-;;62078:122;;;;;;;;;;-1:-1:-1;62078:122:0;;;;;:::i;:::-;62143:7;62170:12;;;;;;;;;;:22;;;;62078:122;;;;1647:25:1;;;1635:2;1620:18;62078:122:0;1501:177:1;67465:510:0;;;;;;;;;;-1:-1:-1;67465:510:0;;;;;:::i;:::-;;:::i;76147:332::-;;;;;;:::i;:::-;;:::i;62510:138::-;;;;;;;;;;-1:-1:-1;62510:138:0;;;;;:::i;:::-;;:::i;69492:181::-;;;;;;;;;;-1:-1:-1;69492:181:0;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;67041:369::-;;;;;;;;;;-1:-1:-1;67041:369:0;;;;;:::i;:::-;;:::i;63647:251::-;;;;;;;;;;-1:-1:-1;63647:251:0;;;;;:::i;:::-;;:::i;70003:329::-;;;;;;;;;;-1:-1:-1;70003:329:0;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;66948:85::-;;;;;;;;;;;;;:::i;50631:86::-;;;;;;;;;;-1:-1:-1;50702:7:0;;;;;;;50631:86;;65942:23;;;;;;;;;;-1:-1:-1;65942:23:0;;;;-1:-1:-1;;;;;65942:23:0;;;76527:374;;;;;;:::i;:::-;;:::i;68956:448::-;;;;;;;;;;-1:-1:-1;68956:448:0;;;;;:::i;:::-;;:::i;66856:84::-;;;;;;;;;;;;;:::i;61094:138::-;;;;;;;;;;-1:-1:-1;61094:138:0;;;;;:::i;:::-;;:::i;60406:49::-;;;;;;;;;;-1:-1:-1;60406:49:0;60451:4;60406:49;;75357:376;;;;;;:::i;:::-;;:::i;79090:1726::-;;;;;;;;;;-1:-1:-1;79090:1726:0;;;;;:::i;:::-;;:::i;68026:889::-;;;;;;;;;;-1:-1:-1;68026:889:0;;;;;:::i;:::-;;:::i;69681:314::-;;;;;;;;;;-1:-1:-1;69681:314:0;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;62941:140::-;;;;;;;;;;-1:-1:-1;62941:140:0;;;;;:::i;:::-;;:::i;65585:92::-;;;;;;;;;;;;65635:42;65585:92;;65761:52;;;;;;;;;;;;65794:19;65761:52;;65684:70;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;65684:70:0;;66022:44;;;;;;;;;;-1:-1:-1;66022:44:0;;;;;:::i;:::-;;:::i;70490:373::-;;;;;;;;;;-1:-1:-1;70490:373:0;;;;;:::i;:::-;;:::i;65909:26::-;;;;;;;;;;-1:-1:-1;65909:26:0;;;;-1:-1:-1;;;;;65909:26:0;;;65870:32;;;;;;;;;;-1:-1:-1;65870:32:0;;;;;;;-1:-1:-1;;;;;65870:32:0;;;60798:204;60883:4;-1:-1:-1;;;;;;60907:47:0;;-1:-1:-1;;;60907:47:0;;:87;;-1:-1:-1;;;;;;;;;;52515:40:0;;;60958:36;60900:94;60798:204;-1:-1:-1;;60798:204:0:o;83685:479::-;60451:4;60690:16;60451:4;60690:10;:16::i;:::-;35544:19:::1;:17;:19::i;:::-;35574:17;37272:11:::0;:19;;-1:-1:-1;;37272:19:0;;;37160:139;35574:17:::1;-1:-1:-1::0;;;;;;;83851:23:0;::::2;::::0;83847:310:::2;;83895:6;83905:1;83895:11:::0;83891:47:::2;;83917:21;83908:30;;83891:47;83953:37;83972:9;83983:6;83953:18;:37::i;:::-;83847:310;;;84027:6;84037:1;84027:11:::0;84023:64:::2;;84049:38;::::0;-1:-1:-1;;;84049:38:0;;84081:4:::2;84049:38;::::0;::::2;657:51:1::0;-1:-1:-1;;;;;84049:23:0;::::2;::::0;::::2;::::0;630:18:1;;84049:38:0::2;;;;;;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;84040:47;;84023:64;84102:43;84120:5;84127:9;84138:6;84102:17;:43::i;:::-;35614:20:::1;37505:4:::0;37491:18;;-1:-1:-1;;37491:18:0;;;;;37307:210;35614:20:::1;83685:479:::0;;;;:::o;67465:510::-;-1:-1:-1;;;;;;;;;;;60690:16:0;60701:4;60690:10;:16::i;:::-;67640:15;;:20;;::::1;::::0;:85:::1;;;67700:18;:25;67681:8;:15;:44;67640:85;67620:145;;67745:20;;-1:-1:-1::0;;;67745:20:0::1;;;;;;;;;;;67620:145;67783:11;67778:190;67806:8;:15;67800:3;:21;67778:190;;;67869:18;67888:3;67869:23;;;;;;;;:::i;:::-;;;;;;;67840:11;:26;67852:8;67861:3;67852:13;;;;;;;;:::i;:::-;;;;;;;67840:26;;;;;;;;;;;:52;;;;;;:::i;:::-;-1:-1:-1::0;67936:5:0::1;;67778:190;;76147:332:::0;50236:19;:17;:19::i;:::-;76418:53:::1;76437:11;76450:9;76461;76418:18;:53::i;:::-;76147:332:::0;;;:::o;62510:138::-;62143:7;62170:12;;;;;;;;;;:22;;;60690:16;60701:4;60690:10;:16::i;:::-;62615:25:::1;62626:4;62632:7;62615:10;:25::i;69492:181::-:0;69599:12;69648:1;69652:9;69663:1;69631:34;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;69624:41;;69492:181;;;;:::o;67041:369::-;-1:-1:-1;;;;;;;;;;;60690:16:0;60701:4;60690:10;:16::i;:::-;67168:10:::1;:15;;67182:1;67168:15:::0;67164:60:::1;;67185:9;:39:::0;;-1:-1:-1;;;;;;67185:39:0::1;::::0;-1:-1:-1;;;;;67185:39:0;::::1;;;::::0;;67164:60:::1;67239:10;:15;;67253:1;67239:15:::0;67235:54:::1;;67256:6;:33:::0;;-1:-1:-1;;;;;;67256:33:0::1;-1:-1:-1::0;;;;;67256:33:0;::::1;;::::0;;67235:54:::1;67304:10;:15;;67318:1;67304:15:::0;67300:51:::1;;67321:7;:30:::0;;-1:-1:-1;;;;;;67321:30:0::1;-1:-1:-1::0;;;;;67321:30:0;::::1;;::::0;;67300:51:::1;67379:1;67366:10;:14;;;67362:40;;;67389:13;;-1:-1:-1::0;;;67389:13:0::1;;;;;;;;;;;63647:251:::0;-1:-1:-1;;;;;63741:34:0;;17400:10;63741:34;63737:104;;63799:30;;-1:-1:-1;;;63799:30:0;;;;;;;;;;;63737:104;63853:37;63865:4;63871:18;63853:11;:37::i;70003:329::-;70099:14;70126:21;70162:10;:17;-1:-1:-1;;;;;70150:30:0;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;70126:54;;70196:11;70191:109;70219:10;:17;70213:3;:23;70191:109;;;70272:11;:28;70284:10;70295:3;70284:15;;;;;;;;:::i;:::-;;;;;;;70272:28;;;;;;;;;;;70258:42;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:6;70265:3;70258:11;;;;;;;;:::i;:::-;;;;;;:42;;;;70238:5;;;;;:::i;:::-;;;;70191:109;;;-1:-1:-1;70318:6:0;70003:329;-1:-1:-1;;70003:329:0:o;66948:85::-;65794:19;60690:16;60701:4;60690:10;:16::i;:::-;50495::::1;:14;:16::i;:::-;67015:10:::2;:8;:10::i;:::-;66948:85:::0;:::o;76527:374::-;50236:19;:17;:19::i;:::-;76827:66:::1;76843:11;76856:9;76867;76878:14;76827:15;:66::i;68956:448::-:0;-1:-1:-1;;;;;;;;;;;60690:16:0;60701:4;60690:10;:16::i;:::-;69122:17;;;::::1;::::0;:55:::1;;-1:-1:-1::0;69143:34:0;;::::1;69122:55;69116:104;;69200:20;;-1:-1:-1::0;;;69200:20:0::1;;;;;;;;;;;69116:104;69238:9;69233:164;69253:16:::0;;::::1;69233:164;;;69309:11;;69321:1;69309:14;;;;;;;:::i;:::-;;;;;;69288:8;:18;69297:5;;69303:1;69297:8;;;;;;;:::i;:::-;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1::0;;;;;69288:18:0::1;::::0;;::::1;::::0;::::1;::::0;;;;;;-1:-1:-1;69288:18:0;:35:::1;::::0;:18;:35:::1;:::i;:::-;-1:-1:-1::0;;69367:3:0::1;;69233:164;;;;68956:448:::0;;;;;:::o;66856:84::-;65794:19;60690:16;60701:4;60690:10;:16::i;:::-;50236:19:::1;:17;:19::i;:::-;66924:8:::2;:6;:8::i;61094:138::-:0;61171:4;61195:12;;;;;;;;;;;-1:-1:-1;;;;;61195:29:0;;;;;;;;;;;;;;;61094:138::o;75357:376::-;35544:19;:17;:19::i;:::-;35574:17;37272:11;:19;;-1:-1:-1;;37272:19:0;;;37160:139;35574:17;50236:19:::1;:17;:19::i;:::-;75564:9:::2;::::0;:161:::2;::::0;-1:-1:-1;;;75564:161:0;;-1:-1:-1;;;;;24329:32:1;;;75564:161:0::2;::::0;::::2;24311:51:1::0;24378:18;;;24371:34;;;24421:18;;;24414:34;;;24491:14;;24484:22;24464:18;;;24457:50;75564:9:0;;;::::2;::::0;;::::2;::::0;:28:::2;::::0;75600:9:::2;::::0;24283:19:1;;75564:161:0::2;;;;;;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;::::0;::::2;;;;;;;;;;35614:20:::0;37505:4;37491:18;;-1:-1:-1;;37491:18:0;;;;;37307:210;79090:1726;35544:19;:17;:19::i;:::-;35574:17;37272:11;:19;;-1:-1:-1;;37272:19:0;;;37160:139;35574:17;50236:19:::1;:17;:19::i;:::-;79352:9:::2;::::0;;;::::2;-1:-1:-1::0;;;;;79352:9:0::2;79330:10;:32;::::0;::::2;::::0;:65:::2;;-1:-1:-1::0;79388:6:0::2;::::0;-1:-1:-1;;;;;79388:6:0::2;79366:10;:29;;79330:65;79326:117;;;79417:26;;-1:-1:-1::0;;;79417:26:0::2;;;;;;;;;;;79326:117;79457:13;79472:23:::0;79497::::2;79549:7;79524:58;;;;;;;;;;;;:::i;:::-;79456:126;;;;;;79593:17;79613:21;79623:10;79613:9;:21::i;:::-;79593:41:::0;-1:-1:-1;79768:12:0::2;::::0;::::2;::::0;;::::2;::::0;:28:::2;;;79784:7;:12;;79795:1;79784:12;;79768:28;79767:60;;;-1:-1:-1::0;;;;;;79802:19:0;::::2;;::::0;;;:8:::2;:19;::::0;;;;:25:::2;;::::0;::::2;;79801:26;79767:60;79763:124;;;79849:38;79858:9;79869:6;79877:9;79849:8;:38::i;:::-;79842:45;;;;;;79763:124;79937:12;::::0;::::2;::::0;:43;::::2;;;-1:-1:-1::0;;;;;;79953:27:0;::::2;65635:42;79953:27;79937:43;79933:207;;;80103:37;80122:9;80133:6;80103:18;:37::i;79933:207::-;80187:7;:12;;80198:1;80187:12:::0;80183:256:::2;;80238:201;80282:7;80312:9;80344:6;80373:9;80405:15;80238:21;:201::i;80183:256::-;80453:15;80470::::0;80489:102:::2;80520:9;80544:6;80565:15;80489:16;:102::i;:::-;80452:139;;;;80682:7;80658:21;:31;80654:95;;;80711:38;80720:9;80731:6;80739:9;80711:8;:38::i;:::-;80704:45;;;;;;;;80654:95;80760:48;80769:9;80780:7;80789;80798:9;80760:8;:48::i;:::-;79240:1576;;;;;;50266:1;35614:20:::0;37505:4;37491:18;;-1:-1:-1;;37491:18:0;;;;;37307:210;68026:889;-1:-1:-1;;;;;;;;;;;60690:16:0;60701:4;60690:10;:16::i;:::-;68269:18;;;::::1;::::0;:84:::1;;-1:-1:-1::0;68308:45:0;;::::1;68269:84;:139;;;;-1:-1:-1::0;68374:34:0;;::::1;68269:139;68249:199;;68428:20;;-1:-1:-1::0;;;68428:20:0::1;;;;;;;;;;;68249:199;68466:9;68461:447;68481:17:::0;;::::1;68461:447;;;68522:8;:19;68531:6;;68538:1;68531:9;;;;;;;:::i;:::-;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1::0;;;;;68522:19:0::1;::::0;;::::1;::::0;::::1;::::0;;;;;;-1:-1:-1;68522:19:0;:25:::1;;::::0;::::1;;68517:60;;68556:21;;-1:-1:-1::0;;;68556:21:0::1;;;;;;;;;;;68517:60;68596:21;;68618:1;68596:24;;;;;;;:::i;:::-;;;;;;;68624:1;68596:29;68592:141;;68709:21;;68731:1;68709:24;;;;;;;:::i;:::-;;;;;;;68644:8;:19;68653:6;;68660:1;68653:9;;;;;;;:::i;:::-;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1::0;;;;;68644:19:0::1;::::0;;::::1;::::0;::::1;::::0;;;;;;-1:-1:-1;68644:19:0;:62:::1;;:89:::0;68592:141:::1;68752:10;;68763:1;68752:13;;;;;;;:::i;:::-;;;;;;;68769:1;68752:18;68748:86;;68821:10;;68832:1;68821:13;;;;;;;:::i;:::-;;;;;;;68789:8;:19;68798:6;;68805:1;68798:9;;;;;;;:::i;:::-;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1::0;;;;;68789:19:0::1;::::0;;::::1;::::0;::::1;::::0;;;;;;-1:-1:-1;68789:19:0;:29:::1;;:45:::0;68748:86:::1;68878:3;;68461:447;;;;68026:889:::0;;;;;;;:::o;69681:314::-;69768:21;69802:24;69848:6;:13;-1:-1:-1;;;;;69829:33:0;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;69829:33:0;;;;;;;;;;;;;;;;;69802:60;;69878:11;69873:94;69901:6;:13;69895:3;:19;69873:94;;;69946:8;:21;69955:6;69962:3;69955:11;;;;;;;;:::i;:::-;;;;;;;;;;;;-1:-1:-1;;;;;69946:21:0;;;;;;;;;;;;;;-1:-1:-1;69946:21:0;69936:31;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:7;;:2;;69939:3;;69936:7;;;;;;:::i;:::-;;;;;;:31;;;;69916:5;;;;;:::i;:::-;;;;69873:94;;62941:140;62143:7;62170:12;;;;;;;;;;:22;;;60690:16;60701:4;60690:10;:16::i;:::-;63047:26:::1;63059:4;63065:7;63047:11;:26::i;66022:44::-:0;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;70490:373::-;70649:12;70729:1;70750:9;70806:1;70826:14;70694:161;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;70674:181;;70490:373;;;;;;:::o;61447:105::-;61514:30;61525:4;17400:10;61514;:30::i;36963:189::-;37097:11;;;;37089:55;;;;-1:-1:-1;;;37089:55:0;;27684:2:1;37089:55:0;;;27666:21:1;27723:2;27703:18;;;27696:30;27762:33;27742:18;;;27735:61;27813:18;;37089:55:0;;;;;;;;;36963:189::o;77387:282::-;-1:-1:-1;;;;;77470:16:0;;77462:67;;;;-1:-1:-1;;;77462:67:0;;28044:2:1;77462:67:0;;;28026:21:1;28083:2;28063:18;;;28056:30;28122:34;28102:18;;;28095:62;-1:-1:-1;;;28173:18:1;;;28166:36;28219:19;;77462:67:0;27842:402:1;77462:67:0;77581:12;;;77541;77581;;;;;;;;;-1:-1:-1;;;;;77559:7:0;;;77574:5;;77559:35;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;77540:54;;;77613:7;77605:56;;;;-1:-1:-1;;;77605:56:0;;28743:2:1;77605:56:0;;;28725:21:1;28782:2;28762:18;;;28755:30;28821:34;28801:18;;;28794:62;-1:-1:-1;;;28872:18:1;;;28865:34;28916:19;;77605:56:0;28541:400:1;77677:648:0;77800:37;-1:-1:-1;;;;;77800:26:0;;77827:2;77831:5;77800:26;:37::i;50790:132::-;50702:7;;;;;;;50852:63;;;50888:15;;-1:-1:-1;;;50888:15:0;;;;;;;;;;;71519:623;71773:20;;;;-1:-1:-1;;;;;71764:30:0;;;;;:8;:30;;;;;:36;;;;;71759:71;;71809:21;;-1:-1:-1;;;71809:21:0;;;;;;;;;;;71759:71;71841:16;71860:101;71889:11;:20;;;71924:11;:26;;;71860:14;:101::i;:::-;71841:120;;71972:162;72000:8;72023:11;:26;;;72064:11;72090:9;72114;71972:13;:162::i;64524:324::-;64601:4;64623:22;64631:4;64637:7;64623;:22::i;:::-;64618:223;;64662:6;:12;;;;;;;;;;;-1:-1:-1;;;;;64662:29:0;;;;;;;;;:36;;-1:-1:-1;;64662:36:0;64694:4;64662:36;;;64745:12;17400:10;;17320:98;64745:12;-1:-1:-1;;;;;64718:40:0;64736:7;-1:-1:-1;;;;;64718:40:0;64730:4;64718:40;;;;;;;;;;-1:-1:-1;64780:4:0;64773:11;;64618:223;-1:-1:-1;64824:5:0;64817:12;;65092:325;65170:4;65191:22;65199:4;65205:7;65191;:22::i;:::-;65187:223;;;65262:5;65230:12;;;;;;;;;;;-1:-1:-1;;;;;65230:29:0;;;;;;;;;;:37;;-1:-1:-1;;65230:37:0;;;65287:40;17400:10;;65230:12;;65287:40;;65262:5;65287:40;-1:-1:-1;65349:4:0;65342:11;;50999:130;50702:7;;;;;;;51058:64;;51095:15;;-1:-1:-1;;;51095:15:0;;;;;;;;;;;51532:120;50495:16;:14;:16::i;:::-;51591:7:::1;:15:::0;;-1:-1:-1;;51591:15:0::1;::::0;;51622:22:::1;17400:10:::0;51631:12:::1;51622:22;::::0;-1:-1:-1;;;;;675:32:1;;;657:51;;645:2;630:18;51622:22:0::1;;;;;;;51532:120::o:0;72150:1316::-;72407:16;72426:101;72455:11;:20;;;72490:11;:26;;;72426:14;:101::i;:::-;72407:120;;72565:8;72538:14;:21;;;72560:1;72538:24;;;;;;;;:::i;:::-;-1:-1:-1;;;;;72538:35:0;;;:24;;;;;;;;;;:35;;;;72704:7;;72727:26;;;;72643:121;;:38;;;;72704:7;;72643:38;:121::i;:::-;72798:7;;72878:21;;;;;72914:26;;;;;72955;;;;72996:20;;73031:21;;;;72798:313;;-1:-1:-1;;;72798:313:0;;72775:20;;-1:-1:-1;;;;;72798:7:0;;:30;;:313;;72878:21;;72914:26;;72955;;72996:20;;73031:21;72775:20;;73095:4;;72798:313;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;73144:21;;;;73180:28;;72775:336;;-1:-1:-1;73122:19:0;;73180:32;;73211:1;;73180:32;:::i;:::-;73144:79;;;;;;;;:::i;:::-;;;;;;;;;;;;-1:-1:-1;;;;;73239:21:0;;;;;;:8;:21;;;;;;;:27;;;73144:79;;-1:-1:-1;73239:27:0;;73234:62;;73275:21;;-1:-1:-1;;;73275:21:0;;;;;;;;;;;73234:62;73307:151;73335:11;73361:12;73388:11;73414:9;73438;73307:13;:151::i;:::-;72396:1070;;;72150:1316;;;;:::o;51273:118::-;50236:19;:17;:19::i;:::-;51343:4:::1;51333:14:::0;;-1:-1:-1;;51333:14:0::1;;;::::0;;51363:20:::1;51370:12;17400:10:::0;;17320:98;84172:269;84249:24;84294:4;:11;84309:2;84294:17;84286:62;;;;-1:-1:-1;;;84286:62:0;;30296:2:1;84286:62:0;;;30278:21:1;;;30315:18;;;30308:30;30374:34;30354:18;;;30347:62;30426:18;;84286:62:0;30094:356:1;84286:62:0;-1:-1:-1;84419:2:0;84409:13;84403:20;;84172:269::o;78333:391::-;-1:-1:-1;;;;;78516:27:0;;65635:42;78516:27;78512:146;;78558:47;78576:9;78587;78598:6;78558:17;:47::i;:::-;78512:146;;;78621:37;78640:9;78651:6;78621:18;:37::i;:::-;78674:42;78684:9;78695:6;78703:1;78706:9;78674:42;;;;;;;;;:::i;:::-;;;;;;;;78333:391;;;:::o;80824:2174::-;81108:18;81128:33;81190:7;81165:80;;;;;;;;;;;;:::i;:::-;81101:144;;;;;;;81273:6;81260:10;:19;81256:394;;;81297:16;81315;81335:116;81370:9;81398:6;81423:13;81335:16;:116::i;:::-;81296:155;;;;81494:8;81470:21;:32;81466:100;;;81528:38;81537:9;81548:6;81556:9;81528:8;:38::i;:::-;81521:45;;;;;;81466:100;81588:50;81597:9;81608:8;81618;81628:9;81588:8;:50::i;81256:394::-;81661:15;;81697:106;81728:9;81752:6;81773:19;81782:10;81752:6;81773:19;:::i;:::-;81697:16;:106::i;:::-;81660:143;;;;81842:7;81818:21;:31;81814:95;;;81871:38;81880:9;81891:6;81899:9;81871:8;:38::i;81814:95::-;-1:-1:-1;;;;;;;81926:27:0;;;81922:172;;81970:18;-1:-1:-1;;;;;81970:26:0;;82004:6;81970:43;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;82063:18;82028:14;:21;;;82050:1;82028:24;;;;;;;;:::i;:::-;;;;;;:54;-1:-1:-1;;;;;82028:54:0;;;-1:-1:-1;;;;;82028:54:0;;;;;81922:172;82181:7;;82111:21;;;;:24;;82104:121;;-1:-1:-1;;;;;82181:7:0;;82204:10;;82181:7;;82111:24;;;;:::i;:::-;;;;;;;-1:-1:-1;;;;;82104:54:0;;;:121;;;;;:::i;:::-;82264:7;;82237:13;;-1:-1:-1;;;;;82264:7:0;82283:9;82464:40;;;82523:14;:21;;;82563:10;82592:14;:26;;;82637:14;:20;;;82676:14;:21;;;82716:5;82740:9;82423:341;;;;;;;;;;;;;;:::i;:::-;;;;-1:-1:-1;;82423:341:0;;;;;;;;;;;;;;-1:-1:-1;;;;;82423:341:0;-1:-1:-1;;;;;;82423:341:0;;;;;;;;;;82256:519;;;;82423:341;82256:519;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;82236:539;;;82791:8;82786:70;;82808:48;82817:9;82828:7;82837;82846:9;82808:8;:48::i;:::-;82801:55;;;;;;;82786:70;82873:12;;82869:56;;82887:38;82906:9;82917:7;82887:18;:38::i;:::-;82941:49;82951:9;82962:7;82971;82980:9;82941:49;;;;;;;;;:::i;:::-;;;;;;;;81015:1983;;;;;80824:2174;;;;;;:::o;83006:671::-;-1:-1:-1;;;;;83261:15:0;;83140;83261;;;:8;:15;;;;;:25;;;83140:15;;83295:2;;83261:30;;83289:2;83261:30;:::i;:::-;83260:37;;;;:::i;:::-;83244:13;:53;83240:113;;;-1:-1:-1;;;;;83328:15:0;;;;;;:8;:15;;;;;:25;;;;-1:-1:-1;83240:113:0;83376:13;83370:3;:19;83366:91;;;83402:19;83408:13;83402:3;:19;:::i;:::-;83391:31;;83366:91;;;83454:3;83438:19;;83366:91;-1:-1:-1;83480:13:0;-1:-1:-1;;;;;83508:23:0;;65635:42;83508:23;83504:153;;-1:-1:-1;;;;;83590:15:0;;;;;;:8;:15;;;;;:36;;;83647:10;;83574:52;;:13;:52;:::i;:::-;83573:84;;;;:::i;:::-;83546:111;;83504:153;83006:671;;;;;;:::o;78732:350::-;78886:12;;78882:63;;78900:45;78918:6;78926:9;78937:7;78900:17;:45::i;:::-;78960:12;;78956:56;;78974:38;78993:9;79004:7;78974:18;:38::i;:::-;79028:46;79038:6;79046:7;79055;79064:9;79028:46;;;;;;;;;:::i;:::-;;;;;;;;78732:350;;;;:::o;61688:201::-;61777:22;61785:4;61791:7;61777;:22::i;:::-;61772:110;;61823:47;;-1:-1:-1;;;61823:47:0;;-1:-1:-1;;;;;35633:32:1;;61823:47:0;;;35615:51:1;35682:18;;;35675:34;;;35588:18;;61823:47:0;35441:274:1;61772:110:0;61688:201;;:::o;53766:162::-;53876:43;;-1:-1:-1;;;;;35633:32:1;;;53876:43:0;;;35615:51:1;35682:18;;;35675:34;;;53849:71:0;;53869:5;;53891:14;;;;;35588:18:1;;53876:43:0;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;53876:43:0;;;;;;;;;;;53849:19;:71::i;70871:611::-;70975:7;-1:-1:-1;;;;;70999:26:0;;65635:42;70999:26;70995:454;;71059:9;71046;:22;71042:52;;71077:17;;-1:-1:-1;;;71077:17:0;;;;;;;;;;;71042:52;71109:18;-1:-1:-1;;;;;71109:26:0;;71143:9;71109:46;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;71189:18;71170:38;;70995:454;;;71245:9;:14;71241:44;;71268:17;;-1:-1:-1;;;71268:17:0;;;;;;;;;;;71241:44;71300:137;-1:-1:-1;;;;;71300:33:0;;71352:10;71389:4;71413:9;71300:33;:137::i;:::-;-1:-1:-1;71466:8:0;;70871:611;-1:-1:-1;70871:611:0:o;73474:1875::-;73696:28;;73684:41;;;;:11;:41;;;;;:48;;;;;:::i;:::-;;;73736:1;73684:53;73680:96;;73759:17;;-1:-1:-1;;;73759:17:0;;;;;;;;;;;73680:96;73820:11;:16;;;:21;;73840:1;73820:21;73816:806;;73859:21;73882:17;73932:9;73903:88;;;;;;;;;;;;:::i;:::-;74050:9;;73858:133;;-1:-1:-1;73858:133:0;-1:-1:-1;74006:63:0;;-1:-1:-1;;;;;74006:35:0;;;;74050:9;;;;74062:6;74006:35;:63::i;:::-;74084:9;;74128:289;;;;;;;;74178:21;;;;74128:289;;;;;;;;74084:9;;;;-1:-1:-1;;;;;74084:9:0;;:25;;74128:289;;74251:18;74260:9;74128:289;74251:18;:::i;:::-;74128:289;;;;74292:5;-1:-1:-1;;;;;74128:289:0;;;;;74320:11;:27;;;-1:-1:-1;;;;;74128:289:0;;;;;74370:11;:28;;;74128:289;;;74436:8;74463:11;:41;74475:11;:28;;;74463:41;;;;;;;;;;;74523:6;74084:460;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;74564:25:0;;;-1:-1:-1;;;;;38522:32:1;;38504:51;;38586:2;38571:18;;38564:34;;;-1:-1:-1;38614:18:1;;;38607:45;74564:25:0;;;;-1:-1:-1;74564:25:0;;;;38492:2:1;74564:25:0;;-1:-1:-1;74564:25:0;74604:7;;;;73816:806;74662:11;:16;;;:21;;74682:1;74662:21;74658:651;;74700:19;74733:9;74722:31;;;;;;;;;;;;:::i;:::-;74812:6;;74700:53;;-1:-1:-1;74768:60:0;;-1:-1:-1;;;;;74768:35:0;;;;74812:6;74821;74768:35;:60::i;:::-;74843:6;;74897:263;;;;;;;;74948:28;;74897:263;;-1:-1:-1;;;;;74897:263:0;;;;;;;;;;;;;;;;;75068:28;;74843:6;75056:41;;;:11;:41;;;;;;;74897:263;;74843:6;;;;;:35;;74897:263;;;;75056:41;74897:263;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;75120:11;:21;;;74897:263;;;75179:12;75210:6;74843:388;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;75251:25:0;;;-1:-1:-1;;;;;38522:32:1;;38504:51;;38586:2;38571:18;;38564:34;;;75274:1:0;38614:18:1;;;38607:45;75251:25:0;;;;-1:-1:-1;75251:25:0;;;;38492:2:1;75251:25:0;;-1:-1:-1;75251:25:0;75291:7;;;74658:651;75328:13;;-1:-1:-1;;;75328:13:0;;;;;;;;;;;54560:228;54680:39;;-1:-1:-1;;;54680:39:0;;54704:4;54680:39;;;40425:34:1;-1:-1:-1;;;;;40495:15:1;;;40475:18;;;40468:43;54657:20:0;;54680:15;;;;;;40360:18:1;;54680:39:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;54657:62;-1:-1:-1;54730:50:0;54743:5;54750:7;54759:20;54774:5;54657:62;54759:20;:::i;:::-;54730:12;:50::i;56577:638::-;57001:23;57027:33;-1:-1:-1;;;;;57027:27:0;;57055:4;57027:27;:33::i;:::-;57001:59;;57075:10;:17;57096:1;57075:22;;:57;;;;;57113:10;57102:30;;;;;;;;;;;;:::i;:::-;57101:31;57075:57;57071:137;;;57156:40;;-1:-1:-1;;;57156:40:0;;-1:-1:-1;;;;;675:32:1;;57156:40:0;;;657:51:1;630:18;;57156:40:0;497:217:1;54173:190:0;54301:53;;-1:-1:-1;;;;;41160:15:1;;;54301:53:0;;;41142:34:1;41212:15;;;41192:18;;;41185:43;41244:18;;;41237:34;;;54274:81:0;;54294:5;;54316:18;;;;;41077::1;;54301:53:0;40902:375:1;55799:387:0;55915:47;;;-1:-1:-1;;;;;35633:32:1;;55915:47:0;;;35615:51:1;35682:18;;;;35675:34;;;55915:47:0;;;;;;;;;;35588:18:1;;;;55915:47:0;;;;;;;;-1:-1:-1;;;;;55915:47:0;-1:-1:-1;;;55915:47:0;;;55980:44;55930:13;55915:47;55980:23;:44::i;:::-;55975:204;;56068:43;;-1:-1:-1;;;;;35633:32:1;;;56068:43:0;;;35615:51:1;56108:1:0;35682:18:1;;;35675:34;56041:71:0;;56061:5;;56083:13;;;;;35588:18:1;;56068:43:0;35441:274:1;56041:71:0;56127:40;56147:5;56154:12;56127:19;:40::i;12999:153::-;13074:12;13106:38;13128:6;13136:4;13142:1;13106:21;:38::i;57726:585::-;57809:4;58116:12;58130:23;58165:5;-1:-1:-1;;;;;58157:19:0;58177:4;58157:25;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;58115:67;;;;58200:7;:69;;;;-1:-1:-1;58212:17:0;;:22;;:56;;;58249:10;58238:30;;;;;;;;;;;;:::i;:::-;58200:103;;;;;58302:1;58281:5;-1:-1:-1;;;;;58273:26:0;;:30;58200:103;58193:110;57726:585;-1:-1:-1;;;;;57726:585:0:o;13487:398::-;13586:12;13639:5;13615:21;:29;13611:110;;;13668:41;;-1:-1:-1;;;13668:41:0;;13703:4;13668:41;;;657:51:1;630:18;;13668:41:0;497:217:1;13611:110:0;13732:12;13746:23;13773:6;-1:-1:-1;;;;;13773:11:0;13792:5;13799:4;13773:31;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;13731:73;;;;13822:55;13849:6;13857:7;13866:10;13822:26;:55::i;:::-;13815:62;13487:398;-1:-1:-1;;;;;;13487:398:0:o;14963:597::-;15111:12;15141:7;15136:417;;15165:19;15173:10;15165:7;:19::i;:::-;15136:417;;;15393:17;;:22;:49;;;;-1:-1:-1;;;;;;15419:18:0;;;:23;15393:49;15389:121;;;15470:24;;-1:-1:-1;;;15470:24:0;;-1:-1:-1;;;;;675:32:1;;15470:24:0;;;657:51:1;630:18;;15470:24:0;497:217:1;15389:121:0;-1:-1:-1;15531:10:0;15524:17;;16113:528;16246:17;;:21;16242:392;;16478:10;16472:17;16535:15;16522:10;16518:2;16514:19;16507:44;16242:392;16605:17;;-1:-1:-1;;;16605:17:0;;;;;;;;;;;14:286:1;72:6;125:2;113:9;104:7;100:23;96:32;93:52;;;141:1;138;131:12;93:52;167:23;;-1:-1:-1;;;;;;219:32:1;;209:43;;199:71;;266:1;263;256:12;719:131;-1:-1:-1;;;;;794:31:1;;784:42;;774:70;;840:1;837;830:12;855:456;932:6;940;948;1001:2;989:9;980:7;976:23;972:32;969:52;;;1017:1;1014;1007:12;969:52;1056:9;1043:23;1075:31;1100:5;1075:31;:::i;:::-;1125:5;-1:-1:-1;1182:2:1;1167:18;;1154:32;1195:33;1154:32;1195:33;:::i;:::-;855:456;;1247:7;;-1:-1:-1;;;1301:2:1;1286:18;;;;1273:32;;855:456::o;1316:180::-;1375:6;1428:2;1416:9;1407:7;1403:23;1399:32;1396:52;;;1444:1;1441;1434:12;1396:52;-1:-1:-1;1467:23:1;;1316:180;-1:-1:-1;1316:180:1:o;1683:127::-;1744:10;1739:3;1735:20;1732:1;1725:31;1775:4;1772:1;1765:15;1799:4;1796:1;1789:15;1815:253;1887:2;1881:9;1929:4;1917:17;;-1:-1:-1;;;;;1949:34:1;;1985:22;;;1946:62;1943:88;;;2011:18;;:::i;:::-;2047:2;2040:22;1815:253;:::o;2073:275::-;2144:2;2138:9;2209:2;2190:13;;-1:-1:-1;;2186:27:1;2174:40;;-1:-1:-1;;;;;2229:34:1;;2265:22;;;2226:62;2223:88;;;2291:18;;:::i;:::-;2327:2;2320:22;2073:275;;-1:-1:-1;2073:275:1:o;2353:183::-;2413:4;-1:-1:-1;;;;;2438:6:1;2435:30;2432:56;;;2468:18;;:::i;:::-;-1:-1:-1;2513:1:1;2509:14;2525:4;2505:25;;2353:183::o;2541:662::-;2595:5;2648:3;2641:4;2633:6;2629:17;2625:27;2615:55;;2666:1;2663;2656:12;2615:55;2702:6;2689:20;2728:4;2752:60;2768:43;2808:2;2768:43;:::i;:::-;2752:60;:::i;:::-;2846:15;;;2932:1;2928:10;;;;2916:23;;2912:32;;;2877:12;;;;2956:15;;;2953:35;;;2984:1;2981;2974:12;2953:35;3020:2;3012:6;3008:15;3032:142;3048:6;3043:3;3040:15;3032:142;;;3114:17;;3102:30;;3152:12;;;;3065;;3032:142;;;-1:-1:-1;3192:5:1;2541:662;-1:-1:-1;;;;;;2541:662:1:o;3208:186::-;3256:4;-1:-1:-1;;;;;3281:6:1;3278:30;3275:56;;;3311:18;;:::i;:::-;-1:-1:-1;3377:2:1;3356:15;-1:-1:-1;;3352:29:1;3383:4;3348:40;;3208:186::o;3399:462::-;3441:5;3494:3;3487:4;3479:6;3475:17;3471:27;3461:55;;3512:1;3509;3502:12;3461:55;3548:6;3535:20;3579:48;3595:31;3623:2;3595:31;:::i;3579:48::-;3652:2;3643:7;3636:19;3698:3;3691:4;3686:2;3678:6;3674:15;3670:26;3667:35;3664:55;;;3715:1;3712;3705:12;3664:55;3780:2;3773:4;3765:6;3761:17;3754:4;3745:7;3741:18;3728:55;3828:1;3803:16;;;3821:4;3799:27;3792:38;;;;3807:7;3399:462;-1:-1:-1;;;3399:462:1:o;3866:886::-;3918:5;3971:3;3964:4;3956:6;3952:17;3948:27;3938:55;;3989:1;3986;3979:12;3938:55;4025:6;4012:20;4051:4;4075:60;4091:43;4131:2;4091:43;:::i;4075:60::-;4169:15;;;4255:1;4251:10;;;;4239:23;;4235:32;;;4200:12;;;;4279:15;;;4276:35;;;4307:1;4304;4297:12;4276:35;4343:2;4335:6;4331:15;4355:368;4371:6;4366:3;4363:15;4355:368;;;4457:3;4444:17;-1:-1:-1;;;;;4480:11:1;4477:35;4474:125;;;4553:1;4582:2;4578;4571:14;4474:125;4624:56;4676:3;4671:2;4657:11;4649:6;4645:24;4641:33;4624:56;:::i;:::-;4612:69;;-1:-1:-1;4701:12:1;;;;4388;;4355:368;;4757:602;4884:6;4892;4945:2;4933:9;4924:7;4920:23;4916:32;4913:52;;;4961:1;4958;4951:12;4913:52;5001:9;4988:23;-1:-1:-1;;;;;5071:2:1;5063:6;5060:14;5057:34;;;5087:1;5084;5077:12;5057:34;5110:61;5163:7;5154:6;5143:9;5139:22;5110:61;:::i;:::-;5100:71;;5224:2;5213:9;5209:18;5196:32;5180:48;;5253:2;5243:8;5240:16;5237:36;;;5269:1;5266;5259:12;5237:36;;5292:61;5345:7;5334:8;5323:9;5319:24;5292:61;:::i;:::-;5282:71;;;4757:602;;;;;:::o;5364:114::-;5448:4;5441:5;5437:16;5430:5;5427:27;5417:55;;5468:1;5465;5458:12;5483:964;5544:5;5592:4;5580:9;5575:3;5571:19;5567:30;5564:50;;;5610:1;5607;5600:12;5564:50;5643:2;5637:9;5685:4;5677:6;5673:17;5756:6;5744:10;5741:22;-1:-1:-1;;;;;5708:10:1;5705:34;5702:62;5699:88;;;5767:18;;:::i;:::-;5807:10;5803:2;5796:22;;5836:6;5827:15;;5879:9;5866:23;5858:6;5851:39;5951:2;5940:9;5936:18;5923:32;5918:2;5910:6;5906:15;5899:57;6017:2;6006:9;6002:18;5989:32;5984:2;5976:6;5972:15;5965:57;6074:2;6063:9;6059:18;6046:32;6087:33;6112:7;6087:33;:::i;:::-;6148:2;6136:15;;6129:32;6213:3;6198:19;;6185:33;6227;6185;6227;:::i;:::-;6288:3;6276:16;;6269:33;6354:3;6339:19;;6326:33;6368:31;6326:33;6368:31;:::i;:::-;6427:3;6415:16;;;;6408:33;5483:964;;-1:-1:-1;;5483:964:1:o;6452:671::-;6579:6;6587;6595;6648:3;6636:9;6627:7;6623:23;6619:33;6616:53;;;6665:1;6662;6655:12;6616:53;6688:52;6732:7;6721:9;6688:52;:::i;:::-;6678:62;;6791:3;6780:9;6776:19;6763:33;-1:-1:-1;;;;;6856:2:1;6848:6;6845:14;6842:34;;;6872:1;6869;6862:12;6842:34;6895:49;6936:7;6927:6;6916:9;6912:22;6895:49;:::i;:::-;6885:59;;6997:3;6986:9;6982:19;6969:33;6953:49;;7027:2;7017:8;7014:16;7011:36;;;7043:1;7040;7033:12;7011:36;;7066:51;7109:7;7098:8;7087:9;7083:24;7066:51;:::i;:::-;7056:61;;;6452:671;;;;;:::o;7128:315::-;7196:6;7204;7257:2;7245:9;7236:7;7232:23;7228:32;7225:52;;;7273:1;7270;7263:12;7225:52;7309:9;7296:23;7286:33;;7369:2;7358:9;7354:18;7341:32;7382:31;7407:5;7382:31;:::i;:::-;7432:5;7422:15;;;7128:315;;;;;:::o;7448:388::-;7525:6;7533;7586:2;7574:9;7565:7;7561:23;7557:32;7554:52;;;7602:1;7599;7592:12;7554:52;7642:9;7629:23;-1:-1:-1;;;;;7667:6:1;7664:30;7661:50;;;7707:1;7704;7697:12;7661:50;7730:49;7771:7;7762:6;7751:9;7747:22;7730:49;:::i;:::-;7720:59;7826:2;7811:18;;;;7798:32;;-1:-1:-1;;;;7448:388:1:o;7841:250::-;7926:1;7936:113;7950:6;7947:1;7944:13;7936:113;;;8026:11;;;8020:18;8007:11;;;8000:39;7972:2;7965:10;7936:113;;;-1:-1:-1;;8083:1:1;8065:16;;8058:27;7841:250::o;8096:270::-;8137:3;8175:5;8169:12;8202:6;8197:3;8190:19;8218:76;8287:6;8280:4;8275:3;8271:14;8264:4;8257:5;8253:16;8218:76;:::i;:::-;8348:2;8327:15;-1:-1:-1;;8323:29:1;8314:39;;;;8355:4;8310:50;;8096:270;-1:-1:-1;;8096:270:1:o;8371:217::-;8518:2;8507:9;8500:21;8481:4;8538:44;8578:2;8567:9;8563:18;8555:6;8538:44;:::i;8593:384::-;8659:6;8667;8720:2;8708:9;8699:7;8695:23;8691:32;8688:52;;;8736:1;8733;8726:12;8688:52;8775:9;8762:23;8794:31;8819:5;8794:31;:::i;:::-;8844:5;-1:-1:-1;8901:2:1;8886:18;;8873:32;8914:31;8873:32;8914:31;:::i;8982:348::-;9066:6;9119:2;9107:9;9098:7;9094:23;9090:32;9087:52;;;9135:1;9132;9125:12;9087:52;9175:9;9162:23;-1:-1:-1;;;;;9200:6:1;9197:30;9194:50;;;9240:1;9237;9230:12;9194:50;9263:61;9316:7;9307:6;9296:9;9292:22;9263:61;:::i;:::-;9253:71;8982:348;-1:-1:-1;;;;8982:348:1:o;9335:614::-;9386:3;9424:5;9418:12;9451:6;9446:3;9439:19;9477:4;9518:2;9513:3;9509:12;9543:11;9570;9563:18;;9620:6;9617:1;9613:14;9606:5;9602:26;9590:38;;9662:2;9655:5;9651:14;9683:1;9693:230;9707:6;9704:1;9701:13;9693:230;;;9778:5;9772:4;9768:16;9763:3;9756:29;9806:37;9838:4;9829:6;9823:13;9806:37;:::i;:::-;9901:12;;;;9798:45;-1:-1:-1;9866:15:1;;;;9729:1;9722:9;9693:230;;;-1:-1:-1;9939:4:1;;9335:614;-1:-1:-1;;;;;;;9335:614:1:o;9954:277::-;10151:2;10140:9;10133:21;10114:4;10171:54;10221:2;10210:9;10206:18;10198:6;10171:54;:::i;10461:737::-;10515:5;10568:3;10561:4;10553:6;10549:17;10545:27;10535:55;;10586:1;10583;10576:12;10535:55;10622:6;10609:20;10648:4;10672:60;10688:43;10728:2;10688:43;:::i;10672:60::-;10766:15;;;10852:1;10848:10;;;;10836:23;;10832:32;;;10797:12;;;;10876:15;;;10873:35;;;10904:1;10901;10894:12;10873:35;10940:2;10932:6;10928:15;10952:217;10968:6;10963:3;10960:15;10952:217;;;11048:3;11035:17;11065:31;11090:5;11065:31;:::i;:::-;11109:18;;11147:12;;;;10985;;10952:217;;11203:1373;11261:5;11309:4;11297:9;11292:3;11288:19;11284:30;11281:50;;;11327:1;11324;11317:12;11281:50;11349:22;;:::i;:::-;11340:31;;11407:9;11394:23;-1:-1:-1;;;;;11477:2:1;11469:6;11466:14;11463:34;;;11493:1;11490;11483:12;11463:34;11531:6;11520:9;11516:22;11506:32;;11576:3;11569:4;11565:2;11561:13;11557:23;11547:51;;11594:1;11591;11584:12;11547:51;11630:2;11617:16;11652:4;11676:60;11692:43;11732:2;11692:43;:::i;11676:60::-;11770:15;;;11852:1;11848:10;;;;11840:19;;11836:28;;;11801:12;;;;11876:15;;;11873:35;;;11904:1;11901;11894:12;11873:35;11928:11;;;;11948:142;11964:6;11959:3;11956:15;11948:142;;;12030:17;;12018:30;;11981:12;;;;12068;;;;11948:142;;;12099:20;;-1:-1:-1;12164:18:1;;;12151:32;12135:14;;;12128:56;-1:-1:-1;12237:2:1;12222:18;;12209:32;;-1:-1:-1;12253:16:1;;;12250:36;;;12282:1;12279;12272:12;12250:36;12318:59;12373:3;12362:8;12351:9;12347:24;12318:59;:::i;:::-;12313:2;12306:5;12302:14;12295:83;12431:2;12420:9;12416:18;12403:32;12387:48;;12460:2;12450:8;12447:16;12444:36;;;12476:1;12473;12466:12;12444:36;;12512:57;12565:3;12554:8;12543:9;12539:24;12512:57;:::i;:::-;12507:2;12500:5;12496:14;12489:81;;11203:1373;;;;:::o;12581:903::-;12746:6;12754;12762;12770;12823:3;12811:9;12802:7;12798:23;12794:33;12791:53;;;12840:1;12837;12830:12;12791:53;12863:52;12907:7;12896:9;12863:52;:::i;:::-;12853:62;;12966:3;12955:9;12951:19;12938:33;-1:-1:-1;;;;;13031:2:1;13023:6;13020:14;13017:34;;;13047:1;13044;13037:12;13017:34;13070:49;13111:7;13102:6;13091:9;13087:22;13070:49;:::i;:::-;13060:59;;13172:3;13161:9;13157:19;13144:33;13128:49;;13202:2;13192:8;13189:16;13186:36;;;13218:1;13215;13208:12;13186:36;13241:51;13284:7;13273:8;13262:9;13258:24;13241:51;:::i;:::-;13231:61;;13345:3;13334:9;13330:19;13317:33;13301:49;;13375:2;13365:8;13362:16;13359:36;;;13391:1;13388;13381:12;13359:36;;13414:64;13470:7;13459:8;13448:9;13444:24;13414:64;:::i;:::-;13404:74;;;12581:903;;;;;;;:::o;13489:367::-;13552:8;13562:6;13616:3;13609:4;13601:6;13597:17;13593:27;13583:55;;13634:1;13631;13624:12;13583:55;-1:-1:-1;13657:20:1;;-1:-1:-1;;;;;13689:30:1;;13686:50;;;13732:1;13729;13722:12;13686:50;13769:4;13761:6;13757:17;13745:29;;13829:3;13822:4;13812:6;13809:1;13805:14;13797:6;13793:27;13789:38;13786:47;13783:67;;;13846:1;13843;13836:12;13783:67;13489:367;;;;;:::o;13861:962::-;14015:6;14023;14031;14039;14092:2;14080:9;14071:7;14067:23;14063:32;14060:52;;;14108:1;14105;14098:12;14060:52;14148:9;14135:23;-1:-1:-1;;;;;14218:2:1;14210:6;14207:14;14204:34;;;14234:1;14231;14224:12;14204:34;14273:70;14335:7;14326:6;14315:9;14311:22;14273:70;:::i;:::-;14362:8;;-1:-1:-1;14247:96:1;-1:-1:-1;14450:2:1;14435:18;;14422:32;;-1:-1:-1;14466:16:1;;;14463:36;;;14495:1;14492;14485:12;14463:36;14533:8;14522:9;14518:24;14508:34;;14580:7;14573:4;14569:2;14565:13;14561:27;14551:55;;14602:1;14599;14592:12;14551:55;14642:2;14629:16;14668:2;14660:6;14657:14;14654:34;;;14684:1;14681;14674:12;14654:34;14737:7;14732:2;14722:6;14719:1;14715:14;14711:2;14707:23;14703:32;14700:45;14697:65;;;14758:1;14755;14748:12;14697:65;13861:962;;;;-1:-1:-1;;14789:2:1;14781:11;;-1:-1:-1;;;13861:962:1:o;14828:118::-;14914:5;14907:13;14900:21;14893:5;14890:32;14880:60;;14936:1;14933;14926:12;14951:519;15034:6;15042;15050;15058;15111:3;15099:9;15090:7;15086:23;15082:33;15079:53;;;15128:1;15125;15118:12;15079:53;15167:9;15154:23;15186:31;15211:5;15186:31;:::i;:::-;15236:5;-1:-1:-1;15288:2:1;15273:18;;15260:32;;-1:-1:-1;15339:2:1;15324:18;;15311:32;;-1:-1:-1;15395:2:1;15380:18;;15367:32;15408:30;15367:32;15408:30;:::i;:::-;14951:519;;;;-1:-1:-1;14951:519:1;;-1:-1:-1;;14951:519:1:o;15475:523::-;15561:6;15569;15577;15630:2;15618:9;15609:7;15605:23;15601:32;15598:52;;;15646:1;15643;15636:12;15598:52;15685:9;15672:23;15704:31;15729:5;15704:31;:::i;:::-;15754:5;-1:-1:-1;15806:2:1;15791:18;;15778:32;;-1:-1:-1;15861:2:1;15846:18;;15833:32;-1:-1:-1;;;;;15877:30:1;;15874:50;;;15920:1;15917;15910:12;15874:50;15943:49;15984:7;15975:6;15964:9;15960:22;15943:49;:::i;16003:1088::-;16161:6;16169;16177;16185;16193;16201;16254:2;16242:9;16233:7;16229:23;16225:32;16222:52;;;16270:1;16267;16260:12;16222:52;16310:9;16297:23;-1:-1:-1;;;;;16380:2:1;16372:6;16369:14;16366:34;;;16396:1;16393;16386:12;16366:34;16435:70;16497:7;16488:6;16477:9;16473:22;16435:70;:::i;:::-;16524:8;;-1:-1:-1;16409:96:1;-1:-1:-1;16612:2:1;16597:18;;16584:32;;-1:-1:-1;16628:16:1;;;16625:36;;;16657:1;16654;16647:12;16625:36;16696:72;16760:7;16749:8;16738:9;16734:24;16696:72;:::i;:::-;16787:8;;-1:-1:-1;16670:98:1;-1:-1:-1;16875:2:1;16860:18;;16847:32;;-1:-1:-1;16891:16:1;;;16888:36;;;16920:1;16917;16910:12;16888:36;;16959:72;17023:7;17012:8;17001:9;16997:24;16959:72;:::i;:::-;16003:1088;;;;-1:-1:-1;16003:1088:1;;-1:-1:-1;16003:1088:1;;17050:8;;16003:1088;-1:-1:-1;;;16003:1088:1:o;17096:348::-;17180:6;17233:2;17221:9;17212:7;17208:23;17204:32;17201:52;;;17249:1;17246;17239:12;17201:52;17289:9;17276:23;-1:-1:-1;;;;;17314:6:1;17311:30;17308:50;;;17354:1;17351;17344:12;17308:50;17377:61;17430:7;17421:6;17410:9;17406:22;17377:61;:::i;17449:949::-;17680:2;17732:21;;;17802:13;;17705:18;;;17824:22;;;17651:4;;17680:2;17865;;17883:18;;;;17924:15;;;17651:4;17967:405;17981:6;17978:1;17975:13;17967:405;;;18040:13;;18078:9;;18066:22;;18128:11;;;18122:18;18108:12;;;18101:40;18181:11;;;18175:18;18161:12;;;18154:40;18217:4;18275:11;;;18269:18;18262:26;18255:34;18241:12;;;18234:56;18319:4;18310:14;;;;18347:15;;;;18003:1;17996:9;17967:405;;18611:640;18726:6;18734;18742;18795:2;18783:9;18774:7;18770:23;18766:32;18763:52;;;18811:1;18808;18801:12;18763:52;18851:9;18838:23;-1:-1:-1;;;;;18921:2:1;18913:6;18910:14;18907:34;;;18937:1;18934;18927:12;18907:34;18960:49;19001:7;18992:6;18981:9;18977:22;18960:49;:::i;:::-;18950:59;;19056:2;19045:9;19041:18;19028:32;19018:42;;19113:2;19102:9;19098:18;19085:32;19069:48;;19142:2;19132:8;19129:16;19126:36;;;19158:1;19155;19148:12;19126:36;;19181:64;19237:7;19226:8;19215:9;19211:24;19181:64;:::i;19717:184::-;19787:6;19840:2;19828:9;19819:7;19815:23;19811:32;19808:52;;;19856:1;19853;19846:12;19808:52;-1:-1:-1;19879:16:1;;19717:184;-1:-1:-1;19717:184:1:o;19906:127::-;19967:10;19962:3;19958:20;19955:1;19948:31;19998:4;19995:1;19988:15;20022:4;20019:1;20012:15;20038:380;20117:1;20113:12;;;;20160;;;20181:61;;20235:4;20227:6;20223:17;20213:27;;20181:61;20288:2;20280:6;20277:14;20257:18;20254:38;20251:161;;20334:10;20329:3;20325:20;20322:1;20315:31;20369:4;20366:1;20359:15;20397:4;20394:1;20387:15;20251:161;;20038:380;;;:::o;20548:544::-;20649:2;20644:3;20641:11;20638:448;;;20685:1;20710:5;20706:2;20699:17;20755:4;20751:2;20741:19;20825:2;20813:10;20809:19;20806:1;20802:27;20796:4;20792:38;20861:4;20849:10;20846:20;20843:47;;;-1:-1:-1;20884:4:1;20843:47;20939:2;20934:3;20930:12;20927:1;20923:20;20917:4;20913:31;20903:41;;20994:82;21012:2;21005:5;21002:13;20994:82;;;21057:17;;;21038:1;21027:13;20994:82;;21268:1348;21392:3;21386:10;-1:-1:-1;;;;;21411:6:1;21408:30;21405:56;;;21441:18;;:::i;:::-;21470:96;21559:6;21519:38;21551:4;21545:11;21519:38;:::i;:::-;21513:4;21470:96;:::i;:::-;21621:4;;21685:2;21674:14;;21702:1;21697:662;;;;22403:1;22420:6;22417:89;;;-1:-1:-1;22472:19:1;;;22466:26;22417:89;-1:-1:-1;;21225:1:1;21221:11;;;21217:24;21213:29;21203:40;21249:1;21245:11;;;21200:57;22519:81;;21667:943;;21697:662;20495:1;20488:14;;;20532:4;20519:18;;-1:-1:-1;;21733:20:1;;;21850:236;21864:7;21861:1;21858:14;21850:236;;;21953:19;;;21947:26;21932:42;;22045:27;;;;22013:1;22001:14;;;;21880:19;;21850:236;;;21854:3;22114:6;22105:7;22102:19;22099:201;;;22175:19;;;22169:26;-1:-1:-1;;22258:1:1;22254:14;;;22270:3;22250:24;22246:37;22242:42;22227:58;22212:74;;22099:201;-1:-1:-1;;;;;22346:1:1;22330:14;;;22326:22;22313:36;;-1:-1:-1;21268:1348:1:o;22621:366::-;22832:4;22824:6;22820:17;22809:9;22802:36;22874:2;22869;22858:9;22854:18;22847:30;22783:4;22894:44;22934:2;22923:9;22919:18;22911:6;22894:44;:::i;:::-;22886:52;;22974:6;22969:2;22958:9;22954:18;22947:34;22621:366;;;;;;:::o;22992:127::-;23053:10;23048:3;23044:20;23041:1;23034:31;23084:4;23081:1;23074:15;23108:4;23105:1;23098:15;23124:135;23163:3;23184:17;;;23181:43;;23204:18;;:::i;:::-;-1:-1:-1;23251:1:1;23240:13;;23124:135::o;23264:247::-;23323:6;23376:2;23364:9;23355:7;23351:23;23347:32;23344:52;;;23392:1;23389;23382:12;23344:52;23431:9;23418:23;23450:31;23475:5;23450:31;:::i;23516:565::-;23689:5;23676:19;23670:4;23663:33;23750:2;23743:5;23739:14;23726:28;23722:1;23716:4;23712:12;23705:50;23809:2;23802:5;23798:14;23785:28;23781:1;23775:4;23771:12;23764:50;23851:1;23845:4;23841:12;23901:2;23894:5;23890:14;23877:28;23914:30;23936:7;23914:30;:::i;:::-;23972:17;;24051:15;;24044:23;23995:3;24040:33;-1:-1:-1;;23968:32:1;;;;24028:46;24009:66;;-1:-1:-1;;23516:565:1:o;24518:441::-;24571:5;24624:3;24617:4;24609:6;24605:17;24601:27;24591:55;;24642:1;24639;24632:12;24591:55;24671:6;24665:13;24702:48;24718:31;24746:2;24718:31;:::i;24702:48::-;24775:2;24766:7;24759:19;24821:3;24814:4;24809:2;24801:6;24797:15;24793:26;24790:35;24787:55;;;24838:1;24835;24828:12;24787:55;24851:77;24925:2;24918:4;24909:7;24905:18;24898:4;24890:6;24886:17;24851:77;:::i;24964:520::-;25059:6;25067;25075;25128:2;25116:9;25107:7;25103:23;25099:32;25096:52;;;25144:1;25141;25134:12;25096:52;25176:9;25170:16;25195:29;25218:5;25195:29;:::i;:::-;25292:2;25277:18;;25271:25;25243:5;;-1:-1:-1;;;;;;25308:30:1;;25305:50;;;25351:1;25348;25341:12;25305:50;25374:60;25426:7;25417:6;25406:9;25402:22;25374:60;:::i;:::-;25364:70;;;25474:2;25463:9;25459:18;25453:25;25443:35;;24964:520;;;;;:::o;25489:435::-;25542:3;25580:5;25574:12;25607:6;25602:3;25595:19;25633:4;25662:2;25657:3;25653:12;25646:19;;25699:2;25692:5;25688:14;25720:1;25730:169;25744:6;25741:1;25738:13;25730:169;;;25805:13;;25793:26;;25839:12;;;;25874:15;;;;25766:1;25759:9;25730:169;;;-1:-1:-1;25915:3:1;;25489:435;-1:-1:-1;;;;;25489:435:1:o;25929:461::-;25982:3;26020:5;26014:12;26047:6;26042:3;26035:19;26073:4;26102:2;26097:3;26093:12;26086:19;;26139:2;26132:5;26128:14;26160:1;26170:195;26184:6;26181:1;26178:13;26170:195;;;26249:13;;-1:-1:-1;;;;;26245:39:1;26233:52;;26305:12;;;;26340:15;;;;26281:1;26199:9;26170:195;;26395:1082;26692:4;26684:6;26680:17;26669:9;26662:36;26734:3;26729:2;26718:9;26714:18;26707:31;26643:4;26761:45;26801:3;26790:9;26786:19;26778:6;26761:45;:::i;:::-;26842:6;26837:2;26826:9;26822:18;26815:34;26897:9;26889:6;26885:22;26880:2;26869:9;26865:18;26858:50;26943:6;26937:13;26974:3;26966:6;26959:19;27001:60;27056:3;27048:6;27044:16;27030:12;27001:60;:::i;:::-;26987:74;;27112:2;27104:6;27100:15;27094:22;27089:2;27081:6;27077:15;27070:47;27166:2;27158:6;27154:15;27148:22;27215:6;27207;27203:19;27198:2;27190:6;27186:15;27179:44;27246:52;27291:6;27275:14;27246:52;:::i;:::-;27232:66;;;27347:2;27339:6;27335:15;27329:22;27396:6;27388;27384:19;27379:2;27371:6;27367:15;27360:44;27421:50;27464:6;27448:14;27421:50;:::i;:::-;27413:58;26395:1082;-1:-1:-1;;;;;;;;;26395:1082:1:o;28249:287::-;28378:3;28416:6;28410:13;28432:66;28491:6;28486:3;28479:4;28471:6;28467:17;28432:66;:::i;:::-;28514:16;;;;;28249:287;-1:-1:-1;;28249:287:1:o;28946:1010::-;29405:3;29394:9;29387:22;29368:4;29432:57;29484:3;29473:9;29469:19;29461:6;29432:57;:::i;:::-;29525:6;29520:2;29509:9;29505:18;29498:34;29568:6;29563:2;29552:9;29548:18;29541:34;29623:9;29615:6;29611:22;29606:2;29595:9;29591:18;29584:50;29657:44;29694:6;29686;29657:44;:::i;:::-;29643:58;;29750:9;29742:6;29738:22;29732:3;29721:9;29717:19;29710:51;29778:42;29813:6;29805;29778:42;:::i;:::-;29864:14;;29857:22;29851:3;29836:19;;29829:51;-1:-1:-1;;;;;;;29917:32:1;;;;29911:3;29896:19;;;29889:61;29770:50;28946:1010;-1:-1:-1;;;;;28946:1010:1:o;29961:128::-;30028:9;;;30049:11;;;30046:37;;;30063:18;;:::i;30455:455::-;-1:-1:-1;;;;;30750:15:1;;;30732:34;;30797:2;30782:18;;30775:34;;;;30840:2;30825:18;;30818:34;;;;30888:15;;;30883:2;30868:18;;30861:43;30681:3;30666:19;;30455:455::o;30915:734::-;30980:5;31033:3;31026:4;31018:6;31014:17;31010:27;31000:55;;31051:1;31048;31041:12;31000:55;31080:6;31074:13;31106:4;31130:60;31146:43;31186:2;31146:43;:::i;31130:60::-;31224:15;;;31310:1;31306:10;;;;31294:23;;31290:32;;;31255:12;;;;31334:15;;;31331:35;;;31362:1;31359;31352:12;31331:35;31398:2;31390:6;31386:15;31410:210;31426:6;31421:3;31418:15;31410:210;;;31499:3;31493:10;31516:31;31541:5;31516:31;:::i;:::-;31560:18;;31598:12;;;;31443;;31410:210;;31654:894;31717:5;31770:3;31763:4;31755:6;31751:17;31747:27;31737:55;;31788:1;31785;31778:12;31737:55;31817:6;31811:13;31843:4;31867:60;31883:43;31923:2;31883:43;:::i;31867:60::-;31961:15;;;32047:1;32043:10;;;;32031:23;;32027:32;;;31992:12;;;;32071:15;;;32068:35;;;32099:1;32096;32089:12;32068:35;32135:2;32127:6;32123:15;32147:372;32163:6;32158:3;32155:15;32147:372;;;32242:3;32236:10;-1:-1:-1;;;;;32265:11:1;32262:35;32259:125;;;32338:1;32367:2;32363;32356:14;32259:125;32409:67;32472:3;32467:2;32453:11;32445:6;32441:24;32437:33;32409:67;:::i;:::-;32397:80;;-1:-1:-1;32497:12:1;;;;32180;;32147:372;;32553:2036;32695:6;32703;32711;32719;32727;32780:3;32768:9;32759:7;32755:23;32751:33;32748:53;;;32797:1;32794;32787:12;32748:53;32829:9;32823:16;32848:29;32871:5;32848:29;:::i;:::-;32896:5;32886:15;;;32920:2;32966;32955:9;32951:18;32945:25;-1:-1:-1;;;;;33030:2:1;33022:6;33019:14;33016:34;;;33046:1;33043;33036:12;33016:34;33069:60;33121:7;33112:6;33101:9;33097:22;33069:60;:::i;:::-;33059:70;;33169:2;33158:9;33154:18;33148:25;33138:35;;33213:2;33202:9;33198:18;33192:25;33182:35;;33263:3;33252:9;33248:19;33242:26;33226:42;;33293:2;33283:8;33280:16;33277:36;;;33309:1;33306;33299:12;33277:36;33332:24;;;;33390:3;33372:16;;;33368:26;33365:46;;;33407:1;33404;33397:12;33365:46;33435:22;;:::i;:::-;33488:2;33482:9;33516:2;33506:8;33503:16;33500:36;;;33532:1;33529;33522:12;33500:36;33555:17;;33603:4;33595:13;;33591:27;-1:-1:-1;33581:55:1;;33632:1;33629;33622:12;33581:55;33661:2;33655:9;33684:60;33700:43;33740:2;33700:43;:::i;33684:60::-;33778:15;;;33860:1;33856:10;;;;33848:19;;33844:28;;;33809:12;;;;33884:19;;;33881:39;;;33916:1;33913;33906:12;33881:39;33940:11;;;;33960:135;33976:6;33971:3;33968:15;33960:135;;;34042:10;;34030:23;;33993:12;;;;34073;;;;33960:135;;;34120:5;34111:7;34104:22;;;;;34174:2;34170;34166:11;34160:18;34155:2;34146:7;34142:16;34135:44;34218:2;34214;34210:11;34204:18;34188:34;;34247:2;34237:8;34234:16;34231:36;;;34263:1;34260;34253:12;34231:36;34301:67;34360:7;34349:8;34345:2;34341:17;34301:67;:::i;:::-;34296:2;34287:7;34283:16;34276:93;34408:2;34404;34400:11;34394:18;34378:34;;34437:2;34427:8;34424:16;34421:36;;;34453:1;34450;34443:12;34421:36;34491:65;34548:7;34537:8;34533:2;34529:17;34491:65;:::i;:::-;34486:2;34477:7;34473:16;34466:91;34576:7;34566:17;;;;;;32553:2036;;;;;;;;:::o;35046:168::-;35119:9;;;35150;;35167:15;;;35161:22;;35147:37;35137:71;;35188:18;;:::i;35219:217::-;35259:1;35285;35275:132;;35329:10;35324:3;35320:20;35317:1;35310:31;35364:4;35361:1;35354:15;35392:4;35389:1;35382:15;35275:132;-1:-1:-1;35421:9:1;;35219:217::o;35999:396::-;36087:6;36095;36148:2;36136:9;36127:7;36123:23;36119:32;36116:52;;;36164:1;36161;36154:12;36116:52;36197:9;36191:16;-1:-1:-1;;;;;36222:6:1;36219:30;36216:50;;;36262:1;36259;36252:12;36216:50;36285:60;36337:7;36328:6;36317:9;36313:22;36285:60;:::i;:::-;36275:70;;;36385:2;36374:9;36370:18;36364:25;36354:35;;35999:396;;;;;:::o;36400:771::-;36449:3;36490:5;36484:12;36519:36;36545:9;36519:36;:::i;:::-;36564:19;;;36602:4;36625:1;36642:18;;;36669:146;;;;36829:1;36824:341;;;;36635:530;;36669:146;-1:-1:-1;;36711:24:1;;36697:12;;;36690:46;36783:14;;36776:22;36773:1;36769:30;36760:40;;36756:49;;;-1:-1:-1;36669:146:1;;36824:341;36855:5;36852:1;36845:16;36902:2;36899:1;36889:16;36927:1;36941:174;36955:6;36952:1;36949:13;36941:174;;;37042:14;;37024:11;;;37020:20;;37013:44;37085:16;;;;36970:10;;36941:174;;;37139:11;;37135:20;;;-1:-1:-1;;36635:530:1;;;;;;36400:771;;;;:::o;37176:1115::-;37461:4;37490:3;37526:6;37520:13;37509:9;37502:32;37590:4;37582:6;37578:17;37572:24;37565:4;37554:9;37550:20;37543:54;37653:4;37645:6;37641:17;37635:24;37628:4;37617:9;37613:20;37606:54;37707:4;37699:6;37695:17;37689:24;37749:1;37745;37740:3;37736:11;37732:19;37807:2;37793:12;37789:21;37782:4;37771:9;37767:20;37760:51;37879:2;37871:4;37863:6;37859:17;37853:24;37849:33;37842:4;37831:9;37827:20;37820:63;;;37939:4;37931:6;37927:17;37921:24;37914:4;37903:9;37899:20;37892:54;37983:2;37977:3;37966:9;37962:19;37955:31;38009:44;38049:2;38038:9;38034:18;38026:6;38009:44;:::i;:::-;37995:58;;38102:9;38094:6;38090:22;38084:3;38073:9;38069:19;38062:51;38136:40;38169:6;38161;38136:40;:::i;:::-;38122:54;;38225:9;38217:6;38213:22;38207:3;38196:9;38192:19;38185:51;38253:32;38278:6;38270;38253:32;:::i;:::-;38245:40;37176:1115;-1:-1:-1;;;;;;;37176:1115:1:o;38663:288::-;38732:6;38785:2;38773:9;38764:7;38760:23;38756:32;38753:52;;;38801:1;38798;38791:12;38753:52;38833:9;38827:16;-1:-1:-1;;;;;38876:5:1;38872:30;38865:5;38862:41;38852:69;;38917:1;38914;38907:12;38956:885;39223:2;39212:9;39205:21;39268:6;39262:13;39257:2;39246:9;39242:18;39235:41;39360:1;39356;39351:3;39347:11;39343:19;39335:4;39327:6;39323:17;39317:24;39313:50;39307:3;39296:9;39292:19;39285:79;39420:4;39412:6;39408:17;39402:24;39395:4;39384:9;39380:20;39373:54;39186:4;39474:2;39466:6;39462:15;39456:22;39515:4;39509:3;39498:9;39494:19;39487:33;39543:51;39589:3;39578:9;39574:19;39560:12;39543:51;:::i;:::-;39529:65;;39649:3;39641:6;39637:16;39631:23;39625:3;39614:9;39610:19;39603:52;-1:-1:-1;;;;;39697:6:1;39693:31;39686:4;39675:9;39671:20;39664:61;39775:9;39767:6;39763:22;39756:4;39745:9;39741:20;39734:52;39803:32;39828:6;39820;39803:32;:::i;40522:125::-;40587:9;;;40608:10;;;40605:36;;;40621:18;;:::i;40652:245::-;40719:6;40772:2;40760:9;40751:7;40747:23;40743:32;40740:52;;;40788:1;40785;40778:12;40740:52;40820:9;40814:16;40839:28;40861:5;40839:28;:::i
Swarm Source
ipfs://4161c5cb893d0ed5e2e9249b5486d7b4a519fb06d12d0a658b80e5dcb23f9f9c
Loading...
Loading
Loading...
Loading
[ Download: CSV Export ]
[ 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.