This nametag was submitted by Kleros Scout.
Latest 25 from a total of 24,263 transactions
| Transaction Hash |
|
Block
|
From
|
To
|
|||||
|---|---|---|---|---|---|---|---|---|---|
| Swap Split Compr... | 376197767 | 147 days ago | IN | 2.43 ETH | 0.00000725 | ||||
| Swap Compressed | 376194677 | 147 days ago | IN | 0 ETH | 0.0000026 | ||||
| Swap Split Compr... | 373704335 | 155 days ago | IN | 0 ETH | 0.00000453 | ||||
| Swap Compressed | 371479943 | 161 days ago | IN | 0 ETH | 0.00000295 | ||||
| Swap Split Compr... | 370766249 | 163 days ago | IN | 1.6 ETH | 0.00000485 | ||||
| Swap Compressed | 369600674 | 167 days ago | IN | 0 ETH | 0.00000468 | ||||
| Swap Compressed | 368570876 | 170 days ago | IN | 0 ETH | 0.00000221 | ||||
| Swap Compressed | 368379293 | 170 days ago | IN | 0 ETH | 0.00001316 | ||||
| Swap Compressed | 366304657 | 176 days ago | IN | 0 ETH | 0.00000758 | ||||
| Swap Compressed | 362126516 | 188 days ago | IN | 0 ETH | 0.00000226 | ||||
| Swap Compressed | 361275038 | 191 days ago | IN | 0 ETH | 0.00000942 | ||||
| Swap Compressed | 359393324 | 196 days ago | IN | 0 ETH | 0.0000024 | ||||
| Swap Compressed | 359032557 | 197 days ago | IN | 0 ETH | 0.00001684 | ||||
| Swap Compressed | 357825967 | 201 days ago | IN | 0 ETH | 0.00000248 | ||||
| Trade Eth To Wet... | 357825256 | 201 days ago | IN | 0.00001 ETH | 0.00000109 | ||||
| Swap Compressed | 352768067 | 215 days ago | IN | 0 ETH | 0.00000372 | ||||
| Swap Compressed | 351087068 | 220 days ago | IN | 0.0042 ETH | 0.00001706 | ||||
| Swap Compressed | 343095646 | 243 days ago | IN | 0.00021 ETH | 0.00000237 | ||||
| Swap Compressed | 342369630 | 245 days ago | IN | 0 ETH | 0.00000208 | ||||
| Swap Split Compr... | 341461160 | 248 days ago | IN | 0 ETH | 0.00000823 | ||||
| Swap Compressed | 329544020 | 283 days ago | IN | 0 ETH | 0.00000224 | ||||
| Swap Compressed | 328040575 | 287 days ago | IN | 0 ETH | 0.00000227 | ||||
| Swap Compressed | 327647660 | 288 days ago | IN | 0 ETH | 0.00000526 | ||||
| Swap Compressed | 310179964 | 339 days ago | IN | 0 ETH | 0.00002115 | ||||
| Swap Compressed | 310179123 | 339 days ago | IN | 0.0022 ETH | 0.00000495 |
Latest 25 internal transactions (View All)
| Parent Transaction Hash | Block | From | To | |||
|---|---|---|---|---|---|---|
| 376197767 | 147 days ago | 2.42757 ETH | ||||
| 376197767 | 147 days ago | 0.00243 ETH | ||||
| 370766249 | 163 days ago | 1.5984 ETH | ||||
| 370766249 | 163 days ago | 0.0016 ETH | ||||
| 357825256 | 201 days ago | 0.00001 ETH | ||||
| 351087068 | 220 days ago | 0.0041958 ETH | ||||
| 351087068 | 220 days ago | 0.0000042 ETH | ||||
| 343095646 | 243 days ago | 0.00020979 ETH | ||||
| 343095646 | 243 days ago | 0.00000021 ETH | ||||
| 310179123 | 339 days ago | 0.0021978 ETH | ||||
| 310179123 | 339 days ago | 0.0000022 ETH | ||||
| 297664528 | 375 days ago | 0.001998 ETH | ||||
| 297664528 | 375 days ago | 0.000002 ETH | ||||
| 292300365 | 391 days ago | 0.06993 ETH | ||||
| 292300365 | 391 days ago | 0.00007 ETH | ||||
| 291807951 | 392 days ago | 0.00601685 ETH | ||||
| 291807951 | 392 days ago | 0.00601685 ETH | ||||
| 290739751 | 396 days ago | 0.00000999 ETH | ||||
| 290739751 | 396 days ago | 0.00000001 ETH | ||||
| 290739630 | 396 days ago | 0.00000999 ETH | ||||
| 290739630 | 396 days ago | 0.00000001 ETH | ||||
| 289494550 | 399 days ago | 0.00000999 ETH | ||||
| 289494550 | 399 days ago | 0.00000001 ETH | ||||
| 289358916 | 400 days ago | 0.0000999 ETH | ||||
| 289358916 | 400 days ago | 0.0000001 ETH |
Cross-Chain Transactions
Loading...
Loading
Contract Name:
WardenRouterV2_L2
Compiler Version
v0.8.10+commit.fc410830
Contract Source Code (Solidity)
/** *Submitted for verification at Arbiscan.io on 2022-04-28 */ // SPDX-License-Identifier: MIT // ((/*, ,*((/,. // &&@@&&%#/*. .*(#&&@@@@%. // &&@@@@@@@&%(. ,#%&@@@@@@@@%. // &&@@@@@@@@@&&(, ,#&@@@@@@@@@@@%. // &&@@@@@@@@@@@&&/. .(&&@@@@@@@@@@@@%. // %&@@@@@@@@@@@@@&(, *#&@@@@@@@@@@@@@@%. // #&@@@@@@@@@@@@@@&#* .*#@@@@@@@@@@@@@@@&#. // #&@@@@@@@@@@@@@@@@#. ,%&@@@@@@@@@@@@@@@&#. // #&@@@@@@@@@@@@@@@@%(, ,(&@@@@@@@@@@@@@@@@&#. // #&@@@@@@@@@@@@@@@@&&/ .(%&@@@@@@@@@@@@@@@@&#. // #%@@@@@@@@@@@@@@@@@@(. ,(/,. .#&@@@@@@@@@@@@@@@@@&#. // (%@@@@@@@@@@@@@@@@@@#*. ./%&&&/. .*%@@@@@@@@@@@@@@@@@@%(. // (%@@@@@@@@@@@@@@@@@@#*. *#&@@@@&%*. .*%@@@@@@@@@@@@@@@@@@%(. // (%@@@@@@@@@@@@@@@@@@#/. ./#@@@@@@@@%(. ./%@@@@@@@@@@@@@@@@@@%(. // (%@@@@@@@@@@@@@@@@@@#/. ./&@@@@@@@@@@&(* ,/%@@@@@@@@@@@@@@@@@@%(. // (%@@@@@@@@@@@@@@@@@@%/. ,#&@@@@@@@@@@@@&#,. ,/%@@@@@@@@@@@@@@@@@@%(. // /%@@@@@@@@@@@@@@@@@@#/. *(&@@@@@@@@@@@@@@&&* ./%@@@@@@@@@@@@@@@@@&%(. // /%@@@@@@@@@@@@@@@@@@#/. .(&@@@@@@@@@@@@@@@@@#*. ,/%@@@@@@@@@@@@@@@@@&#/. // ,#@@@@@@@@@@@@@@@@@@#/. ./%@@@@@@@@@@@@@@@@@@&#, ,/%@@@@@@@@@@@@@@@@@&(, // /%&@@@@@@@@@@@@@@@@#/. *#&@@@@@@@@@@@@@@@@@@@&* ,/%@@@@@@@@@@@@@@@@&%* // .*#&@@@@@@@@@@@@@@@#/. /&&@@@@@@@@@@@@@@@@@@@&/. ,/%@@@@@@@@@@@@@@@@#*. // ,(&@@@@@@@@@@@@@@#/. /@@@@@@@@@@@@@@@@@@@@@&(, ,/%@@@@@@@@@@@@@@%(, // .*(&&@@@@@@@@@@@#/. /&&@@@@@@@@@@@@@@@@@@@&/, ,/%@@@@@@@@@@@&%/, // ./%&@@@@@@@@@#/. *#&@@@@@@@@@@@@@@@@@@@%* ,/%@@@@@@@@@&%* // ,/#%&&@@@@#/. ,#&@@@@@@@@@@@@@@@@@#/. ,/%@@@@&&%(/, // ./#&@@%/. ,/&@@@@@@@@@@@@@@%(, ,/%@@%#*. // .,,, ,/%&@@@@@@@@&%(* .,,,. // ,/%&@@@%(*. // .,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,**((/*,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, // // // Sources flattened with hardhat v2.9.3 https://hardhat.org // File @openzeppelin/contracts/utils/[email protected] // OpenZeppelin Contracts v4.4.1 (utils/Context.sol) pragma solidity ^0.8.0; /** * @dev Provides information about the current execution context, including the * sender of the transaction and its data. While these are generally available * via msg.sender and msg.data, they should not be accessed in such a direct * manner, since when dealing with meta-transactions the account sending and * paying for execution may not be the actual sender (as far as an application * is concerned). * * This contract is only required for intermediate, library-like contracts. */ abstract contract Context { function _msgSender() internal view virtual returns (address) { return msg.sender; } function _msgData() internal view virtual returns (bytes calldata) { return msg.data; } } // File @openzeppelin/contracts/access/[email protected] // OpenZeppelin Contracts v4.4.1 (access/Ownable.sol) pragma solidity ^0.8.0; /** * @dev Contract module which provides a basic access control mechanism, where * there is an account (an owner) that can be granted exclusive access to * specific functions. * * By default, the owner account will be the one that deploys the contract. This * can later be changed with {transferOwnership}. * * This module is used through inheritance. It will make available the modifier * `onlyOwner`, which can be applied to your functions to restrict their use to * the owner. */ abstract contract Ownable is Context { address private _owner; event OwnershipTransferred(address indexed previousOwner, address indexed newOwner); /** * @dev Initializes the contract setting the deployer as the initial owner. */ constructor() { _transferOwnership(_msgSender()); } /** * @dev Returns the address of the current owner. */ function owner() public view virtual returns (address) { return _owner; } /** * @dev Throws if called by any account other than the owner. */ modifier onlyOwner() { require(owner() == _msgSender(), "Ownable: caller is not the owner"); _; } /** * @dev Leaves the contract without owner. It will not be possible to call * `onlyOwner` functions anymore. Can only be called by the current owner. * * NOTE: Renouncing ownership will leave the contract without an owner, * thereby removing any functionality that is only available to the owner. */ function renounceOwnership() public virtual onlyOwner { _transferOwnership(address(0)); } /** * @dev Transfers ownership of the contract to a new account (`newOwner`). * Can only be called by the current owner. */ function transferOwnership(address newOwner) public virtual onlyOwner { require(newOwner != address(0), "Ownable: new owner is the zero address"); _transferOwnership(newOwner); } /** * @dev Transfers ownership of the contract to a new account (`newOwner`). * Internal function without access restriction. */ function _transferOwnership(address newOwner) internal virtual { address oldOwner = _owner; _owner = newOwner; emit OwnershipTransferred(oldOwner, newOwner); } } // File @openzeppelin/contracts/token/ERC20/[email protected] // OpenZeppelin Contracts (last updated v4.5.0) (token/ERC20/IERC20.sol) pragma solidity ^0.8.0; /** * @dev Interface of the ERC20 standard as defined in the EIP. */ interface IERC20 { /** * @dev Returns the amount of tokens in existence. */ function totalSupply() external view returns (uint256); /** * @dev Returns the amount of tokens owned by `account`. */ function balanceOf(address account) external view returns (uint256); /** * @dev Moves `amount` tokens from the caller's account to `to`. * * Returns a boolean value indicating whether the operation succeeded. * * Emits a {Transfer} event. */ function transfer(address to, uint256 amount) external returns (bool); /** * @dev Returns the remaining number of tokens that `spender` will be * allowed to spend on behalf of `owner` through {transferFrom}. This is * zero by default. * * This value changes when {approve} or {transferFrom} are called. */ function allowance(address owner, address spender) external view returns (uint256); /** * @dev Sets `amount` as the allowance of `spender` over the caller's tokens. * * Returns a boolean value indicating whether the operation succeeded. * * IMPORTANT: Beware that changing an allowance with this method brings the risk * that someone may use both the old and the new allowance by unfortunate * transaction ordering. One possible solution to mitigate this race * condition is to first reduce the spender's allowance to 0 and set the * desired value afterwards: * https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729 * * Emits an {Approval} event. */ function approve(address spender, uint256 amount) external returns (bool); /** * @dev Moves `amount` tokens from `from` to `to` using the * allowance mechanism. `amount` is then deducted from the caller's * allowance. * * Returns a boolean value indicating whether the operation succeeded. * * Emits a {Transfer} event. */ function transferFrom( address from, address to, uint256 amount ) external returns (bool); /** * @dev Emitted when `value` tokens are moved from one account (`from`) to * another (`to`). * * Note that `value` may be zero. */ event Transfer(address indexed from, address indexed to, uint256 value); /** * @dev Emitted when the allowance of a `spender` for an `owner` is set by * a call to {approve}. `value` is the new allowance. */ event Approval(address indexed owner, address indexed spender, uint256 value); } // File contracts/libraries/TransferHelper.sol pragma solidity ^0.8.0; interface IERC20NoReturn { function transfer(address recipient, uint256 amount) external; function transferFrom( address sender, address recipient, uint256 amount ) external; } // helper methods for interacting with ERC20 tokens that do not consistently return boolean library TransferHelper { function safeTransfer(IERC20 token, address to, uint value) internal { try IERC20NoReturn(address(token)).transfer(to, value) { } catch Error(string memory reason) { // catch failing revert() and require() revert(reason); } catch { revert("TransferHelper: transfer failed"); } } function safeTransferFrom(IERC20 token, address from, address to, uint value) internal { try IERC20NoReturn(address(token)).transferFrom(from, to, value) { } catch Error(string memory reason) { // catch failing revert() and require() revert(reason); } catch { revert("TransferHelper: transferFrom failed"); } } } // File contracts/interface/IWETH.sol pragma solidity ^0.8.0; interface IWETH { function deposit() external payable; function transfer(address to, uint value) external returns (bool); function withdraw(uint) external; } // File contracts/interface/IWardenPreTrade2.sol pragma solidity ^0.8.0; interface IWardenPreTrade2 { function preTradeAndFee( IERC20 _src, IERC20 _dest, uint256 _srcAmount, address _trader, address _receiver, uint256 _partnerId, uint256 _metaData ) external returns ( uint256[] memory _fees, address[] memory _collectors ); } // File @openzeppelin/contracts/utils/[email protected] // OpenZeppelin Contracts (last updated v4.5.0) (utils/Address.sol) pragma solidity ^0.8.1; /** * @dev Collection of functions related to the address type */ library Address { /** * @dev Returns true if `account` is a contract. * * [IMPORTANT] * ==== * It is unsafe to assume that an address for which this function returns * false is an externally-owned account (EOA) and not a contract. * * Among others, `isContract` will return false for the following * types of addresses: * * - an externally-owned account * - a contract in construction * - an address where a contract will be created * - an address where a contract lived, but was destroyed * ==== * * [IMPORTANT] * ==== * You shouldn't rely on `isContract` to protect against flash loan attacks! * * Preventing calls from contracts is highly discouraged. It breaks composability, breaks support for smart wallets * like Gnosis Safe, and does not provide security since it can be circumvented by calling from a contract * constructor. * ==== */ function isContract(address account) internal view returns (bool) { // This method relies on extcodesize/address.code.length, which returns 0 // for contracts in construction, since the code is only stored at the end // of the constructor execution. return account.code.length > 0; } /** * @dev Replacement for Solidity's `transfer`: sends `amount` wei to * `recipient`, forwarding all available gas and reverting on errors. * * https://eips.ethereum.org/EIPS/eip-1884[EIP1884] increases the gas cost * of certain opcodes, possibly making contracts go over the 2300 gas limit * imposed by `transfer`, making them unable to receive funds via * `transfer`. {sendValue} removes this limitation. * * https://diligence.consensys.net/posts/2019/09/stop-using-soliditys-transfer-now/[Learn more]. * * IMPORTANT: because control is transferred to `recipient`, care must be * taken to not create reentrancy vulnerabilities. Consider using * {ReentrancyGuard} or the * https://solidity.readthedocs.io/en/v0.5.11/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern]. */ function sendValue(address payable recipient, uint256 amount) internal { require(address(this).balance >= amount, "Address: insufficient balance"); (bool success, ) = recipient.call{value: amount}(""); require(success, "Address: unable to send value, recipient may have reverted"); } /** * @dev Performs a Solidity function call using a low level `call`. A * plain `call` is an unsafe replacement for a function call: use this * function instead. * * If `target` reverts with a revert reason, it is bubbled up by this * function (like regular Solidity function calls). * * Returns the raw returned data. To convert to the expected return value, * use https://solidity.readthedocs.io/en/latest/units-and-global-variables.html?highlight=abi.decode#abi-encoding-and-decoding-functions[`abi.decode`]. * * Requirements: * * - `target` must be a contract. * - calling `target` with `data` must not revert. * * _Available since v3.1._ */ function functionCall(address target, bytes memory data) internal returns (bytes memory) { return functionCall(target, data, "Address: low-level call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], but with * `errorMessage` as a fallback revert reason when `target` reverts. * * _Available since v3.1._ */ function functionCall( address target, bytes memory data, string memory errorMessage ) internal returns (bytes memory) { return functionCallWithValue(target, data, 0, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but also transferring `value` wei to `target`. * * Requirements: * * - the calling contract must have an ETH balance of at least `value`. * - the called Solidity function must be `payable`. * * _Available since v3.1._ */ function functionCallWithValue( address target, bytes memory data, uint256 value ) internal returns (bytes memory) { return functionCallWithValue(target, data, value, "Address: low-level call with value failed"); } /** * @dev Same as {xref-Address-functionCallWithValue-address-bytes-uint256-}[`functionCallWithValue`], but * with `errorMessage` as a fallback revert reason when `target` reverts. * * _Available since v3.1._ */ function functionCallWithValue( address target, bytes memory data, uint256 value, string memory errorMessage ) internal returns (bytes memory) { require(address(this).balance >= value, "Address: insufficient balance for call"); require(isContract(target), "Address: call to non-contract"); (bool success, bytes memory returndata) = target.call{value: value}(data); return verifyCallResult(success, returndata, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but performing a static call. * * _Available since v3.3._ */ function functionStaticCall(address target, bytes memory data) internal view returns (bytes memory) { return functionStaticCall(target, data, "Address: low-level static call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`], * but performing a static call. * * _Available since v3.3._ */ function functionStaticCall( address target, bytes memory data, string memory errorMessage ) internal view returns (bytes memory) { require(isContract(target), "Address: static call to non-contract"); (bool success, bytes memory returndata) = target.staticcall(data); return verifyCallResult(success, returndata, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but performing a delegate call. * * _Available since v3.4._ */ function functionDelegateCall(address target, bytes memory data) internal returns (bytes memory) { return functionDelegateCall(target, data, "Address: low-level delegate call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`], * but performing a delegate call. * * _Available since v3.4._ */ function functionDelegateCall( address target, bytes memory data, string memory errorMessage ) internal returns (bytes memory) { require(isContract(target), "Address: delegate call to non-contract"); (bool success, bytes memory returndata) = target.delegatecall(data); return verifyCallResult(success, returndata, errorMessage); } /** * @dev Tool to verifies that a low level call was successful, and revert if it wasn't, either by bubbling the * revert reason using the provided one. * * _Available since v4.3._ */ function verifyCallResult( bool success, bytes memory returndata, string memory errorMessage ) internal pure returns (bytes memory) { if (success) { return returndata; } else { // Look for revert reason and bubble it up if present if (returndata.length > 0) { // The easiest way to bubble the revert reason is using memory via assembly assembly { let returndata_size := mload(returndata) revert(add(32, returndata), returndata_size) } } else { revert(errorMessage); } } } } // File @openzeppelin/contracts/token/ERC20/utils/[email protected] // OpenZeppelin Contracts v4.4.1 (token/ERC20/utils/SafeERC20.sol) pragma solidity ^0.8.0; /** * @title SafeERC20 * @dev Wrappers around ERC20 operations that throw on failure (when the token * contract returns false). Tokens that return no value (and instead revert or * throw on failure) are also supported, non-reverting calls are assumed to be * successful. * To use this library you can add a `using SafeERC20 for IERC20;` statement to your contract, * which allows you to call the safe operations as `token.safeTransfer(...)`, etc. */ library SafeERC20 { using Address for address; function safeTransfer( IERC20 token, address to, uint256 value ) internal { _callOptionalReturn(token, abi.encodeWithSelector(token.transfer.selector, to, value)); } function safeTransferFrom( IERC20 token, address from, address to, uint256 value ) internal { _callOptionalReturn(token, abi.encodeWithSelector(token.transferFrom.selector, from, to, value)); } /** * @dev Deprecated. This function has issues similar to the ones found in * {IERC20-approve}, and its usage is discouraged. * * Whenever possible, use {safeIncreaseAllowance} and * {safeDecreaseAllowance} instead. */ function safeApprove( IERC20 token, address spender, uint256 value ) internal { // safeApprove should only be called when setting an initial allowance, // or when resetting it to zero. To increase and decrease it, use // 'safeIncreaseAllowance' and 'safeDecreaseAllowance' require( (value == 0) || (token.allowance(address(this), spender) == 0), "SafeERC20: approve from non-zero to non-zero allowance" ); _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, value)); } function safeIncreaseAllowance( IERC20 token, address spender, uint256 value ) internal { uint256 newAllowance = token.allowance(address(this), spender) + value; _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, newAllowance)); } function safeDecreaseAllowance( IERC20 token, address spender, uint256 value ) internal { unchecked { uint256 oldAllowance = token.allowance(address(this), spender); require(oldAllowance >= value, "SafeERC20: decreased allowance below zero"); uint256 newAllowance = oldAllowance - value; _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, newAllowance)); } } /** * @dev Imitates a Solidity high-level call (i.e. a regular function call to a contract), relaxing the requirement * on the return value: the return value is optional (but if data is returned, it must not be false). * @param token The token targeted by the call. * @param data The call data (encoded using abi.encode or one of its variants). */ function _callOptionalReturn(IERC20 token, bytes memory data) private { // We need to perform a low level call here, to bypass Solidity's return data size checking mechanism, since // we're implementing it ourselves. We use {Address.functionCall} to perform this call, which verifies that // the target address contains contract code and also asserts for success in the low-level call. bytes memory returndata = address(token).functionCall(data, "SafeERC20: low-level call failed"); if (returndata.length > 0) { // Return data is optional require(abi.decode(returndata, (bool)), "SafeERC20: ERC20 operation did not succeed"); } } } // File contracts/interface/IWardenSwap2.sol pragma solidity ^0.8.0; interface IWardenSwap2 { function trade( bytes calldata _data, IERC20 _src, uint256 _srcAmount, uint256 _originalSrcAmount, IERC20 _dest, address _receiver, address _trader, uint256 _partnerId, uint256 _metaData ) external; function tradeSplit( bytes calldata _data, uint256[] calldata _volumes, IERC20 _src, uint256 _totalSrcAmount, uint256 _originalSrcAmount, IERC20 _dest, address _receiver, address _trader, uint256 _partnerId, uint256 _metaData ) external; } // File contracts/swap/WardenRouterV2.sol pragma solidity ^0.8.0; contract WardenRouterV2 is Ownable { using TransferHelper for IERC20; IWardenPreTrade2 public preTrade; IWETH public immutable weth; IERC20 private constant ETHER_ERC20 = IERC20(0xEeeeeEeeeEeEeeEeEeEeeEEEeeeeEeeeeeeeEEeE); event UpdatedWardenPreTrade( IWardenPreTrade2 indexed preTrade ); /** * @dev When fee is collected by WardenSwap for a trade, this event will be emitted * @param token Collected token * @param wallet Collector address * @param amount Amount of fee collected */ event ProtocolFee( IERC20 indexed token, address indexed wallet, uint256 amount ); /** * @dev When fee is collected by WardenSwap's partners for a trade, this event will be emitted * @param partnerId Partner ID * @param token Collected token * @param wallet Collector address * @param amount Amount of fee collected */ event PartnerFee( uint256 indexed partnerId, IERC20 indexed token, address indexed wallet, uint256 amount ); /** * @dev When the new trade occurs (and success), this event will be emitted. * @param srcAsset Source token * @param srcAmount Amount of source token * @param destAsset Destination token * @param destAmount Amount of destination token * @param trader User address */ event Trade( address indexed srcAsset, uint256 srcAmount, address indexed destAsset, uint256 destAmount, address indexed trader, address receiver, bool hasSplitted ); constructor( IWardenPreTrade2 _preTrade, IWETH _weth ) { preTrade = _preTrade; weth = _weth; emit UpdatedWardenPreTrade(_preTrade); } function updateWardenPreTrade( IWardenPreTrade2 _preTrade ) external onlyOwner { preTrade = _preTrade; emit UpdatedWardenPreTrade(_preTrade); } /** * @dev Performs a trade with single volume * @param _swap Warden Swap contract * @param _data Warden Swap payload * @param _deposits Source token receiver * @param _src Source token * @param _srcAmount Amount of source tokens * @param _dest Destination token * @param _minDestAmount Minimum of destination token amount * @param _receiver Destination token receiver * @param _partnerId Partner id for fee sharing / Referral * @param _metaData Reserved for upcoming features * @return _destAmount Amount of actual destination tokens */ function swap( IWardenSwap2 _swap, bytes calldata _data, address _deposits, IERC20 _src, uint256 _srcAmount, IERC20 _dest, uint256 _minDestAmount, address _receiver, uint256 _partnerId, uint256 _metaData ) public payable returns(uint256 _destAmount) { if (_receiver == address(0)) { _receiver = msg.sender; } // Collect fee uint256 newSrcAmount = _preTradeAndCollectFee( _src, _dest, _srcAmount, msg.sender, _receiver, _partnerId, _metaData ); // Wrap ETH if (ETHER_ERC20 == _src) { require(msg.value == _srcAmount, "WardenRouter::swap: Ether source amount mismatched"); weth.deposit{value: newSrcAmount}(); // Transfer user tokens to target IERC20(address(weth)).safeTransfer(_deposits, newSrcAmount); } else { // Transfer user tokens to target _src.safeTransferFrom(msg.sender, _deposits, newSrcAmount); } bytes memory payload = abi.encodeWithSelector(IWardenSwap2.trade.selector, _data, _src, newSrcAmount, _srcAmount, _dest, _receiver, msg.sender, _partnerId, _metaData ); _destAmount = _internalSwap( _swap, payload, _dest, _minDestAmount, _receiver ); emit Trade(address(_src), _srcAmount, address(_dest), _destAmount, msg.sender, _receiver, false); } /** * @dev Performs a trade by splitting volumes * @param _swap Warden Swap contract * @param _data Warden Swap payload * @param _deposits Source token receivers * @param _volumes Volume percentages * @param _src Source token * @param _totalSrcAmount Amount of source tokens * @param _dest Destination token * @param _minDestAmount Minimum of destination token amount * @param _receiver Destination token receiver * @param _partnerId Partner id for fee sharing / Referral * @param _metaData Reserved for upcoming features * @return _destAmount Amount of actual destination tokens */ function swapSplit( IWardenSwap2 _swap, bytes calldata _data, address[] memory _deposits, uint256[] memory _volumes, IERC20 _src, uint256 _totalSrcAmount, IERC20 _dest, uint256 _minDestAmount, address _receiver, uint256 _partnerId, uint256 _metaData ) public payable returns(uint256 _destAmount) { if (_receiver == address(0)) { _receiver = msg.sender; } // Collect fee uint256 newTotalSrcAmount = _preTradeAndCollectFee( _src, _dest, _totalSrcAmount, msg.sender, _receiver, _partnerId, _metaData ); // Wrap ETH if (ETHER_ERC20 == _src) { require(msg.value == _totalSrcAmount, "WardenRouter::swapSplit: Ether source amount mismatched"); weth.deposit{value: newTotalSrcAmount}(); } // Transfer user tokens to targets _depositVolumes( newTotalSrcAmount, _deposits, _volumes, _src ); bytes memory payload = abi.encodeWithSelector(IWardenSwap2.tradeSplit.selector, _data, _volumes, _src, newTotalSrcAmount, _totalSrcAmount, _dest, _receiver, msg.sender, _partnerId, _metaData ); _destAmount = _internalSwap( _swap, payload, _dest, _minDestAmount, _receiver ); emit Trade(address(_src), _totalSrcAmount, address(_dest), _destAmount, msg.sender, _receiver, true); } function _depositVolumes( uint256 newTotalSrcAmount, address[] memory _deposits, uint256[] memory _volumes, IERC20 _src ) private { { uint256 amountRemain = newTotalSrcAmount; for (uint i = 0; i < _deposits.length; i++) { uint256 amountForThisRound; if (i == _deposits.length - 1) { amountForThisRound = amountRemain; } else { amountForThisRound = newTotalSrcAmount * _volumes[i] / 100; amountRemain = amountRemain - amountForThisRound; } if (ETHER_ERC20 == _src) { IERC20(address(weth)).safeTransfer(_deposits[i], amountForThisRound); } else { _src.safeTransferFrom(msg.sender, _deposits[i], amountForThisRound); } } } } function _internalSwap( IWardenSwap2 _swap, bytes memory _payload, IERC20 _dest, uint256 _minDestAmount, address _receiver ) private returns (uint256 _destAmount) { // Record dest asset for later consistency check. uint256 destAmountBefore = ETHER_ERC20 == _dest ? _receiver.balance : _dest.balanceOf(_receiver); { // solhint-disable-next-line avoid-low-level-calls (bool success, bytes memory result) = address(_swap).call(_payload); if (!success) { // Next 5 lines from https://ethereum.stackexchange.com/a/83577 if (result.length < 68) revert(); assembly { result := add(result, 0x04) } revert(abi.decode(result, (string))); } } _destAmount = ETHER_ERC20 == _dest ? _receiver.balance - destAmountBefore : _dest.balanceOf(_receiver) - destAmountBefore; // Throw exception if destination amount doesn't meet user requirement. require(_destAmount >= _minDestAmount, "WardenRouter::_internalSwap: destination amount is too low."); } function _preTradeAndCollectFee( IERC20 _src, IERC20 _dest, uint256 _srcAmount, address _trader, address _receiver, uint256 _partnerId, uint256 _metaData ) private returns (uint256 _newSrcAmount) { // Collect fee (uint256[] memory fees, address[] memory feeWallets) = preTrade.preTradeAndFee( _src, _dest, _srcAmount, _trader, _receiver, _partnerId, _metaData ); _newSrcAmount = _srcAmount; if (fees.length > 0) { if (fees[0] > 0) { _collectFee( _trader, _src, fees[0], feeWallets[0] ); _newSrcAmount -= fees[0]; } if (fees.length == 2 && fees[1] > 0) { _partnerFee( _trader, _partnerId, // partner id _src, fees[1], feeWallets[1] ); _newSrcAmount -= fees[1]; } } } function _collectFee( address _trader, IERC20 _token, uint256 _fee, address _feeWallet ) private { if (ETHER_ERC20 == _token) { (bool success, ) = payable(_feeWallet).call{value: _fee}(""); // Send ether to fee collector require(success, "WardenRouter::_collectFee: Transfer fee of ether failed."); } else { _token.safeTransferFrom(_trader, _feeWallet, _fee); // Send token to fee collector } emit ProtocolFee(_token, _feeWallet, _fee); } function _partnerFee( address _trader, uint256 _partnerId, IERC20 _token, uint256 _fee, address _feeWallet ) private { if (ETHER_ERC20 == _token) { (bool success, ) = payable(_feeWallet).call{value: _fee}(""); // Send back ether to partner require(success, "WardenRouter::_partnerFee: Transfer fee of ether failed."); } else { _token.safeTransferFrom(_trader, _feeWallet, _fee); } emit PartnerFee(_partnerId, _token, _feeWallet, _fee); } /** * @dev Performs a trade ETH -> WETH * @param _receiver Receiver address * @return _destAmount Amount of actual destination tokens */ function tradeEthToWeth( address _receiver ) external payable returns(uint256 _destAmount) { if (_receiver == address(0)) { _receiver = msg.sender; } weth.deposit{value: msg.value}(); IERC20(address(weth)).safeTransfer(_receiver, msg.value); _destAmount = msg.value; emit Trade(address(ETHER_ERC20), msg.value, address(weth), _destAmount, msg.sender, _receiver, false); } /** * @dev Performs a trade WETH -> ETH * @param _srcAmount Amount of source tokens * @param _receiver Receiver address * @return _destAmount Amount of actual destination tokens */ function tradeWethToEth( uint256 _srcAmount, address _receiver ) external returns(uint256 _destAmount) { if (_receiver == address(0)) { _receiver = msg.sender; } IERC20(address(weth)).safeTransferFrom(msg.sender, address(this), _srcAmount); weth.withdraw(_srcAmount); (bool success, ) = _receiver.call{value: _srcAmount}(""); // Send back ether to receiver require(success, "WardenRouter::tradeWethToEth: Transfer ether back to receiver failed."); _destAmount = _srcAmount; emit Trade(address(weth), _srcAmount, address(ETHER_ERC20), _destAmount, msg.sender, _receiver, false); } // Receive ETH in case of trade WETH -> ETH receive() external payable { require(msg.sender == address(weth), "WardenRouter: Receive Ether only from WETH"); } // In case of an expected and unexpected event that has some token amounts remain in this contract, owner can call to collect them. function collectRemainingToken( IERC20 _token, uint256 _amount ) external onlyOwner { _token.safeTransfer(msg.sender, _amount); } // In case of an expected and unexpected event that has some ether amounts remain in this contract, owner can call to collect them. function collectRemainingEther( uint256 _amount ) external onlyOwner { (bool success, ) = msg.sender.call{value: _amount}(""); // Send back ether to sender require(success, "WardenRouter::collectRemainingEther: Transfer ether back to caller failed."); } } // File contracts/library/byte/BytesLib.sol // MODIFIED VERSION FROM https://github.com/GNSPS/solidity-bytes-utils/blob/master/contracts/BytesLib.sol pragma solidity >=0.8.0 <0.9.0; library BytesLib { function concat( bytes memory _preBytes, bytes memory _postBytes ) internal pure returns (bytes memory) { bytes memory tempBytes; assembly { // Get a location of some free memory and store it in tempBytes as // Solidity does for memory variables. tempBytes := mload(0x40) // Store the length of the first bytes array at the beginning of // the memory for tempBytes. let length := mload(_preBytes) mstore(tempBytes, length) // Maintain a memory counter for the current write location in the // temp bytes array by adding the 32 bytes for the array length to // the starting location. let mc := add(tempBytes, 0x20) // Stop copying when the memory counter reaches the length of the // first bytes array. let end := add(mc, length) for { // Initialize a copy counter to the start of the _preBytes data, // 32 bytes into its memory. let cc := add(_preBytes, 0x20) } lt(mc, end) { // Increase both counters by 32 bytes each iteration. mc := add(mc, 0x20) cc := add(cc, 0x20) } { // Write the _preBytes data into the tempBytes memory 32 bytes // at a time. mstore(mc, mload(cc)) } // Add the length of _postBytes to the current length of tempBytes // and store it as the new length in the first 32 bytes of the // tempBytes memory. length := mload(_postBytes) mstore(tempBytes, add(length, mload(tempBytes))) // Move the memory counter back from a multiple of 0x20 to the // actual end of the _preBytes data. mc := end // Stop copying when the memory counter reaches the new combined // length of the arrays. end := add(mc, length) for { let cc := add(_postBytes, 0x20) } lt(mc, end) { mc := add(mc, 0x20) cc := add(cc, 0x20) } { mstore(mc, mload(cc)) } // Update the free-memory pointer by padding our last write location // to 32 bytes: add 31 bytes to the end of tempBytes to move to the // next 32 byte block, then round down to the nearest multiple of // 32. If the sum of the length of the two arrays is zero then add // one before rounding down to leave a blank 32 bytes (the length block with 0). mstore(0x40, and( add(add(end, iszero(add(length, mload(_preBytes)))), 31), not(31) // Round down to the nearest 32 bytes. )) } return tempBytes; } function concatStorage(bytes storage _preBytes, bytes memory _postBytes) internal { assembly { // Read the first 32 bytes of _preBytes storage, which is the length // of the array. (We don't need to use the offset into the slot // because arrays use the entire slot.) let fslot := sload(_preBytes.slot) // Arrays of 31 bytes or less have an even value in their slot, // while longer arrays have an odd value. The actual length is // the slot divided by two for odd values, and the lowest order // byte divided by two for even values. // If the slot is even, bitwise and the slot with 255 and divide by // two to get the length. If the slot is odd, bitwise and the slot // with -1 and divide by two. let slength := div(and(fslot, sub(mul(0x100, iszero(and(fslot, 1))), 1)), 2) let mlength := mload(_postBytes) let newlength := add(slength, mlength) // slength can contain both the length and contents of the array // if length < 32 bytes so let's prepare for that // v. http://solidity.readthedocs.io/en/latest/miscellaneous.html#layout-of-state-variables-in-storage switch add(lt(slength, 32), lt(newlength, 32)) case 2 { // Since the new array still fits in the slot, we just need to // update the contents of the slot. // uint256(bytes_storage) = uint256(bytes_storage) + uint256(bytes_memory) + new_length sstore( _preBytes.slot, // all the modifications to the slot are inside this // next block add( // we can just add to the slot contents because the // bytes we want to change are the LSBs fslot, add( mul( div( // load the bytes from memory mload(add(_postBytes, 0x20)), // zero all bytes to the right exp(0x100, sub(32, mlength)) ), // and now shift left the number of bytes to // leave space for the length in the slot exp(0x100, sub(32, newlength)) ), // increase length by the double of the memory // bytes length mul(mlength, 2) ) ) ) } case 1 { // The stored value fits in the slot, but the combined value // will exceed it. // get the keccak hash to get the contents of the array mstore(0x0, _preBytes.slot) let sc := add(keccak256(0x0, 0x20), div(slength, 32)) // save new length sstore(_preBytes.slot, add(mul(newlength, 2), 1)) // The contents of the _postBytes array start 32 bytes into // the structure. Our first read should obtain the `submod` // bytes that can fit into the unused space in the last word // of the stored array. To get this, we read 32 bytes starting // from `submod`, so the data we read overlaps with the array // contents by `submod` bytes. Masking the lowest-order // `submod` bytes allows us to add that value directly to the // stored value. let submod := sub(32, slength) let mc := add(_postBytes, submod) let end := add(_postBytes, mlength) let mask := sub(exp(0x100, submod), 1) sstore( sc, add( and( fslot, 0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00 ), and(mload(mc), mask) ) ) for { mc := add(mc, 0x20) sc := add(sc, 1) } lt(mc, end) { sc := add(sc, 1) mc := add(mc, 0x20) } { sstore(sc, mload(mc)) } mask := exp(0x100, sub(mc, end)) sstore(sc, mul(div(mload(mc), mask), mask)) } default { // get the keccak hash to get the contents of the array mstore(0x0, _preBytes.slot) // Start copying to the last used word of the stored array. let sc := add(keccak256(0x0, 0x20), div(slength, 32)) // save new length sstore(_preBytes.slot, add(mul(newlength, 2), 1)) // Copy over the first `submod` bytes of the new data as in // case 1 above. let slengthmod := mod(slength, 32) let mlengthmod := mod(mlength, 32) let submod := sub(32, slengthmod) let mc := add(_postBytes, submod) let end := add(_postBytes, mlength) let mask := sub(exp(0x100, submod), 1) sstore(sc, add(sload(sc), and(mload(mc), mask))) for { sc := add(sc, 1) mc := add(mc, 0x20) } lt(mc, end) { sc := add(sc, 1) mc := add(mc, 0x20) } { sstore(sc, mload(mc)) } mask := exp(0x100, sub(mc, end)) sstore(sc, mul(div(mload(mc), mask), mask)) } } } function slice( bytes memory _bytes, uint256 _start, uint256 _length ) internal pure returns (bytes memory) { require(_length + 31 >= _length, "slice_overflow"); require(_bytes.length >= _start + _length, "slice_outOfBounds"); bytes memory tempBytes; assembly { switch iszero(_length) case 0 { // Get a location of some free memory and store it in tempBytes as // Solidity does for memory variables. tempBytes := mload(0x40) // The first word of the slice result is potentially a partial // word read from the original array. To read it, we calculate // the length of that partial word and start copying that many // bytes into the array. The first word we copy will start with // data we don't care about, but the last `lengthmod` bytes will // land at the beginning of the contents of the new array. When // we're done copying, we overwrite the full first word with // the actual length of the slice. let lengthmod := and(_length, 31) // The multiplication in the next line is necessary // because when slicing multiples of 32 bytes (lengthmod == 0) // the following copy loop was copying the origin's length // and then ending prematurely not copying everything it should. let mc := add(add(tempBytes, lengthmod), mul(0x20, iszero(lengthmod))) let end := add(mc, _length) for { // The multiplication in the next line has the same exact purpose // as the one above. let cc := add(add(add(_bytes, lengthmod), mul(0x20, iszero(lengthmod))), _start) } lt(mc, end) { mc := add(mc, 0x20) cc := add(cc, 0x20) } { mstore(mc, mload(cc)) } mstore(tempBytes, _length) //update free-memory pointer //allocating the array padded to 32 bytes like the compiler does now mstore(0x40, and(add(mc, 31), not(31))) } //if we want a zero-length slice let's just return a zero-length array default { tempBytes := mload(0x40) //zero out the 32 bytes slice we are about to return //we need to do it because Solidity does not garbage collect mstore(tempBytes, 0) mstore(0x40, add(tempBytes, 0x20)) } } return tempBytes; } function toAddress(bytes memory _bytes, uint256 _start) internal pure returns (address) { require(_bytes.length >= _start + 20, "toAddress_outOfBounds"); address tempAddress; assembly { tempAddress := div(mload(add(add(_bytes, 0x20), _start)), 0x1000000000000000000000000) } return tempAddress; } function toUint8(bytes memory _bytes, uint256 _start) internal pure returns (uint8) { require(_bytes.length >= _start + 1 , "toUint8_outOfBounds"); uint8 tempUint; assembly { tempUint := mload(add(add(_bytes, 0x1), _start)) } return tempUint; } function toUint16(bytes memory _bytes, uint256 _start) internal pure returns (uint16) { require(_bytes.length >= _start + 2, "toUint16_outOfBounds"); uint16 tempUint; assembly { tempUint := mload(add(add(_bytes, 0x2), _start)) } return tempUint; } function toUint24(bytes memory _bytes, uint256 _start) internal pure returns (uint24) { require(_bytes.length >= _start + 3, "toUint24_outOfBounds"); uint24 tempUint; assembly { tempUint := mload(add(add(_bytes, 0x3), _start)) } return tempUint; } function toUint32(bytes memory _bytes, uint256 _start) internal pure returns (uint32) { require(_bytes.length >= _start + 4, "toUint32_outOfBounds"); uint32 tempUint; assembly { tempUint := mload(add(add(_bytes, 0x4), _start)) } return tempUint; } function toUint64(bytes memory _bytes, uint256 _start) internal pure returns (uint64) { require(_bytes.length >= _start + 8, "toUint64_outOfBounds"); uint64 tempUint; assembly { tempUint := mload(add(add(_bytes, 0x8), _start)) } return tempUint; } function toUint80(bytes memory _bytes, uint256 _start) internal pure returns (uint80) { require(_bytes.length >= _start + 10, "toUint80_outOfBounds"); uint80 tempUint; assembly { tempUint := mload(add(add(_bytes, 0xa), _start)) } return tempUint; } function toUint96(bytes memory _bytes, uint256 _start) internal pure returns (uint96) { require(_bytes.length >= _start + 12, "toUint96_outOfBounds"); uint96 tempUint; assembly { tempUint := mload(add(add(_bytes, 0xc), _start)) } return tempUint; } function toUint112(bytes memory _bytes, uint256 _start) internal pure returns (uint112) { require(_bytes.length >= _start + 14, "toUint112_outOfBounds"); uint112 tempUint; assembly { tempUint := mload(add(add(_bytes, 0xe), _start)) } return tempUint; } function toUint128(bytes memory _bytes, uint256 _start) internal pure returns (uint128) { require(_bytes.length >= _start + 16, "toUint128_outOfBounds"); uint128 tempUint; assembly { tempUint := mload(add(add(_bytes, 0x10), _start)) } return tempUint; } function toUint256(bytes memory _bytes, uint256 _start) internal pure returns (uint256) { require(_bytes.length >= _start + 32, "toUint256_outOfBounds"); uint256 tempUint; assembly { tempUint := mload(add(add(_bytes, 0x20), _start)) } return tempUint; } function toBytes32(bytes memory _bytes, uint256 _start) internal pure returns (bytes32) { require(_bytes.length >= _start + 32, "toBytes32_outOfBounds"); bytes32 tempBytes32; assembly { tempBytes32 := mload(add(add(_bytes, 0x20), _start)) } return tempBytes32; } function equal(bytes memory _preBytes, bytes memory _postBytes) internal pure returns (bool) { bool success = true; assembly { let length := mload(_preBytes) // if lengths don't match the arrays are not equal switch eq(length, mload(_postBytes)) case 1 { // cb is a circuit breaker in the for loop since there's // no said feature for inline assembly loops // cb = 1 - don't breaker // cb = 0 - break let cb := 1 let mc := add(_preBytes, 0x20) let end := add(mc, length) for { let cc := add(_postBytes, 0x20) // the next line is the loop condition: // while(uint256(mc < end) + cb == 2) } eq(add(lt(mc, end), cb), 2) { mc := add(mc, 0x20) cc := add(cc, 0x20) } { // if any of these checks fails then arrays are not equal if iszero(eq(mload(mc), mload(cc))) { // unsuccess: success := 0 cb := 0 } } } default { // unsuccess: success := 0 } } return success; } function equalStorage( bytes storage _preBytes, bytes memory _postBytes ) internal view returns (bool) { bool success = true; assembly { // we know _preBytes_offset is 0 let fslot := sload(_preBytes.slot) // Decode the length of the stored array like in concatStorage(). let slength := div(and(fslot, sub(mul(0x100, iszero(and(fslot, 1))), 1)), 2) let mlength := mload(_postBytes) // if lengths don't match the arrays are not equal switch eq(slength, mlength) case 1 { // slength can contain both the length and contents of the array // if length < 32 bytes so let's prepare for that // v. http://solidity.readthedocs.io/en/latest/miscellaneous.html#layout-of-state-variables-in-storage if iszero(iszero(slength)) { switch lt(slength, 32) case 1 { // blank the last byte which is the length fslot := mul(div(fslot, 0x100), 0x100) if iszero(eq(fslot, mload(add(_postBytes, 0x20)))) { // unsuccess: success := 0 } } default { // cb is a circuit breaker in the for loop since there's // no said feature for inline assembly loops // cb = 1 - don't breaker // cb = 0 - break let cb := 1 // get the keccak hash to get the contents of the array mstore(0x0, _preBytes.slot) let sc := keccak256(0x0, 0x20) let mc := add(_postBytes, 0x20) let end := add(mc, mlength) // the next line is the loop condition: // while(uint256(mc < end) + cb == 2) for {} eq(add(lt(mc, end), cb), 2) { sc := add(sc, 1) mc := add(mc, 0x20) } { if iszero(eq(sload(sc), mload(mc))) { // unsuccess: success := 0 cb := 0 } } } } } default { // unsuccess: success := 0 } } return success; } } // File contracts/arbitrum/interface/IArbAddressTable.sol pragma solidity ^0.8.0; /** @title Precompiled contract that exists in every Arbitrum chain at 0x0000000000000000000000000000000000000066. * Allows registering / retrieving addresses at uint indices, saving calldata. */ interface IArbAddressTable { /** * @notice Register an address in the address table * @param addr address to register * @return index of the address (existing index, or newly created index if not already registered) */ function register(address addr) external returns(uint); /** * @param addr address to lookup * @return index of an address in the address table (revert if address isn't in the table) */ function lookup(address addr) external view returns(uint); /** * @notice Check whether an address exists in the address table * @param addr address to check for presence in table * @return true if address is in table */ function addressExists(address addr) external view returns(bool); /** * @return size of address table (= first unused index) */ function size() external view returns(uint); /** * @param index index to lookup address * @return address at a given index in address table (revert if index is beyond end of table) */ function lookupIndex(uint index) external view returns(address); /** * @notice read a compressed address from a bytes buffer * @param buf bytes buffer containing an address * @param offset offset of target address * @return resulting address and updated offset into the buffer (revert if buffer is too short) */ function decompress(bytes calldata buf, uint offset) external pure returns(address, uint); /** * @notice compress an address and return the result * @param addr address to compress * @return compressed address bytes */ function compress(address addr) external returns(bytes memory); } // File contracts/libraries/WardenDataDeserialize2.sol pragma solidity ^0.8.0; contract WardenDataDeserialize2 { using BytesLib for bytes; IArbAddressTable public immutable addressTable; bool public autoRegisterAddressMapping; event SetAutoRegisterAddressMapping(bool _enable); constructor( IArbAddressTable _addressTable, bool _autoRegisterAddressMapping ) { addressTable = _addressTable; autoRegisterAddressMapping = _autoRegisterAddressMapping; } function _setAutoRegisterAddressMapping( bool _enable ) internal { autoRegisterAddressMapping = _enable; emit SetAutoRegisterAddressMapping(_enable); } function toBytes(bytes32 _data) private pure returns (bytes memory) { return abi.encodePacked(_data); } function _lookupAddress( bytes memory _data, uint256 _cursor ) internal returns ( address _address, uint256 _newCursor ) { uint8 instruction = _data.toUint8(_cursor); _cursor += 1; if (instruction == 0) { // not registered _address = _data.toAddress(_cursor); _cursor += 20; if (autoRegisterAddressMapping) { addressTable.register(_address); } } else if (instruction == 1) { // registered (32-bit) _address = addressTable.lookupIndex(_data.toUint32(_cursor)); _cursor += 4; } else if (instruction == 2) { // registered (24-bit) _address = addressTable.lookupIndex(_data.toUint24(_cursor)); _cursor += 3; } else if (instruction == 3) { // skip _address = 0x0000000000000000000000000000000000000000; } else { revert("WardenDataDeserialize:_lookupAddress bad instruction"); } _newCursor = _cursor; } function _decodeAmount( bytes memory _data, uint256 _cursor ) internal pure returns ( uint256 _amount, uint256 _newCursor ) { uint8 instruction = _data.toUint8(_cursor); _cursor += 1; if (instruction == 0) { // 64-bit, 18 (denominated in 1e18) _amount = _data.toUint64(_cursor); _cursor += 8; } else if (instruction == 1) { // 80-bit, 1.2m (denominated in 1e18) _amount = _data.toUint80(_cursor); _cursor += 10; } else if (instruction == 2) { // 96-bit, 79.2b (denominated in 1e18) _amount = _data.toUint96(_cursor); _cursor += 12; } else if (instruction == 3) { // 112-bit, 5,192mm (denominated in 1e18) _amount = _data.toUint112(_cursor); _cursor += 14; } else if (instruction == 4) { // zero _amount = 0; } else { revert("WardenDataDeserialize:_decodeAmount bad instruction"); } _newCursor = _cursor; } struct SwapData { address swap; address src; address dest; address receiver; uint256 srcAmount; uint256 minDestAmount; uint256 partnerId; uint256 metaData; } function decodeSwapData( bytes memory _data, uint256 _cursor ) public returns ( SwapData memory _swapData, uint256 _newCursor ) { (_swapData.swap, _cursor) = _lookupAddress(_data, _cursor); (_swapData.src, _cursor) = _lookupAddress(_data, _cursor); (_swapData.dest, _cursor) = _lookupAddress(_data, _cursor); (_swapData.receiver, _cursor) = _lookupAddress(_data, _cursor); (_swapData.srcAmount, _cursor) = _decodeAmount(_data, _cursor); (_swapData.minDestAmount, _cursor) = _decodeAmount(_data, _cursor); (_swapData.partnerId, _cursor) = _decodeAmount(_data, _cursor); (_swapData.metaData, _cursor) = _decodeAmount(_data, _cursor); _newCursor = _cursor; } } // File contracts/swap/L2/WardenRouterV2_L2.sol pragma solidity ^0.8.0; contract WardenRouterV2_L2 is WardenRouterV2, WardenDataDeserialize2 { constructor( IWardenPreTrade2 _preTrade, IWETH _weth, IArbAddressTable _addressTable, bool _autoRegisterAddressMapping ) WardenRouterV2(_preTrade, _weth) WardenDataDeserialize2(_addressTable, _autoRegisterAddressMapping) { } function setAutoRegisterAddressMapping( bool _enable ) external onlyOwner { _setAutoRegisterAddressMapping(_enable); } function swapCompressed( bytes calldata _data ) external payable returns(uint256 _destAmount) { ( SwapData memory swapData, uint256 cursor ) = decodeSwapData(_data, 0); return WardenRouterV2.swap( IWardenSwap2(swapData.swap), _data[cursor:], swapData.swap, IERC20(swapData.src), swapData.srcAmount, IERC20(swapData.dest), swapData.minDestAmount, swapData.receiver, swapData.partnerId, swapData.metaData ); } function swapSplitCompressed( bytes calldata _data ) external payable returns(uint256 _destAmount) { ( SwapData memory swapData, uint256 cursor ) = decodeSwapData(_data, 0); address[] memory _deposits = new address[](1); uint256[] memory _volumes = new uint256[](0); _deposits[0] = swapData.swap; return WardenRouterV2.swapSplit( IWardenSwap2(swapData.swap), _data[cursor:], _deposits, _volumes, IERC20(swapData.src), swapData.srcAmount, IERC20(swapData.dest), swapData.minDestAmount, swapData.receiver, swapData.partnerId, swapData.metaData ); } }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
Contract ABI
API[{"inputs":[{"internalType":"contract IWardenPreTrade2","name":"_preTrade","type":"address"},{"internalType":"contract IWETH","name":"_weth","type":"address"},{"internalType":"contract IArbAddressTable","name":"_addressTable","type":"address"},{"internalType":"bool","name":"_autoRegisterAddressMapping","type":"bool"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"partnerId","type":"uint256"},{"indexed":true,"internalType":"contract IERC20","name":"token","type":"address"},{"indexed":true,"internalType":"address","name":"wallet","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"PartnerFee","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"contract IERC20","name":"token","type":"address"},{"indexed":true,"internalType":"address","name":"wallet","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"ProtocolFee","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"bool","name":"_enable","type":"bool"}],"name":"SetAutoRegisterAddressMapping","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"srcAsset","type":"address"},{"indexed":false,"internalType":"uint256","name":"srcAmount","type":"uint256"},{"indexed":true,"internalType":"address","name":"destAsset","type":"address"},{"indexed":false,"internalType":"uint256","name":"destAmount","type":"uint256"},{"indexed":true,"internalType":"address","name":"trader","type":"address"},{"indexed":false,"internalType":"address","name":"receiver","type":"address"},{"indexed":false,"internalType":"bool","name":"hasSplitted","type":"bool"}],"name":"Trade","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"contract IWardenPreTrade2","name":"preTrade","type":"address"}],"name":"UpdatedWardenPreTrade","type":"event"},{"inputs":[],"name":"addressTable","outputs":[{"internalType":"contract IArbAddressTable","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"autoRegisterAddressMapping","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"collectRemainingEther","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"contract IERC20","name":"_token","type":"address"},{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"collectRemainingToken","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes","name":"_data","type":"bytes"},{"internalType":"uint256","name":"_cursor","type":"uint256"}],"name":"decodeSwapData","outputs":[{"components":[{"internalType":"address","name":"swap","type":"address"},{"internalType":"address","name":"src","type":"address"},{"internalType":"address","name":"dest","type":"address"},{"internalType":"address","name":"receiver","type":"address"},{"internalType":"uint256","name":"srcAmount","type":"uint256"},{"internalType":"uint256","name":"minDestAmount","type":"uint256"},{"internalType":"uint256","name":"partnerId","type":"uint256"},{"internalType":"uint256","name":"metaData","type":"uint256"}],"internalType":"struct WardenDataDeserialize2.SwapData","name":"_swapData","type":"tuple"},{"internalType":"uint256","name":"_newCursor","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"preTrade","outputs":[{"internalType":"contract IWardenPreTrade2","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"_enable","type":"bool"}],"name":"setAutoRegisterAddressMapping","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"contract IWardenSwap2","name":"_swap","type":"address"},{"internalType":"bytes","name":"_data","type":"bytes"},{"internalType":"address","name":"_deposits","type":"address"},{"internalType":"contract IERC20","name":"_src","type":"address"},{"internalType":"uint256","name":"_srcAmount","type":"uint256"},{"internalType":"contract IERC20","name":"_dest","type":"address"},{"internalType":"uint256","name":"_minDestAmount","type":"uint256"},{"internalType":"address","name":"_receiver","type":"address"},{"internalType":"uint256","name":"_partnerId","type":"uint256"},{"internalType":"uint256","name":"_metaData","type":"uint256"}],"name":"swap","outputs":[{"internalType":"uint256","name":"_destAmount","type":"uint256"}],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"bytes","name":"_data","type":"bytes"}],"name":"swapCompressed","outputs":[{"internalType":"uint256","name":"_destAmount","type":"uint256"}],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"contract IWardenSwap2","name":"_swap","type":"address"},{"internalType":"bytes","name":"_data","type":"bytes"},{"internalType":"address[]","name":"_deposits","type":"address[]"},{"internalType":"uint256[]","name":"_volumes","type":"uint256[]"},{"internalType":"contract IERC20","name":"_src","type":"address"},{"internalType":"uint256","name":"_totalSrcAmount","type":"uint256"},{"internalType":"contract IERC20","name":"_dest","type":"address"},{"internalType":"uint256","name":"_minDestAmount","type":"uint256"},{"internalType":"address","name":"_receiver","type":"address"},{"internalType":"uint256","name":"_partnerId","type":"uint256"},{"internalType":"uint256","name":"_metaData","type":"uint256"}],"name":"swapSplit","outputs":[{"internalType":"uint256","name":"_destAmount","type":"uint256"}],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"bytes","name":"_data","type":"bytes"}],"name":"swapSplitCompressed","outputs":[{"internalType":"uint256","name":"_destAmount","type":"uint256"}],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"_receiver","type":"address"}],"name":"tradeEthToWeth","outputs":[{"internalType":"uint256","name":"_destAmount","type":"uint256"}],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_srcAmount","type":"uint256"},{"internalType":"address","name":"_receiver","type":"address"}],"name":"tradeWethToEth","outputs":[{"internalType":"uint256","name":"_destAmount","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"contract IWardenPreTrade2","name":"_preTrade","type":"address"}],"name":"updateWardenPreTrade","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"weth","outputs":[{"internalType":"contract IWETH","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"stateMutability":"payable","type":"receive"}]Contract Creation Code
60c06040523480156200001157600080fd5b506040516200354338038062003543833981016040819052620000349162000131565b818185856200004333620000c8565b600180546001600160a01b0319166001600160a01b038481169182179092559082166080526040517f305e87b67e942ca51cbdcd6a078f76bcc9ed0c8db1000119f2d40ded1d9a1d7590600090a250506001600160a01b0390911660a05260018054911515600160a01b0260ff60a01b19909216919091179055506200019d92505050565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b6001600160a01b03811681146200012e57600080fd5b50565b600080600080608085870312156200014857600080fd5b8451620001558162000118565b6020860151909450620001688162000118565b60408601519093506200017b8162000118565b606086015190925080151581146200019257600080fd5b939692955090935050565b60805160a05161331e620002256000396000818161024201528181611a1c01528181611aa60152611b7d01526000818161013d0152818161028e01528181610514015281816108f50152818161094c01528181610ae201528181610eda01528181610f5801528181610fb1015281816110dd0152818161115b015261163b015261331e6000f3fe60806040526004361061012d5760003560e01c80637b7b554d116100a5578063d749325e11610074578063ef2c822f11610059578063ef2c822f146103fe578063f2fde38b14610411578063f33c86cd1461043157600080fd5b8063d749325e146103a9578063dca489e0146103eb57600080fd5b80637b7b554d146103385780638da5cb5b146103585780638f64d73a14610376578063d6f5195d1461039657600080fd5b80634912dd14116100fc578063629e1425116100e1578063629e1425146102f0578063693a749314610310578063715018a61461032357600080fd5b80634912dd14146102b05780635500c46d146102d057600080fd5b8063053e59d4146101dc5780630a75c936146102025780630ca1fc5c146102305780633fc8cef31461027c57600080fd5b366101d757336001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016146101d55760405162461bcd60e51b815260206004820152602a60248201527f57617264656e526f757465723a2052656365697665204574686572206f6e6c7960448201527f2066726f6d20574554480000000000000000000000000000000000000000000060648201526084015b60405180910390fd5b005b600080fd5b6101ef6101ea3660046128f8565b610451565b6040519081526020015b60405180910390f35b34801561020e57600080fd5b5061022261021d366004612a2b565b61069f565b6040516101f9929190612ab5565b34801561023c57600080fd5b506102647f000000000000000000000000000000000000000000000000000000000000000081565b6040516001600160a01b0390911681526020016101f9565b34801561028857600080fd5b506102647f000000000000000000000000000000000000000000000000000000000000000081565b3480156102bc57600080fd5b506101d56102cb366004612b36565b6107a6565b3480156102dc57600080fd5b506101d56102eb366004612b62565b610818565b3480156102fc57600080fd5b506101ef61030b366004612b86565b6108d4565b6101ef61031e366004612bb6565b610b36565b34801561032f57600080fd5b506101d5610c2c565b34801561034457600080fd5b506101d5610353366004612bf8565b610c92565b34801561036457600080fd5b506000546001600160a01b0316610264565b34801561038257600080fd5b506101d5610391366004612c1a565b610cf8565b6101ef6103a4366004612bb6565b610e36565b3480156103b557600080fd5b506001546103db9074010000000000000000000000000000000000000000900460ff1681565b60405190151581526020016101f9565b6101ef6103f9366004612b62565b610ec4565b6101ef61040c366004612c33565b61101a565b34801561041d57600080fd5b506101d561042c366004612b62565b6112a9565b34801561043d57600080fd5b50600154610264906001600160a01b031681565b60006001600160a01b038416610465573393505b600061047689888a33898989611388565b905073eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee6001600160a01b038a161415610587578734146105125760405162461bcd60e51b815260206004820152603760248201527f57617264656e526f757465723a3a7377617053706c69743a204574686572207360448201527f6f7572636520616d6f756e74206d69736d61746368656400000000000000000060648201526084016101cc565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663d0e30db0826040518263ffffffff1660e01b81526004016000604051808303818588803b15801561056d57600080fd5b505af1158015610581573d6000803e3d6000fd5b50505050505b610593818c8c8c61158b565b6000632ead0eed60e01b8e8e8d8d868e8e8d338e8e6040516024016105c29b9a99989796959493929190612d29565b60408051601f198184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff000000000000000000000000000000000000000000000000000000009093169290921790915290506106308f828a8a8a6116cb565b604080518b8152602081018390526001600160a01b038981168284015260016060830152915192955033928b8316928e16917fa1053ef90d92e668a06dbab8af812d6d99e04d80c0d5af298fd8fdd3ab5f8280919081900360800190a450509c9b505050505050505050505050565b6040805161010081018252600080825260208201819052918101829052606081018290526080810182905260a0810182905260c0810182905260e08101829052906106ea8484611982565b6001600160a01b03909116835292506107038484611982565b6001600160a01b039091166020840152925061071f8484611982565b6001600160a01b039091166040840152925061073b8484611982565b6001600160a01b03909116606084015292506107578484611cc1565b6080840191909152925061076b8484611cc1565b60a0840191909152925061077f8484611cc1565b60c084019190915292506107938484611cc1565b60e0840191909152919491935090915050565b6000546001600160a01b031633146108005760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064016101cc565b6108146001600160a01b0383163383611e1d565b5050565b6000546001600160a01b031633146108725760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064016101cc565b600180547fffffffffffffffffffffffff0000000000000000000000000000000000000000166001600160a01b0383169081179091556040517f305e87b67e942ca51cbdcd6a078f76bcc9ed0c8db1000119f2d40ded1d9a1d7590600090a250565b60006001600160a01b0382166108e8573391505b61091d6001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016333086611f26565b6040517f2e1a7d4d000000000000000000000000000000000000000000000000000000008152600481018490527f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031690632e1a7d4d90602401600060405180830381600087803b15801561099857600080fd5b505af11580156109ac573d6000803e3d6000fd5b505050506000826001600160a01b03168460405160006040518083038185875af1925050503d80600081146109fd576040519150601f19603f3d011682016040523d82523d6000602084013e610a02565b606091505b5050905080610a9f5760405162461bcd60e51b815260206004820152604560248201527f57617264656e526f757465723a3a747261646557657468546f4574683a20547260448201527f616e73666572206574686572206261636b20746f20726563656976657220666160648201527f696c65642e000000000000000000000000000000000000000000000000000000608482015260a4016101cc565b60408051858152602081018690526001600160a01b0385811682840152600060608301529151869450339273eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee927f0000000000000000000000000000000000000000000000000000000000000000909116917fa1053ef90d92e668a06dbab8af812d6d99e04d80c0d5af298fd8fdd3ab5f82809181900360800190a45092915050565b6000806000610b7a85858080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920182905250925061069f915050565b6040805160018082528183019092529294509092506000919060208083019080368337019050506040805160008082526020820190925291925050836000015182600081518110610bcd57610bcd612dee565b6001600160a01b03909216602092830291909101909101528351610c2190610bf78886818c612e1d565b858589602001518a608001518b604001518c60a001518d606001518e60c001518f60e00151610451565b979650505050505050565b6000546001600160a01b03163314610c865760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064016101cc565b610c906000612044565b565b6000546001600160a01b03163314610cec5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064016101cc565b610cf5816120ac565b50565b6000546001600160a01b03163314610d525760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064016101cc565b604051600090339083908381818185875af1925050503d8060008114610d94576040519150601f19603f3d011682016040523d82523d6000602084013e610d99565b606091505b50509050806108145760405162461bcd60e51b815260206004820152604a60248201527f57617264656e526f757465723a3a636f6c6c65637452656d61696e696e67457460448201527f6865723a205472616e73666572206574686572206261636b20746f2063616c6c60648201527f6572206661696c65642e00000000000000000000000000000000000000000000608482015260a4016101cc565b6000806000610e7a85858080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920182905250925061069f915050565b81519193509150610ebb90610e918684818a612e1d565b855160208701516080880151604089015160a08a015160608b015160c08c015160e08d015161101a565b95945050505050565b60006001600160a01b038216610ed8573391505b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663d0e30db0346040518263ffffffff1660e01b81526004016000604051808303818588803b158015610f3357600080fd5b505af1158015610f47573d6000803e3d6000fd5b50610f839350506001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016915084905034611e1d565b506040805134808252602082018190526001600160a01b0384811683850152600060608401529251909233927f00000000000000000000000000000000000000000000000000000000000000009091169173eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee917fa1053ef90d92e668a06dbab8af812d6d99e04d80c0d5af298fd8fdd3ab5f8280919081900360800190a4919050565b60006001600160a01b03841661102e573393505b600061103f89888a33898989611388565b905073eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee6001600160a01b038a16141561118b578734146110db5760405162461bcd60e51b815260206004820152603260248201527f57617264656e526f757465723a3a737761703a20457468657220736f7572636560448201527f20616d6f756e74206d69736d617463686564000000000000000000000000000060648201526084016101cc565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663d0e30db0826040518263ffffffff1660e01b81526004016000604051808303818588803b15801561113657600080fd5b505af115801561114a573d6000803e3d6000fd5b506111869350506001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001691508c905083611e1d565b6111a0565b6111a06001600160a01b038a16338c84611f26565b600063eb766f9c60e01b8d8d8c858d8d8c338d8d6040516024016111cd9a99989796959493929190612e47565b60408051601f198184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff0000000000000000000000000000000000000000000000000000000090931692909217909152905061123b8e828a8a8a6116cb565b604080518b8152602081018390526001600160a01b038981168284015260006060830152915192955033928b8316928e16917fa1053ef90d92e668a06dbab8af812d6d99e04d80c0d5af298fd8fdd3ab5f8280919081900360800190a450509b9a5050505050505050505050565b6000546001600160a01b031633146113035760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064016101cc565b6001600160a01b03811661137f5760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201527f646472657373000000000000000000000000000000000000000000000000000060648201526084016101cc565b610cf581612044565b6001546040517f2db71f200000000000000000000000000000000000000000000000000000000081526001600160a01b0389811660048301528881166024830152604482018890528681166064830152858116608483015260a4820185905260c482018490526000928392839290911690632db71f209060e4016000604051808303816000875af1158015611421573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526114499190810190612f1b565b81518a955091935091501561157e5760008260008151811061146d5761146d612dee565b602002602001015111156114e4576114bb878b8460008151811061149357611493612dee565b6020026020010151846000815181106114ae576114ae612dee565b6020026020010151612130565b816000815181106114ce576114ce612dee565b6020026020010151836114e19190613011565b92505b8151600214801561150f575060008260018151811061150557611505612dee565b6020026020010151115b1561157e5761155587868c8560018151811061152d5761152d612dee565b60200260200101518560018151811061154857611548612dee565b602002602001015161228c565b8160018151811061156857611568612dee565b60200260200101518361157b9190613011565b92505b5050979650505050505050565b8360005b84518110156116c3576000600186516115a89190613011565b8214156115b65750816115f6565b60648583815181106115ca576115ca612dee565b6020026020010151886115dd9190613028565b6115e79190613065565b90506115f38184613011565b92505b73eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee6001600160a01b03851614156116775761167286838151811061163057611630612dee565b6020026020010151827f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316611e1d9092919063ffffffff16565b6116b0565b6116b03387848151811061168d5761168d612dee565b602002602001015183876001600160a01b0316611f26909392919063ffffffff16565b50806116bb816130a0565b91505061158f565b505050505050565b60008073eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee6001600160a01b0386161461177a576040517f70a082310000000000000000000000000000000000000000000000000000000081526001600160a01b0384811660048301528616906370a0823190602401602060405180830381865afa158015611751573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061177591906130d9565b611786565b826001600160a01b0316315b9050600080886001600160a01b0316886040516117a3919061311e565b6000604051808303816000865af19150503d80600081146117e0576040519150601f19603f3d011682016040523d82523d6000602084013e6117e5565b606091505b509150915081611831576044815110156117fe57600080fd5b60048101905080806020019051810190611818919061313a565b60405162461bcd60e51b81526004016101cc91906131bc565b505073eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee6001600160a01b038616146118ec576040517f70a082310000000000000000000000000000000000000000000000000000000081526001600160a01b0384811660048301528291908716906370a0823190602401602060405180830381865afa1580156118b9573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906118dd91906130d9565b6118e79190613011565b611900565b611900816001600160a01b03851631613011565b9150838210156119785760405162461bcd60e51b815260206004820152603b60248201527f57617264656e526f757465723a3a5f696e7465726e616c537761703a2064657360448201527f74696e6174696f6e20616d6f756e7420697320746f6f206c6f772e000000000060648201526084016101cc565b5095945050505050565b6000808061199085856123ea565b905061199d6001856131ef565b935060ff8116611a90576119b18585612450565b92506119be6014856131ef565b60015490945074010000000000000000000000000000000000000000900460ff1615611a8b576040517f4420e4860000000000000000000000000000000000000000000000000000000081526001600160a01b0384811660048301527f00000000000000000000000000000000000000000000000000000000000000001690634420e486906024016020604051808303816000875af1158015611a65573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611a8991906130d9565b505b611cb8565b8060ff1660011415611b67576001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016638a186788611ad587876124c6565b6040517fffffffff0000000000000000000000000000000000000000000000000000000060e084901b16815263ffffffff919091166004820152602401602060405180830381865afa158015611b2f573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611b539190613207565b9250611b606004856131ef565b9350611cb8565b8060ff1660021415611c35576001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016638a186788611bac878761252c565b6040517fffffffff0000000000000000000000000000000000000000000000000000000060e084901b16815262ffffff9091166004820152602401602060405180830381865afa158015611c04573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611c289190613207565b9250611b606003856131ef565b8060ff1660031415611c4a5760009250611cb8565b60405162461bcd60e51b815260206004820152603460248201527f57617264656e44617461446573657269616c697a653a5f6c6f6f6b757041646460448201527f726573732062616420696e737472756374696f6e00000000000000000000000060648201526084016101cc565b50909391925050565b60008080611ccf85856123ea565b9050611cdc6001856131ef565b935060ff8116611d0757611cf08585612592565b67ffffffffffffffff169250611b606008856131ef565b8060ff1660011415611d3657611d1d85856125f8565b69ffffffffffffffffffff169250611b60600a856131ef565b8060ff1660021415611d6757611d4c858561265e565b6bffffffffffffffffffffffff169250611b60600c856131ef565b8060ff1660031415611d9a57611d7d85856126c4565b6dffffffffffffffffffffffffffff169250611b60600e856131ef565b8060ff1660041415611daf5760009250611cb8565b60405162461bcd60e51b815260206004820152603360248201527f57617264656e44617461446573657269616c697a653a5f6465636f6465416d6f60448201527f756e742062616420696e737472756374696f6e0000000000000000000000000060648201526084016101cc565b6040517fa9059cbb0000000000000000000000000000000000000000000000000000000081526001600160a01b0383811660048301526024820183905284169063a9059cbb90604401600060405180830381600087803b158015611e8057600080fd5b505af1925050508015611e91575060015b611f2157611e9d613224565b806308c379a01415611ed75750611eb2613240565b80611ebd5750611ed9565b8060405162461bcd60e51b81526004016101cc91906131bc565b505b60405162461bcd60e51b815260206004820152601f60248201527f5472616e7366657248656c7065723a207472616e73666572206661696c65640060448201526064016101cc565b505050565b6040517f23b872dd0000000000000000000000000000000000000000000000000000000081526001600160a01b0384811660048301528381166024830152604482018390528516906323b872dd90606401600060405180830381600087803b158015611f9157600080fd5b505af1925050508015611fa2575060015b61203e57611fae613224565b806308c379a01415611fce5750611fc3613240565b80611ebd5750611fd0565b505b60405162461bcd60e51b815260206004820152602360248201527f5472616e7366657248656c7065723a207472616e7366657246726f6d2066616960448201527f6c6564000000000000000000000000000000000000000000000000000000000060648201526084016101cc565b50505050565b600080546001600160a01b038381167fffffffffffffffffffffffff0000000000000000000000000000000000000000831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b6001805482151574010000000000000000000000000000000000000000027fffffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffff9091161790556040517ffe71ed30986640a3b75b5733cac475d354486c44a90725ed513ffaddf2c79ca29061212590831515815260200190565b60405180910390a150565b73eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee6001600160a01b0384161415612224576000816001600160a01b03168360405160006040518083038185875af1925050503d80600081146121a2576040519150601f19603f3d011682016040523d82523d6000602084013e6121a7565b606091505b505090508061221e5760405162461bcd60e51b815260206004820152603860248201527f57617264656e526f757465723a3a5f636f6c6c6563744665653a205472616e7360448201527f66657220666565206f66206574686572206661696c65642e000000000000000060648201526084016101cc565b50612239565b6122396001600160a01b038416858385611f26565b806001600160a01b0316836001600160a01b03167f20e2995330eff898aba363dafa356ef1daadce6099c9cc7ca8d54eefe4592b4c8460405161227e91815260200190565b60405180910390a350505050565b73eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee6001600160a01b0384161415612380576000816001600160a01b03168360405160006040518083038185875af1925050503d80600081146122fe576040519150601f19603f3d011682016040523d82523d6000602084013e612303565b606091505b505090508061237a5760405162461bcd60e51b815260206004820152603860248201527f57617264656e526f757465723a3a5f706172746e65724665653a205472616e7360448201527f66657220666565206f66206574686572206661696c65642e000000000000000060648201526084016101cc565b50612395565b6123956001600160a01b038416868385611f26565b806001600160a01b0316836001600160a01b0316857f51819630bf3511ccdb6a21adf4073788982d983df3b6c609b201fd9dad81d2d9856040516123db91815260200190565b60405180910390a45050505050565b60006123f78260016131ef565b835110156124475760405162461bcd60e51b815260206004820152601360248201527f746f55696e74385f6f75744f66426f756e64730000000000000000000000000060448201526064016101cc565b50016001015190565b600061245d8260146131ef565b835110156124ad5760405162461bcd60e51b815260206004820152601560248201527f746f416464726573735f6f75744f66426f756e6473000000000000000000000060448201526064016101cc565b5001602001516c01000000000000000000000000900490565b60006124d38260046131ef565b835110156125235760405162461bcd60e51b815260206004820152601460248201527f746f55696e7433325f6f75744f66426f756e647300000000000000000000000060448201526064016101cc565b50016004015190565b60006125398260036131ef565b835110156125895760405162461bcd60e51b815260206004820152601460248201527f746f55696e7432345f6f75744f66426f756e647300000000000000000000000060448201526064016101cc565b50016003015190565b600061259f8260086131ef565b835110156125ef5760405162461bcd60e51b815260206004820152601460248201527f746f55696e7436345f6f75744f66426f756e647300000000000000000000000060448201526064016101cc565b50016008015190565b600061260582600a6131ef565b835110156126555760405162461bcd60e51b815260206004820152601460248201527f746f55696e7438305f6f75744f66426f756e647300000000000000000000000060448201526064016101cc565b5001600a015190565b600061266b82600c6131ef565b835110156126bb5760405162461bcd60e51b815260206004820152601460248201527f746f55696e7439365f6f75744f66426f756e647300000000000000000000000060448201526064016101cc565b5001600c015190565b60006126d182600e6131ef565b835110156127215760405162461bcd60e51b815260206004820152601560248201527f746f55696e743131325f6f75744f66426f756e6473000000000000000000000060448201526064016101cc565b5001600e015190565b6001600160a01b0381168114610cf557600080fd5b803561274a8161272a565b919050565b60008083601f84011261276157600080fd5b50813567ffffffffffffffff81111561277957600080fd5b60208301915083602082850101111561279157600080fd5b9250929050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b601f19601f830116810181811067ffffffffffffffff821117156127ed576127ed612798565b6040525050565b600067ffffffffffffffff82111561280e5761280e612798565b5060051b60200190565b600082601f83011261282957600080fd5b81356020612836826127f4565b60405161284382826127c7565b83815260059390931b850182019282810191508684111561286357600080fd5b8286015b8481101561288757803561287a8161272a565b8352918301918301612867565b509695505050505050565b600082601f8301126128a357600080fd5b813560206128b0826127f4565b6040516128bd82826127c7565b83815260059390931b85018201928281019150868411156128dd57600080fd5b8286015b8481101561288757803583529183019183016128e1565b6000806000806000806000806000806000806101608d8f03121561291b57600080fd5b6129248d61273f565b9b5067ffffffffffffffff60208e0135111561293f57600080fd5b61294f8e60208f01358f0161274f565b909b50995067ffffffffffffffff60408e0135111561296d57600080fd5b61297d8e60408f01358f01612818565b985067ffffffffffffffff60608e0135111561299857600080fd5b6129a88e60608f01358f01612892565b97506129b660808e0161273f565b965060a08d013595506129cb60c08e0161273f565b945060e08d013593506129e16101008e0161273f565b92506101208d013591506101408d013590509295989b509295989b509295989b565b600067ffffffffffffffff821115612a1d57612a1d612798565b50601f01601f191660200190565b60008060408385031215612a3e57600080fd5b823567ffffffffffffffff811115612a5557600080fd5b8301601f81018513612a6657600080fd5b8035612a7181612a03565b604051612a7e82826127c7565b828152876020848601011115612a9357600080fd5b8260208501602083013760006020938201840152979590910135955050505050565b6000610120820190506001600160a01b03808551168352806020860151166020840152806040860151166040840152506060840151612aff60608401826001600160a01b03169052565b506080840151608083015260a084015160a083015260c084015160c083015260e084015160e0830152826101008301529392505050565b60008060408385031215612b4957600080fd5b8235612b548161272a565b946020939093013593505050565b600060208284031215612b7457600080fd5b8135612b7f8161272a565b9392505050565b60008060408385031215612b9957600080fd5b823591506020830135612bab8161272a565b809150509250929050565b60008060208385031215612bc957600080fd5b823567ffffffffffffffff811115612be057600080fd5b612bec8582860161274f565b90969095509350505050565b600060208284031215612c0a57600080fd5b81358015158114612b7f57600080fd5b600060208284031215612c2c57600080fd5b5035919050565b60008060008060008060008060008060006101408c8e031215612c5557600080fd5b8b35612c608161272a565b9a5060208c013567ffffffffffffffff811115612c7c57600080fd5b612c888e828f0161274f565b909b5099505060408c0135612c9c8161272a565b975060608c0135612cac8161272a565b965060808c0135955060a08c0135612cc38161272a565b945060c08c0135935060e08c0135612cda8161272a565b809350506101008c013591506101208c013590509295989b509295989b9093969950565b818352818160208501375060006020828401015260006020601f19601f840116840101905092915050565b61014081526000612d3f61014083018d8f612cfe565b8281036020840152808c5180835260208301915060208e01925060005b81811015612d7a578351835260209384019390920191600101612d5c565b50506001600160a01b038c1660408501529150612d949050565b886060830152876080830152612db560a08301886001600160a01b03169052565b6001600160a01b03861660c08301526001600160a01b03851660e083015261010082019390935261012001529998505050505050505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60008085851115612e2d57600080fd5b83861115612e3a57600080fd5b5050820193919092039150565b6000610120808352612e5c8184018d8f612cfe565b6001600160a01b039b8c166020850152604084019a909a5250506060810196909652938716608086015291861660a085015290941660c083015260e0820193909352610100019190915292915050565b600082601f830112612ebd57600080fd5b81516020612eca826127f4565b604051612ed782826127c7565b83815260059390931b8501820192828101915086841115612ef757600080fd5b8286015b84811015612887578051612f0e8161272a565b8352918301918301612efb565b60008060408385031215612f2e57600080fd5b825167ffffffffffffffff80821115612f4657600080fd5b818501915085601f830112612f5a57600080fd5b81516020612f67826127f4565b604051612f7482826127c7565b83815260059390931b8501820192828101915089841115612f9457600080fd5b948201945b83861015612fb257855182529482019490820190612f99565b91880151919650909350505080821115612fcb57600080fd5b50612fd885828601612eac565b9150509250929050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b60008282101561302357613023612fe2565b500390565b6000817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff048311821515161561306057613060612fe2565b500290565b60008261309b577f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b500490565b60007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8214156130d2576130d2612fe2565b5060010190565b6000602082840312156130eb57600080fd5b5051919050565b60005b8381101561310d5781810151838201526020016130f5565b8381111561203e5750506000910152565b600082516131308184602087016130f2565b9190910192915050565b60006020828403121561314c57600080fd5b815167ffffffffffffffff81111561316357600080fd5b8201601f8101841361317457600080fd5b805161317f81612a03565b60405161318c82826127c7565b8281528660208486010111156131a157600080fd5b6131b28360208301602087016130f2565b9695505050505050565b60208152600082518060208401526131db8160408501602087016130f2565b601f01601f19169190910160400192915050565b6000821982111561320257613202612fe2565b500190565b60006020828403121561321957600080fd5b8151612b7f8161272a565b600060033d111561323d5760046000803e5060005160e01c5b90565b600060443d101561324e5790565b6040517ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc803d016004833e81513d67ffffffffffffffff816024840111818411171561329c57505050505090565b82850191508151818111156132b45750505050505090565b843d87010160208285010111156132ce5750505050505090565b6132dd602082860101876127c7565b50909594505050505056fea2646970667358221220a180b913d1291e55709242f4a2075cad9cb6f99ef567338fb1d30a40b108e02a64736f6c634300080a00330000000000000000000000004038def268edf63775d9b7ffe8c40a7c6e90daef00000000000000000000000082af49447d8a07e3bd95bd0d56f35241523fbab100000000000000000000000000000000000000000000000000000000000000660000000000000000000000000000000000000000000000000000000000000000
Deployed Bytecode
0x60806040526004361061012d5760003560e01c80637b7b554d116100a5578063d749325e11610074578063ef2c822f11610059578063ef2c822f146103fe578063f2fde38b14610411578063f33c86cd1461043157600080fd5b8063d749325e146103a9578063dca489e0146103eb57600080fd5b80637b7b554d146103385780638da5cb5b146103585780638f64d73a14610376578063d6f5195d1461039657600080fd5b80634912dd14116100fc578063629e1425116100e1578063629e1425146102f0578063693a749314610310578063715018a61461032357600080fd5b80634912dd14146102b05780635500c46d146102d057600080fd5b8063053e59d4146101dc5780630a75c936146102025780630ca1fc5c146102305780633fc8cef31461027c57600080fd5b366101d757336001600160a01b037f00000000000000000000000082af49447d8a07e3bd95bd0d56f35241523fbab116146101d55760405162461bcd60e51b815260206004820152602a60248201527f57617264656e526f757465723a2052656365697665204574686572206f6e6c7960448201527f2066726f6d20574554480000000000000000000000000000000000000000000060648201526084015b60405180910390fd5b005b600080fd5b6101ef6101ea3660046128f8565b610451565b6040519081526020015b60405180910390f35b34801561020e57600080fd5b5061022261021d366004612a2b565b61069f565b6040516101f9929190612ab5565b34801561023c57600080fd5b506102647f000000000000000000000000000000000000000000000000000000000000006681565b6040516001600160a01b0390911681526020016101f9565b34801561028857600080fd5b506102647f00000000000000000000000082af49447d8a07e3bd95bd0d56f35241523fbab181565b3480156102bc57600080fd5b506101d56102cb366004612b36565b6107a6565b3480156102dc57600080fd5b506101d56102eb366004612b62565b610818565b3480156102fc57600080fd5b506101ef61030b366004612b86565b6108d4565b6101ef61031e366004612bb6565b610b36565b34801561032f57600080fd5b506101d5610c2c565b34801561034457600080fd5b506101d5610353366004612bf8565b610c92565b34801561036457600080fd5b506000546001600160a01b0316610264565b34801561038257600080fd5b506101d5610391366004612c1a565b610cf8565b6101ef6103a4366004612bb6565b610e36565b3480156103b557600080fd5b506001546103db9074010000000000000000000000000000000000000000900460ff1681565b60405190151581526020016101f9565b6101ef6103f9366004612b62565b610ec4565b6101ef61040c366004612c33565b61101a565b34801561041d57600080fd5b506101d561042c366004612b62565b6112a9565b34801561043d57600080fd5b50600154610264906001600160a01b031681565b60006001600160a01b038416610465573393505b600061047689888a33898989611388565b905073eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee6001600160a01b038a161415610587578734146105125760405162461bcd60e51b815260206004820152603760248201527f57617264656e526f757465723a3a7377617053706c69743a204574686572207360448201527f6f7572636520616d6f756e74206d69736d61746368656400000000000000000060648201526084016101cc565b7f00000000000000000000000082af49447d8a07e3bd95bd0d56f35241523fbab16001600160a01b031663d0e30db0826040518263ffffffff1660e01b81526004016000604051808303818588803b15801561056d57600080fd5b505af1158015610581573d6000803e3d6000fd5b50505050505b610593818c8c8c61158b565b6000632ead0eed60e01b8e8e8d8d868e8e8d338e8e6040516024016105c29b9a99989796959493929190612d29565b60408051601f198184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff000000000000000000000000000000000000000000000000000000009093169290921790915290506106308f828a8a8a6116cb565b604080518b8152602081018390526001600160a01b038981168284015260016060830152915192955033928b8316928e16917fa1053ef90d92e668a06dbab8af812d6d99e04d80c0d5af298fd8fdd3ab5f8280919081900360800190a450509c9b505050505050505050505050565b6040805161010081018252600080825260208201819052918101829052606081018290526080810182905260a0810182905260c0810182905260e08101829052906106ea8484611982565b6001600160a01b03909116835292506107038484611982565b6001600160a01b039091166020840152925061071f8484611982565b6001600160a01b039091166040840152925061073b8484611982565b6001600160a01b03909116606084015292506107578484611cc1565b6080840191909152925061076b8484611cc1565b60a0840191909152925061077f8484611cc1565b60c084019190915292506107938484611cc1565b60e0840191909152919491935090915050565b6000546001600160a01b031633146108005760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064016101cc565b6108146001600160a01b0383163383611e1d565b5050565b6000546001600160a01b031633146108725760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064016101cc565b600180547fffffffffffffffffffffffff0000000000000000000000000000000000000000166001600160a01b0383169081179091556040517f305e87b67e942ca51cbdcd6a078f76bcc9ed0c8db1000119f2d40ded1d9a1d7590600090a250565b60006001600160a01b0382166108e8573391505b61091d6001600160a01b037f00000000000000000000000082af49447d8a07e3bd95bd0d56f35241523fbab116333086611f26565b6040517f2e1a7d4d000000000000000000000000000000000000000000000000000000008152600481018490527f00000000000000000000000082af49447d8a07e3bd95bd0d56f35241523fbab16001600160a01b031690632e1a7d4d90602401600060405180830381600087803b15801561099857600080fd5b505af11580156109ac573d6000803e3d6000fd5b505050506000826001600160a01b03168460405160006040518083038185875af1925050503d80600081146109fd576040519150601f19603f3d011682016040523d82523d6000602084013e610a02565b606091505b5050905080610a9f5760405162461bcd60e51b815260206004820152604560248201527f57617264656e526f757465723a3a747261646557657468546f4574683a20547260448201527f616e73666572206574686572206261636b20746f20726563656976657220666160648201527f696c65642e000000000000000000000000000000000000000000000000000000608482015260a4016101cc565b60408051858152602081018690526001600160a01b0385811682840152600060608301529151869450339273eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee927f00000000000000000000000082af49447d8a07e3bd95bd0d56f35241523fbab1909116917fa1053ef90d92e668a06dbab8af812d6d99e04d80c0d5af298fd8fdd3ab5f82809181900360800190a45092915050565b6000806000610b7a85858080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920182905250925061069f915050565b6040805160018082528183019092529294509092506000919060208083019080368337019050506040805160008082526020820190925291925050836000015182600081518110610bcd57610bcd612dee565b6001600160a01b03909216602092830291909101909101528351610c2190610bf78886818c612e1d565b858589602001518a608001518b604001518c60a001518d606001518e60c001518f60e00151610451565b979650505050505050565b6000546001600160a01b03163314610c865760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064016101cc565b610c906000612044565b565b6000546001600160a01b03163314610cec5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064016101cc565b610cf5816120ac565b50565b6000546001600160a01b03163314610d525760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064016101cc565b604051600090339083908381818185875af1925050503d8060008114610d94576040519150601f19603f3d011682016040523d82523d6000602084013e610d99565b606091505b50509050806108145760405162461bcd60e51b815260206004820152604a60248201527f57617264656e526f757465723a3a636f6c6c65637452656d61696e696e67457460448201527f6865723a205472616e73666572206574686572206261636b20746f2063616c6c60648201527f6572206661696c65642e00000000000000000000000000000000000000000000608482015260a4016101cc565b6000806000610e7a85858080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920182905250925061069f915050565b81519193509150610ebb90610e918684818a612e1d565b855160208701516080880151604089015160a08a015160608b015160c08c015160e08d015161101a565b95945050505050565b60006001600160a01b038216610ed8573391505b7f00000000000000000000000082af49447d8a07e3bd95bd0d56f35241523fbab16001600160a01b031663d0e30db0346040518263ffffffff1660e01b81526004016000604051808303818588803b158015610f3357600080fd5b505af1158015610f47573d6000803e3d6000fd5b50610f839350506001600160a01b037f00000000000000000000000082af49447d8a07e3bd95bd0d56f35241523fbab116915084905034611e1d565b506040805134808252602082018190526001600160a01b0384811683850152600060608401529251909233927f00000000000000000000000082af49447d8a07e3bd95bd0d56f35241523fbab19091169173eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee917fa1053ef90d92e668a06dbab8af812d6d99e04d80c0d5af298fd8fdd3ab5f8280919081900360800190a4919050565b60006001600160a01b03841661102e573393505b600061103f89888a33898989611388565b905073eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee6001600160a01b038a16141561118b578734146110db5760405162461bcd60e51b815260206004820152603260248201527f57617264656e526f757465723a3a737761703a20457468657220736f7572636560448201527f20616d6f756e74206d69736d617463686564000000000000000000000000000060648201526084016101cc565b7f00000000000000000000000082af49447d8a07e3bd95bd0d56f35241523fbab16001600160a01b031663d0e30db0826040518263ffffffff1660e01b81526004016000604051808303818588803b15801561113657600080fd5b505af115801561114a573d6000803e3d6000fd5b506111869350506001600160a01b037f00000000000000000000000082af49447d8a07e3bd95bd0d56f35241523fbab11691508c905083611e1d565b6111a0565b6111a06001600160a01b038a16338c84611f26565b600063eb766f9c60e01b8d8d8c858d8d8c338d8d6040516024016111cd9a99989796959493929190612e47565b60408051601f198184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff0000000000000000000000000000000000000000000000000000000090931692909217909152905061123b8e828a8a8a6116cb565b604080518b8152602081018390526001600160a01b038981168284015260006060830152915192955033928b8316928e16917fa1053ef90d92e668a06dbab8af812d6d99e04d80c0d5af298fd8fdd3ab5f8280919081900360800190a450509b9a5050505050505050505050565b6000546001600160a01b031633146113035760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064016101cc565b6001600160a01b03811661137f5760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201527f646472657373000000000000000000000000000000000000000000000000000060648201526084016101cc565b610cf581612044565b6001546040517f2db71f200000000000000000000000000000000000000000000000000000000081526001600160a01b0389811660048301528881166024830152604482018890528681166064830152858116608483015260a4820185905260c482018490526000928392839290911690632db71f209060e4016000604051808303816000875af1158015611421573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526114499190810190612f1b565b81518a955091935091501561157e5760008260008151811061146d5761146d612dee565b602002602001015111156114e4576114bb878b8460008151811061149357611493612dee565b6020026020010151846000815181106114ae576114ae612dee565b6020026020010151612130565b816000815181106114ce576114ce612dee565b6020026020010151836114e19190613011565b92505b8151600214801561150f575060008260018151811061150557611505612dee565b6020026020010151115b1561157e5761155587868c8560018151811061152d5761152d612dee565b60200260200101518560018151811061154857611548612dee565b602002602001015161228c565b8160018151811061156857611568612dee565b60200260200101518361157b9190613011565b92505b5050979650505050505050565b8360005b84518110156116c3576000600186516115a89190613011565b8214156115b65750816115f6565b60648583815181106115ca576115ca612dee565b6020026020010151886115dd9190613028565b6115e79190613065565b90506115f38184613011565b92505b73eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee6001600160a01b03851614156116775761167286838151811061163057611630612dee565b6020026020010151827f00000000000000000000000082af49447d8a07e3bd95bd0d56f35241523fbab16001600160a01b0316611e1d9092919063ffffffff16565b6116b0565b6116b03387848151811061168d5761168d612dee565b602002602001015183876001600160a01b0316611f26909392919063ffffffff16565b50806116bb816130a0565b91505061158f565b505050505050565b60008073eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee6001600160a01b0386161461177a576040517f70a082310000000000000000000000000000000000000000000000000000000081526001600160a01b0384811660048301528616906370a0823190602401602060405180830381865afa158015611751573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061177591906130d9565b611786565b826001600160a01b0316315b9050600080886001600160a01b0316886040516117a3919061311e565b6000604051808303816000865af19150503d80600081146117e0576040519150601f19603f3d011682016040523d82523d6000602084013e6117e5565b606091505b509150915081611831576044815110156117fe57600080fd5b60048101905080806020019051810190611818919061313a565b60405162461bcd60e51b81526004016101cc91906131bc565b505073eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee6001600160a01b038616146118ec576040517f70a082310000000000000000000000000000000000000000000000000000000081526001600160a01b0384811660048301528291908716906370a0823190602401602060405180830381865afa1580156118b9573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906118dd91906130d9565b6118e79190613011565b611900565b611900816001600160a01b03851631613011565b9150838210156119785760405162461bcd60e51b815260206004820152603b60248201527f57617264656e526f757465723a3a5f696e7465726e616c537761703a2064657360448201527f74696e6174696f6e20616d6f756e7420697320746f6f206c6f772e000000000060648201526084016101cc565b5095945050505050565b6000808061199085856123ea565b905061199d6001856131ef565b935060ff8116611a90576119b18585612450565b92506119be6014856131ef565b60015490945074010000000000000000000000000000000000000000900460ff1615611a8b576040517f4420e4860000000000000000000000000000000000000000000000000000000081526001600160a01b0384811660048301527f00000000000000000000000000000000000000000000000000000000000000661690634420e486906024016020604051808303816000875af1158015611a65573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611a8991906130d9565b505b611cb8565b8060ff1660011415611b67576001600160a01b037f000000000000000000000000000000000000000000000000000000000000006616638a186788611ad587876124c6565b6040517fffffffff0000000000000000000000000000000000000000000000000000000060e084901b16815263ffffffff919091166004820152602401602060405180830381865afa158015611b2f573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611b539190613207565b9250611b606004856131ef565b9350611cb8565b8060ff1660021415611c35576001600160a01b037f000000000000000000000000000000000000000000000000000000000000006616638a186788611bac878761252c565b6040517fffffffff0000000000000000000000000000000000000000000000000000000060e084901b16815262ffffff9091166004820152602401602060405180830381865afa158015611c04573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611c289190613207565b9250611b606003856131ef565b8060ff1660031415611c4a5760009250611cb8565b60405162461bcd60e51b815260206004820152603460248201527f57617264656e44617461446573657269616c697a653a5f6c6f6f6b757041646460448201527f726573732062616420696e737472756374696f6e00000000000000000000000060648201526084016101cc565b50909391925050565b60008080611ccf85856123ea565b9050611cdc6001856131ef565b935060ff8116611d0757611cf08585612592565b67ffffffffffffffff169250611b606008856131ef565b8060ff1660011415611d3657611d1d85856125f8565b69ffffffffffffffffffff169250611b60600a856131ef565b8060ff1660021415611d6757611d4c858561265e565b6bffffffffffffffffffffffff169250611b60600c856131ef565b8060ff1660031415611d9a57611d7d85856126c4565b6dffffffffffffffffffffffffffff169250611b60600e856131ef565b8060ff1660041415611daf5760009250611cb8565b60405162461bcd60e51b815260206004820152603360248201527f57617264656e44617461446573657269616c697a653a5f6465636f6465416d6f60448201527f756e742062616420696e737472756374696f6e0000000000000000000000000060648201526084016101cc565b6040517fa9059cbb0000000000000000000000000000000000000000000000000000000081526001600160a01b0383811660048301526024820183905284169063a9059cbb90604401600060405180830381600087803b158015611e8057600080fd5b505af1925050508015611e91575060015b611f2157611e9d613224565b806308c379a01415611ed75750611eb2613240565b80611ebd5750611ed9565b8060405162461bcd60e51b81526004016101cc91906131bc565b505b60405162461bcd60e51b815260206004820152601f60248201527f5472616e7366657248656c7065723a207472616e73666572206661696c65640060448201526064016101cc565b505050565b6040517f23b872dd0000000000000000000000000000000000000000000000000000000081526001600160a01b0384811660048301528381166024830152604482018390528516906323b872dd90606401600060405180830381600087803b158015611f9157600080fd5b505af1925050508015611fa2575060015b61203e57611fae613224565b806308c379a01415611fce5750611fc3613240565b80611ebd5750611fd0565b505b60405162461bcd60e51b815260206004820152602360248201527f5472616e7366657248656c7065723a207472616e7366657246726f6d2066616960448201527f6c6564000000000000000000000000000000000000000000000000000000000060648201526084016101cc565b50505050565b600080546001600160a01b038381167fffffffffffffffffffffffff0000000000000000000000000000000000000000831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b6001805482151574010000000000000000000000000000000000000000027fffffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffff9091161790556040517ffe71ed30986640a3b75b5733cac475d354486c44a90725ed513ffaddf2c79ca29061212590831515815260200190565b60405180910390a150565b73eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee6001600160a01b0384161415612224576000816001600160a01b03168360405160006040518083038185875af1925050503d80600081146121a2576040519150601f19603f3d011682016040523d82523d6000602084013e6121a7565b606091505b505090508061221e5760405162461bcd60e51b815260206004820152603860248201527f57617264656e526f757465723a3a5f636f6c6c6563744665653a205472616e7360448201527f66657220666565206f66206574686572206661696c65642e000000000000000060648201526084016101cc565b50612239565b6122396001600160a01b038416858385611f26565b806001600160a01b0316836001600160a01b03167f20e2995330eff898aba363dafa356ef1daadce6099c9cc7ca8d54eefe4592b4c8460405161227e91815260200190565b60405180910390a350505050565b73eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee6001600160a01b0384161415612380576000816001600160a01b03168360405160006040518083038185875af1925050503d80600081146122fe576040519150601f19603f3d011682016040523d82523d6000602084013e612303565b606091505b505090508061237a5760405162461bcd60e51b815260206004820152603860248201527f57617264656e526f757465723a3a5f706172746e65724665653a205472616e7360448201527f66657220666565206f66206574686572206661696c65642e000000000000000060648201526084016101cc565b50612395565b6123956001600160a01b038416868385611f26565b806001600160a01b0316836001600160a01b0316857f51819630bf3511ccdb6a21adf4073788982d983df3b6c609b201fd9dad81d2d9856040516123db91815260200190565b60405180910390a45050505050565b60006123f78260016131ef565b835110156124475760405162461bcd60e51b815260206004820152601360248201527f746f55696e74385f6f75744f66426f756e64730000000000000000000000000060448201526064016101cc565b50016001015190565b600061245d8260146131ef565b835110156124ad5760405162461bcd60e51b815260206004820152601560248201527f746f416464726573735f6f75744f66426f756e6473000000000000000000000060448201526064016101cc565b5001602001516c01000000000000000000000000900490565b60006124d38260046131ef565b835110156125235760405162461bcd60e51b815260206004820152601460248201527f746f55696e7433325f6f75744f66426f756e647300000000000000000000000060448201526064016101cc565b50016004015190565b60006125398260036131ef565b835110156125895760405162461bcd60e51b815260206004820152601460248201527f746f55696e7432345f6f75744f66426f756e647300000000000000000000000060448201526064016101cc565b50016003015190565b600061259f8260086131ef565b835110156125ef5760405162461bcd60e51b815260206004820152601460248201527f746f55696e7436345f6f75744f66426f756e647300000000000000000000000060448201526064016101cc565b50016008015190565b600061260582600a6131ef565b835110156126555760405162461bcd60e51b815260206004820152601460248201527f746f55696e7438305f6f75744f66426f756e647300000000000000000000000060448201526064016101cc565b5001600a015190565b600061266b82600c6131ef565b835110156126bb5760405162461bcd60e51b815260206004820152601460248201527f746f55696e7439365f6f75744f66426f756e647300000000000000000000000060448201526064016101cc565b5001600c015190565b60006126d182600e6131ef565b835110156127215760405162461bcd60e51b815260206004820152601560248201527f746f55696e743131325f6f75744f66426f756e6473000000000000000000000060448201526064016101cc565b5001600e015190565b6001600160a01b0381168114610cf557600080fd5b803561274a8161272a565b919050565b60008083601f84011261276157600080fd5b50813567ffffffffffffffff81111561277957600080fd5b60208301915083602082850101111561279157600080fd5b9250929050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b601f19601f830116810181811067ffffffffffffffff821117156127ed576127ed612798565b6040525050565b600067ffffffffffffffff82111561280e5761280e612798565b5060051b60200190565b600082601f83011261282957600080fd5b81356020612836826127f4565b60405161284382826127c7565b83815260059390931b850182019282810191508684111561286357600080fd5b8286015b8481101561288757803561287a8161272a565b8352918301918301612867565b509695505050505050565b600082601f8301126128a357600080fd5b813560206128b0826127f4565b6040516128bd82826127c7565b83815260059390931b85018201928281019150868411156128dd57600080fd5b8286015b8481101561288757803583529183019183016128e1565b6000806000806000806000806000806000806101608d8f03121561291b57600080fd5b6129248d61273f565b9b5067ffffffffffffffff60208e0135111561293f57600080fd5b61294f8e60208f01358f0161274f565b909b50995067ffffffffffffffff60408e0135111561296d57600080fd5b61297d8e60408f01358f01612818565b985067ffffffffffffffff60608e0135111561299857600080fd5b6129a88e60608f01358f01612892565b97506129b660808e0161273f565b965060a08d013595506129cb60c08e0161273f565b945060e08d013593506129e16101008e0161273f565b92506101208d013591506101408d013590509295989b509295989b509295989b565b600067ffffffffffffffff821115612a1d57612a1d612798565b50601f01601f191660200190565b60008060408385031215612a3e57600080fd5b823567ffffffffffffffff811115612a5557600080fd5b8301601f81018513612a6657600080fd5b8035612a7181612a03565b604051612a7e82826127c7565b828152876020848601011115612a9357600080fd5b8260208501602083013760006020938201840152979590910135955050505050565b6000610120820190506001600160a01b03808551168352806020860151166020840152806040860151166040840152506060840151612aff60608401826001600160a01b03169052565b506080840151608083015260a084015160a083015260c084015160c083015260e084015160e0830152826101008301529392505050565b60008060408385031215612b4957600080fd5b8235612b548161272a565b946020939093013593505050565b600060208284031215612b7457600080fd5b8135612b7f8161272a565b9392505050565b60008060408385031215612b9957600080fd5b823591506020830135612bab8161272a565b809150509250929050565b60008060208385031215612bc957600080fd5b823567ffffffffffffffff811115612be057600080fd5b612bec8582860161274f565b90969095509350505050565b600060208284031215612c0a57600080fd5b81358015158114612b7f57600080fd5b600060208284031215612c2c57600080fd5b5035919050565b60008060008060008060008060008060006101408c8e031215612c5557600080fd5b8b35612c608161272a565b9a5060208c013567ffffffffffffffff811115612c7c57600080fd5b612c888e828f0161274f565b909b5099505060408c0135612c9c8161272a565b975060608c0135612cac8161272a565b965060808c0135955060a08c0135612cc38161272a565b945060c08c0135935060e08c0135612cda8161272a565b809350506101008c013591506101208c013590509295989b509295989b9093969950565b818352818160208501375060006020828401015260006020601f19601f840116840101905092915050565b61014081526000612d3f61014083018d8f612cfe565b8281036020840152808c5180835260208301915060208e01925060005b81811015612d7a578351835260209384019390920191600101612d5c565b50506001600160a01b038c1660408501529150612d949050565b886060830152876080830152612db560a08301886001600160a01b03169052565b6001600160a01b03861660c08301526001600160a01b03851660e083015261010082019390935261012001529998505050505050505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60008085851115612e2d57600080fd5b83861115612e3a57600080fd5b5050820193919092039150565b6000610120808352612e5c8184018d8f612cfe565b6001600160a01b039b8c166020850152604084019a909a5250506060810196909652938716608086015291861660a085015290941660c083015260e0820193909352610100019190915292915050565b600082601f830112612ebd57600080fd5b81516020612eca826127f4565b604051612ed782826127c7565b83815260059390931b8501820192828101915086841115612ef757600080fd5b8286015b84811015612887578051612f0e8161272a565b8352918301918301612efb565b60008060408385031215612f2e57600080fd5b825167ffffffffffffffff80821115612f4657600080fd5b818501915085601f830112612f5a57600080fd5b81516020612f67826127f4565b604051612f7482826127c7565b83815260059390931b8501820192828101915089841115612f9457600080fd5b948201945b83861015612fb257855182529482019490820190612f99565b91880151919650909350505080821115612fcb57600080fd5b50612fd885828601612eac565b9150509250929050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b60008282101561302357613023612fe2565b500390565b6000817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff048311821515161561306057613060612fe2565b500290565b60008261309b577f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b500490565b60007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8214156130d2576130d2612fe2565b5060010190565b6000602082840312156130eb57600080fd5b5051919050565b60005b8381101561310d5781810151838201526020016130f5565b8381111561203e5750506000910152565b600082516131308184602087016130f2565b9190910192915050565b60006020828403121561314c57600080fd5b815167ffffffffffffffff81111561316357600080fd5b8201601f8101841361317457600080fd5b805161317f81612a03565b60405161318c82826127c7565b8281528660208486010111156131a157600080fd5b6131b28360208301602087016130f2565b9695505050505050565b60208152600082518060208401526131db8160408501602087016130f2565b601f01601f19169190910160400192915050565b6000821982111561320257613202612fe2565b500190565b60006020828403121561321957600080fd5b8151612b7f8161272a565b600060033d111561323d5760046000803e5060005160e01c5b90565b600060443d101561324e5790565b6040517ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc803d016004833e81513d67ffffffffffffffff816024840111818411171561329c57505050505090565b82850191508151818111156132b45750505050505090565b843d87010160208285010111156132ce5750505050505090565b6132dd602082860101876127c7565b50909594505050505056fea2646970667358221220a180b913d1291e55709242f4a2075cad9cb6f99ef567338fb1d30a40b108e02a64736f6c634300080a0033
Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)
0000000000000000000000004038def268edf63775d9b7ffe8c40a7c6e90daef00000000000000000000000082af49447d8a07e3bd95bd0d56f35241523fbab100000000000000000000000000000000000000000000000000000000000000660000000000000000000000000000000000000000000000000000000000000000
-----Decoded View---------------
Arg [0] : _preTrade (address): 0x4038def268Edf63775d9B7FFe8c40A7c6e90daef
Arg [1] : _weth (address): 0x82aF49447D8a07e3bd95BD0d56f35241523fBab1
Arg [2] : _addressTable (address): 0x0000000000000000000000000000000000000066
Arg [3] : _autoRegisterAddressMapping (bool): False
-----Encoded View---------------
4 Constructor Arguments found :
Arg [0] : 0000000000000000000000004038def268edf63775d9b7ffe8c40a7c6e90daef
Arg [1] : 00000000000000000000000082af49447d8a07e3bd95bd0d56f35241523fbab1
Arg [2] : 0000000000000000000000000000000000000000000000000000000000000066
Arg [3] : 0000000000000000000000000000000000000000000000000000000000000000
Deployed Bytecode Sourcemap
65994:2050:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;38130:10;-1:-1:-1;;;;;38152:4:0;38130:27;;38122:82;;;;-1:-1:-1;;;38122:82:0;;216:2:1;38122:82:0;;;198:21:1;255:2;235:18;;;228:30;294:34;274:18;;;267:62;365:12;345:18;;;338:40;395:19;;38122:82:0;;;;;;;;;65994:2050;;;;;29822:1875;;;;;;:::i;:::-;;:::i;:::-;;;5061:25:1;;;5049:2;5034:18;29822:1875:0;;;;;;;;65079:826;;;;;;;;;;-1:-1:-1;65079:826:0;;;;;:::i;:::-;;:::i;:::-;;;;;;;;:::i;61786:46::-;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;7374:55:1;;;7356:74;;7344:2;7329:18;61786:46:0;7185:251:1;24676:27:0;;;;;;;;;;;;;;;38357:186;;;;;;;;;;-1:-1:-1;38357:186:0;;;;;:::i;:::-;;:::i;26498:203::-;;;;;;;;;;-1:-1:-1;26498:203:0;;;;;:::i;:::-;;:::i;37302:725::-;;;;;;;;;;-1:-1:-1;37302:725:0;;;;;:::i;:::-;;:::i;67208:833::-;;;;;;:::i;:::-;;:::i;5488:103::-;;;;;;;;;;;;;:::i;66371:169::-;;;;;;;;;;-1:-1:-1;66371:169:0;;;;;:::i;:::-;;:::i;4837:87::-;;;;;;;;;;-1:-1:-1;4883:7:0;4910:6;-1:-1:-1;;;;;4910:6:0;4837:87;;38688:309;;;;;;;;;;-1:-1:-1;38688:309:0;;;;;:::i;:::-;;:::i;66548:652::-;;;;;;:::i;:::-;;:::i;61839:38::-;;;;;;;;;;-1:-1:-1;61839:38:0;;;;;;;;;;;;;;9930:14:1;;9923:22;9905:41;;9893:2;9878:18;61839:38:0;9765:187:1;36584:495:0;;;;;;:::i;:::-;;:::i;27317:1839::-;;;;;;:::i;:::-;;:::i;5746:201::-;;;;;;;;;;-1:-1:-1;5746:201:0;;;;;:::i;:::-;;:::i;24635:32::-;;;;;;;;;;-1:-1:-1;24635:32:0;;;;-1:-1:-1;;;;;24635:32:0;;;29822:1875;30262:19;-1:-1:-1;;;;;30303:23:0;;30299:78;;30355:10;30343:22;;30299:78;30413:25;30441:200;30478:4;30497:5;30517:15;30547:10;30572:9;30596:10;30621:9;30441:22;:200::i;:::-;30413:228;-1:-1:-1;24755:42:0;-1:-1:-1;;;;;30679:19:0;;;30675:203;;;30736:15;30723:9;:28;30715:96;;;;-1:-1:-1;;;30715:96:0;;12192:2:1;30715:96:0;;;12174:21:1;12231:2;12211:18;;;12204:30;12270:34;12250:18;;;12243:62;12341:25;12321:18;;;12314:53;12384:19;;30715:96:0;11990:419:1;30715:96:0;30826:4;-1:-1:-1;;;;;30826:12:0;;30846:17;30826:40;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30675:203;30934:124;30964:17;30996:9;31020:8;31043:4;30934:15;:124::i;:::-;31081:20;31127:32;;;31174:5;;31194:8;31217:4;31236:17;31268:15;31298:5;31318:9;31342:10;31367;31392:9;31104:308;;;;;;;;;;;;;;;;;;:::i;:::-;;;;-1:-1:-1;;31104:308:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;31439:139:0;31467:5;31104:308;31509:5;31529:14;31558:9;31439:13;:139::i;:::-;31594:95;;;14394:25:1;;;14450:2;14435:18;;14428:34;;;-1:-1:-1;;;;;14498:55:1;;;14478:18;;;14471:83;31684:4:0;14585:2:1;14570:18;;14563:50;31594:95:0;;14428:34:1;;-1:-1:-1;31661:10:0;;31594:95;;;;;;;;;;;;;14381:3:1;31594:95:0;;;30288:1409;;29822:1875;;;;;;;;;;;;;;:::o;65079:826::-;-1:-1:-1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;65327:30:0;65342:5;65349:7;65327:14;:30::i;:::-;-1:-1:-1;;;;;65299:58:0;;;;;;-1:-1:-1;65395:30:0;65410:5;65299:58;65395:14;:30::i;:::-;-1:-1:-1;;;;;65368:57:0;;;65369:13;;;65368:57;;-1:-1:-1;65464:30:0;65479:5;65368:57;65464:14;:30::i;:::-;-1:-1:-1;;;;;65436:58:0;;;65437:14;;;65436:58;;-1:-1:-1;65537:30:0;65552:5;65436:58;65537:14;:30::i;:::-;-1:-1:-1;;;;;65505:62:0;;;65506:18;;;65505:62;;-1:-1:-1;65613:29:0;65627:5;65505:62;65613:13;:29::i;:::-;65581:19;;;65580:62;;;;;-1:-1:-1;65690:29:0;65704:5;65580:62;65690:13;:29::i;:::-;65654:23;;;65653:66;;;;;-1:-1:-1;65763:29:0;65777:5;65653:66;65763:13;:29::i;:::-;65731:19;;;65730:62;;;;;-1:-1:-1;65835:29:0;65849:5;65730:62;65835:13;:29::i;:::-;65804:18;;;65803:61;;;;65804:9;;65803:61;;-1:-1:-1;65079:826:0;;-1:-1:-1;;65079:826:0:o;38357:186::-;4883:7;4910:6;-1:-1:-1;;;;;4910:6:0;3637:10;5057:23;5049:68;;;;-1:-1:-1;;;5049:68:0;;14826:2:1;5049:68:0;;;14808:21:1;;;14845:18;;;14838:30;14904:34;14884:18;;;14877:62;14956:18;;5049:68:0;14624:356:1;5049:68:0;38495:40:::1;-1:-1:-1::0;;;;;38495:19:0;::::1;38515:10;38527:7:::0;38495:19:::1;:40::i;:::-;38357:186:::0;;:::o;26498:203::-;4883:7;4910:6;-1:-1:-1;;;;;4910:6:0;3637:10;5057:23;5049:68;;;;-1:-1:-1;;;5049:68:0;;14826:2:1;5049:68:0;;;14808:21:1;;;14845:18;;;14838:30;14904:34;14884:18;;;14877:62;14956:18;;5049:68:0;14624:356:1;5049:68:0;26625:8:::1;:20:::0;;;::::1;-1:-1:-1::0;;;;;26625:20:0;::::1;::::0;;::::1;::::0;;;26661:32:::1;::::0;::::1;::::0;-1:-1:-1;;26661:32:0::1;26498:203:::0;:::o;37302:725::-;37433:19;-1:-1:-1;;;;;37474:23:0;;37470:78;;37526:10;37514:22;;37470:78;37560:77;-1:-1:-1;;;;;37575:4:0;37560:38;37599:10;37619:4;37626:10;37560:38;:77::i;:::-;37648:25;;;;;;;;5061::1;;;37648:4:0;-1:-1:-1;;;;;37648:13:0;;;;5034:18:1;;37648:25:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;37685:12;37703:9;-1:-1:-1;;;;;37703:14:0;37725:10;37703:37;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;37684:56;;;37790:7;37782:89;;;;-1:-1:-1;;;37782:89:0;;15397:2:1;37782:89:0;;;15379:21:1;15436:2;15416:18;;;15409:30;15475:34;15455:18;;;15448:62;15546:34;15526:18;;;15519:62;15618:7;15597:19;;;15590:36;15643:19;;37782:89:0;15195:473:1;37782:89:0;37922:97;;;14394:25:1;;;14450:2;14435:18;;14428:34;;;-1:-1:-1;;;;;14498:55:1;;;14478:18;;;14471:83;-1:-1:-1;14585:2:1;14570:18;;14563:50;37922:97:0;;14394:25:1;;-1:-1:-1;37990:10:0;;24755:42;;37936:4;37922:97;;;;;;;;;14381:3:1;37922:97:0;;;37459:568;37302:725;;;;:::o;67208:833::-;67327:19;67379:24;67418:14;67446:24;67461:5;;67446:24;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;67446:24:0;-1:-1:-1;67446:14:0;;-1:-1:-1;;67446:24:0:i;:::-;67512:16;;;67526:1;67512:16;;;;;;;;;67364:106;;-1:-1:-1;67364:106:0;;-1:-1:-1;67483:26:0;;67512:16;;;;;;;;;;;;-1:-1:-1;;67567:16:0;;;67539:25;67567:16;;;;;;;;;67483:45;;-1:-1:-1;67539:44:0;67609:8;:13;;;67594:9;67604:1;67594:12;;;;;;;;:::i;:::-;-1:-1:-1;;;;;67594:28:0;;;:12;;;;;;;;;;;:28;67694:13;;67642:391;;67723:14;:5;67729:6;67723:5;;:14;:::i;:::-;67752:9;67776:8;67806;:12;;;67834:8;:18;;;67874:8;:13;;;67903:8;:22;;;67940:8;:17;;;67972:8;:18;;;68005:8;:17;;;67642:24;:391::i;:::-;67635:398;67208:833;-1:-1:-1;;;;;;;67208:833:0:o;5488:103::-;4883:7;4910:6;-1:-1:-1;;;;;4910:6:0;3637:10;5057:23;5049:68;;;;-1:-1:-1;;;5049:68:0;;14826:2:1;5049:68:0;;;14808:21:1;;;14845:18;;;14838:30;14904:34;14884:18;;;14877:62;14956:18;;5049:68:0;14624:356:1;5049:68:0;5553:30:::1;5580:1;5553:18;:30::i;:::-;5488:103::o:0;66371:169::-;4883:7;4910:6;-1:-1:-1;;;;;4910:6:0;3637:10;5057:23;5049:68;;;;-1:-1:-1;;;5049:68:0;;14826:2:1;5049:68:0;;;14808:21:1;;;14845:18;;;14838:30;14904:34;14884:18;;;14877:62;14956:18;;5049:68:0;14624:356:1;5049:68:0;66493:39:::1;66524:7;66493:30;:39::i;:::-;66371:169:::0;:::o;38688:309::-;4883:7;4910:6;-1:-1:-1;;;;;4910:6:0;3637:10;5057:23;5049:68;;;;-1:-1:-1;;;5049:68:0;;14826:2:1;5049:68:0;;;14808:21:1;;;14845:18;;;14838:30;14904:34;14884:18;;;14877:62;14956:18;;5049:68:0;14624:356:1;5049:68:0;38820:35:::1;::::0;38802:12:::1;::::0;38820:10:::1;::::0;38843:7;;38802:12;38820:35;38802:12;38820:35;38843:7;38820:10;:35:::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;38801:54;;;38903:7;38895:94;;;::::0;-1:-1:-1;;;38895:94:0;;16400:2:1;38895:94:0::1;::::0;::::1;16382:21:1::0;16439:2;16419:18;;;16412:30;16478:34;16458:18;;;16451:62;16549:34;16529:18;;;16522:62;16621:12;16600:19;;;16593:41;16651:19;;38895:94:0::1;16198:478:1::0;66548:652:0;66662:19;66714:24;66753:14;66781:24;66796:5;;66781:24;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;66781:24:0;-1:-1:-1;66781:14:0;;-1:-1:-1;;66781:24:0:i;:::-;66872:13;;66699:106;;-1:-1:-1;66699:106:0;-1:-1:-1;66825:367:0;;66901:14;:5;66699:106;66901:5;;:14;:::i;:::-;66930:13;;66965:12;;;;66993:18;;;;67033:13;;;;67062:22;;;;67099:17;;;;67131:18;;;;67164:17;;;;66825:19;:367::i;:::-;66818:374;66548:652;-1:-1:-1;;;;;66548:652:0:o;36584:495::-;36699:19;-1:-1:-1;;;;;36740:23:0;;36736:78;;36792:10;36780:22;;36736:78;36826:4;-1:-1:-1;;;;;36826:12:0;;36846:9;36826:32;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;36869:56:0;;-1:-1:-1;;;;;;;36884:4:0;36869:34;;-1:-1:-1;36904:9:0;;-1:-1:-1;36915:9:0;36869:34;:56::i;:::-;-1:-1:-1;36975:96:0;;;36950:9;14394:25:1;;;14450:2;14435:18;;14428:34;;;-1:-1:-1;;;;;14498:55:1;;;14478:18;;;14471:83;-1:-1:-1;14585:2:1;14570:18;;14563:50;36975:96:0;;36950:9;;37042:10;;37022:4;36975:96;;;;24755:42;;36975:96;;;;;;14381:3:1;36975:96:0;;;36584:495;;;:::o;27317:1839::-;27706:19;-1:-1:-1;;;;;27747:23:0;;27743:78;;27799:10;27787:22;;27743:78;27857:20;27880:195;27917:4;27936:5;27956:10;27981;28006:9;28030:10;28055:9;27880:22;:195::i;:::-;27857:218;-1:-1:-1;24755:42:0;-1:-1:-1;;;;;28113:19:0;;;28109:461;;;28170:10;28157:9;:23;28149:86;;;;-1:-1:-1;;;28149:86:0;;16883:2:1;28149:86:0;;;16865:21:1;16922:2;16902:18;;;16895:30;16961:34;16941:18;;;16934:62;17032:20;17012:18;;;17005:48;17070:19;;28149:86:0;16681:414:1;28149:86:0;28250:4;-1:-1:-1;;;;;28250:12:0;;28270;28250:35;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;28361:59:0;;-1:-1:-1;;;;;;;28376:4:0;28361:34;;-1:-1:-1;28396:9:0;;-1:-1:-1;28407:12:0;28361:34;:59::i;:::-;28109:461;;;28500:58;-1:-1:-1;;;;;28500:21:0;;28522:10;28534:9;28545:12;28500:21;:58::i;:::-;28582:20;28628:27;;;28670:5;;28690:4;28709:12;28736:10;28761:5;28781:9;28805:10;28830;28855:9;28605:270;;;;;;;;;;;;;;;;;:::i;:::-;;;;-1:-1:-1;;28605:270:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;28902:139:0;28930:5;28605:270;28972:5;28992:14;29021:9;28902:13;:139::i;:::-;29057:91;;;14394:25:1;;;14450:2;14435:18;;14428:34;;;-1:-1:-1;;;;;14498:55:1;;;14478:18;;;14471:83;-1:-1:-1;14585:2:1;14570:18;;14563:50;29057:91:0;;14428:34:1;;-1:-1:-1;29119:10:0;;29057:91;;;;;;;;;;;;;14381:3:1;29057:91:0;;;27732:1424;;27317:1839;;;;;;;;;;;;;:::o;5746:201::-;4883:7;4910:6;-1:-1:-1;;;;;4910:6:0;3637:10;5057:23;5049:68;;;;-1:-1:-1;;;5049:68:0;;14826:2:1;5049:68:0;;;14808:21:1;;;14845:18;;;14838:30;14904:34;14884:18;;;14877:62;14956:18;;5049:68:0;14624:356:1;5049:68:0;-1:-1:-1;;;;;5835:22:0;::::1;5827:73;;;::::0;-1:-1:-1;;;5827:73:0;;18271:2:1;5827:73:0::1;::::0;::::1;18253:21:1::0;18310:2;18290:18;;;18283:30;18349:34;18329:18;;;18322:62;18420:8;18400:18;;;18393:36;18446:19;;5827:73:0::1;18069:402:1::0;5827:73:0::1;5911:28;5930:8;5911:18;:28::i;33959:1279::-:0;34366:8;;:193;;;;;-1:-1:-1;;;;;18898:15:1;;;34366:193:0;;;18880:34:1;18950:15;;;18930:18;;;18923:43;18982:18;;;18975:34;;;19045:15;;;19025:18;;;19018:43;19098:15;;;19077:19;;;19070:44;19130:19;;;19123:35;;;19174:19;;;19167:35;;;34248:21:0;;;;;;34366:8;;;;:23;;18791:19:1;;34366:193:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;34366:193:0;;;;;;;;;;;;:::i;:::-;34611:11;;34586:10;;-1:-1:-1;34311:248:0;;-1:-1:-1;34311:248:0;-1:-1:-1;34611:15:0;34607:624;;34657:1;34647:4;34652:1;34647:7;;;;;;;;:::i;:::-;;;;;;;:11;34643:248;;;34679:153;34713:7;34743:4;34770;34775:1;34770:7;;;;;;;;:::i;:::-;;;;;;;34800:10;34811:1;34800:13;;;;;;;;:::i;:::-;;;;;;;34679:11;:153::i;:::-;34868:4;34873:1;34868:7;;;;;;;;:::i;:::-;;;;;;;34851:24;;;;;:::i;:::-;;;34643:248;34909:4;:11;34924:1;34909:16;:31;;;;;34939:1;34929:4;34934:1;34929:7;;;;;;;;:::i;:::-;;;;;;;:11;34909:31;34905:315;;;34961:200;34995:7;35025:10;35072:4;35099;35104:1;35099:7;;;;;;;;:::i;:::-;;;;;;;35129:10;35140:1;35129:13;;;;;;;;:::i;:::-;;;;;;;34961:11;:200::i;:::-;35197:4;35202:1;35197:7;;;;;;;;:::i;:::-;;;;;;;35180:24;;;;;:::i;:::-;;;34905:315;34276:962;;33959:1279;;;;;;;;;:::o;31705:986::-;31949:17;31926:20;31981:692;32002:9;:16;31998:1;:20;31981:692;;;32044:26;32117:1;32098:9;:16;:20;;;;:::i;:::-;32093:1;:25;32089:285;;;-1:-1:-1;32164:12:0;32089:285;;;32280:3;32266:8;32275:1;32266:11;;;;;;;;:::i;:::-;;;;;;;32246:17;:31;;;;:::i;:::-;:37;;;;:::i;:::-;32225:58;-1:-1:-1;32321:33:0;32225:58;32321:12;:33;:::i;:::-;32306:48;;32089:285;24755:42;-1:-1:-1;;;;;32410:19:0;;;32406:252;;;32454:68;32489:9;32499:1;32489:12;;;;;;;;:::i;:::-;;;;;;;32503:18;32469:4;-1:-1:-1;;;;;32454:34:0;;;:68;;;;;:::i;:::-;32406:252;;;32571:67;32593:10;32605:9;32615:1;32605:12;;;;;;;;:::i;:::-;;;;;;;32619:18;32571:4;-1:-1:-1;;;;;32571:21:0;;;:67;;;;;;:::i;:::-;-1:-1:-1;32020:3:0;;;;:::i;:::-;;;;31981:692;;;;31911:773;31705:986;;;;:::o;32699:1252::-;32925:19;;24755:42;-1:-1:-1;;;;;33048:20:0;;;:69;;33091:26;;;;;-1:-1:-1;;;;;7374:55:1;;;33091:26:0;;;7356:74:1;33091:15:0;;;;;7329:18:1;;33091:26:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;33048:69;;;33071:9;-1:-1:-1;;;;;33071:17:0;;33048:69;33021:96;;33210:12;33224:19;33255:5;-1:-1:-1;;;;;33247:19:0;33267:8;33247:29;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;33209:67;;;;33296:7;33291:313;;33425:2;33409:6;:13;:18;33405:32;;;33429:8;;;33405:32;33510:4;33502:6;33498:17;33488:27;;33570:6;33559:28;;;;;;;;;;;;:::i;:::-;33552:36;;-1:-1:-1;;;33552:36:0;;;;;;;;:::i;33291:313::-;-1:-1:-1;;24755:42:0;-1:-1:-1;;;;;33641:20:0;;;:107;;33703:26;;;;;-1:-1:-1;;;;;7374:55:1;;;33703:26:0;;;7356:74:1;33732:16:0;;33703:15;;;;;;7329:18:1;;33703:26:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:45;;;;:::i;:::-;33641:107;;;33664:36;33684:16;-1:-1:-1;;;;;33664:17:0;;;:36;:::i;:::-;33627:121;;33865:14;33850:11;:29;;33842:101;;;;-1:-1:-1;;;33842:101:0;;24335:2:1;33842:101:0;;;24317:21:1;24374:2;24354:18;;;24347:30;24413:34;24393:18;;;24386:62;24484:29;24464:18;;;24457:57;24531:19;;33842:101:0;24133:423:1;33842:101:0;32951:1000;32699:1252;;;;;;;:::o;62508:1157::-;62644:16;;;62741:22;:5;62755:7;62741:13;:22::i;:::-;62721:42;-1:-1:-1;62774:12:0;62785:1;62774:12;;:::i;:::-;;-1:-1:-1;62811:16:0;;;62807:818;;62874:24;:5;62890:7;62874:15;:24::i;:::-;62862:36;-1:-1:-1;62913:13:0;62924:2;62913:13;;:::i;:::-;62947:26;;62913:13;;-1:-1:-1;62947:26:0;;;;;62943:98;;;62994:31;;;;;-1:-1:-1;;;;;7374:55:1;;;62994:31:0;;;7356:74:1;62994:12:0;:21;;;;7329:18:1;;62994:31:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;62943:98;62807:818;;;63076:11;:16;;63091:1;63076:16;63072:553;;;-1:-1:-1;;;;;63143:12:0;:24;;63168:23;:5;63183:7;63168:14;:23::i;:::-;63143:49;;;;;;;;;;;24857:23:1;;;;63143:49:0;;;24839:42:1;24812:18;;63143:49:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;63132:60;-1:-1:-1;63207:12:0;63218:1;63207:12;;:::i;:::-;;;63072:553;;;63243:11;:16;;63258:1;63243:16;63239:386;;;-1:-1:-1;;;;;63310:12:0;:24;;63335:23;:5;63350:7;63335:14;:23::i;:::-;63310:49;;;;;;;;;;25337:8:1;25325:21;;;63310:49:0;;;25307:40:1;25280:18;;63310:49:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;63299:60;-1:-1:-1;63374:12:0;63385:1;63374:12;;:::i;63239:386::-;63410:11;:16;;63425:1;63410:16;63406:219;;;63462:42;63451:53;;63406:219;;;63551:62;;-1:-1:-1;;;63551:62:0;;25560:2:1;63551:62:0;;;25542:21:1;25599:2;25579:18;;;25572:30;25638:34;25618:18;;;25611:62;25709:22;25689:18;;;25682:50;25749:19;;63551:62:0;25358:416:1;63406:219:0;-1:-1:-1;62508:1157:0;;63650:7;;-1:-1:-1;;62508:1157:0:o;63673:1154::-;63822:15;;;63918:22;:5;63932:7;63918:13;:22::i;:::-;63898:42;-1:-1:-1;63951:12:0;63962:1;63951:12;;:::i;:::-;;-1:-1:-1;63980:16:0;;;63976:811;;64059:23;:5;64074:7;64059:14;:23::i;:::-;64049:33;;;-1:-1:-1;64097:12:0;64108:1;64097:12;;:::i;63976:811::-;64145:11;:16;;64160:1;64145:16;64141:646;;;64226:23;:5;64241:7;64226:14;:23::i;:::-;64216:33;;;-1:-1:-1;64264:13:0;64275:2;64264:13;;:::i;64141:646::-;64301:11;:16;;64316:1;64301:16;64297:490;;;64383:23;:5;64398:7;64383:14;:23::i;:::-;64373:33;;;-1:-1:-1;64421:13:0;64432:2;64421:13;;:::i;64297:490::-;64458:11;:16;;64473:1;64458:16;64454:333;;;64543:24;:5;64559:7;64543:15;:24::i;:::-;64533:34;;;-1:-1:-1;64582:13:0;64593:2;64582:13;;:::i;64454:333::-;64627:11;:16;;64642:1;64627:16;64623:164;;;64678:1;64668:11;;64623:164;;;64714:61;;-1:-1:-1;;;64714:61:0;;25981:2:1;64714:61:0;;;25963:21:1;26020:2;26000:18;;;25993:30;26059:34;26039:18;;;26032:62;26130:21;26110:18;;;26103:49;26169:19;;64714:61:0;25779:415:1;9617:361:0;9701:50;;;;;-1:-1:-1;;;;;26391:55:1;;;9701:50:0;;;26373:74:1;26463:18;;;26456:34;;;9701:39:0;;;;;26346:18:1;;9701:50:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;9697:274;;;;:::i;:::-;;;;;;;;;;:::i;:::-;;;;;;;;9876:6;9869:14;;-1:-1:-1;;;9869:14:0;;;;;;;;:::i;9697:274::-;;;9918:41;;-1:-1:-1;;;9918:41:0;;27623:2:1;9918:41:0;;;27605:21:1;27662:2;27642:18;;;27635:30;27701:33;27681:18;;;27674:61;27752:18;;9918:41:0;27421:355:1;9697:274:0;9617:361;;;:::o;9986:392::-;10088:60;;;;;-1:-1:-1;;;;;28062:15:1;;;10088:60:0;;;28044:34:1;28114:15;;;28094:18;;;28087:43;28146:18;;;28139:34;;;10088:43:0;;;;;27956:18:1;;10088:60:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;10084:287;;;;:::i;:::-;;;;;;;;;;:::i;:::-;;;;;;;;;;10314:45;;-1:-1:-1;;;10314:45:0;;28386:2:1;10314:45:0;;;28368:21:1;28425:2;28405:18;;;28398:30;28464:34;28444:18;;;28437:62;28535:5;28515:18;;;28508:33;28558:19;;10314:45:0;28184:399:1;10084:287:0;9986:392;;;;:::o;6107:191::-;6181:16;6200:6;;-1:-1:-1;;;;;6217:17:0;;;;;;;;;;6250:40;;6200:6;;;;;;;6250:40;;6181:16;6250:40;6170:128;6107:191;:::o;62173:202::-;62277:26;:36;;;;;;;;;;;;;;62329:38;;;;;;62306:7;9930:14:1;9923:22;9905:41;;9893:2;9878:18;;9765:187;62329:38:0;;;;;;;;62173:202;:::o;35250:574::-;24755:42;-1:-1:-1;;;;;35418:21:0;;;35414:350;;;35457:12;35483:10;-1:-1:-1;;;;;35475:24:0;35507:4;35475:41;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;35456:60;;;35570:7;35562:76;;;;-1:-1:-1;;;35562:76:0;;28790:2:1;35562:76:0;;;28772:21:1;28829:2;28809:18;;;28802:30;28868:34;28848:18;;;28841:62;28939:26;28919:18;;;28912:54;28983:19;;35562:76:0;28588:420:1;35562:76:0;35441:209;35414:350;;;35671:50;-1:-1:-1;;;;;35671:23:0;;35695:7;35704:10;35716:4;35671:23;:50::i;:::-;35799:10;-1:-1:-1;;;;;35779:37:0;35791:6;-1:-1:-1;;;;;35779:37:0;;35811:4;35779:37;;;;5061:25:1;;5049:2;5034:18;;4915:177;35779:37:0;;;;;;;;35250:574;;;;:::o;35832:582::-;24755:42;-1:-1:-1;;;;;36029:21:0;;;36025:318;;;36068:12;36094:10;-1:-1:-1;;;;;36086:24:0;36118:4;36086:41;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;36067:60;;;36180:7;36172:76;;;;-1:-1:-1;;;36172:76:0;;29215:2:1;36172:76:0;;;29197:21:1;29254:2;29234:18;;;29227:30;29293:34;29273:18;;;29266:62;29364:26;29344:18;;;29337:54;29408:19;;36172:76:0;29013:420:1;36172:76:0;36052:208;36025:318;;;36281:50;-1:-1:-1;;;;;36281:23:0;;36305:7;36314:10;36326:4;36281:23;:50::i;:::-;36389:10;-1:-1:-1;;;;;36358:48:0;36381:6;-1:-1:-1;;;;;36358:48:0;36369:10;36358:48;36401:4;36358:48;;;;5061:25:1;;5049:2;5034:18;;4915:177;36358:48:0;;;;;;;;35832:582;;;;;:::o;51754:311::-;51831:5;51874:10;:6;51883:1;51874:10;:::i;:::-;51857:6;:13;:27;;51849:60;;;;-1:-1:-1;;;51849:60:0;;29640:2:1;51849:60:0;;;29622:21:1;29679:2;29659:18;;;29652:30;29718:21;29698:18;;;29691:49;29757:18;;51849:60:0;29438:343:1;51849:60:0;-1:-1:-1;51989:29:0;52005:3;51989:29;51983:36;;51754:311::o;51383:363::-;51462:7;51507:11;:6;51516:2;51507:11;:::i;:::-;51490:6;:13;:28;;51482:62;;;;-1:-1:-1;;;51482:62:0;;29988:2:1;51482:62:0;;;29970:21:1;30027:2;30007:18;;;30000:30;30066:23;30046:18;;;30039:51;30107:18;;51482:62:0;29786:345:1;51482:62:0;-1:-1:-1;51636:30:0;51652:4;51636:30;51630:37;51669:27;51626:71;;;51383:363::o;52721:314::-;52799:6;52843:10;:6;52852:1;52843:10;:::i;:::-;52826:6;:13;:27;;52818:60;;;;-1:-1:-1;;;52818:60:0;;30338:2:1;52818:60:0;;;30320:21:1;30377:2;30357:18;;;30350:30;30416:22;30396:18;;;30389:50;30456:18;;52818:60:0;30136:344:1;52818:60:0;-1:-1:-1;52959:29:0;52975:3;52959:29;52953:36;;52721:314::o;52399:::-;52477:6;52521:10;:6;52530:1;52521:10;:::i;:::-;52504:6;:13;:27;;52496:60;;;;-1:-1:-1;;;52496:60:0;;30687:2:1;52496:60:0;;;30669:21:1;30726:2;30706:18;;;30699:30;30765:22;30745:18;;;30738:50;30805:18;;52496:60:0;30485:344:1;52496:60:0;-1:-1:-1;52637:29:0;52653:3;52637:29;52631:36;;52399:314::o;53043:::-;53121:6;53165:10;:6;53174:1;53165:10;:::i;:::-;53148:6;:13;:27;;53140:60;;;;-1:-1:-1;;;53140:60:0;;31036:2:1;53140:60:0;;;31018:21:1;31075:2;31055:18;;;31048:30;31114:22;31094:18;;;31087:50;31154:18;;53140:60:0;30834:344:1;53140:60:0;-1:-1:-1;53281:29:0;53297:3;53281:29;53275:36;;53043:314::o;53369:315::-;53447:6;53491:11;:6;53500:2;53491:11;:::i;:::-;53474:6;:13;:28;;53466:61;;;;-1:-1:-1;;;53466:61:0;;31385:2:1;53466:61:0;;;31367:21:1;31424:2;31404:18;;;31397:30;31463:22;31443:18;;;31436:50;31503:18;;53466:61:0;31183:344:1;53466:61:0;-1:-1:-1;53608:29:0;53624:3;53608:29;53602:36;;53369:315::o;53692:::-;53770:6;53814:11;:6;53823:2;53814:11;:::i;:::-;53797:6;:13;:28;;53789:61;;;;-1:-1:-1;;;53789:61:0;;31734:2:1;53789:61:0;;;31716:21:1;31773:2;31753:18;;;31746:30;31812:22;31792:18;;;31785:50;31852:18;;53789:61:0;31532:344:1;53789:61:0;-1:-1:-1;53931:29:0;53947:3;53931:29;53925:36;;53692:315::o;54019:319::-;54098:7;54143:11;:6;54152:2;54143:11;:::i;:::-;54126:6;:13;:28;;54118:62;;;;-1:-1:-1;;;54118:62:0;;32083:2:1;54118:62:0;;;32065:21:1;32122:2;32102:18;;;32095:30;32161:23;32141:18;;;32134:51;32202:18;;54118:62:0;31881:345:1;54118:62:0;-1:-1:-1;54262:29:0;54278:3;54262:29;54256:36;;54019:319::o;425:168:1:-;-1:-1:-1;;;;;518:5:1;514:54;507:5;504:65;494:93;;583:1;580;573:12;598:162;680:20;;709:45;680:20;709:45;:::i;:::-;598:162;;;:::o;765:347::-;816:8;826:6;880:3;873:4;865:6;861:17;857:27;847:55;;898:1;895;888:12;847:55;-1:-1:-1;921:20:1;;964:18;953:30;;950:50;;;996:1;993;986:12;950:50;1033:4;1025:6;1021:17;1009:29;;1085:3;1078:4;1069:6;1061;1057:19;1053:30;1050:39;1047:59;;;1102:1;1099;1092:12;1047:59;765:347;;;;;:::o;1117:184::-;1169:77;1166:1;1159:88;1266:4;1263:1;1256:15;1290:4;1287:1;1280:15;1306:308;-1:-1:-1;;1407:2:1;1401:4;1397:13;1393:86;1385:6;1381:99;1546:6;1534:10;1531:22;1510:18;1498:10;1495:34;1492:62;1489:88;;;1557:18;;:::i;:::-;1593:2;1586:22;-1:-1:-1;;1306:308:1:o;1619:183::-;1679:4;1712:18;1704:6;1701:30;1698:56;;;1734:18;;:::i;:::-;-1:-1:-1;1779:1:1;1775:14;1791:4;1771:25;;1619:183::o;1807:813::-;1861:5;1914:3;1907:4;1899:6;1895:17;1891:27;1881:55;;1932:1;1929;1922:12;1881:55;1968:6;1955:20;1994:4;2017:43;2057:2;2017:43;:::i;:::-;2089:2;2083:9;2101:31;2129:2;2121:6;2101:31;:::i;:::-;2167:18;;;2259:1;2255:10;;;;2243:23;;2239:32;;;2201:15;;;;-1:-1:-1;2283:15:1;;;2280:35;;;2311:1;2308;2301:12;2280:35;2347:2;2339:6;2335:15;2359:231;2375:6;2370:3;2367:15;2359:231;;;2455:3;2442:17;2472:45;2511:5;2472:45;:::i;:::-;2530:18;;2568:12;;;;2392;;2359:231;;;-1:-1:-1;2608:6:1;1807:813;-1:-1:-1;;;;;;1807:813:1:o;2625:724::-;2679:5;2732:3;2725:4;2717:6;2713:17;2709:27;2699:55;;2750:1;2747;2740:12;2699:55;2786:6;2773:20;2812:4;2835:43;2875:2;2835:43;:::i;:::-;2907:2;2901:9;2919:31;2947:2;2939:6;2919:31;:::i;:::-;2985:18;;;3077:1;3073:10;;;;3061:23;;3057:32;;;3019:15;;;;-1:-1:-1;3101:15:1;;;3098:35;;;3129:1;3126;3119:12;3098:35;3165:2;3157:6;3153:15;3177:142;3193:6;3188:3;3185:15;3177:142;;;3259:17;;3247:30;;3297:12;;;;3210;;3177:142;;3354:1556;3612:6;3620;3628;3636;3644;3652;3660;3668;3676;3684;3692:7;3701;3755:3;3743:9;3734:7;3730:23;3726:33;3723:53;;;3772:1;3769;3762:12;3723:53;3795:43;3828:9;3795:43;:::i;:::-;3785:53;;3887:18;3881:2;3870:9;3866:18;3853:32;3850:56;3847:76;;;3919:1;3916;3909:12;3847:76;3958:84;4034:7;4027:2;4016:9;4012:18;3999:32;3988:9;3984:48;3958:84;:::i;:::-;4061:8;;-1:-1:-1;4088:8:1;-1:-1:-1;4145:18:1;4139:2;4124:18;;4111:32;4108:56;4105:76;;;4177:1;4174;4167:12;4105:76;4200:87;4279:7;4272:2;4261:9;4257:18;4244:32;4233:9;4229:48;4200:87;:::i;:::-;4190:97;;4336:18;4330:2;4319:9;4315:18;4302:32;4299:56;4296:76;;;4368:1;4365;4358:12;4296:76;4391:87;4470:7;4463:2;4452:9;4448:18;4435:32;4424:9;4420:48;4391:87;:::i;:::-;4381:97;;4497:53;4545:3;4534:9;4530:19;4497:53;:::i;:::-;4487:63;;4597:3;4586:9;4582:19;4569:33;4559:43;;4621:53;4669:3;4658:9;4654:19;4621:53;:::i;:::-;4611:63;;4721:3;4710:9;4706:19;4693:33;4683:43;;4745:53;4793:3;4782:9;4778:19;4745:53;:::i;:::-;4735:63;;4846:3;4835:9;4831:19;4818:33;4807:44;;4899:3;4888:9;4884:19;4871:33;4860:44;;3354:1556;;;;;;;;;;;;;;:::o;5097:245::-;5145:4;5178:18;5170:6;5167:30;5164:56;;;5200:18;;:::i;:::-;-1:-1:-1;5257:2:1;5245:15;-1:-1:-1;;5241:88:1;5331:4;5237:99;;5097:245::o;5347:805::-;5424:6;5432;5485:2;5473:9;5464:7;5460:23;5456:32;5453:52;;;5501:1;5498;5491:12;5453:52;5541:9;5528:23;5574:18;5566:6;5563:30;5560:50;;;5606:1;5603;5596:12;5560:50;5629:22;;5682:4;5674:13;;5670:27;-1:-1:-1;5660:55:1;;5711:1;5708;5701:12;5660:55;5747:2;5734:16;5769:31;5797:2;5769:31;:::i;:::-;5829:2;5823:9;5841:31;5869:2;5861:6;5841:31;:::i;:::-;5896:2;5888:6;5881:18;5938:7;5931:4;5926:2;5922;5918:11;5914:22;5911:35;5908:55;;;5959:1;5956;5949:12;5908:55;6019:2;6012:4;6008:2;6004:13;5997:4;5989:6;5985:17;5972:50;6066:1;6059:4;6042:15;;;6038:26;;6031:37;6042:15;6125:20;;;;6112:34;;-1:-1:-1;;;;;5347:805:1:o;6289:891::-;6461:4;6503:3;6492:9;6488:19;6480:27;;-1:-1:-1;;;;;6614:2:1;6605:6;6599:13;6595:22;6584:9;6577:41;6686:2;6678:4;6670:6;6666:17;6660:24;6656:33;6649:4;6638:9;6634:20;6627:63;6758:2;6750:4;6742:6;6738:17;6732:24;6728:33;6721:4;6710:9;6706:20;6699:63;;6809:4;6801:6;6797:17;6791:24;6824:54;6872:4;6861:9;6857:20;6843:12;-1:-1:-1;;;;;6223:54:1;6211:67;;6157:127;6824:54;;6934:4;6926:6;6922:17;6916:24;6909:4;6898:9;6894:20;6887:54;6997:4;6989:6;6985:17;6979:24;6972:4;6961:9;6957:20;6950:54;7060:4;7052:6;7048:17;7042:24;7035:4;7024:9;7020:20;7013:54;7123:4;7115:6;7111:17;7105:24;7098:4;7087:9;7083:20;7076:54;7167:6;7161:3;7150:9;7146:19;7139:35;6289:891;;;;;:::o;7685:343::-;7767:6;7775;7828:2;7816:9;7807:7;7803:23;7799:32;7796:52;;;7844:1;7841;7834:12;7796:52;7883:9;7870:23;7902:45;7941:5;7902:45;:::i;:::-;7966:5;8018:2;8003:18;;;;7990:32;;-1:-1:-1;;;7685:343:1:o;8033:285::-;8116:6;8169:2;8157:9;8148:7;8144:23;8140:32;8137:52;;;8185:1;8182;8175:12;8137:52;8224:9;8211:23;8243:45;8282:5;8243:45;:::i;:::-;8307:5;8033:285;-1:-1:-1;;;8033:285:1:o;8323:329::-;8391:6;8399;8452:2;8440:9;8431:7;8427:23;8423:32;8420:52;;;8468:1;8465;8458:12;8420:52;8504:9;8491:23;8481:33;;8564:2;8553:9;8549:18;8536:32;8577:45;8616:5;8577:45;:::i;:::-;8641:5;8631:15;;;8323:329;;;;;:::o;8657:409::-;8727:6;8735;8788:2;8776:9;8767:7;8763:23;8759:32;8756:52;;;8804:1;8801;8794:12;8756:52;8844:9;8831:23;8877:18;8869:6;8866:30;8863:50;;;8909:1;8906;8899:12;8863:50;8948:58;8998:7;8989:6;8978:9;8974:22;8948:58;:::i;:::-;9025:8;;8922:84;;-1:-1:-1;8657:409:1;-1:-1:-1;;;;8657:409:1:o;9071:273::-;9127:6;9180:2;9168:9;9159:7;9155:23;9151:32;9148:52;;;9196:1;9193;9186:12;9148:52;9235:9;9222:23;9288:5;9281:13;9274:21;9267:5;9264:32;9254:60;;9310:1;9307;9300:12;9580:180;9639:6;9692:2;9680:9;9671:7;9667:23;9663:32;9660:52;;;9708:1;9705;9698:12;9660:52;-1:-1:-1;9731:23:1;;9580:180;-1:-1:-1;9580:180:1:o;10223:1507::-;10422:6;10430;10438;10446;10454;10462;10470;10478;10486;10494;10502:7;10556:3;10544:9;10535:7;10531:23;10527:33;10524:53;;;10573:1;10570;10563:12;10524:53;10612:9;10599:23;10631:45;10670:5;10631:45;:::i;:::-;10695:5;-1:-1:-1;10751:2:1;10736:18;;10723:32;10778:18;10767:30;;10764:50;;;10810:1;10807;10800:12;10764:50;10849:58;10899:7;10890:6;10879:9;10875:22;10849:58;:::i;:::-;10926:8;;-1:-1:-1;10823:84:1;-1:-1:-1;;11013:2:1;10998:18;;10985:32;11026:47;10985:32;11026:47;:::i;:::-;11092:7;-1:-1:-1;11151:2:1;11136:18;;11123:32;11164:47;11123:32;11164:47;:::i;:::-;11230:7;-1:-1:-1;11284:3:1;11269:19;;11256:33;;-1:-1:-1;11341:3:1;11326:19;;11313:33;11355:47;11313:33;11355:47;:::i;:::-;11421:7;-1:-1:-1;11475:3:1;11460:19;;11447:33;;-1:-1:-1;11532:3:1;11517:19;;11504:33;11546:47;11504:33;11546:47;:::i;:::-;11612:7;11602:17;;;11666:3;11655:9;11651:19;11638:33;11628:43;;11719:3;11708:9;11704:19;11691:33;11680:44;;10223:1507;;;;;;;;;;;;;;:::o;12414:325::-;12502:6;12497:3;12490:19;12554:6;12547:5;12540:4;12535:3;12531:14;12518:43;;12606:1;12599:4;12590:6;12585:3;12581:16;12577:27;12570:38;12472:3;12728:4;-1:-1:-1;;12653:2:1;12645:6;12641:15;12637:88;12632:3;12628:98;12624:109;12617:116;;12414:325;;;;:::o;12744:1420::-;13232:3;13221:9;13214:22;13195:4;13259:62;13316:3;13305:9;13301:19;13293:6;13285;13259:62;:::i;:::-;13369:9;13361:6;13357:22;13352:2;13341:9;13337:18;13330:50;13400:6;13435;13429:13;13466:6;13458;13451:22;13501:2;13493:6;13489:15;13482:22;;13539:2;13531:6;13527:15;13513:29;;13560:1;13570:169;13584:6;13581:1;13578:13;13570:169;;;13645:13;;13633:26;;13688:2;13714:15;;;;13679:12;;;;13606:1;13599:9;13570:169;;;-1:-1:-1;;;;;;;6223:54:1;;13810:2;13795:18;;6211:67;13756:3;-1:-1:-1;13768:46:1;;-1:-1:-1;6157:127:1;13768:46;13850:6;13845:2;13834:9;13830:18;13823:34;13894:6;13888:3;13877:9;13873:19;13866:35;13910:47;13952:3;13941:9;13937:19;13929:6;-1:-1:-1;;;;;6223:54:1;6211:67;;6157:127;13910:47;-1:-1:-1;;;;;6223:54:1;;14008:3;13993:19;;6211:67;-1:-1:-1;;;;;6223:54:1;;14064:3;14049:19;;6211:67;14100:3;14085:19;;14078:35;;;;14144:3;14129:19;14122:36;12744:1420;;-1:-1:-1;;;;;;;;;12744:1420:1:o;15673:184::-;15725:77;15722:1;15715:88;15822:4;15819:1;15812:15;15846:4;15843:1;15836:15;15862:331;15967:9;15978;16020:8;16008:10;16005:24;16002:44;;;16042:1;16039;16032:12;16002:44;16071:6;16061:8;16058:20;16055:40;;;16091:1;16088;16081:12;16055:40;-1:-1:-1;;16117:23:1;;;16162:25;;;;;-1:-1:-1;15862:331:1:o;17100:964::-;17472:4;17501:3;17531:2;17520:9;17513:21;17551:61;17608:2;17597:9;17593:18;17585:6;17577;17551:61;:::i;:::-;-1:-1:-1;;;;;17709:15:1;;;17704:2;17689:18;;17682:43;17756:2;17741:18;;17734:34;;;;-1:-1:-1;;17799:2:1;17784:18;;17777:34;;;;17848:15;;;17842:3;17827:19;;17820:44;17901:15;;;17895:3;17880:19;;17873:44;17954:15;;;17948:3;17933:19;;17926:44;18001:3;17986:19;;17979:35;;;;18045:3;18030:19;18023:35;;;;17543:69;17100:964;-1:-1:-1;;17100:964:1:o;19213:810::-;19278:5;19331:3;19324:4;19316:6;19312:17;19308:27;19298:55;;19349:1;19346;19339:12;19298:55;19378:6;19372:13;19404:4;19427:43;19467:2;19427:43;:::i;:::-;19499:2;19493:9;19511:31;19539:2;19531:6;19511:31;:::i;:::-;19577:18;;;19669:1;19665:10;;;;19653:23;;19649:32;;;19611:15;;;;-1:-1:-1;19693:15:1;;;19690:35;;;19721:1;19718;19711:12;19690:35;19757:2;19749:6;19745:15;19769:224;19785:6;19780:3;19777:15;19769:224;;;19858:3;19852:10;19875:45;19914:5;19875:45;:::i;:::-;19933:18;;19971:12;;;;19802;;19769:224;;20028:1196;20157:6;20165;20218:2;20206:9;20197:7;20193:23;20189:32;20186:52;;;20234:1;20231;20224:12;20186:52;20267:9;20261:16;20296:18;20337:2;20329:6;20326:14;20323:34;;;20353:1;20350;20343:12;20323:34;20391:6;20380:9;20376:22;20366:32;;20436:7;20429:4;20425:2;20421:13;20417:27;20407:55;;20458:1;20455;20448:12;20407:55;20487:2;20481:9;20509:4;20532:43;20572:2;20532:43;:::i;:::-;20604:2;20598:9;20616:31;20644:2;20636:6;20616:31;:::i;:::-;20682:18;;;20770:1;20766:10;;;;20758:19;;20754:28;;;20716:15;;;;-1:-1:-1;20794:19:1;;;20791:39;;;20826:1;20823;20816:12;20791:39;20850:11;;;;20870:135;20886:6;20881:3;20878:15;20870:135;;;20952:10;;20940:23;;20903:12;;;;20983;;;;20870:135;;;21061:18;;;21055:25;21024:6;;-1:-1:-1;21055:25:1;;-1:-1:-1;;;21092:16:1;;;21089:36;;;21121:1;21118;21111:12;21089:36;;21144:74;21210:7;21199:8;21188:9;21184:24;21144:74;:::i;:::-;21134:84;;;20028:1196;;;;;:::o;21229:184::-;21281:77;21278:1;21271:88;21378:4;21375:1;21368:15;21402:4;21399:1;21392:15;21418:125;21458:4;21486:1;21483;21480:8;21477:34;;;21491:18;;:::i;:::-;-1:-1:-1;21528:9:1;;21418:125::o;21548:228::-;21588:7;21714:1;21646:66;21642:74;21639:1;21636:81;21631:1;21624:9;21617:17;21613:105;21610:131;;;21721:18;;:::i;:::-;-1:-1:-1;21761:9:1;;21548:228::o;21781:274::-;21821:1;21847;21837:189;;21882:77;21879:1;21872:88;21983:4;21980:1;21973:15;22011:4;22008:1;22001:15;21837:189;-1:-1:-1;22040:9:1;;21781:274::o;22060:195::-;22099:3;22130:66;22123:5;22120:77;22117:103;;;22200:18;;:::i;:::-;-1:-1:-1;22247:1:1;22236:13;;22060:195::o;22260:184::-;22330:6;22383:2;22371:9;22362:7;22358:23;22354:32;22351:52;;;22399:1;22396;22389:12;22351:52;-1:-1:-1;22422:16:1;;22260:184;-1:-1:-1;22260:184:1:o;22449:258::-;22521:1;22531:113;22545:6;22542:1;22539:13;22531:113;;;22621:11;;;22615:18;22602:11;;;22595:39;22567:2;22560:10;22531:113;;;22662:6;22659:1;22656:13;22653:48;;;-1:-1:-1;;22697:1:1;22679:16;;22672:27;22449:258::o;22712:274::-;22841:3;22879:6;22873:13;22895:53;22941:6;22936:3;22929:4;22921:6;22917:17;22895:53;:::i;:::-;22964:16;;;;;22712:274;-1:-1:-1;;22712:274:1:o;22991:690::-;23071:6;23124:2;23112:9;23103:7;23099:23;23095:32;23092:52;;;23140:1;23137;23130:12;23092:52;23173:9;23167:16;23206:18;23198:6;23195:30;23192:50;;;23238:1;23235;23228:12;23192:50;23261:22;;23314:4;23306:13;;23302:27;-1:-1:-1;23292:55:1;;23343:1;23340;23333:12;23292:55;23372:2;23366:9;23394:31;23422:2;23394:31;:::i;:::-;23454:2;23448:9;23466:31;23494:2;23486:6;23466:31;:::i;:::-;23521:2;23513:6;23506:18;23561:7;23556:2;23551;23547;23543:11;23539:20;23536:33;23533:53;;;23582:1;23579;23572:12;23533:53;23595:55;23647:2;23642;23634:6;23630:15;23625:2;23621;23617:11;23595:55;:::i;:::-;23669:6;22991:690;-1:-1:-1;;;;;;22991:690:1:o;23686:442::-;23835:2;23824:9;23817:21;23798:4;23867:6;23861:13;23910:6;23905:2;23894:9;23890:18;23883:34;23926:66;23985:6;23980:2;23969:9;23965:18;23960:2;23952:6;23948:15;23926:66;:::i;:::-;24044:2;24032:15;-1:-1:-1;;24028:88:1;24013:104;;;;24119:2;24009:113;;23686:442;-1:-1:-1;;23686:442:1:o;24561:128::-;24601:3;24632:1;24628:6;24625:1;24622:13;24619:39;;;24638:18;;:::i;:::-;-1:-1:-1;24674:9:1;;24561:128::o;24892:265::-;24962:6;25015:2;25003:9;24994:7;24990:23;24986:32;24983:52;;;25031:1;25028;25021:12;24983:52;25063:9;25057:16;25082:45;25121:5;25082:45;:::i;26501:179::-;26536:3;26578:1;26560:16;26557:23;26554:120;;;26624:1;26621;26618;26603:23;-1:-1:-1;26661:1:1;26655:8;26650:3;26646:18;26554:120;26501:179;:::o;26685:731::-;26724:3;26766:4;26748:16;26745:26;26742:39;;;26685:731;:::o;26742:39::-;26808:2;26802:9;26830:66;26951:2;26933:16;26929:25;26926:1;26920:4;26905:50;26984:4;26978:11;27008:16;27043:18;27114:2;27107:4;27099:6;27095:17;27092:25;27087:2;27079:6;27076:14;27073:45;27070:58;;;27121:5;;;;;26685:731;:::o;27070:58::-;27158:6;27152:4;27148:17;27137:28;;27194:3;27188:10;27221:2;27213:6;27210:14;27207:27;;;27227:5;;;;;;26685:731;:::o;27207:27::-;27311:2;27292:16;27286:4;27282:27;27278:36;27271:4;27262:6;27257:3;27253:16;27249:27;27246:69;27243:82;;;27318:5;;;;;;26685:731;:::o;27243:82::-;27334:57;27385:4;27376:6;27368;27364:19;27360:30;27354:4;27334:57;:::i;:::-;-1:-1:-1;27407:3:1;;26685:731;-1:-1:-1;;;;;26685:731:1:o
Swarm Source
ipfs://a180b913d1291e55709242f4a2075cad9cb6f99ef567338fb1d30a40b108e02a
Loading...
Loading
Loading...
Loading
Loading...
Loading
Net Worth in USD
$0.00
Net Worth in ETH
0
Multichain Portfolio | 35 Chains
| Chain | Token | Portfolio % | Price | Amount | Value |
|---|
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.