Contract

0x07964f135f276412b3182a3B2407b8dd45000000
Transaction Hash
Method
Block
From
To
Exact Input V2Sw...13595762024-12-23 16:26:516 hrs ago1734971211IN
0x07964f13...d45000000
5.87790613 S0.000177961.08213333
Exact Input V2Sw...8697592024-12-20 12:23:483 days ago1734697428IN
0x07964f13...d45000000
0.1 S0.000166331.1
Exact Input V2Sw...8562732024-12-20 10:40:333 days ago1734691233IN
0x07964f13...d45000000
0.1 S0.000160961.1
Exact Input V2Sw...8333342024-12-20 7:56:303 days ago1734681390IN
0x07964f13...d45000000
0.1 S0.000174381.1
Exact Input V2Sw...8329862024-12-20 7:53:533 days ago1734681233IN
0x07964f13...d45000000
0.1 S0.000174381.1
Exact Input V2Sw...8324752024-12-20 7:50:013 days ago1734681001IN
0x07964f13...d45000000
0 S0.000185371
Exact Input V2Sw...8324352024-12-20 7:49:423 days ago1734680982IN
0x07964f13...d45000000
0.003 S0.00017591
Exact Input V2Sw...8319852024-12-20 7:47:053 days ago1734680825IN
0x07964f13...d45000000
0 S0.000186921
Exact Input V2Sw...8319182024-12-20 7:46:433 days ago1734680803IN
0x07964f13...d45000000
0.002 S0.000181861
Exact Input V2Sw...8317402024-12-20 7:45:223 days ago1734680722IN
0x07964f13...d45000000
0 S0.000176391
Exact Input V2Sw...8316962024-12-20 7:45:033 days ago1734680703IN
0x07964f13...d45000000
0.001 S0.000171951
Exact Input V2Sw...8242082024-12-20 6:53:123 days ago1734677592IN
0x07964f13...d45000000
0 S0.00017641
Exact Input V2Sw...8240782024-12-20 6:52:143 days ago1734677534IN
0x07964f13...d45000000
0.001 S0.000154851
Exact Input V2Sw...8229942024-12-20 6:44:143 days ago1734677054IN
0x07964f13...d45000000
0 S0.000195931
Exact Input V2Sw...8080662024-12-20 4:30:213 days ago1734669021IN
0x07964f13...d45000000
0.001 S0.000148751
Exact Input V2Sw...8077142024-12-20 4:27:083 days ago1734668828IN
0x07964f13...d45000000
0.001 S0.000166191
Exact Input V2Sw...8073432024-12-20 4:23:043 days ago1734668584IN
0x07964f13...d45000000
0.001 S0.000175891
Exact Input V2Sw...8072092024-12-20 4:21:293 days ago1734668489IN
0x07964f13...d45000000
0.001 S0.000196291
Exact Input V2Sw...6541292024-12-19 3:55:084 days ago1734580508IN
0x07964f13...d45000000
0.2 S0.000169241.1
Change Allowed6533472024-12-19 3:43:194 days ago1734579799IN
0x07964f13...d45000000
0 S0.000056811.1
Change Transit P...6533182024-12-19 3:42:544 days ago1734579774IN
0x07964f13...d45000000
0 S0.000078751.1
Change Fee6532652024-12-19 3:42:014 days ago1734579721IN
0x07964f13...d45000000
0 S0.000081261.1

Latest 24 internal transactions

Parent Transaction Hash Block From To
13595762024-12-23 16:26:516 hrs ago1734971211
0x07964f13...d45000000
5.86027241 S
8697592024-12-20 12:23:483 days ago1734697428
0x07964f13...d45000000
0.09976 S
8562732024-12-20 10:40:333 days ago1734691233
0x07964f13...d45000000
0.0997 S
8333342024-12-20 7:56:303 days ago1734681390
0x07964f13...d45000000
0.09976 S
8329862024-12-20 7:53:533 days ago1734681233
0x07964f13...d45000000
0.09976 S
8324752024-12-20 7:50:013 days ago1734681001
0x07964f13...d45000000
0.00296735 S
8324752024-12-20 7:50:013 days ago1734681001
0x07964f13...d45000000
0.00296735 S
8324352024-12-20 7:49:423 days ago1734680982
0x07964f13...d45000000
0.003 S
8319852024-12-20 7:47:053 days ago1734680825
0x07964f13...d45000000
0.00198801 S
8319852024-12-20 7:47:053 days ago1734680825
0x07964f13...d45000000
0.00198801 S
8319182024-12-20 7:46:433 days ago1734680803
0x07964f13...d45000000
0.002 S
8317402024-12-20 7:45:223 days ago1734680722
0x07964f13...d45000000
0.000994 S
8317402024-12-20 7:45:223 days ago1734680722
0x07964f13...d45000000
0.000994 S
8316962024-12-20 7:45:033 days ago1734680703
0x07964f13...d45000000
0.001 S
8242082024-12-20 6:53:123 days ago1734677592
0x07964f13...d45000000
0.00204931 S
8242082024-12-20 6:53:123 days ago1734677592
0x07964f13...d45000000
0.00204931 S
8240782024-12-20 6:52:143 days ago1734677534
0x07964f13...d45000000
0.001 S
8229942024-12-20 6:44:143 days ago1734677054
0x07964f13...d45000000
0.00207455 S
8229942024-12-20 6:44:143 days ago1734677054
0x07964f13...d45000000
0.00207455 S
8080662024-12-20 4:30:213 days ago1734669021
0x07964f13...d45000000
0.000997 S
8077142024-12-20 4:27:083 days ago1734668828
0x07964f13...d45000000
0.000997 S
8073432024-12-20 4:23:043 days ago1734668584
0x07964f13...d45000000
0.001 S
8072092024-12-20 4:21:293 days ago1734668489
0x07964f13...d45000000
0.001 S
6541292024-12-19 3:55:084 days ago1734580508
0x07964f13...d45000000
0.1994 S
Loading...
Loading

Contract Source Code Verified (Exact Match)

Contract Name:
TransitSwapRouterV5

Compiler Version
v0.8.20+commit.a1b79de6

Optimization Enabled:
Yes with 200 runs

Other Settings:
default evmVersion
File 1 of 15 : TransitSwapRouterV5.sol
// SPDX-License-Identifier: MIT
pragma solidity =0.8.20;

import "./UniswapV2Router.sol";
import "./UniswapV3Router.sol";
import "./AggregateRouter.sol";
import "./CrossRouter.sol";

contract TransitSwapRouterV5 is UniswapV2Router, UniswapV3Router, AggregateRouter, CrossRouter  {

    function withdrawTokens(address[] memory tokens, address recipient) external onlyExecutor {
        for (uint index; index < tokens.length; index++) {
            uint amount;
            if (TransferHelper.isETH(tokens[index])) {
                amount = address(this).balance;
                TransferHelper.safeTransferETH(recipient, amount);
            } else {
                amount = IERC20(tokens[index]).balanceOf(address(this));
                TransferHelper.safeTransferWithoutRequire(tokens[index], recipient, amount);
            }
            emit Withdraw(tokens[index], msg.sender, recipient, amount);
        }
    }
}

File 2 of 15 : CrossRouter.sol
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.0;

import "./BaseCore.sol";

contract CrossRouter is BaseCore {

    using SafeMath for uint256;

    constructor() {}

    function cross(CrossDescription calldata desc) external payable nonReentrant whenNotPaused(FunctionFlag.cross) {
        require(desc.calls.length > 0, "data should be not zero");
        require(desc.amount > 0, "amount should be greater than 0");
        require(_cross_caller_allowed[desc.caller], "invalid caller");
        
        uint256 swapAmount = executeFunds(FunctionFlag.cross, desc.srcToken, desc.wrappedToken, desc.caller, desc.amount, desc.fee, desc.signature);

        {
            (bool success, bytes memory result) = desc.caller.call{value:swapAmount}(desc.calls);
            if (!success) {
                revert(RevertReasonParser.parse(result, "TransitCrossV5:"));
            }
            TransferHelper.safeApprove(desc.srcToken, desc.caller, 0);
        }

        _emitTransit(desc.srcToken, desc.dstToken, desc.dstReceiver, desc.amount, 0, desc.toChain, desc.channel);
    } 
}

File 3 of 15 : AggregateRouter.sol
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.0;

import "./BaseCore.sol";

contract AggregateRouter is BaseCore {

    using SafeMath for uint256;

    constructor() {

    }

    function aggregateAndGasUsed(TransitSwapDescription calldata desc, CallbytesDescription calldata callbytesDesc) external payable returns (uint256 returnAmount, uint256 gasUsed) {
        uint256 gasLeftBefore = gasleft();
        returnAmount = _executeAggregate(desc, callbytesDesc);
        gasUsed = gasLeftBefore - gasleft();
    }

    function aggregate(TransitSwapDescription calldata desc, CallbytesDescription calldata callbytesDesc) external payable returns (uint256 returnAmount) {
        returnAmount = _executeAggregate(desc, callbytesDesc);
    }

    function _executeAggregate(TransitSwapDescription calldata desc, CallbytesDescription calldata callbytesDesc) internal nonReentrant whenNotPaused(FunctionFlag.executeAggregate) returns (uint256 returnAmount) {
        require(callbytesDesc.calldatas.length > 0, "data should be not zero");
        require(desc.amount > 0, "amount should be greater than 0");
        require(desc.dstReceiver != address(0), "receiver should be not address(0)");
        require(desc.minReturnAmount > 0, "minReturnAmount should be greater than 0");
        require(_wrapped_allowed[desc.wrappedToken], "invalid wrapped address");

        uint256 toBeforeBalance;
        address bridgeAddress = _aggregate_bridge;
        uint256 swapAmount = executeFunds(FunctionFlag.executeAggregate, desc.srcToken, desc.wrappedToken, bridgeAddress, desc.amount, desc.fee, desc.signature);

        if (TransferHelper.isETH(desc.dstToken)) {
            toBeforeBalance = desc.dstReceiver.balance;
        } else {
            toBeforeBalance = IERC20(desc.dstToken).balanceOf(desc.dstReceiver);
        }

        {
            //bytes4(keccak256(bytes('callbytes(CallbytesDescription)')));
            (bool success, bytes memory result) = bridgeAddress.call{value : swapAmount}(abi.encodeWithSelector(0x3f3204d2, callbytesDesc));
            if (!success) {
                revert(RevertReasonParser.parse(result, "TransitSwap:"));
            }
        }

        if (TransferHelper.isETH(desc.dstToken)) {
            returnAmount = desc.dstReceiver.balance.sub(toBeforeBalance);
        } else {
            returnAmount = IERC20(desc.dstToken).balanceOf(desc.dstReceiver).sub(toBeforeBalance);
        }
        require(returnAmount >= desc.minReturnAmount, "Too little received");

        _emitTransit(desc.srcToken, desc.dstToken, desc.dstReceiver, desc.amount, returnAmount, 0, desc.channel);

    }
}

File 4 of 15 : UniswapV3Router.sol
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.0;

import "./BaseCore.sol";

contract UniswapV3Router is BaseCore {

    using SafeMath for uint256;

    uint256 private constant _ZERO_FOR_ONE_MASK = 1 << 255;
    uint160 private constant MIN_SQRT_RATIO = 4295128739;
    uint160 private constant MAX_SQRT_RATIO = 1461446703485210103287273052203988822378723970342;

    constructor() {}

    fallback() external {
        (int256 amount0Delta, int256 amount1Delta, bytes memory _data) = abi.decode(msg.data[4:], (int256,int256,bytes));
        _executeCallback(amount0Delta, amount1Delta, _data);
    }

    function pancakeV3SwapCallback(
        int256 amount0Delta,
        int256 amount1Delta,
        bytes calldata _data
    ) external {
        _executeCallback(amount0Delta, amount1Delta, _data);
    }

    function uniswapV3SwapCallback(
        int256 amount0Delta,
        int256 amount1Delta,
        bytes calldata _data
    ) external {
        _executeCallback(amount0Delta, amount1Delta, _data);
    }

    function _executeCallback(
        int256 amount0Delta,
        int256 amount1Delta,
        bytes memory _data
    ) internal {
        require(amount0Delta > 0 || amount1Delta > 0, "M0 or M1"); // swaps entirely within 0-liquidity regions are not supported
        (uint256 pool, bytes memory tokenInAndPoolSalt) = abi.decode(_data, (uint256, bytes));
        (address tokenIn, bytes32 poolSalt) = abi.decode(tokenInAndPoolSalt, (address, bytes32));
        _verifyCallback(pool, poolSalt, msg.sender);

        uint256 amountToPay = uint256(amount1Delta);
        if (amount0Delta > 0) {
            amountToPay = uint256(amount0Delta);
        }

        TransferHelper.safeTransfer(tokenIn, msg.sender, amountToPay);
    }

    function exactInputV3SwapAndGasUsed(ExactInputV3SwapParams calldata params) external payable returns (uint256 returnAmount, uint256 gasUsed) {
        uint256 gasLeftBefore = gasleft();
        returnAmount = _executeV3Swap(params);
        gasUsed = gasLeftBefore - gasleft();

    }

    function exactInputV3Swap(ExactInputV3SwapParams calldata params) external payable returns (uint256 returnAmount) {
        returnAmount = _executeV3Swap(params);
    }

    function _executeV3Swap(ExactInputV3SwapParams calldata params) internal nonReentrant whenNotPaused(FunctionFlag.executeV3Swap) returns (uint256 returnAmount) {
        require(params.pools.length > 0, "Empty pools");
        require(params.deadline >= block.timestamp, "Expired");
        require(_wrapped_allowed[params.wrappedToken], "Invalid wrapped address");
        address tokenIn = params.srcToken;
        address tokenOut = params.dstToken;

        uint256 toBeforeBalance;
        bool isToETH;
        if (TransferHelper.isETH(params.srcToken)) {
            tokenIn = params.wrappedToken;
        }
        uint256 actualAmountIn = executeFunds(FunctionFlag.executeV3Swap, params.srcToken, params.wrappedToken, address(0), params.amount, params.fee, params.signature);

        if (TransferHelper.isETH(params.dstToken)) {
            tokenOut = params.wrappedToken;
            toBeforeBalance = IERC20(params.wrappedToken).balanceOf(address(this));
            isToETH = true;
        } else {
            toBeforeBalance = IERC20(params.dstToken).balanceOf(params.dstReceiver);
        }

        {
            uint256 len = params.pools.length;
            address recipient = address(this);
            bytes memory tokenInAndPoolSalt;
            if (len > 1) {
                address thisTokenIn = tokenIn;
                address thisTokenOut = address(0);
                for (uint256 i; i < len; i++) {
                    uint256 thisPool = params.pools[i];
                    (thisTokenIn, tokenInAndPoolSalt) = _verifyPool(thisTokenIn, thisTokenOut, thisPool);
                    if (i == len - 1 && !isToETH) {
                        recipient = params.dstReceiver;
                        thisTokenOut = tokenOut;
                    } 
                    actualAmountIn = _swap(recipient, thisPool, tokenInAndPoolSalt, actualAmountIn);
                }
                returnAmount = actualAmountIn;
            } else {
                (, tokenInAndPoolSalt) = _verifyPool(tokenIn, tokenOut, params.pools[0]);
                if (!isToETH) {
                    recipient = params.dstReceiver;
                }
                returnAmount = _swap(recipient, params.pools[0], tokenInAndPoolSalt, actualAmountIn);
            }
        }

        if (isToETH) {
            returnAmount = IERC20(params.wrappedToken).balanceOf(address(this)).sub(toBeforeBalance);
            require(returnAmount >= params.minReturnAmount, "Too little received");
            TransferHelper.safeWithdraw(params.wrappedToken, returnAmount);
            TransferHelper.safeTransferETH(params.dstReceiver, returnAmount);
        } else {
            returnAmount = IERC20(params.dstToken).balanceOf(params.dstReceiver).sub(toBeforeBalance);
            require(returnAmount >= params.minReturnAmount, "Too little received");
        }
        
        _emitTransit(params.srcToken, params.dstToken, params.dstReceiver, params.amount, returnAmount, 0, params.channel);

    }

    function _swap(address recipient, uint256 pool, bytes memory tokenInAndPoolSalt, uint256 amount) internal returns (uint256 amountOut) {
        bool zeroForOne = pool & _ZERO_FOR_ONE_MASK == 0;
        if (zeroForOne) {
            (, int256 amount1) =
                IUniswapV3Pool(address(uint160(pool))).swap(
                    recipient,
                    zeroForOne,
                    amount.toInt256(),
                    MIN_SQRT_RATIO + 1,
                    abi.encode(pool, tokenInAndPoolSalt)
                );
            amountOut = SafeMath.toUint256(-amount1);
        } else {
            (int256 amount0,) =
                IUniswapV3Pool(address(uint160(pool))).swap(
                    recipient,
                    zeroForOne,
                    amount.toInt256(),
                    MAX_SQRT_RATIO - 1,
                    abi.encode(pool, tokenInAndPoolSalt)
                );
            amountOut = SafeMath.toUint256(-amount0);
        }
    }

    function _verifyPool(address tokenIn, address tokenOut, uint256 pool) internal view returns (address nextTokenIn, bytes memory tokenInAndPoolSalt) {
        IUniswapV3Pool iPool = IUniswapV3Pool(address(uint160(pool)));
        address token0 = iPool.token0();
        address token1 = iPool.token1();
        uint24 fee = iPool.fee();
        bytes32 poolSalt = keccak256(abi.encode(token0, token1, fee));

        bool zeroForOne = pool & _ZERO_FOR_ONE_MASK == 0;
        if (zeroForOne) {
            require(tokenIn == token0, "Bad pool");
            if (tokenOut != address(0)) {
                require(tokenOut == token1, "Bad pool");
            }
            nextTokenIn = token1;
            tokenInAndPoolSalt = abi.encode(token0, poolSalt);
        } else {
            require(tokenIn == token1, "Bad pool");
            if (tokenOut != address(0)) {
                require(tokenOut == token0, "Bad pool");
            }
            nextTokenIn = token0;
            tokenInAndPoolSalt = abi.encode(token1, poolSalt);
        }
        _verifyCallback(pool, poolSalt, address(uint160(pool)));
    }

    function _verifyCallback(uint256 pool, bytes32 poolSalt, address caller) internal view {
        uint poolDigit = pool >> 248 & 0xf;
        UniswapV3Pool memory v3Pool = _uniswapV3_factory_allowed[poolDigit];
        require(v3Pool.factory != address(0), "Callback bad pool indexed");
        address calcPool = address(
            uint160(
                uint256(
                    keccak256(
                        abi.encodePacked(
                            hex'ff',
                            v3Pool.factory,
                            poolSalt,
                            v3Pool.initCodeHash
                        )
                    )
                )
            )
        );
        require(calcPool == caller, "Callback bad pool");
    }

}

File 5 of 15 : UniswapV2Router.sol
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.0;

import "./BaseCore.sol";

contract UniswapV2Router is BaseCore {

    using SafeMath for uint256;

    constructor() {

    }

    function _beforeSwap(ExactInputV2SwapParams calldata exactInput, bool supportingFeeOn) internal returns (bool isToETH, uint256 actualAmountIn, address[] memory paths, uint256 thisAddressBeforeBalance, uint256 toBeforeBalance) {
        require(exactInput.path.length == exactInput.pool.length + 1, "Invalid path");
        require(_wrapped_allowed[exactInput.wrappedToken], "Invalid wrapped address");

        (bool isToVault, uint256 vaultFee) = splitFee(exactInput.fee);
        actualAmountIn = calculateTradeFee(true, exactInput.amount, vaultFee, exactInput.signature);
        address[] memory path = exactInput.path;
        address dstToken = path[exactInput.path.length - 1];
        if (TransferHelper.isETH(exactInput.path[0])) {
            require(msg.value == exactInput.amount, "Invalid msg.value");
            if (isToVault) {
                TransferHelper.safeTransferETH(_vault, vaultFee);
            }
            path[0] = exactInput.wrappedToken;
            TransferHelper.safeDeposit(exactInput.wrappedToken, actualAmountIn);
        } else {
            if (supportingFeeOn) {
                actualAmountIn = IERC20(path[0]).balanceOf(address(this));
                TransferHelper.safeTransferFrom(path[0], msg.sender, address(this), exactInput.amount);
                actualAmountIn = IERC20(path[0]).balanceOf(address(this)).sub(actualAmountIn).sub(exactInput.fee);
            } else {
                TransferHelper.safeTransferFrom(path[0], msg.sender, address(this), exactInput.amount);
            }
            if (isToVault) {
                TransferHelper.safeTransferWithoutRequire(path[0], _vault, vaultFee);
            }
        }
        if (TransferHelper.isETH(dstToken)) {
            path[path.length - 1] = exactInput.wrappedToken;
            isToETH = true;
            thisAddressBeforeBalance = IERC20(exactInput.wrappedToken).balanceOf(address(this));
        } else {
            if (supportingFeeOn) {
                toBeforeBalance = IERC20(dstToken).balanceOf(exactInput.dstReceiver);
            }
        }
        paths = path;
    }

    function exactInputV2SwapAndGasUsed(ExactInputV2SwapParams calldata exactInput, uint256 deadline) external payable returns (uint256 returnAmount, uint256 gasUsed) {
        uint256 gasLeftBefore = gasleft();
        returnAmount = _executeV2Swap(exactInput, deadline);
        gasUsed = gasLeftBefore - gasleft();
    }

    function exactInputV2Swap(ExactInputV2SwapParams calldata exactInput, uint256 deadline) external payable returns (uint256 returnAmount) {
        returnAmount = _executeV2Swap(exactInput, deadline);
    }

    function _executeV2Swap(ExactInputV2SwapParams calldata exactInput, uint256 deadline) internal nonReentrant whenNotPaused(FunctionFlag.executeV2Swap) returns (uint256 returnAmount) {
        require(deadline >= block.timestamp, "Expired");
        
        bool supportingFeeOn = exactInput.router >> 248 & 0xf == 1;
        {
            (bool isToETH, uint256 actualAmountIn, address[] memory paths, uint256 thisAddressBeforeBalance, uint256 toBeforeBalance) = _beforeSwap(exactInput, supportingFeeOn);
            
            TransferHelper.safeTransfer(paths[0], exactInput.pool[0], actualAmountIn);

            if (supportingFeeOn) {
                if(isToETH) {
                    _swapSupportingFeeOnTransferTokens(address(uint160(exactInput.router)), paths, exactInput.pool, address(this));
                    returnAmount = IERC20(exactInput.wrappedToken).balanceOf(address(this)).sub(thisAddressBeforeBalance);
                } else {
                    _swapSupportingFeeOnTransferTokens(address(uint160(exactInput.router)), paths, exactInput.pool, exactInput.dstReceiver);
                    returnAmount = IERC20(paths[paths.length - 1]).balanceOf(exactInput.dstReceiver).sub(toBeforeBalance);
                }
            } else {
                uint[] memory amounts = IUniswapV2(address(uint160(exactInput.router))).getAmountsOut(actualAmountIn, paths);
                if(isToETH) {
                    _swap(amounts, paths, exactInput.pool, address(this));
                    returnAmount = IERC20(exactInput.wrappedToken).balanceOf(address(this)).sub(thisAddressBeforeBalance);
                } else {
                    _swap(amounts, paths, exactInput.pool, exactInput.dstReceiver);
                    returnAmount = IERC20(paths[paths.length - 1]).balanceOf(exactInput.dstReceiver).sub(toBeforeBalance);
                }
            }

            require(returnAmount >= exactInput.minReturnAmount, "Too little received");
            if (isToETH) {
                TransferHelper.safeWithdraw(exactInput.wrappedToken, returnAmount);
                TransferHelper.safeTransferETH(exactInput.dstReceiver, returnAmount);
            }
        }
        string memory channel = exactInput.channel;

        _emitTransit(exactInput.path[0], exactInput.path[exactInput.path.length - 1], exactInput.dstReceiver, exactInput.amount, returnAmount, 0, channel);
        
    }

    function _swap(uint[] memory amounts, address[] memory path, address[] memory pool, address _to) internal {
        for (uint i; i < path.length - 1; i++) {
            (address input, address output) = (path[i], path[i + 1]);
            (address token0,) = input < output ? (input, output) : (output, input);
            uint amountOut = amounts[i + 1];
            (uint amount0Out, uint amount1Out) = input == token0 ? (uint(0), amountOut) : (amountOut, uint(0));
            address to = i < path.length - 2 ? pool[i + 1] : _to;
            IUniswapV2(pool[i]).swap(
                amount0Out, amount1Out, to, new bytes(0)
            );
        }
    }

    function _swapSupportingFeeOnTransferTokens(address router, address[] memory path, address[] memory pool, address _to) internal virtual {
        for (uint i; i < path.length - 1; i++) {
            (address input, address output) = (path[i], path[i + 1]);
            (address token0,) = input < output ? (input, output) : (output, input);
            IUniswapV2 pair = IUniswapV2(pool[i]);
            uint amountInput;
            uint amountOutput;
            { // scope to avoid stack too deep errors
                (uint reserve0, uint reserve1,) = pair.getReserves();
                (uint reserveInput, uint reserveOutput) = input == token0 ? (reserve0, reserve1) : (reserve1, reserve0);
                amountInput = IERC20(input).balanceOf(address(pair)).sub(reserveInput);
                amountOutput = IUniswapV2(router).getAmountOut(amountInput, reserveInput, reserveOutput);
            }
            (uint amount0Out, uint amount1Out) = input == token0 ? (uint(0), amountOutput) : (amountOutput, uint(0));
            address to = i < path.length - 2 ? pool[i + 1] : _to;
            pair.swap(amount0Out, amount1Out, to, new bytes(0));
        }
    }

}

