Source Code
Latest 25 from a total of 573 transactions
| Transaction Hash |
Method
|
Block
|
From
|
To
|
|||||
|---|---|---|---|---|---|---|---|---|---|
| Kill Order | 150668505 | 729 days ago | IN | 0 ETH | 0.00007274 | ||||
| New Order | 150650897 | 729 days ago | IN | 2.5 ETH | 0.00016167 | ||||
| Kill Order | 142712180 | 754 days ago | IN | 0 ETH | 0.00002659 | ||||
| New Order | 142698222 | 754 days ago | IN | 0 ETH | 0.00007842 | ||||
| New Order | 142697004 | 754 days ago | IN | 0 ETH | 0.00005685 | ||||
| Kill Order | 130478215 | 793 days ago | IN | 0 ETH | 0.00004348 | ||||
| New Order | 130476535 | 793 days ago | IN | 14.976 ETH | 0.0001262 | ||||
| Kill Order | 120141374 | 826 days ago | IN | 0 ETH | 0.00005292 | ||||
| New Order | 120135033 | 826 days ago | IN | 0 ETH | 0.00013523 | ||||
| New Order | 120129004 | 826 days ago | IN | 0 ETH | 0.00011509 | ||||
| Kill Order | 104144990 | 874 days ago | IN | 0 ETH | 0.0000618 | ||||
| New Order | 103468668 | 876 days ago | IN | 0 ETH | 0.00012126 | ||||
| New Order | 103468137 | 876 days ago | IN | 0 ETH | 0.00011051 | ||||
| New Order | 101856505 | 881 days ago | IN | 0 ETH | 0.00008559 | ||||
| New Order | 101856349 | 881 days ago | IN | 0 ETH | 0.00008498 | ||||
| Kill Order | 91075138 | 913 days ago | IN | 0 ETH | 0.00014881 | ||||
| New Order | 84493078 | 932 days ago | IN | 0 ETH | 0.00017 | ||||
| New Order | 84492329 | 932 days ago | IN | 0 ETH | 0.00017 | ||||
| New Order | 84492200 | 932 days ago | IN | 0 ETH | 0.00017 | ||||
| New Order | 84487298 | 932 days ago | IN | 0 ETH | 0.00012538 | ||||
| New Order | 84487218 | 932 days ago | IN | 0 ETH | 0.00012941 | ||||
| New Order | 84272519 | 933 days ago | IN | 0 ETH | 0.00018797 | ||||
| New Order | 84272305 | 933 days ago | IN | 0 ETH | 0.00017 | ||||
| New Order | 84271319 | 933 days ago | IN | 0 ETH | 0.00016369 | ||||
| New Order | 83943064 | 934 days ago | IN | 0 ETH | 0.00015798 |
Latest 25 internal transactions (View All)
| Parent Transaction Hash | Block | From | To | |||
|---|---|---|---|---|---|---|
| 150650897 | 729 days ago | 2.5 ETH | ||||
| 130476535 | 793 days ago | 14.976 ETH | ||||
| 73582487 | 964 days ago | 32 ETH | ||||
| 73562962 | 964 days ago | 0.8 ETH | ||||
| 72228084 | 968 days ago | 4.95 ETH | ||||
| 72211525 | 968 days ago | 2.97 ETH | ||||
| 72211269 | 968 days ago | 2.475 ETH | ||||
| 72179312 | 968 days ago | 2.97 ETH | ||||
| 71800440 | 969 days ago | 0 ETH | ||||
| 71800440 | 969 days ago | 0 ETH | ||||
| 71800440 | 969 days ago | 0 ETH | ||||
| 71800440 | 969 days ago | 0 ETH | ||||
| 71800440 | 969 days ago | 0 ETH | ||||
| 71800440 | 969 days ago | 0 ETH | ||||
| 71800440 | 969 days ago | 0 ETH | ||||
| 71800440 | 969 days ago | 0 ETH | ||||
| 71800440 | 969 days ago | 0 ETH | ||||
| 71800440 | 969 days ago | 0 ETH | ||||
| 71800440 | 969 days ago | 0 ETH | ||||
| 71800440 | 969 days ago | 0 ETH | ||||
| 71800440 | 969 days ago | 0 ETH | ||||
| 71793114 | 969 days ago | 0 ETH | ||||
| 71793114 | 969 days ago | 0 ETH | ||||
| 71793114 | 969 days ago | 0 ETH | ||||
| 71793114 | 969 days ago | 0 ETH |
Cross-Chain Transactions
Loading...
Loading
Contract Name:
TZWAP
Compiler Version
v0.8.7+commit.e28d00a7
Optimization Enabled:
No with 200 runs
Other Settings:
default evmVersion
Contract Source Code (Solidity Standard Json-Input format)
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.7;
/**
*
..................................................................
. .
. :::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: .
. :::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: .
. :::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: .
. :::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: .
. ::::::::::::::::::::--:.......:-==--:...::==:::::::::::::::: .
. ::::::::::::::::::--. .:::.:--+=::::::--::-:::::::::::::: .
. :::::::::::::::::+: ::. .:--+=-===:..:--=-:::::::::::: .
. :::::::::::::::-- .. .:-----=--. .:-=-:---:::::::::: .
. ::::::::::::::-. .-::::.:+=====-=::---===--.:-::::::::: .
. :::::::::::::-. ...:...::::==+===::+=:-:::===:-=-==-:::::: .
. ::::::::::::=:. :..: ...---=-:::--=-:-=--::..:---+-::::: .
. :::::::::::=:.. .::---...#+*@%%@-...:-==--=+*@@#-.:-=+:::::: .
. ::::::::::--..........::-%%#@=.%# --=--:@+@#.+. +:::::: .
. ::::::::::=..........:--:.-=*#%@= ..=-=:-@#%@%%:.:-=:::::: .
. :::::::::-+=--:...:-:....-=========--:-=+**+:....::=-::::::: .
. ::::::::--+==-:::-:..:::::------::--:..:::.-:. ::::=-:::::: .
. ::::::::= ---. .:::..::::::--:-==--:::--:... .. :+=::::: .
. :::::::-: .:-:.:=++=-:::::::--=---------:.. ... .:--:*#-:::: .
. ::::::-=.. ::..-----=-::::---:--=---==--:..:. :---=*#=::::: .
. :::::-: - ....::. .:::::=*####*****++====--++*##%-:::::: .
. ::::-. :::....:. .::::::+######################+:::::: .
. :::-. .------:::::::::======+####################+::::::: .
. ::-#=. --++=-:=:::::-======++++*****+++++++=--:=:::::::: .
. ::#@@@%+: :: .-==-----*====::--:::-:: .:.:...:-=:::::::: .
. :=@@@@@@@@#- --:...--++=-+....:..-*=-....:-::::-%@%+:::::: .
. :%@@@@@@@@@:::...:-=+-:. .--::-::..:+=:. :==-.:: @@@@@*-::: .
. =@@@@@@@@@+. .:..---:...:=:*@@@@@@@@@@@@@@@@@@@@+.@@@@@@@+:: .
. %@@@@@@@@@:.. .::::--:..:%@@@@@@@@@@@@@@@@@@@@@@#@@@@@@@@#- .
. @@@@@@@@%- .:::.:=#@=:%@@@#-. -=:-=+*%@@@@@@@@@@@@@@@@ .
. @@@@@@@@@.. :#@@@@@%-:+@@. .. =-+%@@@@@@@@@@@@@@@@. .
. @@@@@@@@@%:... :@@@@@@@@@@@@@= :.:%@@@@@@@@@@@@@@@@@@@@. .
. @@@@@@@@@@@%+-:-*#@@@@@@@@@@@@@@#- .. -@@@@@@@@@@@@@@@@@@@@. .
. @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@%. :. #@@@@@@@@@@@@@@@@@@@@. .
. .
..................................................................
████████╗███████╗██╗ ██╗ █████╗ ██████╗
╚══██╔══╝╚══███╔╝██║ ██║██╔══██╗██╔══██╗
██║ ███╔╝ ██║ █╗ ██║███████║██████╔╝
██║ ███╔╝ ██║███╗██║██╔══██║██╔═══╝
██║ ███████╗╚███╔███╔╝██║ ██║██║
╚═╝ ╚══════╝ ╚══╝╚══╝ ╚═╝ ╚═╝╚═╝
TZWAP: On-chain TWAP Service
*/
import {Pausable} from '@openzeppelin/contracts/security/Pausable.sol';
import {Ownable} from '@openzeppelin/contracts/access/Ownable.sol';
import {Math} from "@openzeppelin/contracts/utils/math/Math.sol";
import {I1inchAggregationRouterV4} from './interfaces/I1inchAggregationRouterV4.sol';
import {IChainlinkOracle} from './interfaces/IChainlinkOracle.sol';
import {ICustomPriceOracle} from './interfaces/ICustomPriceOracle.sol';
import {IWETH9} from './interfaces/IWETH9.sol';
import {IERC20} from'./interfaces/IERC20.sol';
import {ISafeERC20} from './interfaces/ISafeERC20.sol';
contract TZWAP is Ownable, Pausable {
using ISafeERC20 for IERC20;
I1inchAggregationRouterV4 public aggregationRouterV4;
IWETH9 public weth;
// Min TWAP interval in seconds
uint public minInterval = 60;
// Min number of intervals for a TWAP order
uint public minNumOfIntervals = 3;
// Precision for all % math
uint public percentagePrecision = 10 ** 5;
// Auto-incrementing of orders
uint public orderCount;
// TWAP orders mapped to auto-incrementing ID
mapping (uint => TWAPOrder) public orders;
// IDs of TWAP orders for a certain user address
mapping (address => uint[]) public userOrders;
// Fills for TWAP orders
mapping (uint => Fill[]) public fills;
// Token addresses mapped to oracles
mapping (address => Oracle) public oracles;
// Whitelisted addresses who can interact with fillOrder
mapping (address => bool) public whitelist;
// If true only whitelisted addresses can interact with fillOrder
bool public isWhitelistActive;
struct Oracle {
// Address of oracle
address oracleAddress;
// Toggled to false if oracle is not chainlink
bool isChainlink;
}
struct TWAPOrder {
// Order creator
address creator;
// Token to swap from
address srcToken;
// Token to swap to
address dstToken;
// How often a swap should be made
uint interval;
// srcToken to swap per interval
uint tickSize;
// Total srcToken to swap
uint total;
// Min fees in % to be paid per swap interval
uint minFees;
// Max fees in % to be paid per swap interval
uint maxFees;
// Creation timestamp
uint created;
// Toggled to true when an order is killed
bool killed;
}
struct Fill {
// Address that called fill
address filler;
// Amount of ticks filled
uint ticksFilled;
// Amount of srcToken spent
uint srcTokensSwapped;
// Amount of dstToken received
uint dstTokensReceived;
// Fees collected
uint fees;
// Time of last fill
uint timestamp;
}
// 1inch swaps structs
struct swapParams {
address caller;
I1inchAggregationRouterV4.SwapDescription desc;
bytes data;
}
struct unoswapParams {
address srcToken;
uint256 amount;
uint256 minReturn;
bytes32[] pools;
}
struct uniswapV3Params {
uint256 amount;
uint256 minReturn;
uint256[] pools;
}
event LogNewOrder(uint id);
event LogNewFill(uint id, uint fillIndex);
event LogOrderKilled(uint id);
constructor(
address payable _aggregationRouterV4Address,
address payable _wethAddress
) {
aggregationRouterV4 = I1inchAggregationRouterV4(_aggregationRouterV4Address);
weth = IWETH9(_wethAddress);
isWhitelistActive = true;
}
receive() external payable {}
/**
* Creates a new TWAP order
* @param order Order params
* @return Whether order was created
*/
function newOrder(
TWAPOrder memory order
)
payable
public
whenNotPaused
returns (bool) {
require(order.srcToken != address(0), "Invalid srcToken address");
require(order.dstToken != address(0), "Invalid dstToken address");
require(order.interval >= minInterval, "Invalid interval");
require(order.tickSize > 0, "Invalid tickSize");
require(order.total > order.tickSize && order.total % order.tickSize == 0, "Invalid total");
require(order.total / order.tickSize > minNumOfIntervals, "Number of intervals is too less");
order.creator = msg.sender;
order.created = block.timestamp;
order.killed = false;
if (order.srcToken == 0xEeeeeEeeeEeEeeEeEeEeeEEEeeeeEeeeeeeeEEeE) {
require(msg.value == order.total, "Invalid msg value");
weth.deposit{value: msg.value}();
order.srcToken = address(weth);
}
else {
require(IERC20(order.srcToken).transferFrom(msg.sender, address(this), order.total));
}
require(oracles[order.srcToken].oracleAddress != address(0) && oracles[order.dstToken].oracleAddress != address(0), "Oracle is missing");
orders[orderCount++] = order;
userOrders[msg.sender].push(orderCount - 1);
emit LogNewOrder(orderCount - 1);
return true;
}
/**
* Fills an active order
* @param id Order ID
* @param swapType 0: swap() 1: unoswap() 2: uniswapV3SwapTo()
* @param _swapParams Default 1inch swap
* @param _unoswapParams 1inch swap through only sushi or uni v2
* @param _uniswapV3Params 1inch swap through only uni v3
* @return Whether order was filled
*/
function fillOrder(
uint id,
uint swapType,
swapParams calldata _swapParams,
unoswapParams calldata _unoswapParams,
uniswapV3Params calldata _uniswapV3Params
)
public
whenNotPaused
returns (uint) {
if (isWhitelistActive)
require(whitelist[msg.sender] == true, "Not whitelisted");
require(orders[id].created != 0, "Invalid order");
require(!orders[id].killed, "Order was killed");
require(getSrcTokensSwappedForOrder(id) < orders[id].total, "Order is already filled");
uint ticksToFill = getTicksToFill(id);
require(ticksToFill > 0, "Interval must pass before next fill");
// store it before we update array
uint timeElapsed = getTimeElapsedSinceLastFill(id);
fills[id].push(
Fill({
filler: msg.sender,
ticksFilled: ticksToFill,
srcTokensSwapped: 0, // Update after swap
dstTokensReceived: 0, // Update after swap
fees: 0, // Update after swap
timestamp: block.timestamp
})
);
_executeSwap(id, ticksToFill, swapType, _swapParams, _unoswapParams, _uniswapV3Params);
_setFeesAndDistribute(id, timeElapsed);
emit LogNewFill(id, fills[id].length - 1);
return fills[id][fills[id].length - 1].fees;
}
/**
* Execute post-swap checks and updates
*/
function _ensureSwapValidityAndUpdate(
uint id,
uint256 srcTokensSwapped,
uint256 dstTokensReceived
)
internal {
// Estimate amount to receive using oracles
uint srcTokenPriceInUsd;
uint dstTokenPriceInUsd;
if (oracles[orders[id].srcToken].isChainlink)
srcTokenPriceInUsd = uint(IChainlinkOracle(oracles[orders[id].srcToken].oracleAddress).latestAnswer());
else
srcTokenPriceInUsd = ICustomPriceOracle(oracles[orders[id].srcToken].oracleAddress).getPriceInUSD();
if (oracles[orders[id].dstToken].isChainlink)
dstTokenPriceInUsd = uint(IChainlinkOracle(oracles[orders[id].dstToken].oracleAddress).latestAnswer());
else
dstTokenPriceInUsd = ICustomPriceOracle(oracles[orders[id].dstToken].oracleAddress).getPriceInUSD();
// 10% max slippage
uint srcTokenDecimals = IERC20(orders[id].srcToken).decimals();
uint dstTokenDecimals = IERC20(orders[id].dstToken).decimals();
uint minDstTokenReceived = (900 * srcTokensSwapped * srcTokenPriceInUsd * (10 ** dstTokenDecimals)) / (1000 * dstTokenPriceInUsd * (10 ** srcTokenDecimals));
require(dstTokensReceived > minDstTokenReceived, "Tokens received are not enough");
fills[id][fills[id].length - 1].srcTokensSwapped = srcTokensSwapped;
fills[id][fills[id].length - 1].dstTokensReceived = dstTokensReceived;
}
/**
* Set fees and distribute
*/
function _setFeesAndDistribute(
uint id,
uint timeElapsed
)
internal {
uint timeElapsedSinceCallable;
if (fills[id].length > 1)
timeElapsedSinceCallable = timeElapsed - orders[id].interval;
else
timeElapsedSinceCallable = timeElapsed;
uint minFeesAmount = (fills[id][fills[id].length - 1].dstTokensReceived / fills[id][fills[id].length - 1].ticksFilled) * orders[id].minFees / percentagePrecision;
uint maxFeesAmount = (fills[id][fills[id].length - 1].dstTokensReceived / fills[id][fills[id].length - 1].ticksFilled) * orders[id].maxFees / percentagePrecision;
fills[id][fills[id].length - 1].fees = Math.min(maxFeesAmount, minFeesAmount * ((1000 + timeElapsedSinceCallable / 6) / 1000));
// minFees + 0.1% every 6 secs
IERC20(orders[id].dstToken).safeTransfer(
msg.sender,
fills[id][fills[id].length - 1].fees
);
IERC20(orders[id].dstToken).safeTransfer(
orders[id].creator,
fills[id][fills[id].length - 1].dstTokensReceived - fills[id][fills[id].length - 1].fees
);
}
/**
* Execute swap
*/
function _executeSwap(
uint id,
uint ticksToFill,
uint swapType,
swapParams calldata _swapParams,
unoswapParams calldata _unoswapParams,
uniswapV3Params calldata _uniswapV3Params
) internal {
uint preSwapSrcTokenBalance = IERC20(orders[id].srcToken).balanceOf(address(this));
uint preSwapDstTokenBalance = IERC20(orders[id].dstToken).balanceOf(address(this));
if (IERC20(orders[id].srcToken).allowance(address(this), address(aggregationRouterV4)) == 0)
IERC20(orders[id].srcToken).safeIncreaseAllowance(address(aggregationRouterV4), 2**256 - 1);
if (swapType == 0) aggregationRouterV4.swap(_swapParams.caller, _swapParams.desc, _swapParams.data);
else if (swapType == 1) aggregationRouterV4.unoswap(_unoswapParams.srcToken, _unoswapParams.amount, _unoswapParams.minReturn, _unoswapParams.pools);
else aggregationRouterV4.uniswapV3Swap(_uniswapV3Params.amount, _uniswapV3Params.minReturn, _uniswapV3Params.pools);
uint256 srcTokensSwapped = preSwapSrcTokenBalance - IERC20(orders[id].srcToken).balanceOf(address(this));
uint256 dstTokensReceived = IERC20(orders[id].dstToken).balanceOf(address(this)) - preSwapDstTokenBalance;
_ensureSwapValidityAndUpdate(id, srcTokensSwapped, dstTokensReceived);
require(srcTokensSwapped == ticksToFill * orders[id].tickSize, "Invalid amount");
require(getSrcTokensSwappedForOrder(id) <= orders[id].total, "Overbought");
}
/**
* Kills an active order
* @param id Order ID
* @return Whether order was killed
*/
function killOrder(
uint id
)
public
whenNotPaused
returns (bool) {
require(msg.sender == orders[id].creator, "Invalid sender");
require(!orders[id].killed, "Order already killed");
orders[id].killed = true;
IERC20(orders[id].srcToken).safeTransfer(
orders[id].creator,
orders[id].total - getSrcTokensSwappedForOrder(id)
);
emit LogOrderKilled(id);
return true;
}
/**
* Returns total DST tokens received for an order
* @param id Order ID
* @return Total DST tokens received for an order
*/
function getDstTokensReceivedForOrder(uint id)
public
view
returns (uint) {
require(orders[id].created != 0, "Invalid order");
uint dstTokensReceived = 0;
for (uint i = 0; i < fills[id].length; i++)
dstTokensReceived += fills[id][i].dstTokensReceived;
return dstTokensReceived;
}
/**
* Returns seconds passed since last fill
* @param id Order ID
* @return number of seconds
*/
function getTimeElapsedSinceLastFill(uint id)
public
view
returns (uint) {
uint timeElapsed;
if (fills[id].length > 0) {
timeElapsed = block.timestamp - fills[id][fills[id].length - 1].timestamp;
} else
timeElapsed = block.timestamp - orders[id].created;
return timeElapsed;
}
/**
* Returns total SRC tokens received for an order
* @param id Order ID
* @return Total SRC tokens received for an order
*/
function getSrcTokensSwappedForOrder(uint id)
public
view
returns (uint) {
require(orders[id].created != 0, "Invalid order");
uint srcTokensSwapped = 0;
for (uint i = 0; i < fills[id].length; i++)
srcTokensSwapped += fills[id][i].srcTokensSwapped;
return srcTokensSwapped;
}
/**
* Returns total number of ticks filled of a certain order
* @param id Order ID
* @return number of ticks filled
*/
function getTicksFilled(uint id)
public
view
returns (uint) {
require(orders[id].created != 0, "Invalid order");
uint ticksFilled = 0;
for (uint i = 0; i < fills[id].length; i++)
ticksFilled += fills[id][i].ticksFilled;
return ticksFilled;
}
/**
* Get the number of ticks that is possible to fill
* @param id Order ID
* @return number of ticks that can be filled
*/
function getTicksToFill(uint id)
public view
returns (uint) {
uint timeElapsed = getTimeElapsedSinceLastFill(id);
uint ticksToFill = timeElapsed / orders[id].interval;
uint ticksFilled = getTicksFilled(id);
uint maxTicksFillable = (orders[id].total / orders[id].tickSize) - ticksFilled;
if (ticksToFill >= maxTicksFillable) return maxTicksFillable;
else return ticksToFill;
}
/**
* Get the required amount of token that is possible to swap
* @param id Order ID
* @return amount of srcToken that can be swapped
*/
function getSrcTokensToSwap(uint id)
public view
returns (uint) {
return getTicksToFill(id) * orders[id].tickSize;
}
/**
* Returns whether an order is active
* @param id Order ID
* @return Whether order is active
*/
function isOrderActive(uint id)
public
view
returns (bool) {
return orders[id].created != 0 &&
!orders[id].killed &&
getSrcTokensSwappedForOrder(id) < orders[id].total;
}
function addOracle(address token, Oracle memory oracle)
public
onlyOwner
{
// This is required to make it impossible to exploit 1inch params even for contract owner
require(oracles[token].oracleAddress == address(0), "Oracles cannot be updated");
oracles[token] = oracle;
}
function toggleWhitelist(bool value)
public
onlyOwner
{
isWhitelistActive = value;
}
function addToWhitelist(address authorized)
public
onlyOwner
{
whitelist[authorized] = true;
}
function removeFromWhitelist(address authorized)
public
onlyOwner
{
whitelist[authorized] = false;
}
}// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.1 (security/Pausable.sol)
pragma solidity ^0.8.0;
import "../utils/Context.sol";
/**
* @dev Contract module which allows children to implement an emergency stop
* mechanism that can be triggered by an authorized account.
*
* This module is used through inheritance. It will make available the
* modifiers `whenNotPaused` and `whenPaused`, which can be applied to
* the functions of your contract. Note that they will not be pausable by
* simply including this module, only once the modifiers are put in place.
*/
abstract contract Pausable is Context {
/**
* @dev Emitted when the pause is triggered by `account`.
*/
event Paused(address account);
/**
* @dev Emitted when the pause is lifted by `account`.
*/
event Unpaused(address account);
bool private _paused;
/**
* @dev Initializes the contract in unpaused state.
*/
constructor() {
_paused = false;
}
/**
* @dev Returns true if the contract is paused, and false otherwise.
*/
function paused() public view virtual returns (bool) {
return _paused;
}
/**
* @dev Modifier to make a function callable only when the contract is not paused.
*
* Requirements:
*
* - The contract must not be paused.
*/
modifier whenNotPaused() {
require(!paused(), "Pausable: paused");
_;
}
/**
* @dev Modifier to make a function callable only when the contract is paused.
*
* Requirements:
*
* - The contract must be paused.
*/
modifier whenPaused() {
require(paused(), "Pausable: not paused");
_;
}
/**
* @dev Triggers stopped state.
*
* Requirements:
*
* - The contract must not be paused.
*/
function _pause() internal virtual whenNotPaused {
_paused = true;
emit Paused(_msgSender());
}
/**
* @dev Returns to normal state.
*
* Requirements:
*
* - The contract must be paused.
*/
function _unpause() internal virtual whenPaused {
_paused = false;
emit Unpaused(_msgSender());
}
}// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.1 (access/Ownable.sol)
pragma solidity ^0.8.0;
import "../utils/Context.sol";
/**
* @dev Contract module which provides a basic access control mechanism, where
* there is an account (an owner) that can be granted exclusive access to
* specific functions.
*
* By default, the owner account will be the one that deploys the contract. This
* can later be changed with {transferOwnership}.
*
* This module is used through inheritance. It will make available the modifier
* `onlyOwner`, which can be applied to your functions to restrict their use to
* the owner.
*/
abstract contract Ownable is Context {
address private _owner;
event OwnershipTransferred(address indexed previousOwner, address indexed newOwner);
/**
* @dev Initializes the contract setting the deployer as the initial owner.
*/
constructor() {
_transferOwnership(_msgSender());
}
/**
* @dev Returns the address of the current owner.
*/
function owner() public view virtual returns (address) {
return _owner;
}
/**
* @dev Throws if called by any account other than the owner.
*/
modifier onlyOwner() {
require(owner() == _msgSender(), "Ownable: caller is not the owner");
_;
}
/**
* @dev Leaves the contract without owner. It will not be possible to call
* `onlyOwner` functions anymore. Can only be called by the current owner.
*
* NOTE: Renouncing ownership will leave the contract without an owner,
* thereby removing any functionality that is only available to the owner.
*/
function renounceOwnership() public virtual onlyOwner {
_transferOwnership(address(0));
}
/**
* @dev Transfers ownership of the contract to a new account (`newOwner`).
* Can only be called by the current owner.
*/
function transferOwnership(address newOwner) public virtual onlyOwner {
require(newOwner != address(0), "Ownable: new owner is the zero address");
_transferOwnership(newOwner);
}
/**
* @dev Transfers ownership of the contract to a new account (`newOwner`).
* Internal function without access restriction.
*/
function _transferOwnership(address newOwner) internal virtual {
address oldOwner = _owner;
_owner = newOwner;
emit OwnershipTransferred(oldOwner, newOwner);
}
}// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v4.5.0) (utils/math/Math.sol)
pragma solidity ^0.8.0;
/**
* @dev Standard math utilities missing in the Solidity language.
*/
library Math {
/**
* @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 / b + (a % b == 0 ? 0 : 1);
}
}// SPDX-License-Identifier: UNLICENSED
pragma solidity >=0.7.0 <0.9.0;
pragma experimental ABIEncoderV2;
interface I1inchAggregationRouterV4 {
struct SwapDescription {
address srcToken;
address dstToken;
address srcReceiver;
address dstReceiver;
uint256 amount;
uint256 minReturnAmount;
uint256 flags;
bytes permit;
}
event OrderFilledRFQ(bytes32 orderHash,uint256 makingAmount) ;
event OwnershipTransferred(address indexed previousOwner,address indexed newOwner) ;
event Swapped(address sender,address srcToken,address dstToken,address dstReceiver,uint256 spentAmount,uint256 returnAmount) ;
function DOMAIN_SEPARATOR() external view returns (bytes32) ;
function LIMIT_ORDER_RFQ_TYPEHASH() external view returns (bytes32) ;
function cancelOrderRFQ(uint256 orderInfo) external;
function destroy() external;
function fillOrderRFQ(LimitOrderProtocolRFQ.OrderRFQ memory order,bytes memory signature,uint256 makingAmount,uint256 takingAmount) external payable returns (uint256 , uint256) ;
function fillOrderRFQTo(LimitOrderProtocolRFQ.OrderRFQ memory order,bytes memory signature,uint256 makingAmount,uint256 takingAmount,address target) external payable returns (uint256 , uint256) ;
function fillOrderRFQToWithPermit(LimitOrderProtocolRFQ.OrderRFQ memory order,bytes memory signature,uint256 makingAmount,uint256 takingAmount,address target,bytes memory permit) external returns (uint256 , uint256) ;
function invalidatorForOrderRFQ(address maker,uint256 slot) external view returns (uint256) ;
function owner() external view returns (address) ;
function renounceOwnership() external;
function rescueFunds(address token,uint256 amount) external;
function swap(address caller,SwapDescription memory desc,bytes memory data) external payable returns (uint256 returnAmount, uint256 gasLeft);
function transferOwnership(address newOwner) external;
function uniswapV3Swap(uint256 amount,uint256 minReturn,uint256[] memory pools) external payable returns (uint256 returnAmount) ;
function uniswapV3SwapCallback(int256 amount0Delta,int256 amount1Delta,bytes memory ) external;
function uniswapV3SwapTo(address recipient,uint256 amount,uint256 minReturn,uint256[] memory pools) external payable returns (uint256 returnAmount) ;
function uniswapV3SwapToWithPermit(address recipient,address srcToken,uint256 amount,uint256 minReturn,uint256[] memory pools,bytes memory permit) external returns (uint256 returnAmount) ;
function unoswap(address srcToken,uint256 amount,uint256 minReturn,bytes32[] memory pools) external payable returns (uint256 returnAmount) ;
function unoswapWithPermit(address srcToken,uint256 amount,uint256 minReturn,bytes32[] memory pools,bytes memory permit) external returns (uint256 returnAmount) ;
receive () external payable;
}
interface LimitOrderProtocolRFQ {
struct OrderRFQ {
uint256 info;
address makerAsset;
address takerAsset;
address maker;
address allowedSender;
uint256 makingAmount;
uint256 takingAmount;
}
}// SPDX-License-Identifier: Unlicensed
pragma solidity >=0.7.0 <0.9.0;
interface IChainlinkOracle {
function latestAnswer() external view returns (int256);
}// SPDX-License-Identifier: Unlicensed
pragma solidity >=0.7.0 <0.9.0;
interface ICustomPriceOracle {
function getPriceInUSD() external returns (uint256);
}// SPDX-License-Identifier: Apache-2.0
pragma solidity >=0.7.0 <0.9.0;
interface IWETH9 {
function deposit() external payable;
}// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v4.5.0) (token/ERC20/IERC20.sol)
pragma solidity ^0.8.0;
/**
* @dev Interface of the ERC20 standard as defined in the EIP.
*/
interface IERC20 {
/**
* @dev Returns the decimals.
*/
function decimals() external view returns (uint256);
/**
* @dev Returns the amount of tokens in existence.
*/
function totalSupply() external view returns (uint256);
/**
* @dev Returns the amount of tokens owned by `account`.
*/
function balanceOf(address account) external view returns (uint256);
/**
* @dev Moves `amount` tokens from the caller's account to `to`.
*
* Returns a boolean value indicating whether the operation succeeded.
*
* Emits a {Transfer} event.
*/
function transfer(address to, uint256 amount) external returns (bool);
/**
* @dev Returns the remaining number of tokens that `spender` will be
* allowed to spend on behalf of `owner` through {transferFrom}. This is
* zero by default.
*
* This value changes when {approve} or {transferFrom} are called.
*/
function allowance(address owner, address spender) external view returns (uint256);
/**
* @dev Sets `amount` as the allowance of `spender` over the caller's tokens.
*
* Returns a boolean value indicating whether the operation succeeded.
*
* IMPORTANT: Beware that changing an allowance with this method brings the risk
* that someone may use both the old and the new allowance by unfortunate
* transaction ordering. One possible solution to mitigate this race
* condition is to first reduce the spender's allowance to 0 and set the
* desired value afterwards:
* https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729
*
* Emits an {Approval} event.
*/
function approve(address spender, uint256 amount) external returns (bool);
/**
* @dev Moves `amount` tokens from `from` to `to` using the
* allowance mechanism. `amount` is then deducted from the caller's
* allowance.
*
* Returns a boolean value indicating whether the operation succeeded.
*
* Emits a {Transfer} event.
*/
function transferFrom(
address from,
address to,
uint256 amount
) external returns (bool);
/**
* @dev Emitted when `value` tokens are moved from one account (`from`) to
* another (`to`).
*
* Note that `value` may be zero.
*/
event Transfer(address indexed from, address indexed to, uint256 value);
/**
* @dev Emitted when the allowance of a `spender` for an `owner` is set by
* a call to {approve}. `value` is the new allowance.
*/
event Approval(address indexed owner, address indexed spender, uint256 value);
}// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.1
pragma solidity ^0.8.0;
import "./IERC20.sol";
import "./IAddress.sol";
/**
* @title SafeERC20
* @dev Wrappers around ERC20 operations that throw on failure (when the token
* contract returns false). Tokens that return no value (and instead revert or
* throw on failure) are also supported, non-reverting calls are assumed to be
* successful.
* To use this library you can add a `using SafeERC20 for IERC20;` statement to your contract,
* which allows you to call the safe operations as `token.safeTransfer(...)`, etc.
*/
library ISafeERC20 {
using Address for address;
function safeTransfer(
IERC20 token,
address to,
uint256 value
) internal {
_callOptionalReturn(token, abi.encodeWithSelector(token.transfer.selector, to, value));
}
function safeTransferFrom(
IERC20 token,
address from,
address to,
uint256 value
) internal {
_callOptionalReturn(token, abi.encodeWithSelector(token.transferFrom.selector, from, to, value));
}
/**
* @dev Deprecated. This function has issues similar to the ones found in
* {IERC20-approve}, and its usage is discouraged.
*
* Whenever possible, use {safeIncreaseAllowance} and
* {safeDecreaseAllowance} instead.
*/
function safeApprove(
IERC20 token,
address spender,
uint256 value
) internal {
// safeApprove should only be called when setting an initial allowance,
// or when resetting it to zero. To increase and decrease it, use
// 'safeIncreaseAllowance' and 'safeDecreaseAllowance'
require(
(value == 0) || (token.allowance(address(this), spender) == 0),
"SafeERC20: approve from non-zero to non-zero allowance"
);
_callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, value));
}
function safeIncreaseAllowance(
IERC20 token,
address spender,
uint256 value
) internal {
uint256 newAllowance = token.allowance(address(this), spender) + value;
_callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, newAllowance));
}
function safeDecreaseAllowance(
IERC20 token,
address spender,
uint256 value
) internal {
unchecked {
uint256 oldAllowance = token.allowance(address(this), spender);
require(oldAllowance >= value, "SafeERC20: decreased allowance below zero");
uint256 newAllowance = oldAllowance - value;
_callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, newAllowance));
}
}
/**
* @dev Imitates a Solidity high-level call (i.e. a regular function call to a contract), relaxing the requirement
* on the return value: the return value is optional (but if data is returned, it must not be false).
* @param token The token targeted by the call.
* @param data The call data (encoded using abi.encode or one of its variants).
*/
function _callOptionalReturn(IERC20 token, bytes memory data) private {
// We need to perform a low level call here, to bypass Solidity's return data size checking mechanism, since
// we're implementing it ourselves. We use {Address.functionCall} to perform this call, which verifies that
// the target address contains contract code and also asserts for success in the low-level call.
bytes memory returndata = address(token).functionCall(data, "SafeERC20: low-level call failed");
if (returndata.length > 0) {
// Return data is optional
require(abi.decode(returndata, (bool)), "SafeERC20: ERC20 operation did not succeed");
}
}
}// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.1 (utils/Context.sol)
pragma solidity ^0.8.0;
/**
* @dev Provides information about the current execution context, including the
* sender of the transaction and its data. While these are generally available
* via msg.sender and msg.data, they should not be accessed in such a direct
* manner, since when dealing with meta-transactions the account sending and
* paying for execution may not be the actual sender (as far as an application
* is concerned).
*
* This contract is only required for intermediate, library-like contracts.
*/
abstract contract Context {
function _msgSender() internal view virtual returns (address) {
return msg.sender;
}
function _msgData() internal view virtual returns (bytes calldata) {
return msg.data;
}
}// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v4.5.0)
pragma solidity ^0.8.1;
/**
* @dev Collection of functions related to the address type
*/
library Address {
/**
* @dev Returns true if `account` is a contract.
*
* [IMPORTANT]
* ====
* It is unsafe to assume that an address for which this function returns
* false is an externally-owned account (EOA) and not a contract.
*
* Among others, `isContract` will return false for the following
* types of addresses:
*
* - an externally-owned account
* - a contract in construction
* - an address where a contract will be created
* - an address where a contract lived, but was destroyed
* ====
*
* [IMPORTANT]
* ====
* You shouldn't rely on `isContract` to protect against flash loan attacks!
*
* Preventing calls from contracts is highly discouraged. It breaks composability, breaks support for smart wallets
* like Gnosis Safe, and does not provide security since it can be circumvented by calling from a contract
* constructor.
* ====
*/
function isContract(address account) internal view returns (bool) {
// This method relies on extcodesize/address.code.length, which returns 0
// for contracts in construction, since the code is only stored at the end
// of the constructor execution.
return account.code.length > 0;
}
/**
* @dev Replacement for Solidity's `transfer`: sends `amount` wei to
* `recipient`, forwarding all available gas and reverting on errors.
*
* https://eips.ethereum.org/EIPS/eip-1884[EIP1884] increases the gas cost
* of certain opcodes, possibly making contracts go over the 2300 gas limit
* imposed by `transfer`, making them unable to receive funds via
* `transfer`. {sendValue} removes this limitation.
*
* https://diligence.consensys.net/posts/2019/09/stop-using-soliditys-transfer-now/[Learn more].
*
* IMPORTANT: because control is transferred to `recipient`, care must be
* taken to not create reentrancy vulnerabilities. Consider using
* {ReentrancyGuard} or the
* https://solidity.readthedocs.io/en/v0.5.11/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern].
*/
function sendValue(address payable recipient, uint256 amount) internal {
require(address(this).balance >= amount, "Address: insufficient balance");
(bool success, ) = recipient.call{value: amount}("");
require(success, "Address: unable to send value, recipient may have reverted");
}
/**
* @dev Performs a Solidity function call using a low level `call`. A
* plain `call` is an unsafe replacement for a function call: use this
* function instead.
*
* If `target` reverts with a revert reason, it is bubbled up by this
* function (like regular Solidity function calls).
*
* Returns the raw returned data. To convert to the expected return value,
* use https://solidity.readthedocs.io/en/latest/units-and-global-variables.html?highlight=abi.decode#abi-encoding-and-decoding-functions[`abi.decode`].
*
* Requirements:
*
* - `target` must be a contract.
* - calling `target` with `data` must not revert.
*
* _Available since v3.1._
*/
function functionCall(address target, bytes memory data) internal returns (bytes memory) {
return functionCall(target, data, "Address: low-level call failed");
}
/**
* @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], but with
* `errorMessage` as a fallback revert reason when `target` reverts.
*
* _Available since v3.1._
*/
function functionCall(
address target,
bytes memory data,
string memory errorMessage
) internal returns (bytes memory) {
return functionCallWithValue(target, data, 0, errorMessage);
}
/**
* @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],
* but also transferring `value` wei to `target`.
*
* Requirements:
*
* - the calling contract must have an ETH balance of at least `value`.
* - the called Solidity function must be `payable`.
*
* _Available since v3.1._
*/
function functionCallWithValue(
address target,
bytes memory data,
uint256 value
) internal returns (bytes memory) {
return functionCallWithValue(target, data, value, "Address: low-level call with value failed");
}
/**
* @dev Same as {xref-Address-functionCallWithValue-address-bytes-uint256-}[`functionCallWithValue`], but
* with `errorMessage` as a fallback revert reason when `target` reverts.
*
* _Available since v3.1._
*/
function functionCallWithValue(
address target,
bytes memory data,
uint256 value,
string memory errorMessage
) internal returns (bytes memory) {
require(address(this).balance >= value, "Address: insufficient balance for call");
require(isContract(target), "Address: call to non-contract");
(bool success, bytes memory returndata) = target.call{value: value}(data);
return verifyCallResult(success, returndata, errorMessage);
}
/**
* @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],
* but performing a static call.
*
* _Available since v3.3._
*/
function functionStaticCall(address target, bytes memory data) internal view returns (bytes memory) {
return functionStaticCall(target, data, "Address: low-level static call failed");
}
/**
* @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`],
* but performing a static call.
*
* _Available since v3.3._
*/
function functionStaticCall(
address target,
bytes memory data,
string memory errorMessage
) internal view returns (bytes memory) {
require(isContract(target), "Address: static call to non-contract");
(bool success, bytes memory returndata) = target.staticcall(data);
return verifyCallResult(success, returndata, errorMessage);
}
/**
* @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],
* but performing a delegate call.
*
* _Available since v3.4._
*/
function functionDelegateCall(address target, bytes memory data) internal returns (bytes memory) {
return functionDelegateCall(target, data, "Address: low-level delegate call failed");
}
/**
* @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`],
* but performing a delegate call.
*
* _Available since v3.4._
*/
function functionDelegateCall(
address target,
bytes memory data,
string memory errorMessage
) internal returns (bytes memory) {
require(isContract(target), "Address: delegate call to non-contract");
(bool success, bytes memory returndata) = target.delegatecall(data);
return verifyCallResult(success, returndata, errorMessage);
}
/**
* @dev Tool to verifies that a low level call was successful, and revert if it wasn't, either by bubbling the
* revert reason using the provided one.
*
* _Available since v4.3._
*/
function verifyCallResult(
bool success,
bytes memory returndata,
string memory errorMessage
) internal pure returns (bytes memory) {
if (success) {
return returndata;
} else {
// Look for revert reason and bubble it up if present
if (returndata.length > 0) {
// The easiest way to bubble the revert reason is using memory via assembly
assembly {
let returndata_size := mload(returndata)
revert(add(32, returndata), returndata_size)
}
} else {
revert(errorMessage);
}
}
}
}{
"optimizer": {
"enabled": false,
"runs": 200
},
"outputSelection": {
"*": {
"*": [
"evm.bytecode",
"evm.deployedBytecode",
"devdoc",
"userdoc",
"metadata",
"abi"
]
}
},
"metadata": {
"useLiteralContent": true
},
"libraries": {}
}Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
Contract ABI
API[{"inputs":[{"internalType":"address payable","name":"_aggregationRouterV4Address","type":"address"},{"internalType":"address payable","name":"_wethAddress","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"id","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"fillIndex","type":"uint256"}],"name":"LogNewFill","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"id","type":"uint256"}],"name":"LogNewOrder","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"id","type":"uint256"}],"name":"LogOrderKilled","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"account","type":"address"}],"name":"Paused","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"account","type":"address"}],"name":"Unpaused","type":"event"},{"inputs":[{"internalType":"address","name":"token","type":"address"},{"components":[{"internalType":"address","name":"oracleAddress","type":"address"},{"internalType":"bool","name":"isChainlink","type":"bool"}],"internalType":"struct TZWAP.Oracle","name":"oracle","type":"tuple"}],"name":"addOracle","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"authorized","type":"address"}],"name":"addToWhitelist","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"aggregationRouterV4","outputs":[{"internalType":"contract I1inchAggregationRouterV4","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"id","type":"uint256"},{"internalType":"uint256","name":"swapType","type":"uint256"},{"components":[{"internalType":"address","name":"caller","type":"address"},{"components":[{"internalType":"address","name":"srcToken","type":"address"},{"internalType":"address","name":"dstToken","type":"address"},{"internalType":"address","name":"srcReceiver","type":"address"},{"internalType":"address","name":"dstReceiver","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"uint256","name":"minReturnAmount","type":"uint256"},{"internalType":"uint256","name":"flags","type":"uint256"},{"internalType":"bytes","name":"permit","type":"bytes"}],"internalType":"struct I1inchAggregationRouterV4.SwapDescription","name":"desc","type":"tuple"},{"internalType":"bytes","name":"data","type":"bytes"}],"internalType":"struct TZWAP.swapParams","name":"_swapParams","type":"tuple"},{"components":[{"internalType":"address","name":"srcToken","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"uint256","name":"minReturn","type":"uint256"},{"internalType":"bytes32[]","name":"pools","type":"bytes32[]"}],"internalType":"struct TZWAP.unoswapParams","name":"_unoswapParams","type":"tuple"},{"components":[{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"uint256","name":"minReturn","type":"uint256"},{"internalType":"uint256[]","name":"pools","type":"uint256[]"}],"internalType":"struct TZWAP.uniswapV3Params","name":"_uniswapV3Params","type":"tuple"}],"name":"fillOrder","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"}],"name":"fills","outputs":[{"internalType":"address","name":"filler","type":"address"},{"internalType":"uint256","name":"ticksFilled","type":"uint256"},{"internalType":"uint256","name":"srcTokensSwapped","type":"uint256"},{"internalType":"uint256","name":"dstTokensReceived","type":"uint256"},{"internalType":"uint256","name":"fees","type":"uint256"},{"internalType":"uint256","name":"timestamp","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"id","type":"uint256"}],"name":"getDstTokensReceivedForOrder","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"id","type":"uint256"}],"name":"getSrcTokensSwappedForOrder","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"id","type":"uint256"}],"name":"getSrcTokensToSwap","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"id","type":"uint256"}],"name":"getTicksFilled","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"id","type":"uint256"}],"name":"getTicksToFill","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"id","type":"uint256"}],"name":"getTimeElapsedSinceLastFill","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"id","type":"uint256"}],"name":"isOrderActive","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"isWhitelistActive","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"id","type":"uint256"}],"name":"killOrder","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"minInterval","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"minNumOfIntervals","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"components":[{"internalType":"address","name":"creator","type":"address"},{"internalType":"address","name":"srcToken","type":"address"},{"internalType":"address","name":"dstToken","type":"address"},{"internalType":"uint256","name":"interval","type":"uint256"},{"internalType":"uint256","name":"tickSize","type":"uint256"},{"internalType":"uint256","name":"total","type":"uint256"},{"internalType":"uint256","name":"minFees","type":"uint256"},{"internalType":"uint256","name":"maxFees","type":"uint256"},{"internalType":"uint256","name":"created","type":"uint256"},{"internalType":"bool","name":"killed","type":"bool"}],"internalType":"struct TZWAP.TWAPOrder","name":"order","type":"tuple"}],"name":"newOrder","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"oracles","outputs":[{"internalType":"address","name":"oracleAddress","type":"address"},{"internalType":"bool","name":"isChainlink","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"orderCount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"orders","outputs":[{"internalType":"address","name":"creator","type":"address"},{"internalType":"address","name":"srcToken","type":"address"},{"internalType":"address","name":"dstToken","type":"address"},{"internalType":"uint256","name":"interval","type":"uint256"},{"internalType":"uint256","name":"tickSize","type":"uint256"},{"internalType":"uint256","name":"total","type":"uint256"},{"internalType":"uint256","name":"minFees","type":"uint256"},{"internalType":"uint256","name":"maxFees","type":"uint256"},{"internalType":"uint256","name":"created","type":"uint256"},{"internalType":"bool","name":"killed","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"paused","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"percentagePrecision","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"authorized","type":"address"}],"name":"removeFromWhitelist","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"value","type":"bool"}],"name":"toggleWhitelist","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"uint256","name":"","type":"uint256"}],"name":"userOrders","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"weth","outputs":[{"internalType":"contract IWETH9","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"whitelist","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"stateMutability":"payable","type":"receive"}]Contract Creation Code
6080604052603c6003556003600455620186a06005553480156200002257600080fd5b50604051620060193803806200601983398181016040528101906200004891906200020a565b620000686200005c6200012760201b60201c565b6200012f60201b60201c565b60008060146101000a81548160ff02191690831515021790555081600160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555080600260006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506001600c60006101000a81548160ff0219169083151502179055505050620002a4565b600033905090565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050816000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b60008151905062000204816200028a565b92915050565b6000806040838503121562000224576200022362000285565b5b60006200023485828601620001f3565b92505060206200024785828601620001f3565b9150509250929050565b60006200025e8262000265565b9050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b600080fd5b620002958162000251565b8114620002a157600080fd5b50565b615d6580620002b46000396000f3fe6080604052600436106101d15760003560e01c806372fac185116100f75780639b19251a11610095578063d6e4358511610064578063d6e435851461070d578063e43252d71461074a578063e5c59acc14610773578063f2fde38b146107b0576101d8565b80639b19251a1461061c578063a85c38ef14610659578063addd50991461069f578063c8811424146106dd576101d8565b8063856652e9116100d1578063856652e9146105605780638ab1d6811461059d5780638da5cb5b146105c65780639a98d723146105f1576101d8565b806372fac185146104b85780637dca72b7146104f557806380e3f1ad14610537576101d8565b80633fb19a531161016f578063629859541161013e57806362985954146103fe57806365c619a0146104275780637014758014610464578063715018a6146104a1576101d8565b80633fb19a53146103525780633fc8cef31461037d578063524513d6146103a85780635c975abb146103d3576101d8565b80632abaa90d116101ab5780632abaa90d146102705780632f70aba6146102ad5780633401e168146102ea5780633aa1fba014610315576101d8565b806310cab287146101dd578063189523831461021a5780632453ffa814610245576101d8565b366101d857005b600080fd5b3480156101e957600080fd5b5061020460048036038101906101ff9190614214565b6107d9565b6040516102119190615008565b60405180910390f35b34801561022657600080fd5b5061022f61080c565b60405161023c9190615008565b60405180910390f35b34801561025157600080fd5b5061025a610812565b6040516102679190615008565b60405180910390f35b34801561027c57600080fd5b5061029760048036038101906102929190614214565b610818565b6040516102a49190615008565b60405180910390f35b3480156102b957600080fd5b506102d460048036038101906102cf91906142ee565b6108d3565b6040516102e19190615008565b60405180910390f35b3480156102f657600080fd5b506102ff610d17565b60405161030c9190614c90565b60405180910390f35b34801561032157600080fd5b5061033c60048036038101906103379190614214565b610d3d565b6040516103499190615008565b60405180910390f35b34801561035e57600080fd5b50610367610de5565b6040516103749190615008565b60405180910390f35b34801561038957600080fd5b50610392610deb565b60405161039f9190614cab565b60405180910390f35b3480156103b457600080fd5b506103bd610e11565b6040516103ca9190614c75565b60405180910390f35b3480156103df57600080fd5b506103e8610e24565b6040516103f59190614c75565b60405180910390f35b34801561040a57600080fd5b50610425600480360381019061042091906140df565b610e3a565b005b34801561043357600080fd5b5061044e60048036038101906104499190614214565b611035565b60405161045b9190614c75565b60405180910390f35b34801561047057600080fd5b5061048b60048036038101906104869190614214565b6112b6565b6040516104989190615008565b60405180910390f35b3480156104ad57600080fd5b506104b6611394565b005b3480156104c457600080fd5b506104df60048036038101906104da9190614214565b61141c565b6040516104ec9190615008565b60405180910390f35b34801561050157600080fd5b5061051c6004803603810190610517919061426e565b6114fa565b60405161052e96959493929190614c14565b60405180910390f35b34801561054357600080fd5b5061055e6004803603810190610559919061415f565b611573565b005b34801561056c57600080fd5b506105876004803603810190610582919061411f565b61160c565b6040516105949190615008565b60405180910390f35b3480156105a957600080fd5b506105c460048036038101906105bf91906140b2565b61163d565b005b3480156105d257600080fd5b506105db611714565b6040516105e89190614a16565b60405180910390f35b3480156105fd57600080fd5b5061060661173d565b6040516106139190615008565b60405180910390f35b34801561062857600080fd5b50610643600480360381019061063e91906140b2565b611743565b6040516106509190614c75565b60405180910390f35b34801561066557600080fd5b50610680600480360381019061067b9190614214565b611763565b6040516106969a99989796959493929190614a5a565b60405180910390f35b3480156106ab57600080fd5b506106c660048036038101906106c191906140b2565b611824565b6040516106d4929190614b2d565b60405180910390f35b6106f760048036038101906106f291906141e6565b611875565b6040516107049190614c75565b60405180910390f35b34801561071957600080fd5b50610734600480360381019061072f9190614214565b6120f8565b6040516107419190614c75565b60405180910390f35b34801561075657600080fd5b50610771600480360381019061076c91906140b2565b612171565b005b34801561077f57600080fd5b5061079a60048036038101906107959190614214565b612248565b6040516107a79190615008565b60405180910390f35b3480156107bc57600080fd5b506107d760048036038101906107d291906140b2565b612326565b005b600060076000838152602001908152602001600020600401546107fb83610d3d565b6108059190615502565b9050919050565b60055481565b60065481565b6000806000600960008581526020019081526020016000208054905011156108a5576009600084815260200190815260200160002060016009600086815260200190815260200160002080549050610870919061555c565b8154811061088157610880615787565b5b9060005260206000209060060201600501544261089e919061555c565b90506108ca565b6007600084815260200190815260200160002060080154426108c7919061555c565b90505b80915050919050565b60006108dd610e24565b1561091d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161091490614e08565b60405180910390fd5b600c60009054906101000a900460ff16156109c65760011515600b60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff161515146109c5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016109bc90614e88565b60405180910390fd5b5b600060076000888152602001908152602001600020600801541415610a20576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a1790614f48565b60405180910390fd5b6007600087815260200190815260200160002060090160009054906101000a900460ff1615610a84576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a7b90614d48565b60405180910390fd5b6007600087815260200190815260200160002060050154610aa48761141c565b10610ae4576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610adb90614f68565b60405180910390fd5b6000610aef87610d3d565b905060008111610b34576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b2b90614d88565b60405180910390fd5b6000610b3f88610818565b9050600960008981526020019081526020016000206040518060c001604052803373ffffffffffffffffffffffffffffffffffffffff16815260200184815260200160008152602001600081526020016000815260200142815250908060018154018082558091505060019003906000526020600020906006020160009091909190915060008201518160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506020820151816001015560408201518160020155606082015181600301556080820151816004015560a082015181600501555050610c4c88838989898961241e565b610c568882612c53565b7f1f91c68e5e487ae44284d7bb543bb2b2a08ab9eeedcaacfdbb05d139d2cbc476886001600960008c815260200190815260200160002080549050610c9b919061555c565b604051610ca9929190615023565b60405180910390a1600960008981526020019081526020016000206001600960008b815260200190815260200160002080549050610ce7919061555c565b81548110610cf857610cf7615787565b5b9060005260206000209060060201600401549250505095945050505050565b600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600080610d4983610818565b90506000600760008581526020019081526020016000206003015482610d6f9190615360565b90506000610d7c85612248565b905060008160076000888152602001908152602001600020600401546007600089815260200190815260200160002060050154610db99190615360565b610dc3919061555c565b9050808310610dd85780945050505050610de0565b829450505050505b919050565b60035481565b600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600c60009054906101000a900460ff1681565b60008060149054906101000a900460ff16905090565b610e42613126565b73ffffffffffffffffffffffffffffffffffffffff16610e60611714565b73ffffffffffffffffffffffffffffffffffffffff1614610eb6576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ead90614ec8565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff16600a60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614610f87576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f7e90614f08565b60405180910390fd5b80600a60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008201518160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060208201518160000160146101000a81548160ff0219169083151502179055509050505050565b600061103f610e24565b1561107f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161107690614e08565b60405180910390fd5b6007600083815260200190815260200160002060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614611123576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161111a90614e28565b60405180910390fd5b6007600083815260200190815260200160002060090160009054906101000a900460ff1615611187576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161117e90614f28565b60405180910390fd5b60016007600084815260200190815260200160002060090160006101000a81548160ff0219169083151502179055506112766007600084815260200190815260200160002060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff166111f98461141c565b600760008681526020019081526020016000206005015461121a919061555c565b6007600086815260200190815260200160002060010160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1661312e9092919063ffffffff16565b7f385de1741c5fb03f2ddd3eaec93f254b96de98c5dfc112e95989dde06ed5c2d6826040516112a59190615008565b60405180910390a160019050919050565b60008060076000848152602001908152602001600020600801541415611311576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161130890614f48565b60405180910390fd5b6000805b600960008581526020019081526020016000208054905081101561138a5760096000858152602001908152602001600020818154811061135857611357615787565b5b90600052602060002090600602016003015482611375919061530a565b91508080611382906156af565b915050611315565b5080915050919050565b61139c613126565b73ffffffffffffffffffffffffffffffffffffffff166113ba611714565b73ffffffffffffffffffffffffffffffffffffffff1614611410576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161140790614ec8565b60405180910390fd5b61141a60006131b4565b565b60008060076000848152602001908152602001600020600801541415611477576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161146e90614f48565b60405180910390fd5b6000805b60096000858152602001908152602001600020805490508110156114f0576009600085815260200190815260200160002081815481106114be576114bd615787565b5b906000526020600020906006020160020154826114db919061530a565b915080806114e8906156af565b91505061147b565b5080915050919050565b6009602052816000526040600020818154811061151657600080fd5b9060005260206000209060060201600091509150508060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16908060010154908060020154908060030154908060040154908060050154905086565b61157b613126565b73ffffffffffffffffffffffffffffffffffffffff16611599611714565b73ffffffffffffffffffffffffffffffffffffffff16146115ef576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115e690614ec8565b60405180910390fd5b80600c60006101000a81548160ff02191690831515021790555050565b6008602052816000526040600020818154811061162857600080fd5b90600052602060002001600091509150505481565b611645613126565b73ffffffffffffffffffffffffffffffffffffffff16611663611714565b73ffffffffffffffffffffffffffffffffffffffff16146116b9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116b090614ec8565b60405180910390fd5b6000600b60008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555050565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b60045481565b600b6020528060005260406000206000915054906101000a900460ff1681565b60076020528060005260406000206000915090508060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16908060010160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16908060020160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16908060030154908060040154908060050154908060060154908060070154908060080154908060090160009054906101000a900460ff1690508a565b600a6020528060005260406000206000915090508060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16908060000160149054906101000a900460ff16905082565b600061187f610e24565b156118bf576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016118b690614e08565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff16826020015173ffffffffffffffffffffffffffffffffffffffff161415611933576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161192a90614ce8565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff16826040015173ffffffffffffffffffffffffffffffffffffffff1614156119a7576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161199e90614e68565b60405180910390fd5b600354826060015110156119f0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016119e790614ee8565b60405180910390fd5b6000826080015111611a37576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a2e90614ea8565b60405180910390fd5b81608001518260a00151118015611a615750600082608001518360a00151611a5f91906156f8565b145b611aa0576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a9790614e48565b60405180910390fd5b60045482608001518360a00151611ab79190615360565b11611af7576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611aee90614fe8565b60405180910390fd5b33826000019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff1681525050428261010001818152505060008261012001901515908115158152505073eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee73ffffffffffffffffffffffffffffffffffffffff16826020015173ffffffffffffffffffffffffffffffffffffffff161415611cc0578160a001513414611bde576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611bd590614fa8565b60405180910390fd5b600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663d0e30db0346040518263ffffffff1660e01b81526004016000604051808303818588803b158015611c4857600080fd5b505af1158015611c5c573d6000803e3d6000fd5b5050505050600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16826020019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff1681525050611d61565b816020015173ffffffffffffffffffffffffffffffffffffffff166323b872dd33308560a001516040518463ffffffff1660e01b8152600401611d0593929190614af6565b602060405180830381600087803b158015611d1f57600080fd5b505af1158015611d33573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611d57919061418c565b611d6057600080fd5b5b600073ffffffffffffffffffffffffffffffffffffffff16600a6000846020015173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614158015611e975750600073ffffffffffffffffffffffffffffffffffffffff16600a6000846040015173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614155b611ed6576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ecd90614de8565b60405180910390fd5b816007600060066000815480929190611eee906156af565b91905055815260200190815260200160002060008201518160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060208201518160010160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060408201518160020160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550606082015181600301556080820151816004015560a0820151816005015560c0820151816006015560e0820151816007015561010082015181600801556101208201518160090160006101000a81548160ff021916908315150217905550905050600860003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206001600654612084919061555c565b90806001815401808255809150506001900390600052602060002001600090919091909150557fea4cfac72390cc8468db408bfef1590948a245bb7335778497567d7b87cf09cb60016006546120da919061555c565b6040516120e79190615008565b60405180910390a160019050919050565b60008060076000848152602001908152602001600020600801541415801561214157506007600083815260200190815260200160002060090160009054906101000a900460ff16155b801561216a575060076000838152602001908152602001600020600501546121688361141c565b105b9050919050565b612179613126565b73ffffffffffffffffffffffffffffffffffffffff16612197611714565b73ffffffffffffffffffffffffffffffffffffffff16146121ed576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016121e490614ec8565b60405180910390fd5b6001600b60008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555050565b600080600760008481526020019081526020016000206008015414156122a3576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161229a90614f48565b60405180910390fd5b6000805b600960008581526020019081526020016000208054905081101561231c576009600085815260200190815260200160002081815481106122ea576122e9615787565b5b90600052602060002090600602016001015482612307919061530a565b91508080612314906156af565b9150506122a7565b5080915050919050565b61232e613126565b73ffffffffffffffffffffffffffffffffffffffff1661234c611714565b73ffffffffffffffffffffffffffffffffffffffff16146123a2576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161239990614ec8565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415612412576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161240990614d28565b60405180910390fd5b61241b816131b4565b50565b60006007600088815260200190815260200160002060010160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b815260040161248f9190614a16565b60206040518083038186803b1580156124a757600080fd5b505afa1580156124bb573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906124df9190614241565b905060006007600089815260200190815260200160002060020160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b81526004016125529190614a16565b60206040518083038186803b15801561256a57600080fd5b505afa15801561257e573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906125a29190614241565b90506000600760008a815260200190815260200160002060010160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663dd62ed3e30600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff166040518363ffffffff1660e01b8152600401612639929190614a31565b60206040518083038186803b15801561265157600080fd5b505afa158015612665573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906126899190614241565b141561273357612732600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff167fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600760008c815260200190815260200160002060010160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166132789092919063ffffffff16565b5b600086141561282457600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16637c02520086600001602081019061278d91906140b2565b87806020019061279d91906151b5565b8880604001906127ad9190615152565b6040518563ffffffff1660e01b81526004016127cc9493929190614b56565b6040805180830381600087803b1580156127e557600080fd5b505af11580156127f9573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061281d91906142ae565b50506129dc565b600186141561291057600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16632e95b6c885600001602081019061287e91906140b2565b86602001358760400135888060600190612898919061508c565b6040518663ffffffff1660e01b81526004016128b8959493929190614bc6565b602060405180830381600087803b1580156128d257600080fd5b505af11580156128e6573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061290a9190614241565b506129db565b600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663e449022e8460000135856020013586806040019061296891906150ef565b6040518563ffffffff1660e01b8152600401612987949392919061504c565b602060405180830381600087803b1580156129a157600080fd5b505af11580156129b5573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906129d99190614241565b505b5b6000600760008a815260200190815260200160002060010160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b8152600401612a4d9190614a16565b60206040518083038186803b158015612a6557600080fd5b505afa158015612a79573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612a9d9190614241565b83612aa8919061555c565b9050600082600760008c815260200190815260200160002060020160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b8152600401612b1c9190614a16565b60206040518083038186803b158015612b3457600080fd5b505afa158015612b48573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612b6c9190614241565b612b76919061555c565b9050612b838a8383613399565b600760008b81526020019081526020016000206004015489612ba59190615502565b8214612be6576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612bdd90614d68565b60405180910390fd5b600760008b815260200190815260200160002060050154612c068b61141c565b1115612c47576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612c3e90614dc8565b60405180910390fd5b50505050505050505050565b6000600160096000858152602001908152602001600020805490501115612c9d57600760008481526020019081526020016000206003015482612c96919061555c565b9050612ca1565b8190505b600060055460076000868152602001908152602001600020600601546009600087815260200190815260200160002060016009600089815260200190815260200160002080549050612cf3919061555c565b81548110612d0457612d03615787565b5b906000526020600020906006020160010154600960008881526020019081526020016000206001600960008a815260200190815260200160002080549050612d4c919061555c565b81548110612d5d57612d5c615787565b5b906000526020600020906006020160030154612d799190615360565b612d839190615502565b612d8d9190615360565b905060006005546007600087815260200190815260200160002060070154600960008881526020019081526020016000206001600960008a815260200190815260200160002080549050612de1919061555c565b81548110612df257612df1615787565b5b906000526020600020906006020160010154600960008981526020019081526020016000206001600960008b815260200190815260200160002080549050612e3a919061555c565b81548110612e4b57612e4a615787565b5b906000526020600020906006020160030154612e679190615360565b612e719190615502565b612e7b9190615360565b9050612eb8816103e8600686612e919190615360565b6103e8612e9e919061530a565b612ea89190615360565b84612eb39190615502565b613bfb565b6009600087815260200190815260200160002060016009600089815260200190815260200160002080549050612eee919061555c565b81548110612eff57612efe615787565b5b906000526020600020906006020160040181905550612fcd33600960008881526020019081526020016000206001600960008a815260200190815260200160002080549050612f4e919061555c565b81548110612f5f57612f5e615787565b5b9060005260206000209060060201600401546007600089815260200190815260200160002060020160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1661312e9092919063ffffffff16565b61311f6007600087815260200190815260200160002060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16600960008881526020019081526020016000206001600960008a81526020019081526020016000208054905061303d919061555c565b8154811061304e5761304d615787565b5b906000526020600020906006020160040154600960008981526020019081526020016000206001600960008b815260200190815260200160002080549050613096919061555c565b815481106130a7576130a6615787565b5b9060005260206000209060060201600301546130c3919061555c565b6007600089815260200190815260200160002060020160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1661312e9092919063ffffffff16565b5050505050565b600033905090565b6131af8363a9059cbb60e01b848460405160240161314d929190614b9d565b604051602081830303815290604052907bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff8381831617835250505050613c14565b505050565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050816000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b6000818473ffffffffffffffffffffffffffffffffffffffff1663dd62ed3e30866040518363ffffffff1660e01b81526004016132b6929190614a31565b60206040518083038186803b1580156132ce57600080fd5b505afa1580156132e2573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906133069190614241565b613310919061530a565b90506133938463095ea7b360e01b8584604051602401613331929190614b9d565b604051602081830303815290604052907bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff8381831617835250505050613c14565b50505050565b600080600a60006007600088815260200190815260200160002060010160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160149054906101000a900460ff161561354457600a60006007600088815260200190815260200160002060010160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166350d25bcd6040518163ffffffff1660e01b815260040160206040518083038186803b15801561350557600080fd5b505afa158015613519573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061353d91906141b9565b915061365f565b600a60006007600088815260200190815260200160002060010160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663e1aa60366040518163ffffffff1660e01b8152600401602060405180830381600087803b15801561362457600080fd5b505af1158015613638573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061365c9190614241565b91505b600a60006007600088815260200190815260200160002060020160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160149054906101000a900460ff161561380757600a60006007600088815260200190815260200160002060020160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166350d25bcd6040518163ffffffff1660e01b815260040160206040518083038186803b1580156137c857600080fd5b505afa1580156137dc573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061380091906141b9565b9050613922565b600a60006007600088815260200190815260200160002060020160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663e1aa60366040518163ffffffff1660e01b8152600401602060405180830381600087803b1580156138e757600080fd5b505af11580156138fb573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061391f9190614241565b90505b60006007600087815260200190815260200160002060010160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663313ce5676040518163ffffffff1660e01b815260040160206040518083038186803b1580156139a057600080fd5b505afa1580156139b4573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906139d89190614241565b905060006007600088815260200190815260200160002060020160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663313ce5676040518163ffffffff1660e01b815260040160206040518083038186803b158015613a5857600080fd5b505afa158015613a6c573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613a909190614241565b9050600082600a613aa191906153e4565b846103e8613aaf9190615502565b613ab99190615502565b82600a613ac691906153e4565b8689610384613ad59190615502565b613adf9190615502565b613ae99190615502565b613af39190615360565b9050808611613b37576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613b2e90614d08565b60405180910390fd5b86600960008a81526020019081526020016000206001600960008c815260200190815260200160002080549050613b6e919061555c565b81548110613b7f57613b7e615787565b5b90600052602060002090600602016002018190555085600960008a81526020019081526020016000206001600960008c815260200190815260200160002080549050613bcb919061555c565b81548110613bdc57613bdb615787565b5b9060005260206000209060060201600301819055505050505050505050565b6000818310613c0a5781613c0c565b825b905092915050565b6000613c76826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c65648152508573ffffffffffffffffffffffffffffffffffffffff16613cdb9092919063ffffffff16565b9050600081511115613cd65780806020019051810190613c96919061418c565b613cd5576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613ccc90614fc8565b60405180910390fd5b5b505050565b6060613cea8484600085613cf3565b90509392505050565b606082471015613d38576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613d2f90614da8565b60405180910390fd5b613d4185613e07565b613d80576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613d7790614f88565b60405180910390fd5b6000808673ffffffffffffffffffffffffffffffffffffffff168587604051613da991906149ff565b60006040518083038185875af1925050503d8060008114613de6576040519150601f19603f3d011682016040523d82523d6000602084013e613deb565b606091505b5091509150613dfb828286613e2a565b92505050949350505050565b6000808273ffffffffffffffffffffffffffffffffffffffff163b119050919050565b60608315613e3a57829050613e8a565b600083511115613e4d5782518084602001fd5b816040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613e819190614cc6565b60405180910390fd5b9392505050565b600081359050613ea081615cd3565b92915050565b600081359050613eb581615cea565b92915050565b600081519050613eca81615cea565b92915050565b600081519050613edf81615d01565b92915050565b600060408284031215613efb57613efa6157f4565b5b613f0560406151de565b90506000613f1584828501613e91565b6000830152506020613f2984828501613ea6565b60208301525092915050565b60006101408284031215613f4c57613f4b6157f4565b5b613f576101406151de565b90506000613f6784828501613e91565b6000830152506020613f7b84828501613e91565b6020830152506040613f8f84828501613e91565b6040830152506060613fa384828501614088565b6060830152506080613fb784828501614088565b60808301525060a0613fcb84828501614088565b60a08301525060c0613fdf84828501614088565b60c08301525060e0613ff384828501614088565b60e08301525061010061400884828501614088565b6101008301525061012061401e84828501613ea6565b6101208301525092915050565b600060608284031215614041576140406157ef565b5b81905092915050565b6000606082840312156140605761405f6157ef565b5b81905092915050565b60006080828403121561407f5761407e6157ef565b5b81905092915050565b60008135905061409781615d18565b92915050565b6000815190506140ac81615d18565b92915050565b6000602082840312156140c8576140c7615817565b5b60006140d684828501613e91565b91505092915050565b600080606083850312156140f6576140f5615817565b5b600061410485828601613e91565b925050602061411585828601613ee5565b9150509250929050565b6000806040838503121561413657614135615817565b5b600061414485828601613e91565b925050602061415585828601614088565b9150509250929050565b60006020828403121561417557614174615817565b5b600061418384828501613ea6565b91505092915050565b6000602082840312156141a2576141a1615817565b5b60006141b084828501613ebb565b91505092915050565b6000602082840312156141cf576141ce615817565b5b60006141dd84828501613ed0565b91505092915050565b600061014082840312156141fd576141fc615817565b5b600061420b84828501613f35565b91505092915050565b60006020828403121561422a57614229615817565b5b600061423884828501614088565b91505092915050565b60006020828403121561425757614256615817565b5b60006142658482850161409d565b91505092915050565b6000806040838503121561428557614284615817565b5b600061429385828601614088565b92505060206142a485828601614088565b9150509250929050565b600080604083850312156142c5576142c4615817565b5b60006142d38582860161409d565b92505060206142e48582860161409d565b9150509250929050565b600080600080600060a0868803121561430a57614309615817565b5b600061431888828901614088565b955050602061432988828901614088565b945050604086013567ffffffffffffffff81111561434a57614349615808565b5b6143568882890161402b565b935050606086013567ffffffffffffffff81111561437757614376615808565b5b61438388828901614069565b925050608086013567ffffffffffffffff8111156143a4576143a3615808565b5b6143b08882890161404a565b9150509295509295909350565b6143c681615590565b82525050565b6143d581615590565b82525050565b60006143e78385615219565b93507f07ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff83111561441a5761441961580d565b5b60208302925061442b83858461563c565b82840190509392505050565b6000614443838561522a565b93507f07ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8311156144765761447561580d565b5b60208302925061448783858461563c565b82840190509392505050565b61449c816155a2565b82525050565b60006144ae838561523b565b93506144bb83858461563c565b6144c48361581c565b840190509392505050565b60006144db838561524c565b93506144e883858461563c565b6144f18361581c565b840190509392505050565b600061450782615203565b614511818561525d565b935061452181856020860161564b565b80840191505092915050565b614536816155e2565b82525050565b614545816155f4565b82525050565b60006145568261520e565b6145608185615268565b935061457081856020860161564b565b6145798161581c565b840191505092915050565b6000614591601883615268565b915061459c8261583a565b602082019050919050565b60006145b4601e83615268565b91506145bf82615863565b602082019050919050565b60006145d7602683615268565b91506145e28261588c565b604082019050919050565b60006145fa601083615268565b9150614605826158db565b602082019050919050565b600061461d600e83615268565b915061462882615904565b602082019050919050565b6000614640602383615268565b915061464b8261592d565b604082019050919050565b6000614663602683615268565b915061466e8261597c565b604082019050919050565b6000614686600a83615268565b9150614691826159cb565b602082019050919050565b60006146a9601183615268565b91506146b4826159f4565b602082019050919050565b60006146cc601083615268565b91506146d782615a1d565b602082019050919050565b60006146ef600e83615268565b91506146fa82615a46565b602082019050919050565b6000614712600d83615268565b915061471d82615a6f565b602082019050919050565b6000614735601883615268565b915061474082615a98565b602082019050919050565b6000614758600f83615268565b915061476382615ac1565b602082019050919050565b600061477b601083615268565b915061478682615aea565b602082019050919050565b600061479e602083615268565b91506147a982615b13565b602082019050919050565b60006147c1601083615268565b91506147cc82615b3c565b602082019050919050565b60006147e4601983615268565b91506147ef82615b65565b602082019050919050565b6000614807601483615268565b915061481282615b8e565b602082019050919050565b600061482a600d83615268565b915061483582615bb7565b602082019050919050565b600061484d601783615268565b915061485882615be0565b602082019050919050565b6000614870601d83615268565b915061487b82615c09565b602082019050919050565b6000614893601183615268565b915061489e82615c32565b602082019050919050565b60006148b6602a83615268565b91506148c182615c5b565b604082019050919050565b60006148d9601f83615268565b91506148e482615caa565b602082019050919050565b600061010083016149036000840184615279565b61491060008601826143bd565b5061491e6020840184615279565b61492b60208601826143bd565b506149396040840184615279565b61494660408601826143bd565b506149546060840184615279565b61496160608601826143bd565b5061496f60808401846152f3565b61497c60808601826149e1565b5061498a60a08401846152f3565b61499760a08601826149e1565b506149a560c08401846152f3565b6149b260c08601826149e1565b506149c060e0840184615290565b85830360e08701526149d38382846144a2565b925050508091505092915050565b6149ea816155d8565b82525050565b6149f9816155d8565b82525050565b6000614a0b82846144fc565b915081905092915050565b6000602082019050614a2b60008301846143cc565b92915050565b6000604082019050614a4660008301856143cc565b614a5360208301846143cc565b9392505050565b600061014082019050614a70600083018d6143cc565b614a7d602083018c6143cc565b614a8a604083018b6143cc565b614a97606083018a6149f0565b614aa460808301896149f0565b614ab160a08301886149f0565b614abe60c08301876149f0565b614acb60e08301866149f0565b614ad96101008301856149f0565b614ae7610120830184614493565b9b9a5050505050505050505050565b6000606082019050614b0b60008301866143cc565b614b1860208301856143cc565b614b2560408301846149f0565b949350505050565b6000604082019050614b4260008301856143cc565b614b4f6020830184614493565b9392505050565b6000606082019050614b6b60008301876143cc565b8181036020830152614b7d81866148ef565b90508181036040830152614b928184866144cf565b905095945050505050565b6000604082019050614bb260008301856143cc565b614bbf60208301846149f0565b9392505050565b6000608082019050614bdb60008301886143cc565b614be860208301876149f0565b614bf560408301866149f0565b8181036060830152614c088184866143db565b90509695505050505050565b600060c082019050614c2960008301896143cc565b614c3660208301886149f0565b614c4360408301876149f0565b614c5060608301866149f0565b614c5d60808301856149f0565b614c6a60a08301846149f0565b979650505050505050565b6000602082019050614c8a6000830184614493565b92915050565b6000602082019050614ca5600083018461452d565b92915050565b6000602082019050614cc0600083018461453c565b92915050565b60006020820190508181036000830152614ce0818461454b565b905092915050565b60006020820190508181036000830152614d0181614584565b9050919050565b60006020820190508181036000830152614d21816145a7565b9050919050565b60006020820190508181036000830152614d41816145ca565b9050919050565b60006020820190508181036000830152614d61816145ed565b9050919050565b60006020820190508181036000830152614d8181614610565b9050919050565b60006020820190508181036000830152614da181614633565b9050919050565b60006020820190508181036000830152614dc181614656565b9050919050565b60006020820190508181036000830152614de181614679565b9050919050565b60006020820190508181036000830152614e018161469c565b9050919050565b60006020820190508181036000830152614e21816146bf565b9050919050565b60006020820190508181036000830152614e41816146e2565b9050919050565b60006020820190508181036000830152614e6181614705565b9050919050565b60006020820190508181036000830152614e8181614728565b9050919050565b60006020820190508181036000830152614ea18161474b565b9050919050565b60006020820190508181036000830152614ec18161476e565b9050919050565b60006020820190508181036000830152614ee181614791565b9050919050565b60006020820190508181036000830152614f01816147b4565b9050919050565b60006020820190508181036000830152614f21816147d7565b9050919050565b60006020820190508181036000830152614f41816147fa565b9050919050565b60006020820190508181036000830152614f618161481d565b9050919050565b60006020820190508181036000830152614f8181614840565b9050919050565b60006020820190508181036000830152614fa181614863565b9050919050565b60006020820190508181036000830152614fc181614886565b9050919050565b60006020820190508181036000830152614fe1816148a9565b9050919050565b60006020820190508181036000830152615001816148cc565b9050919050565b600060208201905061501d60008301846149f0565b92915050565b600060408201905061503860008301856149f0565b61504560208301846149f0565b9392505050565b600060608201905061506160008301876149f0565b61506e60208301866149f0565b8181036040830152615081818486614437565b905095945050505050565b600080833560016020038436030381126150a9576150a86157f9565b5b80840192508235915067ffffffffffffffff8211156150cb576150ca6157ea565b5b6020830192506020820236038313156150e7576150e6615803565b5b509250929050565b6000808335600160200384360303811261510c5761510b6157f9565b5b80840192508235915067ffffffffffffffff82111561512e5761512d6157ea565b5b60208301925060208202360383131561514a57615149615803565b5b509250929050565b6000808335600160200384360303811261516f5761516e6157f9565b5b80840192508235915067ffffffffffffffff821115615191576151906157ea565b5b6020830192506001820236038313156151ad576151ac615803565b5b509250929050565b600082356001610100038336030381126151d2576151d16157f9565b5b80830191505092915050565b60006151e86151f9565b90506151f4828261567e565b919050565b6000604051905090565b600081519050919050565b600081519050919050565b600082825260208201905092915050565b600082825260208201905092915050565b600082825260208201905092915050565b600082825260208201905092915050565b600081905092915050565b600082825260208201905092915050565b60006152886020840184613e91565b905092915050565b600080833560016020038436030381126152ad576152ac615812565b5b83810192508235915060208301925067ffffffffffffffff8211156152d5576152d46157e5565b5b6001820236038413156152eb576152ea6157fe565b5b509250929050565b60006153026020840184614088565b905092915050565b6000615315826155d8565b9150615320836155d8565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0382111561535557615354615729565b5b828201905092915050565b600061536b826155d8565b9150615376836155d8565b92508261538657615385615758565b5b828204905092915050565b6000808291508390505b60018511156153db578086048111156153b7576153b6615729565b5b60018516156153c65780820291505b80810290506153d48561582d565b945061539b565b94509492505050565b60006153ef826155d8565b91506153fa836155d8565b92506154277fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff848461542f565b905092915050565b60008261543f57600190506154fb565b8161544d57600090506154fb565b8160018114615463576002811461546d5761549c565b60019150506154fb565b60ff84111561547f5761547e615729565b5b8360020a91508482111561549657615495615729565b5b506154fb565b5060208310610133831016604e8410600b84101617156154d15782820a9050838111156154cc576154cb615729565b5b6154fb565b6154de8484846001615391565b925090508184048111156154f5576154f4615729565b5b81810290505b9392505050565b600061550d826155d8565b9150615518836155d8565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff048311821515161561555157615550615729565b5b828202905092915050565b6000615567826155d8565b9150615572836155d8565b92508282101561558557615584615729565b5b828203905092915050565b600061559b826155b8565b9050919050565b60008115159050919050565b6000819050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b60006155ed82615618565b9050919050565b60006155ff82615606565b9050919050565b60006156118261562a565b9050919050565b60006156238261562a565b9050919050565b6000615635826155b8565b9050919050565b82818337600083830152505050565b60005b8381101561566957808201518184015260208101905061564e565b83811115615678576000848401525b50505050565b6156878261581c565b810181811067ffffffffffffffff821117156156a6576156a56157b6565b5b80604052505050565b60006156ba826155d8565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8214156156ed576156ec615729565b5b600182019050919050565b6000615703826155d8565b915061570e836155d8565b92508261571e5761571d615758565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600080fd5b600080fd5b600080fd5b600080fd5b600080fd5b600080fd5b600080fd5b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b60008160011c9050919050565b7f496e76616c696420737263546f6b656e20616464726573730000000000000000600082015250565b7f546f6b656e7320726563656976656420617265206e6f7420656e6f7567680000600082015250565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b7f4f7264657220776173206b696c6c656400000000000000000000000000000000600082015250565b7f496e76616c696420616d6f756e74000000000000000000000000000000000000600082015250565b7f496e74657276616c206d7573742070617373206265666f7265206e657874206660008201527f696c6c0000000000000000000000000000000000000000000000000000000000602082015250565b7f416464726573733a20696e73756666696369656e742062616c616e636520666f60008201527f722063616c6c0000000000000000000000000000000000000000000000000000602082015250565b7f4f766572626f7567687400000000000000000000000000000000000000000000600082015250565b7f4f7261636c65206973206d697373696e67000000000000000000000000000000600082015250565b7f5061757361626c653a2070617573656400000000000000000000000000000000600082015250565b7f496e76616c69642073656e646572000000000000000000000000000000000000600082015250565b7f496e76616c696420746f74616c00000000000000000000000000000000000000600082015250565b7f496e76616c696420647374546f6b656e20616464726573730000000000000000600082015250565b7f4e6f742077686974656c69737465640000000000000000000000000000000000600082015250565b7f496e76616c6964207469636b53697a6500000000000000000000000000000000600082015250565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b7f496e76616c696420696e74657276616c00000000000000000000000000000000600082015250565b7f4f7261636c65732063616e6e6f74206265207570646174656400000000000000600082015250565b7f4f7264657220616c7265616479206b696c6c6564000000000000000000000000600082015250565b7f496e76616c6964206f7264657200000000000000000000000000000000000000600082015250565b7f4f7264657220697320616c72656164792066696c6c6564000000000000000000600082015250565b7f416464726573733a2063616c6c20746f206e6f6e2d636f6e7472616374000000600082015250565b7f496e76616c6964206d73672076616c7565000000000000000000000000000000600082015250565b7f5361666545524332303a204552433230206f7065726174696f6e20646964206e60008201527f6f74207375636365656400000000000000000000000000000000000000000000602082015250565b7f4e756d626572206f6620696e74657276616c7320697320746f6f206c65737300600082015250565b615cdc81615590565b8114615ce757600080fd5b50565b615cf3816155a2565b8114615cfe57600080fd5b50565b615d0a816155ae565b8114615d1557600080fd5b50565b615d21816155d8565b8114615d2c57600080fd5b5056fea264697066735822122019c227779d481a3e77bcfff5445775566f54a307341d0de13e532f5f7cd5750f64736f6c634300080700330000000000000000000000001111111254fb6c44bac0bed2854e76f90643097d00000000000000000000000082af49447d8a07e3bd95bd0d56f35241523fbab1
Deployed Bytecode
0x6080604052600436106101d15760003560e01c806372fac185116100f75780639b19251a11610095578063d6e4358511610064578063d6e435851461070d578063e43252d71461074a578063e5c59acc14610773578063f2fde38b146107b0576101d8565b80639b19251a1461061c578063a85c38ef14610659578063addd50991461069f578063c8811424146106dd576101d8565b8063856652e9116100d1578063856652e9146105605780638ab1d6811461059d5780638da5cb5b146105c65780639a98d723146105f1576101d8565b806372fac185146104b85780637dca72b7146104f557806380e3f1ad14610537576101d8565b80633fb19a531161016f578063629859541161013e57806362985954146103fe57806365c619a0146104275780637014758014610464578063715018a6146104a1576101d8565b80633fb19a53146103525780633fc8cef31461037d578063524513d6146103a85780635c975abb146103d3576101d8565b80632abaa90d116101ab5780632abaa90d146102705780632f70aba6146102ad5780633401e168146102ea5780633aa1fba014610315576101d8565b806310cab287146101dd578063189523831461021a5780632453ffa814610245576101d8565b366101d857005b600080fd5b3480156101e957600080fd5b5061020460048036038101906101ff9190614214565b6107d9565b6040516102119190615008565b60405180910390f35b34801561022657600080fd5b5061022f61080c565b60405161023c9190615008565b60405180910390f35b34801561025157600080fd5b5061025a610812565b6040516102679190615008565b60405180910390f35b34801561027c57600080fd5b5061029760048036038101906102929190614214565b610818565b6040516102a49190615008565b60405180910390f35b3480156102b957600080fd5b506102d460048036038101906102cf91906142ee565b6108d3565b6040516102e19190615008565b60405180910390f35b3480156102f657600080fd5b506102ff610d17565b60405161030c9190614c90565b60405180910390f35b34801561032157600080fd5b5061033c60048036038101906103379190614214565b610d3d565b6040516103499190615008565b60405180910390f35b34801561035e57600080fd5b50610367610de5565b6040516103749190615008565b60405180910390f35b34801561038957600080fd5b50610392610deb565b60405161039f9190614cab565b60405180910390f35b3480156103b457600080fd5b506103bd610e11565b6040516103ca9190614c75565b60405180910390f35b3480156103df57600080fd5b506103e8610e24565b6040516103f59190614c75565b60405180910390f35b34801561040a57600080fd5b50610425600480360381019061042091906140df565b610e3a565b005b34801561043357600080fd5b5061044e60048036038101906104499190614214565b611035565b60405161045b9190614c75565b60405180910390f35b34801561047057600080fd5b5061048b60048036038101906104869190614214565b6112b6565b6040516104989190615008565b60405180910390f35b3480156104ad57600080fd5b506104b6611394565b005b3480156104c457600080fd5b506104df60048036038101906104da9190614214565b61141c565b6040516104ec9190615008565b60405180910390f35b34801561050157600080fd5b5061051c6004803603810190610517919061426e565b6114fa565b60405161052e96959493929190614c14565b60405180910390f35b34801561054357600080fd5b5061055e6004803603810190610559919061415f565b611573565b005b34801561056c57600080fd5b506105876004803603810190610582919061411f565b61160c565b6040516105949190615008565b60405180910390f35b3480156105a957600080fd5b506105c460048036038101906105bf91906140b2565b61163d565b005b3480156105d257600080fd5b506105db611714565b6040516105e89190614a16565b60405180910390f35b3480156105fd57600080fd5b5061060661173d565b6040516106139190615008565b60405180910390f35b34801561062857600080fd5b50610643600480360381019061063e91906140b2565b611743565b6040516106509190614c75565b60405180910390f35b34801561066557600080fd5b50610680600480360381019061067b9190614214565b611763565b6040516106969a99989796959493929190614a5a565b60405180910390f35b3480156106ab57600080fd5b506106c660048036038101906106c191906140b2565b611824565b6040516106d4929190614b2d565b60405180910390f35b6106f760048036038101906106f291906141e6565b611875565b6040516107049190614c75565b60405180910390f35b34801561071957600080fd5b50610734600480360381019061072f9190614214565b6120f8565b6040516107419190614c75565b60405180910390f35b34801561075657600080fd5b50610771600480360381019061076c91906140b2565b612171565b005b34801561077f57600080fd5b5061079a60048036038101906107959190614214565b612248565b6040516107a79190615008565b60405180910390f35b3480156107bc57600080fd5b506107d760048036038101906107d291906140b2565b612326565b005b600060076000838152602001908152602001600020600401546107fb83610d3d565b6108059190615502565b9050919050565b60055481565b60065481565b6000806000600960008581526020019081526020016000208054905011156108a5576009600084815260200190815260200160002060016009600086815260200190815260200160002080549050610870919061555c565b8154811061088157610880615787565b5b9060005260206000209060060201600501544261089e919061555c565b90506108ca565b6007600084815260200190815260200160002060080154426108c7919061555c565b90505b80915050919050565b60006108dd610e24565b1561091d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161091490614e08565b60405180910390fd5b600c60009054906101000a900460ff16156109c65760011515600b60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff161515146109c5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016109bc90614e88565b60405180910390fd5b5b600060076000888152602001908152602001600020600801541415610a20576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a1790614f48565b60405180910390fd5b6007600087815260200190815260200160002060090160009054906101000a900460ff1615610a84576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a7b90614d48565b60405180910390fd5b6007600087815260200190815260200160002060050154610aa48761141c565b10610ae4576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610adb90614f68565b60405180910390fd5b6000610aef87610d3d565b905060008111610b34576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b2b90614d88565b60405180910390fd5b6000610b3f88610818565b9050600960008981526020019081526020016000206040518060c001604052803373ffffffffffffffffffffffffffffffffffffffff16815260200184815260200160008152602001600081526020016000815260200142815250908060018154018082558091505060019003906000526020600020906006020160009091909190915060008201518160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506020820151816001015560408201518160020155606082015181600301556080820151816004015560a082015181600501555050610c4c88838989898961241e565b610c568882612c53565b7f1f91c68e5e487ae44284d7bb543bb2b2a08ab9eeedcaacfdbb05d139d2cbc476886001600960008c815260200190815260200160002080549050610c9b919061555c565b604051610ca9929190615023565b60405180910390a1600960008981526020019081526020016000206001600960008b815260200190815260200160002080549050610ce7919061555c565b81548110610cf857610cf7615787565b5b9060005260206000209060060201600401549250505095945050505050565b600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600080610d4983610818565b90506000600760008581526020019081526020016000206003015482610d6f9190615360565b90506000610d7c85612248565b905060008160076000888152602001908152602001600020600401546007600089815260200190815260200160002060050154610db99190615360565b610dc3919061555c565b9050808310610dd85780945050505050610de0565b829450505050505b919050565b60035481565b600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600c60009054906101000a900460ff1681565b60008060149054906101000a900460ff16905090565b610e42613126565b73ffffffffffffffffffffffffffffffffffffffff16610e60611714565b73ffffffffffffffffffffffffffffffffffffffff1614610eb6576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ead90614ec8565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff16600a60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614610f87576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f7e90614f08565b60405180910390fd5b80600a60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008201518160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060208201518160000160146101000a81548160ff0219169083151502179055509050505050565b600061103f610e24565b1561107f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161107690614e08565b60405180910390fd5b6007600083815260200190815260200160002060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614611123576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161111a90614e28565b60405180910390fd5b6007600083815260200190815260200160002060090160009054906101000a900460ff1615611187576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161117e90614f28565b60405180910390fd5b60016007600084815260200190815260200160002060090160006101000a81548160ff0219169083151502179055506112766007600084815260200190815260200160002060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff166111f98461141c565b600760008681526020019081526020016000206005015461121a919061555c565b6007600086815260200190815260200160002060010160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1661312e9092919063ffffffff16565b7f385de1741c5fb03f2ddd3eaec93f254b96de98c5dfc112e95989dde06ed5c2d6826040516112a59190615008565b60405180910390a160019050919050565b60008060076000848152602001908152602001600020600801541415611311576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161130890614f48565b60405180910390fd5b6000805b600960008581526020019081526020016000208054905081101561138a5760096000858152602001908152602001600020818154811061135857611357615787565b5b90600052602060002090600602016003015482611375919061530a565b91508080611382906156af565b915050611315565b5080915050919050565b61139c613126565b73ffffffffffffffffffffffffffffffffffffffff166113ba611714565b73ffffffffffffffffffffffffffffffffffffffff1614611410576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161140790614ec8565b60405180910390fd5b61141a60006131b4565b565b60008060076000848152602001908152602001600020600801541415611477576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161146e90614f48565b60405180910390fd5b6000805b60096000858152602001908152602001600020805490508110156114f0576009600085815260200190815260200160002081815481106114be576114bd615787565b5b906000526020600020906006020160020154826114db919061530a565b915080806114e8906156af565b91505061147b565b5080915050919050565b6009602052816000526040600020818154811061151657600080fd5b9060005260206000209060060201600091509150508060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16908060010154908060020154908060030154908060040154908060050154905086565b61157b613126565b73ffffffffffffffffffffffffffffffffffffffff16611599611714565b73ffffffffffffffffffffffffffffffffffffffff16146115ef576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115e690614ec8565b60405180910390fd5b80600c60006101000a81548160ff02191690831515021790555050565b6008602052816000526040600020818154811061162857600080fd5b90600052602060002001600091509150505481565b611645613126565b73ffffffffffffffffffffffffffffffffffffffff16611663611714565b73ffffffffffffffffffffffffffffffffffffffff16146116b9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116b090614ec8565b60405180910390fd5b6000600b60008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555050565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b60045481565b600b6020528060005260406000206000915054906101000a900460ff1681565b60076020528060005260406000206000915090508060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16908060010160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16908060020160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16908060030154908060040154908060050154908060060154908060070154908060080154908060090160009054906101000a900460ff1690508a565b600a6020528060005260406000206000915090508060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16908060000160149054906101000a900460ff16905082565b600061187f610e24565b156118bf576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016118b690614e08565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff16826020015173ffffffffffffffffffffffffffffffffffffffff161415611933576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161192a90614ce8565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff16826040015173ffffffffffffffffffffffffffffffffffffffff1614156119a7576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161199e90614e68565b60405180910390fd5b600354826060015110156119f0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016119e790614ee8565b60405180910390fd5b6000826080015111611a37576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a2e90614ea8565b60405180910390fd5b81608001518260a00151118015611a615750600082608001518360a00151611a5f91906156f8565b145b611aa0576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a9790614e48565b60405180910390fd5b60045482608001518360a00151611ab79190615360565b11611af7576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611aee90614fe8565b60405180910390fd5b33826000019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff1681525050428261010001818152505060008261012001901515908115158152505073eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee73ffffffffffffffffffffffffffffffffffffffff16826020015173ffffffffffffffffffffffffffffffffffffffff161415611cc0578160a001513414611bde576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611bd590614fa8565b60405180910390fd5b600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663d0e30db0346040518263ffffffff1660e01b81526004016000604051808303818588803b158015611c4857600080fd5b505af1158015611c5c573d6000803e3d6000fd5b5050505050600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16826020019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff1681525050611d61565b816020015173ffffffffffffffffffffffffffffffffffffffff166323b872dd33308560a001516040518463ffffffff1660e01b8152600401611d0593929190614af6565b602060405180830381600087803b158015611d1f57600080fd5b505af1158015611d33573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611d57919061418c565b611d6057600080fd5b5b600073ffffffffffffffffffffffffffffffffffffffff16600a6000846020015173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614158015611e975750600073ffffffffffffffffffffffffffffffffffffffff16600a6000846040015173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614155b611ed6576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ecd90614de8565b60405180910390fd5b816007600060066000815480929190611eee906156af565b91905055815260200190815260200160002060008201518160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060208201518160010160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060408201518160020160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550606082015181600301556080820151816004015560a0820151816005015560c0820151816006015560e0820151816007015561010082015181600801556101208201518160090160006101000a81548160ff021916908315150217905550905050600860003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206001600654612084919061555c565b90806001815401808255809150506001900390600052602060002001600090919091909150557fea4cfac72390cc8468db408bfef1590948a245bb7335778497567d7b87cf09cb60016006546120da919061555c565b6040516120e79190615008565b60405180910390a160019050919050565b60008060076000848152602001908152602001600020600801541415801561214157506007600083815260200190815260200160002060090160009054906101000a900460ff16155b801561216a575060076000838152602001908152602001600020600501546121688361141c565b105b9050919050565b612179613126565b73ffffffffffffffffffffffffffffffffffffffff16612197611714565b73ffffffffffffffffffffffffffffffffffffffff16146121ed576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016121e490614ec8565b60405180910390fd5b6001600b60008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555050565b600080600760008481526020019081526020016000206008015414156122a3576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161229a90614f48565b60405180910390fd5b6000805b600960008581526020019081526020016000208054905081101561231c576009600085815260200190815260200160002081815481106122ea576122e9615787565b5b90600052602060002090600602016001015482612307919061530a565b91508080612314906156af565b9150506122a7565b5080915050919050565b61232e613126565b73ffffffffffffffffffffffffffffffffffffffff1661234c611714565b73ffffffffffffffffffffffffffffffffffffffff16146123a2576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161239990614ec8565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415612412576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161240990614d28565b60405180910390fd5b61241b816131b4565b50565b60006007600088815260200190815260200160002060010160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b815260040161248f9190614a16565b60206040518083038186803b1580156124a757600080fd5b505afa1580156124bb573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906124df9190614241565b905060006007600089815260200190815260200160002060020160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b81526004016125529190614a16565b60206040518083038186803b15801561256a57600080fd5b505afa15801561257e573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906125a29190614241565b90506000600760008a815260200190815260200160002060010160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663dd62ed3e30600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff166040518363ffffffff1660e01b8152600401612639929190614a31565b60206040518083038186803b15801561265157600080fd5b505afa158015612665573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906126899190614241565b141561273357612732600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff167fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600760008c815260200190815260200160002060010160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166132789092919063ffffffff16565b5b600086141561282457600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16637c02520086600001602081019061278d91906140b2565b87806020019061279d91906151b5565b8880604001906127ad9190615152565b6040518563ffffffff1660e01b81526004016127cc9493929190614b56565b6040805180830381600087803b1580156127e557600080fd5b505af11580156127f9573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061281d91906142ae565b50506129dc565b600186141561291057600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16632e95b6c885600001602081019061287e91906140b2565b86602001358760400135888060600190612898919061508c565b6040518663ffffffff1660e01b81526004016128b8959493929190614bc6565b602060405180830381600087803b1580156128d257600080fd5b505af11580156128e6573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061290a9190614241565b506129db565b600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663e449022e8460000135856020013586806040019061296891906150ef565b6040518563ffffffff1660e01b8152600401612987949392919061504c565b602060405180830381600087803b1580156129a157600080fd5b505af11580156129b5573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906129d99190614241565b505b5b6000600760008a815260200190815260200160002060010160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b8152600401612a4d9190614a16565b60206040518083038186803b158015612a6557600080fd5b505afa158015612a79573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612a9d9190614241565b83612aa8919061555c565b9050600082600760008c815260200190815260200160002060020160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b8152600401612b1c9190614a16565b60206040518083038186803b158015612b3457600080fd5b505afa158015612b48573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612b6c9190614241565b612b76919061555c565b9050612b838a8383613399565b600760008b81526020019081526020016000206004015489612ba59190615502565b8214612be6576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612bdd90614d68565b60405180910390fd5b600760008b815260200190815260200160002060050154612c068b61141c565b1115612c47576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612c3e90614dc8565b60405180910390fd5b50505050505050505050565b6000600160096000858152602001908152602001600020805490501115612c9d57600760008481526020019081526020016000206003015482612c96919061555c565b9050612ca1565b8190505b600060055460076000868152602001908152602001600020600601546009600087815260200190815260200160002060016009600089815260200190815260200160002080549050612cf3919061555c565b81548110612d0457612d03615787565b5b906000526020600020906006020160010154600960008881526020019081526020016000206001600960008a815260200190815260200160002080549050612d4c919061555c565b81548110612d5d57612d5c615787565b5b906000526020600020906006020160030154612d799190615360565b612d839190615502565b612d8d9190615360565b905060006005546007600087815260200190815260200160002060070154600960008881526020019081526020016000206001600960008a815260200190815260200160002080549050612de1919061555c565b81548110612df257612df1615787565b5b906000526020600020906006020160010154600960008981526020019081526020016000206001600960008b815260200190815260200160002080549050612e3a919061555c565b81548110612e4b57612e4a615787565b5b906000526020600020906006020160030154612e679190615360565b612e719190615502565b612e7b9190615360565b9050612eb8816103e8600686612e919190615360565b6103e8612e9e919061530a565b612ea89190615360565b84612eb39190615502565b613bfb565b6009600087815260200190815260200160002060016009600089815260200190815260200160002080549050612eee919061555c565b81548110612eff57612efe615787565b5b906000526020600020906006020160040181905550612fcd33600960008881526020019081526020016000206001600960008a815260200190815260200160002080549050612f4e919061555c565b81548110612f5f57612f5e615787565b5b9060005260206000209060060201600401546007600089815260200190815260200160002060020160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1661312e9092919063ffffffff16565b61311f6007600087815260200190815260200160002060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16600960008881526020019081526020016000206001600960008a81526020019081526020016000208054905061303d919061555c565b8154811061304e5761304d615787565b5b906000526020600020906006020160040154600960008981526020019081526020016000206001600960008b815260200190815260200160002080549050613096919061555c565b815481106130a7576130a6615787565b5b9060005260206000209060060201600301546130c3919061555c565b6007600089815260200190815260200160002060020160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1661312e9092919063ffffffff16565b5050505050565b600033905090565b6131af8363a9059cbb60e01b848460405160240161314d929190614b9d565b604051602081830303815290604052907bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff8381831617835250505050613c14565b505050565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050816000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b6000818473ffffffffffffffffffffffffffffffffffffffff1663dd62ed3e30866040518363ffffffff1660e01b81526004016132b6929190614a31565b60206040518083038186803b1580156132ce57600080fd5b505afa1580156132e2573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906133069190614241565b613310919061530a565b90506133938463095ea7b360e01b8584604051602401613331929190614b9d565b604051602081830303815290604052907bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff8381831617835250505050613c14565b50505050565b600080600a60006007600088815260200190815260200160002060010160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160149054906101000a900460ff161561354457600a60006007600088815260200190815260200160002060010160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166350d25bcd6040518163ffffffff1660e01b815260040160206040518083038186803b15801561350557600080fd5b505afa158015613519573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061353d91906141b9565b915061365f565b600a60006007600088815260200190815260200160002060010160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663e1aa60366040518163ffffffff1660e01b8152600401602060405180830381600087803b15801561362457600080fd5b505af1158015613638573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061365c9190614241565b91505b600a60006007600088815260200190815260200160002060020160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160149054906101000a900460ff161561380757600a60006007600088815260200190815260200160002060020160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166350d25bcd6040518163ffffffff1660e01b815260040160206040518083038186803b1580156137c857600080fd5b505afa1580156137dc573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061380091906141b9565b9050613922565b600a60006007600088815260200190815260200160002060020160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663e1aa60366040518163ffffffff1660e01b8152600401602060405180830381600087803b1580156138e757600080fd5b505af11580156138fb573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061391f9190614241565b90505b60006007600087815260200190815260200160002060010160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663313ce5676040518163ffffffff1660e01b815260040160206040518083038186803b1580156139a057600080fd5b505afa1580156139b4573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906139d89190614241565b905060006007600088815260200190815260200160002060020160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663313ce5676040518163ffffffff1660e01b815260040160206040518083038186803b158015613a5857600080fd5b505afa158015613a6c573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613a909190614241565b9050600082600a613aa191906153e4565b846103e8613aaf9190615502565b613ab99190615502565b82600a613ac691906153e4565b8689610384613ad59190615502565b613adf9190615502565b613ae99190615502565b613af39190615360565b9050808611613b37576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613b2e90614d08565b60405180910390fd5b86600960008a81526020019081526020016000206001600960008c815260200190815260200160002080549050613b6e919061555c565b81548110613b7f57613b7e615787565b5b90600052602060002090600602016002018190555085600960008a81526020019081526020016000206001600960008c815260200190815260200160002080549050613bcb919061555c565b81548110613bdc57613bdb615787565b5b9060005260206000209060060201600301819055505050505050505050565b6000818310613c0a5781613c0c565b825b905092915050565b6000613c76826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c65648152508573ffffffffffffffffffffffffffffffffffffffff16613cdb9092919063ffffffff16565b9050600081511115613cd65780806020019051810190613c96919061418c565b613cd5576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613ccc90614fc8565b60405180910390fd5b5b505050565b6060613cea8484600085613cf3565b90509392505050565b606082471015613d38576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613d2f90614da8565b60405180910390fd5b613d4185613e07565b613d80576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613d7790614f88565b60405180910390fd5b6000808673ffffffffffffffffffffffffffffffffffffffff168587604051613da991906149ff565b60006040518083038185875af1925050503d8060008114613de6576040519150601f19603f3d011682016040523d82523d6000602084013e613deb565b606091505b5091509150613dfb828286613e2a565b92505050949350505050565b6000808273ffffffffffffffffffffffffffffffffffffffff163b119050919050565b60608315613e3a57829050613e8a565b600083511115613e4d5782518084602001fd5b816040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613e819190614cc6565b60405180910390fd5b9392505050565b600081359050613ea081615cd3565b92915050565b600081359050613eb581615cea565b92915050565b600081519050613eca81615cea565b92915050565b600081519050613edf81615d01565b92915050565b600060408284031215613efb57613efa6157f4565b5b613f0560406151de565b90506000613f1584828501613e91565b6000830152506020613f2984828501613ea6565b60208301525092915050565b60006101408284031215613f4c57613f4b6157f4565b5b613f576101406151de565b90506000613f6784828501613e91565b6000830152506020613f7b84828501613e91565b6020830152506040613f8f84828501613e91565b6040830152506060613fa384828501614088565b6060830152506080613fb784828501614088565b60808301525060a0613fcb84828501614088565b60a08301525060c0613fdf84828501614088565b60c08301525060e0613ff384828501614088565b60e08301525061010061400884828501614088565b6101008301525061012061401e84828501613ea6565b6101208301525092915050565b600060608284031215614041576140406157ef565b5b81905092915050565b6000606082840312156140605761405f6157ef565b5b81905092915050565b60006080828403121561407f5761407e6157ef565b5b81905092915050565b60008135905061409781615d18565b92915050565b6000815190506140ac81615d18565b92915050565b6000602082840312156140c8576140c7615817565b5b60006140d684828501613e91565b91505092915050565b600080606083850312156140f6576140f5615817565b5b600061410485828601613e91565b925050602061411585828601613ee5565b9150509250929050565b6000806040838503121561413657614135615817565b5b600061414485828601613e91565b925050602061415585828601614088565b9150509250929050565b60006020828403121561417557614174615817565b5b600061418384828501613ea6565b91505092915050565b6000602082840312156141a2576141a1615817565b5b60006141b084828501613ebb565b91505092915050565b6000602082840312156141cf576141ce615817565b5b60006141dd84828501613ed0565b91505092915050565b600061014082840312156141fd576141fc615817565b5b600061420b84828501613f35565b91505092915050565b60006020828403121561422a57614229615817565b5b600061423884828501614088565b91505092915050565b60006020828403121561425757614256615817565b5b60006142658482850161409d565b91505092915050565b6000806040838503121561428557614284615817565b5b600061429385828601614088565b92505060206142a485828601614088565b9150509250929050565b600080604083850312156142c5576142c4615817565b5b60006142d38582860161409d565b92505060206142e48582860161409d565b9150509250929050565b600080600080600060a0868803121561430a57614309615817565b5b600061431888828901614088565b955050602061432988828901614088565b945050604086013567ffffffffffffffff81111561434a57614349615808565b5b6143568882890161402b565b935050606086013567ffffffffffffffff81111561437757614376615808565b5b61438388828901614069565b925050608086013567ffffffffffffffff8111156143a4576143a3615808565b5b6143b08882890161404a565b9150509295509295909350565b6143c681615590565b82525050565b6143d581615590565b82525050565b60006143e78385615219565b93507f07ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff83111561441a5761441961580d565b5b60208302925061442b83858461563c565b82840190509392505050565b6000614443838561522a565b93507f07ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8311156144765761447561580d565b5b60208302925061448783858461563c565b82840190509392505050565b61449c816155a2565b82525050565b60006144ae838561523b565b93506144bb83858461563c565b6144c48361581c565b840190509392505050565b60006144db838561524c565b93506144e883858461563c565b6144f18361581c565b840190509392505050565b600061450782615203565b614511818561525d565b935061452181856020860161564b565b80840191505092915050565b614536816155e2565b82525050565b614545816155f4565b82525050565b60006145568261520e565b6145608185615268565b935061457081856020860161564b565b6145798161581c565b840191505092915050565b6000614591601883615268565b915061459c8261583a565b602082019050919050565b60006145b4601e83615268565b91506145bf82615863565b602082019050919050565b60006145d7602683615268565b91506145e28261588c565b604082019050919050565b60006145fa601083615268565b9150614605826158db565b602082019050919050565b600061461d600e83615268565b915061462882615904565b602082019050919050565b6000614640602383615268565b915061464b8261592d565b604082019050919050565b6000614663602683615268565b915061466e8261597c565b604082019050919050565b6000614686600a83615268565b9150614691826159cb565b602082019050919050565b60006146a9601183615268565b91506146b4826159f4565b602082019050919050565b60006146cc601083615268565b91506146d782615a1d565b602082019050919050565b60006146ef600e83615268565b91506146fa82615a46565b602082019050919050565b6000614712600d83615268565b915061471d82615a6f565b602082019050919050565b6000614735601883615268565b915061474082615a98565b602082019050919050565b6000614758600f83615268565b915061476382615ac1565b602082019050919050565b600061477b601083615268565b915061478682615aea565b602082019050919050565b600061479e602083615268565b91506147a982615b13565b602082019050919050565b60006147c1601083615268565b91506147cc82615b3c565b602082019050919050565b60006147e4601983615268565b91506147ef82615b65565b602082019050919050565b6000614807601483615268565b915061481282615b8e565b602082019050919050565b600061482a600d83615268565b915061483582615bb7565b602082019050919050565b600061484d601783615268565b915061485882615be0565b602082019050919050565b6000614870601d83615268565b915061487b82615c09565b602082019050919050565b6000614893601183615268565b915061489e82615c32565b602082019050919050565b60006148b6602a83615268565b91506148c182615c5b565b604082019050919050565b60006148d9601f83615268565b91506148e482615caa565b602082019050919050565b600061010083016149036000840184615279565b61491060008601826143bd565b5061491e6020840184615279565b61492b60208601826143bd565b506149396040840184615279565b61494660408601826143bd565b506149546060840184615279565b61496160608601826143bd565b5061496f60808401846152f3565b61497c60808601826149e1565b5061498a60a08401846152f3565b61499760a08601826149e1565b506149a560c08401846152f3565b6149b260c08601826149e1565b506149c060e0840184615290565b85830360e08701526149d38382846144a2565b925050508091505092915050565b6149ea816155d8565b82525050565b6149f9816155d8565b82525050565b6000614a0b82846144fc565b915081905092915050565b6000602082019050614a2b60008301846143cc565b92915050565b6000604082019050614a4660008301856143cc565b614a5360208301846143cc565b9392505050565b600061014082019050614a70600083018d6143cc565b614a7d602083018c6143cc565b614a8a604083018b6143cc565b614a97606083018a6149f0565b614aa460808301896149f0565b614ab160a08301886149f0565b614abe60c08301876149f0565b614acb60e08301866149f0565b614ad96101008301856149f0565b614ae7610120830184614493565b9b9a5050505050505050505050565b6000606082019050614b0b60008301866143cc565b614b1860208301856143cc565b614b2560408301846149f0565b949350505050565b6000604082019050614b4260008301856143cc565b614b4f6020830184614493565b9392505050565b6000606082019050614b6b60008301876143cc565b8181036020830152614b7d81866148ef565b90508181036040830152614b928184866144cf565b905095945050505050565b6000604082019050614bb260008301856143cc565b614bbf60208301846149f0565b9392505050565b6000608082019050614bdb60008301886143cc565b614be860208301876149f0565b614bf560408301866149f0565b8181036060830152614c088184866143db565b90509695505050505050565b600060c082019050614c2960008301896143cc565b614c3660208301886149f0565b614c4360408301876149f0565b614c5060608301866149f0565b614c5d60808301856149f0565b614c6a60a08301846149f0565b979650505050505050565b6000602082019050614c8a6000830184614493565b92915050565b6000602082019050614ca5600083018461452d565b92915050565b6000602082019050614cc0600083018461453c565b92915050565b60006020820190508181036000830152614ce0818461454b565b905092915050565b60006020820190508181036000830152614d0181614584565b9050919050565b60006020820190508181036000830152614d21816145a7565b9050919050565b60006020820190508181036000830152614d41816145ca565b9050919050565b60006020820190508181036000830152614d61816145ed565b9050919050565b60006020820190508181036000830152614d8181614610565b9050919050565b60006020820190508181036000830152614da181614633565b9050919050565b60006020820190508181036000830152614dc181614656565b9050919050565b60006020820190508181036000830152614de181614679565b9050919050565b60006020820190508181036000830152614e018161469c565b9050919050565b60006020820190508181036000830152614e21816146bf565b9050919050565b60006020820190508181036000830152614e41816146e2565b9050919050565b60006020820190508181036000830152614e6181614705565b9050919050565b60006020820190508181036000830152614e8181614728565b9050919050565b60006020820190508181036000830152614ea18161474b565b9050919050565b60006020820190508181036000830152614ec18161476e565b9050919050565b60006020820190508181036000830152614ee181614791565b9050919050565b60006020820190508181036000830152614f01816147b4565b9050919050565b60006020820190508181036000830152614f21816147d7565b9050919050565b60006020820190508181036000830152614f41816147fa565b9050919050565b60006020820190508181036000830152614f618161481d565b9050919050565b60006020820190508181036000830152614f8181614840565b9050919050565b60006020820190508181036000830152614fa181614863565b9050919050565b60006020820190508181036000830152614fc181614886565b9050919050565b60006020820190508181036000830152614fe1816148a9565b9050919050565b60006020820190508181036000830152615001816148cc565b9050919050565b600060208201905061501d60008301846149f0565b92915050565b600060408201905061503860008301856149f0565b61504560208301846149f0565b9392505050565b600060608201905061506160008301876149f0565b61506e60208301866149f0565b8181036040830152615081818486614437565b905095945050505050565b600080833560016020038436030381126150a9576150a86157f9565b5b80840192508235915067ffffffffffffffff8211156150cb576150ca6157ea565b5b6020830192506020820236038313156150e7576150e6615803565b5b509250929050565b6000808335600160200384360303811261510c5761510b6157f9565b5b80840192508235915067ffffffffffffffff82111561512e5761512d6157ea565b5b60208301925060208202360383131561514a57615149615803565b5b509250929050565b6000808335600160200384360303811261516f5761516e6157f9565b5b80840192508235915067ffffffffffffffff821115615191576151906157ea565b5b6020830192506001820236038313156151ad576151ac615803565b5b509250929050565b600082356001610100038336030381126151d2576151d16157f9565b5b80830191505092915050565b60006151e86151f9565b90506151f4828261567e565b919050565b6000604051905090565b600081519050919050565b600081519050919050565b600082825260208201905092915050565b600082825260208201905092915050565b600082825260208201905092915050565b600082825260208201905092915050565b600081905092915050565b600082825260208201905092915050565b60006152886020840184613e91565b905092915050565b600080833560016020038436030381126152ad576152ac615812565b5b83810192508235915060208301925067ffffffffffffffff8211156152d5576152d46157e5565b5b6001820236038413156152eb576152ea6157fe565b5b509250929050565b60006153026020840184614088565b905092915050565b6000615315826155d8565b9150615320836155d8565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0382111561535557615354615729565b5b828201905092915050565b600061536b826155d8565b9150615376836155d8565b92508261538657615385615758565b5b828204905092915050565b6000808291508390505b60018511156153db578086048111156153b7576153b6615729565b5b60018516156153c65780820291505b80810290506153d48561582d565b945061539b565b94509492505050565b60006153ef826155d8565b91506153fa836155d8565b92506154277fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff848461542f565b905092915050565b60008261543f57600190506154fb565b8161544d57600090506154fb565b8160018114615463576002811461546d5761549c565b60019150506154fb565b60ff84111561547f5761547e615729565b5b8360020a91508482111561549657615495615729565b5b506154fb565b5060208310610133831016604e8410600b84101617156154d15782820a9050838111156154cc576154cb615729565b5b6154fb565b6154de8484846001615391565b925090508184048111156154f5576154f4615729565b5b81810290505b9392505050565b600061550d826155d8565b9150615518836155d8565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff048311821515161561555157615550615729565b5b828202905092915050565b6000615567826155d8565b9150615572836155d8565b92508282101561558557615584615729565b5b828203905092915050565b600061559b826155b8565b9050919050565b60008115159050919050565b6000819050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b60006155ed82615618565b9050919050565b60006155ff82615606565b9050919050565b60006156118261562a565b9050919050565b60006156238261562a565b9050919050565b6000615635826155b8565b9050919050565b82818337600083830152505050565b60005b8381101561566957808201518184015260208101905061564e565b83811115615678576000848401525b50505050565b6156878261581c565b810181811067ffffffffffffffff821117156156a6576156a56157b6565b5b80604052505050565b60006156ba826155d8565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8214156156ed576156ec615729565b5b600182019050919050565b6000615703826155d8565b915061570e836155d8565b92508261571e5761571d615758565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600080fd5b600080fd5b600080fd5b600080fd5b600080fd5b600080fd5b600080fd5b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b60008160011c9050919050565b7f496e76616c696420737263546f6b656e20616464726573730000000000000000600082015250565b7f546f6b656e7320726563656976656420617265206e6f7420656e6f7567680000600082015250565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b7f4f7264657220776173206b696c6c656400000000000000000000000000000000600082015250565b7f496e76616c696420616d6f756e74000000000000000000000000000000000000600082015250565b7f496e74657276616c206d7573742070617373206265666f7265206e657874206660008201527f696c6c0000000000000000000000000000000000000000000000000000000000602082015250565b7f416464726573733a20696e73756666696369656e742062616c616e636520666f60008201527f722063616c6c0000000000000000000000000000000000000000000000000000602082015250565b7f4f766572626f7567687400000000000000000000000000000000000000000000600082015250565b7f4f7261636c65206973206d697373696e67000000000000000000000000000000600082015250565b7f5061757361626c653a2070617573656400000000000000000000000000000000600082015250565b7f496e76616c69642073656e646572000000000000000000000000000000000000600082015250565b7f496e76616c696420746f74616c00000000000000000000000000000000000000600082015250565b7f496e76616c696420647374546f6b656e20616464726573730000000000000000600082015250565b7f4e6f742077686974656c69737465640000000000000000000000000000000000600082015250565b7f496e76616c6964207469636b53697a6500000000000000000000000000000000600082015250565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b7f496e76616c696420696e74657276616c00000000000000000000000000000000600082015250565b7f4f7261636c65732063616e6e6f74206265207570646174656400000000000000600082015250565b7f4f7264657220616c7265616479206b696c6c6564000000000000000000000000600082015250565b7f496e76616c6964206f7264657200000000000000000000000000000000000000600082015250565b7f4f7264657220697320616c72656164792066696c6c6564000000000000000000600082015250565b7f416464726573733a2063616c6c20746f206e6f6e2d636f6e7472616374000000600082015250565b7f496e76616c6964206d73672076616c7565000000000000000000000000000000600082015250565b7f5361666545524332303a204552433230206f7065726174696f6e20646964206e60008201527f6f74207375636365656400000000000000000000000000000000000000000000602082015250565b7f4e756d626572206f6620696e74657276616c7320697320746f6f206c65737300600082015250565b615cdc81615590565b8114615ce757600080fd5b50565b615cf3816155a2565b8114615cfe57600080fd5b50565b615d0a816155ae565b8114615d1557600080fd5b50565b615d21816155d8565b8114615d2c57600080fd5b5056fea264697066735822122019c227779d481a3e77bcfff5445775566f54a307341d0de13e532f5f7cd5750f64736f6c63430008070033
Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)
0000000000000000000000001111111254fb6c44bac0bed2854e76f90643097d00000000000000000000000082af49447d8a07e3bd95bd0d56f35241523fbab1
-----Decoded View---------------
Arg [0] : _aggregationRouterV4Address (address): 0x1111111254fb6c44bAC0beD2854e76F90643097d
Arg [1] : _wethAddress (address): 0x82aF49447D8a07e3bd95BD0d56f35241523fBab1
-----Encoded View---------------
2 Constructor Arguments found :
Arg [0] : 0000000000000000000000001111111254fb6c44bac0bed2854e76f90643097d
Arg [1] : 00000000000000000000000082af49447d8a07e3bd95bd0d56f35241523fbab1
Loading...
Loading
Loading...
Loading
Loading...
Loading
Multichain Portfolio | 34 Chains
| Chain | Token | Portfolio % | Price | Amount | Value |
|---|
Loading...
Loading
Loading...
Loading
Loading...
Loading
[ Download: CSV Export ]
[ Download: CSV Export ]
A contract address hosts a smart contract, which is a set of code stored on the blockchain that runs when predetermined conditions are met. Learn more about addresses in our Knowledge Base.