Source Code
Overview
ETH Balance
0.000562806787598249 ETH
Eth Value
$1.03 (@ $1,831.45/ETH)Latest 25 from a total of 31 transactions
| Transaction Hash |
Method
|
Block
|
From
|
|
To
|
||||
|---|---|---|---|---|---|---|---|---|---|
| Execute | 20441300 | 570 days ago | IN | 0.000253 ETH | 0.00075595 | ||||
| Execute | 20441290 | 570 days ago | IN | 0.000253 ETH | 0.00423214 | ||||
| Withdraw | 19638933 | 682 days ago | IN | 0 ETH | 0.0005253 | ||||
| Execute | 19615052 | 686 days ago | IN | 0.00138485 ETH | 0.02437351 | ||||
| Execute | 19415728 | 714 days ago | IN | 0.01111332 ETH | 0.04885713 | ||||
| Execute | 19348514 | 723 days ago | IN | 0.00789316 ETH | 0.0654082 | ||||
| Update Router | 19293592 | 731 days ago | IN | 0 ETH | 0.00077139 | ||||
| Execute | 19275174 | 733 days ago | IN | 0.00001321 ETH | 0.00540421 | ||||
| Execute | 19275134 | 733 days ago | IN | 0.0002028 ETH | 0.00561096 | ||||
| Execute | 19275130 | 733 days ago | IN | 0.00068663 ETH | 0.03395308 | ||||
| Execute | 19132680 | 753 days ago | IN | 0.00002025 ETH | 0.00341633 | ||||
| Execute | 19132680 | 753 days ago | IN | 0.00046343 ETH | 0.00341633 | ||||
| Execute | 19132673 | 753 days ago | IN | 0.00009649 ETH | 0.00317446 | ||||
| Execute | 19132670 | 753 days ago | IN | 0.00058327 ETH | 0.0218079 | ||||
| Execute | 19078683 | 761 days ago | IN | 0.00052193 ETH | 0.0120173 | ||||
| Execute | 19078649 | 761 days ago | IN | 0.00052193 ETH | 0.01258094 | ||||
| Execute | 19078279 | 761 days ago | IN | 0.0005226 ETH | 0.01542532 | ||||
| Execute | 19078270 | 761 days ago | IN | 0.0005226 ETH | 0.01654346 | ||||
| Execute | 19077974 | 761 days ago | IN | 0.00052369 ETH | 0.01760453 | ||||
| Execute | 19077798 | 761 days ago | IN | 0.00009576 ETH | 0.00228827 | ||||
| Execute | 19077798 | 761 days ago | IN | 0.00046641 ETH | 0.00228827 | ||||
| Execute | 19077642 | 761 days ago | IN | 0.00057981 ETH | 0.01649718 | ||||
| Execute | 19071629 | 762 days ago | IN | 0.00057792 ETH | 0.01498326 | ||||
| Execute | 19064913 | 763 days ago | IN | 0.0000031 ETH | 0.00249486 | ||||
| Execute | 19064905 | 763 days ago | IN | 0.00047483 ETH | 0.01634478 |
Latest 25 internal transactions (View All)
Advanced mode:
| Parent Transaction Hash | Method | Block |
From
|
|
To
|
||
|---|---|---|---|---|---|---|---|
| Ccip Send | 20441300 | 570 days ago | 0.0002024 ETH | ||||
| Ccip Send | 20441290 | 570 days ago | 0.0002024 ETH | ||||
| 0x60806040 | 20441290 | 570 days ago | Contract Creation | 0 ETH | |||
| Ccip Send | 19768869 | 664 days ago | 0.00041623 ETH | ||||
| Execute | 19768869 | 664 days ago | 0.00052029 ETH | ||||
| Ccip Send | 19768865 | 664 days ago | 0.00024555 ETH | ||||
| Execute | 19768865 | 664 days ago | 0.00030694 ETH | ||||
| Ccip Send | 19768854 | 664 days ago | 0.00041623 ETH | ||||
| Ccip Send | 19768854 | 664 days ago | 0.00035912 ETH | ||||
| Ccip Send | 19768854 | 664 days ago | 0.0002108 ETH | ||||
| Ccip Send | 19768854 | 664 days ago | 0.00024555 ETH | ||||
| 0x60806040 | 19768854 | 664 days ago | Contract Creation | 0 ETH | |||
| Execute | 19768854 | 664 days ago | 0.00152788 ETH | ||||
| Transfer | 19638933 | 682 days ago | 0.11127704 ETH | ||||
| Ccip Send | 19622384 | 685 days ago | 0.00018708 ETH | ||||
| Execute | 19622384 | 685 days ago | 0.00023385 ETH | ||||
| Ccip Send | 19622373 | 685 days ago | 0.00024352 ETH | ||||
| Ccip Send | 19622373 | 685 days ago | 0.00033144 ETH | ||||
| Ccip Send | 19622373 | 685 days ago | 0.00018708 ETH | ||||
| Ccip Send | 19622373 | 685 days ago | 0.00022838 ETH | ||||
| 0x60806040 | 19622373 | 685 days ago | Contract Creation | 0 ETH | |||
| Execute | 19622373 | 685 days ago | 0.00123806 ETH | ||||
| Ccip Send | 19615052 | 686 days ago | 0.00043313 ETH | ||||
| Ccip Send | 19615052 | 686 days ago | 0.00030816 ETH | ||||
| Ccip Send | 19615052 | 686 days ago | 0.00018232 ETH |
Loading...
Loading
Loading...
Loading
Cross-Chain Transactions
Loading...
Loading
Contract Name:
KlasterGatewaySingleton
Compiler Version
v0.8.19+commit.7dd6d404
Contract Source Code (Solidity)
/**
*Submitted for verification at Etherscan.io on 2023-10-31
*/
// Sources flattened with hardhat v2.17.2 https://hardhat.org
// SPDX-License-Identifier: MIT
// File @chainlink/contracts-ccip/src/v0.8/ccip/libraries/Client.sol@v0.7.6
// Original license: SPDX_License_Identifier: MIT
pragma solidity ^0.8.0;
// End consumer library.
library Client {
struct EVMTokenAmount {
address token; // token address on the local chain.
uint256 amount; // Amount of tokens.
}
struct Any2EVMMessage {
bytes32 messageId; // MessageId corresponding to ccipSend on source.
uint64 sourceChainSelector; // Source chain selector.
bytes sender; // abi.decode(sender) if coming from an EVM chain.
bytes data; // payload sent in original message.
EVMTokenAmount[] destTokenAmounts; // Tokens and their amounts in their destination chain representation.
}
// If extraArgs is empty bytes, the default is 200k gas limit and strict = false.
struct EVM2AnyMessage {
bytes receiver; // abi.encode(receiver address) for dest EVM chains
bytes data; // Data payload
EVMTokenAmount[] tokenAmounts; // Token transfers
address feeToken; // Address of feeToken. address(0) means you will send msg.value.
bytes extraArgs; // Populate this with _argsToBytes(EVMExtraArgsV1)
}
// extraArgs will evolve to support new features
// bytes4(keccak256("CCIP EVMExtraArgsV1"));
bytes4 public constant EVM_EXTRA_ARGS_V1_TAG = 0x97a657c9;
struct EVMExtraArgsV1 {
uint256 gasLimit; // ATTENTION!!! MAX GAS LIMIT 4M FOR BETA TESTING
bool strict; // See strict sequencing details below.
}
function _argsToBytes(EVMExtraArgsV1 memory extraArgs) internal pure returns (bytes memory bts) {
return abi.encodeWithSelector(EVM_EXTRA_ARGS_V1_TAG, extraArgs);
}
}
// File @chainlink/contracts-ccip/src/v0.8/ccip/interfaces/IAny2EVMMessageReceiver.sol@v0.7.6
/// @notice Application contracts that intend to receive messages from
/// the router should implement this interface.
interface IAny2EVMMessageReceiver {
/// @notice Called by the Router to deliver a message.
/// If this reverts, any token transfers also revert. The message
/// will move to a FAILED state and become available for manual execution.
/// @param message CCIP Message
/// @dev Note ensure you check the msg.sender is the OffRampRouter
function ccipReceive(Client.Any2EVMMessage calldata message) external;
}
// File @chainlink/contracts-ccip/src/v0.8/vendor/openzeppelin-solidity/v4.8.0/utils/introspection/IERC165.sol@v0.7.6
/**
* @dev Interface of the ERC165 standard, as defined in the
* https://eips.ethereum.org/EIPS/eip-165[EIP].
*
* Implementers can declare support of contract interfaces, which can then be
* queried by others ({ERC165Checker}).
*
* For an implementation, see {ERC165}.
*/
interface IERC165 {
/**
* @dev Returns true if this contract implements the interface defined by
* `interfaceId`. See the corresponding
* https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified[EIP section]
* to learn more about how these ids are created.
*
* This function call must use less than 30 000 gas.
*/
function supportsInterface(bytes4 interfaceId) external view returns (bool);
}
// File @chainlink/contracts-ccip/src/v0.8/ccip/applications/CCIPReceiver.sol@v0.7.6
/// @title CCIPReceiver - Base contract for CCIP applications that can receive messages.
abstract contract CCIPReceiver is IAny2EVMMessageReceiver, IERC165 {
address internal i_router;
constructor(address router) {
if (router == address(0)) revert InvalidRouter(address(0));
i_router = router;
}
/// @notice IERC165 supports an interfaceId
/// @param interfaceId The interfaceId to check
/// @return true if the interfaceId is supported
function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) {
return interfaceId == type(IAny2EVMMessageReceiver).interfaceId || interfaceId == type(IERC165).interfaceId;
}
/// @inheritdoc IAny2EVMMessageReceiver
function ccipReceive(Client.Any2EVMMessage calldata message) external virtual override onlyRouter {
_ccipReceive(message);
}
/// @notice Override this function in your implementation.
/// @param message Any2EVMMessage
function _ccipReceive(Client.Any2EVMMessage memory message) internal virtual;
/////////////////////////////////////////////////////////////////////
// Plumbing
/////////////////////////////////////////////////////////////////////
/// @notice Return the current router
/// @return i_router address
function getRouter() public view returns (address) {
return address(i_router);
}
error InvalidRouter(address router);
/// @dev only calls from the set router are accepted.
modifier onlyRouter() {
if (msg.sender != address(i_router)) revert InvalidRouter(msg.sender);
_;
}
}
// File @chainlink/contracts-ccip/src/v0.8/ccip/interfaces/IRouterClient.sol@v0.7.6
interface IRouterClient {
error UnsupportedDestinationChain(uint64 destChainSelector);
error InsufficientFeeTokenAmount();
error InvalidMsgValue();
/// @notice Checks if the given chain ID is supported for sending/receiving.
/// @param chainSelector The chain to check.
/// @return supported is true if it is supported, false if not.
function isChainSupported(uint64 chainSelector) external view returns (bool supported);
/// @notice Gets a list of all supported tokens which can be sent or received
/// to/from a given chain id.
/// @param chainSelector The chainSelector.
/// @return tokens The addresses of all tokens that are supported.
function getSupportedTokens(uint64 chainSelector) external view returns (address[] memory tokens);
/// @param destinationChainSelector The destination chainSelector
/// @param message The cross-chain CCIP message including data and/or tokens
/// @return fee returns guaranteed execution fee for the specified message
/// delivery to destination chain
/// @dev returns 0 fee on invalid message.
function getFee(
uint64 destinationChainSelector,
Client.EVM2AnyMessage memory message
) external view returns (uint256 fee);
/// @notice Request a message to be sent to the destination chain
/// @param destinationChainSelector The destination chain ID
/// @param message The cross-chain CCIP message including data and/or tokens
/// @return messageId The message ID
/// @dev Note if msg.value is larger than the required fee (from getFee) we accept
/// the overpayment with no refund.
function ccipSend(
uint64 destinationChainSelector,
Client.EVM2AnyMessage calldata message
) external payable returns (bytes32);
}
// File @openzeppelin/contracts/access/IAccessControl.sol@v4.9.3
/**
* @dev External interface of AccessControl declared to support ERC165 detection.
*/
interface IAccessControl {
/**
* @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.
*
* _Available since v3.1._
*/
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 `account`.
*/
function renounceRole(bytes32 role, address account) external;
}
// File @openzeppelin/contracts/utils/Context.sol@v4.9.3
/**
* @dev Provides information about the current execution context, including the
* sender of the transaction and its data. While these are generally available
* via msg.sender and msg.data, they should not be accessed in such a direct
* manner, since when dealing with meta-transactions the account sending and
* paying for execution may not be the actual sender (as far as an application
* is concerned).
*
* This contract is only required for intermediate, library-like contracts.
*/
abstract contract Context {
function _msgSender() internal view virtual returns (address) {
return msg.sender;
}
function _msgData() internal view virtual returns (bytes calldata) {
return msg.data;
}
}
// File @openzeppelin/contracts/utils/introspection/ERC165.sol@v4.9.3
/**
* @dev Implementation of the {IERC165} interface.
*
* Contracts that want to implement ERC165 should inherit from this contract and override {supportsInterface} to check
* for the additional interface id that will be supported. For example:
*
* ```solidity
* function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) {
* return interfaceId == type(MyInterface).interfaceId || super.supportsInterface(interfaceId);
* }
* ```
*
* Alternatively, {ERC165Storage} provides an easier to use but more expensive implementation.
*/
abstract contract ERC165 is IERC165 {
/**
* @dev See {IERC165-supportsInterface}.
*/
function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) {
return interfaceId == type(IERC165).interfaceId;
}
}
// File @openzeppelin/contracts/utils/math/Math.sol@v4.9.3
/**
* @dev Standard math utilities missing in the Solidity language.
*/
library Math {
enum Rounding {
Down, // Toward negative infinity
Up, // Toward infinity
Zero // Toward zero
}
/**
* @dev Returns the largest of two numbers.
*/
function max(uint256 a, uint256 b) internal pure returns (uint256) {
return a > b ? a : b;
}
/**
* @dev Returns the smallest of two numbers.
*/
function min(uint256 a, uint256 b) internal pure returns (uint256) {
return a < b ? a : b;
}
/**
* @dev Returns the average of two numbers. The result is rounded towards
* zero.
*/
function average(uint256 a, uint256 b) internal pure returns (uint256) {
// (a + b) / 2 can overflow.
return (a & b) + (a ^ b) / 2;
}
/**
* @dev Returns the ceiling of the division of two numbers.
*
* This differs from standard division with `/` in that it rounds up instead
* of rounding down.
*/
function ceilDiv(uint256 a, uint256 b) internal pure returns (uint256) {
// (a + b - 1) / b can overflow on addition, so we distribute.
return a == 0 ? 0 : (a - 1) / b + 1;
}
/**
* @notice Calculates floor(x * y / denominator) with full precision. Throws if result overflows a uint256 or denominator == 0
* @dev Original credit to Remco Bloemen under MIT license (https://xn--2-umb.com/21/muldiv)
* with further edits by Uniswap Labs also under MIT license.
*/
function mulDiv(uint256 x, uint256 y, uint256 denominator) internal pure returns (uint256 result) {
unchecked {
// 512-bit multiply [prod1 prod0] = x * y. Compute the product mod 2^256 and mod 2^256 - 1, then use
// use the Chinese Remainder Theorem to reconstruct the 512 bit result. The result is stored in two 256
// variables such that product = prod1 * 2^256 + prod0.
uint256 prod0; // Least significant 256 bits of the product
uint256 prod1; // Most significant 256 bits of the product
assembly {
let mm := mulmod(x, y, not(0))
prod0 := mul(x, y)
prod1 := sub(sub(mm, prod0), lt(mm, prod0))
}
// Handle non-overflow cases, 256 by 256 division.
if (prod1 == 0) {
// Solidity will revert if denominator == 0, unlike the div opcode on its own.
// The surrounding unchecked block does not change this fact.
// See https://docs.soliditylang.org/en/latest/control-structures.html#checked-or-unchecked-arithmetic.
return prod0 / denominator;
}
// Make sure the result is less than 2^256. Also prevents denominator == 0.
require(denominator > prod1, "Math: mulDiv overflow");
///////////////////////////////////////////////
// 512 by 256 division.
///////////////////////////////////////////////
// Make division exact by subtracting the remainder from [prod1 prod0].
uint256 remainder;
assembly {
// Compute remainder using mulmod.
remainder := mulmod(x, y, denominator)
// Subtract 256 bit number from 512 bit number.
prod1 := sub(prod1, gt(remainder, prod0))
prod0 := sub(prod0, remainder)
}
// Factor powers of two out of denominator and compute largest power of two divisor of denominator. Always >= 1.
// See https://cs.stackexchange.com/q/138556/92363.
// Does not overflow because the denominator cannot be zero at this stage in the function.
uint256 twos = denominator & (~denominator + 1);
assembly {
// Divide denominator by twos.
denominator := div(denominator, twos)
// Divide [prod1 prod0] by twos.
prod0 := div(prod0, twos)
// Flip twos such that it is 2^256 / twos. If twos is zero, then it becomes one.
twos := add(div(sub(0, twos), twos), 1)
}
// Shift in bits from prod1 into prod0.
prod0 |= prod1 * twos;
// Invert denominator mod 2^256. Now that denominator is an odd number, it has an inverse modulo 2^256 such
// that denominator * inv = 1 mod 2^256. Compute the inverse by starting with a seed that is correct for
// four bits. That is, denominator * inv = 1 mod 2^4.
uint256 inverse = (3 * denominator) ^ 2;
// Use the Newton-Raphson iteration to improve the precision. Thanks to Hensel's lifting lemma, this also works
// in modular arithmetic, doubling the correct bits in each step.
inverse *= 2 - denominator * inverse; // inverse mod 2^8
inverse *= 2 - denominator * inverse; // inverse mod 2^16
inverse *= 2 - denominator * inverse; // inverse mod 2^32
inverse *= 2 - denominator * inverse; // inverse mod 2^64
inverse *= 2 - denominator * inverse; // inverse mod 2^128
inverse *= 2 - denominator * inverse; // inverse mod 2^256
// Because the division is now exact we can divide by multiplying with the modular inverse of denominator.
// This will give us the correct result modulo 2^256. Since the preconditions guarantee that the outcome is
// less than 2^256, this is the final result. We don't need to compute the high bits of the result and prod1
// is no longer required.
result = prod0 * inverse;
return result;
}
}
/**
* @notice Calculates x * y / denominator with full precision, following the selected rounding direction.
*/
function mulDiv(uint256 x, uint256 y, uint256 denominator, Rounding rounding) internal pure returns (uint256) {
uint256 result = mulDiv(x, y, denominator);
if (rounding == Rounding.Up && mulmod(x, y, denominator) > 0) {
result += 1;
}
return result;
}
/**
* @dev Returns the square root of a number. If the number is not a perfect square, the value is rounded down.
*
* Inspired by Henry S. Warren, Jr.'s "Hacker's Delight" (Chapter 11).
*/
function sqrt(uint256 a) internal pure returns (uint256) {
if (a == 0) {
return 0;
}
// For our first guess, we get the biggest power of 2 which is smaller than the square root of the target.
//
// We know that the "msb" (most significant bit) of our target number `a` is a power of 2 such that we have
// `msb(a) <= a < 2*msb(a)`. This value can be written `msb(a)=2**k` with `k=log2(a)`.
//
// This can be rewritten `2**log2(a) <= a < 2**(log2(a) + 1)`
// → `sqrt(2**k) <= sqrt(a) < sqrt(2**(k+1))`
// → `2**(k/2) <= sqrt(a) < 2**((k+1)/2) <= 2**(k/2 + 1)`
//
// Consequently, `2**(log2(a) / 2)` is a good first approximation of `sqrt(a)` with at least 1 correct bit.
uint256 result = 1 << (log2(a) >> 1);
// At this point `result` is an estimation with one bit of precision. We know the true value is a uint128,
// since it is the square root of a uint256. Newton's method converges quadratically (precision doubles at
// every iteration). We thus need at most 7 iteration to turn our partial result with one bit of precision
// into the expected uint128 result.
unchecked {
result = (result + a / result) >> 1;
result = (result + a / result) >> 1;
result = (result + a / result) >> 1;
result = (result + a / result) >> 1;
result = (result + a / result) >> 1;
result = (result + a / result) >> 1;
result = (result + a / result) >> 1;
return min(result, a / result);
}
}
/**
* @notice Calculates sqrt(a), following the selected rounding direction.
*/
function sqrt(uint256 a, Rounding rounding) internal pure returns (uint256) {
unchecked {
uint256 result = sqrt(a);
return result + (rounding == Rounding.Up && result * result < a ? 1 : 0);
}
}
/**
* @dev Return the log in base 2, rounded down, of a positive value.
* Returns 0 if given 0.
*/
function log2(uint256 value) internal pure returns (uint256) {
uint256 result = 0;
unchecked {
if (value >> 128 > 0) {
value >>= 128;
result += 128;
}
if (value >> 64 > 0) {
value >>= 64;
result += 64;
}
if (value >> 32 > 0) {
value >>= 32;
result += 32;
}
if (value >> 16 > 0) {
value >>= 16;
result += 16;
}
if (value >> 8 > 0) {
value >>= 8;
result += 8;
}
if (value >> 4 > 0) {
value >>= 4;
result += 4;
}
if (value >> 2 > 0) {
value >>= 2;
result += 2;
}
if (value >> 1 > 0) {
result += 1;
}
}
return result;
}
/**
* @dev Return the log in base 2, following the selected rounding direction, of a positive value.
* Returns 0 if given 0.
*/
function log2(uint256 value, Rounding rounding) internal pure returns (uint256) {
unchecked {
uint256 result = log2(value);
return result + (rounding == Rounding.Up && 1 << result < value ? 1 : 0);
}
}
/**
* @dev Return the log in base 10, rounded down, of a positive value.
* Returns 0 if given 0.
*/
function log10(uint256 value) internal pure returns (uint256) {
uint256 result = 0;
unchecked {
if (value >= 10 ** 64) {
value /= 10 ** 64;
result += 64;
}
if (value >= 10 ** 32) {
value /= 10 ** 32;
result += 32;
}
if (value >= 10 ** 16) {
value /= 10 ** 16;
result += 16;
}
if (value >= 10 ** 8) {
value /= 10 ** 8;
result += 8;
}
if (value >= 10 ** 4) {
value /= 10 ** 4;
result += 4;
}
if (value >= 10 ** 2) {
value /= 10 ** 2;
result += 2;
}
if (value >= 10 ** 1) {
result += 1;
}
}
return result;
}
/**
* @dev Return the log in base 10, following the selected rounding direction, of a positive value.
* Returns 0 if given 0.
*/
function log10(uint256 value, Rounding rounding) internal pure returns (uint256) {
unchecked {
uint256 result = log10(value);
return result + (rounding == Rounding.Up && 10 ** result < value ? 1 : 0);
}
}
/**
* @dev Return the log in base 256, rounded down, of a positive value.
* Returns 0 if given 0.
*
* Adding one to the result gives the number of pairs of hex symbols needed to represent `value` as a hex string.
*/
function log256(uint256 value) internal pure returns (uint256) {
uint256 result = 0;
unchecked {
if (value >> 128 > 0) {
value >>= 128;
result += 16;
}
if (value >> 64 > 0) {
value >>= 64;
result += 8;
}
if (value >> 32 > 0) {
value >>= 32;
result += 4;
}
if (value >> 16 > 0) {
value >>= 16;
result += 2;
}
if (value >> 8 > 0) {
result += 1;
}
}
return result;
}
/**
* @dev Return the log in base 256, following the selected rounding direction, of a positive value.
* Returns 0 if given 0.
*/
function log256(uint256 value, Rounding rounding) internal pure returns (uint256) {
unchecked {
uint256 result = log256(value);
return result + (rounding == Rounding.Up && 1 << (result << 3) < value ? 1 : 0);
}
}
}
// File @openzeppelin/contracts/utils/math/SignedMath.sol@v4.9.3
/**
* @dev Standard signed math utilities missing in the Solidity language.
*/
library SignedMath {
/**
* @dev Returns the largest of two signed numbers.
*/
function max(int256 a, int256 b) internal pure returns (int256) {
return a > b ? a : b;
}
/**
* @dev Returns the smallest of two signed numbers.
*/
function min(int256 a, int256 b) internal pure returns (int256) {
return a < b ? a : b;
}
/**
* @dev Returns the average of two signed numbers without overflow.
* The result is rounded towards zero.
*/
function average(int256 a, int256 b) internal pure returns (int256) {
// Formula from the book "Hacker's Delight"
int256 x = (a & b) + ((a ^ b) >> 1);
return x + (int256(uint256(x) >> 255) & (a ^ b));
}
/**
* @dev Returns the absolute unsigned value of a signed value.
*/
function abs(int256 n) internal pure returns (uint256) {
unchecked {
// must be unchecked in order to support `n = type(int256).min`
return uint256(n >= 0 ? n : -n);
}
}
}
// File @openzeppelin/contracts/utils/Strings.sol@v4.9.3
/**
* @dev String operations.
*/
library Strings {
bytes16 private constant _SYMBOLS = "0123456789abcdef";
uint8 private constant _ADDRESS_LENGTH = 20;
/**
* @dev Converts a `uint256` to its ASCII `string` decimal representation.
*/
function toString(uint256 value) internal pure returns (string memory) {
unchecked {
uint256 length = Math.log10(value) + 1;
string memory buffer = new string(length);
uint256 ptr;
/// @solidity memory-safe-assembly
assembly {
ptr := add(buffer, add(32, length))
}
while (true) {
ptr--;
/// @solidity memory-safe-assembly
assembly {
mstore8(ptr, byte(mod(value, 10), _SYMBOLS))
}
value /= 10;
if (value == 0) break;
}
return buffer;
}
}
/**
* @dev Converts a `int256` to its ASCII `string` decimal representation.
*/
function toString(int256 value) internal pure returns (string memory) {
return string(abi.encodePacked(value < 0 ? "-" : "", toString(SignedMath.abs(value))));
}
/**
* @dev Converts a `uint256` to its ASCII `string` hexadecimal representation.
*/
function toHexString(uint256 value) internal pure returns (string memory) {
unchecked {
return toHexString(value, Math.log256(value) + 1);
}
}
/**
* @dev Converts a `uint256` to its ASCII `string` hexadecimal representation with fixed length.
*/
function toHexString(uint256 value, uint256 length) internal pure returns (string memory) {
bytes memory buffer = new bytes(2 * length + 2);
buffer[0] = "0";
buffer[1] = "x";
for (uint256 i = 2 * length + 1; i > 1; --i) {
buffer[i] = _SYMBOLS[value & 0xf];
value >>= 4;
}
require(value == 0, "Strings: hex length insufficient");
return string(buffer);
}
/**
* @dev Converts an `address` with fixed length of 20 bytes to its not checksummed ASCII `string` hexadecimal representation.
*/
function toHexString(address addr) internal pure returns (string memory) {
return toHexString(uint256(uint160(addr)), _ADDRESS_LENGTH);
}
/**
* @dev Returns true if the two strings are equal.
*/
function equal(string memory a, string memory b) internal pure returns (bool) {
return keccak256(bytes(a)) == keccak256(bytes(b));
}
}
// File @openzeppelin/contracts/access/AccessControl.sol@v4.9.3
/**
* @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 => bool) members;
bytes32 adminRole;
}
mapping(bytes32 => RoleData) private _roles;
bytes32 public constant DEFAULT_ADMIN_ROLE = 0x00;
/**
* @dev Modifier that checks that an account has a specific role. Reverts
* with a standardized message including the required role.
*
* The format of the revert reason is given by the following regular expression:
*
* /^AccessControl: account (0x[0-9a-f]{40}) is missing role (0x[0-9a-f]{64})$/
*
* _Available since v4.1._
*/
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 override returns (bool) {
return _roles[role].members[account];
}
/**
* @dev Revert with a standard message if `_msgSender()` is missing `role`.
* Overriding this function changes the behavior of the {onlyRole} modifier.
*
* Format of the revert message is described in {_checkRole}.
*
* _Available since v4.6._
*/
function _checkRole(bytes32 role) internal view virtual {
_checkRole(role, _msgSender());
}
/**
* @dev Revert with a standard message if `account` is missing `role`.
*
* The format of the revert reason is given by the following regular expression:
*
* /^AccessControl: account (0x[0-9a-f]{40}) is missing role (0x[0-9a-f]{64})$/
*/
function _checkRole(bytes32 role, address account) internal view virtual {
if (!hasRole(role, account)) {
revert(
string(
abi.encodePacked(
"AccessControl: account ",
Strings.toHexString(account),
" is missing role ",
Strings.toHexString(uint256(role), 32)
)
)
);
}
}
/**
* @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 override 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 override 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 override 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 `account`.
*
* May emit a {RoleRevoked} event.
*/
function renounceRole(bytes32 role, address account) public virtual override {
require(account == _msgSender(), "AccessControl: can only renounce roles for self");
_revokeRole(role, account);
}
/**
* @dev Grants `role` to `account`.
*
* If `account` had not been already granted `role`, emits a {RoleGranted}
* event. Note that unlike {grantRole}, this function doesn't perform any
* checks on the calling account.
*
* May emit a {RoleGranted} event.
*
* [WARNING]
* ====
* This function should only be called from the constructor when setting
* up the initial roles for the system.
*
* Using this function in any other way is effectively circumventing the admin
* system imposed by {AccessControl}.
* ====
*
* NOTE: This function is deprecated in favor of {_grantRole}.
*/
function _setupRole(bytes32 role, address account) internal virtual {
_grantRole(role, account);
}
/**
* @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 Grants `role` to `account`.
*
* Internal function without access restriction.
*
* May emit a {RoleGranted} event.
*/
function _grantRole(bytes32 role, address account) internal virtual {
if (!hasRole(role, account)) {
_roles[role].members[account] = true;
emit RoleGranted(role, account, _msgSender());
}
}
/**
* @dev Revokes `role` from `account`.
*
* Internal function without access restriction.
*
* May emit a {RoleRevoked} event.
*/
function _revokeRole(bytes32 role, address account) internal virtual {
if (hasRole(role, account)) {
_roles[role].members[account] = false;
emit RoleRevoked(role, account, _msgSender());
}
}
}
// File @openzeppelin/contracts/access/Ownable.sol@v4.9.3
/**
* @dev Contract module which provides a basic access control mechanism, where
* there is an account (an owner) that can be granted exclusive access to
* specific functions.
*
* By default, the owner account will be the one that deploys the contract. This
* can later be changed with {transferOwnership}.
*
* This module is used through inheritance. It will make available the modifier
* `onlyOwner`, which can be applied to your functions to restrict their use to
* the owner.
*/
abstract contract Ownable is Context {
address private _owner;
event OwnershipTransferred(address indexed previousOwner, address indexed newOwner);
/**
* @dev Initializes the contract setting the deployer as the initial owner.
*/
constructor() {
_transferOwnership(_msgSender());
}
/**
* @dev Throws if called by any account other than the owner.
*/
modifier onlyOwner() {
_checkOwner();
_;
}
/**
* @dev Returns the address of the current owner.
*/
function owner() public view virtual returns (address) {
return _owner;
}
/**
* @dev Throws if the sender is not the owner.
*/
function _checkOwner() internal view virtual {
require(owner() == _msgSender(), "Ownable: caller is not the owner");
}
/**
* @dev Leaves the contract without owner. It will not be possible to call
* `onlyOwner` functions. Can only be called by the current owner.
*
* NOTE: Renouncing ownership will leave the contract without an owner,
* thereby disabling any functionality that is only available to the owner.
*/
function renounceOwnership() public virtual onlyOwner {
_transferOwnership(address(0));
}
/**
* @dev Transfers ownership of the contract to a new account (`newOwner`).
* Can only be called by the current owner.
*/
function transferOwnership(address newOwner) public virtual onlyOwner {
require(newOwner != address(0), "Ownable: new owner is the zero address");
_transferOwnership(newOwner);
}
/**
* @dev Transfers ownership of the contract to a new account (`newOwner`).
* Internal function without access restriction.
*/
function _transferOwnership(address newOwner) internal virtual {
address oldOwner = _owner;
_owner = newOwner;
emit OwnershipTransferred(oldOwner, newOwner);
}
}
// File contracts/interface/IERC1271.sol
interface IERC1271 {
// bytes4(keccak256("isValidSignature(bytes32,bytes)")
// bytes4 constant internal MAGICVALUE = 0x1626ba7e;
function isValidSignature(bytes32 _hash, bytes memory _signature) external view returns (bytes4 magicValue);
}
// File contracts/interface/IKlasterGatewayWallet.sol
interface IKlasterGatewayWallet {
function execute(
address destination,
uint256 value,
bytes memory data
) external returns (bool, address);
function executeWithData(
address destination,
uint256 value,
bytes memory data,
bytes32 extraData
) external returns (bool, address);
}
// File contracts/gateway/KlasterGatewayWallet.sol
contract KlasterGatewayWallet is Ownable, IERC1271, IKlasterGatewayWallet {
address public klasterGatewaySingleton;
mapping (bytes32 => bool) public signatures;
constructor(address _owner) {
klasterGatewaySingleton = msg.sender;
_transferOwnership(_owner);
}
function executeWithData(
address destination,
uint256 value,
bytes memory data,
bytes32 extraData
) external returns (bool, address) {
if (destination == address(0)) { // contract deployment
if (extraData == "") { // deploy using create()
return (true, _performCreate(value, data));
} else { // deploy using create2()
return (true, _performCreate2(value, data, extraData));
}
} else { // transaction execution (use extra data as contract wallet signature as per ERC-1271)
if (extraData != "") { signatures[extraData] = true; }
return execute(destination, value, data);
}
}
function execute(
address destination,
uint256 value,
bytes memory data
) public returns (bool, address) {
require(
msg.sender == klasterGatewaySingleton || msg.sender == owner(),
"Not an owner!"
);
bool result;
uint dataLength = data.length;
assembly {
let x := mload(0x40) // "Allocate" memory for output (0x40 is where "free memory" pointer is stored by convention)
let d := add(data, 32) // First 32 bytes are the padded length of data, so exclude that
result := call(
sub(gas(), 34710), // 34710 is the value that solidity is currently emitting
// It includes callGas (700) + callVeryLow (3, to pay for SUB) + callValueTransferGas (9000) +
// callNewAccountGas (25000, in case the destination address does not exist and needs creating)
destination,
value,
d,
dataLength, // Size of the input (in bytes) - this is what fixes the padding problem
x,
0 // Output is ignored, therefore the output size is zero
)
}
return (result, address(0));
}
function isValidSignature(bytes32 _hash, bytes memory _signature) external view returns (bytes4 magicValue) {
if (signatures[_hash]) {
magicValue = 0x1626ba7e; // ERC1271: valid signature = bytes4(keccak256("isValidSignature(bytes32,bytes)")
}
}
function _performCreate(
uint256 value,
bytes memory deploymentData
) internal returns (address newContract) {
/* solhint-disable no-inline-assembly */
/// @solidity memory-safe-assembly
assembly {
newContract := create(value, add(deploymentData, 0x20), mload(deploymentData))
}
/* solhint-enable no-inline-assembly */
require(newContract != address(0), "Could not deploy contract");
}
function _performCreate2(
uint256 value,
bytes memory deploymentData,
bytes32 salt
) internal returns (address newContract) {
/* solhint-disable no-inline-assembly */
/// @solidity memory-safe-assembly
assembly {
newContract := create2(value, add(0x20, deploymentData), mload(deploymentData), salt)
}
/* solhint-enable no-inline-assembly */
require(newContract != address(0), "Could not deploy contract");
}
/// @notice Fallback function to allow the contract to receive Ether.
/// @dev This function has no function body, making it a default function for receiving Ether.
/// It is automatically called when Ether is sent to the contract without any data.
receive() external payable {}
}
// File contracts/interface/IKlasterGatewaySingleton.sol
interface IKlasterGatewaySingleton {
/************************** EVENTS **************************/
// Event emitted when a new gateway wallet instance has been deployed.
event WalletDeploy(
address indexed owner,
address gatewayWallet
);
// Event emitted when a message is sent to another chain.
event SendRTC(
bytes32 indexed messageId, // The unique ID of the CCIP message.
address indexed caller, // Wallet initiating the RTC
uint64 destinationChainSelector, // The chain selector of the destination chain.
uint64 execChainSelector, // The chain selector of the execution chain.
address targetContract, // Remote contract to execute on dest chain
bytes32 extraData, // Message hash used for ERC-1271 or salt used for create2
address feeToken, // the token address used to pay CCIP fees.
uint256 ccipfees, // The fees paid for sending the CCIP message.
uint256 totalFees // Total fees (ccip + platform fee)
);
// Event emitted when a message is received from another chain.
event ReceiveRTC(
bytes32 indexed messageId, // The unique ID of the CCIP message.
uint64 indexed sourceChainSelector, // The chain selector of the destination chain.
address caller, // Wallet initiating the RTC.
address targetContract, // Remote contract to execute on dest chain,
bytes32 extraData // Message hash used for ERC-1271 or salt used for create2
);
// Event emitted when any gateway wallet action gets executed
event Execute(
address indexed caller,
address indexed gatewayWallet,
address indexed destination,
bool status,
address contractDeployed,
bytes32 extraData
);
/************************** WRITE **************************/
function deploy(string memory salt) external returns (address);
function batchExecute(
uint64[][] memory execChainSelectors,
string[] memory salt,
address[] memory destination,
uint256[] memory value,
bytes[] memory data,
uint256[] memory gasLimit,
bytes32[] memory extraData
) external payable returns (bool[] memory, address[] memory, bytes32[] memory);
function execute(
uint64[] memory execChainSelectors,
string memory salt,
address destination,
uint value,
bytes memory data,
uint256 gasLimit,
bytes32 extraData
) external payable returns (bool, address, bytes32);
/************************** READ **************************/
function getDeployedWallets(address owner) external view returns (address[] memory);
function calculateBatchExecuteFee(
address caller,
uint64[][] memory execChainSelectors,
string[] memory salt,
address[] memory destination,
uint256[] memory value,
bytes[] memory data,
uint256[] memory gasLimit,
bytes32[] memory extraData
) external view returns (uint256);
function calculateExecuteFee(
address caller,
uint64[] memory execChainSelectors,
string memory salt,
address destination,
uint value,
bytes memory data,
uint256 gasLimit,
bytes32 extraData
) external view returns (uint256);
function calculateAddress(address owner, string memory salt) external view returns (address);
function calculateCreate2Address(
address owner,
string memory salt,
bytes memory byteCode,
bytes32 create2Salt
) external view returns (address);
}
// File contracts/interface/IOwnable.sol
interface IOwnable {
function owner() external view returns (address);
}
// File contracts/gateway/KlasterGatewaySingleton.sol
contract KlasterGatewaySingleton is IKlasterGatewaySingleton, CCIPReceiver, AccessControl {
bytes32 public constant FEE_MANAGER_ROLE = keccak256("FEE_MANAGER_ROLE");
bytes32 public constant HARVEST_MANAGER_ROLE = keccak256("HARVEST_MANAGER_ROLE");
bytes32 public constant CCIP_MANAGER_ROLE = keccak256("CCIP_MANAGER_ROLE");
uint256 public feePercentage; // percentage fee on top of the ccip fees (modifiable by the owner)
uint64 public thisChainSelector; // current chain selector
uint64 public relayerChainSelector; // relayer chain selector (sepolia for testnet, eth for mainnet)
mapping (address => bool) public deployed;
mapping (address => uint64) public controllingChains; // gateway wallet => controlling chain id
mapping (address => string) public salts; // gateway wallet => salt
mapping (address => address[]) public instances; // user => gateway wallet[]
constructor(
address _sourceRouter,
uint64 _thisChainSelector,
uint64 _relayerChainSelector,
address _roleManager,
address _ccipManager,
address _harvestManager,
address _feeManager,
uint256 _feePercentage
) CCIPReceiver(_sourceRouter) {
thisChainSelector = _thisChainSelector;
relayerChainSelector = _relayerChainSelector;
feePercentage = _feePercentage;
_grantRole(DEFAULT_ADMIN_ROLE, _roleManager);
_grantRole(FEE_MANAGER_ROLE, _feeManager);
_grantRole(HARVEST_MANAGER_ROLE, _harvestManager);
_grantRole(CCIP_MANAGER_ROLE, _ccipManager);
// sanity checks
require(
_relayerChainSelector == _thisChainSelector ||
IRouterClient(getRouter()).isChainSupported(relayerChainSelector),
"Invalid relayer chain configuration."
);
require(_feeManager != address(0), "Fee manager is 0x0");
require(_ccipManager != address(0), "CCIP manager is 0x0");
}
function deploy(string memory salt) public override returns (address) {
return _deploy(msg.sender, salt, thisChainSelector);
}
/***
* FEE_MANAGER FUNCTIONS (SENSITIVE)
*
* Append only. Cant break anything or shut down the service.
* KlasterGatewayWallet wallets will always work and in that sense it's permissionless.
* The only two things a fee manager can affect and change post deployment are:
* 1) Update platform fee - CAPPED TO 100% of the CCIP fee (!)
* 2) Withdraw platform fee earnings
*/
function updateFee(uint256 _feePercentage) external {
require(hasRole(FEE_MANAGER_ROLE, msg.sender), "Caller is not a fee manager.");
require(_feePercentage <= 100, "Platform fee is capped to 100% of the CCIP fee.");
feePercentage = _feePercentage;
}
function withdraw(uint256 amount) external {
require(hasRole(HARVEST_MANAGER_ROLE, msg.sender), "Caller is not a harvest manager.");
payable(msg.sender).transfer(amount);
}
/***
* CCIP_MANAGER FUNCTIONS (SENSITIVE)
*
* CCIP manager is the only address that can update the router addresses.
* This is a temporary role to be used only once. Chainlink's CCIP team is going to deploy
* new router addresses after the GA launch, and this function will be used to store the new
* router address and replace the old ones. After the update is complete, CCIP manager will renounce
* its role.
*/
function updateRouter(address _newRouterAddress) external {
require(hasRole(CCIP_MANAGER_ROLE, msg.sender), "Caller is not a ccip manager.");
i_router = _newRouterAddress;
}
/************ PUBLIC WRITE FUNCTIONS ************/
function batchExecute(
uint64[][] memory execChainSelectors,
string[] memory salt,
address[] memory destination,
uint256[] memory value,
bytes[] memory data,
uint256[] memory gasLimit,
bytes32[] memory extraData
) external payable override returns (bool[] memory success, address[] memory contractDeployed, bytes32[] memory messageId) {
success = new bool[](execChainSelectors.length);
contractDeployed = new address[](execChainSelectors.length);
messageId = new bytes32[](execChainSelectors.length);
for (uint256 i = 0; i < execChainSelectors.length; i++) {
(success[i], contractDeployed[i], messageId[i]) = execute(
execChainSelectors[i],
salt[i],
destination[i],
value[i],
data[i],
gasLimit[i],
extraData[i]
);
}
}
function execute(
uint64[] memory execChainSelectors,
string memory salt,
address destination,
uint256 value,
bytes memory data,
uint256 gasLimit,
bytes32 extraData
) public payable override returns (bool success, address contractDeployed, bytes32 messageId) {
if (destination != address(0) && extraData != "") { // if executing contract call (destination != 0) and extra data exists, then verify if the extra data is a valid signature
require(
IERC1271(msg.sender).isValidSignature(
extraData,
""
) == 0x1626ba7e, // ERC1271: valid signature = bytes4(keccak256("isValidSignature(bytes32,bytes)")
"Invalid signature."
);
}
for (uint256 i = 0; i < execChainSelectors.length; i++) {
(success, contractDeployed, messageId) = _execute(
ExecutionData(
msg.sender,
thisChainSelector,
execChainSelectors[i],
salt,
destination,
value,
data,
gasLimit,
extraData,
true
)
);
}
}
/************ PUBLIC READ FUNCTIONS ************/
function getDeployedWallets(address owner) external view override returns (address[] memory) {
return instances[owner];
}
function calculateBatchExecuteFee(
address caller,
uint64[][] memory execChainSelectors,
string[] memory salt,
address[] memory destination,
uint256[] memory value,
bytes[] memory data,
uint256[] memory gasLimit,
bytes32[] memory extraData
) external view override returns (uint256 totalFee) {
for (uint256 i = 0; i < execChainSelectors.length; i++) {
totalFee += calculateExecuteFee(
caller,
execChainSelectors[i],
salt[i],
destination[i],
value[i],
data[i],
gasLimit[i],
extraData[i]
);
}
}
function calculateExecuteFee(
address caller,
uint64[] memory execChainSelectors,
string memory salt,
address destination,
uint256 value,
bytes memory data,
uint256 gasLimit,
bytes32 extraData
) public view override returns (uint256 totalFee) {
for (uint256 i = 0; i < execChainSelectors.length; i++) {
uint64 execChainSelector = execChainSelectors[i];
if (execChainSelector != thisChainSelector) {
// Get available lane
uint64 destChainSelector = _getDestChainSelector(execChainSelector);
// Create an EVM2AnyMessage struct in memory with necessary information for sending a cross-chain message
Client.EVM2AnyMessage memory evm2AnyMessage = _buildCCIPMessage(
address(this),
abi.encode(caller, thisChainSelector, execChainSelector, salt, destination, value, data, gasLimit, extraData),
address(0),
gasLimit
);
(, uint256 fee) = _getFees(destChainSelector, execChainSelector, evm2AnyMessage);
totalFee += fee;
}
}
}
function calculateAddress(address owner, string memory salt) public view override returns (address) {
bytes32 hash = keccak256(
abi.encodePacked(
bytes1(0xff), address(this), keccak256(abi.encodePacked(owner, salt)), keccak256(_getBytecode(owner))
)
);
return address(uint160(uint(hash)));
}
function calculateCreate2Address(
address owner,
string memory salt,
bytes memory byteCode,
bytes32 create2Salt
) external view override returns (address) {
bytes32 hash_ = keccak256(
abi.encodePacked(
bytes1(0xff),
calculateAddress(owner, salt),
create2Salt,
keccak256(byteCode)
)
);
return address(uint160(uint256(hash_)));
}
/************ INTERNAL FUNCTIONS ************/
struct ExecutionData {
address caller;
uint64 sourceChainSelector;
uint64 execChainSelector;
string salt;
address destination;
uint256 value;
bytes data;
uint256 gasLimit;
bytes32 extraData;
bool feeEnabled;
}
function _execute(
ExecutionData memory execData
) internal returns (bool success, address contractDeployed, bytes32 messageId) {
if (execData.execChainSelector == thisChainSelector) { // execute on this chain
(success, contractDeployed) = _executeOnWallet(
execData.sourceChainSelector,
execData.caller,
execData.salt,
execData.destination,
execData.value,
execData.data,
execData.extraData
);
} else { // remote execution on target chain via CCIP
// Get available lane
uint64 destChainSelector = _getDestChainSelector(execData.execChainSelector);
// Create an EVM2AnyMessage struct in memory with necessary information for sending a cross-chain message
Client.EVM2AnyMessage memory evm2AnyMessage = _buildCCIPMessage(
address(this),
abi.encode(
execData.caller,
execData.sourceChainSelector,
execData.execChainSelector,
execData.salt,
execData.destination,
execData.value,
execData.data,
execData.gasLimit,
execData.extraData
),
address(0),
execData.gasLimit
);
(uint256 ccipFees, uint256 totalFee) = _getFees(
destChainSelector,
execData.execChainSelector,
evm2AnyMessage
);
// Take into account platform fee
if (execData.feeEnabled) {
require(msg.value >= totalFee, "Ether amount too low. Send more ether to execute call.");
}
success = true;
messageId = IRouterClient(getRouter()).ccipSend{value: ccipFees}(
destChainSelector,
evm2AnyMessage
);
emit SendRTC(
messageId,
execData.caller,
destChainSelector,
execData.execChainSelector,
execData.destination,
execData.extraData,
address(0),
ccipFees,
totalFee
);
}
}
// executes given action on the callers gateway wallet
function _executeOnWallet(
uint64 sourceChainSelector,
address caller,
string memory salt,
address destination,
uint256 value,
bytes memory data,
bytes32 extraData
) internal returns (bool status, address contractDeployed) {
address walletInstanceAddress = calculateAddress(caller, salt);
if (!deployed[walletInstanceAddress]) {
_deploy(caller, salt, sourceChainSelector);
} else {
require(
sourceChainSelector == controllingChains[walletInstanceAddress],
"Can only execute from controlling chain."
);
}
IKlasterGatewayWallet walletInstance = IKlasterGatewayWallet(walletInstanceAddress);
require(IOwnable(walletInstanceAddress).owner() == caller, "Not an owner!");
(status, contractDeployed) = walletInstance.executeWithData(destination, value, data, extraData);
emit Execute(caller, walletInstanceAddress, destination, status, contractDeployed, extraData);
}
// deploys new gateway wallet for given owner and salt
function _deploy(
address owner,
string memory salt,
uint64 sourceChainSelector
) private returns (address walletInstance) {
require(!deployed[calculateAddress(owner, salt)], "Already deployed! Use different salt!");
bytes memory bytecode = _getBytecode(owner);
bytes32 calculatedSalt = keccak256(abi.encodePacked(owner, salt));
assembly {
walletInstance := create2(0, add(bytecode, 32), mload(bytecode), calculatedSalt)
}
deployed[walletInstance] = true;
salts[walletInstance] = salt;
controllingChains[walletInstance] = sourceChainSelector;
instances[owner].push(walletInstance);
emit WalletDeploy(owner, walletInstance);
}
// get the bytecode of the contract KlasterGatewayWallet with encoded constructor
function _getBytecode(address owner) private pure returns (bytes memory) {
bytes memory bytecode = type(KlasterGatewayWallet).creationCode;
return abi.encodePacked(bytecode, abi.encode(owner));
}
// @notice Construct a CCIP message.
/// @dev This function will create an EVM2AnyMessage struct with all the necessary information for sending arbitrary bytes cross chain.
/// @param _receiver The address of the receiver.
/// @param _message The bytes data to be sent.
/// @param _feeTokenAddress The address of the token used for fees. Set address(0) for native gas.
/// @param _gasLimit Gas limit.
/// @return Client.EVM2AnyMessage Returns an EVM2AnyMessage struct which contains information for sending a CCIP message.
function _buildCCIPMessage(
address _receiver,
bytes memory _message,
address _feeTokenAddress,
uint256 _gasLimit
) internal pure returns (Client.EVM2AnyMessage memory) {
// Create an EVM2AnyMessage struct in memory with necessary information for sending a cross-chain message
Client.EVM2AnyMessage memory evm2AnyMessage = Client.EVM2AnyMessage({
receiver: abi.encode(_receiver), // ABI-encoded receiver address
data: _message, // ABI-encoded string
tokenAmounts: new Client.EVMTokenAmount[](0), // Empty array aas no tokens are transferred
extraArgs: Client._argsToBytes(
// Additional arguments, setting gas limit and non-strict sequencing mode
Client.EVMExtraArgsV1({gasLimit: _gasLimit, strict: false})
),
// Set the feeToken to a feeTokenAddress, indicating specific asset will be used for fees
feeToken: _feeTokenAddress
});
return evm2AnyMessage;
}
/// handle received execution message
function _ccipReceive(
Client.Any2EVMMessage memory any2EvmMessage
)
internal
override
{
require(
abi.decode(any2EvmMessage.sender, (address)) == address(this),
"Only official KlasterGatewaySingleton can send CCIP messages."
);
(
address caller,
uint64 sourceChainSelector,
uint64 execChainSelector,
string memory salt,
address destination,
uint256 value,
bytes memory data,
uint256 gasLimit,
bytes32 extraData
) = abi.decode(
any2EvmMessage.data,
(
address,
uint64,
uint64,
string,
address,
uint256,
bytes,
uint256,
bytes32
)
);
_execute(
ExecutionData(
caller,
sourceChainSelector,
execChainSelector,
salt,
destination,
value,
data,
gasLimit,
extraData,
false
)
);
emit ReceiveRTC(
any2EvmMessage.messageId,
any2EvmMessage.sourceChainSelector,
caller,
destination,
extraData
);
}
function _getFees(
uint64 destChainSelector,
uint64 execChainSelector,
Client.EVM2AnyMessage memory message
) internal view returns (uint256 ccipFee, uint256 totalFee) {
// Multiply fees by 2 if not a direct lane
uint256 laneMultiplier = (destChainSelector == execChainSelector) ? 1 : 2;
ccipFee = IRouterClient(getRouter()).getFee(destChainSelector, message);
totalFee = (ccipFee + (ccipFee * feePercentage / 100)) * laneMultiplier;
}
function _directLaneExists(uint64 execChainSelector) internal view returns (bool) {
return IRouterClient(getRouter()).isChainSupported(execChainSelector);
}
function _getDestChainSelector(uint64 execChainSelector) internal view returns (uint64 selector) {
selector = _directLaneExists(execChainSelector) ? execChainSelector : relayerChainSelector;
}
/// @notice Fallback function to allow the contract to receive Ether.
/// @dev This function has no function body, making it a default function for receiving Ether.
/// It is automatically called when Ether is sent to the contract without any data.
receive() external payable {}
/// ERC165
function supportsInterface(
bytes4 interfaceId
) public view override(CCIPReceiver, AccessControl) returns (bool) {
return CCIPReceiver.supportsInterface(interfaceId) || AccessControl.supportsInterface(interfaceId);
}
}Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
Contract ABI
API[{"inputs":[{"internalType":"address","name":"_sourceRouter","type":"address"},{"internalType":"uint64","name":"_thisChainSelector","type":"uint64"},{"internalType":"uint64","name":"_relayerChainSelector","type":"uint64"},{"internalType":"address","name":"_roleManager","type":"address"},{"internalType":"address","name":"_ccipManager","type":"address"},{"internalType":"address","name":"_harvestManager","type":"address"},{"internalType":"address","name":"_feeManager","type":"address"},{"internalType":"uint256","name":"_feePercentage","type":"uint256"}],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[{"internalType":"address","name":"router","type":"address"}],"name":"InvalidRouter","type":"error"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"caller","type":"address"},{"indexed":true,"internalType":"address","name":"gatewayWallet","type":"address"},{"indexed":true,"internalType":"address","name":"destination","type":"address"},{"indexed":false,"internalType":"bool","name":"status","type":"bool"},{"indexed":false,"internalType":"address","name":"contractDeployed","type":"address"},{"indexed":false,"internalType":"bytes32","name":"extraData","type":"bytes32"}],"name":"Execute","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"messageId","type":"bytes32"},{"indexed":true,"internalType":"uint64","name":"sourceChainSelector","type":"uint64"},{"indexed":false,"internalType":"address","name":"caller","type":"address"},{"indexed":false,"internalType":"address","name":"targetContract","type":"address"},{"indexed":false,"internalType":"bytes32","name":"extraData","type":"bytes32"}],"name":"ReceiveRTC","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":true,"internalType":"bytes32","name":"messageId","type":"bytes32"},{"indexed":true,"internalType":"address","name":"caller","type":"address"},{"indexed":false,"internalType":"uint64","name":"destinationChainSelector","type":"uint64"},{"indexed":false,"internalType":"uint64","name":"execChainSelector","type":"uint64"},{"indexed":false,"internalType":"address","name":"targetContract","type":"address"},{"indexed":false,"internalType":"bytes32","name":"extraData","type":"bytes32"},{"indexed":false,"internalType":"address","name":"feeToken","type":"address"},{"indexed":false,"internalType":"uint256","name":"ccipfees","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"totalFees","type":"uint256"}],"name":"SendRTC","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":false,"internalType":"address","name":"gatewayWallet","type":"address"}],"name":"WalletDeploy","type":"event"},{"inputs":[],"name":"CCIP_MANAGER_ROLE","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"DEFAULT_ADMIN_ROLE","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"FEE_MANAGER_ROLE","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"HARVEST_MANAGER_ROLE","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint64[][]","name":"execChainSelectors","type":"uint64[][]"},{"internalType":"string[]","name":"salt","type":"string[]"},{"internalType":"address[]","name":"destination","type":"address[]"},{"internalType":"uint256[]","name":"value","type":"uint256[]"},{"internalType":"bytes[]","name":"data","type":"bytes[]"},{"internalType":"uint256[]","name":"gasLimit","type":"uint256[]"},{"internalType":"bytes32[]","name":"extraData","type":"bytes32[]"}],"name":"batchExecute","outputs":[{"internalType":"bool[]","name":"success","type":"bool[]"},{"internalType":"address[]","name":"contractDeployed","type":"address[]"},{"internalType":"bytes32[]","name":"messageId","type":"bytes32[]"}],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"string","name":"salt","type":"string"}],"name":"calculateAddress","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"caller","type":"address"},{"internalType":"uint64[][]","name":"execChainSelectors","type":"uint64[][]"},{"internalType":"string[]","name":"salt","type":"string[]"},{"internalType":"address[]","name":"destination","type":"address[]"},{"internalType":"uint256[]","name":"value","type":"uint256[]"},{"internalType":"bytes[]","name":"data","type":"bytes[]"},{"internalType":"uint256[]","name":"gasLimit","type":"uint256[]"},{"internalType":"bytes32[]","name":"extraData","type":"bytes32[]"}],"name":"calculateBatchExecuteFee","outputs":[{"internalType":"uint256","name":"totalFee","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"string","name":"salt","type":"string"},{"internalType":"bytes","name":"byteCode","type":"bytes"},{"internalType":"bytes32","name":"create2Salt","type":"bytes32"}],"name":"calculateCreate2Address","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"caller","type":"address"},{"internalType":"uint64[]","name":"execChainSelectors","type":"uint64[]"},{"internalType":"string","name":"salt","type":"string"},{"internalType":"address","name":"destination","type":"address"},{"internalType":"uint256","name":"value","type":"uint256"},{"internalType":"bytes","name":"data","type":"bytes"},{"internalType":"uint256","name":"gasLimit","type":"uint256"},{"internalType":"bytes32","name":"extraData","type":"bytes32"}],"name":"calculateExecuteFee","outputs":[{"internalType":"uint256","name":"totalFee","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"components":[{"internalType":"bytes32","name":"messageId","type":"bytes32"},{"internalType":"uint64","name":"sourceChainSelector","type":"uint64"},{"internalType":"bytes","name":"sender","type":"bytes"},{"internalType":"bytes","name":"data","type":"bytes"},{"components":[{"internalType":"address","name":"token","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"internalType":"struct Client.EVMTokenAmount[]","name":"destTokenAmounts","type":"tuple[]"}],"internalType":"struct Client.Any2EVMMessage","name":"message","type":"tuple"}],"name":"ccipReceive","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"controllingChains","outputs":[{"internalType":"uint64","name":"","type":"uint64"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"string","name":"salt","type":"string"}],"name":"deploy","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"deployed","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint64[]","name":"execChainSelectors","type":"uint64[]"},{"internalType":"string","name":"salt","type":"string"},{"internalType":"address","name":"destination","type":"address"},{"internalType":"uint256","name":"value","type":"uint256"},{"internalType":"bytes","name":"data","type":"bytes"},{"internalType":"uint256","name":"gasLimit","type":"uint256"},{"internalType":"bytes32","name":"extraData","type":"bytes32"}],"name":"execute","outputs":[{"internalType":"bool","name":"success","type":"bool"},{"internalType":"address","name":"contractDeployed","type":"address"},{"internalType":"bytes32","name":"messageId","type":"bytes32"}],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"feePercentage","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"getDeployedWallets","outputs":[{"internalType":"address[]","name":"","type":"address[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"}],"name":"getRoleAdmin","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getRouter","outputs":[{"internalType":"address","name":"","type":"address"}],"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":"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":"","type":"address"},{"internalType":"uint256","name":"","type":"uint256"}],"name":"instances","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"relayerChainSelector","outputs":[{"internalType":"uint64","name":"","type":"uint64"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"account","type":"address"}],"name":"renounceRole","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":"","type":"address"}],"name":"salts","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"thisChainSelector","outputs":[{"internalType":"uint64","name":"","type":"uint64"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_feePercentage","type":"uint256"}],"name":"updateFee","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_newRouterAddress","type":"address"}],"name":"updateRouter","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"},{"stateMutability":"payable","type":"receive"}]Contract Creation Code
60806040523480156200001157600080fd5b506040516200436f3803806200436f8339810160408190526200003491620003c0565b876001600160a01b03811662000065576040516335fdcccd60e21b8152600060048201526024015b60405180910390fd5b600080546001600160a01b039092166001600160a01b0319909216919091178155600380546001600160401b0389811668010000000000000000026001600160801b0319909216908b16171790556002829055620000c4908662000302565b620000f07f6c0757dc3e6b28b2580c03fd9e96c274acf4f99d91fbec9b418fa1d70604ff1c8362000302565b6200011c7f5e63ccb182cbf95a0325198ff9446f31e71dd50ca9c82361f97e85a24288d0fa8462000302565b620001487f6345c8a37e6dd89e52f65ade6338347620ff8f8c79b86d67c52eb45b0cf457bf8562000302565b866001600160401b0316866001600160401b03161480620001f557506000546001600160a01b0316600354604051631491520b60e31b8152680100000000000000009091046001600160401b031660048201526001600160a01b03919091169063a48a905890602401602060405180830381865afa158015620001cf573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620001f591906200045f565b6200024f5760405162461bcd60e51b8152602060048201526024808201527f496e76616c69642072656c6179657220636861696e20636f6e6669677572617460448201526334b7b71760e11b60648201526084016200005c565b6001600160a01b0382166200029c5760405162461bcd60e51b81526020600482015260126024820152710466565206d616e61676572206973203078360741b60448201526064016200005c565b6001600160a01b038416620002f45760405162461bcd60e51b815260206004820152601360248201527f43434950206d616e61676572206973203078300000000000000000000000000060448201526064016200005c565b50505050505050506200048a565b60008281526001602090815260408083206001600160a01b038516845290915290205460ff16620003875760008281526001602081815260408084206001600160a01b0386168086529252808420805460ff19169093179092559051339285917f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d9190a45b5050565b80516001600160a01b0381168114620003a357600080fd5b919050565b80516001600160401b0381168114620003a357600080fd5b600080600080600080600080610100898b031215620003de57600080fd5b620003e9896200038b565b9750620003f960208a01620003a8565b96506200040960408a01620003a8565b95506200041960608a016200038b565b94506200042960808a016200038b565b93506200043960a08a016200038b565b92506200044960c08a016200038b565b915060e089015190509295985092959890939650565b6000602082840312156200047257600080fd5b815180151581146200048357600080fd5b9392505050565b613ed5806200049a6000396000f3fe608060405260043610620001f75760003560e01c80638f42671c116200010b578063b23e448011620000a1578063d7bf860a116200006c578063d7bf860a1462000684578063e191233214620006a9578063e6114eb414620006ce578063fe408529146200070b57600080fd5b8063b23e448014620005e1578063c76023161462000615578063c851cc32146200063a578063d547741f146200065f57600080fd5b8063a001ecdd11620000e2578063a001ecdd146200055c578063a217fddf1462000574578063a6ca3e46146200058b578063b0f479a114620005c157600080fd5b80638f42671c14620004dc5780639012c4a8146200051257806391d14854146200053757600080fd5b80632f2ff15d116200018d5780636ac6dfce11620001585780636ac6dfce146200041557806385572ffb146200044f57806385bb392314620004745780638d891b1414620004a857600080fd5b80632f2ff15d146200036457806336568abe14620003895780634a927eb214620003ae57806353a77fa114620003ec57600080fd5b80630c3823a911620001ce5780630c3823a914620002be578063248a9ca314620002e357806329ca78d214620003185780632e1a7d4d146200033d57600080fd5b806301ffc9a7146200020457806305db2f41146200023e57806309c6df00146200028357600080fd5b36620001ff57005b600080fd5b3480156200021157600080fd5b5062000229620002233660046200227f565b62000733565b60405190151581526020015b60405180910390f35b3480156200024b57600080fd5b50620002747f6c0757dc3e6b28b2580c03fd9e96c274acf4f99d91fbec9b418fa1d70604ff1c81565b60405190815260200162000235565b3480156200029057600080fd5b50600354620002a5906001600160401b031681565b6040516001600160401b03909116815260200162000235565b348015620002cb57600080fd5b5062000274620002dd36600462002711565b62000758565b348015620002f057600080fd5b50620002746200030236600462002854565b6000908152600160208190526040909120015490565b3480156200032557600080fd5b5062000274620003373660046200286e565b6200086c565b3480156200034a57600080fd5b50620003626200035c36600462002854565b62000958565b005b3480156200037157600080fd5b50620003626200038336600462002942565b62000a08565b3480156200039657600080fd5b5062000362620003a836600462002942565b62000a37565b348015620003bb57600080fd5b50620003d3620003cd36600462002975565b62000ab5565b6040516001600160a01b03909116815260200162000235565b348015620003f957600080fd5b50600354620002a590600160401b90046001600160401b031681565b3480156200042257600080fd5b50620002a562000434366004620029a4565b6005602052600090815260409020546001600160401b031681565b3480156200045c57600080fd5b50620003626200046e366004620029c4565b62000aee565b3480156200048157600080fd5b506200022962000493366004620029a4565b60046020526000908152604090205460ff1681565b348015620004b557600080fd5b50620004cd620004c7366004620029a4565b62000b35565b60405162000235919062002a47565b348015620004e957600080fd5b50620002747f6345c8a37e6dd89e52f65ade6338347620ff8f8c79b86d67c52eb45b0cf457bf81565b3480156200051f57600080fd5b50620003626200053136600462002854565b62000bad565b3480156200054457600080fd5b50620002296200055636600462002942565b62000c97565b3480156200056957600080fd5b506200027460025481565b3480156200058157600080fd5b5062000274600081565b3480156200059857600080fd5b50620002747f5e63ccb182cbf95a0325198ff9446f31e71dd50ca9c82361f97e85a24288d0fa81565b348015620005ce57600080fd5b506000546001600160a01b0316620003d3565b348015620005ee57600080fd5b506200060662000600366004620029a4565b62000cc2565b60405162000235919062002ab0565b3480156200062257600080fd5b50620003d36200063436600462002ac5565b62000d64565b3480156200064757600080fd5b506200036262000659366004620029a4565b62000d82565b3480156200066c57600080fd5b50620003626200067e36600462002942565b62000e1e565b3480156200069157600080fd5b50620003d3620006a336600462002b05565b62000e48565b348015620006b657600080fd5b50620003d3620006c836600462002b8b565b62000ea0565b620006e5620006df36600462002be0565b62000f19565b6040805193151584526001600160a01b0390921660208401529082015260600162000235565b620007226200071c36600462002ca5565b620010c9565b604051620002359392919062002dd5565b600062000740826200130d565b80620007525750620007528262001344565b92915050565b6000805b88518110156200085f576200083c8a8a838151811062000780576200078062002e6d565b60200260200101518a84815181106200079d576200079d62002e6d565b60200260200101518a8581518110620007ba57620007ba62002e6d565b60200260200101518a8681518110620007d757620007d762002e6d565b60200260200101518a8781518110620007f457620007f462002e6d565b60200260200101518a888151811062000811576200081162002e6d565b60200260200101518a89815181106200082e576200082e62002e6d565b60200260200101516200086c565b62000848908362002e99565b915080620008568162002eaf565b9150506200075c565b5098975050505050505050565b6000805b88518110156200085f57600089828151811062000891576200089162002e6d565b60209081029190910101516003549091506001600160401b0380831691161462000942576000620008c2826200137b565b905060006200091b308e600360009054906101000a90046001600160401b0316868f8f8f8f8f8f604051602001620009039998979695949392919062002ecb565b60405160208183030381529060405260008a620013aa565b905060006200092c838584620014e4565b91506200093c9050818762002e99565b95505050505b50806200094f8162002eaf565b91505062000870565b620009847f5e63ccb182cbf95a0325198ff9446f31e71dd50ca9c82361f97e85a24288d0fa3362000c97565b620009d65760405162461bcd60e51b815260206004820181905260248201527f43616c6c6572206973206e6f7420612068617276657374206d616e616765722e60448201526064015b60405180910390fd5b604051339082156108fc029083906000818181858888f1935050505015801562000a04573d6000803e3d6000fd5b5050565b6000828152600160208190526040909120015462000a2681620015dd565b62000a328383620015e9565b505050565b6001600160a01b038116331462000aa95760405162461bcd60e51b815260206004820152602f60248201527f416363657373436f6e74726f6c3a2063616e206f6e6c792072656e6f756e636560448201526e103937b632b9903337b91039b2b63360891b6064820152608401620009cd565b62000a04828262001657565b6007602052816000526040600020818154811062000ad257600080fd5b6000918252602090912001546001600160a01b03169150829050565b6000546001600160a01b0316331462000b1d576040516335fdcccd60e21b8152336004820152602401620009cd565b62000b3262000b2c8262002fdd565b620016c1565b50565b6001600160a01b03811660009081526007602090815260409182902080548351818402810184019094528084526060939283018282801562000ba157602002820191906000526020600020905b81546001600160a01b0316815260019091019060200180831162000b82575b50505050509050919050565b62000bd97f6c0757dc3e6b28b2580c03fd9e96c274acf4f99d91fbec9b418fa1d70604ff1c3362000c97565b62000c275760405162461bcd60e51b815260206004820152601c60248201527f43616c6c6572206973206e6f74206120666565206d616e616765722e000000006044820152606401620009cd565b606481111562000c925760405162461bcd60e51b815260206004820152602f60248201527f506c6174666f726d206665652069732063617070656420746f2031303025206f60448201526e33103a34329021a1a4a8103332b29760891b6064820152608401620009cd565b600255565b60009182526001602090815260408084206001600160a01b0393909316845291905290205460ff1690565b6006602052600090815260409020805462000cdd9062003097565b80601f016020809104026020016040519081016040528092919081815260200182805462000d0b9062003097565b801562000d5c5780601f1062000d305761010080835404028352916020019162000d5c565b820191906000526020600020905b81548152906001019060200180831162000d3e57829003601f168201915b505050505081565b6003546000906200075290339084906001600160401b031662001883565b62000dae7f6345c8a37e6dd89e52f65ade6338347620ff8f8c79b86d67c52eb45b0cf457bf3362000c97565b62000dfc5760405162461bcd60e51b815260206004820152601d60248201527f43616c6c6572206973206e6f7420612063636970206d616e616765722e0000006044820152606401620009cd565b600080546001600160a01b0319166001600160a01b0392909216919091179055565b6000828152600160208190526040909120015462000e3c81620015dd565b62000a32838362001657565b6000806001600160f81b031962000e60878762000ea0565b84868051906020012060405160200162000e7e9493929190620030d3565b60408051808303601f1901815291905280516020909101209695505050505050565b60008060ff60f81b30858560405160200162000ebe9291906200310c565b6040516020818303038152906040528051906020012062000edf8762001a33565b805160209182012060405162000ef99594939201620030d3565b60408051808303601f190181529190528051602090910120949350505050565b600080806001600160a01b0388161580159062000f3557508315155b15620010045760408051630b135d3f60e11b8152600481018690526024810191909152600060448201523390631626ba7e90606401602060405180830381865afa15801562000f88573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019062000fae919062003146565b6001600160e01b031916631626ba7e60e01b14620010045760405162461bcd60e51b815260206004820152601260248201527124b73b30b634b21039b4b3b730ba3ab9329760711b6044820152606401620009cd565b60005b8a51811015620010bb5760408051610140810182523381526003546001600160401b031660208201528c516200109f928201908e90859081106200104f576200104f62002e6d565b60200260200101516001600160401b031681526020018c81526020018b6001600160a01b031681526020018a81526020018981526020018881526020018781526020016001151581525062001aaa565b9195509350915080620010b28162002eaf565b91505062001007565b509750975097945050505050565b606080606089516001600160401b03811115620010ea57620010ea620022c7565b60405190808252806020026020018201604052801562001114578160200160208202803683370190505b50925089516001600160401b03811115620011335762001133620022c7565b6040519080825280602002602001820160405280156200115d578160200160208202803683370190505b50915089516001600160401b038111156200117c576200117c620022c7565b604051908082528060200260200182016040528015620011a6578160200160208202803683370190505b50905060005b8a51811015620010bb576200128b8b8281518110620011cf57620011cf62002e6d565b60200260200101518b8381518110620011ec57620011ec62002e6d565b60200260200101518b848151811062001209576200120962002e6d565b60200260200101518b858151811062001226576200122662002e6d565b60200260200101518b868151811062001243576200124362002e6d565b60200260200101518b878151811062001260576200126062002e6d565b60200260200101518b88815181106200127d576200127d62002e6d565b602002602001015162000f19565b868481518110620012a057620012a062002e6d565b60200260200101868581518110620012bc57620012bc62002e6d565b60200260200101868681518110620012d857620012d862002e6d565b60209081029190910101929092526001600160a01b039092169052901515905280620013048162002eaf565b915050620011ac565b60006001600160e01b031982166385572ffb60e01b14806200075257506001600160e01b031982166301ffc9a760e01b1492915050565b60006001600160e01b03198216637965db0b60e01b14806200075257506301ffc9a760e01b6001600160e01b031983161462000752565b6000620013888262001d31565b620013a657600354600160401b90046001600160401b031662000752565b5090565b620013e66040518060a0016040528060608152602001606081526020016060815260200160006001600160a01b03168152602001606081525090565b6040805160a0810182526001600160a01b03871660c0808301919091528251808303909101815260e082018352815260208082018790528251600080825291810184529092820190836200145d565b6040805180820190915260008082526020820152815260200190600190039081620014355790505b508152602001856001600160a01b03168152602001620014d86040518060400160405280878152602001600015158152506040805182516024820152602092830151151560448083019190915282518083039091018152606490910190915290810180516001600160e01b03166397a657c960e01b17905290565b90529695505050505050565b6000806000846001600160401b0316866001600160401b0316146200150b5760026200150e565b60015b60ff169050620015266000546001600160a01b031690565b6001600160a01b03166320487ded87866040518363ffffffff1660e01b81526004016200155592919062003166565b602060405180830381865afa15801562001573573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019062001599919062003247565b925080606460025485620015ae919062003261565b620015ba91906200327b565b620015c6908562002e99565b620015d2919062003261565b915050935093915050565b62000b32813362001db4565b620015f5828262000c97565b62000a045760008281526001602081815260408084206001600160a01b0386168086529252808420805460ff19169093179092559051339285917f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d9190a45050565b62001663828262000c97565b1562000a045760008281526001602090815260408083206001600160a01b0385168085529252808320805460ff1916905551339285917ff6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b9190a45050565b306001600160a01b03168160400151806020019051810190620016e59190620032ab565b6001600160a01b031614620017635760405162461bcd60e51b815260206004820152603d60248201527f4f6e6c79206f6666696369616c204b6c61737465724761746577617953696e6760448201527f6c65746f6e2063616e2073656e642043434950206d657373616765732e0000006064820152608401620009cd565b600080600080600080600080600089606001518060200190518101906200178b919062003324565b985098509850985098509850985098509850620018146040518061014001604052808b6001600160a01b031681526020018a6001600160401b03168152602001896001600160401b03168152602001888152602001876001600160a01b031681526020018681526020018581526020018481526020018381526020016000151581525062001aaa565b5050506020808b01518b51604080516001600160a01b03808f1682528a169481019490945283018490526001600160401b03909116917ff5e17f7f42e761b9417b96f6728922396e5f6f9d08346396ccd4f6d80789fcfc9060600160405180910390a350505050505050505050565b60006004600062001895868662000ea0565b6001600160a01b0316815260208101919091526040016000205460ff16156200190f5760405162461bcd60e51b815260206004820152602560248201527f416c7265616479206465706c6f796564212055736520646966666572656e742060448201526473616c742160d81b6064820152608401620009cd565b60006200191c8562001a33565b905060008585604051602001620019359291906200310c565b604051602081830303815290604052805190602001209050808251602084016000f56001600160a01b0381166000908152600460209081526040808320805460ff19166001179055600690915290209093506200199386826200344d565b506001600160a01b038381166000818152600560209081526040808320805467ffffffffffffffff19166001600160401b038b16179055938a168083526007825284832080546001810182559084529282902090920180546001600160a01b031916841790559251918252917f408e677a4fb5b1bbb99ce4cceadc347f28a7ce8480b12a9a1fcb4e7cef3b527d910160405180910390a250509392505050565b606060006040518060200162001a49906200225a565b601f1982820381018352601f9091011660408181526001600160a01b038616602083015291925082910160408051601f198184030181529082905262001a93929160200162003519565b604051602081830303815290604052915050919050565b6003546040820151600091829182916001600160401b0390811691160362001b055762001afa84602001518560000151866060015187608001518860a001518960c001518a610100015162001e18565b909350915062001d2a565b600062001b1685604001516200137b565b9050600062001b83308760000151886020015189604001518a606001518b608001518c60a001518d60c001518e60e001518f610100015160405160200162001b679998979695949392919062002ecb565b60405160208183030381529060405260008960e00151620013aa565b905060008062001b9984896040015185620014e4565b915091508761012001511562001c1a578034101562001c1a5760405162461bcd60e51b815260206004820152603660248201527f457468657220616d6f756e7420746f6f206c6f772e2053656e64206d6f72652060448201527532ba3432b9103a379032bc32b1baba329031b0b6361760511b6064820152608401620009cd565b6000546040516396f4e9f960e01b8152600198506001600160a01b03909116906396f4e9f990849062001c54908890889060040162003166565b60206040518083038185885af115801562001c73573d6000803e3d6000fd5b50505050506040513d601f19601f8201168201806040525081019062001c9a919062003247565b88516040808b01516080808d01516101008e015184516001600160401b038c8116825290941660208501526001600160a01b0391821684860152606084015260009183019190915260a0820187905260c08201869052915193985091169187917faf3488626caa53f1d25b5a3850e43280695530019d11e81740d16209391587da919081900360e00190a3505050505b9193909250565b600080546001600160a01b0316604051631491520b60e31b81526001600160401b03841660048201526001600160a01b03919091169063a48a905890602401602060405180830381865afa15801562001d8e573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906200075291906200355d565b62001dc0828262000c97565b62000a045762001dd08162002087565b62001ddd8360206200209a565b60405160200162001df09291906200357b565b60408051601f198184030181529082905262461bcd60e51b8252620009cd9160040162002ab0565b600080600062001e29898962000ea0565b6001600160a01b03811660009081526004602052604090205490915060ff1662001e615762001e5a89898c62001883565b5062001ee7565b6001600160a01b0381166000908152600560205260409020546001600160401b038b811691161462001ee75760405162461bcd60e51b815260206004820152602860248201527f43616e206f6e6c7920657865637574652066726f6d20636f6e74726f6c6c696e604482015267339031b430b4b71760c11b6064820152608401620009cd565b6000819050896001600160a01b0316826001600160a01b0316638da5cb5b6040518163ffffffff1660e01b8152600401602060405180830381865afa15801562001f35573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019062001f5b9190620032ab565b6001600160a01b03161462001fa35760405162461bcd60e51b815260206004820152600d60248201526c4e6f7420616e206f776e65722160981b6044820152606401620009cd565b604051637c5c4e6360e11b81526001600160a01b0382169063f8b89cc69062001fd7908b908b908b908b90600401620035f4565b60408051808303816000875af115801562001ff6573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906200201c91906200362e565b6040805183151581526001600160a01b038084166020830152918101899052929650909450808a1691848216918d16907f164339a296eae5d2a4502454bf4bfcd3a03e70fc5b9116b91eb4b055e22a5aa59060600160405180910390a4505097509795505050505050565b6060620007526001600160a01b03831660145b60606000620020ab83600262003261565b620020b890600262002e99565b6001600160401b03811115620020d257620020d2620022c7565b6040519080825280601f01601f191660200182016040528015620020fd576020820181803683370190505b509050600360fc1b816000815181106200211b576200211b62002e6d565b60200101906001600160f81b031916908160001a905350600f60fb1b816001815181106200214d576200214d62002e6d565b60200101906001600160f81b031916908160001a90535060006200217384600262003261565b6200218090600162002e99565b90505b600181111562002202576f181899199a1a9b1b9c1cb0b131b232b360811b85600f1660108110620021b857620021b862002e6d565b1a60f81b828281518110620021d157620021d162002e6d565b60200101906001600160f81b031916908160001a90535060049490941c93620021fa816200365f565b905062002183565b508315620022535760405162461bcd60e51b815260206004820181905260248201527f537472696e67733a20686578206c656e67746820696e73756666696369656e746044820152606401620009cd565b9392505050565b610826806200367a83390190565b6001600160e01b03198116811462000b3257600080fd5b6000602082840312156200229257600080fd5b8135620022538162002268565b6001600160a01b038116811462000b3257600080fd5b8035620022c2816200229f565b919050565b634e487b7160e01b600052604160045260246000fd5b604080519081016001600160401b0381118282101715620023025762002302620022c7565b60405290565b60405160a081016001600160401b0381118282101715620023025762002302620022c7565b604051601f8201601f191681016001600160401b0381118282101715620023585762002358620022c7565b604052919050565b60006001600160401b038211156200237c576200237c620022c7565b5060051b60200190565b6001600160401b038116811462000b3257600080fd5b8035620022c28162002386565b600082601f830112620023bb57600080fd5b81356020620023d4620023ce8362002360565b6200232d565b82815260059290921b84018101918181019086841115620023f457600080fd5b8286015b848110156200241c5780356200240e8162002386565b8352918301918301620023f8565b509695505050505050565b600082601f8301126200243957600080fd5b813560206200244c620023ce8362002360565b82815260059290921b840181019181810190868411156200246c57600080fd5b8286015b848110156200241c5780356001600160401b03811115620024915760008081fd5b620024a18986838b0101620023a9565b84525091830191830162002470565b60006001600160401b03821115620024cc57620024cc620022c7565b50601f01601f191660200190565b600082601f830112620024ec57600080fd5b8135620024fd620023ce82620024b0565b8181528460208386010111156200251357600080fd5b816020850160208301376000918101602001919091529392505050565b600082601f8301126200254257600080fd5b8135602062002555620023ce8362002360565b82815260059290921b840181019181810190868411156200257557600080fd5b8286015b848110156200241c5780356001600160401b038111156200259a5760008081fd5b620025aa8986838b0101620024da565b84525091830191830162002579565b600082601f830112620025cb57600080fd5b81356020620025de620023ce8362002360565b82815260059290921b84018101918181019086841115620025fe57600080fd5b8286015b848110156200241c57803562002618816200229f565b835291830191830162002602565b600082601f8301126200263857600080fd5b813560206200264b620023ce8362002360565b82815260059290921b840181019181810190868411156200266b57600080fd5b8286015b848110156200241c57803583529183019183016200266f565b600082601f8301126200269a57600080fd5b81356020620026ad620023ce8362002360565b82815260059290921b84018101918181019086841115620026cd57600080fd5b8286015b848110156200241c5780356001600160401b03811115620026f25760008081fd5b620027028986838b0101620024da565b845250918301918301620026d1565b600080600080600080600080610100898b0312156200272f57600080fd5b6200273a89620022b5565b975060208901356001600160401b03808211156200275757600080fd5b620027658c838d0162002427565b985060408b01359150808211156200277c57600080fd5b6200278a8c838d0162002530565b975060608b0135915080821115620027a157600080fd5b620027af8c838d01620025b9565b965060808b0135915080821115620027c657600080fd5b620027d48c838d0162002626565b955060a08b0135915080821115620027eb57600080fd5b620027f98c838d0162002688565b945060c08b01359150808211156200281057600080fd5b6200281e8c838d0162002626565b935060e08b01359150808211156200283557600080fd5b50620028448b828c0162002626565b9150509295985092959890939650565b6000602082840312156200286757600080fd5b5035919050565b600080600080600080600080610100898b0312156200288c57600080fd5b6200289789620022b5565b975060208901356001600160401b0380821115620028b457600080fd5b620028c28c838d01620023a9565b985060408b0135915080821115620028d957600080fd5b620028e78c838d01620024da565b9750620028f760608c01620022b5565b965060808b0135955060a08b01359150808211156200291557600080fd5b50620029248b828c01620024da565b93505060c0890135915060e089013590509295985092959890939650565b600080604083850312156200295657600080fd5b8235915060208301356200296a816200229f565b809150509250929050565b600080604083850312156200298957600080fd5b823562002996816200229f565b946020939093013593505050565b600060208284031215620029b757600080fd5b813562002253816200229f565b600060208284031215620029d757600080fd5b81356001600160401b03811115620029ee57600080fd5b820160a081850312156200225357600080fd5b600081518084526020808501945080840160005b8381101562002a3c5781516001600160a01b03168752958201959082019060010162002a15565b509495945050505050565b60208152600062002253602083018462002a01565b60005b8381101562002a7957818101518382015260200162002a5f565b50506000910152565b6000815180845262002a9c81602086016020860162002a5c565b601f01601f19169290920160200192915050565b60208152600062002253602083018462002a82565b60006020828403121562002ad857600080fd5b81356001600160401b0381111562002aef57600080fd5b62002afd84828501620024da565b949350505050565b6000806000806080858703121562002b1c57600080fd5b843562002b29816200229f565b935060208501356001600160401b038082111562002b4657600080fd5b62002b5488838901620024da565b9450604087013591508082111562002b6b57600080fd5b5062002b7a87828801620024da565b949793965093946060013593505050565b6000806040838503121562002b9f57600080fd5b823562002bac816200229f565b915060208301356001600160401b0381111562002bc857600080fd5b62002bd685828601620024da565b9150509250929050565b600080600080600080600060e0888a03121562002bfc57600080fd5b87356001600160401b038082111562002c1457600080fd5b62002c228b838c01620023a9565b985060208a013591508082111562002c3957600080fd5b62002c478b838c01620024da565b975060408a0135915062002c5b826200229f565b909550606089013594506080890135908082111562002c7957600080fd5b5062002c888a828b01620024da565b93505060a0880135915060c0880135905092959891949750929550565b600080600080600080600060e0888a03121562002cc157600080fd5b87356001600160401b038082111562002cd957600080fd5b62002ce78b838c0162002427565b985060208a013591508082111562002cfe57600080fd5b62002d0c8b838c0162002530565b975060408a013591508082111562002d2357600080fd5b62002d318b838c01620025b9565b965060608a013591508082111562002d4857600080fd5b62002d568b838c0162002626565b955060808a013591508082111562002d6d57600080fd5b62002d7b8b838c0162002688565b945060a08a013591508082111562002d9257600080fd5b62002da08b838c0162002626565b935060c08a013591508082111562002db757600080fd5b5062002dc68a828b0162002626565b91505092959891949750929550565b606080825284519082018190526000906020906080840190828801845b8281101562002e1257815115158452928401929084019060010162002df2565b5050508381038285015262002e28818762002a01565b8481036040860152855180825283870192509083019060005b8181101562002e5f5783518352928401929184019160010162002e41565b509098975050505050505050565b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052601160045260246000fd5b8082018082111562000752576200075262002e83565b60006001820162002ec45762002ec462002e83565b5060010190565b6001600160a01b038a811682526001600160401b038a81166020840152891660408301526101206060830181905260009162002f0a8483018b62002a82565b91508089166080850152508660a084015282810360c084015262002f2f818762002a82565b60e084019590955250506101000152979650505050505050565b600082601f83011262002f5b57600080fd5b8135602062002f6e620023ce8362002360565b82815260069290921b8401810191818101908684111562002f8e57600080fd5b8286015b848110156200241c576040818903121562002fad5760008081fd5b62002fb7620022dd565b813562002fc4816200229f565b8152818501358582015283529183019160400162002f92565b600060a0823603121562002ff057600080fd5b62002ffa62002308565b823581526200300c602084016200239c565b602082015260408301356001600160401b03808211156200302c57600080fd5b6200303a36838701620024da565b604084015260608501359150808211156200305457600080fd5b6200306236838701620024da565b606084015260808501359150808211156200307c57600080fd5b506200308b3682860162002f49565b60808301525092915050565b600181811c90821680620030ac57607f821691505b602082108103620030cd57634e487b7160e01b600052602260045260246000fd5b50919050565b6001600160f81b031994909416845260609290921b6bffffffffffffffffffffffff191660018401526015830152603582015260550190565b6bffffffffffffffffffffffff198360601b168152600082516200313881601485016020870162002a5c565b919091016014019392505050565b6000602082840312156200315957600080fd5b8151620022538162002268565b600060406001600160401b038516835260208181850152845160a0838601526200319460e086018262002a82565b905081860151603f1980878403016060880152620031b3838362002a82565b88860151888203830160808a01528051808352908601945060009350908501905b808410156200320857845180516001600160a01b0316835286015186830152938501936001939093019290860190620031d4565b5060608901516001600160a01b031660a08901526080890151888203830160c08a0152955062003239818762002a82565b9a9950505050505050505050565b6000602082840312156200325a57600080fd5b5051919050565b808202811582820484141762000752576200075262002e83565b6000826200329957634e487b7160e01b600052601260045260246000fd5b500490565b8051620022c2816200229f565b600060208284031215620032be57600080fd5b815162002253816200229f565b8051620022c28162002386565b600082601f830112620032ea57600080fd5b8151620032fb620023ce82620024b0565b8181528460208386010111156200331157600080fd5b62002afd82602083016020870162002a5c565b60008060008060008060008060006101208a8c0312156200334457600080fd5b895162003351816200229f565b60208b0151909950620033648162002386565b97506200337460408b01620032cb565b965060608a01516001600160401b03808211156200339157600080fd5b6200339f8d838e01620032d8565b9750620033af60808d016200329e565b965060a08c0151955060c08c0151915080821115620033cd57600080fd5b50620033dc8c828d01620032d8565b93505060e08a015191506101008a015190509295985092959850929598565b601f82111562000a3257600081815260208120601f850160051c81016020861015620034245750805b601f850160051c820191505b81811015620034455782815560010162003430565b505050505050565b81516001600160401b03811115620034695762003469620022c7565b62003481816200347a845462003097565b84620033fb565b602080601f831160018114620034b95760008415620034a05750858301515b600019600386901b1c1916600185901b17855562003445565b600085815260208120601f198616915b82811015620034ea57888601518255948401946001909101908401620034c9565b5085821015620035095787850151600019600388901b60f8161c191681555b5050505050600190811b01905550565b600083516200352d81846020880162002a5c565b8351908301906200354381836020880162002a5c565b01949350505050565b80518015158114620022c257600080fd5b6000602082840312156200357057600080fd5b62002253826200354c565b7f416363657373436f6e74726f6c3a206163636f756e7420000000000000000000815260008351620035b581601785016020880162002a5c565b7001034b99036b4b9b9b4b733903937b6329607d1b6017918401918201528351620035e881602884016020880162002a5c565b01602801949350505050565b60018060a01b03851681528360208201526080604082015260006200361d608083018562002a82565b905082606083015295945050505050565b600080604083850312156200364257600080fd5b6200364d836200354c565b915060208301516200296a816200229f565b60008162003671576200367162002e83565b50600019019056fe608060405234801561001057600080fd5b5060405161082638038061082683398101604081905261002f916100a9565b61003833610059565b600180546001600160a01b0319163317905561005381610059565b506100d9565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b6000602082840312156100bb57600080fd5b81516001600160a01b03811681146100d257600080fd5b9392505050565b61073e806100e86000396000f3fe60806040526004361061007f5760003560e01c80638da5cb5b1161004e5780638da5cb5b14610158578063b61d27f614610176578063f2fde38b146101b5578063f8b89cc6146101d557600080fd5b80631626ba7e1461008b5780632422224e146100c9578063361f107414610109578063715018a61461014157600080fd5b3661008657005b600080fd5b34801561009757600080fd5b506100ab6100a63660046105bb565b6101f5565b6040516001600160e01b031990911681526020015b60405180910390f35b3480156100d557600080fd5b506100f96100e4366004610602565b60026020526000908152604090205460ff1681565b60405190151581526020016100c0565b34801561011557600080fd5b50600154610129906001600160a01b031681565b6040516001600160a01b0390911681526020016100c0565b34801561014d57600080fd5b5061015661021c565b005b34801561016457600080fd5b506000546001600160a01b0316610129565b34801561018257600080fd5b50610196610191366004610637565b610230565b6040805192151583526001600160a01b039091166020830152016100c0565b3480156101c157600080fd5b506101566101d036600461068e565b6102c2565b3480156101e157600080fd5b506101966101f03660046106a9565b61033b565b60008281526002602052604081205460ff16156102165750630b135d3f60e11b5b92915050565b6102246103aa565b61022e6000610404565b565b60015460009081906001600160a01b031633148061025857506000546001600160a01b031633145b6102995760405162461bcd60e51b815260206004820152600d60248201526c4e6f7420616e206f776e65722160981b60448201526064015b60405180910390fd5b82516040516000919060208601838284838b8d6187965a03f19960009950975050505050505050565b6102ca6103aa565b6001600160a01b03811661032f5760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610290565b61033881610404565b50565b6000806001600160a01b03861661037657826000036103695760016103608686610454565b915091506103a1565b60016103608686866104b2565b8215610396576000838152600260205260409020805460ff191660011790555b610360868686610230565b94509492505050565b6000546001600160a01b0316331461022e5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610290565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b600081516020830184f090506001600160a01b0381166102165760405162461bcd60e51b815260206004820152601960248201527810dbdd5b19081b9bdd0819195c1b1bde4818dbdb9d1c9858dd603a1b6044820152606401610290565b60008183518460200186f590506001600160a01b0381166105115760405162461bcd60e51b815260206004820152601960248201527810dbdd5b19081b9bdd0819195c1b1bde4818dbdb9d1c9858dd603a1b6044820152606401610290565b9392505050565b634e487b7160e01b600052604160045260246000fd5b600082601f83011261053f57600080fd5b813567ffffffffffffffff8082111561055a5761055a610518565b604051601f8301601f19908116603f0116810190828211818310171561058257610582610518565b8160405283815286602085880101111561059b57600080fd5b836020870160208301376000602085830101528094505050505092915050565b600080604083850312156105ce57600080fd5b82359150602083013567ffffffffffffffff8111156105ec57600080fd5b6105f88582860161052e565b9150509250929050565b60006020828403121561061457600080fd5b5035919050565b80356001600160a01b038116811461063257600080fd5b919050565b60008060006060848603121561064c57600080fd5b6106558461061b565b925060208401359150604084013567ffffffffffffffff81111561067857600080fd5b6106848682870161052e565b9150509250925092565b6000602082840312156106a057600080fd5b6105118261061b565b600080600080608085870312156106bf57600080fd5b6106c88561061b565b935060208501359250604085013567ffffffffffffffff8111156106eb57600080fd5b6106f78782880161052e565b94979396509394606001359350505056fea2646970667358221220e2b31b94af507bab95c4b1ccb782f9f42cd3b276ae3cbb934710dc22d31b8b8764736f6c63430008130033a26469706673582212200322c853cf2005918976253b0b9e50d25fdcf53549046b221b62a4959d5bb9a164736f6c63430008130033000000000000000000000000e561d5e02207fb5eb32cca20a699e0d8919a147600000000000000000000000000000000000000000000000045849994fc9c7b1500000000000000000000000000000000000000000000000045849994fc9c7b15000000000000000000000000cab92d81c9c60955794c09da80e4bae939ac7017000000000000000000000000cab92d81c9c60955794c09da80e4bae939ac7017000000000000000000000000cab92d81c9c60955794c09da80e4bae939ac7017000000000000000000000000cab92d81c9c60955794c09da80e4bae939ac70170000000000000000000000000000000000000000000000000000000000000019
Deployed Bytecode
0x608060405260043610620001f75760003560e01c80638f42671c116200010b578063b23e448011620000a1578063d7bf860a116200006c578063d7bf860a1462000684578063e191233214620006a9578063e6114eb414620006ce578063fe408529146200070b57600080fd5b8063b23e448014620005e1578063c76023161462000615578063c851cc32146200063a578063d547741f146200065f57600080fd5b8063a001ecdd11620000e2578063a001ecdd146200055c578063a217fddf1462000574578063a6ca3e46146200058b578063b0f479a114620005c157600080fd5b80638f42671c14620004dc5780639012c4a8146200051257806391d14854146200053757600080fd5b80632f2ff15d116200018d5780636ac6dfce11620001585780636ac6dfce146200041557806385572ffb146200044f57806385bb392314620004745780638d891b1414620004a857600080fd5b80632f2ff15d146200036457806336568abe14620003895780634a927eb214620003ae57806353a77fa114620003ec57600080fd5b80630c3823a911620001ce5780630c3823a914620002be578063248a9ca314620002e357806329ca78d214620003185780632e1a7d4d146200033d57600080fd5b806301ffc9a7146200020457806305db2f41146200023e57806309c6df00146200028357600080fd5b36620001ff57005b600080fd5b3480156200021157600080fd5b5062000229620002233660046200227f565b62000733565b60405190151581526020015b60405180910390f35b3480156200024b57600080fd5b50620002747f6c0757dc3e6b28b2580c03fd9e96c274acf4f99d91fbec9b418fa1d70604ff1c81565b60405190815260200162000235565b3480156200029057600080fd5b50600354620002a5906001600160401b031681565b6040516001600160401b03909116815260200162000235565b348015620002cb57600080fd5b5062000274620002dd36600462002711565b62000758565b348015620002f057600080fd5b50620002746200030236600462002854565b6000908152600160208190526040909120015490565b3480156200032557600080fd5b5062000274620003373660046200286e565b6200086c565b3480156200034a57600080fd5b50620003626200035c36600462002854565b62000958565b005b3480156200037157600080fd5b50620003626200038336600462002942565b62000a08565b3480156200039657600080fd5b5062000362620003a836600462002942565b62000a37565b348015620003bb57600080fd5b50620003d3620003cd36600462002975565b62000ab5565b6040516001600160a01b03909116815260200162000235565b348015620003f957600080fd5b50600354620002a590600160401b90046001600160401b031681565b3480156200042257600080fd5b50620002a562000434366004620029a4565b6005602052600090815260409020546001600160401b031681565b3480156200045c57600080fd5b50620003626200046e366004620029c4565b62000aee565b3480156200048157600080fd5b506200022962000493366004620029a4565b60046020526000908152604090205460ff1681565b348015620004b557600080fd5b50620004cd620004c7366004620029a4565b62000b35565b60405162000235919062002a47565b348015620004e957600080fd5b50620002747f6345c8a37e6dd89e52f65ade6338347620ff8f8c79b86d67c52eb45b0cf457bf81565b3480156200051f57600080fd5b50620003626200053136600462002854565b62000bad565b3480156200054457600080fd5b50620002296200055636600462002942565b62000c97565b3480156200056957600080fd5b506200027460025481565b3480156200058157600080fd5b5062000274600081565b3480156200059857600080fd5b50620002747f5e63ccb182cbf95a0325198ff9446f31e71dd50ca9c82361f97e85a24288d0fa81565b348015620005ce57600080fd5b506000546001600160a01b0316620003d3565b348015620005ee57600080fd5b506200060662000600366004620029a4565b62000cc2565b60405162000235919062002ab0565b3480156200062257600080fd5b50620003d36200063436600462002ac5565b62000d64565b3480156200064757600080fd5b506200036262000659366004620029a4565b62000d82565b3480156200066c57600080fd5b50620003626200067e36600462002942565b62000e1e565b3480156200069157600080fd5b50620003d3620006a336600462002b05565b62000e48565b348015620006b657600080fd5b50620003d3620006c836600462002b8b565b62000ea0565b620006e5620006df36600462002be0565b62000f19565b6040805193151584526001600160a01b0390921660208401529082015260600162000235565b620007226200071c36600462002ca5565b620010c9565b604051620002359392919062002dd5565b600062000740826200130d565b80620007525750620007528262001344565b92915050565b6000805b88518110156200085f576200083c8a8a838151811062000780576200078062002e6d565b60200260200101518a84815181106200079d576200079d62002e6d565b60200260200101518a8581518110620007ba57620007ba62002e6d565b60200260200101518a8681518110620007d757620007d762002e6d565b60200260200101518a8781518110620007f457620007f462002e6d565b60200260200101518a888151811062000811576200081162002e6d565b60200260200101518a89815181106200082e576200082e62002e6d565b60200260200101516200086c565b62000848908362002e99565b915080620008568162002eaf565b9150506200075c565b5098975050505050505050565b6000805b88518110156200085f57600089828151811062000891576200089162002e6d565b60209081029190910101516003549091506001600160401b0380831691161462000942576000620008c2826200137b565b905060006200091b308e600360009054906101000a90046001600160401b0316868f8f8f8f8f8f604051602001620009039998979695949392919062002ecb565b60405160208183030381529060405260008a620013aa565b905060006200092c838584620014e4565b91506200093c9050818762002e99565b95505050505b50806200094f8162002eaf565b91505062000870565b620009847f5e63ccb182cbf95a0325198ff9446f31e71dd50ca9c82361f97e85a24288d0fa3362000c97565b620009d65760405162461bcd60e51b815260206004820181905260248201527f43616c6c6572206973206e6f7420612068617276657374206d616e616765722e60448201526064015b60405180910390fd5b604051339082156108fc029083906000818181858888f1935050505015801562000a04573d6000803e3d6000fd5b5050565b6000828152600160208190526040909120015462000a2681620015dd565b62000a328383620015e9565b505050565b6001600160a01b038116331462000aa95760405162461bcd60e51b815260206004820152602f60248201527f416363657373436f6e74726f6c3a2063616e206f6e6c792072656e6f756e636560448201526e103937b632b9903337b91039b2b63360891b6064820152608401620009cd565b62000a04828262001657565b6007602052816000526040600020818154811062000ad257600080fd5b6000918252602090912001546001600160a01b03169150829050565b6000546001600160a01b0316331462000b1d576040516335fdcccd60e21b8152336004820152602401620009cd565b62000b3262000b2c8262002fdd565b620016c1565b50565b6001600160a01b03811660009081526007602090815260409182902080548351818402810184019094528084526060939283018282801562000ba157602002820191906000526020600020905b81546001600160a01b0316815260019091019060200180831162000b82575b50505050509050919050565b62000bd97f6c0757dc3e6b28b2580c03fd9e96c274acf4f99d91fbec9b418fa1d70604ff1c3362000c97565b62000c275760405162461bcd60e51b815260206004820152601c60248201527f43616c6c6572206973206e6f74206120666565206d616e616765722e000000006044820152606401620009cd565b606481111562000c925760405162461bcd60e51b815260206004820152602f60248201527f506c6174666f726d206665652069732063617070656420746f2031303025206f60448201526e33103a34329021a1a4a8103332b29760891b6064820152608401620009cd565b600255565b60009182526001602090815260408084206001600160a01b0393909316845291905290205460ff1690565b6006602052600090815260409020805462000cdd9062003097565b80601f016020809104026020016040519081016040528092919081815260200182805462000d0b9062003097565b801562000d5c5780601f1062000d305761010080835404028352916020019162000d5c565b820191906000526020600020905b81548152906001019060200180831162000d3e57829003601f168201915b505050505081565b6003546000906200075290339084906001600160401b031662001883565b62000dae7f6345c8a37e6dd89e52f65ade6338347620ff8f8c79b86d67c52eb45b0cf457bf3362000c97565b62000dfc5760405162461bcd60e51b815260206004820152601d60248201527f43616c6c6572206973206e6f7420612063636970206d616e616765722e0000006044820152606401620009cd565b600080546001600160a01b0319166001600160a01b0392909216919091179055565b6000828152600160208190526040909120015462000e3c81620015dd565b62000a32838362001657565b6000806001600160f81b031962000e60878762000ea0565b84868051906020012060405160200162000e7e9493929190620030d3565b60408051808303601f1901815291905280516020909101209695505050505050565b60008060ff60f81b30858560405160200162000ebe9291906200310c565b6040516020818303038152906040528051906020012062000edf8762001a33565b805160209182012060405162000ef99594939201620030d3565b60408051808303601f190181529190528051602090910120949350505050565b600080806001600160a01b0388161580159062000f3557508315155b15620010045760408051630b135d3f60e11b8152600481018690526024810191909152600060448201523390631626ba7e90606401602060405180830381865afa15801562000f88573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019062000fae919062003146565b6001600160e01b031916631626ba7e60e01b14620010045760405162461bcd60e51b815260206004820152601260248201527124b73b30b634b21039b4b3b730ba3ab9329760711b6044820152606401620009cd565b60005b8a51811015620010bb5760408051610140810182523381526003546001600160401b031660208201528c516200109f928201908e90859081106200104f576200104f62002e6d565b60200260200101516001600160401b031681526020018c81526020018b6001600160a01b031681526020018a81526020018981526020018881526020018781526020016001151581525062001aaa565b9195509350915080620010b28162002eaf565b91505062001007565b509750975097945050505050565b606080606089516001600160401b03811115620010ea57620010ea620022c7565b60405190808252806020026020018201604052801562001114578160200160208202803683370190505b50925089516001600160401b03811115620011335762001133620022c7565b6040519080825280602002602001820160405280156200115d578160200160208202803683370190505b50915089516001600160401b038111156200117c576200117c620022c7565b604051908082528060200260200182016040528015620011a6578160200160208202803683370190505b50905060005b8a51811015620010bb576200128b8b8281518110620011cf57620011cf62002e6d565b60200260200101518b8381518110620011ec57620011ec62002e6d565b60200260200101518b848151811062001209576200120962002e6d565b60200260200101518b858151811062001226576200122662002e6d565b60200260200101518b868151811062001243576200124362002e6d565b60200260200101518b878151811062001260576200126062002e6d565b60200260200101518b88815181106200127d576200127d62002e6d565b602002602001015162000f19565b868481518110620012a057620012a062002e6d565b60200260200101868581518110620012bc57620012bc62002e6d565b60200260200101868681518110620012d857620012d862002e6d565b60209081029190910101929092526001600160a01b039092169052901515905280620013048162002eaf565b915050620011ac565b60006001600160e01b031982166385572ffb60e01b14806200075257506001600160e01b031982166301ffc9a760e01b1492915050565b60006001600160e01b03198216637965db0b60e01b14806200075257506301ffc9a760e01b6001600160e01b031983161462000752565b6000620013888262001d31565b620013a657600354600160401b90046001600160401b031662000752565b5090565b620013e66040518060a0016040528060608152602001606081526020016060815260200160006001600160a01b03168152602001606081525090565b6040805160a0810182526001600160a01b03871660c0808301919091528251808303909101815260e082018352815260208082018790528251600080825291810184529092820190836200145d565b6040805180820190915260008082526020820152815260200190600190039081620014355790505b508152602001856001600160a01b03168152602001620014d86040518060400160405280878152602001600015158152506040805182516024820152602092830151151560448083019190915282518083039091018152606490910190915290810180516001600160e01b03166397a657c960e01b17905290565b90529695505050505050565b6000806000846001600160401b0316866001600160401b0316146200150b5760026200150e565b60015b60ff169050620015266000546001600160a01b031690565b6001600160a01b03166320487ded87866040518363ffffffff1660e01b81526004016200155592919062003166565b602060405180830381865afa15801562001573573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019062001599919062003247565b925080606460025485620015ae919062003261565b620015ba91906200327b565b620015c6908562002e99565b620015d2919062003261565b915050935093915050565b62000b32813362001db4565b620015f5828262000c97565b62000a045760008281526001602081815260408084206001600160a01b0386168086529252808420805460ff19169093179092559051339285917f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d9190a45050565b62001663828262000c97565b1562000a045760008281526001602090815260408083206001600160a01b0385168085529252808320805460ff1916905551339285917ff6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b9190a45050565b306001600160a01b03168160400151806020019051810190620016e59190620032ab565b6001600160a01b031614620017635760405162461bcd60e51b815260206004820152603d60248201527f4f6e6c79206f6666696369616c204b6c61737465724761746577617953696e6760448201527f6c65746f6e2063616e2073656e642043434950206d657373616765732e0000006064820152608401620009cd565b600080600080600080600080600089606001518060200190518101906200178b919062003324565b985098509850985098509850985098509850620018146040518061014001604052808b6001600160a01b031681526020018a6001600160401b03168152602001896001600160401b03168152602001888152602001876001600160a01b031681526020018681526020018581526020018481526020018381526020016000151581525062001aaa565b5050506020808b01518b51604080516001600160a01b03808f1682528a169481019490945283018490526001600160401b03909116917ff5e17f7f42e761b9417b96f6728922396e5f6f9d08346396ccd4f6d80789fcfc9060600160405180910390a350505050505050505050565b60006004600062001895868662000ea0565b6001600160a01b0316815260208101919091526040016000205460ff16156200190f5760405162461bcd60e51b815260206004820152602560248201527f416c7265616479206465706c6f796564212055736520646966666572656e742060448201526473616c742160d81b6064820152608401620009cd565b60006200191c8562001a33565b905060008585604051602001620019359291906200310c565b604051602081830303815290604052805190602001209050808251602084016000f56001600160a01b0381166000908152600460209081526040808320805460ff19166001179055600690915290209093506200199386826200344d565b506001600160a01b038381166000818152600560209081526040808320805467ffffffffffffffff19166001600160401b038b16179055938a168083526007825284832080546001810182559084529282902090920180546001600160a01b031916841790559251918252917f408e677a4fb5b1bbb99ce4cceadc347f28a7ce8480b12a9a1fcb4e7cef3b527d910160405180910390a250509392505050565b606060006040518060200162001a49906200225a565b601f1982820381018352601f9091011660408181526001600160a01b038616602083015291925082910160408051601f198184030181529082905262001a93929160200162003519565b604051602081830303815290604052915050919050565b6003546040820151600091829182916001600160401b0390811691160362001b055762001afa84602001518560000151866060015187608001518860a001518960c001518a610100015162001e18565b909350915062001d2a565b600062001b1685604001516200137b565b9050600062001b83308760000151886020015189604001518a606001518b608001518c60a001518d60c001518e60e001518f610100015160405160200162001b679998979695949392919062002ecb565b60405160208183030381529060405260008960e00151620013aa565b905060008062001b9984896040015185620014e4565b915091508761012001511562001c1a578034101562001c1a5760405162461bcd60e51b815260206004820152603660248201527f457468657220616d6f756e7420746f6f206c6f772e2053656e64206d6f72652060448201527532ba3432b9103a379032bc32b1baba329031b0b6361760511b6064820152608401620009cd565b6000546040516396f4e9f960e01b8152600198506001600160a01b03909116906396f4e9f990849062001c54908890889060040162003166565b60206040518083038185885af115801562001c73573d6000803e3d6000fd5b50505050506040513d601f19601f8201168201806040525081019062001c9a919062003247565b88516040808b01516080808d01516101008e015184516001600160401b038c8116825290941660208501526001600160a01b0391821684860152606084015260009183019190915260a0820187905260c08201869052915193985091169187917faf3488626caa53f1d25b5a3850e43280695530019d11e81740d16209391587da919081900360e00190a3505050505b9193909250565b600080546001600160a01b0316604051631491520b60e31b81526001600160401b03841660048201526001600160a01b03919091169063a48a905890602401602060405180830381865afa15801562001d8e573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906200075291906200355d565b62001dc0828262000c97565b62000a045762001dd08162002087565b62001ddd8360206200209a565b60405160200162001df09291906200357b565b60408051601f198184030181529082905262461bcd60e51b8252620009cd9160040162002ab0565b600080600062001e29898962000ea0565b6001600160a01b03811660009081526004602052604090205490915060ff1662001e615762001e5a89898c62001883565b5062001ee7565b6001600160a01b0381166000908152600560205260409020546001600160401b038b811691161462001ee75760405162461bcd60e51b815260206004820152602860248201527f43616e206f6e6c7920657865637574652066726f6d20636f6e74726f6c6c696e604482015267339031b430b4b71760c11b6064820152608401620009cd565b6000819050896001600160a01b0316826001600160a01b0316638da5cb5b6040518163ffffffff1660e01b8152600401602060405180830381865afa15801562001f35573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019062001f5b9190620032ab565b6001600160a01b03161462001fa35760405162461bcd60e51b815260206004820152600d60248201526c4e6f7420616e206f776e65722160981b6044820152606401620009cd565b604051637c5c4e6360e11b81526001600160a01b0382169063f8b89cc69062001fd7908b908b908b908b90600401620035f4565b60408051808303816000875af115801562001ff6573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906200201c91906200362e565b6040805183151581526001600160a01b038084166020830152918101899052929650909450808a1691848216918d16907f164339a296eae5d2a4502454bf4bfcd3a03e70fc5b9116b91eb4b055e22a5aa59060600160405180910390a4505097509795505050505050565b6060620007526001600160a01b03831660145b60606000620020ab83600262003261565b620020b890600262002e99565b6001600160401b03811115620020d257620020d2620022c7565b6040519080825280601f01601f191660200182016040528015620020fd576020820181803683370190505b509050600360fc1b816000815181106200211b576200211b62002e6d565b60200101906001600160f81b031916908160001a905350600f60fb1b816001815181106200214d576200214d62002e6d565b60200101906001600160f81b031916908160001a90535060006200217384600262003261565b6200218090600162002e99565b90505b600181111562002202576f181899199a1a9b1b9c1cb0b131b232b360811b85600f1660108110620021b857620021b862002e6d565b1a60f81b828281518110620021d157620021d162002e6d565b60200101906001600160f81b031916908160001a90535060049490941c93620021fa816200365f565b905062002183565b508315620022535760405162461bcd60e51b815260206004820181905260248201527f537472696e67733a20686578206c656e67746820696e73756666696369656e746044820152606401620009cd565b9392505050565b610826806200367a83390190565b6001600160e01b03198116811462000b3257600080fd5b6000602082840312156200229257600080fd5b8135620022538162002268565b6001600160a01b038116811462000b3257600080fd5b8035620022c2816200229f565b919050565b634e487b7160e01b600052604160045260246000fd5b604080519081016001600160401b0381118282101715620023025762002302620022c7565b60405290565b60405160a081016001600160401b0381118282101715620023025762002302620022c7565b604051601f8201601f191681016001600160401b0381118282101715620023585762002358620022c7565b604052919050565b60006001600160401b038211156200237c576200237c620022c7565b5060051b60200190565b6001600160401b038116811462000b3257600080fd5b8035620022c28162002386565b600082601f830112620023bb57600080fd5b81356020620023d4620023ce8362002360565b6200232d565b82815260059290921b84018101918181019086841115620023f457600080fd5b8286015b848110156200241c5780356200240e8162002386565b8352918301918301620023f8565b509695505050505050565b600082601f8301126200243957600080fd5b813560206200244c620023ce8362002360565b82815260059290921b840181019181810190868411156200246c57600080fd5b8286015b848110156200241c5780356001600160401b03811115620024915760008081fd5b620024a18986838b0101620023a9565b84525091830191830162002470565b60006001600160401b03821115620024cc57620024cc620022c7565b50601f01601f191660200190565b600082601f830112620024ec57600080fd5b8135620024fd620023ce82620024b0565b8181528460208386010111156200251357600080fd5b816020850160208301376000918101602001919091529392505050565b600082601f8301126200254257600080fd5b8135602062002555620023ce8362002360565b82815260059290921b840181019181810190868411156200257557600080fd5b8286015b848110156200241c5780356001600160401b038111156200259a5760008081fd5b620025aa8986838b0101620024da565b84525091830191830162002579565b600082601f830112620025cb57600080fd5b81356020620025de620023ce8362002360565b82815260059290921b84018101918181019086841115620025fe57600080fd5b8286015b848110156200241c57803562002618816200229f565b835291830191830162002602565b600082601f8301126200263857600080fd5b813560206200264b620023ce8362002360565b82815260059290921b840181019181810190868411156200266b57600080fd5b8286015b848110156200241c57803583529183019183016200266f565b600082601f8301126200269a57600080fd5b81356020620026ad620023ce8362002360565b82815260059290921b84018101918181019086841115620026cd57600080fd5b8286015b848110156200241c5780356001600160401b03811115620026f25760008081fd5b620027028986838b0101620024da565b845250918301918301620026d1565b600080600080600080600080610100898b0312156200272f57600080fd5b6200273a89620022b5565b975060208901356001600160401b03808211156200275757600080fd5b620027658c838d0162002427565b985060408b01359150808211156200277c57600080fd5b6200278a8c838d0162002530565b975060608b0135915080821115620027a157600080fd5b620027af8c838d01620025b9565b965060808b0135915080821115620027c657600080fd5b620027d48c838d0162002626565b955060a08b0135915080821115620027eb57600080fd5b620027f98c838d0162002688565b945060c08b01359150808211156200281057600080fd5b6200281e8c838d0162002626565b935060e08b01359150808211156200283557600080fd5b50620028448b828c0162002626565b9150509295985092959890939650565b6000602082840312156200286757600080fd5b5035919050565b600080600080600080600080610100898b0312156200288c57600080fd5b6200289789620022b5565b975060208901356001600160401b0380821115620028b457600080fd5b620028c28c838d01620023a9565b985060408b0135915080821115620028d957600080fd5b620028e78c838d01620024da565b9750620028f760608c01620022b5565b965060808b0135955060a08b01359150808211156200291557600080fd5b50620029248b828c01620024da565b93505060c0890135915060e089013590509295985092959890939650565b600080604083850312156200295657600080fd5b8235915060208301356200296a816200229f565b809150509250929050565b600080604083850312156200298957600080fd5b823562002996816200229f565b946020939093013593505050565b600060208284031215620029b757600080fd5b813562002253816200229f565b600060208284031215620029d757600080fd5b81356001600160401b03811115620029ee57600080fd5b820160a081850312156200225357600080fd5b600081518084526020808501945080840160005b8381101562002a3c5781516001600160a01b03168752958201959082019060010162002a15565b509495945050505050565b60208152600062002253602083018462002a01565b60005b8381101562002a7957818101518382015260200162002a5f565b50506000910152565b6000815180845262002a9c81602086016020860162002a5c565b601f01601f19169290920160200192915050565b60208152600062002253602083018462002a82565b60006020828403121562002ad857600080fd5b81356001600160401b0381111562002aef57600080fd5b62002afd84828501620024da565b949350505050565b6000806000806080858703121562002b1c57600080fd5b843562002b29816200229f565b935060208501356001600160401b038082111562002b4657600080fd5b62002b5488838901620024da565b9450604087013591508082111562002b6b57600080fd5b5062002b7a87828801620024da565b949793965093946060013593505050565b6000806040838503121562002b9f57600080fd5b823562002bac816200229f565b915060208301356001600160401b0381111562002bc857600080fd5b62002bd685828601620024da565b9150509250929050565b600080600080600080600060e0888a03121562002bfc57600080fd5b87356001600160401b038082111562002c1457600080fd5b62002c228b838c01620023a9565b985060208a013591508082111562002c3957600080fd5b62002c478b838c01620024da565b975060408a0135915062002c5b826200229f565b909550606089013594506080890135908082111562002c7957600080fd5b5062002c888a828b01620024da565b93505060a0880135915060c0880135905092959891949750929550565b600080600080600080600060e0888a03121562002cc157600080fd5b87356001600160401b038082111562002cd957600080fd5b62002ce78b838c0162002427565b985060208a013591508082111562002cfe57600080fd5b62002d0c8b838c0162002530565b975060408a013591508082111562002d2357600080fd5b62002d318b838c01620025b9565b965060608a013591508082111562002d4857600080fd5b62002d568b838c0162002626565b955060808a013591508082111562002d6d57600080fd5b62002d7b8b838c0162002688565b945060a08a013591508082111562002d9257600080fd5b62002da08b838c0162002626565b935060c08a013591508082111562002db757600080fd5b5062002dc68a828b0162002626565b91505092959891949750929550565b606080825284519082018190526000906020906080840190828801845b8281101562002e1257815115158452928401929084019060010162002df2565b5050508381038285015262002e28818762002a01565b8481036040860152855180825283870192509083019060005b8181101562002e5f5783518352928401929184019160010162002e41565b509098975050505050505050565b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052601160045260246000fd5b8082018082111562000752576200075262002e83565b60006001820162002ec45762002ec462002e83565b5060010190565b6001600160a01b038a811682526001600160401b038a81166020840152891660408301526101206060830181905260009162002f0a8483018b62002a82565b91508089166080850152508660a084015282810360c084015262002f2f818762002a82565b60e084019590955250506101000152979650505050505050565b600082601f83011262002f5b57600080fd5b8135602062002f6e620023ce8362002360565b82815260069290921b8401810191818101908684111562002f8e57600080fd5b8286015b848110156200241c576040818903121562002fad5760008081fd5b62002fb7620022dd565b813562002fc4816200229f565b8152818501358582015283529183019160400162002f92565b600060a0823603121562002ff057600080fd5b62002ffa62002308565b823581526200300c602084016200239c565b602082015260408301356001600160401b03808211156200302c57600080fd5b6200303a36838701620024da565b604084015260608501359150808211156200305457600080fd5b6200306236838701620024da565b606084015260808501359150808211156200307c57600080fd5b506200308b3682860162002f49565b60808301525092915050565b600181811c90821680620030ac57607f821691505b602082108103620030cd57634e487b7160e01b600052602260045260246000fd5b50919050565b6001600160f81b031994909416845260609290921b6bffffffffffffffffffffffff191660018401526015830152603582015260550190565b6bffffffffffffffffffffffff198360601b168152600082516200313881601485016020870162002a5c565b919091016014019392505050565b6000602082840312156200315957600080fd5b8151620022538162002268565b600060406001600160401b038516835260208181850152845160a0838601526200319460e086018262002a82565b905081860151603f1980878403016060880152620031b3838362002a82565b88860151888203830160808a01528051808352908601945060009350908501905b808410156200320857845180516001600160a01b0316835286015186830152938501936001939093019290860190620031d4565b5060608901516001600160a01b031660a08901526080890151888203830160c08a0152955062003239818762002a82565b9a9950505050505050505050565b6000602082840312156200325a57600080fd5b5051919050565b808202811582820484141762000752576200075262002e83565b6000826200329957634e487b7160e01b600052601260045260246000fd5b500490565b8051620022c2816200229f565b600060208284031215620032be57600080fd5b815162002253816200229f565b8051620022c28162002386565b600082601f830112620032ea57600080fd5b8151620032fb620023ce82620024b0565b8181528460208386010111156200331157600080fd5b62002afd82602083016020870162002a5c565b60008060008060008060008060006101208a8c0312156200334457600080fd5b895162003351816200229f565b60208b0151909950620033648162002386565b97506200337460408b01620032cb565b965060608a01516001600160401b03808211156200339157600080fd5b6200339f8d838e01620032d8565b9750620033af60808d016200329e565b965060a08c0151955060c08c0151915080821115620033cd57600080fd5b50620033dc8c828d01620032d8565b93505060e08a015191506101008a015190509295985092959850929598565b601f82111562000a3257600081815260208120601f850160051c81016020861015620034245750805b601f850160051c820191505b81811015620034455782815560010162003430565b505050505050565b81516001600160401b03811115620034695762003469620022c7565b62003481816200347a845462003097565b84620033fb565b602080601f831160018114620034b95760008415620034a05750858301515b600019600386901b1c1916600185901b17855562003445565b600085815260208120601f198616915b82811015620034ea57888601518255948401946001909101908401620034c9565b5085821015620035095787850151600019600388901b60f8161c191681555b5050505050600190811b01905550565b600083516200352d81846020880162002a5c565b8351908301906200354381836020880162002a5c565b01949350505050565b80518015158114620022c257600080fd5b6000602082840312156200357057600080fd5b62002253826200354c565b7f416363657373436f6e74726f6c3a206163636f756e7420000000000000000000815260008351620035b581601785016020880162002a5c565b7001034b99036b4b9b9b4b733903937b6329607d1b6017918401918201528351620035e881602884016020880162002a5c565b01602801949350505050565b60018060a01b03851681528360208201526080604082015260006200361d608083018562002a82565b905082606083015295945050505050565b600080604083850312156200364257600080fd5b6200364d836200354c565b915060208301516200296a816200229f565b60008162003671576200367162002e83565b50600019019056fe608060405234801561001057600080fd5b5060405161082638038061082683398101604081905261002f916100a9565b61003833610059565b600180546001600160a01b0319163317905561005381610059565b506100d9565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b6000602082840312156100bb57600080fd5b81516001600160a01b03811681146100d257600080fd5b9392505050565b61073e806100e86000396000f3fe60806040526004361061007f5760003560e01c80638da5cb5b1161004e5780638da5cb5b14610158578063b61d27f614610176578063f2fde38b146101b5578063f8b89cc6146101d557600080fd5b80631626ba7e1461008b5780632422224e146100c9578063361f107414610109578063715018a61461014157600080fd5b3661008657005b600080fd5b34801561009757600080fd5b506100ab6100a63660046105bb565b6101f5565b6040516001600160e01b031990911681526020015b60405180910390f35b3480156100d557600080fd5b506100f96100e4366004610602565b60026020526000908152604090205460ff1681565b60405190151581526020016100c0565b34801561011557600080fd5b50600154610129906001600160a01b031681565b6040516001600160a01b0390911681526020016100c0565b34801561014d57600080fd5b5061015661021c565b005b34801561016457600080fd5b506000546001600160a01b0316610129565b34801561018257600080fd5b50610196610191366004610637565b610230565b6040805192151583526001600160a01b039091166020830152016100c0565b3480156101c157600080fd5b506101566101d036600461068e565b6102c2565b3480156101e157600080fd5b506101966101f03660046106a9565b61033b565b60008281526002602052604081205460ff16156102165750630b135d3f60e11b5b92915050565b6102246103aa565b61022e6000610404565b565b60015460009081906001600160a01b031633148061025857506000546001600160a01b031633145b6102995760405162461bcd60e51b815260206004820152600d60248201526c4e6f7420616e206f776e65722160981b60448201526064015b60405180910390fd5b82516040516000919060208601838284838b8d6187965a03f19960009950975050505050505050565b6102ca6103aa565b6001600160a01b03811661032f5760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610290565b61033881610404565b50565b6000806001600160a01b03861661037657826000036103695760016103608686610454565b915091506103a1565b60016103608686866104b2565b8215610396576000838152600260205260409020805460ff191660011790555b610360868686610230565b94509492505050565b6000546001600160a01b0316331461022e5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610290565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b600081516020830184f090506001600160a01b0381166102165760405162461bcd60e51b815260206004820152601960248201527810dbdd5b19081b9bdd0819195c1b1bde4818dbdb9d1c9858dd603a1b6044820152606401610290565b60008183518460200186f590506001600160a01b0381166105115760405162461bcd60e51b815260206004820152601960248201527810dbdd5b19081b9bdd0819195c1b1bde4818dbdb9d1c9858dd603a1b6044820152606401610290565b9392505050565b634e487b7160e01b600052604160045260246000fd5b600082601f83011261053f57600080fd5b813567ffffffffffffffff8082111561055a5761055a610518565b604051601f8301601f19908116603f0116810190828211818310171561058257610582610518565b8160405283815286602085880101111561059b57600080fd5b836020870160208301376000602085830101528094505050505092915050565b600080604083850312156105ce57600080fd5b82359150602083013567ffffffffffffffff8111156105ec57600080fd5b6105f88582860161052e565b9150509250929050565b60006020828403121561061457600080fd5b5035919050565b80356001600160a01b038116811461063257600080fd5b919050565b60008060006060848603121561064c57600080fd5b6106558461061b565b925060208401359150604084013567ffffffffffffffff81111561067857600080fd5b6106848682870161052e565b9150509250925092565b6000602082840312156106a057600080fd5b6105118261061b565b600080600080608085870312156106bf57600080fd5b6106c88561061b565b935060208501359250604085013567ffffffffffffffff8111156106eb57600080fd5b6106f78782880161052e565b94979396509394606001359350505056fea2646970667358221220e2b31b94af507bab95c4b1ccb782f9f42cd3b276ae3cbb934710dc22d31b8b8764736f6c63430008130033a26469706673582212200322c853cf2005918976253b0b9e50d25fdcf53549046b221b62a4959d5bb9a164736f6c63430008130033
Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)
000000000000000000000000e561d5e02207fb5eb32cca20a699e0d8919a147600000000000000000000000000000000000000000000000045849994fc9c7b1500000000000000000000000000000000000000000000000045849994fc9c7b15000000000000000000000000cab92d81c9c60955794c09da80e4bae939ac7017000000000000000000000000cab92d81c9c60955794c09da80e4bae939ac7017000000000000000000000000cab92d81c9c60955794c09da80e4bae939ac7017000000000000000000000000cab92d81c9c60955794c09da80e4bae939ac70170000000000000000000000000000000000000000000000000000000000000019
-----Decoded View---------------
Arg [0] : _sourceRouter (address): 0xE561d5E02207fb5eB32cca20a699E0d8919a1476
Arg [1] : _thisChainSelector (uint64): 5009297550715157269
Arg [2] : _relayerChainSelector (uint64): 5009297550715157269
Arg [3] : _roleManager (address): 0xCab92D81C9c60955794C09Da80e4bAE939AC7017
Arg [4] : _ccipManager (address): 0xCab92D81C9c60955794C09Da80e4bAE939AC7017
Arg [5] : _harvestManager (address): 0xCab92D81C9c60955794C09Da80e4bAE939AC7017
Arg [6] : _feeManager (address): 0xCab92D81C9c60955794C09Da80e4bAE939AC7017
Arg [7] : _feePercentage (uint256): 25
-----Encoded View---------------
8 Constructor Arguments found :
Arg [0] : 000000000000000000000000e561d5e02207fb5eb32cca20a699e0d8919a1476
Arg [1] : 00000000000000000000000000000000000000000000000045849994fc9c7b15
Arg [2] : 00000000000000000000000000000000000000000000000045849994fc9c7b15
Arg [3] : 000000000000000000000000cab92d81c9c60955794c09da80e4bae939ac7017
Arg [4] : 000000000000000000000000cab92d81c9c60955794c09da80e4bae939ac7017
Arg [5] : 000000000000000000000000cab92d81c9c60955794c09da80e4bae939ac7017
Arg [6] : 000000000000000000000000cab92d81c9c60955794c09da80e4bae939ac7017
Arg [7] : 0000000000000000000000000000000000000000000000000000000000000019
Deployed Bytecode Sourcemap
48259:19184:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;67195:245;;;;;;;;;;-1:-1:-1;67195:245:0;;;;;:::i;:::-;;:::i;:::-;;;565:14:1;;558:22;540:41;;528:2;513:18;67195:245:0;;;;;;;;48358:72;;;;;;;;;;;;48401:29;48358:72;;;;;738:25:1;;;726:2;711:18;48358:72:0;592:177:1;48710:31:0;;;;;;;;;;-1:-1:-1;48710:31:0;;;;-1:-1:-1;;;;;48710:31:0;;;;;;-1:-1:-1;;;;;936:31:1;;;918:50;;906:2;891:18;48710:31:0;774:200:1;54649:754:0;;;;;;;;;;-1:-1:-1;54649:754:0;;;;;:::i;:::-;;:::i;32998:131::-;;;;;;;;;;-1:-1:-1;32998:131:0;;;;;:::i;:::-;33072:7;33099:12;;;:6;:12;;;;;;;;:22;;;32998:131;55411:1273;;;;;;;;;;-1:-1:-1;55411:1273:0;;;;;:::i;:::-;;:::i;51143:195::-;;;;;;;;;;-1:-1:-1;51143:195:0;;;;;:::i;:::-;;:::i;:::-;;33439:147;;;;;;;;;;-1:-1:-1;33439:147:0;;;;;:::i;:::-;;:::i;34583:218::-;;;;;;;;;;-1:-1:-1;34583:218:0;;;;;:::i;:::-;;:::i;49108:47::-;;;;;;;;;;-1:-1:-1;49108:47:0;;;;;:::i;:::-;;:::i;:::-;;;-1:-1:-1;;;;;13343:32:1;;;13325:51;;13313:2;13298:18;49108:47:0;13179:203:1;48774:34:0;;;;;;;;;;-1:-1:-1;48774:34:0;;;;-1:-1:-1;;;48774:34:0;;-1:-1:-1;;;;;48774:34:0;;;48934:52;;;;;;;;;;-1:-1:-1;48934:52:0;;;;;:::i;:::-;;;;;;;;;;;;-1:-1:-1;;;;;48934:52:0;;;4117:132;;;;;;;;;;-1:-1:-1;4117:132:0;;;;;:::i;:::-;;:::i;48886:41::-;;;;;;;;;;-1:-1:-1;48886:41:0;;;;;:::i;:::-;;;;;;;;;;;;;;;;54506:135;;;;;;;;;;-1:-1:-1;54506:135:0;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;48524:74::-;;;;;;;;;;;;48568:30;48524:74;;50853:282;;;;;;;;;;-1:-1:-1;50853:282:0;;;;;:::i;:::-;;:::i;31471:147::-;;;;;;;;;;-1:-1:-1;31471:147:0;;;;;:::i;:::-;;:::i;48607:28::-;;;;;;;;;;;;;;;;30576:49;;;;;;;;;;-1:-1:-1;30576:49:0;30621:4;30576:49;;48437:80;;;;;;;;;;;;48484:33;48437:80;;4673:88;;;;;;;;;;-1:-1:-1;4715:7:0;4746:8;-1:-1:-1;;;;;4746:8:0;4673:88;;49035:40;;;;;;;;;;-1:-1:-1;49035:40:0;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;50273:139::-;;;;;;;;;;-1:-1:-1;50273:139:0;;;;;:::i;:::-;;:::i;51814:196::-;;;;;;;;;;-1:-1:-1;51814:196:0;;;;;:::i;:::-;;:::i;33879:149::-;;;;;;;;;;-1:-1:-1;33879:149:0;;;;;:::i;:::-;;:::i;57066:494::-;;;;;;;;;;-1:-1:-1;57066:494:0;;;;;:::i;:::-;;:::i;56692:366::-;;;;;;;;;;-1:-1:-1;56692:366:0;;;;;:::i;:::-;;:::i;53064:1377::-;;;;;;:::i;:::-;;:::i;:::-;;;;18399:14:1;;18392:22;18374:41;;-1:-1:-1;;;;;18451:32:1;;;18446:2;18431:18;;18424:60;18500:18;;;18493:34;18362:2;18347:18;53064:1377:0;18178:355:1;52076:980:0;;;;;;:::i;:::-;;:::i;:::-;;;;;;;;;:::i;67195:245::-;67317:4;67341:43;67372:11;67341:30;:43::i;:::-;:91;;;;67388:44;67420:11;67388:31;:44::i;:::-;67334:98;67195:245;-1:-1:-1;;67195:245:0:o;54649:754::-;55000:16;;55029:367;55053:18;:25;55049:1;:29;55029:367;;;55112:272;55150:6;55175:18;55194:1;55175:21;;;;;;;;:::i;:::-;;;;;;;55215:4;55220:1;55215:7;;;;;;;;:::i;:::-;;;;;;;55241:11;55253:1;55241:14;;;;;;;;:::i;:::-;;;;;;;55274:5;55280:1;55274:8;;;;;;;;:::i;:::-;;;;;;;55301:4;55306:1;55301:7;;;;;;;;:::i;:::-;;;;;;;55327:8;55336:1;55327:11;;;;;;;;:::i;:::-;;;;;;;55357:9;55367:1;55357:12;;;;;;;;:::i;:::-;;;;;;;55112:19;:272::i;:::-;55100:284;;;;:::i;:::-;;-1:-1:-1;55080:3:0;;;;:::i;:::-;;;;55029:367;;;;54649:754;;;;;;;;;;:::o;55411:1273::-;55713:16;;55742:935;55766:18;:25;55762:1;:29;55742:935;;;55813:24;55840:18;55859:1;55840:21;;;;;;;;:::i;:::-;;;;;;;;;;;55901:17;;55840:21;;-1:-1:-1;;;;;;55880:38:0;;;55901:17;;55880:38;55876:790;;55982:24;56009:40;56031:17;56009:21;:40::i;:::-;55982:67;;56201:43;56247:268;56295:4;56334:6;56342:17;;;;;;;;;-1:-1:-1;;;;;56342:17:0;56361;56380:4;56386:11;56399:5;56406:4;56412:8;56422:9;56323:109;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;56463:1;56488:8;56247:17;:268::i;:::-;56201:314;;56539:11;56554:62;56563:17;56582;56601:14;56554:8;:62::i;:::-;56536:80;-1:-1:-1;56635:15:0;;-1:-1:-1;56536:80:0;56635:15;;:::i;:::-;;;55920:746;;;55876:790;-1:-1:-1;55793:3:0;;;;:::i;:::-;;;;55742:935;;51143:195;51205:41;48484:33;51235:10;51205:7;:41::i;:::-;51197:86;;;;-1:-1:-1;;;51197:86:0;;23452:2:1;51197:86:0;;;23434:21:1;;;23471:18;;;23464:30;23530:34;23510:18;;;23503:62;23582:18;;51197:86:0;;;;;;;;;51294:36;;51302:10;;51294:36;;;;;51323:6;;51294:36;;;;51323:6;51302:10;51294:36;;;;;;;;;;;;;;;;;;;;;51143:195;:::o;33439:147::-;33072:7;33099:12;;;:6;:12;;;;;;;;:22;;31067:16;31078:4;31067:10;:16::i;:::-;33553:25:::1;33564:4;33570:7;33553:10;:25::i;:::-;33439:147:::0;;;:::o;34583:218::-;-1:-1:-1;;;;;34679:23:0;;10477:10;34679:23;34671:83;;;;-1:-1:-1;;;34671:83:0;;23813:2:1;34671:83:0;;;23795:21:1;23852:2;23832:18;;;23825:30;23891:34;23871:18;;;23864:62;-1:-1:-1;;;23942:18:1;;;23935:45;23997:19;;34671:83:0;23611:411:1;34671:83:0;34767:26;34779:4;34785:7;34767:11;:26::i;49108:47::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;49108:47:0;;-1:-1:-1;49108:47:0;;-1:-1:-1;49108:47:0:o;4117:132::-;4921:8;;-1:-1:-1;;;;;4921:8:0;4899:10;:31;4895:69;;4939:25;;-1:-1:-1;;;4939:25:0;;4953:10;4939:25;;;13325:51:1;13298:18;;4939:25:0;13179:203:1;4895:69:0;4222:21:::1;;4235:7:::0;4222:21:::1;:::i;:::-;:12;:21::i;:::-;4117:132:::0;:::o;54506:135::-;-1:-1:-1;;;;;54617:16:0;;;;;;:9;:16;;;;;;;;;54610:23;;;;;;;;;;;;;;;;;54581:16;;54610:23;;;54617:16;54610:23;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;54610:23:0;;;;;;;;;;;;;;;;;;;;;;;54506:135;;;:::o;50853:282::-;50924:37;48401:29;50950:10;50924:7;:37::i;:::-;50916:78;;;;-1:-1:-1;;;50916:78:0;;26287:2:1;50916:78:0;;;26269:21:1;26326:2;26306:18;;;26299:30;26365;26345:18;;;26338:58;26413:18;;50916:78:0;26085:352:1;50916:78:0;51031:3;51013:14;:21;;51005:81;;;;-1:-1:-1;;;51005:81:0;;26644:2:1;51005:81:0;;;26626:21:1;26683:2;26663:18;;;26656:30;26722:34;26702:18;;;26695:62;-1:-1:-1;;;26773:18:1;;;26766:45;26828:19;;51005:81:0;26442:411:1;51005:81:0;51097:13;:30;50853:282::o;31471:147::-;31557:4;31581:12;;;:6;:12;;;;;;;;-1:-1:-1;;;;;31581:29:0;;;;;;;;;;;;;;;31471:147::o;49035:40::-;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;50273:139::-;50386:17;;50334:7;;50360:44;;50368:10;;50380:4;;-1:-1:-1;;;;;50386:17:0;50360:7;:44::i;51814:196::-;51891:38;48568:30;51918:10;51891:7;:38::i;:::-;51883:80;;;;-1:-1:-1;;;51883:80:0;;27445:2:1;51883:80:0;;;27427:21:1;27484:2;27464:18;;;27457:30;27523:31;27503:18;;;27496:59;27572:18;;51883:80:0;27243:353:1;51883:80:0;51974:8;:28;;-1:-1:-1;;;;;;51974:28:0;-1:-1:-1;;;;;51974:28:0;;;;;;;;;;51814:196::o;33879:149::-;33072:7;33099:12;;;:6;:12;;;;;;;;:22;;31067:16;31078:4;31067:10;:16::i;:::-;33994:26:::1;34006:4;34012:7;33994:11;:26::i;57066:494::-:0;57253:7;;-1:-1:-1;;;;;;57379:29:0;57396:5;57403:4;57379:16;:29::i;:::-;57427:11;57467:8;57457:19;;;;;;57313:178;;;;;;;;;;;:::i;:::-;;;;;;;-1:-1:-1;;57313:178:0;;;;;;57289:213;;57313:178;57289:213;;;;;57066:494;-1:-1:-1;;;;;;57066:494:0:o;56692:366::-;56783:7;56803:12;56884:4;56877:12;;56899:4;56933:5;56940:4;56916:29;;;;;;;;;:::i;:::-;;;;;;;;;;;;;56906:40;;;;;;56958:19;56971:5;56958:12;:19::i;:::-;56948:30;;;;;;;56842:151;;;;;;;;;:::i;:::-;;;;;;;-1:-1:-1;;56842:151:0;;;;;;56818:186;;56842:151;56818:186;;;;;56692:366;-1:-1:-1;;;;56692:366:0:o;53064:1377::-;53332:12;;;-1:-1:-1;;;;;53416:25:0;;;;;;:44;;-1:-1:-1;53445:15:0;;;53416:44;53412:489;;;53626:113;;;-1:-1:-1;;;53626:113:0;;;;;28673:25:1;;;28714:18;;;28707:30;;;;-1:-1:-1;28753:18:1;;;28746:29;53635:10:0;;53626:37;;28792:18:1;;53626:113:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;;;;;53626:127:0;;53743:10;53626:127;;;53600:289;;;;-1:-1:-1;;;53600:289:0;;29277:2:1;53600:289:0;;;29259:21:1;29316:2;29296:18;;;29289:30;-1:-1:-1;;;29335:18:1;;;29328:48;29393:18;;53600:289:0;29075:342:1;53600:289:0;53918:9;53913:521;53937:18;:25;53933:1;:29;53913:521;;;54052:355;;;;;;;;54088:10;54052:355;;54121:17;;-1:-1:-1;;;;;54121:17:0;54052:355;;;;54161:21;;54025:397;;54052:355;;;54161:18;;54180:1;;54161:21;;;;;;:::i;:::-;;;;;;;-1:-1:-1;;;;;54052:355:0;;;;;54205:4;54052:355;;;;54232:11;-1:-1:-1;;;;;54052:355:0;;;;;54266:5;54052:355;;;;54294:4;54052:355;;;;54321:8;54052:355;;;;54352:9;54052:355;;;;54384:4;54052:355;;;;;54025:8;:397::i;:::-;53984:438;;-1:-1:-1;53984:438:0;-1:-1:-1;53984:438:0;-1:-1:-1;53964:3:0;;;;:::i;:::-;;;;53913:521;;;;53064:1377;;;;;;;;;;;:::o;52076:980::-;52393:21;52416:33;52451:26;52511:18;:25;-1:-1:-1;;;;;52500:37:0;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;52500:37:0;;52490:47;;52581:18;:25;-1:-1:-1;;;;;52567:40:0;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;52567:40:0;;52548:59;;52644:18;:25;-1:-1:-1;;;;;52630:40:0;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;52630:40:0;;52618:52;;52686:9;52681:368;52705:18;:25;52701:1;:29;52681:368;;;52802:235;52828:18;52847:1;52828:21;;;;;;;;:::i;:::-;;;;;;;52868:4;52873:1;52868:7;;;;;;;;:::i;:::-;;;;;;;52894:11;52906:1;52894:14;;;;;;;;:::i;:::-;;;;;;;52927:5;52933:1;52927:8;;;;;;;;:::i;:::-;;;;;;;52954:4;52959:1;52954:7;;;;;;;;:::i;:::-;;;;;;;52980:8;52989:1;52980:11;;;;;;;;:::i;:::-;;;;;;;53010:9;53020:1;53010:12;;;;;;;;:::i;:::-;;;;;;;52802:7;:235::i;:::-;52753:7;52761:1;52753:10;;;;;;;;:::i;:::-;;;;;;52765:16;52782:1;52765:19;;;;;;;;:::i;:::-;;;;;;52786:9;52796:1;52786:12;;;;;;;;:::i;:::-;;;;;;;;;;52752:285;;;;-1:-1:-1;;;;;52752:285:0;;;;;;;;;;52732:3;;;;:::i;:::-;;;;52681:368;;3857:211;3942:4;-1:-1:-1;;;;;;3962:56:0;;-1:-1:-1;;;3962:56:0;;:100;;-1:-1:-1;;;;;;;4022:40:0;;-1:-1:-1;;;4022:40:0;3955:107;3857:211;-1:-1:-1;;3857:211:0:o;31175:204::-;31260:4;-1:-1:-1;;;;;;31284:47:0;;-1:-1:-1;;;31284:47:0;;:87;;-1:-1:-1;;;;;;;;;;11491:40:0;;;31335:36;11382:157;66664:206;66744:15;66783:36;66801:17;66783;:36::i;:::-;:79;;66842:20;;-1:-1:-1;;;66842:20:0;;-1:-1:-1;;;;;66842:20:0;66783:79;;;-1:-1:-1;66822:17:0;66664:206::o;63339:1062::-;63519:28;-1:-1:-1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;63519:28:0;63721:640;;;;;;;;-1:-1:-1;;;;;13343:32:1;;63768:21:0;;;;13325:51:1;;;;63768:21:0;;;;;;;;;;13298:18:1;;;63768:21:0;;63721:640;;63768:21;63721:640;;;;;;63901:30;;-1:-1:-1;63901:30:0;;;;;;;;-1:-1:-1;;63721:640:0;;;-1:-1:-1;63901:30:0;;;-1:-1:-1;;;;;;;;;;;;;;;;;63901:30:0;;;;;;;;;;;;;;;;63721:640;;;;64333:16;-1:-1:-1;;;;;63721:640:0;;;;;64002:203;64131:59;;;;;;;;64164:9;64131:59;;;;64183:5;64131:59;;;;;1717:56;;;39674:13:1;;1717:56:0;;;39656:32:1;39758:4;39746:17;;;39740:24;39733:32;39726:40;39704:20;;;;39697:70;;;;1717:56:0;;;;;;;;;;39629:18:1;;;;1717:56:0;;;;;;;;-1:-1:-1;;;;;1717:56:0;-1:-1:-1;;;1717:56:0;;;;1607:172;64002:203;63721:640;;63675:686;63339:1062;-1:-1:-1;;;;;;63339:1062:0:o;65966:508::-;66131:15;66148:16;66229:22;66276:17;-1:-1:-1;;;;;66255:38:0;:17;-1:-1:-1;;;;;66255:38:0;;66254:48;;66301:1;66254:48;;;66297:1;66254:48;66229:73;;;;66337:11;4715:7;4746:8;-1:-1:-1;;;;;4746:8:0;;4673:88;66337:11;-1:-1:-1;;;;;66323:33:0;;66357:17;66376:7;66323:61;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;66313:71;;66452:14;66444:3;66428:13;;66418:7;:23;;;;:::i;:::-;:29;;;;:::i;:::-;66407:41;;:7;:41;:::i;:::-;66406:60;;;;:::i;:::-;66395:71;;66166:308;65966:508;;;;;;:::o;31922:105::-;31989:30;32000:4;10477:10;31989;:30::i;36180:238::-;36264:22;36272:4;36278:7;36264;:22::i;:::-;36259:152;;36303:12;;;;36335:4;36303:12;;;;;;;;-1:-1:-1;;;;;36303:29:0;;;;;;;;;;:36;;-1:-1:-1;;36303:36:0;;;;;;;36359:40;;10477:10;;36303:12;;36359:40;;36303:12;36359:40;36180:238;;:::o;36598:239::-;36682:22;36690:4;36696:7;36682;:22::i;:::-;36678:152;;;36753:5;36721:12;;;:6;:12;;;;;;;;-1:-1:-1;;;;;36721:29:0;;;;;;;;;;:37;;-1:-1:-1;;36721:37:0;;;36778:40;10477:10;;36721:12;;36778:40;;36753:5;36778:40;36598:239;;:::o;64452:1506::-;64665:4;-1:-1:-1;;;;;64609:61:0;64620:14;:21;;;64609:44;;;;;;;;;;;;:::i;:::-;-1:-1:-1;;;;;64609:61:0;;64587:172;;;;-1:-1:-1;;;64587:172:0;;32232:2:1;64587:172:0;;;32214:21:1;32271:2;32251:18;;;32244:30;32310:34;32290:18;;;32283:62;32381:31;32361:18;;;32354:59;32430:19;;64587:172:0;32030:425:1;64587:172:0;64787:14;64816:26;64857:24;64896:18;64929:19;64963:13;64991:17;65023:16;65054:17;65110:14;:19;;;65085:314;;;;;;;;;;;;:::i;:::-;64772:627;;;;;;;;;;;;;;;;;;65412:340;65435:306;;;;;;;;65467:6;-1:-1:-1;;;;;65435:306:0;;;;;65492:19;-1:-1:-1;;;;;65435:306:0;;;;;65530:17;-1:-1:-1;;;;;65435:306:0;;;;;65566:4;65435:306;;;;65589:11;-1:-1:-1;;;;;65435:306:0;;;;;65619:5;65435:306;;;;65643:4;65435:306;;;;65666:8;65435:306;;;;65693:9;65435:306;;;;65721:5;65435:306;;;;;65412:8;:340::i;:::-;-1:-1:-1;;;65834:34:0;;;;;65795:24;;65770:180;;;-1:-1:-1;;;;;34514:15:1;;;34496:34;;34566:15;;34546:18;;;34539:43;;;;34598:18;;34591:34;;;-1:-1:-1;;;;;65770:180:0;;;;;;34446:2:1;34431:18;65770:180:0;;;;;;;64576:1382;;;;;;;;;64452:1506;:::o;61675:785::-;61806:22;61850:8;:39;61859:29;61876:5;61883:4;61859:16;:29::i;:::-;-1:-1:-1;;;;;61850:39:0;;;;;;;;;;;;-1:-1:-1;61850:39:0;;;;61849:40;61841:90;;;;-1:-1:-1;;;61841:90:0;;34838:2:1;61841:90:0;;;34820:21:1;34877:2;34857:18;;;34850:30;34916:34;34896:18;;;34889:62;-1:-1:-1;;;34967:18:1;;;34960:35;35012:19;;61841:90:0;34636:401:1;61841:90:0;61952:21;61976:19;61989:5;61976:12;:19::i;:::-;61952:43;;62006:22;62058:5;62065:4;62041:29;;;;;;;;;:::i;:::-;;;;;;;;;;;;;62031:40;;;;;;62006:65;;62171:14;62160:8;62154:15;62149:2;62139:8;62135:17;62132:1;62124:62;-1:-1:-1;;;;;62207:24:0;;;;;;:8;:24;;;;;;;;:31;;-1:-1:-1;;62207:31:0;62234:4;62207:31;;;62249:5;:21;;;;;62106:80;;-1:-1:-1;62249:28:0;62273:4;62249:21;:28;:::i;:::-;-1:-1:-1;;;;;;62288:33:0;;;;;;;:17;:33;;;;;;;;:55;;-1:-1:-1;;62288:55:0;-1:-1:-1;;;;;62288:55:0;;;;;62354:16;;;;;;:9;:16;;;;;:37;;-1:-1:-1;62354:37:0;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;62354:37:0;;;;;62417:35;;13325:51:1;;;62354:16:0;62417:35;;13298:18:1;62417:35:0;;;;;;;61830:630;;61675:785;;;;;:::o;62555:218::-;62614:12;62639:21;62663:39;;;;;;;;:::i;:::-;-1:-1:-1;;62663:39:0;;;;;;;;;;;;;;;;-1:-1:-1;;;;;13343:32:1;;62663:39:0;62747:17;;13325:51:1;62663:39:0;;-1:-1:-1;62663:39:0;;13298:18:1;62747:17:0;;;-1:-1:-1;;62747:17:0;;;;;;;;;;62720:45;;;62747:17;62720:45;;:::i;:::-;;;;;;;;;;;;;62713:52;;;62555:218;;;:::o;57936:2495::-;58123:17;;58093:26;;;;58019:12;;;;;;-1:-1:-1;;;;;58123:17:0;;;58093:47;;;58089:2335;;58212:285;58247:8;:28;;;58294:8;:15;;;58328:8;:13;;;58360:8;:20;;;58399:8;:14;;;58432:8;:13;;;58464:8;:18;;;58212:16;:285::i;:::-;58182:315;;-1:-1:-1;58182:315:0;-1:-1:-1;58089:2335:0;;;58614:24;58641:49;58663:8;:26;;;58641:21;:49::i;:::-;58614:76;;58826:43;58872:548;58916:4;58973:8;:15;;;59011:8;:28;;;59062:8;:26;;;59111:8;:13;;;59147:8;:20;;;59190:8;:14;;;59227:8;:13;;;59263:8;:17;;;59303:8;:18;;;58940:400;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;59367:1;59388:8;:17;;;58872;:548::i;:::-;58826:594;;59438:16;59456;59476:137;59503:17;59539:8;:26;;;59584:14;59476:8;:137::i;:::-;59437:176;;;;59681:8;:19;;;59677:148;;;59742:8;59729:9;:21;;59721:88;;;;-1:-1:-1;;;59721:88:0;;37945:2:1;59721:88:0;;;37927:21:1;37984:2;37964:18;;;37957:30;38023:34;38003:18;;;37996:62;-1:-1:-1;;;38074:18:1;;;38067:52;38136:19;;59721:88:0;37743:418:1;59721:88:0;4715:7;4746:8;59894:136;;-1:-1:-1;;;59894:136:0;;59863:4;;-1:-1:-1;;;;;;4746:8:0;;;;59894:35;;59937:8;;59894:136;;59965:17;;60001:14;;59894:136;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;60114:15;;60192:26;;;;;60241:20;;;;;60284:18;;;;60052:360;;-1:-1:-1;;;;;38721:15:1;;;38703:34;;38773:15;;;38768:2;38753:18;;38746:43;-1:-1:-1;;;;;38863:15:1;;;38843:18;;;38836:43;38910:2;38895:18;;38888:34;-1:-1:-1;38938:19:1;;;38931:44;;;;38816:3;38991:19;;38984:35;;;39050:3;39035:19;;39028:35;;;60052:360:0;;59882:148;;-1:-1:-1;60052:360:0;;;59882:148;;60052:360;;;;;;38653:3:1;60052:360:0;;;58515:1909;;;;58089:2335;57936:2495;;;;;:::o;66482:170::-;66558:4;4746:8;;-1:-1:-1;;;;;4746:8:0;66582:62;;-1:-1:-1;;;66582:62:0;;-1:-1:-1;;;;;936:31:1;;66582:62:0;;;918:50:1;-1:-1:-1;;;;;66582:43:0;;;;;;;891:18:1;;66582:62:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;32317:492::-;32406:22;32414:4;32420:7;32406;:22::i;:::-;32401:401;;32594:28;32614:7;32594:19;:28::i;:::-;32695:38;32723:4;32730:2;32695:19;:38::i;:::-;32499:257;;;;;;;;;:::i;:::-;;;;-1:-1:-1;;32499:257:0;;;;;;;;;;-1:-1:-1;;;32445:345:0;;;;;;;:::i;60499:1108::-;60751:11;60764:24;60801:29;60833:30;60850:6;60858:4;60833:16;:30::i;:::-;-1:-1:-1;;;;;60879:31:0;;;;;;:8;:31;;;;;;60801:62;;-1:-1:-1;60879:31:0;;60874:305;;60927:42;60935:6;60943:4;60949:19;60927:7;:42::i;:::-;;60874:305;;;-1:-1:-1;;;;;61051:40:0;;;;;;:17;:40;;;;;;-1:-1:-1;;;;;61028:63:0;;;61051:40;;61028:63;61002:165;;;;-1:-1:-1;;;61002:165:0;;40797:2:1;61002:165:0;;;40779:21:1;40836:2;40816:18;;;40809:30;40875:34;40855:18;;;40848:62;-1:-1:-1;;;40926:18:1;;;40919:38;40974:19;;61002:165:0;40595:404:1;61002:165:0;61199:36;61260:21;61199:83;;61354:6;-1:-1:-1;;;;;61311:49:0;61320:21;-1:-1:-1;;;;;61311:37:0;;:39;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;;;;;61311:49:0;;61303:75;;;;-1:-1:-1;;;61303:75:0;;41462:2:1;61303:75:0;;;41444:21:1;41501:2;41481:18;;;41474:30;-1:-1:-1;;;41520:18:1;;;41513:43;41573:18;;61303:75:0;41260:337:1;61303:75:0;61418:67;;-1:-1:-1;;;61418:67:0;;-1:-1:-1;;;;;61418:30:0;;;;;:67;;61449:11;;61462:5;;61469:4;;61475:9;;61418:67;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;61511:88;;;18399:14:1;;18392:22;18374:41;;-1:-1:-1;;;;;18451:32:1;;;18446:2;18431:18;;18424:60;18500:18;;;18493:34;;;61389:96:0;;-1:-1:-1;61389:96:0;;-1:-1:-1;61511:88:0;;;;;;;;;;;;;18362:2:1;18347:18;61511:88:0;;;;;;;60790:817;;60499:1108;;;;;;;;;;:::o;28192:151::-;28250:13;28283:52;-1:-1:-1;;;;;28295:22:0;;26067:2;27588:447;27663:13;27689:19;27721:10;27725:6;27721:1;:10;:::i;:::-;:14;;27734:1;27721:14;:::i;:::-;-1:-1:-1;;;;;27711:25:0;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;27711:25:0;;27689:47;;-1:-1:-1;;;27747:6:0;27754:1;27747:9;;;;;;;;:::i;:::-;;;;:15;-1:-1:-1;;;;;27747:15:0;;;;;;;;;-1:-1:-1;;;27773:6:0;27780:1;27773:9;;;;;;;;:::i;:::-;;;;:15;-1:-1:-1;;;;;27773:15:0;;;;;;;;-1:-1:-1;27804:9:0;27816:10;27820:6;27816:1;:10;:::i;:::-;:14;;27829:1;27816:14;:::i;:::-;27804:26;;27799:131;27836:1;27832;:5;27799:131;;;-1:-1:-1;;;27880:5:0;27888:3;27880:11;27871:21;;;;;;;:::i;:::-;;;;27859:6;27866:1;27859:9;;;;;;;;:::i;:::-;;;;:33;-1:-1:-1;;;;;27859:33:0;;;;;;;;-1:-1:-1;27917:1:0;27907:11;;;;;27839:3;;;:::i;:::-;;;27799:131;;;-1:-1:-1;27948:10:0;;27940:55;;;;-1:-1:-1;;;27940:55:0;;42744:2:1;27940:55:0;;;42726:21:1;;;42763:18;;;42756:30;42822:34;42802:18;;;42795:62;42874:18;;27940:55:0;42542:356:1;27940:55:0;28020:6;27588:447;-1:-1:-1;;;27588:447:0:o;-1:-1:-1:-;;;;;;;;:::o;14:131:1:-;-1:-1:-1;;;;;;88:32:1;;78:43;;68:71;;135:1;132;125:12;150:245;208:6;261:2;249:9;240:7;236:23;232:32;229:52;;;277:1;274;267:12;229:52;316:9;303:23;335:30;359:5;335:30;:::i;979:131::-;-1:-1:-1;;;;;1054:31:1;;1044:42;;1034:70;;1100:1;1097;1090:12;1115:134;1183:20;;1212:31;1183:20;1212:31;:::i;:::-;1115:134;;;:::o;1254:127::-;1315:10;1310:3;1306:20;1303:1;1296:31;1346:4;1343:1;1336:15;1370:4;1367:1;1360:15;1386:257;1458:4;1452:11;;;1490:17;;-1:-1:-1;;;;;1522:34:1;;1558:22;;;1519:62;1516:88;;;1584:18;;:::i;:::-;1620:4;1613:24;1386:257;:::o;1648:253::-;1720:2;1714:9;1762:4;1750:17;;-1:-1:-1;;;;;1782:34:1;;1818:22;;;1779:62;1776:88;;;1844:18;;:::i;1906:275::-;1977:2;1971:9;2042:2;2023:13;;-1:-1:-1;;2019:27:1;2007:40;;-1:-1:-1;;;;;2062:34:1;;2098:22;;;2059:62;2056:88;;;2124:18;;:::i;:::-;2160:2;2153:22;1906:275;;-1:-1:-1;1906:275:1:o;2186:192::-;2255:4;-1:-1:-1;;;;;2280:6:1;2277:30;2274:56;;;2310:18;;:::i;:::-;-1:-1:-1;2355:1:1;2351:14;2367:4;2347:25;;2186:192::o;2383:129::-;-1:-1:-1;;;;;2461:5:1;2457:30;2450:5;2447:41;2437:69;;2502:1;2499;2492:12;2517:132;2584:20;;2613:30;2584:20;2613:30;:::i;2654:744::-;2707:5;2760:3;2753:4;2745:6;2741:17;2737:27;2727:55;;2778:1;2775;2768:12;2727:55;2814:6;2801:20;2840:4;2864:69;2880:52;2929:2;2880:52;:::i;:::-;2864:69;:::i;:::-;2967:15;;;3053:1;3049:10;;;;3037:23;;3033:32;;;2998:12;;;;3077:15;;;3074:35;;;3105:1;3102;3095:12;3074:35;3141:2;3133:6;3129:15;3153:216;3169:6;3164:3;3161:15;3153:216;;;3249:3;3236:17;3266:30;3290:5;3266:30;:::i;:::-;3309:18;;3347:12;;;;3186;;3153:216;;;-1:-1:-1;3387:5:1;2654:744;-1:-1:-1;;;;;;2654:744:1:o;3403:917::-;3466:5;3519:3;3512:4;3504:6;3500:17;3496:27;3486:55;;3537:1;3534;3527:12;3486:55;3573:6;3560:20;3599:4;3623:69;3639:52;3688:2;3639:52;:::i;3623:69::-;3726:15;;;3812:1;3808:10;;;;3796:23;;3792:32;;;3757:12;;;;3836:15;;;3833:35;;;3864:1;3861;3854:12;3833:35;3900:2;3892:6;3888:15;3912:379;3928:6;3923:3;3920:15;3912:379;;;4014:3;4001:17;-1:-1:-1;;;;;4037:11:1;4034:35;4031:125;;;4110:1;4139:2;4135;4128:14;4031:125;4181:67;4244:3;4239:2;4225:11;4217:6;4213:24;4209:33;4181:67;:::i;:::-;4169:80;;-1:-1:-1;4269:12:1;;;;3945;;3912:379;;4325:187;4374:4;-1:-1:-1;;;;;4399:6:1;4396:30;4393:56;;;4429:18;;:::i;:::-;-1:-1:-1;4495:2:1;4474:15;-1:-1:-1;;4470:29:1;4501:4;4466:40;;4325:187::o;4517:464::-;4560:5;4613:3;4606:4;4598:6;4594:17;4590:27;4580:55;;4631:1;4628;4621:12;4580:55;4667:6;4654:20;4698:49;4714:32;4743:2;4714:32;:::i;4698:49::-;4772:2;4763:7;4756:19;4818:3;4811:4;4806:2;4798:6;4794:15;4790:26;4787:35;4784:55;;;4835:1;4832;4825:12;4784:55;4900:2;4893:4;4885:6;4881:17;4874:4;4865:7;4861:18;4848:55;4948:1;4923:16;;;4941:4;4919:27;4912:38;;;;4927:7;4517:464;-1:-1:-1;;;4517:464:1:o;4986:897::-;5039:5;5092:3;5085:4;5077:6;5073:17;5069:27;5059:55;;5110:1;5107;5100:12;5059:55;5146:6;5133:20;5172:4;5196:69;5212:52;5261:2;5212:52;:::i;5196:69::-;5299:15;;;5385:1;5381:10;;;;5369:23;;5365:32;;;5330:12;;;;5409:15;;;5406:35;;;5437:1;5434;5427:12;5406:35;5473:2;5465:6;5461:15;5485:369;5501:6;5496:3;5493:15;5485:369;;;5587:3;5574:17;-1:-1:-1;;;;;5610:11:1;5607:35;5604:125;;;5683:1;5712:2;5708;5701:14;5604:125;5754:57;5807:3;5802:2;5788:11;5780:6;5776:24;5772:33;5754:57;:::i;:::-;5742:70;;-1:-1:-1;5832:12:1;;;;5518;;5485:369;;5888:746;5942:5;5995:3;5988:4;5980:6;5976:17;5972:27;5962:55;;6013:1;6010;6003:12;5962:55;6049:6;6036:20;6075:4;6099:69;6115:52;6164:2;6115:52;:::i;6099:69::-;6202:15;;;6288:1;6284:10;;;;6272:23;;6268:32;;;6233:12;;;;6312:15;;;6309:35;;;6340:1;6337;6330:12;6309:35;6376:2;6368:6;6364:15;6388:217;6404:6;6399:3;6396:15;6388:217;;;6484:3;6471:17;6501:31;6526:5;6501:31;:::i;:::-;6545:18;;6583:12;;;;6421;;6388:217;;6639:671;6693:5;6746:3;6739:4;6731:6;6727:17;6723:27;6713:55;;6764:1;6761;6754:12;6713:55;6800:6;6787:20;6826:4;6850:69;6866:52;6915:2;6866:52;:::i;6850:69::-;6953:15;;;7039:1;7035:10;;;;7023:23;;7019:32;;;6984:12;;;;7063:15;;;7060:35;;;7091:1;7088;7081:12;7060:35;7127:2;7119:6;7115:15;7139:142;7155:6;7150:3;7147:15;7139:142;;;7221:17;;7209:30;;7259:12;;;;7172;;7139:142;;7315:896;7367:5;7420:3;7413:4;7405:6;7401:17;7397:27;7387:55;;7438:1;7435;7428:12;7387:55;7474:6;7461:20;7500:4;7524:69;7540:52;7589:2;7540:52;:::i;7524:69::-;7627:15;;;7713:1;7709:10;;;;7697:23;;7693:32;;;7658:12;;;;7737:15;;;7734:35;;;7765:1;7762;7755:12;7734:35;7801:2;7793:6;7789:15;7813:369;7829:6;7824:3;7821:15;7813:369;;;7915:3;7902:17;-1:-1:-1;;;;;7938:11:1;7935:35;7932:125;;;8011:1;8040:2;8036;8029:14;7932:125;8082:57;8135:3;8130:2;8116:11;8108:6;8104:24;8100:33;8082:57;:::i;:::-;8070:70;;-1:-1:-1;8160:12:1;;;;7846;;7813:369;;8892:1853;9232:6;9240;9248;9256;9264;9272;9280;9288;9341:3;9329:9;9320:7;9316:23;9312:33;9309:53;;;9358:1;9355;9348:12;9309:53;9381:29;9400:9;9381:29;:::i;:::-;9371:39;;9461:2;9450:9;9446:18;9433:32;-1:-1:-1;;;;;9525:2:1;9517:6;9514:14;9511:34;;;9541:1;9538;9531:12;9511:34;9564:70;9626:7;9617:6;9606:9;9602:22;9564:70;:::i;:::-;9554:80;;9687:2;9676:9;9672:18;9659:32;9643:48;;9716:2;9706:8;9703:16;9700:36;;;9732:1;9729;9722:12;9700:36;9755:62;9809:7;9798:8;9787:9;9783:24;9755:62;:::i;:::-;9745:72;;9870:2;9859:9;9855:18;9842:32;9826:48;;9899:2;9889:8;9886:16;9883:36;;;9915:1;9912;9905:12;9883:36;9938:63;9993:7;9982:8;9971:9;9967:24;9938:63;:::i;:::-;9928:73;;10054:3;10043:9;10039:19;10026:33;10010:49;;10084:2;10074:8;10071:16;10068:36;;;10100:1;10097;10090:12;10068:36;10123:63;10178:7;10167:8;10156:9;10152:24;10123:63;:::i;:::-;10113:73;;10239:3;10228:9;10224:19;10211:33;10195:49;;10269:2;10259:8;10256:16;10253:36;;;10285:1;10282;10275:12;10253:36;10308:61;10361:7;10350:8;10339:9;10335:24;10308:61;:::i;:::-;10298:71;;10422:3;10411:9;10407:19;10394:33;10378:49;;10452:2;10442:8;10439:16;10436:36;;;10468:1;10465;10458:12;10436:36;10491:63;10546:7;10535:8;10524:9;10520:24;10491:63;:::i;:::-;10481:73;;10607:3;10596:9;10592:19;10579:33;10563:49;;10637:2;10627:8;10624:16;10621:36;;;10653:1;10650;10643:12;10621:36;;10676:63;10731:7;10720:8;10709:9;10705:24;10676:63;:::i;:::-;10666:73;;;8892:1853;;;;;;;;;;;:::o;10932:180::-;10991:6;11044:2;11032:9;11023:7;11019:23;11015:32;11012:52;;;11060:1;11057;11050:12;11012:52;-1:-1:-1;11083:23:1;;10932:180;-1:-1:-1;10932:180:1:o;11117:1123::-;11282:6;11290;11298;11306;11314;11322;11330;11338;11391:3;11379:9;11370:7;11366:23;11362:33;11359:53;;;11408:1;11405;11398:12;11359:53;11431:29;11450:9;11431:29;:::i;:::-;11421:39;;11511:2;11500:9;11496:18;11483:32;-1:-1:-1;;;;;11575:2:1;11567:6;11564:14;11561:34;;;11591:1;11588;11581:12;11561:34;11614:60;11666:7;11657:6;11646:9;11642:22;11614:60;:::i;:::-;11604:70;;11727:2;11716:9;11712:18;11699:32;11683:48;;11756:2;11746:8;11743:16;11740:36;;;11772:1;11769;11762:12;11740:36;11795:52;11839:7;11828:8;11817:9;11813:24;11795:52;:::i;:::-;11785:62;;11866:38;11900:2;11889:9;11885:18;11866:38;:::i;:::-;11856:48;;11951:3;11940:9;11936:19;11923:33;11913:43;;12009:3;11998:9;11994:19;11981:33;11965:49;;12039:2;12029:8;12026:16;12023:36;;;12055:1;12052;12045:12;12023:36;;12078:52;12122:7;12111:8;12100:9;12096:24;12078:52;:::i;:::-;12068:62;;;12177:3;12166:9;12162:19;12149:33;12139:43;;12229:3;12218:9;12214:19;12201:33;12191:43;;11117:1123;;;;;;;;;;;:::o;12430:315::-;12498:6;12506;12559:2;12547:9;12538:7;12534:23;12530:32;12527:52;;;12575:1;12572;12565:12;12527:52;12611:9;12598:23;12588:33;;12671:2;12660:9;12656:18;12643:32;12684:31;12709:5;12684:31;:::i;:::-;12734:5;12724:15;;;12430:315;;;;;:::o;12750:::-;12818:6;12826;12879:2;12867:9;12858:7;12854:23;12850:32;12847:52;;;12895:1;12892;12885:12;12847:52;12934:9;12921:23;12953:31;12978:5;12953:31;:::i;:::-;13003:5;13055:2;13040:18;;;;13027:32;;-1:-1:-1;;;12750:315:1:o;13387:247::-;13446:6;13499:2;13487:9;13478:7;13474:23;13470:32;13467:52;;;13515:1;13512;13505:12;13467:52;13554:9;13541:23;13573:31;13598:5;13573:31;:::i;13639:392::-;13730:6;13783:2;13771:9;13762:7;13758:23;13754:32;13751:52;;;13799:1;13796;13789:12;13751:52;13839:9;13826:23;-1:-1:-1;;;;;13864:6:1;13861:30;13858:50;;;13904:1;13901;13894:12;13858:50;13927:22;;13983:3;13965:16;;;13961:26;13958:46;;;14000:1;13997;13990:12;14036:461;14089:3;14127:5;14121:12;14154:6;14149:3;14142:19;14180:4;14209:2;14204:3;14200:12;14193:19;;14246:2;14239:5;14235:14;14267:1;14277:195;14291:6;14288:1;14285:13;14277:195;;;14356:13;;-1:-1:-1;;;;;14352:39:1;14340:52;;14412:12;;;;14447:15;;;;14388:1;14306:9;14277:195;;;-1:-1:-1;14488:3:1;;14036:461;-1:-1:-1;;;;;14036:461:1:o;14502:261::-;14681:2;14670:9;14663:21;14644:4;14701:56;14753:2;14742:9;14738:18;14730:6;14701:56;:::i;14768:250::-;14853:1;14863:113;14877:6;14874:1;14871:13;14863:113;;;14953:11;;;14947:18;14934:11;;;14927:39;14899:2;14892:10;14863:113;;;-1:-1:-1;;15010:1:1;14992:16;;14985:27;14768:250::o;15023:271::-;15065:3;15103:5;15097:12;15130:6;15125:3;15118:19;15146:76;15215:6;15208:4;15203:3;15199:14;15192:4;15185:5;15181:16;15146:76;:::i;:::-;15276:2;15255:15;-1:-1:-1;;15251:29:1;15242:39;;;;15283:4;15238:50;;15023:271;-1:-1:-1;;15023:271:1:o;15299:220::-;15448:2;15437:9;15430:21;15411:4;15468:45;15509:2;15498:9;15494:18;15486:6;15468:45;:::i;15524:322::-;15593:6;15646:2;15634:9;15625:7;15621:23;15617:32;15614:52;;;15662:1;15659;15652:12;15614:52;15702:9;15689:23;-1:-1:-1;;;;;15727:6:1;15724:30;15721:50;;;15767:1;15764;15757:12;15721:50;15790;15832:7;15823:6;15812:9;15808:22;15790:50;:::i;:::-;15780:60;15524:322;-1:-1:-1;;;;15524:322:1:o;15851:746::-;15956:6;15964;15972;15980;16033:3;16021:9;16012:7;16008:23;16004:33;16001:53;;;16050:1;16047;16040:12;16001:53;16089:9;16076:23;16108:31;16133:5;16108:31;:::i;:::-;16158:5;-1:-1:-1;16214:2:1;16199:18;;16186:32;-1:-1:-1;;;;;16267:14:1;;;16264:34;;;16294:1;16291;16284:12;16264:34;16317:50;16359:7;16350:6;16339:9;16335:22;16317:50;:::i;:::-;16307:60;;16420:2;16409:9;16405:18;16392:32;16376:48;;16449:2;16439:8;16436:16;16433:36;;;16465:1;16462;16455:12;16433:36;;16488:52;16532:7;16521:8;16510:9;16506:24;16488:52;:::i;:::-;15851:746;;;;-1:-1:-1;16478:62:1;;16587:2;16572:18;16559:32;;-1:-1:-1;;;15851:746:1:o;16602:457::-;16680:6;16688;16741:2;16729:9;16720:7;16716:23;16712:32;16709:52;;;16757:1;16754;16747:12;16709:52;16796:9;16783:23;16815:31;16840:5;16815:31;:::i;:::-;16865:5;-1:-1:-1;16921:2:1;16906:18;;16893:32;-1:-1:-1;;;;;16937:30:1;;16934:50;;;16980:1;16977;16970:12;16934:50;17003;17045:7;17036:6;17025:9;17021:22;17003:50;:::i;:::-;16993:60;;;16602:457;;;;;:::o;17064:1109::-;17220:6;17228;17236;17244;17252;17260;17268;17321:3;17309:9;17300:7;17296:23;17292:33;17289:53;;;17338:1;17335;17328:12;17289:53;17378:9;17365:23;-1:-1:-1;;;;;17448:2:1;17440:6;17437:14;17434:34;;;17464:1;17461;17454:12;17434:34;17487:60;17539:7;17530:6;17519:9;17515:22;17487:60;:::i;:::-;17477:70;;17600:2;17589:9;17585:18;17572:32;17556:48;;17629:2;17619:8;17616:16;17613:36;;;17645:1;17642;17635:12;17613:36;17668:52;17712:7;17701:8;17690:9;17686:24;17668:52;:::i;:::-;17658:62;;17770:2;17759:9;17755:18;17742:32;17729:45;;17783:31;17808:5;17783:31;:::i;:::-;17833:5;;-1:-1:-1;17885:2:1;17870:18;;17857:32;;-1:-1:-1;17942:3:1;17927:19;;17914:33;;17959:16;;;17956:36;;;17988:1;17985;17978:12;17956:36;;18011:52;18055:7;18044:8;18033:9;18029:24;18011:52;:::i;:::-;18001:62;;;18110:3;18099:9;18095:19;18082:33;18072:43;;18162:3;18151:9;18147:19;18134:33;18124:43;;17064:1109;;;;;;;;;;:::o;18538:1778::-;18869:6;18877;18885;18893;18901;18909;18917;18970:3;18958:9;18949:7;18945:23;18941:33;18938:53;;;18987:1;18984;18977:12;18938:53;19027:9;19014:23;-1:-1:-1;;;;;19097:2:1;19089:6;19086:14;19083:34;;;19113:1;19110;19103:12;19083:34;19136:70;19198:7;19189:6;19178:9;19174:22;19136:70;:::i;:::-;19126:80;;19259:2;19248:9;19244:18;19231:32;19215:48;;19288:2;19278:8;19275:16;19272:36;;;19304:1;19301;19294:12;19272:36;19327:62;19381:7;19370:8;19359:9;19355:24;19327:62;:::i;:::-;19317:72;;19442:2;19431:9;19427:18;19414:32;19398:48;;19471:2;19461:8;19458:16;19455:36;;;19487:1;19484;19477:12;19455:36;19510:63;19565:7;19554:8;19543:9;19539:24;19510:63;:::i;:::-;19500:73;;19626:2;19615:9;19611:18;19598:32;19582:48;;19655:2;19645:8;19642:16;19639:36;;;19671:1;19668;19661:12;19639:36;19694:63;19749:7;19738:8;19727:9;19723:24;19694:63;:::i;:::-;19684:73;;19810:3;19799:9;19795:19;19782:33;19766:49;;19840:2;19830:8;19827:16;19824:36;;;19856:1;19853;19846:12;19824:36;19879:61;19932:7;19921:8;19910:9;19906:24;19879:61;:::i;:::-;19869:71;;19993:3;19982:9;19978:19;19965:33;19949:49;;20023:2;20013:8;20010:16;20007:36;;;20039:1;20036;20029:12;20007:36;20062:63;20117:7;20106:8;20095:9;20091:24;20062:63;:::i;:::-;20052:73;;20178:3;20167:9;20163:19;20150:33;20134:49;;20208:2;20198:8;20195:16;20192:36;;;20224:1;20221;20214:12;20192:36;;20247:63;20302:7;20291:8;20280:9;20276:24;20247:63;:::i;:::-;20237:73;;;18538:1778;;;;;;;;;;:::o;20321:1373::-;20661:2;20673:21;;;20743:13;;20646:18;;;20765:22;;;20613:4;;20841;;20818:3;20803:19;;;20868:15;;;20613:4;20911:185;20925:6;20922:1;20919:13;20911:185;;;21000:13;;20993:21;20986:29;20974:42;;21036:12;;;;21071:15;;;;20947:1;20940:9;20911:185;;;20915:3;;;21141:9;21136:3;21132:19;21127:2;21116:9;21112:18;21105:47;21175:41;21212:3;21204:6;21175:41;:::i;:::-;21252:22;;;21247:2;21232:18;;21225:50;21328:13;;21350:24;;;21432:15;;;;-1:-1:-1;21392:15:1;;;;21467:1;21477:189;21493:8;21488:3;21485:17;21477:189;;;21562:15;;21548:30;;21639:17;;;;21600:14;;;;21521:1;21512:11;21477:189;;;-1:-1:-1;21683:5:1;;20321:1373;-1:-1:-1;;;;;;;;20321:1373:1:o;21699:127::-;21760:10;21755:3;21751:20;21748:1;21741:31;21791:4;21788:1;21781:15;21815:4;21812:1;21805:15;21831:127;21892:10;21887:3;21883:20;21880:1;21873:31;21923:4;21920:1;21913:15;21947:4;21944:1;21937:15;21963:125;22028:9;;;22049:10;;;22046:36;;;22062:18;;:::i;22093:135::-;22132:3;22153:17;;;22150:43;;22173:18;;:::i;:::-;-1:-1:-1;22220:1:1;22209:13;;22093:135::o;22233:1012::-;-1:-1:-1;;;;;22680:15:1;;;22662:34;;-1:-1:-1;;;;;22769:15:1;;;22764:2;22749:18;;22742:43;22821:15;;22816:2;22801:18;;22794:43;22612:3;22868:2;22853:18;;22846:30;;;22583:4;;22899:45;22925:18;;;22917:6;22899:45;:::i;:::-;22885:59;;22993:2;22985:6;22981:15;22975:3;22964:9;22960:19;22953:44;;23034:6;23028:3;23017:9;23013:19;23006:35;23090:9;23082:6;23078:22;23072:3;23061:9;23057:19;23050:51;23118:33;23144:6;23136;23118:33;:::i;:::-;23182:3;23167:19;;23160:35;;;;-1:-1:-1;;23226:3:1;23211:19;23204:35;23110:41;22233:1012;-1:-1:-1;;;;;;;22233:1012:1:o;24027:1039::-;24095:5;24148:3;24141:4;24133:6;24129:17;24125:27;24115:55;;24166:1;24163;24156:12;24115:55;24202:6;24189:20;24228:4;24252:69;24268:52;24317:2;24268:52;:::i;24252:69::-;24355:15;;;24441:1;24437:10;;;;24425:23;;24421:32;;;24386:12;;;;24465:15;;;24462:35;;;24493:1;24490;24483:12;24462:35;24529:2;24521:6;24517:15;24541:496;24557:6;24552:3;24549:15;24541:496;;;24635:4;24629:3;24624;24620:13;24616:24;24613:114;;;24681:1;24710:2;24706;24699:14;24613:114;24753:22;;:::i;:::-;24816:3;24803:17;24833:33;24858:7;24833:33;:::i;:::-;24879:22;;24950:12;;;24937:26;24921:14;;;24914:50;24977:18;;25015:12;;;;24583:4;24574:14;24541:496;;25071:1009;25183:9;25242:4;25234:5;25218:14;25214:26;25210:37;25207:57;;;25260:1;25257;25250:12;25207:57;25288:22;;:::i;:::-;25348:5;25335:19;25326:7;25319:36;25389:33;25418:2;25411:5;25407:14;25389:33;:::i;:::-;25384:2;25375:7;25371:16;25364:59;25470:2;25463:5;25459:14;25446:28;-1:-1:-1;;;;;25534:2:1;25526:6;25523:14;25520:34;;;25550:1;25547;25540:12;25520:34;25588:53;25626:14;25617:6;25610:5;25606:18;25588:53;:::i;:::-;25583:2;25574:7;25570:16;25563:79;25691:2;25684:5;25680:14;25667:28;25651:44;;25720:2;25710:8;25707:16;25704:36;;;25736:1;25733;25726:12;25704:36;25774:55;25814:14;25803:8;25796:5;25792:20;25774:55;:::i;:::-;25769:2;25760:7;25756:16;25749:81;25879:3;25872:5;25868:15;25855:29;25839:45;;25909:2;25899:8;25896:16;25893:36;;;25925:1;25922;25915:12;25893:36;;25964:80;26029:14;26018:8;26011:5;26007:20;25964:80;:::i;:::-;25958:3;25945:17;;25938:107;-1:-1:-1;25949:7:1;25071:1009;-1:-1:-1;;25071:1009:1:o;26858:380::-;26937:1;26933:12;;;;26980;;;27001:61;;27055:4;27047:6;27043:17;27033:27;;27001:61;27108:2;27100:6;27097:14;27077:18;27074:38;27071:161;;27154:10;27149:3;27145:20;27142:1;27135:31;27189:4;27186:1;27179:15;27217:4;27214:1;27207:15;27071:161;;26858:380;;;:::o;27601:441::-;-1:-1:-1;;;;;;27824:26:1;;;;27812:39;;27888:2;27884:15;;;;-1:-1:-1;;27880:53:1;27876:1;27867:11;;27860:74;27959:2;27950:12;;27943:28;27996:2;27987:12;;27980:28;28033:2;28024:12;;27601:441::o;28047:410::-;28261:26;28257:31;28248:6;28244:2;28240:15;28236:53;28231:3;28224:66;28206:3;28319:6;28313:13;28335:75;28403:6;28398:2;28393:3;28389:12;28382:4;28374:6;28370:17;28335:75;:::i;:::-;28430:16;;;;28448:2;28426:25;;28047:410;-1:-1:-1;;;28047:410:1:o;28821:249::-;28890:6;28943:2;28931:9;28922:7;28918:23;28914:32;28911:52;;;28959:1;28956;28949:12;28911:52;28991:9;28985:16;29010:30;29034:5;29010:30;:::i;29422:1604::-;29600:4;29629:2;-1:-1:-1;;;;;29662:6:1;29658:31;29647:9;29640:50;29709:2;29747;29742;29731:9;29727:18;29720:30;29785:6;29779:13;29828:4;29823:2;29812:9;29808:18;29801:32;29856:52;29903:3;29892:9;29888:19;29874:12;29856:52;:::i;:::-;29842:66;;29957:2;29949:6;29945:15;29939:22;29984:2;29980:7;30051:2;30039:9;30031:6;30027:22;30023:31;30018:2;30007:9;30003:18;29996:59;30078:41;30112:6;30096:14;30078:41;:::i;:::-;30156:15;;;30150:22;30213;;;30209:31;;30203:3;30188:19;;30181:60;30290:21;;30320:22;;;30396:23;;;;-1:-1:-1;30437:1:1;;-1:-1:-1;30358:15:1;;;;30447:280;30461:6;30458:1;30455:13;30447:280;;;30520:13;;30562:9;;-1:-1:-1;;;;;30558:35:1;30546:48;;30634:11;;30628:18;30614:12;;;30607:40;30702:15;;;;30590:1;30476:9;;;;;30667:12;;;;30447:280;;;-1:-1:-1;30776:2:1;30764:15;;30758:22;-1:-1:-1;;;;;13136:31:1;30839:4;30824:20;;13124:44;30894:3;30882:16;;30876:23;30940:19;;;30936:28;;30930:3;30915:19;;30908:57;30876:23;-1:-1:-1;30982:38:1;30944:3;30876:23;30982:38;:::i;:::-;30974:46;29422:1604;-1:-1:-1;;;;;;;;;;29422:1604:1:o;31031:184::-;31101:6;31154:2;31142:9;31133:7;31129:23;31125:32;31122:52;;;31170:1;31167;31160:12;31122:52;-1:-1:-1;31193:16:1;;31031:184;-1:-1:-1;31031:184:1:o;31220:168::-;31293:9;;;31324;;31341:15;;;31335:22;;31321:37;31311:71;;31362:18;;:::i;31393:217::-;31433:1;31459;31449:132;;31503:10;31498:3;31494:20;31491:1;31484:31;31538:4;31535:1;31528:15;31566:4;31563:1;31556:15;31449:132;-1:-1:-1;31595:9:1;;31393:217::o;31615:146::-;31702:13;;31724:31;31702:13;31724:31;:::i;31766:259::-;31844:6;31897:2;31885:9;31876:7;31872:23;31868:32;31865:52;;;31913:1;31910;31903:12;31865:52;31945:9;31939:16;31964:31;31989:5;31964:31;:::i;32460:136::-;32538:13;;32560:30;32538:13;32560:30;:::i;32601:443::-;32655:5;32708:3;32701:4;32693:6;32689:17;32685:27;32675:55;;32726:1;32723;32716:12;32675:55;32755:6;32749:13;32786:49;32802:32;32831:2;32802:32;:::i;32786:49::-;32860:2;32851:7;32844:19;32906:3;32899:4;32894:2;32886:6;32882:15;32878:26;32875:35;32872:55;;;32923:1;32920;32913:12;32872:55;32936:77;33010:2;33003:4;32994:7;32990:18;32983:4;32975:6;32971:17;32936:77;:::i;33049:1202::-;33224:6;33232;33240;33248;33256;33264;33272;33280;33288;33341:3;33329:9;33320:7;33316:23;33312:33;33309:53;;;33358:1;33355;33348:12;33309:53;33390:9;33384:16;33409:31;33434:5;33409:31;:::i;:::-;33509:2;33494:18;;33488:25;33459:5;;-1:-1:-1;33522:32:1;33488:25;33522:32;:::i;:::-;33573:7;-1:-1:-1;33599:48:1;33643:2;33628:18;;33599:48;:::i;:::-;33589:58;;33691:2;33680:9;33676:18;33670:25;-1:-1:-1;;;;;33755:2:1;33747:6;33744:14;33741:34;;;33771:1;33768;33761:12;33741:34;33794:61;33847:7;33838:6;33827:9;33823:22;33794:61;:::i;:::-;33784:71;;33874:58;33927:3;33916:9;33912:19;33874:58;:::i;:::-;33864:68;;33972:3;33961:9;33957:19;33951:26;33941:36;;34023:3;34012:9;34008:19;34002:26;33986:42;;34053:2;34043:8;34040:16;34037:36;;;34069:1;34066;34059:12;34037:36;;34092:63;34147:7;34136:8;34125:9;34121:24;34092:63;:::i;:::-;34082:73;;;34195:3;34184:9;34180:19;34174:26;34164:36;;34240:3;34229:9;34225:19;34219:26;34209:36;;33049:1202;;;;;;;;;;;:::o;35168:545::-;35270:2;35265:3;35262:11;35259:448;;;35306:1;35331:5;35327:2;35320:17;35376:4;35372:2;35362:19;35446:2;35434:10;35430:19;35427:1;35423:27;35417:4;35413:38;35482:4;35470:10;35467:20;35464:47;;;-1:-1:-1;35505:4:1;35464:47;35560:2;35555:3;35551:12;35548:1;35544:20;35538:4;35534:31;35524:41;;35615:82;35633:2;35626:5;35623:13;35615:82;;;35678:17;;;35659:1;35648:13;35615:82;;;35619:3;;;35168:545;;;:::o;35889:1352::-;36015:3;36009:10;-1:-1:-1;;;;;36034:6:1;36031:30;36028:56;;;36064:18;;:::i;:::-;36093:97;36183:6;36143:38;36175:4;36169:11;36143:38;:::i;:::-;36137:4;36093:97;:::i;:::-;36245:4;;36309:2;36298:14;;36326:1;36321:663;;;;37028:1;37045:6;37042:89;;;-1:-1:-1;37097:19:1;;;37091:26;37042:89;-1:-1:-1;;35846:1:1;35842:11;;;35838:24;35834:29;35824:40;35870:1;35866:11;;;35821:57;37144:81;;36291:944;;36321:663;35115:1;35108:14;;;35152:4;35139:18;;-1:-1:-1;;36357:20:1;;;36475:236;36489:7;36486:1;36483:14;36475:236;;;36578:19;;;36572:26;36557:42;;36670:27;;;;36638:1;36626:14;;;;36505:19;;36475:236;;;36479:3;36739:6;36730:7;36727:19;36724:201;;;36800:19;;;36794:26;-1:-1:-1;;36883:1:1;36879:14;;;36895:3;36875:24;36871:37;36867:42;36852:58;36837:74;;36724:201;-1:-1:-1;;;;;36971:1:1;36955:14;;;36951:22;36938:36;;-1:-1:-1;35889:1352:1:o;37246:492::-;37421:3;37459:6;37453:13;37475:66;37534:6;37529:3;37522:4;37514:6;37510:17;37475:66;:::i;:::-;37604:13;;37563:16;;;;37626:70;37604:13;37563:16;37673:4;37661:17;;37626:70;:::i;:::-;37712:20;;37246:492;-1:-1:-1;;;;37246:492:1:o;39074:164::-;39150:13;;39199;;39192:21;39182:32;;39172:60;;39228:1;39225;39218:12;39243:202;39310:6;39363:2;39351:9;39342:7;39338:23;39334:32;39331:52;;;39379:1;39376;39369:12;39331:52;39402:37;39429:9;39402:37;:::i;39778:812::-;40189:25;40184:3;40177:38;40159:3;40244:6;40238:13;40260:75;40328:6;40323:2;40318:3;40314:12;40307:4;40299:6;40295:17;40260:75;:::i;:::-;-1:-1:-1;;;40394:2:1;40354:16;;;40386:11;;;40379:40;40444:13;;40466:76;40444:13;40528:2;40520:11;;40513:4;40501:17;;40466:76;:::i;:::-;40562:17;40581:2;40558:26;;39778:812;-1:-1:-1;;;;39778:812:1:o;41602:459::-;41862:1;41858;41853:3;41849:11;41845:19;41837:6;41833:32;41822:9;41815:51;41902:6;41897:2;41886:9;41882:18;41875:34;41945:3;41940:2;41929:9;41925:18;41918:31;41796:4;41966:46;42007:3;41996:9;41992:19;41984:6;41966:46;:::i;:::-;41958:54;;42048:6;42043:2;42032:9;42028:18;42021:34;41602:459;;;;;;;:::o;42066:330::-;42142:6;42150;42203:2;42191:9;42182:7;42178:23;42174:32;42171:52;;;42219:1;42216;42209:12;42171:52;42242:37;42269:9;42242:37;:::i;:::-;42232:47;;42322:2;42311:9;42307:18;42301:25;42335:31;42360:5;42335:31;:::i;42401:136::-;42440:3;42468:5;42458:39;;42477:18;;:::i;:::-;-1:-1:-1;;;42513:18:1;;42401:136::o
Swarm Source
ipfs://0322c853cf2005918976253b0b9e50d25fdcf53549046b221b62a4959d5bb9a1
Loading...
Loading
Loading...
Loading
Net Worth in USD
$22.76
Net Worth in ETH
0.012429
Token Allocations
ETH
94.70%
POL
5.30%
Multichain Portfolio | 34 Chains
Loading...
Loading
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.