File 6 of 15 : BaseCore.sol
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.0;

import "./libs/Pausable.sol";
import "./libs/ReentrancyGuard.sol";
import "./libs/TransferHelper.sol";
import "./libs/RevertReasonParser.sol";
import "./libs/SafeMath.sol";
import "./libs/Ownable.sol";
import "./interfaces/IERC20.sol";
import "./interfaces/IUniswapV2.sol";
import "./interfaces/IUniswapV3Pool.sol";


contract BaseCore is Ownable, Pausable, ReentrancyGuard {

    using SafeMath for uint256;

    struct ExactInputV2SwapParams {
        address dstReceiver;
        address wrappedToken;
        uint256 router;
        uint256 amount;
        uint256 minReturnAmount;
        uint256 fee;
        address[] path;
        address[] pool;
        bytes signature;
        string channel;
    }

    struct ExactInputV3SwapParams {
        address srcToken;
        address dstToken;
        address dstReceiver;
        address wrappedToken;
        uint256 amount;
        uint256 minReturnAmount;
        uint256 fee;
        uint256 deadline;
        uint256[] pools;
        bytes signature;
        string channel;
    }

    struct TransitSwapDescription {
        address srcToken;
        address dstToken;
        address dstReceiver;
        address wrappedToken;
        uint256 amount;
        uint256 minReturnAmount;
        uint256 fee;
        string channel;
        bytes signature;
    }

    struct CrossDescription {
        address srcToken;
        address dstToken;
        address caller;
        address dstReceiver;
        address wrappedToken;
        uint256 amount;
        uint256 fee;
        uint256 toChain;
        string channel;
        bytes calls;
        bytes signature;
    }

    struct CallbytesDescription {
        address srcToken;
        bytes calldatas;
    }

    struct UniswapV3Pool {
        address factory;
        bytes initCodeHash;
    }

    uint256 internal _aggregate_fee;
    uint256 internal _cross_fee;
    address internal _aggregate_bridge;
    address internal _fee_signer;
    address internal _vault;
    bytes32 public DOMAIN_SEPARATOR;
    //whitelist cross's caller
    mapping(address => bool) internal _cross_caller_allowed;
    //whitelist wrapped
    mapping(address => bool) internal _wrapped_allowed;
    //whitelist uniswap v3 factory
    mapping(uint => UniswapV3Pool) internal _uniswapV3_factory_allowed;
    bytes32 public constant CHECKFEE_TYPEHASH = keccak256("CheckFee(address payer,uint256 amount,uint256 fee)");

    event Receipt(address from, uint256 amount);
    event Withdraw(address indexed token, address indexed executor, address indexed recipient, uint amount);
    event ChangeWrappedAllowed(address[] wrappedTokens, bool[] newAllowed);
    event ChangeV3FactoryAllowed(uint256[] poolIndex, address[] factories, bytes[] initCodeHash);
    event ChangeCrossCallerAllowed(address[] callers);
    event ChangeFeeRate(bool isAggregate, uint256 newRate);
    event ChangeSigner(address preSigner, address newSigner);
    event ChangeAggregateBridge(address newBridge);
    event ChangeVault(address preVault, address newVault);
    event TransitSwapped(address indexed srcToken, address indexed dstToken, address indexed dstReceiver, uint256 amount, uint256 returnAmount, uint256 toChainID, string channel);
    
    constructor() Ownable(msg.sender) {
        DOMAIN_SEPARATOR = keccak256(
            abi.encode(
                keccak256("EIP712Domain(string name,string version,uint256 chainId,address verifyingContract)"),
                keccak256(bytes("TransitSwapV5")),
                keccak256(bytes("5")),
                block.chainid,
                address(this)
            )
        );
    }

    receive() external payable {
        emit Receipt(msg.sender, msg.value);
    }

    function calculateTradeFee(bool isAggregate, uint256 tradeAmount, uint256 fee, bytes calldata signature) internal view returns (uint256) {
        uint256 thisFee;
        if (isAggregate) {
            thisFee = tradeAmount.mul(_aggregate_fee).div(10000);
        } else {
            thisFee = tradeAmount.mul(_cross_fee).div(10000);
        }
        if (fee < thisFee) {
            require(verifySignature(tradeAmount, fee, signature), "Invalid signature fee");
        }
        return tradeAmount.sub(fee);
    }

    function _emitTransit(address srcToken, address dstToken, address dstReceiver, uint256 amount, uint256 returnAmount, uint256 toChainID, string memory channel) internal {
        emit TransitSwapped (
            srcToken, 
            dstToken, 
            dstReceiver,
            amount,
            returnAmount,
            toChainID,
            channel
        );
    }

    function changeFee(bool[] memory isAggregate, uint256[] memory newRate) external onlyExecutor {
        for (uint i; i < isAggregate.length; i++) {
            require(newRate[i] >= 0 && newRate[i] <= 1000, "fee rate is:0-1000");
            if (isAggregate[i]) {
                _aggregate_fee = newRate[i];
            } else {
                _cross_fee = newRate[i];
            }
            emit ChangeFeeRate(isAggregate[i], newRate[i]);
        }
    }

    function changeTransitProxy(address aggregator, address signer, address vault) external onlyExecutor {
        if (aggregator != address(0)) {
            _aggregate_bridge = aggregator;
            emit ChangeAggregateBridge(aggregator);
        }
        if (signer != address(0)) {
            address preSigner = _fee_signer;
            _fee_signer = signer;
            emit ChangeSigner(preSigner, signer);
        }
        if (vault != address(0)) {
            address preVault = _vault;
            _vault = vault;
            emit ChangeVault(preVault, vault);
        }
    }

    function changeAllowed(address[] calldata crossCallers, address[] calldata wrappedTokens) public onlyExecutor {
        if(crossCallers.length != 0){
            for (uint i; i < crossCallers.length; i++) {
                _cross_caller_allowed[crossCallers[i]] = !_cross_caller_allowed[crossCallers[i]];
            }
            emit ChangeCrossCallerAllowed(crossCallers);
        }
        if(wrappedTokens.length != 0) {
            bool[] memory newAllowed = new bool[](wrappedTokens.length);
            for (uint index; index < wrappedTokens.length; index++) {
                _wrapped_allowed[wrappedTokens[index]] = !_wrapped_allowed[wrappedTokens[index]];
                newAllowed[index] = _wrapped_allowed[wrappedTokens[index]];
            }
            emit ChangeWrappedAllowed(wrappedTokens, newAllowed);
        }
    }

    function changeUniswapV3FactoryAllowed(uint[] calldata poolIndex, address[] calldata factories, bytes[] calldata initCodeHash) public onlyExecutor {
        require(poolIndex.length == initCodeHash.length, "invalid data");
        require(factories.length == initCodeHash.length, "invalid data");
        uint len = factories.length;
        for (uint i; i < len; i++) {
            _uniswapV3_factory_allowed[poolIndex[i]] = UniswapV3Pool(factories[i],initCodeHash[i]);
        }
        emit ChangeV3FactoryAllowed(poolIndex, factories, initCodeHash);
    }

    function changePause(bool paused, FunctionFlag[] calldata flags) external onlyExecutor {
        uint len = flags.length;
        for (uint i; i < len; i++) {
            if (paused) {
                _pause(flags[i]);
            } else {
                _unpause(flags[i]);
            }
        }
    }

    function transitProxyAddress() external view returns (address bridgeProxy, address feeSigner) {
        bridgeProxy = _aggregate_bridge;
        feeSigner = _fee_signer;
    }

    function transitFee() external view returns (uint256, uint256, address) {
        return (_aggregate_fee, _cross_fee, _vault);
    }

    function transitAllowedQuery(address crossCaller, address wrappedToken, uint256 poolIndex) external view returns (bool isCrossCallerAllowed, bool isWrappedAllowed, UniswapV3Pool memory pool) {
        isCrossCallerAllowed = _cross_caller_allowed[crossCaller];
        isWrappedAllowed = _wrapped_allowed[wrappedToken];
        pool = _uniswapV3_factory_allowed[poolIndex];
    }

    function verifySignature(uint256 amount, uint256 fee, bytes calldata signature) internal view returns (bool) {
        bytes32 digest = keccak256(
            abi.encodePacked(
                "\x19\x01",
                DOMAIN_SEPARATOR,
                keccak256(abi.encode(CHECKFEE_TYPEHASH, msg.sender, amount, fee))
            )
        );
        (uint8 v, bytes32 r, bytes32 s) = splitSignature(signature);
        address recovered = ecrecover(digest, v, r, s);
        return recovered == _fee_signer;
    }

    function splitSignature(bytes memory _signature) internal pure returns (uint8 v, bytes32 r, bytes32 s) {
        require(bytes(_signature).length == 65, "Invalid signature length");

        assembly {
            r := mload(add(_signature, 0x20))
            s := mload(add(_signature, 0x40))
            v := byte(0, mload(add(_signature, 0x60)))
        }

        return (v, r, s);
    }

    function splitFee(uint256 fee) internal view returns (bool isToVault, uint256 vaultFee) {
        uint vaultFlag = fee % 10;
        vaultFee = (fee.sub(vaultFlag)).div(10);
        if (vaultFlag == 1 && vaultFee > 0 && _vault != address(0)) {
            isToVault = true;
        }
    }

    function executeFunds(FunctionFlag flag, address srcToken, address wrappedToken, address caller, uint256 amount, uint256 fee, bytes calldata signature) internal returns (uint256 swapAmount) {
        (bool isToVault, uint256 vaultFee) = splitFee(fee);
        bool isAggregate = flag == FunctionFlag.cross ? false : true;
        uint256 actualAmountIn = calculateTradeFee(isAggregate, amount, vaultFee, signature);
        if (TransferHelper.isETH(srcToken)) {
            if (flag == FunctionFlag.cross) {
                require(msg.value >= amount, "invalid msg.value");
                swapAmount = msg.value.sub(vaultFee);
            } else {
                require(msg.value == amount, "invalid msg.value");
                swapAmount = actualAmountIn;
            }
            if (wrappedToken != address(0)) {
                require(_wrapped_allowed[wrappedToken], "Invalid wrapped address");
                if (flag == FunctionFlag.cross) {
                    TransferHelper.safeDeposit(wrappedToken, swapAmount);
                    TransferHelper.safeApprove(wrappedToken, caller, swapAmount);
                    swapAmount = 0;
                } else if (flag == FunctionFlag.executeV3Swap) {
                    TransferHelper.safeDeposit(wrappedToken, actualAmountIn);
                }
            }
            if (isToVault) {
                TransferHelper.safeTransferETH(_vault, vaultFee);
            }
        } else {
            TransferHelper.safeTransferFrom(srcToken, msg.sender, address(this), amount);
            if (flag == FunctionFlag.cross) {
                TransferHelper.safeApprove(srcToken, caller, actualAmountIn);
                swapAmount = msg.value;
            } else if (flag == FunctionFlag.executeAggregate) {
                TransferHelper.safeTransfer(srcToken, caller, actualAmountIn);
            } else if (flag == FunctionFlag.executeV3Swap) {
                swapAmount = actualAmountIn;
            }
            if (isToVault) {
                TransferHelper.safeTransferWithoutRequire(srcToken, _vault, vaultFee);
            }
        }
    }

}

File 7 of 15 : IUniswapV3Pool.sol
// SPDX-License-Identifier: MIT
pragma solidity >=0.5.0;

interface IUniswapV3Pool {
    function token0() external view returns (address);
    function token1() external view returns (address);
    function fee() external view returns (uint24);
    function swap(
        address recipient,
        bool zeroForOne,
        int256 amountSpecified,
        uint160 sqrtPriceLimitX96,
        bytes calldata data
    ) external returns (int256 amount0, int256 amount1);
}

File 8 of 15 : IUniswapV2.sol
// SPDX-License-Identifier: MIT
pragma solidity >=0.6.9;

interface IUniswapV2 {
    function getAmountOut(uint amountIn, uint reserveIn, uint reserveOut) external pure returns (uint amountOut);
    function getAmountsOut(uint amountIn, address[] memory path) external view returns (uint[] memory amounts);
    function getReserves() external view returns (uint112 reserve0, uint112 reserve1, uint32 blockTimestampLast);
    function swap(uint amount0Out, uint amount1Out, address to, bytes calldata data) external;
}

File 9 of 15 : IERC20.sol
// SPDX-License-Identifier: MIT
pragma solidity >=0.6.9;

interface IERC20 {
    
    function totalSupply() external view returns (uint256);
    function decimals() external view returns (uint8);
    function name() external view returns (string memory);
    function symbol() external view returns (string memory);
    function balanceOf(address account) external view returns (uint256);
    function transfer(address recipient, uint256 amount) external returns (bool);
    function allowance(address owner, address spender) external view returns (uint256);
    function approve(address spender, uint256 amount) external returns (bool);
    function transferFrom(address sender, address recipient, uint256 amount) external returns (bool);
 
}

File 10 of 15 : Ownable.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v4.7.0) (access/Ownable.sol)
// Add executor extension

pragma solidity ^0.8.0;

/**
 * @dev Contract module which provides a basic access control mechanism, where
 * there is an account (an owner) that can be granted exclusive access to
 * specific functions.
 *
 * By default, the owner account will be the one that deploys the contract. This
 * can later be changed with {transferOwnership}.
 *
 * This module is used through inheritance. It will make available the modifier
 * `onlyOwner`, which can be applied to your functions to restrict their use to
 * the owner.
 */
abstract contract Ownable {

    address private _executor;
    address private _pendingExecutor;
    bool internal _initialized;

    event ExecutorshipTransferStarted(address indexed previousExecutor, address indexed newExecutor);
    event ExecutorshipTransferred(address indexed previousExecutor, address indexed newExecutor);

    /**
     * @dev Initializes the contract setting the deployer as the initial owner.
     */
    constructor(address newExecutor) {
        require(!_initialized, "Ownable: initialized");
        _transferExecutorship(newExecutor);
        _initialized = true;
    }

    /**
     * @dev Throws if called by any account other than the executor.
     */
    modifier onlyExecutor() {
        _checkExecutor();
        _;
    }

    /**
     * @dev Returns the address of the current executor.
     */
    function executor() public view virtual returns (address) {
        return _executor;
    }

    /**
     * @dev Returns the address of the pending executor.
     */
    function pendingExecutor() public view virtual returns (address) {
        return _pendingExecutor;
    }

    /**
     * @dev Throws if the sender is not the executor.
     */
    function _checkExecutor() internal view virtual {
        require(executor() == msg.sender, "Ownable: caller is not the executor");
    }

    /**
     * @dev Transfers executorship of the contract to a new account (`newExecutor`).
     * Can only be called by the current executor.
     */
    function transferExecutorship(address newExecutor) public virtual onlyExecutor {
        _pendingExecutor = newExecutor;
        emit ExecutorshipTransferStarted(executor(), newExecutor);
    }

    function _transferExecutorship(address newExecutor) internal virtual {
        delete _pendingExecutor;
        address oldExecutor = _executor;
        _executor = newExecutor;
        emit ExecutorshipTransferred(oldExecutor, newExecutor);
    }

    function acceptExecutorship() external {
        address sender = msg.sender;
        require(pendingExecutor() == sender, "Ownable: caller is not the new executor");
        _transferExecutorship(sender);
    }
}

File 11 of 15 : SafeMath.sol
// SPDX-License-Identifier: MIT
pragma solidity >=0.6.0;

library SafeMath {

    function sub(uint x, uint y) internal pure returns (uint z) {
        require((z = x - y) <= x, 'ds-math-sub-underflow');
    }

    function mul(uint x, uint y) internal pure returns (uint z) {
        require(y == 0 || (z = x * y) / y == x, 'ds-math-mul-overflow');
    }
    
    function div(uint x, uint y) internal pure returns (uint z) {
        require(y != 0 , 'ds-math-div-zero');
        z = x / y;
    }

    function toInt256(uint256 value) internal pure returns (int256) {
        require(value <= uint256(type(int256).max), "SafeCast: value doesn't fit in an int256");
        return int256(value);
    }

    function toUint256(int256 value) internal pure returns (uint256) {
        require(value >= 0, "SafeCast: value must be positive");
        return uint256(value);
    }
}

File 12 of 15 : RevertReasonParser.sol
// SPDX-License-Identifier: MIT
pragma solidity >=0.6.0;

library RevertReasonParser {
        function parse(bytes memory data, string memory prefix) internal pure returns (string memory) {
        // https://solidity.readthedocs.io/en/latest/control-structures.html#revert
        // We assume that revert reason is abi-encoded as Error(string)

        // 68 = 4-byte selector 0x08c379a0 + 32 bytes offset + 32 bytes length
        if (data.length >= 68 && data[0] == "\x08" && data[1] == "\xc3" && data[2] == "\x79" && data[3] == "\xa0") {
            string memory reason;
            // solhint-disable no-inline-assembly
            assembly {
                // 68 = 32 bytes data length + 4-byte selector + 32 bytes offset
                reason := add(data, 68)
            }
            /*
                revert reason is padded up to 32 bytes with ABI encoder: Error(string)
                also sometimes there is extra 32 bytes of zeros padded in the end:
                https://github.com/ethereum/solidity/issues/10170
                because of that we can't check for equality and instead check
                that string length + extra 68 bytes is less than overall data length
            */
            require(data.length >= 68 + bytes(reason).length, "Invalid revert reason");
            return string(abi.encodePacked(prefix, "Error(", reason, ")"));
        }
        // 36 = 4-byte selector 0x4e487b71 + 32 bytes integer
        else if (data.length == 36 && data[0] == "\x4e" && data[1] == "\x48" && data[2] == "\x7b" && data[3] == "\x71") {
            uint256 code;
            // solhint-disable no-inline-assembly
            assembly {
                // 36 = 32 bytes data length + 4-byte selector
                code := mload(add(data, 36))
            }
            return string(abi.encodePacked(prefix, "Panic(", _toHex(code), ")"));
        }

        return string(abi.encodePacked(prefix, "Unknown(", _toHex(data), ")"));
    }
    
    function _toHex(uint256 value) private pure returns(string memory) {
        return _toHex(abi.encodePacked(value));
    }

    function _toHex(bytes memory data) private pure returns(string memory) {
        bytes16 alphabet = 0x30313233343536373839616263646566;
        bytes memory str = new bytes(2 + data.length * 2);
        str[0] = "0";
        str[1] = "x";
        for (uint256 i = 0; i < data.length; i++) {
            str[2 * i + 2] = alphabet[uint8(data[i] >> 4)];
            str[2 * i + 3] = alphabet[uint8(data[i] & 0x0f)];
        }
        return string(str);
    }
}

File 13 of 15 : TransferHelper.sol
// SPDX-License-Identifier: MIT
pragma solidity >=0.6.0;

library TransferHelper {
    
    address private constant _ETH_ADDRESS = address(0xEeeeeEeeeEeEeeEeEeEeeEEEeeeeEeeeeeeeEEeE);
    address private constant _ZERO_ADDRESS = address(0);
    
    function isETH(address token) internal pure returns (bool) {
        return (token == _ZERO_ADDRESS || token == _ETH_ADDRESS);
    }
    
    function safeApprove(address token, address to, uint value) internal {
        // bytes4(keccak256(bytes('approve(address,uint256)')));
        (bool success, bytes memory data) = token.call(abi.encodeWithSelector(0x095ea7b3, to, value));
        require(success && (data.length == 0 || abi.decode(data, (bool))), 'TransferHelper: APPROVE_FAILED');
    }

    function safeTransfer(address token, address to, uint value) internal {
        // bytes4(keccak256(bytes('transfer(address,uint256)')));
        (bool success, bytes memory data) = token.call(abi.encodeWithSelector(0xa9059cbb, to, value));
        require(success && (data.length == 0 || abi.decode(data, (bool))), 'TransferHelper: TRANSFER_TOKEN_FAILED');
    }

    function safeTransferWithoutRequire(address token, address to, uint256 value) internal returns (bool) {
        // bytes4(keccak256(bytes('transfer(address,uint256)')));
        (bool success, bytes memory data) = token.call(abi.encodeWithSelector(0xa9059cbb, to, value));
        return (success && (data.length == 0 || abi.decode(data, (bool))));
    }

    function safeTransferFrom(address token, address from, address to, uint value) internal {
        // bytes4(keccak256(bytes('transferFrom(address,address,uint256)')));
        (bool success, bytes memory data) = token.call(abi.encodeWithSelector(0x23b872dd, from, to, value));
        require(success && (data.length == 0 || abi.decode(data, (bool))), 'TransferHelper: TRANSFER_FROM_FAILED');
    }

    function safeTransferETH(address to, uint value) internal {
        // solium-disable-next-line
        (bool success,) = to.call{value:value}(new bytes(0));
        require(success, 'TransferHelper: TRANSFER_FAILED');
    }

    function safeDeposit(address wrapped, uint value) internal {
        // bytes4(keccak256(bytes('deposit()')));
        (bool success, bytes memory data) = wrapped.call{value:value}(abi.encodeWithSelector(0xd0e30db0));
        require(success && (data.length == 0 || abi.decode(data, (bool))), 'TransferHelper: DEPOSIT_FAILED');
    }

    function safeWithdraw(address wrapped, uint value) internal {
        // bytes4(keccak256(bytes('withdraw(uint256 wad)')));
        (bool success, bytes memory data) = wrapped.call{value:0}(abi.encodeWithSelector(0x2e1a7d4d, value));
        require(success && (data.length == 0 || abi.decode(data, (bool))), 'TransferHelper: WITHDRAW_FAILED');
    }
}

File 14 of 15 : ReentrancyGuard.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.1 (security/ReentrancyGuard.sol)

pragma solidity ^0.8.0;

/**
 * @dev Contract module that helps prevent reentrant calls to a function.
 *
 * Inheriting from `ReentrancyGuard` will make the {nonReentrant} modifier
 * available, which can be applied to functions to make sure there are no nested
 * (reentrant) calls to them.
 *
 * Note that because there is a single `nonReentrant` guard, functions marked as
 * `nonReentrant` may not call one another. This can be worked around by making
 * those functions `private`, and then adding `external` `nonReentrant` entry
 * points to them.
 *
 * TIP: If you would like to learn more about reentrancy and alternative ways
 * to protect against it, check out our blog post
 * https://blog.openzeppelin.com/reentrancy-after-istanbul/[Reentrancy After Istanbul].
 */
abstract contract ReentrancyGuard {
    // Booleans are more expensive than uint256 or any type that takes up a full
    // word because each write operation emits an extra SLOAD to first read the
    // slot's contents, replace the bits taken up by the boolean, and then write
    // back. This is the compiler's defense against contract upgrades and
    // pointer aliasing, and it cannot be disabled.

    // The values being non-zero value makes deployment a bit more expensive,
    // but in exchange the refund on every call to nonReentrant will be lower in
    // amount. Since refunds are capped to a percentage of the total
    // transaction's gas, it is best to keep them low in cases like this one, to
    // increase the likelihood of the full refund coming into effect.
    uint256 private constant _NOT_ENTERED = 1;
    uint256 private constant _ENTERED = 2;

    uint256 private _status;

    constructor() {
        _status = _NOT_ENTERED;
    }

    /**
     * @dev Prevents a contract from calling itself, directly or indirectly.
     * Calling a `nonReentrant` function from another `nonReentrant`
     * function is not supported. It is possible to prevent this from happening
     * by making the `nonReentrant` function external, and making it call a
     * `private` function that does the actual work.
     */
    modifier nonReentrant() {
        require(_status != _ENTERED, "ReentrancyGuard: reentrant call");
        assembly {
            sstore(_status.slot, _ENTERED)
        }
        _;
        assembly {
            sstore(_status.slot, _NOT_ENTERED)
        }
    }

    function _nonReentrantBefore() private {
        // On the first call to nonReentrant, _status will be _NOT_ENTERED
        require(_status != _ENTERED, "ReentrancyGuard: reentrant call");

        // Any calls to nonReentrant after this point will fail
        _status = _ENTERED;
    }

    function _nonReentrantAfter() private {
        // By storing the original value once again, a refund is triggered (see
        // https://eips.ethereum.org/EIPS/eip-2200)
        _status = _NOT_ENTERED;
    }
}

File 15 of 15 : Pausable.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v4.7.0) (security/Pausable.sol)

pragma solidity ^0.8.0;

