Overview
ETH Balance
0 ETH
Eth Value
$0.00Token Holdings
More Info
Private Name Tags
ContractCreator
Latest 25 from a total of 124 transactions
Transaction Hash |
Method
|
Block
|
From
|
To
|
|||||
---|---|---|---|---|---|---|---|---|---|
Disembark | 21345427 | 14 days ago | IN | 0 ETH | 0.00275289 | ||||
Depart | 21338843 | 15 days ago | IN | 0 ETH | 0.00197478 | ||||
Disembark | 21323965 | 17 days ago | IN | 0 ETH | 0.00466084 | ||||
Depart | 21317387 | 18 days ago | IN | 0 ETH | 0.00749442 | ||||
Disembark | 21187921 | 36 days ago | IN | 0 ETH | 0.00229479 | ||||
Depart | 21181337 | 37 days ago | IN | 0 ETH | 0.00652702 | ||||
Disembark | 21173572 | 38 days ago | IN | 0 ETH | 0.00332054 | ||||
Depart | 21166992 | 39 days ago | IN | 0 ETH | 0.00380555 | ||||
Embark With Sign... | 21152096 | 41 days ago | IN | 0 ETH | 0.00083499 | ||||
Disembark | 21066119 | 53 days ago | IN | 0 ETH | 0.00214542 | ||||
Depart | 21059555 | 54 days ago | IN | 0 ETH | 0.00070966 | ||||
Disembark | 20894193 | 77 days ago | IN | 0 ETH | 0.00046775 | ||||
Depart | 20887587 | 78 days ago | IN | 0 ETH | 0.00051772 | ||||
Disembark | 20865483 | 81 days ago | IN | 0 ETH | 0.00224353 | ||||
Depart | 20858885 | 82 days ago | IN | 0 ETH | 0.00069991 | ||||
Disembark | 20793791 | 91 days ago | IN | 0 ETH | 0.00089725 | ||||
Depart | 20787228 | 92 days ago | IN | 0 ETH | 0.00085002 | ||||
Embark With Sign... | 20741287 | 98 days ago | IN | 0 ETH | 0.00029197 | ||||
Embark With Sign... | 20707704 | 103 days ago | IN | 0 ETH | 0.00026567 | ||||
Embark With Sign... | 20622194 | 115 days ago | IN | 0 ETH | 0.00022901 | ||||
Embark With Sign... | 20595401 | 119 days ago | IN | 0 ETH | 0.00009877 | ||||
Embark With Sign... | 20591261 | 119 days ago | IN | 0 ETH | 0.00018202 | ||||
Embark With Sign... | 20583709 | 120 days ago | IN | 0 ETH | 0.00018745 | ||||
Embark With Sign... | 20572074 | 122 days ago | IN | 0 ETH | 0.00012469 | ||||
Embark With Sign... | 20557684 | 124 days ago | IN | 0 ETH | 0.00009225 |
View more zero value Internal Transactions in Advanced View mode
Advanced mode:
Loading...
Loading
Contract Source Code Verified (Exact Match)
Contract Name:
Fraxferry
Compiler Version
v0.8.23+commit.f704f362
Contract Source Code (Solidity)
/** *Submitted for verification at Etherscan.io on 2023-11-12 */ // SPDX-License-Identifier: GPL-2.0-or-later pragma solidity >=0.8.0; // Sources flattened with hardhat v2.17.3 https://hardhat.org // File @openzeppelin/contracts/token/ERC20/extensions/[email protected] // Original license: SPDX_License_Identifier: MIT // OpenZeppelin Contracts (last updated v4.9.0) (token/ERC20/extensions/IERC20Permit.sol) /** * @dev Interface of the ERC20 Permit extension allowing approvals to be made via signatures, as defined in * https://eips.ethereum.org/EIPS/eip-2612[EIP-2612]. * * Adds the {permit} method, which can be used to change an account's ERC20 allowance (see {IERC20-allowance}) by * presenting a message signed by the account. By not relying on {IERC20-approve}, the token holder account doesn't * need to send a transaction, and thus is not required to hold Ether at all. */ interface IERC20Permit { /** * @dev Sets `value` as the allowance of `spender` over ``owner``'s tokens, * given ``owner``'s signed approval. * * IMPORTANT: The same issues {IERC20-approve} has related to transaction * ordering also apply here. * * Emits an {Approval} event. * * Requirements: * * - `spender` cannot be the zero address. * - `deadline` must be a timestamp in the future. * - `v`, `r` and `s` must be a valid `secp256k1` signature from `owner` * over the EIP712-formatted function arguments. * - the signature must use ``owner``'s current nonce (see {nonces}). * * For more information on the signature format, see the * https://eips.ethereum.org/EIPS/eip-2612#specification[relevant EIP * section]. */ function permit( address owner, address spender, uint256 value, uint256 deadline, uint8 v, bytes32 r, bytes32 s ) external; /** * @dev Returns the current nonce for `owner`. This value must be * included whenever a signature is generated for {permit}. * * Every successful call to {permit} increases ``owner``'s nonce by one. This * prevents a signature from being used multiple times. */ function nonces(address owner) external view returns (uint256); /** * @dev Returns the domain separator used in the encoding of the signature for {permit}, as defined by {EIP712}. */ // solhint-disable-next-line func-name-mixedcase function DOMAIN_SEPARATOR() external view returns (bytes32); } // File @openzeppelin/contracts/token/ERC20/extensions/[email protected] // Original license: SPDX_License_Identifier: MIT // OpenZeppelin Contracts (last updated v4.9.0) (token/ERC20/extensions/draft-IERC20Permit.sol) // EIP-2612 is Final as of 2022-11-01. This file is deprecated. // File @openzeppelin/contracts/token/ERC20/[email protected] // Original license: SPDX_License_Identifier: MIT // OpenZeppelin Contracts (last updated v4.9.0) (token/ERC20/IERC20.sol) /** * @dev Interface of the ERC20 standard as defined in the EIP. */ interface IERC20 { /** * @dev Emitted when `value` tokens are moved from one account (`from`) to * another (`to`). * * Note that `value` may be zero. */ event Transfer(address indexed from, address indexed to, uint256 value); /** * @dev Emitted when the allowance of a `spender` for an `owner` is set by * a call to {approve}. `value` is the new allowance. */ event Approval(address indexed owner, address indexed spender, uint256 value); /** * @dev Returns the amount of tokens in existence. */ function totalSupply() external view returns (uint256); /** * @dev Returns the amount of tokens owned by `account`. */ function balanceOf(address account) external view returns (uint256); /** * @dev Moves `amount` tokens from the caller's account to `to`. * * Returns a boolean value indicating whether the operation succeeded. * * Emits a {Transfer} event. */ function transfer(address to, uint256 amount) external returns (bool); /** * @dev Returns the remaining number of tokens that `spender` will be * allowed to spend on behalf of `owner` through {transferFrom}. This is * zero by default. * * This value changes when {approve} or {transferFrom} are called. */ function allowance(address owner, address spender) external view returns (uint256); /** * @dev Sets `amount` as the allowance of `spender` over the caller's tokens. * * Returns a boolean value indicating whether the operation succeeded. * * IMPORTANT: Beware that changing an allowance with this method brings the risk * that someone may use both the old and the new allowance by unfortunate * transaction ordering. One possible solution to mitigate this race * condition is to first reduce the spender's allowance to 0 and set the * desired value afterwards: * https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729 * * Emits an {Approval} event. */ function approve(address spender, uint256 amount) external returns (bool); /** * @dev Moves `amount` tokens from `from` to `to` using the * allowance mechanism. `amount` is then deducted from the caller's * allowance. * * Returns a boolean value indicating whether the operation succeeded. * * Emits a {Transfer} event. */ function transferFrom(address from, address to, uint256 amount) external returns (bool); } // File @uniswap/v3-periphery/contracts/libraries/[email protected] // Original license: SPDX_License_Identifier: GPL-2.0-or-later library TransferHelper { /// @notice Transfers tokens from the targeted address to the given destination /// @notice Errors with 'STF' if transfer fails /// @param token The contract address of the token to be transferred /// @param from The originating address from which the tokens will be transferred /// @param to The destination address of the transfer /// @param value The amount to be transferred function safeTransferFrom( address token, address from, address to, uint256 value ) internal { (bool success, bytes memory data) = token.call(abi.encodeWithSelector(IERC20.transferFrom.selector, from, to, value)); require(success && (data.length == 0 || abi.decode(data, (bool))), 'STF'); } /// @notice Transfers tokens from msg.sender to a recipient /// @dev Errors with ST if transfer fails /// @param token The contract address of the token which will be transferred /// @param to The recipient of the transfer /// @param value The value of the transfer function safeTransfer( address token, address to, uint256 value ) internal { (bool success, bytes memory data) = token.call(abi.encodeWithSelector(IERC20.transfer.selector, to, value)); require(success && (data.length == 0 || abi.decode(data, (bool))), 'ST'); } /// @notice Approves the stipulated contract to spend the given allowance in the given token /// @dev Errors with 'SA' if transfer fails /// @param token The contract address of the token to be approved /// @param to The target of the approval /// @param value The amount of the given token the target will be allowed to spend function safeApprove( address token, address to, uint256 value ) internal { (bool success, bytes memory data) = token.call(abi.encodeWithSelector(IERC20.approve.selector, to, value)); require(success && (data.length == 0 || abi.decode(data, (bool))), 'SA'); } /// @notice Transfers ETH to the recipient address /// @dev Fails with `STE` /// @param to The destination of the transfer /// @param value The value to be transferred function safeTransferETH(address to, uint256 value) internal { (bool success, ) = to.call{value: value}(new bytes(0)); require(success, 'STE'); } } // File @openzeppelin/contracts/utils/math/[email protected] // Original license: SPDX_License_Identifier: MIT // OpenZeppelin Contracts (last updated v4.9.0) (utils/math/Math.sol) /** * @dev Standard math utilities missing in the Solidity language. */ library Math { enum Rounding { Down, // Toward negative infinity Up, // Toward infinity Zero // Toward zero } /** * @dev Returns the largest of two numbers. */ function max(uint256 a, uint256 b) internal pure returns (uint256) { return a > b ? a : b; } /** * @dev Returns the smallest of two numbers. */ function min(uint256 a, uint256 b) internal pure returns (uint256) { return a < b ? a : b; } /** * @dev Returns the average of two numbers. The result is rounded towards * zero. */ function average(uint256 a, uint256 b) internal pure returns (uint256) { // (a + b) / 2 can overflow. return (a & b) + (a ^ b) / 2; } /** * @dev Returns the ceiling of the division of two numbers. * * This differs from standard division with `/` in that it rounds up instead * of rounding down. */ function ceilDiv(uint256 a, uint256 b) internal pure returns (uint256) { // (a + b - 1) / b can overflow on addition, so we distribute. return a == 0 ? 0 : (a - 1) / b + 1; } /** * @notice Calculates floor(x * y / denominator) with full precision. Throws if result overflows a uint256 or denominator == 0 * @dev Original credit to Remco Bloemen under MIT license (https://xn--2-umb.com/21/muldiv) * with further edits by Uniswap Labs also under MIT license. */ function mulDiv(uint256 x, uint256 y, uint256 denominator) internal pure returns (uint256 result) { unchecked { // 512-bit multiply [prod1 prod0] = x * y. Compute the product mod 2^256 and mod 2^256 - 1, then use // use the Chinese Remainder Theorem to reconstruct the 512 bit result. The result is stored in two 256 // variables such that product = prod1 * 2^256 + prod0. uint256 prod0; // Least significant 256 bits of the product uint256 prod1; // Most significant 256 bits of the product assembly { let mm := mulmod(x, y, not(0)) prod0 := mul(x, y) prod1 := sub(sub(mm, prod0), lt(mm, prod0)) } // Handle non-overflow cases, 256 by 256 division. if (prod1 == 0) { // Solidity will revert if denominator == 0, unlike the div opcode on its own. // The surrounding unchecked block does not change this fact. // See https://docs.soliditylang.org/en/latest/control-structures.html#checked-or-unchecked-arithmetic. return prod0 / denominator; } // Make sure the result is less than 2^256. Also prevents denominator == 0. require(denominator > prod1, "Math: mulDiv overflow"); /////////////////////////////////////////////// // 512 by 256 division. /////////////////////////////////////////////// // Make division exact by subtracting the remainder from [prod1 prod0]. uint256 remainder; assembly { // Compute remainder using mulmod. remainder := mulmod(x, y, denominator) // Subtract 256 bit number from 512 bit number. prod1 := sub(prod1, gt(remainder, prod0)) prod0 := sub(prod0, remainder) } // Factor powers of two out of denominator and compute largest power of two divisor of denominator. Always >= 1. // See https://cs.stackexchange.com/q/138556/92363. // Does not overflow because the denominator cannot be zero at this stage in the function. uint256 twos = denominator & (~denominator + 1); assembly { // Divide denominator by twos. denominator := div(denominator, twos) // Divide [prod1 prod0] by twos. prod0 := div(prod0, twos) // Flip twos such that it is 2^256 / twos. If twos is zero, then it becomes one. twos := add(div(sub(0, twos), twos), 1) } // Shift in bits from prod1 into prod0. prod0 |= prod1 * twos; // Invert denominator mod 2^256. Now that denominator is an odd number, it has an inverse modulo 2^256 such // that denominator * inv = 1 mod 2^256. Compute the inverse by starting with a seed that is correct for // four bits. That is, denominator * inv = 1 mod 2^4. uint256 inverse = (3 * denominator) ^ 2; // Use the Newton-Raphson iteration to improve the precision. Thanks to Hensel's lifting lemma, this also works // in modular arithmetic, doubling the correct bits in each step. inverse *= 2 - denominator * inverse; // inverse mod 2^8 inverse *= 2 - denominator * inverse; // inverse mod 2^16 inverse *= 2 - denominator * inverse; // inverse mod 2^32 inverse *= 2 - denominator * inverse; // inverse mod 2^64 inverse *= 2 - denominator * inverse; // inverse mod 2^128 inverse *= 2 - denominator * inverse; // inverse mod 2^256 // Because the division is now exact we can divide by multiplying with the modular inverse of denominator. // This will give us the correct result modulo 2^256. Since the preconditions guarantee that the outcome is // less than 2^256, this is the final result. We don't need to compute the high bits of the result and prod1 // is no longer required. result = prod0 * inverse; return result; } } /** * @notice Calculates x * y / denominator with full precision, following the selected rounding direction. */ function mulDiv(uint256 x, uint256 y, uint256 denominator, Rounding rounding) internal pure returns (uint256) { uint256 result = mulDiv(x, y, denominator); if (rounding == Rounding.Up && mulmod(x, y, denominator) > 0) { result += 1; } return result; } /** * @dev Returns the square root of a number. If the number is not a perfect square, the value is rounded down. * * Inspired by Henry S. Warren, Jr.'s "Hacker's Delight" (Chapter 11). */ function sqrt(uint256 a) internal pure returns (uint256) { if (a == 0) { return 0; } // For our first guess, we get the biggest power of 2 which is smaller than the square root of the target. // // We know that the "msb" (most significant bit) of our target number `a` is a power of 2 such that we have // `msb(a) <= a < 2*msb(a)`. This value can be written `msb(a)=2**k` with `k=log2(a)`. // // This can be rewritten `2**log2(a) <= a < 2**(log2(a) + 1)` // → `sqrt(2**k) <= sqrt(a) < sqrt(2**(k+1))` // → `2**(k/2) <= sqrt(a) < 2**((k+1)/2) <= 2**(k/2 + 1)` // // Consequently, `2**(log2(a) / 2)` is a good first approximation of `sqrt(a)` with at least 1 correct bit. uint256 result = 1 << (log2(a) >> 1); // At this point `result` is an estimation with one bit of precision. We know the true value is a uint128, // since it is the square root of a uint256. Newton's method converges quadratically (precision doubles at // every iteration). We thus need at most 7 iteration to turn our partial result with one bit of precision // into the expected uint128 result. unchecked { result = (result + a / result) >> 1; result = (result + a / result) >> 1; result = (result + a / result) >> 1; result = (result + a / result) >> 1; result = (result + a / result) >> 1; result = (result + a / result) >> 1; result = (result + a / result) >> 1; return min(result, a / result); } } /** * @notice Calculates sqrt(a), following the selected rounding direction. */ function sqrt(uint256 a, Rounding rounding) internal pure returns (uint256) { unchecked { uint256 result = sqrt(a); return result + (rounding == Rounding.Up && result * result < a ? 1 : 0); } } /** * @dev Return the log in base 2, rounded down, of a positive value. * Returns 0 if given 0. */ function log2(uint256 value) internal pure returns (uint256) { uint256 result = 0; unchecked { if (value >> 128 > 0) { value >>= 128; result += 128; } if (value >> 64 > 0) { value >>= 64; result += 64; } if (value >> 32 > 0) { value >>= 32; result += 32; } if (value >> 16 > 0) { value >>= 16; result += 16; } if (value >> 8 > 0) { value >>= 8; result += 8; } if (value >> 4 > 0) { value >>= 4; result += 4; } if (value >> 2 > 0) { value >>= 2; result += 2; } if (value >> 1 > 0) { result += 1; } } return result; } /** * @dev Return the log in base 2, following the selected rounding direction, of a positive value. * Returns 0 if given 0. */ function log2(uint256 value, Rounding rounding) internal pure returns (uint256) { unchecked { uint256 result = log2(value); return result + (rounding == Rounding.Up && 1 << result < value ? 1 : 0); } } /** * @dev Return the log in base 10, rounded down, of a positive value. * Returns 0 if given 0. */ function log10(uint256 value) internal pure returns (uint256) { uint256 result = 0; unchecked { if (value >= 10 ** 64) { value /= 10 ** 64; result += 64; } if (value >= 10 ** 32) { value /= 10 ** 32; result += 32; } if (value >= 10 ** 16) { value /= 10 ** 16; result += 16; } if (value >= 10 ** 8) { value /= 10 ** 8; result += 8; } if (value >= 10 ** 4) { value /= 10 ** 4; result += 4; } if (value >= 10 ** 2) { value /= 10 ** 2; result += 2; } if (value >= 10 ** 1) { result += 1; } } return result; } /** * @dev Return the log in base 10, following the selected rounding direction, of a positive value. * Returns 0 if given 0. */ function log10(uint256 value, Rounding rounding) internal pure returns (uint256) { unchecked { uint256 result = log10(value); return result + (rounding == Rounding.Up && 10 ** result < value ? 1 : 0); } } /** * @dev Return the log in base 256, rounded down, of a positive value. * Returns 0 if given 0. * * Adding one to the result gives the number of pairs of hex symbols needed to represent `value` as a hex string. */ function log256(uint256 value) internal pure returns (uint256) { uint256 result = 0; unchecked { if (value >> 128 > 0) { value >>= 128; result += 16; } if (value >> 64 > 0) { value >>= 64; result += 8; } if (value >> 32 > 0) { value >>= 32; result += 4; } if (value >> 16 > 0) { value >>= 16; result += 2; } if (value >> 8 > 0) { result += 1; } } return result; } /** * @dev Return the log in base 256, following the selected rounding direction, of a positive value. * Returns 0 if given 0. */ function log256(uint256 value, Rounding rounding) internal pure returns (uint256) { unchecked { uint256 result = log256(value); return result + (rounding == Rounding.Up && 1 << (result << 3) < value ? 1 : 0); } } } // File contracts/Fraxferry/Fraxferry.sol // ==================================================================== // | ______ _______ | // | / _____________ __ __ / ____(_____ ____ _____ ________ | // | / /_ / ___/ __ `| |/_/ / /_ / / __ \/ __ `/ __ \/ ___/ _ \ | // | / __/ / / / /_/ _> < / __/ / / / / / /_/ / / / / /__/ __/ | // | /_/ /_/ \__,_/_/|_| /_/ /_/_/ /_/\__,_/_/ /_/\___/\___/ | // | | // ==================================================================== // ============================ Fraxferry ============================= // ==================================================================== // Ferry that can be used to ship tokens between chains // Frax Finance: https://github.com/FraxFinance // Primary Author(s) // Dennis: https://github.com/denett /* ** Modus operandi: ** - User sends tokens to the contract. This transaction is stored in the contract. ** - Captain queries the source chain for transactions to ship. ** - Captain sends batch (start, end, hash) to start the trip, ** - Crewmembers check the batch and can dispute it if it is invalid. ** - Non disputed batches can be executed by the first officer by providing the transactions as calldata. ** - Hash of the transactions must be equal to the hash in the batch. User receives their tokens on the other chain. ** - In case there was a fraudulent transaction (a hacker for example), the owner can cancel a single transaction, such that it will not be executed. ** - The owner can manually manage the tokens in the contract and must make sure it has enough funds. ** ** What must happen for a false batch to be executed: ** - Captain is tricked into proposing a batch with a false hash ** - All crewmembers bots are offline/censured/compromised and no one disputes the proposal ** ** Other risks: ** - Reorgs on the source chain. Avoided, by only returning the transactions on the source chain that are at least one hour old. ** - Rollbacks of optimistic rollups. Avoided by running a node. ** - Operators do not have enough time to pause the chain after a fake proposal. Avoided by requiring a minimal amount of time between sending the proposal and executing it. */ contract Fraxferry { IERC20 immutable public token; IERC20 immutable public targetToken; uint immutable public chainid; uint immutable public targetChain; address public owner; address public nominatedOwner; address public captain; address public firstOfficer; mapping(address => bool) public crewmembers; mapping(address => bool) public fee_exempt_addrs; bool public paused; uint public MIN_WAIT_PERIOD_ADD=3600; // Minimal 1 hour waiting uint public MIN_WAIT_PERIOD_EXECUTE=79200; // Minimal 22 hour waiting uint public FEE_RATE=10; // 0.1% fee uint public FEE_MIN=5*1e18; // 5 token min fee uint public FEE_MAX=100*1e18; // 100 token max fee uint constant MAX_FEE_RATE=100; // Max fee rate is 1% uint constant MAX_FEE_MIN=100e18; // Max minimum fee is 100 tokens uint constant MAX_FEE_MAX=1000e18; // Max fee is 1000 tokens uint constant public REDUCED_DECIMALS=1e10; Transaction[] public transactions; mapping(uint => bool) public cancelled; uint public executeIndex; Batch[] public batches; struct Transaction { address user; uint64 amount; uint32 timestamp; } struct Batch { uint64 start; uint64 end; uint64 departureTime; uint64 status; bytes32 hash; } struct BatchData { uint startTransactionNo; Transaction[] transactions; } constructor(address _token, uint _chainid, address _targetToken, uint _targetChain) { //require (block.chainid==_chainid,"Wrong chain"); chainid=_chainid; token = IERC20(_token); targetToken = IERC20(_targetToken); owner = msg.sender; targetChain = _targetChain; } // ############## Events ############## event Embark(address indexed sender, uint index, uint amount, uint amountAfterFee, uint timestamp); event Disembark(uint start, uint end, bytes32 hash); event Depart(uint batchNo,uint start,uint end,bytes32 hash); event RemoveBatch(uint batchNo); event DisputeBatch(uint batchNo, bytes32 hash); event Cancelled(uint index, bool cancel); event Pause(bool paused); event OwnerNominated(address indexed newOwner); event OwnerChanged(address indexed previousOwner,address indexed newOwner); event SetCaptain(address indexed previousCaptain, address indexed newCaptain); event SetFirstOfficer(address indexed previousFirstOfficer, address indexed newFirstOfficer); event SetCrewmember(address indexed crewmember,bool set); event SetFee(uint previousFeeRate, uint feeRate,uint previousFeeMin, uint feeMin,uint previousFeeMax, uint feeMax); event SetMinWaitPeriods(uint previousMinWaitAdd,uint previousMinWaitExecute,uint minWaitAdd,uint minWaitExecute); event FeeExemptToggled(address addr,bool is_fee_exempt); // ############## Modifiers ############## modifier isOwner() { require (msg.sender==owner,"Not owner"); _; } modifier isCaptain() { require (msg.sender==captain,"Not captain"); _; } modifier isFirstOfficer() { require (msg.sender==firstOfficer,"Not first officer"); _; } modifier isCrewmember() { require (crewmembers[msg.sender] || msg.sender==owner || msg.sender==captain || msg.sender==firstOfficer,"Not crewmember"); _; } modifier notPaused() { require (!paused,"Paused"); _; } // ############## Ferry actions ############## function embarkWithRecipient(uint amount, address recipient) public notPaused { amount = (amount/REDUCED_DECIMALS)*REDUCED_DECIMALS; // Round amount to fit in data structure uint fee; if(fee_exempt_addrs[msg.sender]) fee = 0; else { fee = Math.min(Math.max(FEE_MIN,amount*FEE_RATE/10000),FEE_MAX); } require (amount>fee,"Amount too low"); require (amount/REDUCED_DECIMALS<=type(uint64).max,"Amount too high"); TransferHelper.safeTransferFrom(address(token),msg.sender,address(this),amount); uint64 amountAfterFee = uint64((amount-fee)/REDUCED_DECIMALS); emit Embark(recipient,transactions.length,amount,amountAfterFee*REDUCED_DECIMALS,block.timestamp); transactions.push(Transaction(recipient,amountAfterFee,uint32(block.timestamp))); } function embark(uint amount) public { embarkWithRecipient(amount, msg.sender) ; } function embarkWithSignature( uint256 _amount, address recipient, uint256 deadline, bool approveMax, uint8 v, bytes32 r, bytes32 s ) public { uint amount = approveMax ? type(uint256).max : _amount; IERC20Permit(address(token)).permit(msg.sender, address(this), amount, deadline, v, r, s); embarkWithRecipient(amount,recipient); } function depart(uint start, uint end, bytes32 hash) external notPaused isCaptain { require ((batches.length==0 && start==0) || (batches.length>0 && start==batches[batches.length-1].end+1),"Wrong start"); require (end>=start && end<type(uint64).max,"Wrong end"); batches.push(Batch(uint64(start),uint64(end),uint64(block.timestamp),0,hash)); emit Depart(batches.length-1,start,end,hash); } function disembark(BatchData calldata batchData) external notPaused isFirstOfficer { Batch memory batch = batches[executeIndex++]; require (batch.status==0,"Batch disputed"); require (batch.start==batchData.startTransactionNo,"Wrong start"); require (batch.start+batchData.transactions.length-1==batch.end,"Wrong size"); require (block.timestamp-batch.departureTime>=MIN_WAIT_PERIOD_EXECUTE,"Too soon"); bytes32 hash = keccak256(abi.encodePacked(targetChain, targetToken, chainid, token, batch.start)); for (uint i=0;i<batchData.transactions.length;++i) { if (!cancelled[batch.start+i]) { TransferHelper.safeTransfer(address(token),batchData.transactions[i].user,batchData.transactions[i].amount*REDUCED_DECIMALS); } hash = keccak256(abi.encodePacked(hash, batchData.transactions[i].user,batchData.transactions[i].amount)); } require (batch.hash==hash,"Wrong hash"); emit Disembark(batch.start,batch.end,hash); } function removeBatches(uint batchNo) external isOwner { require (executeIndex<=batchNo,"Batch already executed"); while (batches.length>batchNo) batches.pop(); emit RemoveBatch(batchNo); } function disputeBatch(uint batchNo, bytes32 hash) external isCrewmember { require (batches[batchNo].hash==hash,"Wrong hash"); require (executeIndex<=batchNo,"Batch already executed"); require (batches[batchNo].status==0,"Batch already disputed"); batches[batchNo].status=1; // Set status on disputed _pause(true); emit DisputeBatch(batchNo,hash); } function pause() external isCrewmember { _pause(true); } function unPause() external isOwner { _pause(false); } function _pause(bool _paused) internal { paused=_paused; emit Pause(_paused); } function _jettison(uint index, bool cancel) internal { require (executeIndex==0 || index>batches[executeIndex-1].end,"Transaction already executed"); cancelled[index]=cancel; emit Cancelled(index,cancel); } function jettison(uint index, bool cancel) external isOwner { _jettison(index,cancel); } function jettisonGroup(uint[] calldata indexes, bool cancel) external isOwner { for (uint i=0;i<indexes.length;++i) { _jettison(indexes[i],cancel); } } // ############## Parameters management ############## function setFee(uint _FEE_RATE, uint _FEE_MIN, uint _FEE_MAX) external isOwner { require(_FEE_RATE<MAX_FEE_RATE); require(_FEE_MIN<MAX_FEE_MIN); require(_FEE_MAX<MAX_FEE_MAX); emit SetFee(FEE_RATE,_FEE_RATE,FEE_MIN,_FEE_MIN,FEE_MAX,_FEE_MAX); FEE_RATE=_FEE_RATE; FEE_MIN=_FEE_MIN; FEE_MAX=_FEE_MAX; } function setMinWaitPeriods(uint _MIN_WAIT_PERIOD_ADD, uint _MIN_WAIT_PERIOD_EXECUTE) external isOwner { require(_MIN_WAIT_PERIOD_ADD>=3600 && _MIN_WAIT_PERIOD_EXECUTE>=3600,"Period too short"); emit SetMinWaitPeriods(MIN_WAIT_PERIOD_ADD, MIN_WAIT_PERIOD_EXECUTE,_MIN_WAIT_PERIOD_ADD, _MIN_WAIT_PERIOD_EXECUTE); MIN_WAIT_PERIOD_ADD=_MIN_WAIT_PERIOD_ADD; MIN_WAIT_PERIOD_EXECUTE=_MIN_WAIT_PERIOD_EXECUTE; } // ############## Roles management ############## function nominateNewOwner(address newOwner) external isOwner { nominatedOwner = newOwner; emit OwnerNominated(newOwner); } function acceptOwnership() external { require(msg.sender == nominatedOwner, "You must be nominated before you can accept ownership"); emit OwnerChanged(owner, nominatedOwner); owner = nominatedOwner; nominatedOwner = address(0); } function setCaptain(address newCaptain) external isOwner { emit SetCaptain(captain,newCaptain); captain=newCaptain; } function setFirstOfficer(address newFirstOfficer) external isOwner { emit SetFirstOfficer(firstOfficer,newFirstOfficer); firstOfficer=newFirstOfficer; } function setCrewmember(address crewmember, bool set) external isOwner { crewmembers[crewmember]=set; emit SetCrewmember(crewmember,set); } function toggleFeeExemptAddr(address addr) external isOwner { fee_exempt_addrs[addr] = !fee_exempt_addrs[addr]; emit FeeExemptToggled(addr,fee_exempt_addrs[addr]); } // ############## Token management ############## function sendTokens(address receiver, uint amount) external isOwner { require (receiver!=address(0),"Zero address not allowed"); TransferHelper.safeTransfer(address(token),receiver,amount); } // Generic proxy function execute(address _to, uint256 _value, bytes calldata _data) external isOwner returns (bool, bytes memory) { require(_data.length==0 || _to.code.length>0,"Can not call a function on a EOA"); (bool success, bytes memory result) = _to.call{value:_value}(_data); return (success, result); } // ############## Views ############## function getNextBatch(uint _start, uint max) public view returns (uint start, uint end, bytes32 hash) { uint cutoffTime = block.timestamp-MIN_WAIT_PERIOD_ADD; if (_start<transactions.length && transactions[_start].timestamp<cutoffTime) { start=_start; end=start+max-1; if (end>=transactions.length) end=transactions.length-1; while(transactions[end].timestamp>=cutoffTime) end--; hash = getTransactionsHash(start,end); } } function getBatchData(uint start, uint end) public view returns (BatchData memory data) { data.startTransactionNo = start; data.transactions = new Transaction[](end-start+1); for (uint i=start;i<=end;++i) { data.transactions[i-start]=transactions[i]; } } function getBatchAmount(uint start, uint end) public view returns (uint totalAmount) { for (uint i=start;i<=end;++i) { totalAmount+=transactions[i].amount; } totalAmount*=REDUCED_DECIMALS; } function getTransactionsHash(uint start, uint end) public view returns (bytes32) { bytes32 result = keccak256(abi.encodePacked(chainid, token, targetChain, targetToken, uint64(start))); for (uint i=start;i<=end;++i) { result = keccak256(abi.encodePacked(result, transactions[i].user,transactions[i].amount)); } return result; } function noTransactions() public view returns (uint) { return transactions.length; } function noBatches() public view returns (uint) { return batches.length; } }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"inputs":[{"internalType":"address","name":"_token","type":"address"},{"internalType":"uint256","name":"_chainid","type":"uint256"},{"internalType":"address","name":"_targetToken","type":"address"},{"internalType":"uint256","name":"_targetChain","type":"uint256"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"index","type":"uint256"},{"indexed":false,"internalType":"bool","name":"cancel","type":"bool"}],"name":"Cancelled","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"batchNo","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"start","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"end","type":"uint256"},{"indexed":false,"internalType":"bytes32","name":"hash","type":"bytes32"}],"name":"Depart","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"start","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"end","type":"uint256"},{"indexed":false,"internalType":"bytes32","name":"hash","type":"bytes32"}],"name":"Disembark","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"batchNo","type":"uint256"},{"indexed":false,"internalType":"bytes32","name":"hash","type":"bytes32"}],"name":"DisputeBatch","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"sender","type":"address"},{"indexed":false,"internalType":"uint256","name":"index","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"amountAfterFee","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"timestamp","type":"uint256"}],"name":"Embark","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"addr","type":"address"},{"indexed":false,"internalType":"bool","name":"is_fee_exempt","type":"bool"}],"name":"FeeExemptToggled","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnerChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnerNominated","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"bool","name":"paused","type":"bool"}],"name":"Pause","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"batchNo","type":"uint256"}],"name":"RemoveBatch","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousCaptain","type":"address"},{"indexed":true,"internalType":"address","name":"newCaptain","type":"address"}],"name":"SetCaptain","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"crewmember","type":"address"},{"indexed":false,"internalType":"bool","name":"set","type":"bool"}],"name":"SetCrewmember","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"previousFeeRate","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"feeRate","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"previousFeeMin","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"feeMin","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"previousFeeMax","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"feeMax","type":"uint256"}],"name":"SetFee","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousFirstOfficer","type":"address"},{"indexed":true,"internalType":"address","name":"newFirstOfficer","type":"address"}],"name":"SetFirstOfficer","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"previousMinWaitAdd","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"previousMinWaitExecute","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"minWaitAdd","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"minWaitExecute","type":"uint256"}],"name":"SetMinWaitPeriods","type":"event"},{"inputs":[],"name":"FEE_MAX","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"FEE_MIN","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"FEE_RATE","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MIN_WAIT_PERIOD_ADD","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MIN_WAIT_PERIOD_EXECUTE","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"REDUCED_DECIMALS","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"acceptOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"batches","outputs":[{"internalType":"uint64","name":"start","type":"uint64"},{"internalType":"uint64","name":"end","type":"uint64"},{"internalType":"uint64","name":"departureTime","type":"uint64"},{"internalType":"uint64","name":"status","type":"uint64"},{"internalType":"bytes32","name":"hash","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"cancelled","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"captain","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"chainid","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"crewmembers","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"start","type":"uint256"},{"internalType":"uint256","name":"end","type":"uint256"},{"internalType":"bytes32","name":"hash","type":"bytes32"}],"name":"depart","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"components":[{"internalType":"uint256","name":"startTransactionNo","type":"uint256"},{"components":[{"internalType":"address","name":"user","type":"address"},{"internalType":"uint64","name":"amount","type":"uint64"},{"internalType":"uint32","name":"timestamp","type":"uint32"}],"internalType":"struct Fraxferry.Transaction[]","name":"transactions","type":"tuple[]"}],"internalType":"struct Fraxferry.BatchData","name":"batchData","type":"tuple"}],"name":"disembark","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"batchNo","type":"uint256"},{"internalType":"bytes32","name":"hash","type":"bytes32"}],"name":"disputeBatch","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"embark","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"address","name":"recipient","type":"address"}],"name":"embarkWithRecipient","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_amount","type":"uint256"},{"internalType":"address","name":"recipient","type":"address"},{"internalType":"uint256","name":"deadline","type":"uint256"},{"internalType":"bool","name":"approveMax","type":"bool"},{"internalType":"uint8","name":"v","type":"uint8"},{"internalType":"bytes32","name":"r","type":"bytes32"},{"internalType":"bytes32","name":"s","type":"bytes32"}],"name":"embarkWithSignature","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_to","type":"address"},{"internalType":"uint256","name":"_value","type":"uint256"},{"internalType":"bytes","name":"_data","type":"bytes"}],"name":"execute","outputs":[{"internalType":"bool","name":"","type":"bool"},{"internalType":"bytes","name":"","type":"bytes"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"executeIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"fee_exempt_addrs","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"firstOfficer","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"start","type":"uint256"},{"internalType":"uint256","name":"end","type":"uint256"}],"name":"getBatchAmount","outputs":[{"internalType":"uint256","name":"totalAmount","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"start","type":"uint256"},{"internalType":"uint256","name":"end","type":"uint256"}],"name":"getBatchData","outputs":[{"components":[{"internalType":"uint256","name":"startTransactionNo","type":"uint256"},{"components":[{"internalType":"address","name":"user","type":"address"},{"internalType":"uint64","name":"amount","type":"uint64"},{"internalType":"uint32","name":"timestamp","type":"uint32"}],"internalType":"struct Fraxferry.Transaction[]","name":"transactions","type":"tuple[]"}],"internalType":"struct Fraxferry.BatchData","name":"data","type":"tuple"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_start","type":"uint256"},{"internalType":"uint256","name":"max","type":"uint256"}],"name":"getNextBatch","outputs":[{"internalType":"uint256","name":"start","type":"uint256"},{"internalType":"uint256","name":"end","type":"uint256"},{"internalType":"bytes32","name":"hash","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"start","type":"uint256"},{"internalType":"uint256","name":"end","type":"uint256"}],"name":"getTransactionsHash","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"index","type":"uint256"},{"internalType":"bool","name":"cancel","type":"bool"}],"name":"jettison","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256[]","name":"indexes","type":"uint256[]"},{"internalType":"bool","name":"cancel","type":"bool"}],"name":"jettisonGroup","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"noBatches","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"noTransactions","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"nominateNewOwner","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"nominatedOwner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"pause","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"paused","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"batchNo","type":"uint256"}],"name":"removeBatches","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"receiver","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"sendTokens","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newCaptain","type":"address"}],"name":"setCaptain","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"crewmember","type":"address"},{"internalType":"bool","name":"set","type":"bool"}],"name":"setCrewmember","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_FEE_RATE","type":"uint256"},{"internalType":"uint256","name":"_FEE_MIN","type":"uint256"},{"internalType":"uint256","name":"_FEE_MAX","type":"uint256"}],"name":"setFee","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newFirstOfficer","type":"address"}],"name":"setFirstOfficer","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_MIN_WAIT_PERIOD_ADD","type":"uint256"},{"internalType":"uint256","name":"_MIN_WAIT_PERIOD_EXECUTE","type":"uint256"}],"name":"setMinWaitPeriods","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"targetChain","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"targetToken","outputs":[{"internalType":"contract IERC20","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"addr","type":"address"}],"name":"toggleFeeExemptAddr","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"token","outputs":[{"internalType":"contract IERC20","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"transactions","outputs":[{"internalType":"address","name":"user","type":"address"},{"internalType":"uint64","name":"amount","type":"uint64"},{"internalType":"uint32","name":"timestamp","type":"uint32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"unPause","outputs":[],"stateMutability":"nonpayable","type":"function"}]
Contract Creation Code
610100604052610e1060075562013560600855600a600955674563918244f40000600a5568056bc75e2d63100000600b553480156200003d57600080fd5b5060405162003eb938038062003eb98339810160408190526200006091620000b2565b60c0929092526001600160a01b0392831660805290911660a052600080546001600160a01b0319163317905560e052620000fb565b80516001600160a01b0381168114620000ad57600080fd5b919050565b60008060008060808587031215620000c957600080fd5b620000d48562000095565b935060208501519250620000eb6040860162000095565b6060959095015193969295505050565b60805160a05160c05160e051613d3062000189600039600081816105350152818161137c0152611bd30152600081816106ce015281816113c00152611b5c0152600081816103c30152818161139e0152611bf90152600081816107b1015281816108ee01528181610ae5015281816113e2015281816114e201528181611ba701526128d80152613d306000f3fe608060405234801561001057600080fd5b50600436106103205760003560e01c80638456cb59116101a7578063c2f6afe5116100ee578063e050be5711610097578063f7b188a511610071578063f7b188a5146107a4578063fc0c546a146107ac578063fd433ec0146107d357600080fd5b8063e050be571461074e578063f40e349f14610771578063f55ebb8f1461078457600080fd5b8063d2c1626c116100c8578063d2c1626c146106f8578063d9fb265d1461070b578063de7974a41461072e57600080fd5b8063c2f6afe5146106b6578063cd84980e146106c9578063cdbdfdc2146106f057600080fd5b80639b8c624a11610150578063b61325cd1161012a578063b61325cd14610683578063b61d27f61461068c578063c2624e1e146106ad57600080fd5b80639b8c624a1461060e578063a3a6d9e814610621578063b32c4d8d1461063457600080fd5b80638e714a72116101815780638e714a7214610587578063907c6c2e1461059a5780639ace38c2146105ba57600080fd5b80638456cb59146105575780638b928bd31461055f5780638da5cb5b1461056757600080fd5b80633beaf5261161026b5780635c975abb1161021457806366e64f97116101ee57806366e64f971461051c57806379ba5097146105285780638304e6d21461053057600080fd5b80635c975abb146104c95780635f62fa6f146104e6578063652dfc3b1461050957600080fd5b806353a47bb71161024557806353a47bb71461048d57806359c13403146104ad5780635b65b9ab146104b657600080fd5b80633beaf526146104395780634a474aa31461044c578063525862f91461045f57600080fd5b8063165282c3116102cd57806333032dd0116102a757806333032dd01461040a57806333efa2b21461041357806336f734c11461042657600080fd5b8063165282c3146103a25780632d11c58a146103b5578063327107f7146103be57600080fd5b806307cca166116102fe57806307cca16614610369578063081c46241461037c5780631627540c1461038f57600080fd5b8063024faa8c1461032557806305ab421d1461034157806305c211d214610356575b600080fd5b61032e60085481565b6040519081526020015b60405180910390f35b61035461034f366004613642565b6107e6565b005b61035461036436600461366c565b610918565b6103546103773660046136a6565b610cb7565b61035461038a3660046136dd565b610dc2565b61035461039d366004613702565b610e4d565b61032e6103b036600461371d565b610f3d565b61032e60095481565b6103e57f000000000000000000000000000000000000000000000000000000000000000081565b60405173ffffffffffffffffffffffffffffffffffffffff9091168152602001610338565b61032e60075481565b61035461042136600461373f565b610fbc565b61035461043436600461377a565b611769565b61032e61044736600461371d565b611b56565b61035461045a3660046137a6565b611d7e565b61047261046d36600461371d565b611efe565b60408051938452602084019290925290820152606001610338565b6001546103e59073ffffffffffffffffffffffffffffffffffffffff1681565b61032e600a5481565b6103546104c436600461377a565b612017565b6006546104d69060ff1681565b6040519015158152602001610338565b6104d66104f4366004613702565b60056020526000908152604090205460ff1681565b6103546105173660046137bf565b61213a565b61032e6402540be40081565b6103546121f6565b61032e7f000000000000000000000000000000000000000000000000000000000000000081565b610354612333565b600f5461032e565b6000546103e59073ffffffffffffffffffffffffffffffffffffffff1681565b610354610595366004613702565b61241e565b6105ad6105a836600461371d565b61252d565b6040516103389190613845565b6105cd6105c83660046137a6565b6126bd565b6040805173ffffffffffffffffffffffffffffffffffffffff909416845267ffffffffffffffff909216602084015263ffffffff1690820152606001610338565b61035461061c366004613702565b61273e565b61035461062f3660046138dd565b61284d565b6106476106423660046137a6565b61295d565b6040805167ffffffffffffffff96871681529486166020860152928516928401929092529092166060820152608081019190915260a001610338565b61032e600e5481565b61069f61069a366004613952565b6129dd565b6040516103389291906139fd565b61032e600b5481565b6103546106c436600461371d565b612b69565b61032e7f000000000000000000000000000000000000000000000000000000000000000081565b600c5461032e565b610354610706366004613702565b612cbd565b6104d6610719366004613702565b60046020526000908152604090205460ff1681565b6003546103e59073ffffffffffffffffffffffffffffffffffffffff1681565b6104d661075c3660046137a6565b600d6020526000908152604090205460ff1681565b61035461077f36600461371d565b612dcc565b6002546103e59073ffffffffffffffffffffffffffffffffffffffff1681565b6103546130e9565b6103e57f000000000000000000000000000000000000000000000000000000000000000081565b6103546107e13660046137a6565b613174565b60005473ffffffffffffffffffffffffffffffffffffffff16331461086c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600960248201527f4e6f74206f776e6572000000000000000000000000000000000000000000000060448201526064015b60405180910390fd5b73ffffffffffffffffffffffffffffffffffffffff82166108e9576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601860248201527f5a65726f2061646472657373206e6f7420616c6c6f77656400000000000000006044820152606401610863565b6109147f00000000000000000000000000000000000000000000000000000000000000008383613181565b5050565b60065460ff1615610985576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600660248201527f50617573656400000000000000000000000000000000000000000000000000006044820152606401610863565b6402540be4006109958184613a86565b61099f9190613ac1565b336000908152600560205260408120549193509060ff16156109c3575060006109f7565b6109f46109ec600a54612710600954876109dd9190613ac1565b6109e79190613a86565b6132f1565b600b54613307565b90505b808311610a60576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600e60248201527f416d6f756e7420746f6f206c6f770000000000000000000000000000000000006044820152606401610863565b67ffffffffffffffff610a786402540be40085613a86565b1115610ae0576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600f60248201527f416d6f756e7420746f6f206869676800000000000000000000000000000000006044820152606401610863565b610b0c7f0000000000000000000000000000000000000000000000000000000000000000333086613316565b60006402540be400610b1e8386613ad8565b610b289190613a86565b600c5490915073ffffffffffffffffffffffffffffffffffffffff8416907f0250c838bae2cda1e214f0925d41846180714450539039d6fd90a4121d98738e9086610b826402540be40067ffffffffffffffff8716613ac1565b6040805193845260208401929092529082015242606082015260800160405180910390a26040805160608101825273ffffffffffffffffffffffffffffffffffffffff948516815267ffffffffffffffff9283166020820190815263ffffffff428116938301938452600c805460018101825560009190915292517fdf6966c971051c3d54ec59162606531493a51404a002842f56009d7e5cf4a8c79093018054925194519091167c0100000000000000000000000000000000000000000000000000000000027bffffffffffffffffffffffffffffffffffffffffffffffffffffffff9490951674010000000000000000000000000000000000000000027fffffffff0000000000000000000000000000000000000000000000000000000090921692909616919091171716179091555050565b60005473ffffffffffffffffffffffffffffffffffffffff163314610d38576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600960248201527f4e6f74206f776e657200000000000000000000000000000000000000000000006044820152606401610863565b73ffffffffffffffffffffffffffffffffffffffff821660008181526004602090815260409182902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001685151590811790915591519182527f6a5f1fd939b33c2480886a44e0780806ce19041ef2c91734cb752c54288ca5ac910160405180910390a25050565b60005473ffffffffffffffffffffffffffffffffffffffff163314610e43576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600960248201527f4e6f74206f776e657200000000000000000000000000000000000000000000006044820152606401610863565b610914828261348f565b60005473ffffffffffffffffffffffffffffffffffffffff163314610ece576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600960248201527f4e6f74206f776e657200000000000000000000000000000000000000000000006044820152606401610863565b600180547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff83169081179091556040517f906a1c6bd7e3091ea86693dd029a831c19049ce77f1dce2ce0bab1cacbabce2290600090a250565b6000825b828111610fa557600c8181548110610f5b57610f5b613aeb565b600091825260209091200154610f939074010000000000000000000000000000000000000000900467ffffffffffffffff1683613b1a565b9150610f9e81613b2d565b9050610f41565b50610fb56402540be40082613ac1565b9392505050565b60065460ff1615611029576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600660248201527f50617573656400000000000000000000000000000000000000000000000000006044820152606401610863565b60035473ffffffffffffffffffffffffffffffffffffffff1633146110aa576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601160248201527f4e6f74206669727374206f6666696365720000000000000000000000000000006044820152606401610863565b600e8054600091600f9190836110bf83613b2d565b91905055815481106110d3576110d3613aeb565b60009182526020918290206040805160a0810182526002909302909101805467ffffffffffffffff8082168552680100000000000000008204811695850195909552700100000000000000000000000000000000810485169284019290925278010000000000000000000000000000000000000000000000009091049092166060820181905260019092015460808201529150156111cd576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600e60248201527f42617463682064697370757465640000000000000000000000000000000000006044820152606401610863565b805167ffffffffffffffff16823514611242576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600b60248201527f57726f6e672073746172740000000000000000000000000000000000000000006044820152606401610863565b806020015167ffffffffffffffff1660018380602001906112639190613b65565b8451611279925067ffffffffffffffff16613b1a565b6112839190613ad8565b146112ea576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600a60248201527f57726f6e672073697a65000000000000000000000000000000000000000000006044820152606401610863565b60085460408201516113069067ffffffffffffffff1642613ad8565b101561136e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600860248201527f546f6f20736f6f6e0000000000000000000000000000000000000000000000006044820152606401610863565b8051604051600091611476917f0000000000000000000000000000000000000000000000000000000000000000917f0000000000000000000000000000000000000000000000000000000000000000917f0000000000000000000000000000000000000000000000000000000000000000917f000000000000000000000000000000000000000000000000000000000000000091602001948552606093841b7fffffffffffffffffffffffffffffffffffffffff00000000000000000000000090811660208701526034860193909352921b16605483015260c01b7fffffffffffffffff00000000000000000000000000000000000000000000000016606882015260700190565b60405160208183030381529060405280519060200120905060005b61149e6020850185613b65565b905081101561169e57600d600082856000015167ffffffffffffffff166114c59190613b1a565b815260208101919091526040016000205460ff16611588576115887f000000000000000000000000000000000000000000000000000000000000000061150e6020870187613b65565b8481811061151e5761151e613aeb565b6115349260206060909202019081019150613702565b6402540be4006115476020890189613b65565b8681811061155757611557613aeb565b905060600201602001602081019061156f9190613bd3565b67ffffffffffffffff166115839190613ac1565b613181565b816115966020860186613b65565b838181106115a6576115a6613aeb565b6115bc9260206060909202019081019150613702565b6115c96020870187613b65565b848181106115d9576115d9613aeb565b90506060020160200160208101906115f19190613bd3565b60405160200161165e9392919092835260609190911b7fffffffffffffffffffffffffffffffffffffffff00000000000000000000000016602083015260c01b7fffffffffffffffff000000000000000000000000000000000000000000000000166034820152603c0190565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe081840301815291905280516020909101209150600101611491565b508082608001511461170c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600a60248201527f57726f6e672068617368000000000000000000000000000000000000000000006044820152606401610863565b81516020808401516040805167ffffffffffffffff9485168152939091169183019190915281018290527fce67cdf2a5dbd123a7aa5e9fd21b2136e06d33eb30e024ee5c491a6ec934a48b906060015b60405180910390a1505050565b60065460ff16156117d6576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600660248201527f50617573656400000000000000000000000000000000000000000000000000006044820152606401610863565b60025473ffffffffffffffffffffffffffffffffffffffff163314611857576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600b60248201527f4e6f74206361707461696e0000000000000000000000000000000000000000006044820152606401610863565b600f54158015611865575082155b806118d65750600f54158015906118d65750600f805461188790600190613ad8565b8154811061189757611897613aeb565b60009182526020909120600290910201546118c99068010000000000000000900467ffffffffffffffff166001613bfd565b67ffffffffffffffff1683145b61193c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600b60248201527f57726f6e672073746172740000000000000000000000000000000000000000006044820152606401610863565b828210158015611953575067ffffffffffffffff82105b6119b9576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600960248201527f57726f6e6720656e6400000000000000000000000000000000000000000000006044820152606401610863565b6040805160a08101825267ffffffffffffffff80861682528481166020830190815242821693830193845260006060840181815260808501878152600f80546001818101835594829052965160029097027f8d1108e10bcb7c27dddfc02ed9d693a074039d026cf4ea4240b40f7d581ac80281018054965199519451881678010000000000000000000000000000000000000000000000000277ffffffffffffffffffffffffffffffffffffffffffffffff95891670010000000000000000000000000000000002959095166fffffffffffffffffffffffffffffffff9a891668010000000000000000027fffffffffffffffffffffffffffffffff0000000000000000000000000000000090981699909816989098179590951797909716949094171790935590517f8d1108e10bcb7c27dddfc02ed9d693a074039d026cf4ea4240b40f7d581ac8039091015590547fe078fb854f34cd8ca5f749fe2e680b692ef7df5e057026369a30c8965a3219ca91611b3491613ad8565b604080519182526020820186905281018490526060810183905260800161175c565b604080517f00000000000000000000000000000000000000000000000000000000000000006020808301919091527fffffffffffffffffffffffffffffffffffffffff0000000000000000000000007f0000000000000000000000000000000000000000000000000000000000000000606090811b8216848601527f000000000000000000000000000000000000000000000000000000000000000060548501527f0000000000000000000000000000000000000000000000000000000000000000901b1660748301527fffffffffffffffff00000000000000000000000000000000000000000000000060c086901b1660888301528251808303607001815260909092019092528051910120600090835b838111611d745781600c8281548110611c8357611c83613aeb565b600091825260209091200154600c805473ffffffffffffffffffffffffffffffffffffffff9092169184908110611cbc57611cbc613aeb565b9060005260206000200160000160149054906101000a900467ffffffffffffffff16604051602001611d4b9392919092835260609190911b7fffffffffffffffffffffffffffffffffffffffff00000000000000000000000016602083015260c01b7fffffffffffffffff000000000000000000000000000000000000000000000000166034820152603c0190565b60405160208183030381529060405280519060200120915080611d6d90613b2d565b9050611c68565b5090505b92915050565b60005473ffffffffffffffffffffffffffffffffffffffff163314611dff576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600960248201527f4e6f74206f776e657200000000000000000000000000000000000000000000006044820152606401610863565b80600e541115611e6b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601660248201527f426174636820616c7265616479206578656375746564000000000000000000006044820152606401610863565b600f54811015611ec757600f805480611e8657611e86613c1e565b60008281526020812060027fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff90930192830201818155600101559055611e6b565b6040518181527f992e817214d6c9aa9d52b4faf1913b1d1321ce1a6ff98258e88a5d78e71a0183906020015b60405180910390a150565b60008060008060075442611f129190613ad8565b600c5490915086108015611f69575080600c8781548110611f3557611f35613aeb565b6000918252602090912001547c0100000000000000000000000000000000000000000000000000000000900463ffffffff16105b1561200f578593506001611f7d8686613b1a565b611f879190613ad8565b600c549093508310611fa557600c54611fa290600190613ad8565b92505b80600c8481548110611fb957611fb9613aeb565b6000918252602090912001547c0100000000000000000000000000000000000000000000000000000000900463ffffffff16106120025782611ffa81613c4d565b935050611fa5565b61200c8484611b56565b91505b509250925092565b60005473ffffffffffffffffffffffffffffffffffffffff163314612098576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600960248201527f4e6f74206f776e657200000000000000000000000000000000000000000000006044820152606401610863565b606483106120a557600080fd5b68056bc75e2d6310000082106120ba57600080fd5b683635c9adc5dea0000081106120cf57600080fd5b600954600a54600b54604080519384526020840187905283019190915260608201849052608082015260a081018290527f0bc992b511038194430d3b93b01ed9d312562944591645c91130b33b0d920d139060c00160405180910390a1600992909255600a55600b55565b60005473ffffffffffffffffffffffffffffffffffffffff1633146121bb576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600960248201527f4e6f74206f776e657200000000000000000000000000000000000000000000006044820152606401610863565b60005b828110156121f0576121e88484838181106121db576121db613aeb565b905060200201358361348f565b6001016121be565b50505050565b60015473ffffffffffffffffffffffffffffffffffffffff16331461229d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603560248201527f596f75206d757374206265206e6f6d696e61746564206265666f726520796f7560448201527f2063616e20616363657074206f776e65727368697000000000000000000000006064820152608401610863565b6001546000805460405173ffffffffffffffffffffffffffffffffffffffff93841693909116917fb532073b38c83145e3e5135377a08bf9aab55bc0fd7c1179cd4fb995d2a5159c91a360018054600080547fffffffffffffffffffffffff000000000000000000000000000000000000000090811673ffffffffffffffffffffffffffffffffffffffff841617909155169055565b3360009081526004602052604090205460ff1680612368575060005473ffffffffffffffffffffffffffffffffffffffff1633145b8061238a575060025473ffffffffffffffffffffffffffffffffffffffff1633145b806123ac575060035473ffffffffffffffffffffffffffffffffffffffff1633145b612412576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600e60248201527f4e6f7420637265776d656d6265720000000000000000000000000000000000006044820152606401610863565b61241c60016135ba565b565b60005473ffffffffffffffffffffffffffffffffffffffff16331461249f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600960248201527f4e6f74206f776e657200000000000000000000000000000000000000000000006044820152606401610863565b60025460405173ffffffffffffffffffffffffffffffffffffffff8084169216907ff18effac70e61c427eeb822dabc8c030ad0d6178e38899b5436e10f9b599028f90600090a3600280547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff92909216919091179055565b604080518082019091526060602082015282815261254b8383613ad8565b612556906001613b1a565b67ffffffffffffffff81111561256e5761256e613c82565b6040519080825280602002602001820160405280156125d757816020015b60408051606081018252600080825260208083018290529282015282527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff90920191018161258c5790505b506020820152825b8281116126b657600c81815481106125f9576125f9613aeb565b600091825260209182902060408051606081018252929091015473ffffffffffffffffffffffffffffffffffffffff8116835274010000000000000000000000000000000000000000810467ffffffffffffffff16838501527c0100000000000000000000000000000000000000000000000000000000900463ffffffff16908201529083015161268a8684613ad8565b8151811061269a5761269a613aeb565b6020026020010181905250806126af90613b2d565b90506125df565b5092915050565b600c81815481106126cd57600080fd5b60009182526020909120015473ffffffffffffffffffffffffffffffffffffffff8116915074010000000000000000000000000000000000000000810467ffffffffffffffff16907c0100000000000000000000000000000000000000000000000000000000900463ffffffff1683565b60005473ffffffffffffffffffffffffffffffffffffffff1633146127bf576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600960248201527f4e6f74206f776e657200000000000000000000000000000000000000000000006044820152606401610863565b60035460405173ffffffffffffffffffffffffffffffffffffffff8084169216907fd64fbe94bc529b7e39db059497f4956a94c5ade6b2df42325818876b1c013bcd90600090a3600380547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff92909216919091179055565b60008461285a578761287c565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff5b6040517fd505accf000000000000000000000000000000000000000000000000000000008152336004820152306024820152604481018290526064810188905260ff8616608482015260a4810185905260c481018490529091507f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff169063d505accf9060e401600060405180830381600087803b15801561293157600080fd5b505af1158015612945573d6000803e3d6000fd5b505050506129538188610918565b5050505050505050565b600f818154811061296d57600080fd5b60009182526020909120600290910201805460019091015467ffffffffffffffff8083169350680100000000000000008304811692700100000000000000000000000000000000810482169278010000000000000000000000000000000000000000000000009091049091169085565b6000805460609073ffffffffffffffffffffffffffffffffffffffff163314612a62576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600960248201527f4e6f74206f776e657200000000000000000000000000000000000000000000006044820152606401610863565b821580612a86575060008673ffffffffffffffffffffffffffffffffffffffff163b115b612aec576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f43616e206e6f742063616c6c20612066756e6374696f6e206f6e206120454f416044820152606401610863565b6000808773ffffffffffffffffffffffffffffffffffffffff16878787604051612b17929190613cb1565b60006040518083038185875af1925050503d8060008114612b54576040519150601f19603f3d011682016040523d82523d6000602084013e612b59565b606091505b5090999098509650505050505050565b60005473ffffffffffffffffffffffffffffffffffffffff163314612bea576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600960248201527f4e6f74206f776e657200000000000000000000000000000000000000000000006044820152606401610863565b610e108210158015612bfe5750610e108110155b612c64576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601060248201527f506572696f6420746f6f2073686f7274000000000000000000000000000000006044820152606401610863565b6007546008546040805192835260208301919091528101839052606081018290527f7e8d6c37faafc79578015f383c6a5d31a846c93210a9d639e01843943e9fd5f89060800160405180910390a1600791909155600855565b60005473ffffffffffffffffffffffffffffffffffffffff163314612d3e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600960248201527f4e6f74206f776e657200000000000000000000000000000000000000000000006044820152606401610863565b73ffffffffffffffffffffffffffffffffffffffff8116600081815260056020908152604091829020805460ff808216157fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0090921682179092558351948552161515908301527f017149285d09d144b60699c89d370abbf31f058fc660d50c3881391f93af1bd79101611ef3565b3360009081526004602052604090205460ff1680612e01575060005473ffffffffffffffffffffffffffffffffffffffff1633145b80612e23575060025473ffffffffffffffffffffffffffffffffffffffff1633145b80612e45575060035473ffffffffffffffffffffffffffffffffffffffff1633145b612eab576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600e60248201527f4e6f7420637265776d656d6265720000000000000000000000000000000000006044820152606401610863565b80600f8381548110612ebf57612ebf613aeb565b90600052602060002090600202016001015414612f38576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600a60248201527f57726f6e672068617368000000000000000000000000000000000000000000006044820152606401610863565b81600e541115612fa4576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601660248201527f426174636820616c7265616479206578656375746564000000000000000000006044820152606401610863565b600f8281548110612fb757612fb7613aeb565b60009182526020909120600290910201547801000000000000000000000000000000000000000000000000900467ffffffffffffffff1615613055576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601660248201527f426174636820616c7265616479206469737075746564000000000000000000006044820152606401610863565b6001600f838154811061306a5761306a613aeb565b906000526020600020906002020160000160186101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055506130ab60016135ba565b60408051838152602081018390527f2292bdbb5281fd856c02c8a97b23b28fd9c47e895224d5262ef02c9647c1ebc091015b60405180910390a15050565b60005473ffffffffffffffffffffffffffffffffffffffff16331461316a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600960248201527f4e6f74206f776e657200000000000000000000000000000000000000000000006044820152606401610863565b61241c60006135ba565b61317e8133610918565b50565b6040805173ffffffffffffffffffffffffffffffffffffffff8481166024830152604480830185905283518084039091018152606490920183526020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fa9059cbb0000000000000000000000000000000000000000000000000000000017905291516000928392908716916132189190613cc1565b6000604051808303816000865af19150503d8060008114613255576040519150601f19603f3d011682016040523d82523d6000602084013e61325a565b606091505b50915091508180156132845750805115806132845750808060200190518101906132849190613cdd565b6132ea576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600260248201527f53540000000000000000000000000000000000000000000000000000000000006044820152606401610863565b5050505050565b60008183116133005781610fb5565b5090919050565b60008183106133005781610fb5565b6040805173ffffffffffffffffffffffffffffffffffffffff85811660248301528481166044830152606480830185905283518084039091018152608490920183526020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167f23b872dd0000000000000000000000000000000000000000000000000000000017905291516000928392908816916133b59190613cc1565b6000604051808303816000865af19150503d80600081146133f2576040519150601f19603f3d011682016040523d82523d6000602084013e6133f7565b606091505b50915091508180156134215750805115806134215750808060200190518101906134219190613cdd565b613487576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600360248201527f53544600000000000000000000000000000000000000000000000000000000006044820152606401610863565b505050505050565b600e5415806134e45750600f6001600e546134aa9190613ad8565b815481106134ba576134ba613aeb565b600091825260209091206002909102015468010000000000000000900467ffffffffffffffff1682115b61354a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601c60248201527f5472616e73616374696f6e20616c7265616479206578656375746564000000006044820152606401610863565b6000828152600d602090815260409182902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00168415159081179091558251858152918201527fdf11c22eefc5804dfbf9c567c2522c17e93416278a0f8a6f8e8f327ee6cb032e91016130dd565b600680547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00168215159081179091556040519081527f9422424b175dda897495a07b091ef74a3ef715cf6d866fc972954c1c7f45930490602001611ef3565b803573ffffffffffffffffffffffffffffffffffffffff8116811461363d57600080fd5b919050565b6000806040838503121561365557600080fd5b61365e83613619565b946020939093013593505050565b6000806040838503121561367f57600080fd5b8235915061368f60208401613619565b90509250929050565b801515811461317e57600080fd5b600080604083850312156136b957600080fd5b6136c283613619565b915060208301356136d281613698565b809150509250929050565b600080604083850312156136f057600080fd5b8235915060208301356136d281613698565b60006020828403121561371457600080fd5b610fb582613619565b6000806040838503121561373057600080fd5b50508035926020909101359150565b60006020828403121561375157600080fd5b813567ffffffffffffffff81111561376857600080fd5b820160408185031215610fb557600080fd5b60008060006060848603121561378f57600080fd5b505081359360208301359350604090920135919050565b6000602082840312156137b857600080fd5b5035919050565b6000806000604084860312156137d457600080fd5b833567ffffffffffffffff808211156137ec57600080fd5b818601915086601f83011261380057600080fd5b81358181111561380f57600080fd5b8760208260051b850101111561382457600080fd5b6020928301955093505084013561383a81613698565b809150509250925092565b6000602080835260608084018551838601528286015160408060408801528282518085526080890191508684019450600093505b808410156138d0578451805173ffffffffffffffffffffffffffffffffffffffff1683528781015167ffffffffffffffff168884015283015163ffffffff1683830152938601936001939093019290850190613879565b5098975050505050505050565b600080600080600080600060e0888a0312156138f857600080fd5b8735965061390860208901613619565b955060408801359450606088013561391f81613698565b9350608088013560ff8116811461393557600080fd5b9699959850939692959460a0840135945060c09093013592915050565b6000806000806060858703121561396857600080fd5b61397185613619565b935060208501359250604085013567ffffffffffffffff8082111561399557600080fd5b818701915087601f8301126139a957600080fd5b8135818111156139b857600080fd5b8860208285010111156139ca57600080fd5b95989497505060200194505050565b60005b838110156139f45781810151838201526020016139dc565b50506000910152565b82151581526040602082015260008251806040840152613a248160608501602087016139d9565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016919091016060019392505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b600082613abc577f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b500490565b8082028115828204841417611d7857611d78613a57565b81810381811115611d7857611d78613a57565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b80820180821115611d7857611d78613a57565b60007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8203613b5e57613b5e613a57565b5060010190565b60008083357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe1843603018112613b9a57600080fd5b83018035915067ffffffffffffffff821115613bb557600080fd5b6020019150606081023603821315613bcc57600080fd5b9250929050565b600060208284031215613be557600080fd5b813567ffffffffffffffff81168114610fb557600080fd5b67ffffffffffffffff8181168382160190808211156126b6576126b6613a57565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fd5b600081613c5c57613c5c613a57565b507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0190565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b8183823760009101908152919050565b60008251613cd38184602087016139d9565b9190910192915050565b600060208284031215613cef57600080fd5b8151610fb58161369856fea2646970667358221220295475025cbe3a698c2aca619caedc853e1dd3d95957b5d820e26cd249b364a464736f6c63430008170033000000000000000000000000a663b02cf0a4b149d2ad41910cb81e23e1c41c320000000000000000000000000000000000000000000000000000000000000001000000000000000000000000e3b3fe7bca19ca77ad877a5bebab186becfad906000000000000000000000000000000000000000000000000000000000000a4b1
Deployed Bytecode
0x608060405234801561001057600080fd5b50600436106103205760003560e01c80638456cb59116101a7578063c2f6afe5116100ee578063e050be5711610097578063f7b188a511610071578063f7b188a5146107a4578063fc0c546a146107ac578063fd433ec0146107d357600080fd5b8063e050be571461074e578063f40e349f14610771578063f55ebb8f1461078457600080fd5b8063d2c1626c116100c8578063d2c1626c146106f8578063d9fb265d1461070b578063de7974a41461072e57600080fd5b8063c2f6afe5146106b6578063cd84980e146106c9578063cdbdfdc2146106f057600080fd5b80639b8c624a11610150578063b61325cd1161012a578063b61325cd14610683578063b61d27f61461068c578063c2624e1e146106ad57600080fd5b80639b8c624a1461060e578063a3a6d9e814610621578063b32c4d8d1461063457600080fd5b80638e714a72116101815780638e714a7214610587578063907c6c2e1461059a5780639ace38c2146105ba57600080fd5b80638456cb59146105575780638b928bd31461055f5780638da5cb5b1461056757600080fd5b80633beaf5261161026b5780635c975abb1161021457806366e64f97116101ee57806366e64f971461051c57806379ba5097146105285780638304e6d21461053057600080fd5b80635c975abb146104c95780635f62fa6f146104e6578063652dfc3b1461050957600080fd5b806353a47bb71161024557806353a47bb71461048d57806359c13403146104ad5780635b65b9ab146104b657600080fd5b80633beaf526146104395780634a474aa31461044c578063525862f91461045f57600080fd5b8063165282c3116102cd57806333032dd0116102a757806333032dd01461040a57806333efa2b21461041357806336f734c11461042657600080fd5b8063165282c3146103a25780632d11c58a146103b5578063327107f7146103be57600080fd5b806307cca166116102fe57806307cca16614610369578063081c46241461037c5780631627540c1461038f57600080fd5b8063024faa8c1461032557806305ab421d1461034157806305c211d214610356575b600080fd5b61032e60085481565b6040519081526020015b60405180910390f35b61035461034f366004613642565b6107e6565b005b61035461036436600461366c565b610918565b6103546103773660046136a6565b610cb7565b61035461038a3660046136dd565b610dc2565b61035461039d366004613702565b610e4d565b61032e6103b036600461371d565b610f3d565b61032e60095481565b6103e57f000000000000000000000000e3b3fe7bca19ca77ad877a5bebab186becfad90681565b60405173ffffffffffffffffffffffffffffffffffffffff9091168152602001610338565b61032e60075481565b61035461042136600461373f565b610fbc565b61035461043436600461377a565b611769565b61032e61044736600461371d565b611b56565b61035461045a3660046137a6565b611d7e565b61047261046d36600461371d565b611efe565b60408051938452602084019290925290820152606001610338565b6001546103e59073ffffffffffffffffffffffffffffffffffffffff1681565b61032e600a5481565b6103546104c436600461377a565b612017565b6006546104d69060ff1681565b6040519015158152602001610338565b6104d66104f4366004613702565b60056020526000908152604090205460ff1681565b6103546105173660046137bf565b61213a565b61032e6402540be40081565b6103546121f6565b61032e7f000000000000000000000000000000000000000000000000000000000000a4b181565b610354612333565b600f5461032e565b6000546103e59073ffffffffffffffffffffffffffffffffffffffff1681565b610354610595366004613702565b61241e565b6105ad6105a836600461371d565b61252d565b6040516103389190613845565b6105cd6105c83660046137a6565b6126bd565b6040805173ffffffffffffffffffffffffffffffffffffffff909416845267ffffffffffffffff909216602084015263ffffffff1690820152606001610338565b61035461061c366004613702565b61273e565b61035461062f3660046138dd565b61284d565b6106476106423660046137a6565b61295d565b6040805167ffffffffffffffff96871681529486166020860152928516928401929092529092166060820152608081019190915260a001610338565b61032e600e5481565b61069f61069a366004613952565b6129dd565b6040516103389291906139fd565b61032e600b5481565b6103546106c436600461371d565b612b69565b61032e7f000000000000000000000000000000000000000000000000000000000000000181565b600c5461032e565b610354610706366004613702565b612cbd565b6104d6610719366004613702565b60046020526000908152604090205460ff1681565b6003546103e59073ffffffffffffffffffffffffffffffffffffffff1681565b6104d661075c3660046137a6565b600d6020526000908152604090205460ff1681565b61035461077f36600461371d565b612dcc565b6002546103e59073ffffffffffffffffffffffffffffffffffffffff1681565b6103546130e9565b6103e57f000000000000000000000000a663b02cf0a4b149d2ad41910cb81e23e1c41c3281565b6103546107e13660046137a6565b613174565b60005473ffffffffffffffffffffffffffffffffffffffff16331461086c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600960248201527f4e6f74206f776e6572000000000000000000000000000000000000000000000060448201526064015b60405180910390fd5b73ffffffffffffffffffffffffffffffffffffffff82166108e9576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601860248201527f5a65726f2061646472657373206e6f7420616c6c6f77656400000000000000006044820152606401610863565b6109147f000000000000000000000000a663b02cf0a4b149d2ad41910cb81e23e1c41c328383613181565b5050565b60065460ff1615610985576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600660248201527f50617573656400000000000000000000000000000000000000000000000000006044820152606401610863565b6402540be4006109958184613a86565b61099f9190613ac1565b336000908152600560205260408120549193509060ff16156109c3575060006109f7565b6109f46109ec600a54612710600954876109dd9190613ac1565b6109e79190613a86565b6132f1565b600b54613307565b90505b808311610a60576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600e60248201527f416d6f756e7420746f6f206c6f770000000000000000000000000000000000006044820152606401610863565b67ffffffffffffffff610a786402540be40085613a86565b1115610ae0576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600f60248201527f416d6f756e7420746f6f206869676800000000000000000000000000000000006044820152606401610863565b610b0c7f000000000000000000000000a663b02cf0a4b149d2ad41910cb81e23e1c41c32333086613316565b60006402540be400610b1e8386613ad8565b610b289190613a86565b600c5490915073ffffffffffffffffffffffffffffffffffffffff8416907f0250c838bae2cda1e214f0925d41846180714450539039d6fd90a4121d98738e9086610b826402540be40067ffffffffffffffff8716613ac1565b6040805193845260208401929092529082015242606082015260800160405180910390a26040805160608101825273ffffffffffffffffffffffffffffffffffffffff948516815267ffffffffffffffff9283166020820190815263ffffffff428116938301938452600c805460018101825560009190915292517fdf6966c971051c3d54ec59162606531493a51404a002842f56009d7e5cf4a8c79093018054925194519091167c0100000000000000000000000000000000000000000000000000000000027bffffffffffffffffffffffffffffffffffffffffffffffffffffffff9490951674010000000000000000000000000000000000000000027fffffffff0000000000000000000000000000000000000000000000000000000090921692909616919091171716179091555050565b60005473ffffffffffffffffffffffffffffffffffffffff163314610d38576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600960248201527f4e6f74206f776e657200000000000000000000000000000000000000000000006044820152606401610863565b73ffffffffffffffffffffffffffffffffffffffff821660008181526004602090815260409182902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001685151590811790915591519182527f6a5f1fd939b33c2480886a44e0780806ce19041ef2c91734cb752c54288ca5ac910160405180910390a25050565b60005473ffffffffffffffffffffffffffffffffffffffff163314610e43576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600960248201527f4e6f74206f776e657200000000000000000000000000000000000000000000006044820152606401610863565b610914828261348f565b60005473ffffffffffffffffffffffffffffffffffffffff163314610ece576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600960248201527f4e6f74206f776e657200000000000000000000000000000000000000000000006044820152606401610863565b600180547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff83169081179091556040517f906a1c6bd7e3091ea86693dd029a831c19049ce77f1dce2ce0bab1cacbabce2290600090a250565b6000825b828111610fa557600c8181548110610f5b57610f5b613aeb565b600091825260209091200154610f939074010000000000000000000000000000000000000000900467ffffffffffffffff1683613b1a565b9150610f9e81613b2d565b9050610f41565b50610fb56402540be40082613ac1565b9392505050565b60065460ff1615611029576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600660248201527f50617573656400000000000000000000000000000000000000000000000000006044820152606401610863565b60035473ffffffffffffffffffffffffffffffffffffffff1633146110aa576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601160248201527f4e6f74206669727374206f6666696365720000000000000000000000000000006044820152606401610863565b600e8054600091600f9190836110bf83613b2d565b91905055815481106110d3576110d3613aeb565b60009182526020918290206040805160a0810182526002909302909101805467ffffffffffffffff8082168552680100000000000000008204811695850195909552700100000000000000000000000000000000810485169284019290925278010000000000000000000000000000000000000000000000009091049092166060820181905260019092015460808201529150156111cd576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600e60248201527f42617463682064697370757465640000000000000000000000000000000000006044820152606401610863565b805167ffffffffffffffff16823514611242576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600b60248201527f57726f6e672073746172740000000000000000000000000000000000000000006044820152606401610863565b806020015167ffffffffffffffff1660018380602001906112639190613b65565b8451611279925067ffffffffffffffff16613b1a565b6112839190613ad8565b146112ea576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600a60248201527f57726f6e672073697a65000000000000000000000000000000000000000000006044820152606401610863565b60085460408201516113069067ffffffffffffffff1642613ad8565b101561136e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600860248201527f546f6f20736f6f6e0000000000000000000000000000000000000000000000006044820152606401610863565b8051604051600091611476917f000000000000000000000000000000000000000000000000000000000000a4b1917f000000000000000000000000e3b3fe7bca19ca77ad877a5bebab186becfad906917f0000000000000000000000000000000000000000000000000000000000000001917f000000000000000000000000a663b02cf0a4b149d2ad41910cb81e23e1c41c3291602001948552606093841b7fffffffffffffffffffffffffffffffffffffffff00000000000000000000000090811660208701526034860193909352921b16605483015260c01b7fffffffffffffffff00000000000000000000000000000000000000000000000016606882015260700190565b60405160208183030381529060405280519060200120905060005b61149e6020850185613b65565b905081101561169e57600d600082856000015167ffffffffffffffff166114c59190613b1a565b815260208101919091526040016000205460ff16611588576115887f000000000000000000000000a663b02cf0a4b149d2ad41910cb81e23e1c41c3261150e6020870187613b65565b8481811061151e5761151e613aeb565b6115349260206060909202019081019150613702565b6402540be4006115476020890189613b65565b8681811061155757611557613aeb565b905060600201602001602081019061156f9190613bd3565b67ffffffffffffffff166115839190613ac1565b613181565b816115966020860186613b65565b838181106115a6576115a6613aeb565b6115bc9260206060909202019081019150613702565b6115c96020870187613b65565b848181106115d9576115d9613aeb565b90506060020160200160208101906115f19190613bd3565b60405160200161165e9392919092835260609190911b7fffffffffffffffffffffffffffffffffffffffff00000000000000000000000016602083015260c01b7fffffffffffffffff000000000000000000000000000000000000000000000000166034820152603c0190565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe081840301815291905280516020909101209150600101611491565b508082608001511461170c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600a60248201527f57726f6e672068617368000000000000000000000000000000000000000000006044820152606401610863565b81516020808401516040805167ffffffffffffffff9485168152939091169183019190915281018290527fce67cdf2a5dbd123a7aa5e9fd21b2136e06d33eb30e024ee5c491a6ec934a48b906060015b60405180910390a1505050565b60065460ff16156117d6576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600660248201527f50617573656400000000000000000000000000000000000000000000000000006044820152606401610863565b60025473ffffffffffffffffffffffffffffffffffffffff163314611857576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600b60248201527f4e6f74206361707461696e0000000000000000000000000000000000000000006044820152606401610863565b600f54158015611865575082155b806118d65750600f54158015906118d65750600f805461188790600190613ad8565b8154811061189757611897613aeb565b60009182526020909120600290910201546118c99068010000000000000000900467ffffffffffffffff166001613bfd565b67ffffffffffffffff1683145b61193c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600b60248201527f57726f6e672073746172740000000000000000000000000000000000000000006044820152606401610863565b828210158015611953575067ffffffffffffffff82105b6119b9576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600960248201527f57726f6e6720656e6400000000000000000000000000000000000000000000006044820152606401610863565b6040805160a08101825267ffffffffffffffff80861682528481166020830190815242821693830193845260006060840181815260808501878152600f80546001818101835594829052965160029097027f8d1108e10bcb7c27dddfc02ed9d693a074039d026cf4ea4240b40f7d581ac80281018054965199519451881678010000000000000000000000000000000000000000000000000277ffffffffffffffffffffffffffffffffffffffffffffffff95891670010000000000000000000000000000000002959095166fffffffffffffffffffffffffffffffff9a891668010000000000000000027fffffffffffffffffffffffffffffffff0000000000000000000000000000000090981699909816989098179590951797909716949094171790935590517f8d1108e10bcb7c27dddfc02ed9d693a074039d026cf4ea4240b40f7d581ac8039091015590547fe078fb854f34cd8ca5f749fe2e680b692ef7df5e057026369a30c8965a3219ca91611b3491613ad8565b604080519182526020820186905281018490526060810183905260800161175c565b604080517f00000000000000000000000000000000000000000000000000000000000000016020808301919091527fffffffffffffffffffffffffffffffffffffffff0000000000000000000000007f000000000000000000000000a663b02cf0a4b149d2ad41910cb81e23e1c41c32606090811b8216848601527f000000000000000000000000000000000000000000000000000000000000a4b160548501527f000000000000000000000000e3b3fe7bca19ca77ad877a5bebab186becfad906901b1660748301527fffffffffffffffff00000000000000000000000000000000000000000000000060c086901b1660888301528251808303607001815260909092019092528051910120600090835b838111611d745781600c8281548110611c8357611c83613aeb565b600091825260209091200154600c805473ffffffffffffffffffffffffffffffffffffffff9092169184908110611cbc57611cbc613aeb565b9060005260206000200160000160149054906101000a900467ffffffffffffffff16604051602001611d4b9392919092835260609190911b7fffffffffffffffffffffffffffffffffffffffff00000000000000000000000016602083015260c01b7fffffffffffffffff000000000000000000000000000000000000000000000000166034820152603c0190565b60405160208183030381529060405280519060200120915080611d6d90613b2d565b9050611c68565b5090505b92915050565b60005473ffffffffffffffffffffffffffffffffffffffff163314611dff576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600960248201527f4e6f74206f776e657200000000000000000000000000000000000000000000006044820152606401610863565b80600e541115611e6b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601660248201527f426174636820616c7265616479206578656375746564000000000000000000006044820152606401610863565b600f54811015611ec757600f805480611e8657611e86613c1e565b60008281526020812060027fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff90930192830201818155600101559055611e6b565b6040518181527f992e817214d6c9aa9d52b4faf1913b1d1321ce1a6ff98258e88a5d78e71a0183906020015b60405180910390a150565b60008060008060075442611f129190613ad8565b600c5490915086108015611f69575080600c8781548110611f3557611f35613aeb565b6000918252602090912001547c0100000000000000000000000000000000000000000000000000000000900463ffffffff16105b1561200f578593506001611f7d8686613b1a565b611f879190613ad8565b600c549093508310611fa557600c54611fa290600190613ad8565b92505b80600c8481548110611fb957611fb9613aeb565b6000918252602090912001547c0100000000000000000000000000000000000000000000000000000000900463ffffffff16106120025782611ffa81613c4d565b935050611fa5565b61200c8484611b56565b91505b509250925092565b60005473ffffffffffffffffffffffffffffffffffffffff163314612098576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600960248201527f4e6f74206f776e657200000000000000000000000000000000000000000000006044820152606401610863565b606483106120a557600080fd5b68056bc75e2d6310000082106120ba57600080fd5b683635c9adc5dea0000081106120cf57600080fd5b600954600a54600b54604080519384526020840187905283019190915260608201849052608082015260a081018290527f0bc992b511038194430d3b93b01ed9d312562944591645c91130b33b0d920d139060c00160405180910390a1600992909255600a55600b55565b60005473ffffffffffffffffffffffffffffffffffffffff1633146121bb576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600960248201527f4e6f74206f776e657200000000000000000000000000000000000000000000006044820152606401610863565b60005b828110156121f0576121e88484838181106121db576121db613aeb565b905060200201358361348f565b6001016121be565b50505050565b60015473ffffffffffffffffffffffffffffffffffffffff16331461229d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603560248201527f596f75206d757374206265206e6f6d696e61746564206265666f726520796f7560448201527f2063616e20616363657074206f776e65727368697000000000000000000000006064820152608401610863565b6001546000805460405173ffffffffffffffffffffffffffffffffffffffff93841693909116917fb532073b38c83145e3e5135377a08bf9aab55bc0fd7c1179cd4fb995d2a5159c91a360018054600080547fffffffffffffffffffffffff000000000000000000000000000000000000000090811673ffffffffffffffffffffffffffffffffffffffff841617909155169055565b3360009081526004602052604090205460ff1680612368575060005473ffffffffffffffffffffffffffffffffffffffff1633145b8061238a575060025473ffffffffffffffffffffffffffffffffffffffff1633145b806123ac575060035473ffffffffffffffffffffffffffffffffffffffff1633145b612412576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600e60248201527f4e6f7420637265776d656d6265720000000000000000000000000000000000006044820152606401610863565b61241c60016135ba565b565b60005473ffffffffffffffffffffffffffffffffffffffff16331461249f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600960248201527f4e6f74206f776e657200000000000000000000000000000000000000000000006044820152606401610863565b60025460405173ffffffffffffffffffffffffffffffffffffffff8084169216907ff18effac70e61c427eeb822dabc8c030ad0d6178e38899b5436e10f9b599028f90600090a3600280547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff92909216919091179055565b604080518082019091526060602082015282815261254b8383613ad8565b612556906001613b1a565b67ffffffffffffffff81111561256e5761256e613c82565b6040519080825280602002602001820160405280156125d757816020015b60408051606081018252600080825260208083018290529282015282527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff90920191018161258c5790505b506020820152825b8281116126b657600c81815481106125f9576125f9613aeb565b600091825260209182902060408051606081018252929091015473ffffffffffffffffffffffffffffffffffffffff8116835274010000000000000000000000000000000000000000810467ffffffffffffffff16838501527c0100000000000000000000000000000000000000000000000000000000900463ffffffff16908201529083015161268a8684613ad8565b8151811061269a5761269a613aeb565b6020026020010181905250806126af90613b2d565b90506125df565b5092915050565b600c81815481106126cd57600080fd5b60009182526020909120015473ffffffffffffffffffffffffffffffffffffffff8116915074010000000000000000000000000000000000000000810467ffffffffffffffff16907c0100000000000000000000000000000000000000000000000000000000900463ffffffff1683565b60005473ffffffffffffffffffffffffffffffffffffffff1633146127bf576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600960248201527f4e6f74206f776e657200000000000000000000000000000000000000000000006044820152606401610863565b60035460405173ffffffffffffffffffffffffffffffffffffffff8084169216907fd64fbe94bc529b7e39db059497f4956a94c5ade6b2df42325818876b1c013bcd90600090a3600380547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff92909216919091179055565b60008461285a578761287c565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff5b6040517fd505accf000000000000000000000000000000000000000000000000000000008152336004820152306024820152604481018290526064810188905260ff8616608482015260a4810185905260c481018490529091507f000000000000000000000000a663b02cf0a4b149d2ad41910cb81e23e1c41c3273ffffffffffffffffffffffffffffffffffffffff169063d505accf9060e401600060405180830381600087803b15801561293157600080fd5b505af1158015612945573d6000803e3d6000fd5b505050506129538188610918565b5050505050505050565b600f818154811061296d57600080fd5b60009182526020909120600290910201805460019091015467ffffffffffffffff8083169350680100000000000000008304811692700100000000000000000000000000000000810482169278010000000000000000000000000000000000000000000000009091049091169085565b6000805460609073ffffffffffffffffffffffffffffffffffffffff163314612a62576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600960248201527f4e6f74206f776e657200000000000000000000000000000000000000000000006044820152606401610863565b821580612a86575060008673ffffffffffffffffffffffffffffffffffffffff163b115b612aec576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f43616e206e6f742063616c6c20612066756e6374696f6e206f6e206120454f416044820152606401610863565b6000808773ffffffffffffffffffffffffffffffffffffffff16878787604051612b17929190613cb1565b60006040518083038185875af1925050503d8060008114612b54576040519150601f19603f3d011682016040523d82523d6000602084013e612b59565b606091505b5090999098509650505050505050565b60005473ffffffffffffffffffffffffffffffffffffffff163314612bea576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600960248201527f4e6f74206f776e657200000000000000000000000000000000000000000000006044820152606401610863565b610e108210158015612bfe5750610e108110155b612c64576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601060248201527f506572696f6420746f6f2073686f7274000000000000000000000000000000006044820152606401610863565b6007546008546040805192835260208301919091528101839052606081018290527f7e8d6c37faafc79578015f383c6a5d31a846c93210a9d639e01843943e9fd5f89060800160405180910390a1600791909155600855565b60005473ffffffffffffffffffffffffffffffffffffffff163314612d3e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600960248201527f4e6f74206f776e657200000000000000000000000000000000000000000000006044820152606401610863565b73ffffffffffffffffffffffffffffffffffffffff8116600081815260056020908152604091829020805460ff808216157fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0090921682179092558351948552161515908301527f017149285d09d144b60699c89d370abbf31f058fc660d50c3881391f93af1bd79101611ef3565b3360009081526004602052604090205460ff1680612e01575060005473ffffffffffffffffffffffffffffffffffffffff1633145b80612e23575060025473ffffffffffffffffffffffffffffffffffffffff1633145b80612e45575060035473ffffffffffffffffffffffffffffffffffffffff1633145b612eab576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600e60248201527f4e6f7420637265776d656d6265720000000000000000000000000000000000006044820152606401610863565b80600f8381548110612ebf57612ebf613aeb565b90600052602060002090600202016001015414612f38576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600a60248201527f57726f6e672068617368000000000000000000000000000000000000000000006044820152606401610863565b81600e541115612fa4576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601660248201527f426174636820616c7265616479206578656375746564000000000000000000006044820152606401610863565b600f8281548110612fb757612fb7613aeb565b60009182526020909120600290910201547801000000000000000000000000000000000000000000000000900467ffffffffffffffff1615613055576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601660248201527f426174636820616c7265616479206469737075746564000000000000000000006044820152606401610863565b6001600f838154811061306a5761306a613aeb565b906000526020600020906002020160000160186101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055506130ab60016135ba565b60408051838152602081018390527f2292bdbb5281fd856c02c8a97b23b28fd9c47e895224d5262ef02c9647c1ebc091015b60405180910390a15050565b60005473ffffffffffffffffffffffffffffffffffffffff16331461316a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600960248201527f4e6f74206f776e657200000000000000000000000000000000000000000000006044820152606401610863565b61241c60006135ba565b61317e8133610918565b50565b6040805173ffffffffffffffffffffffffffffffffffffffff8481166024830152604480830185905283518084039091018152606490920183526020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fa9059cbb0000000000000000000000000000000000000000000000000000000017905291516000928392908716916132189190613cc1565b6000604051808303816000865af19150503d8060008114613255576040519150601f19603f3d011682016040523d82523d6000602084013e61325a565b606091505b50915091508180156132845750805115806132845750808060200190518101906132849190613cdd565b6132ea576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600260248201527f53540000000000000000000000000000000000000000000000000000000000006044820152606401610863565b5050505050565b60008183116133005781610fb5565b5090919050565b60008183106133005781610fb5565b6040805173ffffffffffffffffffffffffffffffffffffffff85811660248301528481166044830152606480830185905283518084039091018152608490920183526020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167f23b872dd0000000000000000000000000000000000000000000000000000000017905291516000928392908816916133b59190613cc1565b6000604051808303816000865af19150503d80600081146133f2576040519150601f19603f3d011682016040523d82523d6000602084013e6133f7565b606091505b50915091508180156134215750805115806134215750808060200190518101906134219190613cdd565b613487576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600360248201527f53544600000000000000000000000000000000000000000000000000000000006044820152606401610863565b505050505050565b600e5415806134e45750600f6001600e546134aa9190613ad8565b815481106134ba576134ba613aeb565b600091825260209091206002909102015468010000000000000000900467ffffffffffffffff1682115b61354a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601c60248201527f5472616e73616374696f6e20616c7265616479206578656375746564000000006044820152606401610863565b6000828152600d602090815260409182902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00168415159081179091558251858152918201527fdf11c22eefc5804dfbf9c567c2522c17e93416278a0f8a6f8e8f327ee6cb032e91016130dd565b600680547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00168215159081179091556040519081527f9422424b175dda897495a07b091ef74a3ef715cf6d866fc972954c1c7f45930490602001611ef3565b803573ffffffffffffffffffffffffffffffffffffffff8116811461363d57600080fd5b919050565b6000806040838503121561365557600080fd5b61365e83613619565b946020939093013593505050565b6000806040838503121561367f57600080fd5b8235915061368f60208401613619565b90509250929050565b801515811461317e57600080fd5b600080604083850312156136b957600080fd5b6136c283613619565b915060208301356136d281613698565b809150509250929050565b600080604083850312156136f057600080fd5b8235915060208301356136d281613698565b60006020828403121561371457600080fd5b610fb582613619565b6000806040838503121561373057600080fd5b50508035926020909101359150565b60006020828403121561375157600080fd5b813567ffffffffffffffff81111561376857600080fd5b820160408185031215610fb557600080fd5b60008060006060848603121561378f57600080fd5b505081359360208301359350604090920135919050565b6000602082840312156137b857600080fd5b5035919050565b6000806000604084860312156137d457600080fd5b833567ffffffffffffffff808211156137ec57600080fd5b818601915086601f83011261380057600080fd5b81358181111561380f57600080fd5b8760208260051b850101111561382457600080fd5b6020928301955093505084013561383a81613698565b809150509250925092565b6000602080835260608084018551838601528286015160408060408801528282518085526080890191508684019450600093505b808410156138d0578451805173ffffffffffffffffffffffffffffffffffffffff1683528781015167ffffffffffffffff168884015283015163ffffffff1683830152938601936001939093019290850190613879565b5098975050505050505050565b600080600080600080600060e0888a0312156138f857600080fd5b8735965061390860208901613619565b955060408801359450606088013561391f81613698565b9350608088013560ff8116811461393557600080fd5b9699959850939692959460a0840135945060c09093013592915050565b6000806000806060858703121561396857600080fd5b61397185613619565b935060208501359250604085013567ffffffffffffffff8082111561399557600080fd5b818701915087601f8301126139a957600080fd5b8135818111156139b857600080fd5b8860208285010111156139ca57600080fd5b95989497505060200194505050565b60005b838110156139f45781810151838201526020016139dc565b50506000910152565b82151581526040602082015260008251806040840152613a248160608501602087016139d9565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016919091016060019392505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b600082613abc577f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b500490565b8082028115828204841417611d7857611d78613a57565b81810381811115611d7857611d78613a57565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b80820180821115611d7857611d78613a57565b60007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8203613b5e57613b5e613a57565b5060010190565b60008083357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe1843603018112613b9a57600080fd5b83018035915067ffffffffffffffff821115613bb557600080fd5b6020019150606081023603821315613bcc57600080fd5b9250929050565b600060208284031215613be557600080fd5b813567ffffffffffffffff81168114610fb557600080fd5b67ffffffffffffffff8181168382160190808211156126b6576126b6613a57565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fd5b600081613c5c57613c5c613a57565b507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0190565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b8183823760009101908152919050565b60008251613cd38184602087016139d9565b9190910192915050565b600060208284031215613cef57600080fd5b8151610fb58161369856fea2646970667358221220295475025cbe3a698c2aca619caedc853e1dd3d95957b5d820e26cd249b364a464736f6c63430008170033
Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)
000000000000000000000000a663b02cf0a4b149d2ad41910cb81e23e1c41c320000000000000000000000000000000000000000000000000000000000000001000000000000000000000000e3b3fe7bca19ca77ad877a5bebab186becfad906000000000000000000000000000000000000000000000000000000000000a4b1
-----Decoded View---------------
Arg [0] : _token (address): 0xA663B02CF0a4b149d2aD41910CB81e23e1c41c32
Arg [1] : _chainid (uint256): 1
Arg [2] : _targetToken (address): 0xe3b3FE7bcA19cA77Ad877A5Bebab186bEcfAD906
Arg [3] : _targetChain (uint256): 42161
-----Encoded View---------------
4 Constructor Arguments found :
Arg [0] : 000000000000000000000000a663b02cf0a4b149d2ad41910cb81e23e1c41c32
Arg [1] : 0000000000000000000000000000000000000000000000000000000000000001
Arg [2] : 000000000000000000000000e3b3fe7bca19ca77ad877a5bebab186becfad906
Arg [3] : 000000000000000000000000000000000000000000000000000000000000a4b1
Deployed Bytecode Sourcemap
23883:12248:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;24390:41;;;;;;;;;160:25:1;;;148:2;133:18;24390:41:0;;;;;;;;33890:209;;;;;;:::i;:::-;;:::i;:::-;;27507:831;;;;;;:::i;:::-;;:::i;33462:156::-;;;;;;:::i;:::-;;:::i;31475:99::-;;;;;;:::i;:::-;;:::i;32708:140::-;;;;;;:::i;:::-;;:::i;35321:225::-;;;;;;:::i;:::-;;:::i;24464:23::-;;;;;;23943:35;;;;;;;;2306:42:1;2294:55;;;2276:74;;2264:2;2249:18;23943:35:0;2116:240:1;24322:36:0;;;;;;29297:1037;;;;;;:::i;:::-;;:::i;28867:420::-;;;;;;:::i;:::-;;:::i;35556:369::-;;;;;;:::i;:::-;;:::i;30344:213::-;;;;;;:::i;:::-;;:::i;34508:497::-;;;;;;:::i;:::-;;:::i;:::-;;;;3644:25:1;;;3700:2;3685:18;;3678:34;;;;3728:18;;;3721:34;3632:2;3617:18;34508:497:0;3442:319:1;24092:29:0;;;;;;;;;24510:26;;;;;;31840:353;;;;;;:::i;:::-;;:::i;24293:18::-;;;;;;;;;;;;4483:14:1;;4476:22;4458:41;;4446:2;4431:18;24293::0;4318:187:1;24237:48:0;;;;;;:::i;:::-;;;;;;;;;;;;;;;;31584:179;;;;;;:::i;:::-;;:::i;24822:42::-;;24860:4;24822:42;;32861:262;;;:::i;24019:33::-;;;;;30971:67;;;:::i;36043:85::-;36107:7;:14;36043:85;;24066:20;;;;;;;;;33133:135;;;;;;:::i;:::-;;:::i;35015:296::-;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;24875:33::-;;;;;;:::i;:::-;;:::i;:::-;;;;6564:42:1;6552:55;;;6534:74;;6656:18;6644:31;;;6639:2;6624:18;;6617:59;6724:10;6712:23;6692:18;;;6685:51;6522:2;6507:18;24875:33:0;6336:406:1;33278:170:0;;;;;;:::i;:::-;;:::i;28447:407::-;;;;;;:::i;:::-;;:::i;24988:22::-;;;;;;:::i;:::-;;:::i;:::-;;;;7769:18:1;7814:15;;;7796:34;;7866:15;;;7861:2;7846:18;;7839:43;7918:15;;;7898:18;;;7891:43;;;;7970:15;;;7965:2;7950:18;;7943:43;8017:3;8002:19;;7995:35;;;;7746:3;7731:19;24988:22:0;7508:528:1;24958:24:0;;;;;;34133:319;;;;;;:::i;:::-;;:::i;:::-;;;;;;;;:::i;24563:28::-;;;;;;32203:436;;;;;;:::i;:::-;;:::i;23984:29::-;;;;;35938:95;36007:12;:19;35938:95;;33628:183;;;;;;:::i;:::-;;:::i;24188:43::-;;;;;;:::i;:::-;;;;;;;;;;;;;;;;24155:27;;;;;;;;;24914:38;;;;;;:::i;:::-;;;;;;;;;;;;;;;;30567:394;;;;;;:::i;:::-;;:::i;24127:22::-;;;;;;;;;31048:65;;;:::i;23908:29::-;;;;;28348:92;;;;;;:::i;:::-;;:::i;33890:209::-;26920:5;;;;26908:10;:17;26899:39;;;;;;;10028:2:1;26899:39:0;;;10010:21:1;10067:1;10047:18;;;10040:29;10105:11;10085:18;;;10078:39;10134:18;;26899:39:0;;;;;;;;;33976:20:::1;::::0;::::1;33967:57;;;::::0;::::1;::::0;;10365:2:1;33967:57:0::1;::::0;::::1;10347:21:1::0;10404:2;10384:18;;;10377:30;10443:26;10423:18;;;10416:54;10487:18;;33967:57:0::1;10163:348:1::0;33967:57:0::1;34033:59;34069:5;34076:8;34085:6;34033:27;:59::i;:::-;33890:209:::0;;:::o;27507:831::-;27407:6;;;;27406:7;27397:26;;;;;;;10718:2:1;27397:26:0;;;10700:21:1;10757:1;10737:18;;;10730:29;10795:8;10775:18;;;10768:36;10821:18;;27397:26:0;10516:329:1;27397:26:0;24860:4:::1;27604:23;24860:4:::0;27604:6;:23:::1;:::i;:::-;27603:42;;;;:::i;:::-;27732:10;27695:8;27715:28:::0;;;:16:::1;:28;::::0;;;;;27594:51;;-1:-1:-1;27695:8:0;27715:28:::1;;27712:139;;;-1:-1:-1::0;27751:1:0::1;27712:139;;;27784:57;27793:39;27802:7;;27826:5;27817:8;;27810:6;:15;;;;:::i;:::-;:21;;;;:::i;:::-;27793:8;:39::i;:::-;27833:7;;27784:8;:57::i;:::-;27778:63;;27712:139;27875:3;27868:6;:10;27859:37;;;::::0;::::1;::::0;;11693:2:1;27859:37:0::1;::::0;::::1;11675:21:1::0;11732:2;11712:18;;;11705:30;11771:16;11751:18;;;11744:44;11805:18;;27859:37:0::1;11491:338:1::0;27859:37:0::1;27939:16;27914:23;24860:4;27914:6:::0;:23:::1;:::i;:::-;:41;;27905:69;;;::::0;::::1;::::0;;12036:2:1;27905:69:0::1;::::0;::::1;12018:21:1::0;12075:2;12055:18;;;12048:30;12114:17;12094:18;;;12087:45;12149:18;;27905:69:0::1;11834:339:1::0;27905:69:0::1;27983:79;28023:5;28030:10;28049:4;28055:6;27983:31;:79::i;:::-;28072:21;24860:4;28104:10;28111:3:::0;28104:6;:10:::1;:::i;:::-;28103:29;;;;:::i;:::-;28164:12;:19:::0;28072:61;;-1:-1:-1;28147:92:0::1;::::0;::::1;::::0;::::1;::::0;28184:6;28191:31:::1;24860:4;28191:31;::::0;::::1;;:::i;:::-;28147:92;::::0;;12542:25:1;;;12598:2;12583:18;;12576:34;;;;12626:18;;;12619:34;28223:15:0::1;12684:2:1::0;12669:18;;12662:34;12529:3;12514:19;28147:92:0::1;;;;;;;28266:61;::::0;;::::1;::::0;::::1;::::0;;::::1;::::0;;::::1;::::0;;::::1;::::0;;::::1;;::::0;::::1;::::0;;;::::1;28310:15;28266:61:::0;::::1;::::0;;;;;;28248:12:::1;:80:::0;;::::1;::::0;::::1;::::0;;-1:-1:-1;28248:80:0;;;;;;;;;::::1;::::0;;;;;;;;::::1;::::0;::::1;::::0;;;;::::1;::::0;::::1;::::0;;;;;;;::::1;::::0;;;;::::1;;;::::0;;;-1:-1:-1;;27507:831:0:o;33462:156::-;26920:5;;;;26908:10;:17;26899:39;;;;;;;10028:2:1;26899:39:0;;;10010:21:1;10067:1;10047:18;;;10040:29;10105:11;10085:18;;;10078:39;10134:18;;26899:39:0;9826:332:1;26899:39:0;33541:23:::1;::::0;::::1;;::::0;;;:11:::1;:23;::::0;;;;;;;;:27;;;::::1;::::0;::::1;;::::0;;::::1;::::0;;;33582:29;;4458:41:1;;;33582:29:0::1;::::0;4431:18:1;33582:29:0::1;;;;;;;33462:156:::0;;:::o;31475:99::-;26920:5;;;;26908:10;:17;26899:39;;;;;;;10028:2:1;26899:39:0;;;10010:21:1;10067:1;10047:18;;;10040:29;10105:11;10085:18;;;10078:39;10134:18;;26899:39:0;9826:332:1;26899:39:0;31544:23:::1;31554:5;31560:6;31544:9;:23::i;32708:140::-:0;26920:5;;;;26908:10;:17;26899:39;;;;;;;10028:2:1;26899:39:0;;;10010:21:1;10067:1;10047:18;;;10040:29;10105:11;10085:18;;;10078:39;10134:18;;26899:39:0;9826:332:1;26899:39:0;32778:14:::1;:25:::0;;;::::1;;::::0;::::1;::::0;;::::1;::::0;;;32817:24:::1;::::0;::::1;::::0;-1:-1:-1;;32817:24:0::1;32708:140:::0;:::o;35321:225::-;35388:16;35427:5;35415:87;35436:3;35433:1;:6;35415:87;;35470:12;35483:1;35470:15;;;;;;;;:::i;:::-;;;;;;;;;;:22;35457:35;;35470:22;;;;;35457:35;;:::i;:::-;;-1:-1:-1;35440:3:0;;;:::i;:::-;;;35415:87;;;-1:-1:-1;35510:29:0;24860:4;35510:29;;:::i;:::-;;35321:225;-1:-1:-1;;;35321:225:0:o;29297:1037::-;27407:6;;;;27406:7;27397:26;;;;;;;10718:2:1;27397:26:0;;;10700:21:1;10757:1;10737:18;;;10730:29;10795:8;10775:18;;;10768:36;10821:18;;27397:26:0;10516:329:1;27397:26:0;27121:12:::1;::::0;::::1;;27109:10;:24;27100:54;;;::::0;::::1;::::0;;13428:2:1;27100:54:0::1;::::0;::::1;13410:21:1::0;13467:2;13447:18;;;13440:30;13506:19;13486:18;;;13479:47;13543:18;;27100:54:0::1;13226:341:1::0;27100:54:0::1;29418:12:::2;:14:::0;;29389:18:::2;::::0;29410:7:::2;::::0;29418:14;29389:18;29418:14:::2;::::0;::::2;:::i;:::-;;;;;29410:23;;;;;;;;:::i;:::-;;::::0;;;::::2;::::0;;;;29389:44:::2;::::0;;::::2;::::0;::::2;::::0;;29410:23:::2;::::0;;::::2;::::0;;::::2;29389:44:::0;;::::2;::::0;;::::2;::::0;;;;::::2;::::0;::::2;::::0;;::::2;::::0;;;;;;::::2;::::0;::::2;::::0;;;;;;;;;;::::2;::::0;;::::2;::::0;;;;;;;;;::::2;::::0;;;;;;-1:-1:-1;29451:15:0;29442:42:::2;;;::::0;::::2;::::0;;13774:2:1;29442:42:0::2;::::0;::::2;13756:21:1::0;13813:2;13793:18;;;13786:30;13852:16;13832:18;;;13825:44;13886:18;;29442:42:0::2;13572:338:1::0;29442:42:0::2;29502:11:::0;;:41:::2;;29515:28:::0;::::2;29502:41;29493:65;;;::::0;::::2;::::0;;14117:2:1;29493:65:0::2;::::0;::::2;14099:21:1::0;14156:2;14136:18;;;14129:30;14195:13;14175:18;;;14168:41;14226:18;;29493:65:0::2;13915:335:1::0;29493:65:0::2;29621:5;:9;;;29576:54;;29618:1;29588:9;:22;;;;;;;;:::i;:::-;29576:11:::0;;:41:::2;::::0;-1:-1:-1;29576:41:0::2;;;:::i;:::-;:43;;;;:::i;:::-;:54;29567:77;;;::::0;::::2;::::0;;15100:2:1;29567:77:0::2;::::0;::::2;15082:21:1::0;15139:2;15119:18;;;15112:30;15178:12;15158:18;;;15151:40;15208:18;;29567:77:0::2;14898:334:1::0;29567:77:0::2;29699:23;::::0;29678:19:::2;::::0;::::2;::::0;29662:35:::2;::::0;::::2;;:15;:35;:::i;:::-;:60;;29653:81;;;::::0;::::2;::::0;;15439:2:1;29653:81:0::2;::::0;::::2;15421:21:1::0;15478:1;15458:18;;;15451:29;15516:10;15496:18;;;15489:38;15544:18;;29653:81:0::2;15237:331:1::0;29653:81:0::2;29835:11:::0;;29776:71:::2;::::0;29751:12:::2;::::0;29776:71:::2;::::0;29793:11:::2;::::0;29806::::2;::::0;29819:7:::2;::::0;29828:5:::2;::::0;29776:71:::2;;15840:19:1::0;;;15982:2;15978:15;;;15878:66;15974:24;;;15969:2;15960:12;;15953:46;16024:2;16015:12;;16008:28;;;;16070:15;;16066:24;16061:2;16052:12;;16045:46;16130:3;16126:16;16144:66;16122:89;16116:3;16107:13;;16100:112;16237:3;16228:13;;15573:674;29776:71:0::2;;;;;;;;;;;;;29766:82;;;;;;29751:97;;29862:6;29857:372;29873:22;;::::0;::::2;:9:::0;:22:::2;:::i;:::-;:29;;29871:1;:31;29857:372;;;29925:9;:24;29947:1;29935:5;:11;;;:13;;;;;;:::i;:::-;29925:24:::0;;::::2;::::0;::::2;::::0;;;;;;-1:-1:-1;29925:24:0;;::::2;;29920:183;;29966:124;30002:5;30009:22;;::::0;::::2;:9:::0;:22:::2;:::i;:::-;30032:1;30009:25;;;;;;;:::i;:::-;:30;::::0;::::2;:25;::::0;;::::2;;:30:::0;;::::2;::::0;-1:-1:-1;30009:30:0::2;:::i;:::-;24860:4;30040:22;;::::0;::::2;:9:::0;:22:::2;:::i;:::-;30063:1;30040:25;;;;;;;:::i;:::-;;;;;;:32;;;;;;;;;;:::i;:::-;:49;;;;;;:::i;:::-;29966:27;:124::i;:::-;30148:4:::0;30154:22:::2;;::::0;::::2;:9:::0;:22:::2;:::i;:::-;30177:1;30154:25;;;;;;;:::i;:::-;:30;::::0;::::2;:25;::::0;;::::2;;:30:::0;;::::2;::::0;-1:-1:-1;30154:30:0::2;:::i;:::-;30185:22;;::::0;::::2;:9:::0;:22:::2;:::i;:::-;30208:1;30185:25;;;;;;;:::i;:::-;;;;;;:32;;;;;;;;;;:::i;:::-;30131:87;;;;;;;;;16724:19:1::0;;;16781:2;16777:15;;;;16794:66;16773:88;16768:2;16759:12;;16752:110;16900:3;16896:16;16914:66;16892:89;16887:2;16878:12;;16871:111;17007:2;16998:12;;16541:475;30131:87:0::2;;::::0;;;;;::::2;::::0;;;;;;30121:98;;30131:87:::2;30121:98:::0;;::::2;::::0;;-1:-1:-1;29903:3:0::2;;29857:372;;;;30258:4;30246:5;:10;;;:16;30237:39;;;::::0;::::2;::::0;;17223:2:1;30237:39:0::2;::::0;::::2;17205:21:1::0;17262:2;17242:18;;;17235:30;17301:12;17281:18;;;17274:40;17331:18;;30237:39:0::2;17021:334:1::0;30237:39:0::2;30300:11:::0;;30312:9:::2;::::0;;::::2;::::0;30290:37:::2;::::0;;17570:18:1;17615:15;;;17597:34;;17667:15;;;;17647:18;;;17640:43;;;;17699:18;;17692:34;;;30290:37:0::2;::::0;17548:2:1;17533:18;30290:37:0::2;;;;;;;;29380:954;;29297:1037:::0;:::o;28867:420::-;27407:6;;;;27406:7;27397:26;;;;;;;10718:2:1;27397:26:0;;;10700:21:1;10757:1;10737:18;;;10730:29;10795:8;10775:18;;;10768:36;10821:18;;27397:26:0;10516:329:1;27397:26:0;27016:7:::1;::::0;::::1;;27004:10;:19;26995:43;;;::::0;::::1;::::0;;17939:2:1;26995:43:0::1;::::0;::::1;17921:21:1::0;17978:2;17958:18;;;17951:30;18017:13;17997:18;;;17990:41;18048:18;;26995:43:0::1;17737:335:1::0;26995:43:0::1;28967:7:::2;:14:::0;:17;:29;::::2;;;-1:-1:-1::0;28988:8:0;;28967:29:::2;28966:95;;;-1:-1:-1::0;29002:7:0::2;:14:::0;:16;;;;:58:::2;;-1:-1:-1::0;29029:7:0::2;29037:14:::0;;:16:::2;::::0;29052:1:::2;::::0;29037:16:::2;:::i;:::-;29029:25;;;;;;;;:::i;:::-;;::::0;;;::::2;::::0;;;::::2;::::0;;::::2;;:29:::0;:31:::2;::::0;:29;;::::2;;;29059:1;29029:31;:::i;:::-;29022:38;;:5;:38;29002:58;28957:119;;;::::0;::::2;::::0;;14117:2:1;28957:119:0::2;::::0;::::2;14099:21:1::0;14156:2;14136:18;;;14129:30;14195:13;14175:18;;;14168:41;14226:18;;28957:119:0::2;13915:335:1::0;28957:119:0::2;29099:5;29094:3;:10;;:34;;;;-1:-1:-1::0;29112:16:0::2;29108:20:::0;::::2;29094:34;29085:56;;;::::0;::::2;::::0;;18464:2:1;29085:56:0::2;::::0;::::2;18446:21:1::0;18503:1;18483:18;;;18476:29;18541:11;18521:18;;;18514:39;18570:18;;29085:56:0::2;18262:332:1::0;29085:56:0::2;29163:63;::::0;;::::2;::::0;::::2;::::0;;::::2;::::0;;::::2;::::0;;;;::::2;;::::0;::::2;::::0;;;29202:15:::2;29163:63:::0;::::2;::::0;;;;;;-1:-1:-1;29163:63:0;;;;;;;;;;;;29150:7:::2;:77:::0;;::::2;::::0;;::::2;::::0;;;;;;;;::::2;::::0;;::::2;::::0;;::::2;::::0;;;;;;;;;::::2;::::0;::::2;::::0;;;::::2;::::0;::::2;::::0;;;;;;;::::2;::::0;::::2;::::0;;;;;;;::::2;::::0;;;;;;;::::2;::::0;;;;;;;;::::2;::::0;;;;;;;;;;29248:14;;29241:39:::2;::::0;29248:16:::2;::::0;::::2;:::i;:::-;29241:39;::::0;;12542:25:1;;;12598:2;12583:18;;12576:34;;;12626:18;;12619:34;;;12684:2;12669:18;;12662:34;;;12529:3;12514:19;29241:39:0::2;12311:391:1::0;35556:369:0;35673:73;;;35690:7;35673:73;;;;15840:19:1;;;;15878:66;35699:5:0;15982:2:1;15978:15;;;15974:24;;15960:12;;;15953:46;35706:11:0;16015:12:1;;;16008:28;35719:11:0;16070:15:1;;16066:24;16052:12;;;16045:46;16144:66;16130:3;16126:16;;;16122:89;16107:13;;;16100:112;35673:73:0;;;;;;;;;16228:13:1;;;;35673:73:0;;;35663:84;;;;;-1:-1:-1;;16126:16:1;35756:141:0;35777:3;35774:1;:6;35756:141;;35834:6;35842:12;35855:1;35842:15;;;;;;;;:::i;:::-;;;;;;;;;;:20;35863:12;:15;;35842:20;;;;;35876:1;;35863:15;;;;;;:::i;:::-;;;;;;;;:22;;;;;;;;;;;;35817:69;;;;;;;;;16724:19:1;;;16781:2;16777:15;;;;16794:66;16773:88;16768:2;16759:12;;16752:110;16900:3;16896:16;16914:66;16892:89;16887:2;16878:12;;16871:111;17007:2;16998:12;;16541:475;35817:69:0;;;;;;;;;;;;;35807:80;;;;;;35798:89;;35781:3;;;;:::i;:::-;;;35756:141;;;-1:-1:-1;35912:6:0;-1:-1:-1;35556:369:0;;;;;:::o;30344:213::-;26920:5;;;;26908:10;:17;26899:39;;;;;;;10028:2:1;26899:39:0;;;10010:21:1;10067:1;10047:18;;;10040:29;10105:11;10085:18;;;10078:39;10134:18;;26899:39:0;9826:332:1;26899:39:0;30430:7:::1;30416:12;;:21;;30407:56;;;::::0;::::1;::::0;;19197:2:1;30407:56:0::1;::::0;::::1;19179:21:1::0;19236:2;19216:18;;;19209:30;19275:24;19255:18;;;19248:52;19317:18;;30407:56:0::1;18995:346:1::0;30407:56:0::1;30479:7;:14:::0;:22;-1:-1:-1;30472:44:0::1;;;30503:7;:13;;;;;;;:::i;:::-;;::::0;;;::::1;::::0;;::::1;::::0;;;;;;::::1;;::::0;;;::::1;;::::0;;;30472:44:::1;;;30530:20;::::0;160:25:1;;;30530:20:0::1;::::0;148:2:1;133:18;30530:20:0::1;;;;;;;;30344:213:::0;:::o;34508:497::-;34574:10;34586:8;34596:12;34619:15;34653:19;;34637:15;:35;;;;:::i;:::-;34692:12;:19;34619:53;;-1:-1:-1;34685:26:0;;:71;;;;;34746:10;34715:12;34728:6;34715:20;;;;;;;;:::i;:::-;;;;;;;;;;:30;;;;;;:41;34685:71;34681:318;;;34776:6;;-1:-1:-1;34808:1:0;34798:9;34804:3;34776:6;34798:9;:::i;:::-;:11;;;;:::i;:::-;34830:12;:19;34794:15;;-1:-1:-1;34825:24:0;;34821:55;;34855:12;:19;:21;;34875:1;;34855:21;:::i;:::-;34851:25;;34821:55;34923:10;34894:12;34907:3;34894:17;;;;;;;;:::i;:::-;;;;;;;;;;:27;;;;;;:39;34888:52;;34935:5;;;;:::i;:::-;;;;34888:52;;;34959:30;34979:5;34985:3;34959:19;:30::i;:::-;34952:37;;34681:318;34610:395;34508:497;;;;;:::o;31840:353::-;26920:5;;;;26908:10;:17;26899:39;;;;;;;10028:2:1;26899:39:0;;;10010:21:1;10067:1;10047:18;;;10040:29;10105:11;10085:18;;;10078:39;10134:18;;26899:39:0;9826:332:1;26899:39:0;24650:3:::1;31936:9;:22;31928:31;;;::::0;::::1;;24707:6;31976:8;:20;31968:29;;;::::0;::::1;;24778:7;32014:8;:20;32006:29;;;::::0;::::1;;32056:8;::::0;32075:7:::1;::::0;32092::::1;::::0;32049:60:::1;::::0;;20023:25:1;;;20079:2;20064:18;;20057:34;;;20107:18;;20100:34;;;;20165:2;20150:18;;20143:34;;;20208:3;20193:19;;20186:35;20252:3;20237:19;;20230:35;;;32049:60:0::1;::::0;20010:3:1;19995:19;32049:60:0::1;;;;;;;32118:8;:18:::0;;;;32145:7:::1;:16:::0;32170:7:::1;:16:::0;31840:353::o;31584:179::-;26920:5;;;;26908:10;:17;26899:39;;;;;;;10028:2:1;26899:39:0;;;10010:21:1;10067:1;10047:18;;;10040:29;10105:11;10085:18;;;10078:39;10134:18;;26899:39:0;9826:332:1;26899:39:0;31676:6:::1;31671:86;31685:16:::0;;::::1;31671:86;;;31719:28;31729:7;;31737:1;31729:10;;;;;;;:::i;:::-;;;;;;;31740:6;31719:9;:28::i;:::-;31702:3;;31671:86;;;;31584:179:::0;;;:::o;32861:262::-;32928:14;;;;32914:10;:28;32906:94;;;;;;;20478:2:1;32906:94:0;;;20460:21:1;20517:2;20497:18;;;20490:30;20556:34;20536:18;;;20529:62;20627:23;20607:18;;;20600:51;20668:19;;32906:94:0;20276:417:1;32906:94:0;33034:14;;;33027:5;;33014:35;;33034:14;;;;;33027:5;;;;33014:35;;;33066:14;;;;33058:22;;;;;;33066:14;;;33058:22;;;;33089:27;;;32861:262::o;30971:67::-;27239:10;27227:23;;;;:11;:23;;;;;;;;;:44;;-1:-1:-1;27266:5:0;;;;27254:10;:17;27227:44;:67;;;-1:-1:-1;27287:7:0;;;;27275:10;:19;27227:67;:95;;;-1:-1:-1;27310:12:0;;;;27298:10;:24;27227:95;27218:122;;;;;;;20900:2:1;27218:122:0;;;20882:21:1;20939:2;20919:18;;;20912:30;20978:16;20958:18;;;20951:44;21012:18;;27218:122:0;20698:338:1;27218:122:0;31019:12:::1;31026:4;31019:6;:12::i;:::-;30971:67::o:0;33133:135::-;26920:5;;;;26908:10;:17;26899:39;;;;;;;10028:2:1;26899:39:0;;;10010:21:1;10067:1;10047:18;;;10040:29;10105:11;10085:18;;;10078:39;10134:18;;26899:39:0;9826:332:1;26899:39:0;33215:7:::1;::::0;33204:30:::1;::::0;::::1;::::0;;::::1;::::0;33215:7:::1;::::0;33204:30:::1;::::0;33215:7:::1;::::0;33204:30:::1;33243:7;:18:::0;;;::::1;;::::0;;;::::1;::::0;;;::::1;::::0;;33133:135::o;35015:296::-;-1:-1:-1;;;;;;;;;;;;;;35112:31:0;;;35190:9;35112:31;35190:3;:9;:::i;:::-;:11;;35200:1;35190:11;:::i;:::-;35172:30;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;;;;;;;;;;;;;35172:30:0;;;;;;;;;;;;;;-1:-1:-1;35152:17:0;;;:50;35223:5;35211:94;35232:3;35229:1;:6;35211:94;;35280:12;35293:1;35280:15;;;;;;;;:::i;:::-;;;;;;;;;;35253:42;;;;;;;;35280:15;;;;35253:42;;;;;;;;;;;;;;;;;;;;;;;;:17;;;;35271:7;35273:5;35271:1;:7;:::i;:::-;35253:26;;;;;;;;:::i;:::-;;;;;;:42;;;;35236:3;;;;:::i;:::-;;;35211:94;;;;35015:296;;;;:::o;24875:33::-;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;24875:33:0;;;;;;;;;;;;:::o;33278:170::-;26920:5;;;;26908:10;:17;26899:39;;;;;;;10028:2:1;26899:39:0;;;10010:21:1;10067:1;10047:18;;;10040:29;10105:11;10085:18;;;10078:39;10134:18;;26899:39:0;9826:332:1;26899:39:0;33375:12:::1;::::0;33359:45:::1;::::0;::::1;::::0;;::::1;::::0;33375:12:::1;::::0;33359:45:::1;::::0;33375:12:::1;::::0;33359:45:::1;33413:12;:28:::0;;;::::1;;::::0;;;::::1;::::0;;;::::1;::::0;;33278:170::o;28447:407::-;28649:11;28663:10;:40;;28696:7;28663:40;;;28676:17;28663:40;28712:89;;;;;28748:10;28712:89;;;21602:34:1;28768:4:0;21652:18:1;;;21645:43;21704:18;;;21697:34;;;21747:18;;;21740:34;;;21823:4;21811:17;;21790:19;;;21783:46;21845:19;;;21838:35;;;21889:19;;;21882:35;;;28649:54:0;;-1:-1:-1;28733:5:0;28712:35;;;;;21513:19:1;;28712:89:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;28810:37;28830:6;28837:9;28810:19;:37::i;:::-;28640:214;28447:407;;;;;;;:::o;24988:22::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;24988:22:0;;;;;;;;;;;;;;;;;;;;;:::o;34133:319::-;34227:4;26920:5;;34233:12;;26920:5;;26908:10;:17;26899:39;;;;;;;10028:2:1;26899:39:0;;;10010:21:1;10067:1;10047:18;;;10040:29;10105:11;10085:18;;;10078:39;10134:18;;26899:39:0;9826:332:1;26899:39:0;34264:15;;;:36:::1;;;34299:1;34283:3;:15;;;:17;34264:36;34256:80;;;::::0;::::1;::::0;;22130:2:1;34256:80:0::1;::::0;::::1;22112:21:1::0;;;22149:18;;;22142:30;22208:34;22188:18;;;22181:62;22260:18;;34256:80:0::1;21928:356:1::0;34256:80:0::1;34346:12;34360:19:::0;34383:3:::1;:8;;34398:6;34406:5;;34383:29;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1::0;34345:67:0;;;;-1:-1:-1;34133:319:0;-1:-1:-1;;;;;;;34133:319:0:o;32203:436::-;26920:5;;;;26908:10;:17;26899:39;;;;;;;10028:2:1;26899:39:0;;;10010:21:1;10067:1;10047:18;;;10040:29;10105:11;10085:18;;;10078:39;10134:18;;26899:39:0;9826:332:1;26899:39:0;32344:4:::1;32322:20;:26;;:60;;;;;32378:4;32352:24;:30;;32322:60;32314:88;;;::::0;::::1;::::0;;22767:2:1;32314:88:0::1;::::0;::::1;22749:21:1::0;22806:2;22786:18;;;22779:30;22845:18;22825;;;22818:46;22881:18;;32314:88:0::1;22565:340:1::0;32314:88:0::1;32434:19;::::0;32455:23:::1;::::0;32416:110:::1;::::0;;12542:25:1;;;12598:2;12583:18;;12576:34;;;;12626:18;;12619:34;;;12684:2;12669:18;;12662:34;;;32416:110:0::1;::::0;12529:3:1;12514:19;32416:110:0::1;;;;;;;32535:19;:40:::0;;;;32584:23:::1;:48:::0;32203:436::o;33628:183::-;26920:5;;;;26908:10;:17;26899:39;;;;;;;10028:2:1;26899:39:0;;;10010:21:1;10067:1;10047:18;;;10040:29;10105:11;10085:18;;;10078:39;10134:18;;26899:39:0;9826:332:1;26899:39:0;33723:22:::1;::::0;::::1;;::::0;;;:16:::1;:22;::::0;;;;;;;;;;::::1;::::0;;::::1;33722:23;33697:48:::0;;;::::1;::::0;::::1;::::0;;;33759:45;;23078:74:1;;;33781:22:0;23195:14:1;23188:22;23168:18;;;23161:50;33759:45:0::1;::::0;23051:18:1;33759:45:0::1;22910:307:1::0;30567:394:0;27239:10;27227:23;;;;:11;:23;;;;;;;;;:44;;-1:-1:-1;27266:5:0;;;;27254:10;:17;27227:44;:67;;;-1:-1:-1;27287:7:0;;;;27275:10;:19;27227:67;:95;;;-1:-1:-1;27310:12:0;;;;27298:10;:24;27227:95;27218:122;;;;;;;20900:2:1;27218:122:0;;;20882:21:1;20939:2;20919:18;;;20912:30;20978:16;20958:18;;;20951:44;21012:18;;27218:122:0;20698:338:1;27218:122:0;30680:4:::1;30657:7;30665;30657:16;;;;;;;;:::i;:::-;;;;;;;;;;;:21;;;:27;30648:50;;;::::0;::::1;::::0;;17223:2:1;30648:50:0::1;::::0;::::1;17205:21:1::0;17262:2;17242:18;;;17235:30;17301:12;17281:18;;;17274:40;17331:18;;30648:50:0::1;17021:334:1::0;30648:50:0::1;30730:7;30716:12;;:21;;30707:56;;;::::0;::::1;::::0;;19197:2:1;30707:56:0::1;::::0;::::1;19179:21:1::0;19236:2;19216:18;;;19209:30;19275:24;19255:18;;;19248:52;19317:18;;30707:56:0::1;18995:346:1::0;30707:56:0::1;30781:7;30789;30781:16;;;;;;;;:::i;:::-;;::::0;;;::::1;::::0;;;::::1;::::0;;::::1;;:23:::0;;;::::1;;;:26:::0;30772:61:::1;;;::::0;::::1;::::0;;23424:2:1;30772:61:0::1;::::0;::::1;23406:21:1::0;23463:2;23443:18;;;23436:30;23502:24;23482:18;;;23475:52;23544:18;;30772:61:0::1;23222:346:1::0;30772:61:0::1;30866:1;30842:7;30850;30842:16;;;;;;;;:::i;:::-;;;;;;;;;;;:23;;;:25;;;;;;;;;;;;;;;;;;30902:12;30909:4;30902:6;:12::i;:::-;30928:26;::::0;;23747:25:1;;;23803:2;23788:18;;23781:34;;;30928:26:0::1;::::0;23720:18:1;30928:26:0::1;;;;;;;;30567:394:::0;;:::o;31048:65::-;26920:5;;;;26908:10;:17;26899:39;;;;;;;10028:2:1;26899:39:0;;;10010:21:1;10067:1;10047:18;;;10040:29;10105:11;10085:18;;;10078:39;10134:18;;26899:39:0;9826:332:1;26899:39:0;31093:13:::1;31100:5;31093:6;:13::i;28348:92::-:0;28393:39;28413:6;28421:10;28393:19;:39::i;:::-;28348:92;:::o;6977:316::-;7142:59;;;7131:10;24018:55:1;;;7142:59:0;;;24000:74:1;24090:18;;;;24083:34;;;7142:59:0;;;;;;;;;;23973:18:1;;;;7142:59:0;;;;;;;;;7165:24;7142:59;;;7131:71;;-1:-1:-1;;;;7131:10:0;;;;:71;;7142:59;7131:71;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;7095:107;;;;7221:7;:57;;;;-1:-1:-1;7233:11:0;;:16;;:44;;;7264:4;7253:24;;;;;;;;;;;;:::i;:::-;7213:72;;;;;;;24872:2:1;7213:72:0;;;24854:21:1;24911:1;24891:18;;;24884:29;24949:4;24929:18;;;24922:32;24971:18;;7213:72:0;24670:325:1;7213:72:0;7084:209;;6977:316;;;:::o;8826:106::-;8884:7;8915:1;8911;:5;:13;;8923:1;8911:13;;;-1:-1:-1;8919:1:0;;8826:106;-1:-1:-1;8826:106:0:o;9008:::-;9066:7;9097:1;9093;:5;:13;;9105:1;9093:13;;6311:367;6516:69;;;6505:10;25281:15:1;;;6516:69:0;;;25263:34:1;25333:15;;;25313:18;;;25306:43;25365:18;;;;25358:34;;;6516:69:0;;;;;;;;;;25175:18:1;;;;6516:69:0;;;;;;;;;6539:28;6516:69;;;6505:81;;-1:-1:-1;;;;6505:10:0;;;;:81;;6516:69;6505:81;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;6456:130;;;;6605:7;:57;;;;-1:-1:-1;6617:11:0;;:16;;:44;;;6648:4;6637:24;;;;;;;;;;;;:::i;:::-;6597:73;;;;;;;25605:2:1;6597:73:0;;;25587:21:1;25644:1;25624:18;;;25617:29;25682:5;25662:18;;;25655:33;25705:18;;6597:73:0;25403:326:1;6597:73:0;6445:233;;6311:367;;;;:::o;31234:231::-;31305:12;;:15;;:52;;;31330:7;31351:1;31338:12;;:14;;;;:::i;:::-;31330:23;;;;;;;;:::i;:::-;;;;;;;;;;;;;;:27;;;;;;31324:33;;31305:52;31296:93;;;;;;;25936:2:1;31296:93:0;;;25918:21:1;25975:2;25955:18;;;25948:30;26014;25994:18;;;25987:58;26062:18;;31296:93:0;25734:352:1;31296:93:0;31398:16;;;;:9;:16;;;;;;;;;:23;;;;;;;;;;;;;31435;;26259:25:1;;;26300:18;;;26293:50;31435:23:0;;26232:18:1;31435:23:0;26091:258:1;31126:97:0;31174:6;:14;;;;;;;;;;;;;31202;;4458:41:1;;;31202:14:0;;4446:2:1;4431:18;31202:14:0;4318:187:1;196:196;264:20;;324:42;313:54;;303:65;;293:93;;382:1;379;372:12;293:93;196:196;;;:::o;397:254::-;465:6;473;526:2;514:9;505:7;501:23;497:32;494:52;;;542:1;539;532:12;494:52;565:29;584:9;565:29;:::i;:::-;555:39;641:2;626:18;;;;613:32;;-1:-1:-1;;;397:254:1:o;656:::-;724:6;732;785:2;773:9;764:7;760:23;756:32;753:52;;;801:1;798;791:12;753:52;837:9;824:23;814:33;;866:38;900:2;889:9;885:18;866:38;:::i;:::-;856:48;;656:254;;;;;:::o;915:118::-;1001:5;994:13;987:21;980:5;977:32;967:60;;1023:1;1020;1013:12;1038:315;1103:6;1111;1164:2;1152:9;1143:7;1139:23;1135:32;1132:52;;;1180:1;1177;1170:12;1132:52;1203:29;1222:9;1203:29;:::i;:::-;1193:39;;1282:2;1271:9;1267:18;1254:32;1295:28;1317:5;1295:28;:::i;:::-;1342:5;1332:15;;;1038:315;;;;;:::o;1358:309::-;1423:6;1431;1484:2;1472:9;1463:7;1459:23;1455:32;1452:52;;;1500:1;1497;1490:12;1452:52;1536:9;1523:23;1513:33;;1596:2;1585:9;1581:18;1568:32;1609:28;1631:5;1609:28;:::i;1672:186::-;1731:6;1784:2;1772:9;1763:7;1759:23;1755:32;1752:52;;;1800:1;1797;1790:12;1752:52;1823:29;1842:9;1823:29;:::i;1863:248::-;1931:6;1939;1992:2;1980:9;1971:7;1967:23;1963:32;1960:52;;;2008:1;2005;1998:12;1960:52;-1:-1:-1;;2031:23:1;;;2101:2;2086:18;;;2073:32;;-1:-1:-1;1863:248:1:o;2361:388::-;2449:6;2502:2;2490:9;2481:7;2477:23;2473:32;2470:52;;;2518:1;2515;2508:12;2470:52;2558:9;2545:23;2591:18;2583:6;2580:30;2577:50;;;2623:1;2620;2613:12;2577:50;2646:22;;2702:2;2684:16;;;2680:25;2677:45;;;2718:1;2715;2708:12;2754:316;2831:6;2839;2847;2900:2;2888:9;2879:7;2875:23;2871:32;2868:52;;;2916:1;2913;2906:12;2868:52;-1:-1:-1;;2939:23:1;;;3009:2;2994:18;;2981:32;;-1:-1:-1;3060:2:1;3045:18;;;3032:32;;2754:316;-1:-1:-1;2754:316:1:o;3257:180::-;3316:6;3369:2;3357:9;3348:7;3344:23;3340:32;3337:52;;;3385:1;3382;3375:12;3337:52;-1:-1:-1;3408:23:1;;3257:180;-1:-1:-1;3257:180:1:o;4510:750::-;4602:6;4610;4618;4671:2;4659:9;4650:7;4646:23;4642:32;4639:52;;;4687:1;4684;4677:12;4639:52;4727:9;4714:23;4756:18;4797:2;4789:6;4786:14;4783:34;;;4813:1;4810;4803:12;4783:34;4851:6;4840:9;4836:22;4826:32;;4896:7;4889:4;4885:2;4881:13;4877:27;4867:55;;4918:1;4915;4908:12;4867:55;4958:2;4945:16;4984:2;4976:6;4973:14;4970:34;;;5000:1;4997;4990:12;4970:34;5055:7;5048:4;5038:6;5035:1;5031:14;5027:2;5023:23;5019:34;5016:47;5013:67;;;5076:1;5073;5066:12;5013:67;5107:4;5099:13;;;;-1:-1:-1;5131:6:1;-1:-1:-1;;5172:20:1;;5159:34;5202:28;5159:34;5202:28;:::i;:::-;5249:5;5239:15;;;4510:750;;;;;:::o;5265:1066::-;5411:4;5440:2;5469;5458:9;5451:21;5491:2;5531;5520:9;5516:18;5576:6;5570:13;5565:2;5554:9;5550:18;5543:41;5631:2;5623:6;5619:15;5613:22;5654:4;5696;5689;5678:9;5674:20;5667:34;5721:6;5756:12;5750:19;5793:6;5785;5778:22;5831:3;5820:9;5816:19;5809:26;;5876:2;5862:12;5858:21;5844:35;;5897:1;5888:10;;5907:398;5921:6;5918:1;5915:13;5907:398;;;5980:13;;6022:9;;6033:42;6018:58;6006:71;;6121:11;;;6115:18;6135;6111:43;6097:12;;;6090:65;6199:11;;6193:18;6213:10;6189:35;6175:12;;;6168:57;6280:15;;;;5943:1;5936:9;;;;;6245:12;;;;5907:398;;;-1:-1:-1;6322:3:1;5265:1066;-1:-1:-1;;;;;;;;5265:1066:1:o;6747:756::-;6855:6;6863;6871;6879;6887;6895;6903;6956:3;6944:9;6935:7;6931:23;6927:33;6924:53;;;6973:1;6970;6963:12;6924:53;7009:9;6996:23;6986:33;;7038:38;7072:2;7061:9;7057:18;7038:38;:::i;:::-;7028:48;;7123:2;7112:9;7108:18;7095:32;7085:42;;7177:2;7166:9;7162:18;7149:32;7190:28;7212:5;7190:28;:::i;:::-;7237:5;-1:-1:-1;7294:3:1;7279:19;;7266:33;7343:4;7330:18;;7318:31;;7308:59;;7363:1;7360;7353:12;7308:59;6747:756;;;;-1:-1:-1;6747:756:1;;;;7386:7;7440:3;7425:19;;7412:33;;-1:-1:-1;7492:3:1;7477:19;;;7464:33;;6747:756;-1:-1:-1;;6747:756:1:o;8041:733::-;8129:6;8137;8145;8153;8206:2;8194:9;8185:7;8181:23;8177:32;8174:52;;;8222:1;8219;8212:12;8174:52;8245:29;8264:9;8245:29;:::i;:::-;8235:39;;8321:2;8310:9;8306:18;8293:32;8283:42;;8376:2;8365:9;8361:18;8348:32;8399:18;8440:2;8432:6;8429:14;8426:34;;;8456:1;8453;8446:12;8426:34;8494:6;8483:9;8479:22;8469:32;;8539:7;8532:4;8528:2;8524:13;8520:27;8510:55;;8561:1;8558;8551:12;8510:55;8601:2;8588:16;8627:2;8619:6;8616:14;8613:34;;;8643:1;8640;8633:12;8613:34;8688:7;8683:2;8674:6;8670:2;8666:15;8662:24;8659:37;8656:57;;;8709:1;8706;8699:12;8656:57;8041:733;;;;-1:-1:-1;;8740:2:1;8732:11;;-1:-1:-1;;;8041:733:1:o;8779:250::-;8864:1;8874:113;8888:6;8885:1;8882:13;8874:113;;;8964:11;;;8958:18;8945:11;;;8938:39;8910:2;8903:10;8874:113;;;-1:-1:-1;;9021:1:1;9003:16;;8996:27;8779:250::o;9034:534::-;9217:6;9210:14;9203:22;9192:9;9185:41;9262:2;9257;9246:9;9242:18;9235:30;9166:4;9294:6;9288:13;9337:6;9332:2;9321:9;9317:18;9310:34;9353:79;9425:6;9420:2;9409:9;9405:18;9400:2;9392:6;9388:15;9353:79;:::i;:::-;9484:2;9472:15;9489:66;9468:88;9453:104;;;;9559:2;9449:113;;9034:534;-1:-1:-1;;;9034:534:1:o;10850:184::-;10902:77;10899:1;10892:88;10999:4;10996:1;10989:15;11023:4;11020:1;11013:15;11039:274;11079:1;11105;11095:189;;11140:77;11137:1;11130:88;11241:4;11238:1;11231:15;11269:4;11266:1;11259:15;11095:189;-1:-1:-1;11298:9:1;;11039:274::o;11318:168::-;11391:9;;;11422;;11439:15;;;11433:22;;11419:37;11409:71;;11460:18;;:::i;12178:128::-;12245:9;;;12266:11;;;12263:37;;;12280:18;;:::i;12707:184::-;12759:77;12756:1;12749:88;12856:4;12853:1;12846:15;12880:4;12877:1;12870:15;12896:125;12961:9;;;12982:10;;;12979:36;;;12995:18;;:::i;13026:195::-;13065:3;13096:66;13089:5;13086:77;13083:103;;13166:18;;:::i;:::-;-1:-1:-1;13213:1:1;13202:13;;13026:195::o;14255:638::-;14379:4;14385:6;14445:11;14432:25;14535:66;14524:8;14508:14;14504:29;14500:102;14480:18;14476:127;14466:155;;14617:1;14614;14607:12;14466:155;14644:33;;14696:20;;;-1:-1:-1;14739:18:1;14728:30;;14725:50;;;14771:1;14768;14761:12;14725:50;14804:4;14792:17;;-1:-1:-1;14863:4:1;14851:17;;14835:14;14831:38;14821:49;;14818:69;;;14883:1;14880;14873:12;14818:69;14255:638;;;;;:::o;16252:284::-;16310:6;16363:2;16351:9;16342:7;16338:23;16334:32;16331:52;;;16379:1;16376;16369:12;16331:52;16418:9;16405:23;16468:18;16461:5;16457:30;16450:5;16447:41;16437:69;;16502:1;16499;16492:12;18077:180;18144:18;18182:10;;;18194;;;18178:27;;18217:11;;;18214:37;;;18231:18;;:::i;19346:184::-;19398:77;19395:1;19388:88;19495:4;19492:1;19485:15;19519:4;19516:1;19509:15;19535:196;19574:3;19602:5;19592:39;;19611:18;;:::i;:::-;-1:-1:-1;19658:66:1;19647:78;;19535:196::o;21041:184::-;21093:77;21090:1;21083:88;21190:4;21187:1;21180:15;21214:4;21211:1;21204:15;22289:271;22472:6;22464;22459:3;22446:33;22428:3;22498:16;;22523:13;;;22498:16;22289:271;-1:-1:-1;22289:271:1:o;24128:287::-;24257:3;24295:6;24289:13;24311:66;24370:6;24365:3;24358:4;24350:6;24346:17;24311:66;:::i;:::-;24393:16;;;;;24128:287;-1:-1:-1;;24128:287:1:o;24420:245::-;24487:6;24540:2;24528:9;24519:7;24515:23;24511:32;24508:52;;;24556:1;24553;24546:12;24508:52;24588:9;24582:16;24607:28;24629:5;24607:28;:::i
Swarm Source
ipfs://295475025cbe3a698c2aca619caedc853e1dd3d95957b5d820e26cd249b364a4
Loading...
Loading
Loading...
Loading
Multichain Portfolio | 30 Chains
Chain | Token | Portfolio % | Price | Amount | Value |
---|---|---|---|---|---|
ETH | 100.00% | $1.09 | 761,673.2017 | $829,462.12 |
Loading...
Loading
[ Download: CSV Export ]
A contract address hosts a smart contract, which is a set of code stored on the blockchain that runs when predetermined conditions are met. Learn more about addresses in our Knowledge Base.