/**
 * @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 {
    /**
     * @dev Emitted when the pause is triggered by `account`.
     */
    event Paused(address account, FunctionFlag flag);

    /**
     * @dev Emitted when the pause is lifted by `account`.
     */
    event Unpaused(address account, FunctionFlag flag);

    mapping(FunctionFlag => bool) private _paused;

    enum FunctionFlag {executeAggregate, executeV2Swap, executeV3Swap, cross}

    /**
     * @dev Initializes the contract in unpaused state.
     */
    constructor() {
    }

    /**
     * @dev Modifier to make a function callable only when the contract is not paused.
     *
     * Requirements:
     *
     * - The contract must not be paused.
     */
    modifier whenNotPaused(FunctionFlag flag) {
        _requireNotPaused(flag);
        _;
    }

    /**
     * @dev Modifier to make a function callable only when the contract is paused.
     *
     * Requirements:
     *
     * - The contract must be paused.
     */
    modifier whenPaused(FunctionFlag flag) {
        _requirePaused(flag);
        _;
    }

    /**
     * @dev Returns true if the contract is paused, and false otherwise.
     */
    function paused(FunctionFlag flag) public view virtual returns (bool) {
        return _paused[flag];
    }

    /**
     * @dev Throws if the contract is paused.
     */
    function _requireNotPaused(FunctionFlag flag) internal view virtual {
        require(!paused(flag), "Pausable: paused");
    }

    /**
     * @dev Throws if the contract is not paused.
     */
    function _requirePaused(FunctionFlag flag) internal view virtual {
        require(paused(flag), "Pausable: not paused");
    }

    /**
     * @dev Triggers stopped state.
     *
     * Requirements:
     *
     * - The contract must not be paused.
     */
    function _pause(FunctionFlag flag) internal virtual whenNotPaused(flag) {
        _paused[flag] = true;
        emit Paused(msg.sender, flag);
    }

    /**
     * @dev Returns to normal state.
     *
     * Requirements:
     *
     * - The contract must be paused.
     */
    function _unpause(FunctionFlag flag) internal virtual whenPaused(flag) {
        _paused[flag] = false;
        emit Unpaused(msg.sender, flag);
    }

    function pausedOverAll() public view virtual returns (bool executeAggregate, bool executeV2Swap, bool executeV3Swap, bool cross) {
        executeAggregate = _paused[FunctionFlag.executeAggregate];
        executeV2Swap = _paused[FunctionFlag.executeV2Swap];
        executeV3Swap = _paused[FunctionFlag.executeV3Swap];
        cross = _paused[FunctionFlag.cross];
    }
}

Settings
{
  "optimizer": {
    "enabled": true,
    "runs": 200
  },
  "outputSelection": {
    "*": {
      "*": [
        "evm.bytecode",
        "evm.deployedBytecode",
        "devdoc",
        "userdoc",
        "metadata",
        "abi"
      ]
    }
  }
}

Contract Security Audit

Contract ABI

[{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"newBridge","type":"address"}],"name":"ChangeAggregateBridge","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address[]","name":"callers","type":"address[]"}],"name":"ChangeCrossCallerAllowed","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"bool","name":"isAggregate","type":"bool"},{"indexed":false,"internalType":"uint256","name":"newRate","type":"uint256"}],"name":"ChangeFeeRate","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"preSigner","type":"address"},{"indexed":false,"internalType":"address","name":"newSigner","type":"address"}],"name":"ChangeSigner","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256[]","name":"poolIndex","type":"uint256[]"},{"indexed":false,"internalType":"address[]","name":"factories","type":"address[]"},{"indexed":false,"internalType":"bytes[]","name":"initCodeHash","type":"bytes[]"}],"name":"ChangeV3FactoryAllowed","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"preVault","type":"address"},{"indexed":false,"internalType":"address","name":"newVault","type":"address"}],"name":"ChangeVault","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address[]","name":"wrappedTokens","type":"address[]"},{"indexed":false,"internalType":"bool[]","name":"newAllowed","type":"bool[]"}],"name":"ChangeWrappedAllowed","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousExecutor","type":"address"},{"indexed":true,"internalType":"address","name":"newExecutor","type":"address"}],"name":"ExecutorshipTransferStarted","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousExecutor","type":"address"},{"indexed":true,"internalType":"address","name":"newExecutor","type":"address"}],"name":"ExecutorshipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"account","type":"address"},{"indexed":false,"internalType":"enum Pausable.FunctionFlag","name":"flag","type":"uint8"}],"name":"Paused","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"from","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"Receipt","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"srcToken","type":"address"},{"indexed":true,"internalType":"address","name":"dstToken","type":"address"},{"indexed":true,"internalType":"address","name":"dstReceiver","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"returnAmount","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"toChainID","type":"uint256"},{"indexed":false,"internalType":"string","name":"channel","type":"string"}],"name":"TransitSwapped","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"account","type":"address"},{"indexed":false,"internalType":"enum Pausable.FunctionFlag","name":"flag","type":"uint8"}],"name":"Unpaused","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"token","type":"address"},{"indexed":true,"internalType":"address","name":"executor","type":"address"},{"indexed":true,"internalType":"address","name":"recipient","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"Withdraw","type":"event"},{"stateMutability":"nonpayable","type":"fallback"},{"inputs":[],"name":"CHECKFEE_TYPEHASH","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"DOMAIN_SEPARATOR","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"acceptExecutorship","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"components":[{"internalType":"address","name":"srcToken","type":"address"},{"internalType":"address","name":"dstToken","type":"address"},{"internalType":"address","name":"dstReceiver","type":"address"},{"internalType":"address","name":"wrappedToken","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"uint256","name":"minReturnAmount","type":"uint256"},{"internalType":"uint256","name":"fee","type":"uint256"},{"internalType":"string","name":"channel","type":"string"},{"internalType":"bytes","name":"signature","type":"bytes"}],"internalType":"struct BaseCore.TransitSwapDescription","name":"desc","type":"tuple"},{"components":[{"internalType":"address","name":"srcToken","type":"address"},{"internalType":"bytes","name":"calldatas","type":"bytes"}],"internalType":"struct BaseCore.CallbytesDescription","name":"callbytesDesc","type":"tuple"}],"name":"aggregate","outputs":[{"internalType":"uint256","name":"returnAmount","type":"uint256"}],"stateMutability":"payable","type":"function"},{"inputs":[{"components":[{"internalType":"address","name":"srcToken","type":"address"},{"internalType":"address","name":"dstToken","type":"address"},{"internalType":"address","name":"dstReceiver","type":"address"},{"internalType":"address","name":"wrappedToken","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"uint256","name":"minReturnAmount","type":"uint256"},{"internalType":"uint256","name":"fee","type":"uint256"},{"internalType":"string","name":"channel","type":"string"},{"internalType":"bytes","name":"signature","type":"bytes"}],"internalType":"struct BaseCore.TransitSwapDescription","name":"desc","type":"tuple"},{"components":[{"internalType":"address","name":"srcToken","type":"address"},{"internalType":"bytes","name":"calldatas","type":"bytes"}],"internalType":"struct BaseCore.CallbytesDescription","name":"callbytesDesc","type":"tuple"}],"name":"aggregateAndGasUsed","outputs":[{"internalType":"uint256","name":"returnAmount","type":"uint256"},{"internalType":"uint256","name":"gasUsed","type":"uint256"}],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address[]","name":"crossCallers","type":"address[]"},{"internalType":"address[]","name":"wrappedTokens","type":"address[]"}],"name":"changeAllowed","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool[]","name":"isAggregate","type":"bool[]"},{"internalType":"uint256[]","name":"newRate","type":"uint256[]"}],"name":"changeFee","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"paused","type":"bool"},{"internalType":"enum Pausable.FunctionFlag[]","name":"flags","type":"uint8[]"}],"name":"changePause","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"aggregator","type":"address"},{"internalType":"address","name":"signer","type":"address"},{"internalType":"address","name":"vault","type":"address"}],"name":"changeTransitProxy","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256[]","name":"poolIndex","type":"uint256[]"},{"internalType":"address[]","name":"factories","type":"address[]"},{"internalType":"bytes[]","name":"initCodeHash","type":"bytes[]"}],"name":"changeUniswapV3FactoryAllowed","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"components":[{"internalType":"address","name":"srcToken","type":"address"},{"internalType":"address","name":"dstToken","type":"address"},{"internalType":"address","name":"caller","type":"address"},{"internalType":"address","name":"dstReceiver","type":"address"},{"internalType":"address","name":"wrappedToken","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"uint256","name":"fee","type":"uint256"},{"internalType":"uint256","name":"toChain","type":"uint256"},{"internalType":"string","name":"channel","type":"string"},{"internalType":"bytes","name":"calls","type":"bytes"},{"internalType":"bytes","name":"signature","type":"bytes"}],"internalType":"struct BaseCore.CrossDescription","name":"desc","type":"tuple"}],"name":"cross","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"components":[{"internalType":"address","name":"dstReceiver","type":"address"},{"internalType":"address","name":"wrappedToken","type":"address"},{"internalType":"uint256","name":"router","type":"uint256"},{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"uint256","name":"minReturnAmount","type":"uint256"},{"internalType":"uint256","name":"fee","type":"uint256"},{"internalType":"address[]","name":"path","type":"address[]"},{"internalType":"address[]","name":"pool","type":"address[]"},{"internalType":"bytes","name":"signature","type":"bytes"},{"internalType":"string","name":"channel","type":"string"}],"internalType":"struct BaseCore.ExactInputV2SwapParams","name":"exactInput","type":"tuple"},{"internalType":"uint256","name":"deadline","type":"uint256"}],"name":"exactInputV2Swap","outputs":[{"internalType":"uint256","name":"returnAmount","type":"uint256"}],"stateMutability":"payable","type":"function"},{"inputs":[{"components":[{"internalType":"address","name":"dstReceiver","type":"address"},{"internalType":"address","name":"wrappedToken","type":"address"},{"internalType":"uint256","name":"router","type":"uint256"},{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"uint256","name":"minReturnAmount","type":"uint256"},{"internalType":"uint256","name":"fee","type":"uint256"},{"internalType":"address[]","name":"path","type":"address[]"},{"internalType":"address[]","name":"pool","type":"address[]"},{"internalType":"bytes","name":"signature","type":"bytes"},{"internalType":"string","name":"channel","type":"string"}],"internalType":"struct BaseCore.ExactInputV2SwapParams","name":"exactInput","type":"tuple"},{"internalType":"uint256","name":"deadline","type":"uint256"}],"name":"exactInputV2SwapAndGasUsed","outputs":[{"internalType":"uint256","name":"returnAmount","type":"uint256"},{"internalType":"uint256","name":"gasUsed","type":"uint256"}],"stateMutability":"payable","type":"function"},{"inputs":[{"components":[{"internalType":"address","name":"srcToken","type":"address"},{"internalType":"address","name":"dstToken","type":"address"},{"internalType":"address","name":"dstReceiver","type":"address"},{"internalType":"address","name":"wrappedToken","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"uint256","name":"minReturnAmount","type":"uint256"},{"internalType":"uint256","name":"fee","type":"uint256"},{"internalType":"uint256","name":"deadline","type":"uint256"},{"internalType":"uint256[]","name":"pools","type":"uint256[]"},{"internalType":"bytes","name":"signature","type":"bytes"},{"internalType":"string","name":"channel","type":"string"}],"internalType":"struct BaseCore.ExactInputV3SwapParams","name":"params","type":"tuple"}],"name":"exactInputV3Swap","outputs":[{"internalType":"uint256","name":"returnAmount","type":"uint256"}],"stateMutability":"payable","type":"function"},{"inputs":[{"components":[{"internalType":"address","name":"srcToken","type":"address"},{"internalType":"address","name":"dstToken","type":"address"},{"internalType":"address","name":"dstReceiver","type":"address"},{"internalType":"address","name":"wrappedToken","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"uint256","name":"minReturnAmount","type":"uint256"},{"internalType":"uint256","name":"fee","type":"uint256"},{"internalType":"uint256","name":"deadline","type":"uint256"},{"internalType":"uint256[]","name":"pools","type":"uint256[]"},{"internalType":"bytes","name":"signature","type":"bytes"},{"internalType":"string","name":"channel","type":"string"}],"internalType":"struct BaseCore.ExactInputV3SwapParams","name":"params","type":"tuple"}],"name":"exactInputV3SwapAndGasUsed","outputs":[{"internalType":"uint256","name":"returnAmount","type":"uint256"},{"internalType":"uint256","name":"gasUsed","type":"uint256"}],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"executor","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"int256","name":"amount0Delta","type":"int256"},{"internalType":"int256","name":"amount1Delta","type":"int256"},{"internalType":"bytes","name":"_data","type":"bytes"}],"name":"pancakeV3SwapCallback","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"enum Pausable.FunctionFlag","name":"flag","type":"uint8"}],"name":"paused","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"pausedOverAll","outputs":[{"internalType":"bool","name":"executeAggregate","type":"bool"},{"internalType":"bool","name":"executeV2Swap","type":"bool"},{"internalType":"bool","name":"executeV3Swap","type":"bool"},{"internalType":"bool","name":"cross","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"pendingExecutor","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"newExecutor","type":"address"}],"name":"transferExecutorship","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"crossCaller","type":"address"},{"internalType":"address","name":"wrappedToken","type":"address"},{"internalType":"uint256","name":"poolIndex","type":"uint256"}],"name":"transitAllowedQuery","outputs":[{"internalType":"bool","name":"isCrossCallerAllowed","type":"bool"},{"internalType":"bool","name":"isWrappedAllowed","type":"bool"},{"components":[{"internalType":"address","name":"factory","type":"address"},{"internalType":"bytes","name":"initCodeHash","type":"bytes"}],"internalType":"struct BaseCore.UniswapV3Pool","name":"pool","type":"tuple"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"transitFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"transitProxyAddress","outputs":[{"internalType":"address","name":"bridgeProxy","type":"address"},{"internalType":"address","name":"feeSigner","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"int256","name":"amount0Delta","type":"int256"},{"internalType":"int256","name":"amount1Delta","type":"int256"},{"internalType":"bytes","name":"_data","type":"bytes"}],"name":"uniswapV3SwapCallback","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address[]","name":"tokens","type":"address[]"},{"internalType":"address","name":"recipient","type":"address"}],"name":"withdrawTokens","outputs":[],"stateMutability":"nonpayable","type":"function"},{"stateMutability":"payable","type":"receive"}]

608060405234801562000010575f80fd5b506001543390600160a01b900460ff1615620000725760405162461bcd60e51b815260206004820152601460248201527f4f776e61626c653a20696e697469616c697a6564000000000000000000000000604482015260640160405180910390fd5b6200007d8162000175565b506001805460ff60a01b1916600160a01b1781556003819055604080518082018252600d81526c5472616e73697453776170563560981b60209182015281518083018352928352603560f81b9281019290925280517f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f928101929092527f20b7d1a4a088b240a0e093c572f43e31015ce187a55e6f343e049dcb744e5341908201527fceebf77a833b30520287ddd9478ff51abbdffa30aa90a8d655dba0e8a79ce0c160608201524660808201523060a082015260c00160408051601f198184030181529190528051602090910120600955620001ce565b600180546001600160a01b03199081169091555f80546001600160a01b03848116938216841783556040519116929183917f88436636ea40d5bb1bcc55ff9cd54788af71da886f4147a87f199adcca733d4d9190a35050565b615e3a80620001dc5f395ff3fe608060405260043610610184575f3560e01c80637ec753fe116100d0578063b9b5149b11610089578063d63234e011610063578063d63234e0146105a8578063d808d889146105c5578063fa461e33146102a4578063fa9ec7af146105d8576101c3565b8063b9b5149b14610546578063bf5c55a214610559578063c34c08e514610578576101c3565b80637ec753fe1461049757806392bcc8be146104b657806394d3d793146104d5578063afed2d0e146104e9578063b93c0beb14610508578063b946fd3b14610527576101c3565b80633644e5151161013d5780635ac86ab7116101175780635ac86ab7146103e95780636b3ec416146104185780636fbf72f91461042b5780637e467ecf14610464576101c3565b80633644e515146102eb5780633c481d57146103005780634c42342f146103d6576101c3565b80630ced9fb9146101ff5780630dc4bdae146102365780630e8cc705146102575780631975b0961461027657806323a69e75146102a45780632adb806f146102c3576101c3565b366101c357604080513381523460208201527f7784f8d436dc514f0690e472c7e2d7f660a73e504c69b2350f6be5a5f02432ef910160405180910390a1005b3480156101ce575f80fd5b505f80806101df3660048184614c38565b8101906101ec9190614cc9565b9250925092506101fd8383836105eb565b005b34801561020a575f80fd5b50600654600754604080516001600160a01b039384168152929091166020830152015b60405180910390f35b610249610244366004614d54565b610694565b60405190815260200161022d565b348015610262575f80fd5b506101fd610271366004614de0565b6106a6565b348015610281575f80fd5b50610295610290366004614e86565b610826565b60405161022d93929190614f11565b3480156102af575f80fd5b506101fd6102be366004614f4e565b610925565b6102d66102d1366004614fc6565b61096b565b6040805192835260208301919091520161022d565b3480156102f6575f80fd5b5061024960095481565b34801561030b575f80fd5b5060026020527fac33ff75c19e70fe83507db0d683fd3465c996598dc972688b7ace676c89077b547fe90b7bceb6e7df5418fb78d8ee546e97c83a08bbccc01a0644d599ccd2a7c2e0547f679795a0195a1b76cdebb7c51d74e058aee92919b8c3389af86ef24535e8a28c5460035f527f88601476d11616a71c5be67555bd1dff4b1cbf21533d2669b768b61518cfe1c35460ff938416939283169291821691166040805194151585529215156020850152901515918301919091521515606082015260800161022d565b6102d66103e436600461504a565b610992565b3480156103f4575f80fd5b50610408610403366004615083565b6109b6565b604051901515815260200161022d565b6101fd61042636600461504a565b6109f6565b348015610436575f80fd5b506004546005546008546040805193845260208401929092526001600160a01b03169082015260600161022d565b34801561046f575f80fd5b506102497f048f880a603b1aab0e626a287e33d603417b3d53a36f7527b7c86365bf7def4f81565b3480156104a2575f80fd5b506101fd6104b1366004615111565b610d11565b3480156104c1575f80fd5b506101fd6104d0366004615209565b610e96565b3480156104e0575f80fd5b506101fd61107f565b3480156104f4575f80fd5b506101fd61050336600461529b565b611105565b348015610513575f80fd5b506101fd6105223660046152b6565b611175565b348015610532575f80fd5b506101fd61054136600461531c565b61142a565b61024961055436600461504a565b611573565b348015610564575f80fd5b506101fd610573366004615364565b611583565b348015610583575f80fd5b505f546001600160a01b03165b6040516001600160a01b03909116815260200161022d565b3480156105b3575f80fd5b506001546001600160a01b0316610590565b6102496105d3366004614fc6565b611618565b6102d66105e6366004614d54565b611623565b5f8313806105f857505f82135b6106345760405162461bcd60e51b81526020600482015260086024820152674d30206f72204d3160c01b60448201526064015b60405180910390fd5b5f808280602001905181019061064a91906153b4565b915091505f80828060200190518101906106649190615431565b91509150610673848233611633565b855f88131561067f5750865b61068a8333836117e6565b5050505050505050565b5f61069f8383611903565b9392505050565b6106ae611e9f565b5f5b8251811015610821575f6106dc8483815181106106cf576106cf61545d565b6020026020010151611f15565b156106f25750476106ed8382611f4d565b61079e565b8382815181106107045761070461545d565b60209081029190910101516040516370a0823160e01b81523060048201526001600160a01b03909116906370a0823190602401602060405180830381865afa158015610752573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906107769190615471565b905061079c84838151811061078d5761078d61545d565b60200260200101518483612006565b505b826001600160a01b0316336001600160a01b03168584815181106107c4576107c461545d565b60200260200101516001600160a01b03167f3115d1449a7b732c986cba18244e897a450f61e1bb8d589cd2e69e6c8924f9f78460405161080691815260200190565b60405180910390a450806108198161549c565b9150506106b0565b505050565b6040805180820182525f80825260606020808401919091526001600160a01b038781168352600a8252848320548782168452600b835285842054878552600c84529386902086518088019097528054909216865260018201805460ff92831697929095169594919384019161089a906154b4565b80601f01602080910402602001604051908101604052809291908181526020018280546108c6906154b4565b80156109115780601f106108e857610100808354040283529160200191610911565b820191905f5260205f20905b8154815290600101906020018083116108f457829003601f168201915b505050505081525050905093509350939050565b610965848484848080601f0160208091040260200160405190810160405280939291908181526020018383808284375f920191909152506105eb92505050565b50505050565b5f805f5a905061097b85856120ea565b92505a61098890826154e6565b9150509250929050565b5f805f5a90506109a1846125fb565b92505a6109ae90826154e6565b915050915091565b5f60025f8360038111156109cc576109cc6154f9565b60038111156109dd576109dd6154f9565b815260208101919091526040015f205460ff1692915050565b600260035403610a185760405162461bcd60e51b815260040161062b9061550d565b60026003556003610a2881612b44565b5f610a37610120840184615544565b905011610a805760405162461bcd60e51b8152602060048201526017602482015276646174612073686f756c64206265206e6f74207a65726f60481b604482015260640161062b565b5f8260a0013511610ad35760405162461bcd60e51b815260206004820152601f60248201527f616d6f756e742073686f756c642062652067726561746572207468616e203000604482015260640161062b565b600a5f610ae6606085016040860161529b565b6001600160a01b0316815260208101919091526040015f205460ff16610b3f5760405162461bcd60e51b815260206004820152600e60248201526d34b73b30b634b21031b0b63632b960911b604482015260640161062b565b5f610b8f6003610b52602086018661529b565b610b6260a087016080880161529b565b610b72606088016040890161529b565b60a088013560c0890135610b8a6101408b018b615544565b612b8d565b90505f80610ba3606086016040870161529b565b6001600160a01b031683610bbb610120880188615544565b604051610bc9929190615586565b5f6040518083038185875af1925050503d805f8114610c03576040519150601f19603f3d011682016040523d82523d5f602084013e610c08565b606091505b509150915081610c5c57610c43816040518060400160405280600f81526020016e2a3930b739b4ba21b937b9b9ab1a9d60891b815250612e03565b60405162461bcd60e51b815260040161062b9190615595565b610c82610c6c602087018761529b565b610c7c606088016040890161529b565b5f613077565b50610d079050610c95602085018561529b565b610ca5604086016020870161529b565b610cb5608087016060880161529b565b60a08701355f60e0890135610cce6101008b018b615544565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284375f9201919091525061318692505050565b5050600160035550565b610d19611e9f565b5f5b8251811015610821575f828281518110610d3757610d3761545d565b602002602001015110158015610d6857506103e8828281518110610d5d57610d5d61545d565b602002602001015111155b610da95760405162461bcd60e51b8152602060048201526012602482015271066656520726174652069733a302d313030360741b604482015260640161062b565b828181518110610dbb57610dbb61545d565b602002602001015115610ded57818181518110610dda57610dda61545d565b6020026020010151600481905550610e0e565b818181518110610dff57610dff61545d565b60200260200101516005819055505b7f5fa95345cbe35dad70f67a9ca1430c22453a695590cb4fca05d58f637e85af4f838281518110610e4157610e4161545d565b6020026020010151838381518110610e5b57610e5b61545d565b6020026020010151604051610e7c9291909115158252602082015260400190565b60405180910390a180610e8e8161549c565b915050610d1b565b610e9e611e9f565b848114610edc5760405162461bcd60e51b815260206004820152600c60248201526b696e76616c6964206461746160a01b604482015260640161062b565b828114610f1a5760405162461bcd60e51b815260206004820152600c60248201526b696e76616c6964206461746160a01b604482015260640161062b565b825f5b81811015611034576040518060400160405280878784818110610f4257610f4261545d565b9050602002016020810190610f57919061529b565b6001600160a01b03168152602001858584818110610f7757610f7761545d565b9050602002810190610f899190615544565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284375f9201829052509390945250600c92508b90508a85818110610fd557610fd561545d565b60209081029290920135835250818101929092526040015f20825181546001600160a01b0319166001600160a01b0390911617815590820151600182019061101d90826155ec565b50905050808061102c9061549c565b915050610f1d565b507f652c1af850dcc0b28fcb71cd9473023f56a89edd81bbe7b51056a04caa94002487878787878760405161106e96959493929190615757565b60405180910390a150505050505050565b33806110936001546001600160a01b031690565b6001600160a01b0316146110f95760405162461bcd60e51b815260206004820152602760248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206e657720656044820152663c32b1baba37b960c91b606482015260840161062b565b611102816131ea565b50565b61110d611e9f565b600180546001600160a01b0383166001600160a01b0319909116811790915561113d5f546001600160a01b031690565b6001600160a01b03167fdd01547fc40682edc3cd8d164d53f5a1ae6b46138a83f045658ed760823ddba860405160405180910390a350565b61117d611e9f565b8215611275575f5b8381101561123a57600a5f8686848181106111a2576111a261545d565b90506020020160208101906111b7919061529b565b6001600160a01b0316815260208101919091526040015f9081205460ff161590600a908787858181106111ec576111ec61545d565b9050602002016020810190611201919061529b565b6001600160a01b0316815260208101919091526040015f20805460ff1916911515919091179055806112328161549c565b915050611185565b507fb05655746bd43b7fe3ccd9d28b7685b4c67ddc51e70890062b0f7f85dd692695848460405161126c929190615807565b60405180910390a15b8015610965575f816001600160401b0381111561129457611294614c5f565b6040519080825280602002602001820160405280156112bd578160200160208202803683370190505b5090505f5b828110156113e757600b5f8585848181106112df576112df61545d565b90506020020160208101906112f4919061529b565b6001600160a01b0316815260208101919091526040015f9081205460ff161590600b908686858181106113295761132961545d565b905060200201602081019061133e919061529b565b6001600160a01b0316815260208101919091526040015f908120805460ff191692151592909217909155600b9085858481811061137d5761137d61545d565b9050602002016020810190611392919061529b565b6001600160a01b0316815260208101919091526040015f2054825160ff909116908390839081106113c5576113c561545d565b91151560209283029190910190910152806113df8161549c565b9150506112c2565b507f4a28b173d9bc739be3886d172e07fef80392184787fc6b92406ce0f0c05b7e6383838360405161141b9392919061581a565b60405180910390a15050505050565b611432611e9f565b6001600160a01b0383161561149357600680546001600160a01b0319166001600160a01b0385169081179091556040519081527f347fade115440908839b750620f0add8f417b77a392657edd70b950373eda9c39060200160405180910390a15b6001600160a01b0382161561150157600780546001600160a01b038481166001600160a01b031983168117909355604080519190921680825260208201939093527ff9c6fa562c9d8326f8518a29a53ef18ab03cd6b9eead73ac667c5e289354c73e910160405180910390a1505b6001600160a01b0381161561082157600880546001600160a01b038381166001600160a01b031983168117909355604080519190921680825260208201939093527fb3911b5760f95a64aaa8d7f1775f57a7b6ed0bcf1ebb3fbfcc045e2f04eaad11910160405180910390a150505050565b5f61157d826125fb565b92915050565b61158b611e9f565b805f5b818110156116115784156115d0576115cb8484838181106115b1576115b161545d565b90506020020160208101906115c69190615083565b613243565b6115ff565b6115ff8484838181106115e5576115e561545d565b90506020020160208101906115fa9190615083565b6132d5565b806116098161549c565b91505061158e565b5050505050565b5f61069f83836120ea565b5f805f5a905061097b8585611903565b600f60f884901c165f818152600c60209081526040808320815180830190925280546001600160a01b031682526001810180549293919291840191611677906154b4565b80601f01602080910402602001604051908101604052809291908181526020018280546116a3906154b4565b80156116ee5780601f106116c5576101008083540402835291602001916116ee565b820191905f5260205f20905b8154815290600101906020018083116116d157829003601f168201915b5050509190925250508151919250506001600160a01b03166117525760405162461bcd60e51b815260206004820152601960248201527f43616c6c6261636b2062616420706f6f6c20696e646578656400000000000000604482015260640161062b565b5f815f015185836020015160405160200161176f93929190615873565b604051602081830303815290604052805190602001205f1c9050836001600160a01b0316816001600160a01b0316146117de5760405162461bcd60e51b815260206004820152601160248201527010d85b1b189858dac8189859081c1bdbdb607a1b604482015260640161062b565b505050505050565b604080516001600160a01b038481166024830152604480830185905283518084039091018152606490920183526020820180516001600160e01b031663a9059cbb60e01b17905291515f9283929087169161184191906158bb565b5f604051808303815f865af19150503d805f811461187a576040519150601f19603f3d011682016040523d82523d5f602084013e61187f565b606091505b50915091508180156118a95750805115806118a95750808060200190518101906118a991906158d6565b6116115760405162461bcd60e51b815260206004820152602560248201527f5472616e7366657248656c7065723a205452414e534645525f544f4b454e5f46604482015264105253115160da1b606482015260840161062b565b5f6002600354036119265760405162461bcd60e51b815260040161062b9061550d565b6002600355600161193681612b44565b428310156119705760405162461bcd60e51b8152602060048201526007602482015266115e1c1a5c995960ca1b604482015260640161062b565b6001600f604086013560f81c16145f8080808061198d8a8761335a565b945094509450945094506119ef835f815181106119ac576119ac61545d565b60200260200101518b8060e001906119c491906158f1565b5f8181106119d4576119d461545d565b90506020020160208101906119e9919061529b565b866117e6565b8515611bb6578415611ad357611a4960408b013584611a1160e08e018e6158f1565b808060200260200160405190810160405280939291908181526020018383602002808284375f92019190915250309250613887915050565b611acc82611a5d60408d0160208e0161529b565b6040516370a0823160e01b81523060048201526001600160a01b0391909116906370a08231906024015b602060405180830381865afa158015611aa2573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611ac69190615471565b90613b7e565b9750611d4f565b611b3f60408b013584611ae960e08e018e6158f1565b808060200260200160405190810160405280939291908181526020018383602002808284375f81840152601f19601f820116905080830192505050505050508d5f016020810190611b3a919061529b565b613887565b611acc818460018651611b5291906154e6565b81518110611b6257611b6261545d565b60200260200101516001600160a01b03166370a082318d5f016020810190611b8a919061529b565b6040516001600160e01b031960e084901b1681526001600160a01b039091166004820152602401611a87565b5f8a604001356001600160a01b031663d06ca61f86866040518363ffffffff1660e01b8152600401611be9929190615936565b5f60405180830381865afa158015611c03573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f19168201604052611c2a919081019061598b565b90508515611c9757611c7c8185611c4460e08f018f6158f1565b808060200260200160405190810160405280939291908181526020018383602002808284375f92019190915250309250613bd3915050565b611c9083611a5d60408e0160208f0161529b565b9850611d4d565b611cff8185611ca960e08f018f6158f1565b808060200260200160405190810160405280939291908181526020018383602002808284375f81840152601f19601f820116905080830192505050505050508e5f016020810190611cfa919061529b565b613bd3565b611d4a828560018751611d1291906154e6565b81518110611d2257611d2261545d565b60200260200101516001600160a01b03166370a082318e5f016020810190611b8a919061529b565b98505b505b8960800135881015611d735760405162461bcd60e51b815260040161062b90615a0b565b8415611da857611d92611d8c60408c0160208d0161529b565b89613dbd565b611da8611da260208c018c61529b565b89611f4d565b50505050505f85806101200190611dbf9190615544565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284375f92019190915250929350611e919250611e0791505060c08801886158f1565b5f818110611e1757611e1761545d565b9050602002016020810190611e2c919061529b565b611e3960c08901896158f1565b6001611e4860c08c018c6158f1565b611e539291506154e6565b818110611e6257611e6261545d565b9050602002016020810190611e77919061529b565b611e8460208a018a61529b565b8960600135885f87613186565b505050600160035592915050565b33611eb15f546001600160a01b031690565b6001600160a01b031614611f135760405162461bcd60e51b815260206004820152602360248201527f4f776e61626c653a2063616c6c6572206973206e6f74207468652065786563756044820152623a37b960e91b606482015260840161062b565b565b5f6001600160a01b038216158061157d57506001600160a01b03821673eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee1492915050565b604080515f808252602082019092526001600160a01b038416908390604051611f7691906158bb565b5f6040518083038185875af1925050503d805f8114611fb0576040519150601f19603f3d011682016040523d82523d5f602084013e611fb5565b606091505b50509050806108215760405162461bcd60e51b815260206004820152601f60248201527f5472616e7366657248656c7065723a205452414e534645525f4641494c454400604482015260640161062b565b5f805f856001600160a01b031663a9059cbb868660405160240161203f9291906001600160a01b03929092168252602082015260400190565b6040516020818303038152906040529060e01b6020820180516001600160e01b03838183161783525050505060405161207891906158bb565b5f604051808303815f865af19150503d805f81146120b1576040519150601f19603f3d011682016040523d82523d5f602084013e6120b6565b606091505b50915091508180156120e05750805115806120e05750808060200190518101906120e091906158d6565b9695505050505050565b5f60026003540361210d5760405162461bcd60e51b815260040161062b9061550d565b60026003555f61211c81612b44565b5f61212a6020850185615544565b9050116121735760405162461bcd60e51b8152602060048201526017602482015276646174612073686f756c64206265206e6f74207a65726f60481b604482015260640161062b565b5f8460800135116121c65760405162461bcd60e51b815260206004820152601f60248201527f616d6f756e742073686f756c642062652067726561746572207468616e203000604482015260640161062b565b5f6121d7606086016040870161529b565b6001600160a01b0316036122375760405162461bcd60e51b815260206004820152602160248201527f72656365697665722073686f756c64206265206e6f74206164647265737328306044820152602960f81b606482015260840161062b565b5f8460a001351161229b5760405162461bcd60e51b815260206004820152602860248201527f6d696e52657475726e416d6f756e742073686f756c6420626520677265617465604482015267072207468616e20360c41b606482015260840161062b565b600b5f6122ae608087016060880161529b565b6001600160a01b0316815260208101919091526040015f205460ff166123165760405162461bcd60e51b815260206004820152601760248201527f696e76616c696420777261707065642061646472657373000000000000000000604482015260640161062b565b6006545f906001600160a01b03168161235f8161233660208a018a61529b565b61234660808b0160608c0161529b565b8560808c013560c08d0135610b8a6101008f018f615544565b90506123796123746040890160208a0161529b565b611f15565b1561239f5761238e606088016040890161529b565b6001600160a01b0316319250612436565b6123af604088016020890161529b565b6001600160a01b03166370a082316123cd60608a0160408b0161529b565b6040516001600160e01b031960e084901b1681526001600160a01b039091166004820152602401602060405180830381865afa15801561240f573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906124339190615471565b92505b5f80836001600160a01b031683633f3204d28a6040516024016124599190615a38565b6040516020818303038152906040529060e01b6020820180516001600160e01b03838183161783525050505060405161249291906158bb565b5f6040518083038185875af1925050503d805f81146124cc576040519150601f19603f3d011682016040523d82523d5f602084013e6124d1565b606091505b50915091508161250957610c43816040518060400160405280600c81526020016b2a3930b739b4ba29bbb0b81d60a11b815250612e03565b5061251f90506123746040890160208a0161529b565b1561254f576125488361253860608a0160408b0161529b565b6001600160a01b03163190613b7e565b9450612584565b6125818361256360408a0160208b0161529b565b6001600160a01b03166370a08231611b8a60608c0160408d0161529b565b94505b8660a001358510156125a85760405162461bcd60e51b815260040161062b90615a0b565b6125ec6125b8602089018961529b565b6125c860408a0160208b0161529b565b6125d860608b0160408c0161529b565b60808b0135895f610cce60e08f018f615544565b50505050600160035592915050565b5f60026003540361261e5760405162461bcd60e51b815260040161062b9061550d565b6002600355600261262e81612b44565b5f61263d6101008501856158f1565b90501161267a5760405162461bcd60e51b815260206004820152600b60248201526a456d70747920706f6f6c7360a81b604482015260640161062b565b428360e0013510156126b85760405162461bcd60e51b8152602060048201526007602482015266115e1c1a5c995960ca1b604482015260640161062b565b600b5f6126cb608086016060870161529b565b6001600160a01b0316815260208101919091526040015f205460ff166127035760405162461bcd60e51b815260040161062b90615a83565b5f612711602085018561529b565b90505f612724604086016020870161529b565b90505f80612738612374602089018961529b565b156127505761274d608088016060890161529b565b93505b5f61278f600261276360208b018b61529b565b61277360808c0160608d0161529b565b5f8c608001358d60c001358e806101200190610b8a9190615544565b90506127a461237460408a0160208b0161529b565b1561283e576127b96080890160608a0161529b565b93506127cb6080890160608a0161529b565b6040516370a0823160e01b81523060048201526001600160a01b0391909116906370a0823190602401602060405180830381865afa15801561280f573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906128339190615471565b9250600191506128d5565b61284e6040890160208a0161529b565b6001600160a01b03166370a0823161286c60608b0160408c0161529b565b6040516001600160e01b031960e084901b1681526001600160a01b039091166004820152602401602060405180830381865afa1580156128ae573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906128d29190615471565b92505b5f6128e46101008a018a6158f1565b91503090506060600183111561299c57875f805b85811015612991575f8e80610100019061291291906158f1565b838181106129225761292261545d565b905060200201359050612936848483613ed0565b955093506129456001886154e6565b82148015612951575088155b1561296f578e6040016020810190612969919061529b565b95508a92505b61297b8682878b6141bb565b97505080806129899061549c565b9150506128f8565b50859b505050612a1a565b6129cb88886129af6101008f018f6158f1565b5f8181106129bf576129bf61545d565b90506020020135613ed0565b91508590506129e7576129e460608c0160408d0161529b565b91505b612a17826129f96101008e018e6158f1565b5f818110612a0957612a0961545d565b9050602002013583876141bb565b99505b5050508115612a9457612a3783611a5d60808b0160608c0161529b565b96508760a00135871015612a5d5760405162461bcd60e51b815260040161062b90615a0b565b612a76612a7060808a0160608b0161529b565b88613dbd565b612a8f612a8960608a0160408b0161529b565b88611f4d565b612aec565b612ac683612aa860408b0160208c0161529b565b6001600160a01b03166370a08231611b8a60608d0160408e0161529b565b96508760a00135871015612aec5760405162461bcd60e51b815260040161062b90615a0b565b612b34612afc60208a018a61529b565b612b0c60408b0160208c0161529b565b612b1c60608c0160408d0161529b565b8b608001358b5f8e806101400190610cce9190615544565b5050505050506001600355919050565b612b4d816109b6565b156111025760405162461bcd60e51b815260206004820152601060248201526f14185d5cd8589b194e881c185d5cd95960821b604482015260640161062b565b5f805f612b998661436a565b90925090505f60038c6003811115612bb357612bb36154f9565b14612bbf576001612bc1565b5f5b90505f612bd1828a858a8a6143c6565b9050612bdc8c611f15565b15612d565760038d6003811115612bf557612bf56154f9565b03612c4f5788341015612c3e5760405162461bcd60e51b8152602060048201526011602482015270696e76616c6964206d73672e76616c756560781b604482015260640161062b565b612c483484613b7e565b9450612c96565b883414612c925760405162461bcd60e51b8152602060048201526011602482015270696e76616c6964206d73672e76616c756560781b604482015260640161062b565b8094505b6001600160a01b038b1615612d35576001600160a01b038b165f908152600b602052604090205460ff16612cdc5760405162461bcd60e51b815260040161062b90615a83565b60038d6003811115612cf057612cf06154f9565b03612d1257612cff8b8661447b565b612d0a8b8b87613077565b5f9450612d35565b60028d6003811115612d2657612d266154f9565b03612d3557612d358b8261447b565b8315612d5157600854612d51906001600160a01b031684611f4d565b612df3565b612d628c33308c614575565b60038d6003811115612d7657612d766154f9565b03612d8e57612d868c8b83613077565b349450612dd3565b5f8d6003811115612da157612da16154f9565b03612db657612db18c8b836117e6565b612dd3565b60028d6003811115612dca57612dca6154f9565b03612dd3578094505b8315612df357600854612df1908d906001600160a01b031685612006565b505b5050505098975050505050505050565b60606044835110158015612e3b5750825f81518110612e2457612e2461545d565b6020910101516001600160f81b031916600160fb1b145b8015612e6c575082600181518110612e5557612e5561545d565b6020910101516001600160f81b03191660c360f81b145b8015612e9d575082600281518110612e8657612e8661545d565b6020910101516001600160f81b031916607960f81b145b8015612ece575082600381518110612eb757612eb761545d565b6020910101516001600160f81b031916600560fd1b145b15612f5857604483810180519091612ee69190615aba565b84511015612f2e5760405162461bcd60e51b815260206004820152601560248201527424b73b30b634b2103932bb32b93a103932b0b9b7b760591b604482015260640161062b565b8281604051602001612f41929190615acd565b60405160208183030381529060405291505061157d565b82516024148015612f8d5750825f81518110612f7657612f7661545d565b6020910101516001600160f81b031916602760f91b145b8015612fbe575082600181518110612fa757612fa761545d565b6020910101516001600160f81b031916600960fb1b145b8015612fef575082600281518110612fd857612fd861545d565b6020910101516001600160f81b031916607b60f81b145b80156130205750826003815181106130095761300961545d565b6020910101516001600160f81b031916607160f81b145b156130455760248301518261303482614698565b604051602001612f41929190615b1b565b8161304f846146c0565b604051602001613060929190615b4f565b604051602081830303815290604052905092915050565b604080516001600160a01b038481166024830152604480830185905283518084039091018152606490920183526020820180516001600160e01b031663095ea7b360e01b17905291515f928392908716916130d291906158bb565b5f604051808303815f865af19150503d805f811461310b576040519150601f19603f3d011682016040523d82523d5f602084013e613110565b606091505b509150915081801561313a57508051158061313a57508080602001905181019061313a91906158d6565b6116115760405162461bcd60e51b815260206004820152601e60248201527f5472616e7366657248656c7065723a20415050524f56455f4641494c45440000604482015260640161062b565b846001600160a01b0316866001600160a01b0316886001600160a01b03167f2251435bd151cd72851a82be055bf6d1c3d7f34d08d56493dddf874229b8e897878787876040516131d99493929190615b9f565b60405180910390a450505050505050565b600180546001600160a01b03199081169091555f80546001600160a01b03848116938216841783556040519116929183917f88436636ea40d5bb1bcc55ff9cd54788af71da886f4147a87f199adcca733d4d9190a35050565b8061324d81612b44565b600160025f846003811115613264576132646154f9565b6003811115613275576132756154f9565b81526020019081526020015f205f6101000a81548160ff0219169083151502179055507f534f879afd40abb4e39f8e1b77a316be4c8e3521d9cf5a3a3db8959d574d455933836040516132c9929190615bc3565b60405180910390a15050565b806132df816148a0565b5f60025f8460038111156132f5576132f56154f9565b6003811115613306576133066154f9565b81526020019081526020015f205f6101000a81548160ff0219169083151502179055507f4cd3e1443d03aba343c5d882744f8f172c07b495e955ac3defb325cbd73c855033836040516132c9929190615bc3565b5f806060818061336d60e08801886158f1565b61337991506001615aba565b61338660c08901896158f1565b9050146133c45760405162461bcd60e51b815260206004820152600c60248201526b092dcecc2d8d2c840e0c2e8d60a31b604482015260640161062b565b600b5f6133d760408a0160208b0161529b565b6001600160a01b0316815260208101919091526040015f205460ff1661340f5760405162461bcd60e51b815260040161062b90615a83565b5f8061341e8960a0013561436a565b9092509050613441600160608b01358361343c6101008e018e615544565b6143c6565b95505f61345160c08b018b6158f1565b808060200260200160405190810160405280939291908181526020018383602002808284375f92018290525093945084925060019150613496905060c08e018e6158f1565b6134a19291506154e6565b815181106134b1576134b161545d565b602002602001015190506134f38b8060c001906134ce91906158f1565b5f8181106134de576134de61545d565b9050602002016020810190612374919061529b565b156135b3578a60600135341461353f5760405162461bcd60e51b8152602060048201526011602482015270496e76616c6964206d73672e76616c756560781b604482015260640161062b565b831561355b5760085461355b906001600160a01b031684611f4d565b61356b60408c0160208d0161529b565b825f8151811061357d5761357d61545d565b6001600160a01b039092166020928302919091018201526135ae906135a89060408e01908e0161529b565b8961447b565b613714565b89156136c557815f815181106135cb576135cb61545d565b60209081029190910101516040516370a0823160e01b81523060048201526001600160a01b03909116906370a0823190602401602060405180830381865afa158015613619573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061363d9190615471565b9750613668825f815181106136545761365461545d565b602002602001015133308e60600135614575565b6136be8b60a00135611ac68a855f815181106136865761368661545d565b60209081029190910101516040516370a0823160e01b81523060048201526001600160a01b03909116906370a0823190602401611a87565b97506136da565b6136da825f815181106136545761365461545d565b831561371457613712825f815181106136f5576136f561545d565b60209081029190910101516008546001600160a01b031685612006565b505b61371d81611f15565b156137eb5761373260408c0160208d0161529b565b826001845161374191906154e6565b815181106137515761375161545d565b6001600160a01b039092166020928302919091018201526001995061377c9060408d01908d0161529b565b6040516370a0823160e01b81523060048201526001600160a01b0391909116906370a0823190602401602060405180830381865afa1580156137c0573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906137e49190615471565b9550613876565b8915613876576001600160a01b0381166370a0823161380d60208e018e61529b565b6040516001600160e01b031960e084901b1681526001600160a01b039091166004820152602401602060405180830381865afa15801561384f573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906138739190615471565b94505b819650505050509295509295909350565b5f5b6001845161389791906154e6565b811015611611575f808583815181106138b2576138b261545d565b6020026020010151868460016138c89190615aba565b815181106138d8576138d861545d565b6020026020010151915091505f816001600160a01b0316836001600160a01b031610613905578183613908565b82825b5090505f86858151811061391e5761391e61545d565b602002602001015190505f805f80846001600160a01b0316630902f1ac6040518163ffffffff1660e01b8152600401606060405180830381865afa158015613968573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061398c9190615c12565b506001600160701b031691506001600160701b031691505f80876001600160a01b03168a6001600160a01b0316146139c55782846139c8565b83835b6040516370a0823160e01b81526001600160a01b038a81166004830152929450909250613a03918491908d16906370a0823190602401611a87565b95508e6001600160a01b031663054d50d48784846040518463ffffffff1660e01b8152600401613a46939291909283526020830191909152604082015260600190565b602060405180830381865afa158015613a61573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190613a859190615471565b9450505050505f80856001600160a01b0316886001600160a01b031614613aad57825f613ab0565b5f835b915091505f60028d51613ac391906154e6565b8a10613acf578a613af4565b8b613adb8b6001615aba565b81518110613aeb57613aeb61545d565b60200260200101515b604080515f8152602081019182905263022c0d9f60e01b9091529091506001600160a01b0387169063022c0d9f90613b359086908690869060248101615c53565b5f604051808303815f87803b158015613b4c575f80fd5b505af1158015613b5e573d5f803e3d5ffd5b505050505050505050505050508080613b769061549c565b915050613889565b5f82613b8a83826154e6565b915081111561157d5760405162461bcd60e51b815260206004820152601560248201527464732d6d6174682d7375622d756e646572666c6f7760581b604482015260640161062b565b5f5b60018451613be391906154e6565b811015611611575f80858381518110613bfe57613bfe61545d565b602002602001015186846001613c149190615aba565b81518110613c2457613c2461545d565b6020026020010151915091505f816001600160a01b0316836001600160a01b031610613c51578183613c54565b82825b5090505f88613c64866001615aba565b81518110613c7457613c7461545d565b602002602001015190505f80836001600160a01b0316866001600160a01b031614613ca057825f613ca3565b5f835b915091505f60028b51613cb691906154e6565b8810613cc25788613ce7565b89613cce896001615aba565b81518110613cde57613cde61545d565b60200260200101515b9050898881518110613cfb57613cfb61545d565b60200260200101516001600160a01b031663022c0d9f8484845f6001600160401b03811115613d2c57613d2c614c5f565b6040519080825280601f01601f191660200182016040528015613d56576020820181803683370190505b506040518563ffffffff1660e01b8152600401613d769493929190615c53565b5f604051808303815f87803b158015613d8d575f80fd5b505af1158015613d9f573d5f803e3d5ffd5b50505050505050505050508080613db59061549c565b915050613bd5565b5f80836001600160a01b03165f632e1a7d4d85604051602401613de291815260200190565b6040516020818303038152906040529060e01b6020820180516001600160e01b038381831617835250505050604051613e1b91906158bb565b5f6040518083038185875af1925050503d805f8114613e55576040519150601f19603f3d011682016040523d82523d5f602084013e613e5a565b606091505b5091509150818015613e84575080511580613e84575080806020019051810190613e8491906158d6565b6109655760405162461bcd60e51b815260206004820152601f60248201527f5472616e7366657248656c7065723a2057495448445241575f4641494c454400604482015260640161062b565b5f60605f8390505f816001600160a01b0316630dfe16816040518163ffffffff1660e01b8152600401602060405180830381865afa158015613f14573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190613f389190615c7f565b90505f826001600160a01b031663d21220a76040518163ffffffff1660e01b8152600401602060405180830381865afa158015613f77573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190613f9b9190615c7f565b90505f836001600160a01b031663ddca3f436040518163ffffffff1660e01b8152600401602060405180830381865afa158015613fda573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190613ffe9190615c9a565b604080516001600160a01b03808716602083015285169181019190915262ffffff821660608201529091505f9060800160408051601f1981840301815291905280516020909101209050600160ff1b88161580156140fe57846001600160a01b03168b6001600160a01b0316146140875760405162461bcd60e51b815260040161062b90615cbc565b6001600160a01b038a16156140c757836001600160a01b03168a6001600160a01b0316146140c75760405162461bcd60e51b815260040161062b90615cbc565b604080516001600160a01b0387166020820152908101839052939750879360600160405160208183030381529060405296506141a2565b836001600160a01b03168b6001600160a01b03161461412f5760405162461bcd60e51b815260040161062b90615cbc565b6001600160a01b038a161561416f57846001600160a01b03168a6001600160a01b03161461416f5760405162461bcd60e51b815260040161062b90615cbc565b604080516001600160a01b0386166020820152908101839052949750879460600160405160208183030381529060405296505b6141ad89838b611633565b505050505050935093915050565b5f600160ff1b8416158015614293575f856001600160a01b031663128acb0888846141e5886148ec565b6141f56401000276a36001615cde565b8b8b604051602001614208929190615d05565b6040516020818303038152906040526040518663ffffffff1660e01b8152600401614237959493929190615d1d565b60408051808303815f875af1158015614252573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906142769190615d57565b91505061428b8161428690615d79565b614959565b925050614361565b5f856001600160a01b031663128acb0888846142ae886148ec565b6142cd600173fffd8963efd1fc6a506488495d951d5263988d26615d93565b8b8b6040516020016142e0929190615d05565b6040516020818303038152906040526040518663ffffffff1660e01b815260040161430f959493929190615d1d565b60408051808303815f875af115801561432a573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061434e9190615d57565b50905061435d61428682615d79565b9250505b50949350505050565b5f8080614378600a85615dc7565b905061438f600a6143898684613b7e565b906149aa565b91508060011480156143a057505f82115b80156143b657506008546001600160a01b031615155b156143c057600192505b50915091565b5f8086156143f0576143e9612710614389600454896149f790919063ffffffff16565b905061440e565b61440b612710614389600554896149f790919063ffffffff16565b90505b808510156144665761442286868686614a5d565b6144665760405162461bcd60e51b8152602060048201526015602482015274496e76616c6964207369676e61747572652066656560581b604482015260640161062b565b6144708686613b7e565b979650505050505050565b60408051600481526024810182526020810180516001600160e01b0316630d0e30db60e41b17905290515f9182916001600160a01b0386169185916144c091906158bb565b5f6040518083038185875af1925050503d805f81146144fa576040519150601f19603f3d011682016040523d82523d5f602084013e6144ff565b606091505b509150915081801561452957508051158061452957508080602001905181019061452991906158d6565b6109655760405162461bcd60e51b815260206004820152601e60248201527f5472616e7366657248656c7065723a204445504f5349545f4641494c45440000604482015260640161062b565b604080516001600160a01b0385811660248301528481166044830152606480830185905283518084039091018152608490920183526020820180516001600160e01b03166323b872dd60e01b17905291515f928392908816916145d891906158bb565b5f604051808303815f865af19150503d805f8114614611576040519150601f19603f3d011682016040523d82523d5f602084013e614616565b606091505b509150915081801561464057508051158061464057508080602001905181019061464091906158d6565b6117de5760405162461bcd60e51b8152602060048201526024808201527f5472616e7366657248656c7065723a205452414e534645525f46524f4d5f46416044820152631253115160e21b606482015260840161062b565b606061157d826040516020016146b091815260200190565b6040516020818303038152906040525b80516060906f181899199a1a9b1b9c1cb0b131b232b360811b905f906146e7906002615dda565b6146f2906002615aba565b6001600160401b0381111561470957614709614c5f565b6040519080825280601f01601f191660200182016040528015614733576020820181803683370190505b509050600360fc1b815f8151811061474d5761474d61545d565b60200101906001600160f81b03191690815f1a905350600f60fb1b8160018151811061477b5761477b61545d565b60200101906001600160f81b03191690815f1a9053505f5b8451811015614898578260048683815181106147b1576147b161545d565b01602001516001600160f81b031916901c60f81c601081106147d5576147d561545d565b1a60f81b826147e5836002615dda565b6147f0906002615aba565b815181106148005761480061545d565b60200101906001600160f81b03191690815f1a905350828582815181106148295761482961545d565b60209101015160f81c600f16601081106148455761484561545d565b1a60f81b82614855836002615dda565b614860906003615aba565b815181106148705761487061545d565b60200101906001600160f81b03191690815f1a905350806148908161549c565b915050614793565b509392505050565b6148a9816109b6565b6111025760405162461bcd60e51b815260206004820152601460248201527314185d5cd8589b194e881b9bdd081c185d5cd95960621b604482015260640161062b565b5f6001600160ff1b038211156149555760405162461bcd60e51b815260206004820152602860248201527f53616665436173743a2076616c756520646f65736e27742066697420696e2061604482015267371034b73a191a9b60c11b606482015260840161062b565b5090565b5f808212156149555760405162461bcd60e51b815260206004820181905260248201527f53616665436173743a2076616c7565206d75737420626520706f736974697665604482015260640161062b565b5f815f036149ed5760405162461bcd60e51b815260206004820152601060248201526f64732d6d6174682d6469762d7a65726f60801b604482015260640161062b565b61069f8284615df1565b5f811580614a1a57508282614a0c8183615dda565b9250614a189083615df1565b145b61157d5760405162461bcd60e51b815260206004820152601460248201527364732d6d6174682d6d756c2d6f766572666c6f7760601b604482015260640161062b565b600954604080517f048f880a603b1aab0e626a287e33d603417b3d53a36f7527b7c86365bf7def4f6020820152339181019190915260608101869052608081018590525f91829160a00160405160208183030381529060405280519060200120604051602001614ae492919061190160f01b81526002810192909252602282015260420190565b6040516020818303038152906040528051906020012090505f805f614b3d87878080601f0160208091040260200160405190810160405280939291908181526020018383808284375f92019190915250614bc992505050565b9250925092505f6001858585856040515f8152602001604052604051614b7f949392919093845260ff9290921660208401526040830152606082015260800190565b6020604051602081039080840390855afa158015614b9f573d5f803e3d5ffd5b5050604051601f1901516007546001600160a01b039081169116149b9a5050505050505050505050565b5f805f8351604114614c1d5760405162461bcd60e51b815260206004820152601860248201527f496e76616c6964207369676e6174757265206c656e6774680000000000000000604482015260640161062b565b505050602081015160408201516060909201515f1a92909190565b5f8085851115614c46575f80fd5b83861115614c52575f80fd5b5050820193919092039150565b634e487b7160e01b5f52604160045260245ffd5b604051601f8201601f191681016001600160401b0381118282101715614c9b57614c9b614c5f565b604052919050565b5f6001600160401b03821115614cbb57614cbb614c5f565b50601f01601f191660200190565b5f805f60608486031215614cdb575f80fd5b833592506020840135915060408401356001600160401b03811115614cfe575f80fd5b8401601f81018613614d0e575f80fd5b8035614d21614d1c82614ca3565b614c73565b818152876020838501011115614d35575f80fd5b816020840160208301375f602083830101528093505050509250925092565b5f8060408385031215614d65575f80fd5b82356001600160401b03811115614d7a575f80fd5b83016101408186031215614d8c575f80fd5b946020939093013593505050565b5f6001600160401b03821115614db257614db2614c5f565b5060051b60200190565b6001600160a01b0381168114611102575f80fd5b8035614ddb81614dbc565b919050565b5f8060408385031215614df1575f80fd5b82356001600160401b03811115614e06575f80fd5b8301601f81018513614e16575f80fd5b80356020614e26614d1c83614d9a565b82815260059290921b83018101918181019088841115614e44575f80fd5b938201935b83851015614e6b578435614e5c81614dbc565b82529382019390820190614e49565b9550614e7a9050868201614dd0565b93505050509250929050565b5f805f60608486031215614e98575f80fd5b8335614ea381614dbc565b92506020840135614eb381614dbc565b929592945050506040919091013590565b5f5b83811015614ede578181015183820152602001614ec6565b50505f910152565b5f8151808452614efd816020860160208601614ec4565b601f01601f19169290920160200192915050565b831515815282151560208201526060604082015260018060a01b0382511660608201525f6020830151604060808401526120e060a0840182614ee6565b5f805f8060608587031215614f61575f80fd5b843593506020850135925060408501356001600160401b0380821115614f85575f80fd5b818701915087601f830112614f98575f80fd5b813581811115614fa6575f80fd5b886020828501011115614fb7575f80fd5b95989497505060200194505050565b5f8060408385031215614fd7575f80fd5b82356001600160401b0380821115614fed575f80fd5b908401906101208287031215615001575f80fd5b90925060208401359080821115615016575f80fd5b50830160408186031215615028575f80fd5b809150509250929050565b5f6101608284031215615044575f80fd5b50919050565b5f6020828403121561505a575f80fd5b81356001600160401b0381111561506f575f80fd5b61507b84828501615033565b949350505050565b5f60208284031215615093575f80fd5b81356004811061069f575f80fd5b8015158114611102575f80fd5b5f82601f8301126150bd575f80fd5b813560206150cd614d1c83614d9a565b82815260059290921b840181019181810190868411156150eb575f80fd5b8286015b8481101561510657803583529183019183016150ef565b509695505050505050565b5f8060408385031215615122575f80fd5b82356001600160401b0380821115615138575f80fd5b818501915085601f83011261514b575f80fd5b8135602061515b614d1c83614d9a565b82815260059290921b84018101918181019089841115615179575f80fd5b948201945b838610156151a0578535615191816150a1565b8252948201949082019061517e565b965050860135925050808211156151b5575f80fd5b50610988858286016150ae565b5f8083601f8401126151d2575f80fd5b5081356001600160401b038111156151e8575f80fd5b6020830191508360208260051b8501011115615202575f80fd5b9250929050565b5f805f805f806060878903121561521e575f80fd5b86356001600160401b0380821115615234575f80fd5b6152408a838b016151c2565b90985096506020890135915080821115615258575f80fd5b6152648a838b016151c2565b9096509450604089013591508082111561527c575f80fd5b5061528989828a016151c2565b979a9699509497509295939492505050565b5f602082840312156152ab575f80fd5b813561069f81614dbc565b5f805f80604085870312156152c9575f80fd5b84356001600160401b03808211156152df575f80fd5b6152eb888389016151c2565b90965094506020870135915080821115615303575f80fd5b50615310878288016151c2565b95989497509550505050565b5f805f6060848603121561532e575f80fd5b833561533981614dbc565b9250602084013561534981614dbc565b9150604084013561535981614dbc565b809150509250925092565b5f805f60408486031215615376575f80fd5b8335615381816150a1565b925060208401356001600160401b0381111561539b575f80fd5b6153a7868287016151c2565b9497909650939450505050565b5f80604083850312156153c5575f80fd5b8251915060208301516001600160401b038111156153e1575f80fd5b8301601f810185136153f1575f80fd5b80516153ff614d1c82614ca3565b818152866020838501011115615413575f80fd5b615424826020830160208601614ec4565b8093505050509250929050565b5f8060408385031215615442575f80fd5b825161544d81614dbc565b6020939093015192949293505050565b634e487b7160e01b5f52603260045260245ffd5b5f60208284031215615481575f80fd5b5051919050565b634e487b7160e01b5f52601160045260245ffd5b5f600182016154ad576154ad615488565b5060010190565b600181811c908216806154c857607f821691505b60208210810361504457634e487b7160e01b5f52602260045260245ffd5b8181038181111561157d5761157d615488565b634e487b7160e01b5f52602160045260245ffd5b6020808252601f908201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00604082015260600190565b5f808335601e19843603018112615559575f80fd5b8301803591506001600160401b03821115615572575f80fd5b602001915036819003821315615202575f80fd5b818382375f9101908152919050565b602081525f61069f6020830184614ee6565b601f821115610821575f81815260208120601f850160051c810160208610156155cd5750805b601f850160051c820191505b818110156117de578281556001016155d9565b81516001600160401b0381111561560557615605614c5f565b6156198161561384546154b4565b846155a7565b602080601f83116001811461564c575f84156156355750858301515b5f19600386901b1c1916600185901b1785556117de565b5f85815260208120601f198616915b8281101561567a5788860151825594840194600190910190840161565b565b508582101561569757878501515f19600388901b60f8161c191681555b5050505050600190811b01905550565b8183525f60208085019450825f5b858110156156e35781356156c881614dbc565b6001600160a01b0316875295820195908201906001016156b5565b509495945050505050565b81835281816020850137505f828201602090810191909152601f909101601f19169091010190565b5f808335601e1984360301811261572b575f80fd5b83016020810192503590506001600160401b03811115615749575f80fd5b803603821315615202575f80fd5b606080825281018690525f6001600160fb1b03871115615775575f80fd5b8660051b80896080850137808301905060206080848303018185015261579f60808301888a6156a7565b84810360408601528581529150808201600586901b83018201875f5b888110156157f557858303601f190184526157d6828b615716565b6157e18582846156ee565b9587019594505050908401906001016157bb565b50909c9b505050505050505050505050565b602081525f61507b6020830184866156a7565b604081525f61582d6040830185876156a7565b8281036020848101919091528451808352858201928201905f5b81811015615865578451151583529383019391830191600101615847565b509098975050505050505050565b60ff60f81b81526bffffffffffffffffffffffff198460601b1660018201528260158201525f82516158ac816035850160208701614ec4565b91909101603501949350505050565b5f82516158cc818460208701614ec4565b9190910192915050565b5f602082840312156158e6575f80fd5b815161069f816150a1565b5f808335601e19843603018112615906575f80fd5b8301803591506001600160401b0382111561591f575f80fd5b6020019150600581901b3603821315615202575f80fd5b5f60408201848352602060408185015281855180845260608601915082870193505f5b8181101561597e5784516001600160a01b031683529383019391830191600101615959565b5090979650505050505050565b5f602080838503121561599c575f80fd5b82516001600160401b038111156159b1575f80fd5b8301601f810185136159c1575f80fd5b80516159cf614d1c82614d9a565b81815260059190911b820183019083810190878311156159ed575f80fd5b928401925b82841015614470578351825292840192908401906159f2565b602080825260139082015272151bdbc81b1a5d1d1b19481c9958d95a5d9959606a1b604082015260600190565b602081525f8235615a4881614dbc565b6001600160a01b0316602083810191909152615a6690840184615716565b604080850152615a7a6060850182846156ee565b95945050505050565b60208082526017908201527f496e76616c696420777261707065642061646472657373000000000000000000604082015260600190565b8082018082111561157d5761157d615488565b5f8351615ade818460208801614ec4565b6508ae4e4dee4560d31b9083019081528351615b01816006840160208801614ec4565b602960f81b60069290910191820152600701949350505050565b5f8351615b2c818460208801614ec4565b650a0c2dcd2c6560d31b9083019081528351615b01816006840160208801614ec4565b5f8351615b60818460208801614ec4565b670aadcd6dcdeeedc560c31b9083019081528351615b85816008840160208801614ec4565b602960f81b60089290910191820152600901949350505050565b848152836020820152826040820152608060608201525f6120e06080830184614ee6565b6001600160a01b03831681526040810160048310615bef57634e487b7160e01b5f52602160045260245ffd5b8260208301529392505050565b80516001600160701b0381168114614ddb575f80fd5b5f805f60608486031215615c24575f80fd5b615c2d84615bfc565b9250615c3b60208501615bfc565b9150604084015163ffffffff81168114615359575f80fd5b84815283602082015260018060a01b0383166040820152608060608201525f6120e06080830184614ee6565b5f60208284031215615c8f575f80fd5b815161069f81614dbc565b5f60208284031215615caa575f80fd5b815162ffffff8116811461069f575f80fd5b602080825260089082015267109859081c1bdbdb60c21b604082015260600190565b6001600160a01b03818116838216019080821115615cfe57615cfe615488565b5092915050565b828152604060208201525f61507b6040830184614ee6565b6001600160a01b0386811682528515156020830152604082018590528316606082015260a0608082018190525f9061447090830184614ee6565b5f8060408385031215615d68575f80fd5b505080516020909101519092909150565b5f600160ff1b8201615d8d57615d8d615488565b505f0390565b6001600160a01b03828116828216039080821115615cfe57615cfe615488565b634e487b7160e01b5f52601260045260245ffd5b5f82615dd557615dd5615db3565b500690565b808202811582820484141761157d5761157d615488565b5f82615dff57615dff615db3565b50049056fea26469706673582212204f637f4c295074f72cbc3c36d09625f5fdf3a44c7aff79ff9b262a8ea106cf0864736f6c63430008140033

Deployed Bytecode

0x608060405260043610610184575f3560e01c80637ec753fe116100d0578063b9b5149b11610089578063d63234e011610063578063d63234e0146105a8578063d808d889146105c5578063fa461e33146102a4578063fa9ec7af146105d8576101c3565b8063b9b5149b14610546578063bf5c55a214610559578063c34c08e514610578576101c3565b80637ec753fe1461049757806392bcc8be146104b657806394d3d793146104d5578063afed2d0e146104e9578063b93c0beb14610508578063b946fd3b14610527576101c3565b80633644e5151161013d5780635ac86ab7116101175780635ac86ab7146103e95780636b3ec416146104185780636fbf72f91461042b5780637e467ecf14610464576101c3565b80633644e515146102eb5780633c481d57146103005780634c42342f146103d6576101c3565b80630ced9fb9146101ff5780630dc4bdae146102365780630e8cc705146102575780631975b0961461027657806323a69e75146102a45780632adb806f146102c3576101c3565b366101c357604080513381523460208201527f7784f8d436dc514f0690e472c7e2d7f660a73e504c69b2350f6be5a5f02432ef910160405180910390a1005b3480156101ce575f80fd5b505f80806101df3660048184614c38565b8101906101ec9190614cc9565b9250925092506101fd8383836105eb565b005b34801561020a575f80fd5b50600654600754604080516001600160a01b039384168152929091166020830152015b60405180910390f35b610249610244366004614d54565b610694565b60405190815260200161022d565b348015610262575f80fd5b506101fd610271366004614de0565b6106a6565b348015610281575f80fd5b50610295610290366004614e86565b610826565b60405161022d93929190614f11565b3480156102af575f80fd5b506101fd6102be366004614f4e565b610925565b6102d66102d1366004614fc6565b61096b565b6040805192835260208301919091520161022d565b3480156102f6575f80fd5b5061024960095481565b34801561030b575f80fd5b5060026020527fac33ff75c19e70fe83507db0d683fd3465c996598dc972688b7ace676c89077b547fe90b7bceb6e7df5418fb78d8ee546e97c83a08bbccc01a0644d599ccd2a7c2e0547f679795a0195a1b76cdebb7c51d74e058aee92919b8c3389af86ef24535e8a28c5460035f527f88601476d11616a71c5be67555bd1dff4b1cbf21533d2669b768b61518cfe1c35460ff938416939283169291821691166040805194151585529215156020850152901515918301919091521515606082015260800161022d565b6102d66103e436600461504a565b610992565b3480156103f4575f80fd5b50610408610403366004615083565b6109b6565b604051901515815260200161022d565b6101fd61042636600461504a565b6109f6565b348015610436575f80fd5b506004546005546008546040805193845260208401929092526001600160a01b03169082015260600161022d565b34801561046f575f80fd5b506102497f048f880a603b1aab0e626a287e33d603417b3d53a36f7527b7c86365bf7def4f81565b3480156104a2575f80fd5b506101fd6104b1366004615111565b610d11565b3480156104c1575f80fd5b506101fd6104d0366004615209565b610e96565b3480156104e0575f80fd5b506101fd61107f565b3480156104f4575f80fd5b506101fd61050336600461529b565b611105565b348015610513575f80fd5b506101fd6105223660046152b6565b611175565b348015610532575f80fd5b506101fd61054136600461531c565b61142a565b61024961055436600461504a565b611573565b348015610564575f80fd5b506101fd610573366004615364565b611583565b348015610583575f80fd5b505f546001600160a01b03165b6040516001600160a01b03909116815260200161022d565b3480156105b3575f80fd5b506001546001600160a01b0316610590565b6102496105d3366004614fc6565b611618565b6102d66105e6366004614d54565b611623565b5f8313806105f857505f82135b6106345760405162461bcd60e51b81526020600482015260086024820152674d30206f72204d3160c01b60448201526064015b60405180910390fd5b5f808280602001905181019061064a91906153b4565b915091505f80828060200190518101906106649190615431565b91509150610673848233611633565b855f88131561067f5750865b61068a8333836117e6565b5050505050505050565b5f61069f8383611903565b9392505050565b6106ae611e9f565b5f5b8251811015610821575f6106dc8483815181106106cf576106cf61545d565b6020026020010151611f15565b156106f25750476106ed8382611f4d565b61079e565b8382815181106107045761070461545d565b60209081029190910101516040516370a0823160e01b81523060048201526001600160a01b03909116906370a0823190602401602060405180830381865afa158015610752573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906107769190615471565b905061079c84838151811061078d5761078d61545d565b60200260200101518483612006565b505b826001600160a01b0316336001600160a01b03168584815181106107c4576107c461545d565b60200260200101516001600160a01b03167f3115d1449a7b732c986cba18244e897a450f61e1bb8d589cd2e69e6c8924f9f78460405161080691815260200190565b60405180910390a450806108198161549c565b9150506106b0565b505050565b6040805180820182525f80825260606020808401919091526001600160a01b038781168352600a8252848320548782168452600b835285842054878552600c84529386902086518088019097528054909216865260018201805460ff92831697929095169594919384019161089a906154b4565b80601f01602080910402602001604051908101604052809291908181526020018280546108c6906154b4565b80156109115780601f106108e857610100808354040283529160200191610911565b820191905f5260205f20905b8154815290600101906020018083116108f457829003601f168201915b505050505081525050905093509350939050565b610965848484848080601f0160208091040260200160405190810160405280939291908181526020018383808284375f920191909152506105eb92505050565b50505050565b5f805f5a905061097b85856120ea565b92505a61098890826154e6565b9150509250929050565b5f805f5a90506109a1846125fb565b92505a6109ae90826154e6565b915050915091565b5f60025f8360038111156109cc576109cc6154f9565b60038111156109dd576109dd6154f9565b815260208101919091526040015f205460ff1692915050565b600260035403610a185760405162461bcd60e51b815260040161062b9061550d565b60026003556003610a2881612b44565b5f610a37610120840184615544565b905011610a805760405162461bcd60e51b8152602060048201526017602482015276646174612073686f756c64206265206e6f74207a65726f60481b604482015260640161062b565b5f8260a0013511610ad35760405162461bcd60e51b815260206004820152601f60248201527f616d6f756e742073686f756c642062652067726561746572207468616e203000604482015260640161062b565b600a5f610ae6606085016040860161529b565b6001600160a01b0316815260208101919091526040015f205460ff16610b3f5760405162461bcd60e51b815260206004820152600e60248201526d34b73b30b634b21031b0b63632b960911b604482015260640161062b565b5f610b8f6003610b52602086018661529b565b610b6260a087016080880161529b565b610b72606088016040890161529b565b60a088013560c0890135610b8a6101408b018b615544565b612b8d565b90505f80610ba3606086016040870161529b565b6001600160a01b031683610bbb610120880188615544565b604051610bc9929190615586565b5f6040518083038185875af1925050503d805f8114610c03576040519150601f19603f3d011682016040523d82523d5f602084013e610c08565b606091505b509150915081610c5c57610c43816040518060400160405280600f81526020016e2a3930b739b4ba21b937b9b9ab1a9d60891b815250612e03565b60405162461bcd60e51b815260040161062b9190615595565b610c82610c6c602087018761529b565b610c7c606088016040890161529b565b5f613077565b50610d079050610c95602085018561529b565b610ca5604086016020870161529b565b610cb5608087016060880161529b565b60a08701355f60e0890135610cce6101008b018b615544565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284375f9201919091525061318692505050565b5050600160035550565b610d19611e9f565b5f5b8251811015610821575f828281518110610d3757610d3761545d565b602002602001015110158015610d6857506103e8828281518110610d5d57610d5d61545d565b602002602001015111155b610da95760405162461bcd60e51b8152602060048201526012602482015271066656520726174652069733a302d313030360741b604482015260640161062b565b828181518110610dbb57610dbb61545d565b602002602001015115610ded57818181518110610dda57610dda61545d565b6020026020010151600481905550610e0e565b818181518110610dff57610dff61545d565b60200260200101516005819055505b7f5fa95345cbe35dad70f67a9ca1430c22453a695590cb4fca05d58f637e85af4f838281518110610e4157610e4161545d565b6020026020010151838381518110610e5b57610e5b61545d565b6020026020010151604051610e7c9291909115158252602082015260400190565b60405180910390a180610e8e8161549c565b915050610d1b565b610e9e611e9f565b848114610edc5760405162461bcd60e51b815260206004820152600c60248201526b696e76616c6964206461746160a01b604482015260640161062b565b828114610f1a5760405162461bcd60e51b815260206004820152600c60248201526b696e76616c6964206461746160a01b604482015260640161062b565b825f5b81811015611034576040518060400160405280878784818110610f4257610f4261545d565b9050602002016020810190610f57919061529b565b6001600160a01b03168152602001858584818110610f7757610f7761545d565b9050602002810190610f899190615544565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284375f9201829052509390945250600c92508b90508a85818110610fd557610fd561545d565b60209081029290920135835250818101929092526040015f20825181546001600160a01b0319166001600160a01b0390911617815590820151600182019061101d90826155ec565b50905050808061102c9061549c565b915050610f1d565b507f652c1af850dcc0b28fcb71cd9473023f56a89edd81bbe7b51056a04caa94002487878787878760405161106e96959493929190615757565b60405180910390a150505050505050565b33806110936001546001600160a01b031690565b6001600160a01b0316146110f95760405162461bcd60e51b815260206004820152602760248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206e657720656044820152663c32b1baba37b960c91b606482015260840161062b565b611102816131ea565b50565b61110d611e9f565b600180546001600160a01b0383166001600160a01b0319909116811790915561113d5f546001600160a01b031690565b6001600160a01b03167fdd01547fc40682edc3cd8d164d53f5a1ae6b46138a83f045658ed760823ddba860405160405180910390a350565b61117d611e9f565b8215611275575f5b8381101561123a57600a5f8686848181106111a2576111a261545d565b90506020020160208101906111b7919061529b565b6001600160a01b0316815260208101919091526040015f9081205460ff161590600a908787858181106111ec576111ec61545d565b9050602002016020810190611201919061529b565b6001600160a01b0316815260208101919091526040015f20805460ff1916911515919091179055806112328161549c565b915050611185565b507fb05655746bd43b7fe3ccd9d28b7685b4c67ddc51e70890062b0f7f85dd692695848460405161126c929190615807565b60405180910390a15b8015610965575f816001600160401b0381111561129457611294614c5f565b6040519080825280602002602001820160405280156112bd578160200160208202803683370190505b5090505f5b828110156113e757600b5f8585848181106112df576112df61545d565b90506020020160208101906112f4919061529b565b6001600160a01b0316815260208101919091526040015f9081205460ff161590600b908686858181106113295761132961545d565b905060200201602081019061133e919061529b565b6001600160a01b0316815260208101919091526040015f908120805460ff191692151592909217909155600b9085858481811061137d5761137d61545d565b9050602002016020810190611392919061529b565b6001600160a01b0316815260208101919091526040015f2054825160ff909116908390839081106113c5576113c561545d565b91151560209283029190910190910152806113df8161549c565b9150506112c2565b507f4a28b173d9bc739be3886d172e07fef80392184787fc6b92406ce0f0c05b7e6383838360405161141b9392919061581a565b60405180910390a15050505050565b611432611e9f565b6001600160a01b0383161561149357600680546001600160a01b0319166001600160a01b0385169081179091556040519081527f347fade115440908839b750620f0add8f417b77a392657edd70b950373eda9c39060200160405180910390a15b6001600160a01b0382161561150157600780546001600160a01b038481166001600160a01b031983168117909355604080519190921680825260208201939093527ff9c6fa562c9d8326f8518a29a53ef18ab03cd6b9eead73ac667c5e289354c73e910160405180910390a1505b6001600160a01b0381161561082157600880546001600160a01b038381166001600160a01b031983168117909355604080519190921680825260208201939093527fb3911b5760f95a64aaa8d7f1775f57a7b6ed0bcf1ebb3fbfcc045e2f04eaad11910160405180910390a150505050565b5f61157d826125fb565b92915050565b61158b611e9f565b805f5b818110156116115784156115d0576115cb8484838181106115b1576115b161545d565b90506020020160208101906115c69190615083565b613243565b6115ff565b6115ff8484838181106115e5576115e561545d565b90506020020160208101906115fa9190615083565b6132d5565b806116098161549c565b91505061158e565b5050505050565b5f61069f83836120ea565b5f805f5a905061097b8585611903565b600f60f884901c165f818152600c60209081526040808320815180830190925280546001600160a01b031682526001810180549293919291840191611677906154b4565b80601f01602080910402602001604051908101604052809291908181526020018280546116a3906154b4565b80156116ee5780601f106116c5576101008083540402835291602001916116ee565b820191905f5260205f20905b8154815290600101906020018083116116d157829003601f168201915b5050509190925250508151919250506001600160a01b03166117525760405162461bcd60e51b815260206004820152601960248201527f43616c6c6261636b2062616420706f6f6c20696e646578656400000000000000604482015260640161062b565b5f815f015185836020015160405160200161176f93929190615873565b604051602081830303815290604052805190602001205f1c9050836001600160a01b0316816001600160a01b0316146117de5760405162461bcd60e51b815260206004820152601160248201527010d85b1b189858dac8189859081c1bdbdb607a1b604482015260640161062b565b505050505050565b604080516001600160a01b038481166024830152604480830185905283518084039091018152606490920183526020820180516001600160e01b031663a9059cbb60e01b17905291515f9283929087169161184191906158bb565b5f604051808303815f865af19150503d805f811461187a576040519150601f19603f3d011682016040523d82523d5f602084013e61187f565b606091505b50915091508180156118a95750805115806118a95750808060200190518101906118a991906158d6565b6116115760405162461bcd60e51b815260206004820152602560248201527f5472616e7366657248656c7065723a205452414e534645525f544f4b454e5f46604482015264105253115160da1b606482015260840161062b565b5f6002600354036119265760405162461bcd60e51b815260040161062b9061550d565b6002600355600161193681612b44565b428310156119705760405162461bcd60e51b8152602060048201526007602482015266115e1c1a5c995960ca1b604482015260640161062b565b6001600f604086013560f81c16145f8080808061198d8a8761335a565b945094509450945094506119ef835f815181106119ac576119ac61545d565b60200260200101518b8060e001906119c491906158f1565b5f8181106119d4576119d461545d565b90506020020160208101906119e9919061529b565b866117e6565b8515611bb6578415611ad357611a4960408b013584611a1160e08e018e6158f1565b808060200260200160405190810160405280939291908181526020018383602002808284375f92019190915250309250613887915050565b611acc82611a5d60408d0160208e0161529b565b6040516370a0823160e01b81523060048201526001600160a01b0391909116906370a08231906024015b602060405180830381865afa158015611aa2573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611ac69190615471565b90613b7e565b9750611d4f565b611b3f60408b013584611ae960e08e018e6158f1565b808060200260200160405190810160405280939291908181526020018383602002808284375f81840152601f19601f820116905080830192505050505050508d5f016020810190611b3a919061529b565b613887565b611acc818460018651611b5291906154e6565b81518110611b6257611b6261545d565b60200260200101516001600160a01b03166370a082318d5f016020810190611b8a919061529b565b6040516001600160e01b031960e084901b1681526001600160a01b039091166004820152602401611a87565b5f8a604001356001600160a01b031663d06ca61f86866040518363ffffffff1660e01b8152600401611be9929190615936565b5f60405180830381865afa158015611c03573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f19168201604052611c2a919081019061598b565b90508515611c9757611c7c8185611c4460e08f018f6158f1565b808060200260200160405190810160405280939291908181526020018383602002808284375f92019190915250309250613bd3915050565b611c9083611a5d60408e0160208f0161529b565b9850611d4d565b611cff8185611ca960e08f018f6158f1565b808060200260200160405190810160405280939291908181526020018383602002808284375f81840152601f19601f820116905080830192505050505050508e5f016020810190611cfa919061529b565b613bd3565b611d4a828560018751611d1291906154e6565b81518110611d2257611d2261545d565b60200260200101516001600160a01b03166370a082318e5f016020810190611b8a919061529b565b98505b505b8960800135881015611d735760405162461bcd60e51b815260040161062b90615a0b565b8415611da857611d92611d8c60408c0160208d0161529b565b89613dbd565b611da8611da260208c018c61529b565b89611f4d565b50505050505f85806101200190611dbf9190615544565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284375f92019190915250929350611e919250611e0791505060c08801886158f1565b5f818110611e1757611e1761545d565b9050602002016020810190611e2c919061529b565b611e3960c08901896158f1565b6001611e4860c08c018c6158f1565b611e539291506154e6565b818110611e6257611e6261545d565b9050602002016020810190611e77919061529b565b611e8460208a018a61529b565b8960600135885f87613186565b505050600160035592915050565b33611eb15f546001600160a01b031690565b6001600160a01b031614611f135760405162461bcd60e51b815260206004820152602360248201527f4f776e61626c653a2063616c6c6572206973206e6f74207468652065786563756044820152623a37b960e91b606482015260840161062b565b565b5f6001600160a01b038216158061157d57506001600160a01b03821673eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee1492915050565b604080515f808252602082019092526001600160a01b038416908390604051611f7691906158bb565b5f6040518083038185875af1925050503d805f8114611fb0576040519150601f19603f3d011682016040523d82523d5f602084013e611fb5565b606091505b50509050806108215760405162461bcd60e51b815260206004820152601f60248201527f5472616e7366657248656c7065723a205452414e534645525f4641494c454400604482015260640161062b565b5f805f856001600160a01b031663a9059cbb868660405160240161203f9291906001600160a01b03929092168252602082015260400190565b6040516020818303038152906040529060e01b6020820180516001600160e01b03838183161783525050505060405161207891906158bb565b5f604051808303815f865af19150503d805f81146120b1576040519150601f19603f3d011682016040523d82523d5f602084013e6120b6565b606091505b50915091508180156120e05750805115806120e05750808060200190518101906120e091906158d6565b9695505050505050565b5f60026003540361210d5760405162461bcd60e51b815260040161062b9061550d565b60026003555f61211c81612b44565b5f61212a6020850185615544565b9050116121735760405162461bcd60e51b8152602060048201526017602482015276646174612073686f756c64206265206e6f74207a65726f60481b604482015260640161062b565b5f8460800135116121c65760405162461bcd60e51b815260206004820152601f60248201527f616d6f756e742073686f756c642062652067726561746572207468616e203000604482015260640161062b565b5f6121d7606086016040870161529b565b6001600160a01b0316036122375760405162461bcd60e51b815260206004820152602160248201527f72656365697665722073686f756c64206265206e6f74206164647265737328306044820152602960f81b606482015260840161062b565b5f8460a001351161229b5760405162461bcd60e51b815260206004820152602860248201527f6d696e52657475726e416d6f756e742073686f756c6420626520677265617465604482015267072207468616e20360c41b606482015260840161062b565b600b5f6122ae608087016060880161529b565b6001600160a01b0316815260208101919091526040015f205460ff166123165760405162461bcd60e51b815260206004820152601760248201527f696e76616c696420777261707065642061646472657373000000000000000000604482015260640161062b565b6006545f906001600160a01b03168161235f8161233660208a018a61529b565b61234660808b0160608c0161529b565b8560808c013560c08d0135610b8a6101008f018f615544565b90506123796123746040890160208a0161529b565b611f15565b1561239f5761238e606088016040890161529b565b6001600160a01b0316319250612436565b6123af604088016020890161529b565b6001600160a01b03166370a082316123cd60608a0160408b0161529b565b6040516001600160e01b031960e084901b1681526001600160a01b039091166004820152602401602060405180830381865afa15801561240f573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906124339190615471565b92505b5f80836001600160a01b031683633f3204d28a6040516024016124599190615a38565b6040516020818303038152906040529060e01b6020820180516001600160e01b03838183161783525050505060405161249291906158bb565b5f6040518083038185875af1925050503d805f81146124cc576040519150601f19603f3d011682016040523d82523d5f602084013e6124d1565b606091505b50915091508161250957610c43816040518060400160405280600c81526020016b2a3930b739b4ba29bbb0b81d60a11b815250612e03565b5061251f90506123746040890160208a0161529b565b1561254f576125488361253860608a0160408b0161529b565b6001600160a01b03163190613b7e565b9450612584565b6125818361256360408a0160208b0161529b565b6001600160a01b03166370a08231611b8a60608c0160408d0161529b565b94505b8660a001358510156125a85760405162461bcd60e51b815260040161062b90615a0b565b6125ec6125b8602089018961529b565b6125c860408a0160208b0161529b565b6125d860608b0160408c0161529b565b60808b0135895f610cce60e08f018f615544565b50505050600160035592915050565b5f60026003540361261e5760405162461bcd60e51b815260040161062b9061550d565b6002600355600261262e81612b44565b5f61263d6101008501856158f1565b90501161267a5760405162461bcd60e51b815260206004820152600b60248201526a456d70747920706f6f6c7360a81b604482015260640161062b565b428360e0013510156126b85760405162461bcd60e51b8152602060048201526007602482015266115e1c1a5c995960ca1b604482015260640161062b565b600b5f6126cb608086016060870161529b565b6001600160a01b0316815260208101919091526040015f205460ff166127035760405162461bcd60e51b815260040161062b90615a83565b5f612711602085018561529b565b90505f612724604086016020870161529b565b90505f80612738612374602089018961529b565b156127505761274d608088016060890161529b565b93505b5f61278f600261276360208b018b61529b565b61277360808c0160608d0161529b565b5f8c608001358d60c001358e806101200190610b8a9190615544565b90506127a461237460408a0160208b0161529b565b1561283e576127b96080890160608a0161529b565b93506127cb6080890160608a0161529b565b6040516370a0823160e01b81523060048201526001600160a01b0391909116906370a0823190602401602060405180830381865afa15801561280f573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906128339190615471565b9250600191506128d5565b61284e6040890160208a0161529b565b6001600160a01b03166370a0823161286c60608b0160408c0161529b565b6040516001600160e01b031960e084901b1681526001600160a01b039091166004820152602401602060405180830381865afa1580156128ae573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906128d29190615471565b92505b5f6128e46101008a018a6158f1565b91503090506060600183111561299c57875f805b85811015612991575f8e80610100019061291291906158f1565b838181106129225761292261545d565b905060200201359050612936848483613ed0565b955093506129456001886154e6565b82148015612951575088155b1561296f578e6040016020810190612969919061529b565b95508a92505b61297b8682878b6141bb565b97505080806129899061549c565b9150506128f8565b50859b505050612a1a565b6129cb88886129af6101008f018f6158f1565b5f8181106129bf576129bf61545d565b90506020020135613ed0565b91508590506129e7576129e460608c0160408d0161529b565b91505b612a17826129f96101008e018e6158f1565b5f818110612a0957612a0961545d565b9050602002013583876141bb565b99505b5050508115612a9457612a3783611a5d60808b0160608c0161529b565b96508760a00135871015612a5d5760405162461bcd60e51b815260040161062b90615a0b565b612a76612a7060808a0160608b0161529b565b88613dbd565b612a8f612a8960608a0160408b0161529b565b88611f4d565b612aec565b612ac683612aa860408b0160208c0161529b565b6001600160a01b03166370a08231611b8a60608d0160408e0161529b565b96508760a00135871015612aec5760405162461bcd60e51b815260040161062b90615a0b565b612b34612afc60208a018a61529b565b612b0c60408b0160208c0161529b565b612b1c60608c0160408d0161529b565b8b608001358b5f8e806101400190610cce9190615544565b5050505050506001600355919050565b612b4d816109b6565b156111025760405162461bcd60e51b815260206004820152601060248201526f14185d5cd8589b194e881c185d5cd95960821b604482015260640161062b565b5f805f612b998661436a565b90925090505f60038c6003811115612bb357612bb36154f9565b14612bbf576001612bc1565b5f5b90505f612bd1828a858a8a6143c6565b9050612bdc8c611f15565b15612d565760038d6003811115612bf557612bf56154f9565b03612c4f5788341015612c3e5760405162461bcd60e51b8152602060048201526011602482015270696e76616c6964206d73672e76616c756560781b604482015260640161062b565b612c483484613b7e565b9450612c96565b883414612c925760405162461bcd60e51b8152602060048201526011602482015270696e76616c6964206d73672e76616c756560781b604482015260640161062b565b8094505b6001600160a01b038b1615612d35576001600160a01b038b165f908152600b602052604090205460ff16612cdc5760405162461bcd60e51b815260040161062b90615a83565b60038d6003811115612cf057612cf06154f9565b03612d1257612cff8b8661447b565b612d0a8b8b87613077565b5f9450612d35565b60028d6003811115612d2657612d266154f9565b03612d3557612d358b8261447b565b8315612d5157600854612d51906001600160a01b031684611f4d565b612df3565b612d628c33308c614575565b60038d6003811115612d7657612d766154f9565b03612d8e57612d868c8b83613077565b349450612dd3565b5f8d6003811115612da157612da16154f9565b03612db657612db18c8b836117e6565b612dd3565b60028d6003811115612dca57612dca6154f9565b03612dd3578094505b8315612df357600854612df1908d906001600160a01b031685612006565b505b5050505098975050505050505050565b60606044835110158015612e3b5750825f81518110612e2457612e2461545d565b6020910101516001600160f81b031916600160fb1b145b8015612e6c575082600181518110612e5557612e5561545d565b6020910101516001600160f81b03191660c360f81b145b8015612e9d575082600281518110612e8657612e8661545d565b6020910101516001600160f81b031916607960f81b145b8015612ece575082600381518110612eb757612eb761545d565b6020910101516001600160f81b031916600560fd1b145b15612f5857604483810180519091612ee69190615aba565b84511015612f2e5760405162461bcd60e51b815260206004820152601560248201527424b73b30b634b2103932bb32b93a103932b0b9b7b760591b604482015260640161062b565b8281604051602001612f41929190615acd565b60405160208183030381529060405291505061157d565b82516024148015612f8d5750825f81518110612f7657612f7661545d565b6020910101516001600160f81b031916602760f91b145b8015612fbe575082600181518110612fa757612fa761545d565b6020910101516001600160f81b031916600960fb1b145b8015612fef575082600281518110612fd857612fd861545d565b6020910101516001600160f81b031916607b60f81b145b80156130205750826003815181106130095761300961545d565b6020910101516001600160f81b031916607160f81b145b156130455760248301518261303482614698565b604051602001612f41929190615b1b565b8161304f846146c0565b604051602001613060929190615b4f565b604051602081830303815290604052905092915050565b604080516001600160a01b038481166024830152604480830185905283518084039091018152606490920183526020820180516001600160e01b031663095ea7b360e01b17905291515f928392908716916130d291906158bb565b5f604051808303815f865af19150503d805f811461310b576040519150601f19603f3d011682016040523d82523d5f602084013e613110565b606091505b509150915081801561313a57508051158061313a57508080602001905181019061313a91906158d6565b6116115760405162461bcd60e51b815260206004820152601e60248201527f5472616e7366657248656c7065723a20415050524f56455f4641494c45440000604482015260640161062b565b846001600160a01b0316866001600160a01b0316886001600160a01b03167f2251435bd151cd72851a82be055bf6d1c3d7f34d08d56493dddf874229b8e897878787876040516131d99493929190615b9f565b60405180910390a450505050505050565b600180546001600160a01b03199081169091555f80546001600160a01b03848116938216841783556040519116929183917f88436636ea40d5bb1bcc55ff9cd54788af71da886f4147a87f199adcca733d4d9190a35050565b8061324d81612b44565b600160025f846003811115613264576132646154f9565b6003811115613275576132756154f9565b81526020019081526020015f205f6101000a81548160ff0219169083151502179055507f534f879afd40abb4e39f8e1b77a316be4c8e3521d9cf5a3a3db8959d574d455933836040516132c9929190615bc3565b60405180910390a15050565b806132df816148a0565b5f60025f8460038111156132f5576132f56154f9565b6003811115613306576133066154f9565b81526020019081526020015f205f6101000a81548160ff0219169083151502179055507f4cd3e1443d03aba343c5d882744f8f172c07b495e955ac3defb325cbd73c855033836040516132c9929190615bc3565b5f806060818061336d60e08801886158f1565b61337991506001615aba565b61338660c08901896158f1565b9050146133c45760405162461bcd60e51b815260206004820152600c60248201526b092dcecc2d8d2c840e0c2e8d60a31b604482015260640161062b565b600b5f6133d760408a0160208b0161529b565b6001600160a01b0316815260208101919091526040015f205460ff1661340f5760405162461bcd60e51b815260040161062b90615a83565b5f8061341e8960a0013561436a565b9092509050613441600160608b01358361343c6101008e018e615544565b6143c6565b95505f61345160c08b018b6158f1565b808060200260200160405190810160405280939291908181526020018383602002808284375f92018290525093945084925060019150613496905060c08e018e6158f1565b6134a19291506154e6565b815181106134b1576134b161545d565b602002602001015190506134f38b8060c001906134ce91906158f1565b5f8181106134de576134de61545d565b9050602002016020810190612374919061529b565b156135b3578a60600135341461353f5760405162461bcd60e51b8152602060048201526011602482015270496e76616c6964206d73672e76616c756560781b604482015260640161062b565b831561355b5760085461355b906001600160a01b031684611f4d565b61356b60408c0160208d0161529b565b825f8151811061357d5761357d61545d565b6001600160a01b039092166020928302919091018201526135ae906135a89060408e01908e0161529b565b8961447b565b613714565b89156136c557815f815181106135cb576135cb61545d565b60209081029190910101516040516370a0823160e01b81523060048201526001600160a01b03909116906370a0823190602401602060405180830381865afa158015613619573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061363d9190615471565b9750613668825f815181106136545761365461545d565b602002602001015133308e60600135614575565b6136be8b60a00135611ac68a855f815181106136865761368661545d565b60209081029190910101516040516370a0823160e01b81523060048201526001600160a01b03909116906370a0823190602401611a87565b97506136da565b6136da825f815181106136545761365461545d565b831561371457613712825f815181106136f5576136f561545d565b60209081029190910101516008546001600160a01b031685612006565b505b61371d81611f15565b156137eb5761373260408c0160208d0161529b565b826001845161374191906154e6565b815181106137515761375161545d565b6001600160a01b039092166020928302919091018201526001995061377c9060408d01908d0161529b565b6040516370a0823160e01b81523060048201526001600160a01b0391909116906370a0823190602401602060405180830381865afa1580156137c0573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906137e49190615471565b9550613876565b8915613876576001600160a01b0381166370a0823161380d60208e018e61529b565b6040516001600160e01b031960e084901b1681526001600160a01b039091166004820152602401602060405180830381865afa15801561384f573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906138739190615471565b94505b819650505050509295509295909350565b5f5b6001845161389791906154e6565b811015611611575f808583815181106138b2576138b261545d565b6020026020010151868460016138c89190615aba565b815181106138d8576138d861545d565b6020026020010151915091505f816001600160a01b0316836001600160a01b031610613905578183613908565b82825b5090505f86858151811061391e5761391e61545d565b602002602001015190505f805f80846001600160a01b0316630902f1ac6040518163ffffffff1660e01b8152600401606060405180830381865afa158015613968573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061398c9190615c12565b506001600160701b031691506001600160701b031691505f80876001600160a01b03168a6001600160a01b0316146139c55782846139c8565b83835b6040516370a0823160e01b81526001600160a01b038a81166004830152929450909250613a03918491908d16906370a0823190602401611a87565b95508e6001600160a01b031663054d50d48784846040518463ffffffff1660e01b8152600401613a46939291909283526020830191909152604082015260600190565b602060405180830381865afa158015613a61573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190613a859190615471565b9450505050505f80856001600160a01b0316886001600160a01b031614613aad57825f613ab0565b5f835b915091505f60028d51613ac391906154e6565b8a10613acf578a613af4565b8b613adb8b6001615aba565b81518110613aeb57613aeb61545d565b60200260200101515b604080515f8152602081019182905263022c0d9f60e01b9091529091506001600160a01b0387169063022c0d9f90613b359086908690869060248101615c53565b5f604051808303815f87803b158015613b4c575f80fd5b505af1158015613b5e573d5f803e3d5ffd5b505050505050505050505050508080613b769061549c565b915050613889565b5f82613b8a83826154e6565b915081111561157d5760405162461bcd60e51b815260206004820152601560248201527464732d6d6174682d7375622d756e646572666c6f7760581b604482015260640161062b565b5f5b60018451613be391906154e6565b811015611611575f80858381518110613bfe57613bfe61545d565b602002602001015186846001613c149190615aba565b81518110613c2457613c2461545d565b6020026020010151915091505f816001600160a01b0316836001600160a01b031610613c51578183613c54565b82825b5090505f88613c64866001615aba565b81518110613c7457613c7461545d565b602002602001015190505f80836001600160a01b0316866001600160a01b031614613ca057825f613ca3565b5f835b915091505f60028b51613cb691906154e6565b8810613cc25788613ce7565b89613cce896001615aba565b81518110613cde57613cde61545d565b60200260200101515b9050898881518110613cfb57613cfb61545d565b60200260200101516001600160a01b031663022c0d9f8484845f6001600160401b03811115613d2c57613d2c614c5f565b6040519080825280601f01601f191660200182016040528015613d56576020820181803683370190505b506040518563ffffffff1660e01b8152600401613d769493929190615c53565b5f604051808303815f87803b158015613d8d575f80fd5b505af1158015613d9f573d5f803e3d5ffd5b50505050505050505050508080613db59061549c565b915050613bd5565b5f80836001600160a01b03165f632e1a7d4d85604051602401613de291815260200190565b6040516020818303038152906040529060e01b6020820180516001600160e01b038381831617835250505050604051613e1b91906158bb565b5f6040518083038185875af1925050503d805f8114613e55576040519150601f19603f3d011682016040523d82523d5f602084013e613e5a565b606091505b5091509150818015613e84575080511580613e84575080806020019051810190613e8491906158d6565b6109655760405162461bcd60e51b815260206004820152601f60248201527f5472616e7366657248656c7065723a2057495448445241575f4641494c454400604482015260640161062b565b5f60605f8390505f816001600160a01b0316630dfe16816040518163ffffffff1660e01b8152600401602060405180830381865afa158015613f14573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190613f389190615c7f565b90505f826001600160a01b031663d21220a76040518163ffffffff1660e01b8152600401602060405180830381865afa158015613f77573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190613f9b9190615c7f565b90505f836001600160a01b031663ddca3f436040518163ffffffff1660e01b8152600401602060405180830381865afa158015613fda573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190613ffe9190615c9a565b604080516001600160a01b03808716602083015285169181019190915262ffffff821660608201529091505f9060800160408051601f1981840301815291905280516020909101209050600160ff1b88161580156140fe57846001600160a01b03168b6001600160a01b0316146140875760405162461bcd60e51b815260040161062b90615cbc565b6001600160a01b038a16156140c757836001600160a01b03168a6001600160a01b0316146140c75760405162461bcd60e51b815260040161062b90615cbc565b604080516001600160a01b0387166020820152908101839052939750879360600160405160208183030381529060405296506141a2565b836001600160a01b03168b6001600160a01b03161461412f5760405162461bcd60e51b815260040161062b90615cbc565b6001600160a01b038a161561416f57846001600160a01b03168a6001600160a01b03161461416f5760405162461bcd60e51b815260040161062b90615cbc565b604080516001600160a01b0386166020820152908101839052949750879460600160405160208183030381529060405296505b6141ad89838b611633565b505050505050935093915050565b5f600160ff1b8416158015614293575f856001600160a01b031663128acb0888846141e5886148ec565b6141f56401000276a36001615cde565b8b8b604051602001614208929190615d05565b6040516020818303038152906040526040518663ffffffff1660e01b8152600401614237959493929190615d1d565b60408051808303815f875af1158015614252573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906142769190615d57565b91505061428b8161428690615d79565b614959565b925050614361565b5f856001600160a01b031663128acb0888846142ae886148ec565b6142cd600173fffd8963efd1fc6a506488495d951d5263988d26615d93565b8b8b6040516020016142e0929190615d05565b6040516020818303038152906040526040518663ffffffff1660e01b815260040161430f959493929190615d1d565b60408051808303815f875af115801561432a573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061434e9190615d57565b50905061435d61428682615d79565b9250505b50949350505050565b5f8080614378600a85615dc7565b905061438f600a6143898684613b7e565b906149aa565b91508060011480156143a057505f82115b80156143b657506008546001600160a01b031615155b156143c057600192505b50915091565b5f8086156143f0576143e9612710614389600454896149f790919063ffffffff16565b905061440e565b61440b612710614389600554896149f790919063ffffffff16565b90505b808510156144665761442286868686614a5d565b6144665760405162461bcd60e51b8152602060048201526015602482015274496e76616c6964207369676e61747572652066656560581b604482015260640161062b565b6144708686613b7e565b979650505050505050565b60408051600481526024810182526020810180516001600160e01b0316630d0e30db60e41b17905290515f9182916001600160a01b0386169185916144c091906158bb565b5f6040518083038185875af1925050503d805f81146144fa576040519150601f19603f3d011682016040523d82523d5f602084013e6144ff565b606091505b509150915081801561452957508051158061452957508080602001905181019061452991906158d6565b6109655760405162461bcd60e51b815260206004820152601e60248201527f5472616e7366657248656c7065723a204445504f5349545f4641494c45440000604482015260640161062b565b604080516001600160a01b0385811660248301528481166044830152606480830185905283518084039091018152608490920183526020820180516001600160e01b03166323b872dd60e01b17905291515f928392908816916145d891906158bb565b5f604051808303815f865af19150503d805f8114614611576040519150601f19603f3d011682016040523d82523d5f602084013e614616565b606091505b509150915081801561464057508051158061464057508080602001905181019061464091906158d6565b6117de5760405162461bcd60e51b8152602060048201526024808201527f5472616e7366657248656c7065723a205452414e534645525f46524f4d5f46416044820152631253115160e21b606482015260840161062b565b606061157d826040516020016146b091815260200190565b6040516020818303038152906040525b80516060906f181899199a1a9b1b9c1cb0b131b232b360811b905f906146e7906002615dda565b6146f2906002615aba565b6001600160401b0381111561470957614709614c5f565b6040519080825280601f01601f191660200182016040528015614733576020820181803683370190505b509050600360fc1b815f8151811061474d5761474d61545d565b60200101906001600160f81b03191690815f1a905350600f60fb1b8160018151811061477b5761477b61545d565b60200101906001600160f81b03191690815f1a9053505f5b8451811015614898578260048683815181106147b1576147b161545d565b01602001516001600160f81b031916901c60f81c601081106147d5576147d561545d565b1a60f81b826147e5836002615dda565b6147f0906002615aba565b815181106148005761480061545d565b60200101906001600160f81b03191690815f1a905350828582815181106148295761482961545d565b60209101015160f81c600f16601081106148455761484561545d565b1a60f81b82614855836002615dda565b614860906003615aba565b815181106148705761487061545d565b60200101906001600160f81b03191690815f1a905350806148908161549c565b915050614793565b509392505050565b6148a9816109b6565b6111025760405162461bcd60e51b815260206004820152601460248201527314185d5cd8589b194e881b9bdd081c185d5cd95960621b604482015260640161062b565b5f6001600160ff1b038211156149555760405162461bcd60e51b815260206004820152602860248201527f53616665436173743a2076616c756520646f65736e27742066697420696e2061604482015267371034b73a191a9b60c11b606482015260840161062b565b5090565b5f808212156149555760405162461bcd60e51b815260206004820181905260248201527f53616665436173743a2076616c7565206d75737420626520706f736974697665604482015260640161062b565b5f815f036149ed5760405162461bcd60e51b815260206004820152601060248201526f64732d6d6174682d6469762d7a65726f60801b604482015260640161062b565b61069f8284615df1565b5f811580614a1a57508282614a0c8183615dda565b9250614a189083615df1565b145b61157d5760405162461bcd60e51b815260206004820152601460248201527364732d6d6174682d6d756c2d6f766572666c6f7760601b604482015260640161062b565b600954604080517f048f880a603b1aab0e626a287e33d603417b3d53a36f7527b7c86365bf7def4f6020820152339181019190915260608101869052608081018590525f91829160a00160405160208183030381529060405280519060200120604051602001614ae492919061190160f01b81526002810192909252602282015260420190565b6040516020818303038152906040528051906020012090505f805f614b3d87878080601f0160208091040260200160405190810160405280939291908181526020018383808284375f92019190915250614bc992505050565b9250925092505f6001858585856040515f8152602001604052604051614b7f949392919093845260ff9290921660208401526040830152606082015260800190565b6020604051602081039080840390855afa158015614b9f573d5f803e3d5ffd5b5050604051601f1901516007546001600160a01b039081169116149b9a5050505050505050505050565b5f805f8351604114614c1d5760405162461bcd60e51b815260206004820152601860248201527f496e76616c6964207369676e6174757265206c656e6774680000000000000000604482015260640161062b565b505050602081015160408201516060909201515f1a92909190565b5f8085851115614c46575f80fd5b83861115614c52575f80fd5b5050820193919092039150565b634e487b7160e01b5f52604160045260245ffd5b604051601f8201601f191681016001600160401b0381118282101715614c9b57614c9b614c5f565b604052919050565b5f6001600160401b03821115614cbb57614cbb614c5f565b50601f01601f191660200190565b5f805f60608486031215614cdb575f80fd5b833592506020840135915060408401356001600160401b03811115614cfe575f80fd5b8401601f81018613614d0e575f80fd5b8035614d21614d1c82614ca3565b614c73565b818152876020838501011115614d35575f80fd5b816020840160208301375f602083830101528093505050509250925092565b5f8060408385031215614d65575f80fd5b82356001600160401b03811115614d7a575f80fd5b83016101408186031215614d8c575f80fd5b946020939093013593505050565b5f6001600160401b03821115614db257614db2614c5f565b5060051b60200190565b6001600160a01b0381168114611102575f80fd5b8035614ddb81614dbc565b919050565b5f8060408385031215614df1575f80fd5b82356001600160401b03811115614e06575f80fd5b8301601f81018513614e16575f80fd5b80356020614e26614d1c83614d9a565b82815260059290921b83018101918181019088841115614e44575f80fd5b938201935b83851015614e6b578435614e5c81614dbc565b82529382019390820190614e49565b9550614e7a9050868201614dd0565b93505050509250929050565b5f805f60608486031215614e98575f80fd5b8335614ea381614dbc565b92506020840135614eb381614dbc565b929592945050506040919091013590565b5f5b83811015614ede578181015183820152602001614ec6565b50505f910152565b5f8151808452614efd816020860160208601614ec4565b601f01601f19169290920160200192915050565b831515815282151560208201526060604082015260018060a01b0382511660608201525f6020830151604060808401526120e060a0840182614ee6565b5f805f8060608587031215614f61575f80fd5b843593506020850135925060408501356001600160401b0380821115614f85575f80fd5b818701915087601f830112614f98575f80fd5b813581811115614fa6575f80fd5b886020828501011115614fb7575f80fd5b95989497505060200194505050565b5f8060408385031215614fd7575f80fd5b82356001600160401b0380821115614fed575f80fd5b908401906101208287031215615001575f80fd5b90925060208401359080821115615016575f80fd5b50830160408186031215615028575f80fd5b809150509250929050565b5f6101608284031215615044575f80fd5b50919050565b5f6020828403121561505a575f80fd5b81356001600160401b0381111561506f575f80fd5b61507b84828501615033565b949350505050565b5f60208284031215615093575f80fd5b81356004811061069f575f80fd5b8015158114611102575f80fd5b5f82601f8301126150bd575f80fd5b813560206150cd614d1c83614d9a565b82815260059290921b840181019181810190868411156150eb575f80fd5b8286015b8481101561510657803583529183019183016150ef565b509695505050505050565b5f8060408385031215615122575f80fd5b82356001600160401b0380821115615138575f80fd5b818501915085601f83011261514b575f80fd5b8135602061515b614d1c83614d9a565b82815260059290921b84018101918181019089841115615179575f80fd5b948201945b838610156151a0578535615191816150a1565b8252948201949082019061517e565b965050860135925050808211156151b5575f80fd5b50610988858286016150ae565b5f8083601f8401126151d2575f80fd5b5081356001600160401b038111156151e8575f80fd5b6020830191508360208260051b8501011115615202575f80fd5b9250929050565b5f805f805f806060878903121561521e575f80fd5b86356001600160401b0380821115615234575f80fd5b6152408a838b016151c2565b90985096506020890135915080821115615258575f80fd5b6152648a838b016151c2565b9096509450604089013591508082111561527c575f80fd5b5061528989828a016151c2565b979a9699509497509295939492505050565b5f602082840312156152ab575f80fd5b813561069f81614dbc565b5f805f80604085870312156152c9575f80fd5b84356001600160401b03808211156152df575f80fd5b6152eb888389016151c2565b90965094506020870135915080821115615303575f80fd5b50615310878288016151c2565b95989497509550505050565b5f805f6060848603121561532e575f80fd5b833561533981614dbc565b9250602084013561534981614dbc565b9150604084013561535981614dbc565b809150509250925092565b5f805f60408486031215615376575f80fd5b8335615381816150a1565b925060208401356001600160401b0381111561539b575f80fd5b6153a7868287016151c2565b9497909650939450505050565b5f80604083850312156153c5575f80fd5b8251915060208301516001600160401b038111156153e1575f80fd5b8301601f810185136153f1575f80fd5b80516153ff614d1c82614ca3565b818152866020838501011115615413575f80fd5b615424826020830160208601614ec4565b8093505050509250929050565b5f8060408385031215615442575f80fd5b825161544d81614dbc565b6020939093015192949293505050565b634e487b7160e01b5f52603260045260245ffd5b5f60208284031215615481575f80fd5b5051919050565b634e487b7160e01b5f52601160045260245ffd5b5f600182016154ad576154ad615488565b5060010190565b600181811c908216806154c857607f821691505b60208210810361504457634e487b7160e01b5f52602260045260245ffd5b8181038181111561157d5761157d615488565b634e487b7160e01b5f52602160045260245ffd5b6020808252601f908201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00604082015260600190565b5f808335601e19843603018112615559575f80fd5b8301803591506001600160401b03821115615572575f80fd5b602001915036819003821315615202575f80fd5b818382375f9101908152919050565b602081525f61069f6020830184614ee6565b601f821115610821575f81815260208120601f850160051c810160208610156155cd5750805b601f850160051c820191505b818110156117de578281556001016155d9565b81516001600160401b0381111561560557615605614c5f565b6156198161561384546154b4565b846155a7565b602080601f83116001811461564c575f84156156355750858301515b5f19600386901b1c1916600185901b1785556117de565b5f85815260208120601f198616915b8281101561567a5788860151825594840194600190910190840161565b565b508582101561569757878501515f19600388901b60f8161c191681555b5050505050600190811b01905550565b8183525f60208085019450825f5b858110156156e35781356156c881614dbc565b6001600160a01b0316875295820195908201906001016156b5565b509495945050505050565b81835281816020850137505f828201602090810191909152601f909101601f19169091010190565b5f808335601e1984360301811261572b575f80fd5b83016020810192503590506001600160401b03811115615749575f80fd5b803603821315615202575f80fd5b606080825281018690525f6001600160fb1b03871115615775575f80fd5b8660051b80896080850137808301905060206080848303018185015261579f60808301888a6156a7565b84810360408601528581529150808201600586901b83018201875f5b888110156157f557858303601f190184526157d6828b615716565b6157e18582846156ee565b9587019594505050908401906001016157bb565b50909c9b505050505050505050505050565b602081525f61507b6020830184866156a7565b604081525f61582d6040830185876156a7565b8281036020848101919091528451808352858201928201905f5b81811015615865578451151583529383019391830191600101615847565b509098975050505050505050565b60ff60f81b81526bffffffffffffffffffffffff198460601b1660018201528260158201525f82516158ac816035850160208701614ec4565b91909101603501949350505050565b5f82516158cc818460208701614ec4565b9190910192915050565b5f602082840312156158e6575f80fd5b815161069f816150a1565b5f808335601e19843603018112615906575f80fd5b8301803591506001600160401b0382111561591f575f80fd5b6020019150600581901b3603821315615202575f80fd5b5f60408201848352602060408185015281855180845260608601915082870193505f5b8181101561597e5784516001600160a01b031683529383019391830191600101615959565b5090979650505050505050565b5f602080838503121561599c575f80fd5b82516001600160401b038111156159b1575f80fd5b8301601f810185136159c1575f80fd5b80516159cf614d1c82614d9a565b81815260059190911b820183019083810190878311156159ed575f80fd5b928401925b82841015614470578351825292840192908401906159f2565b602080825260139082015272151bdbc81b1a5d1d1b19481c9958d95a5d9959606a1b604082015260600190565b602081525f8235615a4881614dbc565b6001600160a01b0316602083810191909152615a6690840184615716565b604080850152615a7a6060850182846156ee565b95945050505050565b60208082526017908201527f496e76616c696420777261707065642061646472657373000000000000000000604082015260600190565b8082018082111561157d5761157d615488565b5f8351615ade818460208801614ec4565b6508ae4e4dee4560d31b9083019081528351615b01816006840160208801614ec4565b602960f81b60069290910191820152600701949350505050565b5f8351615b2c818460208801614ec4565b650a0c2dcd2c6560d31b9083019081528351615b01816006840160208801614ec4565b5f8351615b60818460208801614ec4565b670aadcd6dcdeeedc560c31b9083019081528351615b85816008840160208801614ec4565b602960f81b60089290910191820152600901949350505050565b848152836020820152826040820152608060608201525f6120e06080830184614ee6565b6001600160a01b03831681526040810160048310615bef57634e487b7160e01b5f52602160045260245ffd5b8260208301529392505050565b80516001600160701b0381168114614ddb575f80fd5b5f805f60608486031215615c24575f80fd5b615c2d84615bfc565b9250615c3b60208501615bfc565b9150604084015163ffffffff81168114615359575f80fd5b84815283602082015260018060a01b0383166040820152608060608201525f6120e06080830184614ee6565b5f60208284031215615c8f575f80fd5b815161069f81614dbc565b5f60208284031215615caa575f80fd5b815162ffffff8116811461069f575f80fd5b602080825260089082015267109859081c1bdbdb60c21b604082015260600190565b6001600160a01b03818116838216019080821115615cfe57615cfe615488565b5092915050565b828152604060208201525f61507b6040830184614ee6565b6001600160a01b0386811682528515156020830152604082018590528316606082015260a0608082018190525f9061447090830184614ee6565b5f8060408385031215615d68575f80fd5b505080516020909101519092909150565b5f600160ff1b8201615d8d57615d8d615488565b505f0390565b6001600160a01b03828116828216039080821115615cfe57615cfe615488565b634e487b7160e01b5f52601260045260245ffd5b5f82615dd557615dd5615db3565b500690565b808202811582820484141761157d5761157d615488565b5f82615dff57615dff615db3565b50049056fea26469706673582212204f637f4c295074f72cbc3c36d09625f5fdf3a44c7aff79ff9b262a8ea106cf0864736f6c63430008140033

Block Transaction Gas Used Reward
view all blocks produced

Block Uncle Number Difficulty Gas Used Reward
View All Uncles
Loading...
Loading
Loading...
Loading

Validator Index Block Amount
View All Withdrawals

Transaction Hash Block Value Eth2 PubKey Valid
View All Deposits
Chain Token Portfolio % Price Amount Value
BASE20.39%$3,443.843.3751$11,623.15
BASE7.41%$0.00016226,052,413.2098$4,221.01
BASE3.76%$0.9993472,143.6812$2,142.28
BASE3.12%$2.98596.5512$1,777.72
BASE1.73%$0.006214158,499.5207$984.85
BASE1.66%$0.01904749,816.2528$948.87
BASE0.99%$0.02827919,857.0313$561.53
BASE0.61%$0.510507686.2689$350.35
BASE0.42%$0.0313027,719.7477$241.64
BASE0.26%$2.9650.9581$150.84
BASE0.26%$1.7188.1592$150.75
BASE0.25%$0.01128312,535.5971$141.44
BASE0.24%$0.1118991,244.9459$139.31
BASE0.23%<$0.000001462,713,182.6465$129.33
BASE0.22%$0.00340536,227.4313$123.36
BASE0.20%$0.0189366,111.3578$115.72
BASE0.20%$1.5571.8433$111.36
BASE0.19%$0.0277413,915.7149$108.62
BASE0.19%$0.0113279,407.4376$106.56
BASE0.16%$0.00301929,713.0689$89.71
BASE0.15%$0.0150825,685.3425$85.75
BASE0.14%$0.0681561,186.6947$80.88
BASE0.12%$0.00461214,498.8304$66.87
BASE0.11%$0.000513121,870.8945$62.49
BASE0.09%$0.000178302,642.6371$53.88
BASE0.08%$0.0251661,910.3423$48.08
BASE0.08%$0.0308481,547.5411$47.74
BASE0.08%$0.210467213.7003$44.98
BASE0.08%$3.0614.3655$43.96
BASE0.06%<$0.000001914,578,261.7135$34.94
BASE0.06%$0.00149622,655.8959$33.9
BASE0.05%$0.000077404,978.1508$31.1
BASE0.05%$0.0005355,600.699$29.47
BASE0.05%$0.00064145,577.7171$29.23
BASE0.05%$0.0066754,332.0488$28.92
BASE0.05%$0.0217131,281.9401$27.83
BASE0.05%$0.269117100.6457$27.09
BASE0.05%$0.00045858,971.6485$27.03
BASE0.05%$3,437.530.00775629$26.66
BASE0.05%$0.0000055,146,419.2574$26.25
BASE0.04%$0.000132194,370.4645$25.62
BASE0.04%$0.034741735.2686$25.54
BASE0.04%$0.93406725.9449$24.23
BASE0.04%$0.000163147,002.0179$23.89
BASE0.04%$0.000073325,454.2772$23.88
BASE0.04%$0.00037563,521.4192$23.8
BASE0.04%$0.000028820,398.3472$23.28
BASE0.04%$0.00136416,307.116$22.24
BASE0.04%$0.00049443,530.6855$21.49
BASE0.04%<$0.0000013,943,514,203.8204$20.51
BASE0.04%$0.061781328.7456$20.31
BASE0.03%$0.9990219.8878$19.87
BASE0.03%$0.0000171,137,622.8165$19.59
BASE0.03%$0.000011,903,883.699$18.68
BASE0.03%$0.00052135,552.6341$18.54
BASE0.03%$0.00025273,030.5727$18.43
BASE0.03%$0.00018593,250.0529$17.22
BASE0.03%$0.01863918.9813$17.12
BASE0.03%$0.000027625,107.3823$16.94
BASE0.03%$0.0036564,623.0128$16.9
BASE0.03%$0.017477958.3644$16.75
BASE0.03%$0.0037914,404.5027$16.7
BASE0.03%$94,5930.00017541$16.59
BASE0.03%$0.0071312,321.6209$16.56
BASE0.03%<$0.00000148,365,943.3391$15.7
BASE0.03%$0.0000026,567,382.282$15.3
BASE0.03%$0.006962,151.3333$14.97
BASE0.03%$0.027224547.3782$14.9
BASE0.03%$0.0037663,846.2419$14.48
BASE0.03%$0.000011,379,810.7778$14.34
BASE0.02%$20.030.7055$14.13
BASE0.02%$0.00127310,628.4456$13.53
BASE0.02%$0.00064720,716.096$13.4
BASE0.02%$0.002944,440.3344$13.05
BASE0.02%$0.24226353.4426$12.95
BASE0.02%$0.17109574.8284$12.8
BASE0.02%$0.00072116,872.1474$12.16
BASE0.02%$0.0064191,831.6856$11.76
BASE0.02%$0.005861,875.591$10.99
BASE0.02%$0.1421677.0736$10.96
BASE0.02%$0.0002347,553.374$10.96
BASE0.02%$0.098237105.6418$10.38
BASE0.02%$0.00094610,701.1646$10.13
BASE0.02%$0.000034279,652.714$9.65
BASE0.02%$0.0009539,539.0312$9.09
BASE0.02%$0.065569135.1474$8.86
BASE0.01%<$0.0000013,276,461,587.3203$8.52
BASE0.01%$0.18301543.9146$8.04
BASE0.01%$0.01288593.9087$7.65
BASE0.01%$0.50534415.1257$7.64
BASE0.01%$0.00026828,196.2967$7.56
BASE0.01%$0.065314114.0967$7.45
BASE0.01%$0.0014864,927.2233$7.32
BASE0.01%$0.762839.484$7.23
BASE0.01%$0.0003917,665.21$6.9
BASE0.01%$0.0058791,167.354$6.86
BASE0.01%$0.0043891,457.6515$6.4
BASE0.01%$0.00009466,798.3958$6.27
BASE0.01%$0.00025524,279.2396$6.2
BASE0.01%$0.0012294,958.9453$6.1
BASE0.01%<$0.000001733,053,526.8293$6.08
BASE0.01%$0.0015693,744.0177$5.88
BASE<0.01%$0.0007667,152.9199$5.48
BASE<0.01%$11.360.4646$5.28
BASE<0.01%$0.0015623,266.7502$5.1
BASE<0.01%$0.09274454.4861$5.05
BASE<0.01%$0.000009545,469.5294$5
BASE<0.01%$0.007133683.2262$4.87
BASE<0.01%$0.9992454.8227$4.82
BASE<0.01%$0.0690965.8405$4.55
BASE<0.01%$0.000027160,875.2699$4.37
BASE<0.01%$1.074.047$4.33
BASE<0.01%$0.002711,542.1553$4.18
BASE<0.01%$0.00004984,468.8124$4.13
BASE<0.01%$0.38639410.4223$4.03
BASE<0.01%$0.000011368,383.2525$3.87
BASE<0.01%$0.0037221,008.479$3.75
BASE<0.01%$0.0014812,528.6613$3.75
BASE<0.01%<$0.00000121,395,498.7099$3.67
BASE<0.01%$0.0036131,008.1564$3.64
BASE<0.01%$0.00003118,983.896$3.61
BASE<0.01%$0.00015423,437$3.6
BASE<0.01%$0.003661970.6541$3.55
BASE<0.01%$0.00005464,988.3189$3.52
BASE<0.01%$0.13703323.522$3.22
BASE<0.01%$0.00005459,936.374$3.21
BASE<0.01%$0.000006546,893.316$3.14
BASE<0.01%$0.0003758,343.5661$3.13
BASE<0.01%<$0.0000014,323,006,764.2335$3.03
BASE<0.01%$0.2860410.4426$2.99
BASE<0.01%$0.000024124,059.3699$2.94
BASE<0.01%$1.51.9076$2.86
BASE<0.01%$0.00005451,815.4505$2.78
BASE<0.01%$0.007253380.5413$2.76
BASE<0.01%$0.008073331.6497$2.68
BASE<0.01%<$0.0000011,180,082,999.0007$2.6
BASE<0.01%$0.0019891,277.3688$2.54
BASE<0.01%$0.024063104.6621$2.52
BASE<0.01%$0.0003257,715.6189$2.51
BASE<0.01%$0.002911839.4522$2.44
BASE<0.01%$0.04865250.1055$2.44
BASE<0.01%$0.0005174,692.3864$2.43
BASE<0.01%$0.0004295,638.3865$2.42
BASE<0.01%$0.00073,412.0206$2.39
BASE<0.01%$0.0006873,469.6489$2.38
BASE<0.01%$0.000022103,826.8203$2.33
BASE<0.01%$1.341.6756$2.25
BASE<0.01%$2.840.7681$2.18
BASE<0.01%$0.00017611,668.1525$2.06
BASE<0.01%$0.004748413.4982$1.96
BASE<0.01%$0.00004838,232.4893$1.82
BASE<0.01%$0.09354718.3748$1.72
BASE<0.01%$0.0003115,007.8264$1.56
BASE<0.01%$5.70.2561$1.46
BASE<0.01%$0.0004033,613.5259$1.46
BASE<0.01%$0.00009215,428.5252$1.42
BASE<0.01%$0.0000269,943.5002$1.37
BASE<0.01%$0.002577490.148$1.26
BASE<0.01%$0.0002145,447.264$1.17
BASE<0.01%$0.01350882.0978$1.11
BASE<0.01%$0.004079270.348$1.1
BASE<0.01%$0.00007514,307.1862$1.07
BASE<0.01%$0.0006011,560.8577$0.9378
BASE<0.01%$0.02715634.4018$0.9342
BASE<0.01%$0.0000011,650,636.7758$0.8355
BASE<0.01%$0.00002433,786.2071$0.8169
BASE<0.01%$0.00943784.5035$0.7974
BASE<0.01%$0.06234412.4725$0.7775
BASE<0.01%$0.447271.6139$0.7218
BASE<0.01%$0.000381,894.0428$0.7195
BASE<0.01%$172.030.00411678$0.7082
BASE<0.01%$0.0159540.427$0.6448
BASE<0.01%$0.0001095,917.9209$0.6446
BASE<0.01%$0.00004215,196.0146$0.6431
BASE<0.01%$0.9997080.6249$0.6247
BASE<0.01%$0.000667900$0.6004
BASE<0.01%<$0.0000012,101,091.4396$0.5769
BASE<0.01%<$0.0000012,334,249.601$0.5681
BASE<0.01%$0.00539798.8026$0.5332
BASE<0.01%$0.0000846,258.1826$0.5279
BASE<0.01%$0.00002223,236.8423$0.5181
BASE<0.01%$0.004806103.8184$0.4989
BASE<0.01%$0.01150842.282$0.4865
BASE<0.01%$0.00002816,670.7873$0.4697
BASE<0.01%$0.00965246.988$0.4535
BASE<0.01%$0.0001024,171.1228$0.424
BASE<0.01%$0.0001962,145.8357$0.4198
BASE<0.01%$0.0125333.5051$0.4198
BASE<0.01%$10.4134$0.4142
BASE<0.01%$0.000001435,575.7614$0.4106
BASE<0.01%$0.000928433.0407$0.4019
BASE<0.01%$0.0000934,182.1318$0.3888
BASE<0.01%$3,537.230.00010625$0.3758
BASE<0.01%$0.000001371,633.1589$0.3431
BASE<0.01%$0.2696241.1864$0.3198
BASE<0.01%$0.000375843.5299$0.3159
BASE<0.01%$0.0120124.773$0.2975
BASE<0.01%$0.00042681.9108$0.2861
BASE<0.01%$0.0000319,041.6964$0.2815
BASE<0.01%$3,729.090.00007292$0.2719
BASE<0.01%$0.0735163.2968$0.2423
BASE<0.01%$2.110.1136$0.2397
BASE<0.01%<$0.0000012,928,991.2482$0.2217
BASE<0.01%$0.0001591,234.0888$0.1961
BASE<0.01%$4.230.0432$0.1827
BASE<0.01%$0.000303557.7464$0.1692
BASE<0.01%$0.0003503.7026$0.151
BASE<0.01%$0.000787190.08$0.1495
BASE<0.01%$0.01336110.4041$0.139
BASE<0.01%$0.000797172.7913$0.1376
BASE<0.01%$2.160.0599$0.1294
BASE<0.01%$0.3286270.3195$0.1049
BASE<0.01%$0.00041251.0851$0.1029
POL5.39%$0.9991013,077.3228$3,074.56
POL2.54%$0.5010952,888.1989$1,447.26
POL2.19%$15.2182.2097$1,250.41
POL1.87%$0.9985871,070.1358$1,068.62
POL1.59%$0.000005192,103,105.0405$908.55
POL0.19%$0.0229514,673.8364$107.27
POL0.18%$3,444.360.0295$101.66
POL0.15%$186.1455$86.15
POL0.13%$2.1834.9727$76.41
POL0.13%$0.205794365.0346$75.12
POL0.13%$0.639482116.8798$74.74
POL0.09%$0.19953267.128$53.3
POL0.06%$0.0048577,564.0991$36.74
POL0.04%$0.114475222.8977$25.52
POL0.03%$0.097724184.2625$18.01
POL0.03%$117.9318$17.93
POL0.03%<$0.000001978,214,710.0742$14.87
POL0.02%$0.50090127.9136$13.98
POL0.02%<$0.000001995,373,435.7491$13.04
POL0.02%$24.570.4778$11.74
POL0.02%$0.0045712,381.8557$10.89
POL0.02%$0.012716853.4512$10.85
POL0.02%$0.00100710,073.9144$10.15
POL0.02%$0.0000042,280,716.8806$9.37
POL0.02%$0.000023381,419.2838$8.6
POL0.01%$0.012577662.9543$8.34
POL0.01%$94,4250.00008466$7.99
POL0.01%$6.681.1679$7.8
POL0.01%$0.9763247.827$7.64
POL0.01%$358.360.0207$7.43
POL0.01%$0.014109523.7417$7.39
POL0.01%$0.00030323,671.3983$7.18
POL0.01%$0.59404410.8566$6.45
POL0.01%$0.0006819,365.5432$6.38
POL0.01%$0.037984158.744$6.03
POL0.01%$0.14032741.444$5.82
POL0.01%$0.0037471,529.4772$5.73
POL<0.01%$0.07604871.4734$5.44
POL<0.01%$0.0041671,298.207$5.41
POL<0.01%$0.016083330.3825$5.31
POL<0.01%<$0.000001557,849,877.5545$5.13
POL<0.01%$0.0007536,091.4554$4.59
POL<0.01%$1.552.9002$4.5
POL<0.01%$0.000032135,105.9711$4.37
POL<0.01%$0.5619467.5138$4.22
POL<0.01%$0.006203679.1563$4.21
POL<0.01%$0.0030071,400.3208$4.21
POL<0.01%$0.014811282.9573$4.19
POL<0.01%<$0.00000118,644,125.8484$4.13
POL<0.01%$1,634.330.00245521$4.01
POL<0.01%$0.005064783.4232$3.97
POL<0.01%$0.21070218.5987$3.92
POL<0.01%$0.004018873.1404$3.51
POL<0.01%$2,622.790.00133231$3.49
POL<0.01%$0.5705795.746$3.28
POL<0.01%$0.0007284,488.3148$3.27
POL<0.01%$5.70.5672$3.23
POL<0.01%$0.9562033.3523$3.21
POL<0.01%$1.053.0276$3.19
POL<0.01%$0.00019915,403.9373$3.07
POL<0.01%$0.04730957.5357$2.72
POL<0.01%$0.004196623.3706$2.62
POL<0.01%$0.02610799.0253$2.59
POL<0.01%$0.010571242.9299$2.57
POL<0.01%$0.3120438.1289$2.54
POL<0.01%$0.0013661,824.8485$2.49
POL<0.01%$0.0011062,246.1796$2.48
POL<0.01%$0.002251,024.9575$2.31
POL<0.01%$0.010443211.8626$2.21
POL<0.01%$0.007836276.7176$2.17
POL<0.01%$0.0013591,550.2591$2.11
POL<0.01%$0.17557311.8207$2.08
POL<0.01%$0.4554984.5326$2.06
POL<0.01%$0.0014991,364.423$2.04
POL<0.01%$0.13841914.2592$1.97
POL<0.01%$1.071.8381$1.97
POL<0.01%$0.5964973.2697$1.95
POL<0.01%$0.1839.81$1.8
POL<0.01%<$0.0000013,590,701.637$1.77
POL<0.01%$0.005142333.0016$1.71
POL<0.01%$0.008691196.7091$1.71
POL<0.01%$0.05086732.7989$1.67
POL<0.01%$0.7532272.1684$1.63
POL<0.01%$0.3287064.9017$1.61
POL<0.01%$0.2241657.042$1.58
POL<0.01%$84.790.0181$1.53
POL<0.01%$0.0006622,269.2599$1.5
POL<0.01%$1.830.8071$1.48
POL<0.01%$0.003753380.8009$1.43
POL<0.01%$3.170.4443$1.41
POL<0.01%$191.030.0073561$1.41
POL<0.01%$22.330.06$1.34
POL<0.01%$9,085.070.00014616$1.33
POL<0.01%$0.001785722.8484$1.29
POL<0.01%$94,045.930.00001297$1.22
POL<0.01%$0.010739108.146$1.16
POL<0.01%$279.270.00413211$1.15
POL<0.01%$1.151.0021$1.15
POL<0.01%<$0.0000012,294,424,803.3778$1.15
POL<0.01%$383.280.00288569$1.11
POL<0.01%$93,607.330.00001174$1.1
POL<0.01%$0.010099105.3221$1.06
POL<0.01%$0.01044295.1422$0.9934
POL<0.01%$0.02371441.8825$0.9931
POL<0.01%$0.0002413,944.023$0.9516
POL<0.01%$0.9974060.9241$0.9217
POL<0.01%$0.1443266.2631$0.9039
POL<0.01%$14.390.0624$0.8976
POL<0.01%<$0.00000175,364,553.4469$0.8893
POL<0.01%$54.870.0158$0.8679
POL<0.01%$0.04514117.061$0.7701
POL<0.01%$0.1782143.9011$0.6952
POL<0.01%$0.002205304.5432$0.6715
POL<0.01%$0.01170956.9009$0.6662
POL<0.01%$0.001096603.766$0.6615
POL<0.01%$0.01901433.8403$0.6434
POL<0.01%$0.02104430.2584$0.6367
POL<0.01%$0.04668113.4818$0.6293
POL<0.01%$0.5921051.0616$0.6286
POL<0.01%$0.000719849.135$0.6105
POL<0.01%$0.0001943,060$0.5927
POL<0.01%$0.2577322.2709$0.5852
POL<0.01%$0.0001613,330.8346$0.5374
POL<0.01%$67.290.00757738$0.5098
POL<0.01%$0.00634277.7197$0.4928
POL<0.01%$0.04784210.0731$0.4819
POL<0.01%$0.00633874.4426$0.4718
POL<0.01%$0.002538176.8765$0.4489
POL<0.01%$3.170.1383$0.4384
POL<0.01%$0.9929240.4287$0.4256
POL<0.01%$0.001288323.0774$0.4162
POL<0.01%$2.130.1912$0.4072
POL<0.01%$0.00576370.5009$0.4062
POL<0.01%$39.190.00993778$0.3894
POL<0.01%$0.189122.0563$0.3888
POL<0.01%$0.02897112.305$0.3564
POL<0.01%$1.910.1864$0.356
POL<0.01%$0.00002712,818.0602$0.3464
POL<0.01%$0.1630542.1009$0.3425
POL<0.01%$0.3192181.0014$0.3196
POL<0.01%$0.01113227.606$0.3073
POL<0.01%$4.670.0651$0.3039
POL<0.01%$0.00944631.671$0.2991
POL<0.01%$0.3053590.8941$0.273
POL<0.01%$0.0441426.14$0.271
POL<0.01%$3.810.0704$0.268
POL<0.01%$0.00374670.4865$0.264
POL<0.01%$0.3882310.6767$0.2627
POL<0.01%$0.000001187,440.9439$0.2617
POL<0.01%$0.000462551.2581$0.2548
POL<0.01%$0.5056910.4863$0.2459
POL<0.01%$0.4053440.6004$0.2433
POL<0.01%$0.000728319.6318$0.2326
POL<0.01%$0.00538943.1355$0.2324
POL<0.01%$0.00574739.8386$0.2289
POL<0.01%$0.00352761.8109$0.2179
POL<0.01%$0.0690553.06$0.2113
POL<0.01%$0.00259374.8589$0.1941
POL<0.01%$0.0389324.7761$0.1859
POL<0.01%$0.6311130.2873$0.1812
POL<0.01%$0.000354510.2289$0.1808
POL<0.01%$0.2027910.8354$0.1694
POL<0.01%$0.00444137.8156$0.1679
POL<0.01%$7.690.0212$0.1629
POL<0.01%$0.00959116.6918$0.16
POL<0.01%$0.00182885.4094$0.1561
POL<0.01%$0.0403173.8638$0.1557
POL<0.01%$0.0000236,562.4755$0.1531
POL<0.01%$0.0000275,460$0.1497
POL<0.01%$0.00181481$0.1469
POL<0.01%$0.00309146.8625$0.1448
POL<0.01%$0.000836168.6045$0.1409
POL<0.01%$0.00000915,574.2636$0.1395
POL<0.01%$0.000283492.3$0.1394
POL<0.01%$15.690.00879491$0.1379
POL<0.01%$0.000386352.7281$0.136
POL<0.01%$0.1988350.6549$0.1302
POL<0.01%$0.00571922.03$0.1259
POL<0.01%$0.9992930.1244$0.1243
POL<0.01%$0.00178569.4373$0.1239
POL<0.01%$1.270.0944$0.1198
POL<0.01%$0.1104441.0684$0.1179
POL<0.01%$0.000001106,869.2317$0.117
POL<0.01%$0.000859131.781$0.1131
POL<0.01%$0.3279180.3445$0.1129
POL<0.01%$0.7574610.1407$0.1065
POL<0.01%$0.0000971,074.4882$0.1038
BLAST7.07%$0.009401428,405.6325$4,027.45
BLAST5.59%$3,444.220.9258$3,188.57
BLAST1.40%$0.995717799.5444$796.12
BLAST0.02%$0.00078612,008.4736$9.43
BLAST0.01%$0.009441614.34$5.8
BLAST<0.01%<$0.0000011,450,578,659.1048$5.66
BLAST<0.01%$0.0034441,419.4119$4.89
BLAST<0.01%$0.005179729.1285$3.78
BLAST<0.01%$0.000026144,204.513$3.69
BLAST<0.01%<$0.00000110,893,779,514.4255$2.18
BLAST<0.01%$0.00008521,231.4592$1.8
BLAST<0.01%$0.02326167.7377$1.58
BLAST<0.01%$0.0008821,490.4663$1.31
BLAST<0.01%$0.004345135.7399$0.5898
BLAST<0.01%$3,439.110.00012511$0.4302
BLAST<0.01%<$0.0000015,962,555.8153$0.3726
BLAST<0.01%$0.001461117.1757$0.1711
ARB7.64%$0.9986764,359.1342$4,353.36
ARB1.36%$3,443.820.2246$773.61
ARB0.54%$1306.1741$306.17
ARB0.41%$0.804456290.5844$233.76
ARB0.19%$94,4130.00112664$106.37
ARB0.11%$3,439.110.0188$64.76
ARB0.04%$0.073717289.4568$21.34
ARB0.04%$0.066921300$20.08
ARB0.02%$112.5466$12.55
ARB0.02%$0.44617428.0386$12.51
ARB0.02%<$0.00000133,244,793,959.6623$9.97
ARB0.02%$0.000085116,821.6663$9.89
ARB0.02%$0.00042620,149.2108$8.58
ARB0.01%$0.042745164.2409$7.02
ARB0.01%$2.113.1623$6.67
ARB0.01%$2.272.7092$6.15
ARB0.01%$5.711.0629$6.07
ARB<0.01%$0.970435.4$5.24
ARB<0.01%$0.016062323.6846$5.2
ARB<0.01%$14.430.3461$4.99
ARB<0.01%$0.05601879.5027$4.45
ARB<0.01%$0.032507122.9074$4
ARB<0.01%$3,540.430.00109814$3.89
ARB<0.01%$0.007552513.0315$3.87
ARB<0.01%$0.07338650.9201$3.74
ARB<0.01%$0.013412277.85$3.73
ARB<0.01%$0.27270813.3946$3.65
ARB<0.01%$15.640.231$3.61
ARB<0.01%<$0.00000125,229,161.9743$3.56
ARB<0.01%$1.552.2063$3.42
ARB<0.01%$94,2560.00002665$2.51
ARB<0.01%$0.000017139,889.5729$2.44
ARB<0.01%$1.911.1984$2.29
ARB<0.01%$0.06589731.7833$2.09
ARB<0.01%$2.380.8554$2.04
ARB<0.01%$0.05356936.5838$1.96
ARB<0.01%$0.10530115.4706$1.63
ARB<0.01%$24.60.0646$1.59
ARB<0.01%$2.850.5436$1.55
ARB<0.01%$94,5110.00001612$1.52
ARB<0.01%<$0.0000017,383,535,208.2711$1.48
ARB<0.01%$0.0614521.4419$1.32
ARB<0.01%$0.00001967,309.0989$1.25
ARB<0.01%$0.00009912,418.7969$1.22
ARB<0.01%$0.0010491,127.7062$1.18
ARB<0.01%$0.2490364.6775$1.16
ARB<0.01%$3.530.3104$1.1
ARB<0.01%$0.0429225.1883$1.08
ARB<0.01%$3,434.720.00031063$1.07
ARB<0.01%$0.158426.3051$0.9988
ARB<0.01%$0.00001660,913.7905$0.9587
ARB<0.01%$0.007393117.3198$0.8673
ARB<0.01%$5.320.1598$0.8501
ARB<0.01%$0.0181644.2536$0.8036
ARB<0.01%$0.1872984.048$0.7581
ARB<0.01%$0.000001851,848.4097$0.7099
ARB<0.01%$10.6618$0.6617
ARB<0.01%<$0.000001195,174,014.308$0.644
ARB<0.01%$0.9755180.6387$0.623
ARB<0.01%$0.3119151.8763$0.5852
ARB<0.01%$0.03886214.9291$0.5801
ARB<0.01%$2.530.204$0.5161
ARB<0.01%$0.00000956,838.3259$0.4893
ARB<0.01%$46.940.0104$0.489
ARB<0.01%$0.0611117.4108$0.4528
ARB<0.01%<$0.000001644,231,831.2765$0.4509
ARB<0.01%$3.230.1345$0.4343
ARB<0.01%$37.540.00984186$0.3694
ARB<0.01%$0.5570570.6281$0.3498
ARB<0.01%$0.2865551.1568$0.3314
ARB<0.01%$1,104.020.00029362$0.3241
ARB<0.01%$0.2241741.4406$0.3229
ARB<0.01%$0.4125950.6218$0.2565
ARB<0.01%$0.7757680.315$0.2443
ARB<0.01%$0.0229939.9376$0.2284
ARB<0.01%$0.000417466.8607$0.1947
ARB<0.01%$0.000782215.9687$0.1689
ARB<0.01%$0.00957416.7821$0.1606
ARB<0.01%$0.00336746.8487$0.1577
ARB<0.01%$1.240.1008$0.1249
ARB<0.01%$0.052052.3908$0.1244
ARB<0.01%$0.0243544.809$0.1171
ARB<0.01%$0.0400832.7453$0.11
FTM6.78%$94,2680.041$3,863.12
FTM1.28%$1.04701.7613$729.12
FTM0.22%$3,437.440.0361$124.26
FTM0.16%<$0.000001539,938,224.339$93.14
FTM0.09%$0.33476152.4104$51.02
FTM0.05%$9,081.970.00313831$28.5
FTM0.03%$1.2114.844$17.96
FTM0.01%$0.0034552,091.1685$7.23
FTM0.01%$0.50105213.4735$6.75
FTM<0.01%$383.040.0136$5.23
FTM<0.01%$24.520.1271$3.12
FTM<0.01%$0.03627656.7798$2.06
FTM<0.01%$358.60.00569666$2.04
FTM<0.01%$0.9928141.7226$1.71
FTM<0.01%$1.081.2318$1.33
FTM<0.01%$6.990.1129$0.7889
FTM<0.01%$0.000783765.7002$0.5998
FTM<0.01%$0.1698832.6532$0.4507
FTM<0.01%$0.0697775.8301$0.4068
FTM<0.01%<$0.0000012,194,824.3926$0.3858
FTM<0.01%$0.00131896.1584$0.1267
AVAX0.95%$39.2113.8639$543.57
AVAX0.61%$0.998907346.8392$346.46
AVAX0.23%$1129.6284$129.63
AVAX0.22%$0.998907126.3887$126.25
AVAX0.04%$0.59653740.2116$23.99
AVAX0.04%$0.150751146.8152$22.13
AVAX0.03%$0.0024837,716.3533$19.16
AVAX0.03%<$0.000001634,728,656.7938$14.98
AVAX0.01%$0.0000023,725,415.8668$6.26
AVAX<0.01%$0.35242915.634$5.51
AVAX<0.01%$0.00015828,530.7794$4.51
AVAX<0.01%$0.011334382.4024$4.33
AVAX<0.01%$24.540.1423$3.49
AVAX<0.01%$0.4124446.2316$2.57
AVAX<0.01%$358.180.00672696$2.41
AVAX<0.01%$46.180.0406$1.87
AVAX<0.01%$0.009434174.6522$1.65
AVAX<0.01%<$0.00000186,037,938.6272$1.6
AVAX<0.01%$0.000737994.4961$0.7326
AVAX<0.01%$0.02421830$0.7265
AVAX<0.01%$0.004887137.1119$0.67
AVAX<0.01%$29.50.0197$0.58
AVAX<0.01%$0.01759316.0118$0.2817
AVAX<0.01%$0.00794218.4674$0.1466
AVAX<0.01%$0.000438319.6418$0.14
SCROLL0.84%$3,440.980.1391$478.55
SCROLL0.28%$0.999577157.3646$157.3
SCROLL0.07%$0.99890740.412$40.37
SCROLL0.01%$1.26.9084$8.29
SCROLL0.01%$4,032.210.00176922$7.13
SCROLL<0.01%$94,208.010.00002657$2.5
SCROLL<0.01%$0.000001360,650.8428$0.2645
SCROLL<0.01%$0.9988080.1825$0.1823
SCROLL<0.01%$3,627.380.00004527$0.1641
LINEA0.88%$3,440.980.1461$502.68
LINEA0.05%$0.99858726.6852$26.65
LINEA0.04%$122.2307$22.23
LINEA0.01%$18.5129$8.54
LINEA0.01%$3,542.160.0018069$6.4
LINEA0.01%$0.0817670.6108$5.77
LINEA<0.01%$3,438.150.00091158$3.13
LINEA<0.01%$0.0014611,815.99$2.65
LINEA<0.01%$0.0002634,604.5255$1.21
LINEA<0.01%$0.07428413.8594$1.03
LINEA<0.01%$0.01123861.4385$0.6904
LINEA<0.01%$0.01036247.3847$0.4909
LINEA<0.01%$4,078.340.00007351$0.2998
OPBNB0.26%$695.640.2099$146.02
OPBNB0.14%$0.99986682.3882$82.38
WORLD0.18%$3,443.770.0301$103.67
WORLD0.05%$2.3411.485$26.87
WORLD0.01%$15.7929$5.79
BSC0.09%$0.99858749.9$49.83
BSC0.03%$696.520.0205$14.27
MANTLE0.01%$1.215.4778$6.64
MANTLE0.01%$0.9981776.1817$6.17
MANTLE<0.01%$3,437.380.00089829$3.09
MANTLE<0.01%$0.999382.7822$2.78
MANTLE<0.01%$3,618.090.0004112$1.49
MANTLE<0.01%$0.1090181$0.109
[ 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.