POL Price: $0.385451 (+1.93%)
 

Overview

POL Balance

Polygon PoS Chain LogoPolygon PoS Chain LogoPolygon PoS Chain Logo0 POL

POL Value

$0.00

Token Holdings

Sponsored

Transaction Hash
Method
Block
From
To
Buy600449612024-07-31 23:12:0467 days ago1722467524IN
0xa63D5704...a405Cc909
0 POL0.0116196930.00000002
Cancel600363392024-07-31 17:57:0567 days ago1722448625IN
0xa63D5704...a405Cc909
0 POL0.005851729.99999997
Cancel600349842024-07-31 17:08:0167 days ago1722445681IN
0xa63D5704...a405Cc909
0 POL0.0057337830.00000004
Buy600349332024-07-31 17:06:1367 days ago1722445573IN
0xa63D5704...a405Cc909
0 POL0.0116193330.00000005
Buy600346842024-07-31 16:57:2367 days ago1722445043IN
0xa63D5704...a405Cc909
0 POL0.0262522230.00000002
Cancel600346092024-07-31 16:54:4567 days ago1722444885IN
0xa63D5704...a405Cc909
0 POL0.0058837530.0000001
Cancel600337682024-07-31 16:24:2567 days ago1722443065IN
0xa63D5704...a405Cc909
0 POL0.0058376929.99999995
Cancel600336092024-07-31 16:18:1567 days ago1722442695IN
0xa63D5704...a405Cc909
0 POL0.0052983829.99999999
Sell600335532024-07-31 16:16:1767 days ago1722442577IN
0xa63D5704...a405Cc909
0 POL0.0167571630.00000005
Cancel600335392024-07-31 16:15:4767 days ago1722442547IN
0xa63D5704...a405Cc909
0 POL0.0054874530.00000003
Sell600324852024-07-31 15:37:5567 days ago1722440275IN
0xa63D5704...a405Cc909
0 POL0.0137570929.99999703
Cancel600319142024-07-31 15:17:0967 days ago1722439029IN
0xa63D5704...a405Cc909
0 POL0.0054029329.99999783
Cancel600319012024-07-31 15:16:4167 days ago1722439001IN
0xa63D5704...a405Cc909
0 POL0.0056893729.99999773
Cancel600318892024-07-31 15:16:1767 days ago1722438977IN
0xa63D5704...a405Cc909
0 POL0.0058445929.99999782
Buy600313772024-07-31 14:57:3767 days ago1722437857IN
0xa63D5704...a405Cc909
0 POL0.0118420129.99999937
Buy600312852024-07-31 14:54:2167 days ago1722437661IN
0xa63D5704...a405Cc909
0 POL0.0130625929.99999924
Sell600312372024-07-31 14:52:3967 days ago1722437559IN
0xa63D5704...a405Cc909
0 POL0.0158961829.9999996
Cancel600311872024-07-31 14:50:5367 days ago1722437453IN
0xa63D5704...a405Cc909
0 POL0.0056164129.99999982
Cancel600311692024-07-31 14:50:1567 days ago1722437415IN
0xa63D5704...a405Cc909
0 POL0.0053322229.99999971
Buy600310092024-07-31 14:44:3567 days ago1722437075IN
0xa63D5704...a405Cc909
0 POL0.0364873429.99999994
Buy600307552024-07-31 14:35:0367 days ago1722436503IN
0xa63D5704...a405Cc909
0 POL0.0247979329.99999977
Cancel600305392024-07-31 14:27:2367 days ago1722436043IN
0xa63D5704...a405Cc909
0 POL0.0052952130.00000001
Buy600302402024-07-31 14:16:4167 days ago1722435401IN
0xa63D5704...a405Cc909
0 POL0.0138252930.0000001
Cancel600301602024-07-31 14:13:2167 days ago1722435201IN
0xa63D5704...a405Cc909
0 POL0.0055043130.00000011
Cancel600301452024-07-31 14:12:4767 days ago1722435167IN
0xa63D5704...a405Cc909
0 POL0.0052346730.00000013
View all transactions

Latest 25 internal transactions (View All)

Parent Transaction Hash Block From To
600045292024-07-30 22:25:5968 days ago1722378359
0xa63D5704...a405Cc909
40.13526774 POL
599486492024-07-29 12:28:0769 days ago1722256087
0xa63D5704...a405Cc909
1.41185084 POL
599475502024-07-29 11:48:3969 days ago1722253719
0xa63D5704...a405Cc909
2.5125 POL
599297382024-07-29 0:51:0770 days ago1722214267
0xa63D5704...a405Cc909
0.34023408 POL
599037932024-07-28 8:59:4070 days ago1722157180
0xa63D5704...a405Cc909
5.4239901 POL
598943792024-07-28 3:00:3671 days ago1722135636
0xa63D5704...a405Cc909
18.5 POL
598922922024-07-28 1:43:3071 days ago1722131010
0xa63D5704...a405Cc909
12.65948285 POL
598599262024-07-27 5:26:3372 days ago1722057993
0xa63D5704...a405Cc909
5 POL
598597842024-07-27 5:20:5572 days ago1722057655
0xa63D5704...a405Cc909
10 POL
598597682024-07-27 5:20:2172 days ago1722057621
0xa63D5704...a405Cc909
10 POL
598596652024-07-27 5:16:4372 days ago1722057403
0xa63D5704...a405Cc909
10 POL
598596162024-07-27 5:14:5972 days ago1722057299
0xa63D5704...a405Cc909
10 POL
598595812024-07-27 5:13:3972 days ago1722057219
0xa63D5704...a405Cc909
10 POL
598268582024-07-26 9:41:0672 days ago1721986866
0xa63D5704...a405Cc909
370 POL
597567942024-07-24 15:55:4974 days ago1721836549
0xa63D5704...a405Cc909
4.231332 POL
597566892024-07-24 15:52:0774 days ago1721836327
0xa63D5704...a405Cc909
0.04589452 POL
597565682024-07-24 15:47:4974 days ago1721836069
0xa63D5704...a405Cc909
0.069907 POL
596941132024-07-23 2:32:4376 days ago1721701963
0xa63D5704...a405Cc909
40.73293367 POL
596868002024-07-22 22:12:4576 days ago1721686365
0xa63D5704...a405Cc909
2.25547658 POL
596772862024-07-22 16:31:0376 days ago1721665863
0xa63D5704...a405Cc909
34 POL
596751262024-07-22 15:14:2576 days ago1721661265
0xa63D5704...a405Cc909
29 POL
596737992024-07-22 14:27:2576 days ago1721658445
0xa63D5704...a405Cc909
66 POL
596737052024-07-22 14:24:0576 days ago1721658245
0xa63D5704...a405Cc909
10 POL
596614402024-07-22 6:55:0977 days ago1721631309
0xa63D5704...a405Cc909
10 POL
596613892024-07-22 6:52:4777 days ago1721631167
0xa63D5704...a405Cc909
65.99376953 POL
View All Internal Transactions
Loading...
Loading

Contract Source Code Verified (Exact Match)

Contract Name:
TDEX

Compiler Version
v0.8.17+commit.8df45f5f

Optimization Enabled:
Yes with 200 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity Multiple files format)

File 1 of 2: Tdex.sol
// SPDX-License-Identifier: GPL-3.0

pragma solidity >=0.8.0 <0.9.0;

import "./TokenConfig.sol";

abstract contract ERC20 {

    string private _name;
    string private _symbol;
    uint8 private _decimals;

    /**
     * @dev Returns the name of the token.
     */
    function name() public view virtual returns (string memory) {
        return _name;
    }

    /**
     * @dev Returns the symbol of the token, usually a shorter version of the
     * name.
     */
    function symbol() public view virtual returns (string memory) {
        return _symbol;
    }

    /**
     * @dev Returns the number of decimals used to get its user representation.
     * For example, if `decimals` equals `2`, a balance of `505` tokens should
     * be displayed to a user as `5,05` (`505 / 10 ** 2`).
     */
    function decimals() public view virtual returns (uint8) {
        return _decimals;
    }
}

interface IERC20 {
    /**
     * @dev Returns the amount of tokens in existence.
     */
    function totalSupply() external view returns (uint256);

    /**
     * @dev Returns the amount of tokens owned by `account`.
     */
    function balanceOf(address account) external view returns (uint256);

    /**
     * @dev Moves `amount` tokens from the caller's account to `recipient`.
     *
     * Returns a boolean value indicating whether the operation succeeded.
     *
     * Emits a {Transfer} event.
     */
    function transfer(address recipient, uint256 amount) external returns (bool);

    /**
     * @dev Returns the remaining number of tokens that `spender` will be
     * allowed to spend on behalf of `owner` through {transferFrom}. This is
     * zero by default.
     *
     * This value changes when {approve} or {transferFrom} are called.
     */
    function allowance(address owner, address spender) external view returns (uint256);

    /**
     * @dev Sets `amount` as the allowance of `spender` over the caller's tokens.
     *
     * Returns a boolean value indicating whether the operation succeeded.
     *
     * IMPORTANT: Beware that changing an allowance with this method brings the risk
     * that someone may use both the old and the new allowance by unfortunate
     * transaction ordering. One possible solution to mitigate this race
     * condition is to first reduce the spender's allowance to 0 and set the
     * desired value afterwards:
     * https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729
     *
     * Emits an {Approval} event.
     */
    function approve(address spender, uint256 amount) external returns (bool);

    /**
     * @dev Moves `amount` tokens from `sender` to `recipient` using the
     * allowance mechanism. `amount` is then deducted from the caller's
     * allowance.
     *
     * Returns a boolean value indicating whether the operation succeeded.
     *
     * Emits a {Transfer} event.
     */
    function transferFrom(
        address sender,
        address recipient,
        uint256 amount
    ) external returns (bool);

    /**
     * @dev Emitted when `value` tokens are moved from one account (`from`) to
     * another (`to`).
     *
     * Note that `value` may be zero.
     */
    event Transfer(address indexed from, address indexed to, uint256 value);

    /**
     * @dev Emitted when the allowance of a `spender` for an `owner` is set by
     * a call to {approve}. `value` is the new allowance.
     */
    event Approval(address indexed owner, address indexed spender, uint256 value);
}

library SafeMath {

    function add(uint256 a, uint256 b) internal pure returns (uint256) {
        uint256 c = a + b;
        require(c >= a, "SafeMath: addition overflow");

        return c;
    }

    function sub(uint256 a, uint256 b) internal pure returns (uint256) {
        return sub(a, b, "SafeMath: subtraction overflow");
    }

    function sub(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) {
        require(b <= a, errorMessage);
        uint256 c = a - b;

        return c;
    }

    function mul(uint256 a, uint256 b) internal pure returns (uint256) {
        // Gas optimization: this is cheaper than requiring 'a' not being zero, but the
        // benefit is lost if 'b' is also tested.
        // See: https://github.com/OpenZeppelin/openzeppelin-contracts/pull/522
        if (a == 0) {
            return 0;
        }

        uint256 c = a * b;
        require(c / a == b, "SafeMath: multiplication overflow");

        return c;
    }

    function div(uint256 a, uint256 b) internal pure returns (uint256) {
        return div(a, b, "SafeMath: division by zero");
    }

    function div(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) {
        require(b > 0, errorMessage);
        uint256 c = a / b;
        // assert(a == b * c + a % b); // There is no case in which this doesn't hold

        return c;
    }

    function mod(uint256 a, uint256 b) internal pure returns (uint256) {
        return mod(a, b, "SafeMath: modulo by zero");
    }

    function mod(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) {
        require(b != 0, errorMessage);
        return a % b;
    }

    function max(uint256 a, uint256 b) internal pure returns (uint256) {
        if (a >= b) return a;
        return b;
    }

    function min(uint256 a, uint256 b) internal pure returns (uint256) {
        require(a >=0 && b>=0, "SafeMath: Cannot have negative numbers");
        if (a <= b) return a;
        return b;
    }
}

library TransferHelper {
    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_FAILED');
    }

    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 {
        (bool success,) = to.call{value : value}(new bytes(0));
        require(success, 'TransferHelper: ETH_TRANSFER_FAILED');
    }
}

struct Dish {
    uint256 price;
    uint256 number;
}

enum OrderType { Buy, Sell }
enum OrderStatus { None, Waiting, Finished, Cancelled }

struct Order {
    uint256 orderId;
    uint256 price;
    uint256 tokenTotal;
    uint256 tokenSurplus;
    uint256 tokenFee;
    uint256 usdtSurplus;
    uint256 usdtFee;
    uint256 createnTime;
    uint256 endTime;
    OrderType orderType;
    OrderStatus status;
    address sender;
}

struct Match {
    uint256 matchId;
    uint256 buyOrderId;
    uint256 sellOrderId;
    uint256 price;
    uint256 tokenDeal;
    uint256 usdtDeal;
    uint256 tokenFee;
    uint256 usdtFee;
    uint256 time;
}

interface OrderInterface {

    function getOrder(address _tokenContract, uint256 _orderId) external view returns (Order memory);

    function getMatch(address _tokenContract, uint256 _matchId) external view returns (Match memory);

    function getPrice(address _tokenContract) external view returns (uint256 price);

    function getLastMatchId(address _tokenContract) external view returns (uint256 matchId);

    function getLastOrderId(address _tokenContract) external view returns (uint256 orderId);

    function getBuyOrderPriceListLength(address _tokenContract) external view returns (uint);

    function getBuyOrderPriceList(address _tokenContract, uint256 start, uint256 end) external view returns (uint256[] memory);

    function getBuyOrderPriceListPublished(address _tokenContract, uint count) external view returns (uint256[] memory);

    function getBuyOrderPriceOrderIdList(address _tokenContract, uint256 _price) external view returns (uint256[] memory);

    function getSellOrderPriceListLength(address _tokenContract) external view returns (uint);

    function getSellOrderPriceList(address _tokenContract, uint256 start, uint256 end) external view returns (uint256[] memory);

    function getSellOrderPriceListPublished(address _tokenContract, uint count) external view returns (uint256[] memory);

    function getBuyOrderPriceTokenNumber(address _tokenContract, uint256 _price) external view returns (uint256);

    function getSellOrderPriceTokenNumber(address _tokenContract, uint256 _price) external view returns (uint256);

    function getSellOrderPriceOrderIdList(address _tokenContract, uint256 _price) external view returns (uint256[] memory);

    function getOrderMatching(address _tokenContract, uint256 _orderId) external view returns (uint256[] memory);

    function getOrderUnmatchedListLength(address _tokenContract, address _sender) external view returns (uint);

    function getOrderFinishedListLength(address _tokenContract, address _sender) external view returns (uint);

    function getOrderUnmatchedList(address _tokenContract, address _sender, uint256 start, uint256 end) external view returns (uint256[] memory);

    function getOrderFinishedList(address _tokenContract, address _sender, uint256 start, uint256 end) external view returns (uint256[] memory);
}

interface DexInterface {

    function createOrder(address _tokenContract, address _sender, uint256 _price, uint256 _token, uint256 _usdt, uint8 _type) external returns (uint256);

    function removeOrder(address _tokenContract, uint256 _orderId, address _sender) external returns (bool);

    function orderManager() external view returns (address);

    function books() external view returns (address);
}

interface TokenInterface {

    function getToken(address _tokenContract) external view returns (Token memory token);

    function getTokenMapLength() external view returns (uint length);

    function getTokenAddressList(uint256 start, uint256 end) external view returns (address[] memory list);
}

interface __tdexDelegate {

    function __buy(address __tokenContract, address __sender) external;

    function __sell(address __tokenContract, address __sender) external;
}

/**
 * @title Storage
 * @dev Store & retrieve value in a variable
 */
contract TDEX {

    address private _owner;

    address private _dexInterface = address(0);

    address private _tokenManager = address(0);

    address private _delegate = address(0);

    Token private USDT;

    Token private ETH;

    event CreateOrder(address indexed tokenContract, uint256 indexed orderId, address sender, OrderType ordertType, uint256 price, uint256 value);

    event CancelOrder(address indexed tokenContract, uint256 indexed orderId, address sender);

    constructor () {
        _owner = msg.sender;
        USDT = T.USDT();
        ETH = T.ETH();
    }

    modifier onlyOwner() {
        require(_owner == msg.sender, "Ownable: caller is not the owner");
        _;
    }

    function init(address __dexInterface) external onlyOwner
    {
        require(_dexInterface == address(0), "Can only be assigned once");
        _dexInterface = __dexInterface;
    }

    function setTokenManager(address ___tokenManager) external onlyOwner
    {
        _tokenManager = ___tokenManager;
    }

    function setDelegate(address __delegate) external onlyOwner
    {
        _delegate = __delegate;
    }

    function getToken(address _tokenContract) external view returns (
        address tokenContract,
        string memory symbol,
        string memory name,
        uint decimals)
    {
        Token memory token = TokenInterface(_tokenManager).getToken(_tokenContract);

        tokenContract = token.tokenContract;
        symbol = token.symbol;
        name = token.name;
        decimals = token.decimals;
    }

    function getTokenAddressListLength() external view returns (uint length)
    {
        return TokenInterface(_tokenManager).getTokenMapLength();
    }

    function getTokenAddressList(uint256 start, uint256 end) external view returns (address[] memory list)
    {
        return TokenInterface(_tokenManager).getTokenAddressList(start, end);
    }

    /**********************************************************/

    function _buy(address _tokenContract, uint256 _price, uint256 _token_amount, address _sender) internal returns (uint256)
    {
        if (_delegate != address(0)) __tdexDelegate(_delegate).__buy(_tokenContract, _sender);

        require(_token_amount > 0, "The quantity cannot be 0");

        Token memory token = TokenInterface(_tokenManager).getToken(_tokenContract);
        require(token.decimals > 0, "This contract address is not supported");
        require(_price > 0, "No, no price");

        uint256 _usdt_amount = SafeMath.div(SafeMath.mul(_token_amount, _price), PDEC);

        require(_usdt_amount <= 100000 * 10 ** USDT.decimals, "Maximum single transaction amount 100000 USDT");

        TransferHelper.safeTransferFrom(USDT.tokenContract, _sender, _dexInterface, _usdt_amount);

        uint256 orderId = DexInterface(_dexInterface).createOrder(_tokenContract, _sender, _price, _token_amount, _usdt_amount, 0);

        emit CreateOrder(_tokenContract, orderId, _sender, OrderType.Buy, _price, _token_amount);

        return orderId;
    }

    function Buy(address _tokenContract, uint256 _price, uint256 _token_amount) external returns (uint256 orderId)
    {
        require(_tokenContract != ETH.tokenContract, "Does not support ETH");
        return _buy(_tokenContract, _price, _token_amount, msg.sender);
    }

    function BuyETH(uint256 _price, uint256 _token_amount) external returns (uint256 orderId)
    {
        return _buy(ETH.tokenContract, _price, _token_amount, msg.sender);
    }

    function _sell(address _tokenContract, uint256 _price, uint256 _token_amount, address _sender) internal returns (uint256)
    {
        if (_delegate != address(0)) __tdexDelegate(_delegate).__sell(_tokenContract, _sender);

        require(_token_amount > 0, "The quantity cannot be 0");

        Token memory token = TokenInterface(_tokenManager).getToken(_tokenContract);
        require(token.decimals > 0, "This contract address is not supported");
        require(_price > 0, "No, no price");

        uint256 _usdt_amount = SafeMath.div(SafeMath.mul(_token_amount, _price), PDEC);
        require(_usdt_amount <= 100000 * 10 ** USDT.decimals, "Maximum single transaction amount 100000 USDT");

        if (_tokenContract == ETH.tokenContract)
        {
            TransferHelper.safeTransferETH(_dexInterface, _token_amount);
        }
        else
        {
            TransferHelper.safeTransferFrom(_tokenContract, _sender, _dexInterface, _token_amount);
        }

        uint256 orderId = DexInterface(_dexInterface).createOrder(_tokenContract, _sender, _price, _token_amount, _usdt_amount, 1);

        emit CreateOrder(_tokenContract, orderId, _sender, OrderType.Sell, _price, _token_amount);

        return orderId;
    }

    function Sell(address _tokenContract, uint256 _price, uint256 _token_amount) external returns (uint256 orderId)
    {
        require(_tokenContract != ETH.tokenContract, "Does not support ETH");
        return _sell(_tokenContract, _price, _token_amount, msg.sender);
    }

    function SellETH(uint256 _price) external payable returns (uint256 orderId)
    {
        return _sell(ETH.tokenContract, _price, msg.value, msg.sender);
    }

    function Cancel(address _tokenContract, uint256 _orderId) external returns (bool)
    {
        Token memory token = TokenInterface(_tokenManager).getToken(_tokenContract);
        require(token.decimals > 0, "This contract address is not supported");

        bool result = DexInterface(_dexInterface).removeOrder(_tokenContract, _orderId, msg.sender);

        emit CancelOrder(_tokenContract, _orderId, msg.sender);

        return result;
    }

    function CancelRoot(address _tokenContract, uint256 _orderId, address _sender) external onlyOwner returns (bool)
    {
        Token memory token = TokenInterface(_tokenManager).getToken(_tokenContract);
        require(token.decimals > 0, "This contract address is not supported");

        bool result = DexInterface(_dexInterface).removeOrder(_tokenContract, _orderId, _sender);

        emit CancelOrder(_tokenContract, _orderId, _sender);

        return result;
    }

    /**********************************************************/

    function balanceOf(address _tokenContract, address _sender) external view returns (uint256)
    {
        uint256 balance;
        if (_tokenContract == ETH.tokenContract)
        {
            balance = _sender.balance;
        }
        else
        {
            balance = IERC20(_tokenContract).balanceOf(_sender);
        }
        return balance;
    }

    function getOrderManager() internal view returns (OrderInterface)
    {
        return OrderInterface(DexInterface(_dexInterface).orderManager());
    }

    function getPrice(address _tokenContract) external view returns (uint256 price)
    {
        return getOrderManager().getPrice(_tokenContract);
    }

    function getLastMatchId(address _tokenContract) external view returns (uint256 matchId)
    {
        return getOrderManager().getLastMatchId(_tokenContract);
    }

    function getLastOrderId(address _tokenContract) external view returns (uint256 orderId)
    {
        return getOrderManager().getLastOrderId(_tokenContract);
    }

    function getOrder(address _tokenContract, uint256 _orderId) external view returns (
        uint256 price,
        uint256 tokenTotal,
        uint256 tokenSurplus,
        uint256 tokenFee,
        uint256 usdtSurplus,
        uint256 usdtFee,
        uint256 createnTime,
        uint256 endTime,
        uint8 orderType,
        uint8 status,
        address sender
    )
    {
        Order memory order = getOrderManager().getOrder(_tokenContract, _orderId);
        price = order.price;
        tokenTotal = order.tokenTotal;
        tokenSurplus = order.tokenSurplus;
        tokenFee = order.tokenFee;
        usdtSurplus = order.usdtSurplus;
        usdtFee = order.usdtFee;
        createnTime = order.createnTime;
        endTime = order.endTime;
        orderType = uint8(order.orderType);
        status = uint8(order.status);
        sender = order.sender;
    }

    function getMatch(address _tokenContract, uint256 _matchId) external view returns (
        uint256 matchId,
        uint256 buyOrderId,
        uint256 sellOrderId,
        uint256 price,
        uint256 tokenDeal,
        uint256 usdtDeal,
        uint256 tokenFee,
        uint256 usdtFee,
        uint256 time
    )
    {
        Match memory _match = getOrderManager().getMatch(_tokenContract, _matchId);

        matchId = _match.matchId;
        buyOrderId = _match.buyOrderId;
        sellOrderId = _match.sellOrderId;
        price = _match.price;
        tokenDeal = _match.tokenDeal;
        usdtDeal = _match.usdtDeal;
        tokenFee = _match.tokenFee;
        usdtFee = _match.usdtFee;
        time = _match.time;
    }

    function getBuyOrderPriceListLength(address _tokenContract) external view returns (uint length)
    {
        return getOrderManager().getBuyOrderPriceListLength(_tokenContract);
    }

    function getBuyOrderPriceList(address _tokenContract, uint256 start, uint256 end) external view returns (uint256[] memory list)
    {
        return getOrderManager().getBuyOrderPriceList(_tokenContract, start, end);
    }

    function getBuyOrderPriceTokenNumber(address _tokenContract, uint256 _price) external view returns (uint256 number)
    {
        return getOrderManager().getBuyOrderPriceTokenNumber(_tokenContract, _price);
    }

    function getBuyOrderPriceListPublished(address _tokenContract, uint count) external view returns (uint256[] memory list)
    {
        return getOrderManager().getBuyOrderPriceListPublished(_tokenContract, count);
    }

    function getBuyOrderPublished(address _tokenContract, uint count) external view returns (Dish[] memory list)
    {
        OrderInterface orderManager = getOrderManager();
        uint256[] memory priceList = orderManager.getBuyOrderPriceListPublished(_tokenContract, count);
        list = new Dish[](count);
        for (uint i=0; i<count; i++)
        {
            uint256 price = priceList[i];
            uint256 number = orderManager.getBuyOrderPriceTokenNumber(_tokenContract, price);
            list[i] = Dish(price, number);
        }
    }

    function getBuyOrderPriceOrderIdList(address _tokenContract, uint256 _price) external view returns (uint256[] memory list)
    {
        return getOrderManager().getBuyOrderPriceOrderIdList(_tokenContract, _price);
    }

    function getSellOrderPriceListLength(address _tokenContract) external view returns (uint length)
    {
        return getOrderManager().getSellOrderPriceListLength(_tokenContract);
    }

    function getSellOrderPriceList(address _tokenContract, uint256 start, uint256 end) external view returns (uint256[] memory list)
    {
        return getOrderManager().getSellOrderPriceList(_tokenContract, start, end);
    }

    function getSellOrderPriceTokenNumber(address _tokenContract, uint256 _price) external view returns (uint256 number)
    {
        return getOrderManager().getSellOrderPriceTokenNumber(_tokenContract, _price);
    }

    function getSellOrderPriceListPublished(address _tokenContract, uint count) external view returns (uint256[] memory list)
    {
        return getOrderManager().getSellOrderPriceListPublished(_tokenContract, count);
    }

    function getSellOrderPublished(address _tokenContract, uint count) external view returns (Dish[] memory list)
    {
        OrderInterface orderManager = getOrderManager();
        uint256[] memory priceList = orderManager.getSellOrderPriceListPublished(_tokenContract, count);
        list = new Dish[](count);
        for (uint i=0; i<count; i++)
        {
            uint256 price = priceList[i];
            uint256 number = orderManager.getSellOrderPriceTokenNumber(_tokenContract, price);
            list[i] = Dish(price, number);
        }
    }

    function getSellOrderPriceOrderIdList(address _tokenContract, uint256 _price) external view returns (uint256[] memory list)
    {
        return getOrderManager().getSellOrderPriceOrderIdList(_tokenContract, _price);
    }

    function getOrderMatching(address _tokenContract, uint256 _orderId) external view returns (uint256[] memory matchingList)
    {
        return getOrderManager().getOrderMatching(_tokenContract, _orderId);
    }

    function getOrderUnmatchedListLength(address _tokenContract, address _sender) external view returns (uint length)
    {
        return getOrderManager().getOrderUnmatchedListLength(_tokenContract, _sender);
    }

    function getOrderFinishedListLength(address _tokenContract, address _sender) external view returns (uint length)
    {
        return getOrderManager().getOrderFinishedListLength(_tokenContract, _sender);
    }

    function getOrderUnmatchedList(address _tokenContract, address _sender, uint256 start, uint256 end) external view returns (uint256[] memory list)
    {
        return getOrderManager().getOrderUnmatchedList(_tokenContract, _sender, start, end);
    }

    function getOrderFinishedList(address _tokenContract, address _sender, uint256 start, uint256 end) external view returns (uint256[] memory list)
    {
        return getOrderManager().getOrderFinishedList(_tokenContract, _sender, start, end);
    }
}

File 2 of 2: TokenConfig.sol
// SPDX-License-Identifier: GPL-3.0

pragma solidity >=0.8.0 <0.9.0;

uint256 constant PDEC = 1e30;

struct Token {
    address tokenContract;
    string symbol;
    string name;
    uint decimals;
}

library T {

    function USDT() internal pure returns (Token memory)
    {
        return Token({
            symbol: "USDT",
            name: "Tether USD",
            tokenContract: 0xc2132D05D31c914a87C6611C10748AEb04B58e8F,
            decimals: 6
        });
    }

    function ETH() internal pure returns (Token memory)
    {
        return Token({
            symbol: "MATIC",
            name: "Matic Token",
            tokenContract: 0xEeeeeEeeeEeEeeEeEeEeeEEEeeeeEeeeeeeeEEeE,
            decimals: 18
        });
    }
}

Contract Security Audit

Contract ABI

[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"tokenContract","type":"address"},{"indexed":true,"internalType":"uint256","name":"orderId","type":"uint256"},{"indexed":false,"internalType":"address","name":"sender","type":"address"}],"name":"CancelOrder","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"tokenContract","type":"address"},{"indexed":true,"internalType":"uint256","name":"orderId","type":"uint256"},{"indexed":false,"internalType":"address","name":"sender","type":"address"},{"indexed":false,"internalType":"enum OrderType","name":"ordertType","type":"uint8"},{"indexed":false,"internalType":"uint256","name":"price","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"CreateOrder","type":"event"},{"inputs":[{"internalType":"address","name":"_tokenContract","type":"address"},{"internalType":"uint256","name":"_price","type":"uint256"},{"internalType":"uint256","name":"_token_amount","type":"uint256"}],"name":"Buy","outputs":[{"internalType":"uint256","name":"orderId","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_price","type":"uint256"},{"internalType":"uint256","name":"_token_amount","type":"uint256"}],"name":"BuyETH","outputs":[{"internalType":"uint256","name":"orderId","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_tokenContract","type":"address"},{"internalType":"uint256","name":"_orderId","type":"uint256"}],"name":"Cancel","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_tokenContract","type":"address"},{"internalType":"uint256","name":"_orderId","type":"uint256"},{"internalType":"address","name":"_sender","type":"address"}],"name":"CancelRoot","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_tokenContract","type":"address"},{"internalType":"uint256","name":"_price","type":"uint256"},{"internalType":"uint256","name":"_token_amount","type":"uint256"}],"name":"Sell","outputs":[{"internalType":"uint256","name":"orderId","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_price","type":"uint256"}],"name":"SellETH","outputs":[{"internalType":"uint256","name":"orderId","type":"uint256"}],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"_tokenContract","type":"address"},{"internalType":"address","name":"_sender","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_tokenContract","type":"address"},{"internalType":"uint256","name":"start","type":"uint256"},{"internalType":"uint256","name":"end","type":"uint256"}],"name":"getBuyOrderPriceList","outputs":[{"internalType":"uint256[]","name":"list","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_tokenContract","type":"address"}],"name":"getBuyOrderPriceListLength","outputs":[{"internalType":"uint256","name":"length","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_tokenContract","type":"address"},{"internalType":"uint256","name":"count","type":"uint256"}],"name":"getBuyOrderPriceListPublished","outputs":[{"internalType":"uint256[]","name":"list","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_tokenContract","type":"address"},{"internalType":"uint256","name":"_price","type":"uint256"}],"name":"getBuyOrderPriceOrderIdList","outputs":[{"internalType":"uint256[]","name":"list","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_tokenContract","type":"address"},{"internalType":"uint256","name":"_price","type":"uint256"}],"name":"getBuyOrderPriceTokenNumber","outputs":[{"internalType":"uint256","name":"number","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_tokenContract","type":"address"},{"internalType":"uint256","name":"count","type":"uint256"}],"name":"getBuyOrderPublished","outputs":[{"components":[{"internalType":"uint256","name":"price","type":"uint256"},{"internalType":"uint256","name":"number","type":"uint256"}],"internalType":"struct Dish[]","name":"list","type":"tuple[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_tokenContract","type":"address"}],"name":"getLastMatchId","outputs":[{"internalType":"uint256","name":"matchId","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_tokenContract","type":"address"}],"name":"getLastOrderId","outputs":[{"internalType":"uint256","name":"orderId","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_tokenContract","type":"address"},{"internalType":"uint256","name":"_matchId","type":"uint256"}],"name":"getMatch","outputs":[{"internalType":"uint256","name":"matchId","type":"uint256"},{"internalType":"uint256","name":"buyOrderId","type":"uint256"},{"internalType":"uint256","name":"sellOrderId","type":"uint256"},{"internalType":"uint256","name":"price","type":"uint256"},{"internalType":"uint256","name":"tokenDeal","type":"uint256"},{"internalType":"uint256","name":"usdtDeal","type":"uint256"},{"internalType":"uint256","name":"tokenFee","type":"uint256"},{"internalType":"uint256","name":"usdtFee","type":"uint256"},{"internalType":"uint256","name":"time","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_tokenContract","type":"address"},{"internalType":"uint256","name":"_orderId","type":"uint256"}],"name":"getOrder","outputs":[{"internalType":"uint256","name":"price","type":"uint256"},{"internalType":"uint256","name":"tokenTotal","type":"uint256"},{"internalType":"uint256","name":"tokenSurplus","type":"uint256"},{"internalType":"uint256","name":"tokenFee","type":"uint256"},{"internalType":"uint256","name":"usdtSurplus","type":"uint256"},{"internalType":"uint256","name":"usdtFee","type":"uint256"},{"internalType":"uint256","name":"createnTime","type":"uint256"},{"internalType":"uint256","name":"endTime","type":"uint256"},{"internalType":"uint8","name":"orderType","type":"uint8"},{"internalType":"uint8","name":"status","type":"uint8"},{"internalType":"address","name":"sender","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_tokenContract","type":"address"},{"internalType":"address","name":"_sender","type":"address"},{"internalType":"uint256","name":"start","type":"uint256"},{"internalType":"uint256","name":"end","type":"uint256"}],"name":"getOrderFinishedList","outputs":[{"internalType":"uint256[]","name":"list","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_tokenContract","type":"address"},{"internalType":"address","name":"_sender","type":"address"}],"name":"getOrderFinishedListLength","outputs":[{"internalType":"uint256","name":"length","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_tokenContract","type":"address"},{"internalType":"uint256","name":"_orderId","type":"uint256"}],"name":"getOrderMatching","outputs":[{"internalType":"uint256[]","name":"matchingList","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_tokenContract","type":"address"},{"internalType":"address","name":"_sender","type":"address"},{"internalType":"uint256","name":"start","type":"uint256"},{"internalType":"uint256","name":"end","type":"uint256"}],"name":"getOrderUnmatchedList","outputs":[{"internalType":"uint256[]","name":"list","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_tokenContract","type":"address"},{"internalType":"address","name":"_sender","type":"address"}],"name":"getOrderUnmatchedListLength","outputs":[{"internalType":"uint256","name":"length","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_tokenContract","type":"address"}],"name":"getPrice","outputs":[{"internalType":"uint256","name":"price","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_tokenContract","type":"address"},{"internalType":"uint256","name":"start","type":"uint256"},{"internalType":"uint256","name":"end","type":"uint256"}],"name":"getSellOrderPriceList","outputs":[{"internalType":"uint256[]","name":"list","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_tokenContract","type":"address"}],"name":"getSellOrderPriceListLength","outputs":[{"internalType":"uint256","name":"length","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_tokenContract","type":"address"},{"internalType":"uint256","name":"count","type":"uint256"}],"name":"getSellOrderPriceListPublished","outputs":[{"internalType":"uint256[]","name":"list","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_tokenContract","type":"address"},{"internalType":"uint256","name":"_price","type":"uint256"}],"name":"getSellOrderPriceOrderIdList","outputs":[{"internalType":"uint256[]","name":"list","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_tokenContract","type":"address"},{"internalType":"uint256","name":"_price","type":"uint256"}],"name":"getSellOrderPriceTokenNumber","outputs":[{"internalType":"uint256","name":"number","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_tokenContract","type":"address"},{"internalType":"uint256","name":"count","type":"uint256"}],"name":"getSellOrderPublished","outputs":[{"components":[{"internalType":"uint256","name":"price","type":"uint256"},{"internalType":"uint256","name":"number","type":"uint256"}],"internalType":"struct Dish[]","name":"list","type":"tuple[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_tokenContract","type":"address"}],"name":"getToken","outputs":[{"internalType":"address","name":"tokenContract","type":"address"},{"internalType":"string","name":"symbol","type":"string"},{"internalType":"string","name":"name","type":"string"},{"internalType":"uint256","name":"decimals","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"start","type":"uint256"},{"internalType":"uint256","name":"end","type":"uint256"}],"name":"getTokenAddressList","outputs":[{"internalType":"address[]","name":"list","type":"address[]"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getTokenAddressListLength","outputs":[{"internalType":"uint256","name":"length","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"__dexInterface","type":"address"}],"name":"init","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"__delegate","type":"address"}],"name":"setDelegate","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"___tokenManager","type":"address"}],"name":"setTokenManager","outputs":[],"stateMutability":"nonpayable","type":"function"}]

6080604052600180546001600160a01b031990811690915560028054821690556003805490911690553480156200003557600080fd5b5060008054336001600160a01b0319909116179055620000606200012f602090811b620019e917901c565b8051600480546001600160a01b0319166001600160a01b03909216919091178155602082015160059062000095908262000344565b5060408201516002820190620000ac908262000344565b5060608201518160030155905050620000cf620001e660201b62001a9f1760201c565b8051600880546001600160a01b0319166001600160a01b03909216919091178155602082015160099062000104908262000344565b50604082015160028201906200011b908262000344565b506060820151816003015590505062000410565b62000164604051806080016040528060006001600160a01b031681526020016060815260200160608152602001600081525090565b604051806080016040528073c2132d05d31c914a87c6611c10748aeb04b58e8f6001600160a01b03168152602001604051806040016040528060048152602001631554d11560e21b81525081526020016040518060400160405280600a81526020016915195d1a195c881554d160b21b81525081526020016006815250905090565b6200021b604051806080016040528060006001600160a01b031681526020016060815260200160608152602001600081525090565b604051806080016040528073eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee6001600160a01b03168152602001604051806040016040528060058152602001644d4154494360d81b81525081526020016040518060400160405280600b81526020016a26b0ba34b1902a37b5b2b760a91b81525081526020016012815250905090565b634e487b7160e01b600052604160045260246000fd5b600181811c90821680620002ca57607f821691505b602082108103620002eb57634e487b7160e01b600052602260045260246000fd5b50919050565b601f8211156200033f57600081815260208120601f850160051c810160208610156200031a5750805b601f850160051c820191505b818110156200033b5782815560010162000326565b5050505b505050565b81516001600160401b038111156200036057620003606200029f565b6200037881620003718454620002b5565b84620002f1565b602080601f831160018114620003b05760008415620003975750858301515b600019600386901b1c1916600185901b1785556200033b565b600085815260208120601f198616915b82811015620003e157888601518255948401946001909101908401620003c0565b5085821015620004005787850151600019600388901b60f8161c191681555b5050505050600190811b01905550565b612fac80620004206000396000f3fe6080604052600436106102045760003560e01c80637017689611610118578063d4de8ad2116100a0578063edb258411161006f578063edb2584114610660578063f248d4bb146106e2578063f3da8edf14610702578063f7888aec14610722578063f79fde671461074257600080fd5b8063d4de8ad2146105e0578063e3dddfc814610600578063e501d5f414610620578063ed7a144f1461064057600080fd5b80639fd95a42116100e75780639fd95a4214610540578063b424bd8314610560578063bdda1d1a14610580578063c27b6f29146105a0578063ca5eb5e1146105c057600080fd5b806370176896146104cd5780637cb2b79c146104e057806394f27d081461050057806395265e6c1461052057600080fd5b806327f83af91161019b57806350ab38711161016a57806350ab3871146103d9578063594251341461043d578063597704381461045d5780635d4e94071461048d5780635f8e651e146104ad57600080fd5b806327f83af91461035957806341976e091461037957806347c3b77d146103995780634f9f21f9146103b957600080fd5b8063161b71fa116101d7578063161b71fa146102bd57806319ab453c146102ea5780631cbc5ab11461030c5780631f69ae121461032c57600080fd5b80630479569f1461020957806305a7b0411461023f578063083c63511461026d5780630afbe8731461028d575b600080fd5b34801561021557600080fd5b506102296102243660046124b6565b610757565b60405161023691906124e2565b60405180910390f35b34801561024b57600080fd5b5061025f61025a366004612531565b610929565b604051908152602001610236565b34801561027957600080fd5b5061025f610288366004612531565b6109a6565b34801561029957600080fd5b506102ad6102a836600461254e565b6109e0565b6040519015158152602001610236565b3480156102c957600080fd5b506102dd6102d83660046124b6565b610b7b565b6040516102369190612590565b3480156102f657600080fd5b5061030a610305366004612531565b610bfe565b005b34801561031857600080fd5b5061025f6103273660046125d4565b610ca3565b34801561033857600080fd5b5061034c610347366004612609565b610d0f565b604051610236919061262b565b34801561036557600080fd5b506102ad6103743660046124b6565b610d88565b34801561038557600080fd5b5061025f610394366004612531565b610eed565b3480156103a557600080fd5b506102dd6103b43660046125d4565b610f27565b3480156103c557600080fd5b506102dd6103d43660046125d4565b610fb0565b3480156103e557600080fd5b506103f96103f43660046124b6565b610ff8565b60408051998a5260208a0198909852968801959095526060870193909352608086019190915260a085015260c084015260e083015261010082015261012001610236565b34801561044957600080fd5b5061025f610458366004612531565b6110ce565b34801561046957600080fd5b5061047d610478366004612531565b611108565b60405161023694939291906126bc565b34801561049957600080fd5b506102296104a83660046124b6565b6111a7565b3480156104b957600080fd5b5061025f6104c8366004612704565b611370565b61025f6104db36600461273d565b6113ef565b3480156104ec57600080fd5b5061030a6104fb366004612531565b61140a565b34801561050c57600080fd5b506102dd61051b3660046124b6565b611456565b34801561052c57600080fd5b5061025f61053b3660046124b6565b61148d565b34801561054c57600080fd5b506102dd61055b3660046124b6565b6114c4565b34801561056c57600080fd5b5061025f61057b366004612531565b6114fb565b34801561058c57600080fd5b506102dd61059b3660046124b6565b611535565b3480156105ac57600080fd5b5061025f6105bb366004612704565b61156c565b3480156105cc57600080fd5b5061030a6105db366004612531565b6115ae565b3480156105ec57600080fd5b506102dd6105fb3660046124b6565b6115fa565b34801561060c57600080fd5b506102dd61061b366004612756565b611631565b34801561062c57600080fd5b5061025f61063b3660046124b6565b6116cb565b34801561064c57600080fd5b5061025f61065b3660046125d4565b611702565b34801561066c57600080fd5b5061068061067b3660046124b6565b611766565b604080519b8c5260208c019a909a52988a01979097526060890195909552608088019390935260a087019190915260c086015260e085015260ff908116610100850152166101208301526001600160a01b031661014082015261016001610236565b3480156106ee57600080fd5b506102dd6106fd366004612756565b611875565b34801561070e57600080fd5b5061025f61071d366004612609565b6118c5565b34801561072e57600080fd5b5061025f61073d366004612704565b6118e0565b34801561074e57600080fd5b5061025f611976565b60606000610763611b57565b90506000816001600160a01b0316639fd95a4286866040518363ffffffff1660e01b815260040161079592919061279c565b600060405180830381865afa1580156107b2573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526107da9190810190612891565b90508367ffffffffffffffff8111156107f5576107f56127b5565b60405190808252806020026020018201604052801561083a57816020015b60408051808201909152600080825260208201528152602001906001900390816108135790505b50925060005b8481101561092057600082828151811061085c5761085c612927565b602002602001015190506000846001600160a01b031663e501d5f489846040518363ffffffff1660e01b815260040161089692919061279c565b602060405180830381865afa1580156108b3573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906108d7919061293d565b905060405180604001604052808381526020018281525086848151811061090057610900612927565b6020026020010181905250505080806109189061296c565b915050610840565b50505092915050565b6000610933611b57565b6040516305a7b04160e01b81526001600160a01b03848116600483015291909116906305a7b041906024015b602060405180830381865afa15801561097c573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906109a0919061293d565b92915050565b60006109b0611b57565b60405163083c635160e01b81526001600160a01b038481166004830152919091169063083c63519060240161095f565b600080546001600160a01b03163314610a145760405162461bcd60e51b8152600401610a0b90612985565b60405180910390fd5b600254604051630b2ee08760e31b81526001600160a01b0386811660048301526000921690635977043890602401600060405180830381865afa158015610a5f573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052610a879190810190612a2e565b90506000816060015111610aad5760405162461bcd60e51b8152600401610a0b90612adf565b600154604051630e9cacff60e21b81526001600160a01b0387811660048301526024820187905285811660448301526000921690633a72b3fc906064016020604051808303816000875af1158015610b09573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610b2d9190612b25565b6040516001600160a01b03868116825291925086918816907f815e548fe24679a5c17a12d6857eba6a816b25878050abfcb7b0e88f07d6418b9060200160405180910390a395945050505050565b6060610b85611b57565b6001600160a01b031663161b71fa84846040518363ffffffff1660e01b8152600401610bb292919061279c565b600060405180830381865afa158015610bcf573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052610bf79190810190612891565b9392505050565b6000546001600160a01b03163314610c285760405162461bcd60e51b8152600401610a0b90612985565b6001546001600160a01b031615610c815760405162461bcd60e51b815260206004820152601960248201527f43616e206f6e6c792062652061737369676e6564206f6e6365000000000000006044820152606401610a0b565b600180546001600160a01b0319166001600160a01b0392909216919091179055565b6008546000906001600160a01b0390811690851603610cfb5760405162461bcd60e51b8152602060048201526014602482015273088decae640dcdee840e6eae0e0dee4e8408aa8960631b6044820152606401610a0b565b610d0784848433611bc5565b949350505050565b600254604051630fb4d70960e11b815260048101849052602481018390526060916001600160a01b031690631f69ae1290604401600060405180830381865afa158015610d60573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052610bf79190810190612b47565b600254604051630b2ee08760e31b81526001600160a01b0384811660048301526000928392911690635977043890602401600060405180830381865afa158015610dd6573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052610dfe9190810190612a2e565b90506000816060015111610e245760405162461bcd60e51b8152600401610a0b90612adf565b600154604051630e9cacff60e21b81526001600160a01b038681166004830152602482018690523360448301526000921690633a72b3fc906064016020604051808303816000875af1158015610e7e573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610ea29190612b25565b60405133815290915084906001600160a01b038716907f815e548fe24679a5c17a12d6857eba6a816b25878050abfcb7b0e88f07d6418b9060200160405180910390a3949350505050565b6000610ef7611b57565b6040516341976e0960e01b81526001600160a01b03848116600483015291909116906341976e099060240161095f565b6060610f31611b57565b6040516347c3b77d60e01b81526001600160a01b038681166004830152602482018690526044820185905291909116906347c3b77d906064015b600060405180830381865afa158015610f88573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052610d079190810190612891565b6060610fba611b57565b604051634f9f21f960e01b81526001600160a01b03868116600483015260248201869052604482018590529190911690634f9f21f990606401610f6b565b60008060008060008060008060008061100f611b57565b6001600160a01b03166350ab38718d8d6040518363ffffffff1660e01b815260040161103c92919061279c565b61012060405180830381865afa15801561105a573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061107e9190612bd6565b905080600001519950806020015198508060400151975080606001519650806080015195508060a0015194508060c0015193508060e0015192508061010001519150509295985092959850929598565b60006110d8611b57565b604051631650944d60e21b81526001600160a01b038481166004830152919091169063594251349060240161095f565b600254604051630b2ee08760e31b81526001600160a01b038381166004830152600092606092839285928392911690635977043890602401600060405180830381865afa15801561115d573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526111859190810190612a2e565b8051602082015160408301516060909301519199909850919650945092505050565b606060006111b3611b57565b90506000816001600160a01b031663d4de8ad286866040518363ffffffff1660e01b81526004016111e592919061279c565b600060405180830381865afa158015611202573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f1916820160405261122a9190810190612891565b90508367ffffffffffffffff811115611245576112456127b5565b60405190808252806020026020018201604052801561128a57816020015b60408051808201909152600080825260208201528152602001906001900390816112635790505b50925060005b848110156109205760008282815181106112ac576112ac612927565b602002602001015190506000846001600160a01b03166395265e6c89846040518363ffffffff1660e01b81526004016112e692919061279c565b602060405180830381865afa158015611303573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611327919061293d565b905060405180604001604052808381526020018281525086848151811061135057611350612927565b6020026020010181905250505080806113689061296c565b915050611290565b600061137a611b57565b604051632fc7328f60e11b81526001600160a01b03858116600483015284811660248301529190911690635f8e651e906044015b602060405180830381865afa1580156113cb573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610bf7919061293d565b6008546000906109a0906001600160a01b0316833433611eb6565b6000546001600160a01b031633146114345760405162461bcd60e51b8152600401610a0b90612985565b600280546001600160a01b0319166001600160a01b0392909216919091179055565b6060611460611b57565b6001600160a01b03166394f27d0884846040518363ffffffff1660e01b8152600401610bb292919061279c565b6000611497611b57565b6001600160a01b03166395265e6c84846040518363ffffffff1660e01b81526004016113ae92919061279c565b60606114ce611b57565b6001600160a01b0316639fd95a4284846040518363ffffffff1660e01b8152600401610bb292919061279c565b6000611505611b57565b60405163b424bd8360e01b81526001600160a01b038481166004830152919091169063b424bd839060240161095f565b606061153f611b57565b6001600160a01b031663bdda1d1a84846040518363ffffffff1660e01b8152600401610bb292919061279c565b6000611576611b57565b60405163c27b6f2960e01b81526001600160a01b0385811660048301528481166024830152919091169063c27b6f29906044016113ae565b6000546001600160a01b031633146115d85760405162461bcd60e51b8152600401610a0b90612985565b600380546001600160a01b0319166001600160a01b0392909216919091179055565b6060611604611b57565b6001600160a01b031663d4de8ad284846040518363ffffffff1660e01b8152600401610bb292919061279c565b606061163b611b57565b604051631c7bbbf960e31b81526001600160a01b03878116600483015286811660248301526044820186905260648201859052919091169063e3dddfc8906084015b600060405180830381865afa15801561169a573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526116c29190810190612891565b95945050505050565b60006116d5611b57565b6001600160a01b031663e501d5f484846040518363ffffffff1660e01b81526004016113ae92919061279c565b6008546000906001600160a01b039081169085160361175a5760405162461bcd60e51b8152602060048201526014602482015273088decae640dcdee840e6eae0e0dee4e8408aa8960631b6044820152606401610a0b565b610d0784848433611eb6565b600080600080600080600080600080600080611780611b57565b6001600160a01b031663edb258418f8f6040518363ffffffff1660e01b81526004016117ad92919061279c565b61018060405180830381865afa1580156117cb573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906117ef9190612c6f565b905080602001519b5080604001519a5080606001519950806080015198508060a0015197508060c0015196508060e0015195508061010001519450806101200151600181111561184157611841612d1d565b9350806101400151600381111561185a5761185a612d1d565b92508061016001519150509295989b509295989b9093969950565b606061187f611b57565b60405163f248d4bb60e01b81526001600160a01b03878116600483015286811660248301526044820186905260648201859052919091169063f248d4bb9060840161167d565b600854600090610bf7906001600160a01b0316848433611bc5565b60085460009081906001600160a01b039081169085160361190c57506001600160a01b03821631610bf7565b6040516370a0823160e01b81526001600160a01b0384811660048301528516906370a0823190602401602060405180830381865afa158015611952573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610d07919061293d565b600254604080516303c381ad60e61b815290516000926001600160a01b03169163f0e06b409160048083019260209291908290030181865afa1580156119c0573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906119e4919061293d565b905090565b611a1d604051806080016040528060006001600160a01b031681526020016060815260200160608152602001600081525090565b604051806080016040528073c2132d05d31c914a87c6611c10748aeb04b58e8f6001600160a01b03168152602001604051806040016040528060048152602001631554d11560e21b81525081526020016040518060400160405280600a81526020016915195d1a195c881554d160b21b81525081526020016006815250905090565b611ad3604051806080016040528060006001600160a01b031681526020016060815260200160608152602001600081525090565b604051806080016040528073eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee6001600160a01b03168152602001604051806040016040528060058152602001644d4154494360d81b81525081526020016040518060400160405280600b81526020016a26b0ba34b1902a37b5b2b760a91b81525081526020016012815250905090565b6001546040805163f9b6117f60e01b815290516000926001600160a01b03169163f9b6117f9160048083019260209291908290030181865afa158015611ba1573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906119e49190612d33565b6003546000906001600160a01b031615611c41576003546040516316b3980160e11b81526001600160a01b038781166004830152848116602483015290911690632d67300290604401600060405180830381600087803b158015611c2857600080fd5b505af1158015611c3c573d6000803e3d6000fd5b505050505b60008311611c8c5760405162461bcd60e51b81526020600482015260186024820152770546865207175616e746974792063616e6e6f7420626520360441b6044820152606401610a0b565b600254604051630b2ee08760e31b81526001600160a01b0387811660048301526000921690635977043890602401600060405180830381865afa158015611cd7573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052611cff9190810190612a2e565b90506000816060015111611d255760405162461bcd60e51b8152600401610a0b90612adf565b60008511611d645760405162461bcd60e51b815260206004820152600c60248201526b4e6f2c206e6f20707269636560a01b6044820152606401610a0b565b6000611d86611d7386886121ae565b6c0c9f2c9cd04674edea40000000612230565b600754909150611d9790600a612e34565b611da490620186a0612e40565b811115611dc35760405162461bcd60e51b8152600401610a0b90612e57565b600454600154611de2916001600160a01b039081169187911684612272565b600154604051631b5522f960e11b81526000916001600160a01b0316906336aa45f290611e1d908b9089908c908c9089908990600401612ea4565b6020604051808303816000875af1158015611e3c573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611e60919061293d565b905080886001600160a01b03167f164666df0cbe6896e7bda798468870a2933385c7517e10080233b7d1a1a4c2f08760008b8b604051611ea39493929190612edc565b60405180910390a3979650505050505050565b6003546000906001600160a01b031615611f325760035460405163f46dc94760e01b81526001600160a01b03878116600483015284811660248301529091169063f46dc94790604401600060405180830381600087803b158015611f1957600080fd5b505af1158015611f2d573d6000803e3d6000fd5b505050505b60008311611f7d5760405162461bcd60e51b81526020600482015260186024820152770546865207175616e746974792063616e6e6f7420626520360441b6044820152606401610a0b565b600254604051630b2ee08760e31b81526001600160a01b0387811660048301526000921690635977043890602401600060405180830381865afa158015611fc8573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052611ff09190810190612a2e565b905060008160600151116120165760405162461bcd60e51b8152600401610a0b90612adf565b600085116120555760405162461bcd60e51b815260206004820152600c60248201526b4e6f2c206e6f20707269636560a01b6044820152606401610a0b565b6000612064611d7386886121ae565b60075490915061207590600a612e34565b61208290620186a0612e40565b8111156120a15760405162461bcd60e51b8152600401610a0b90612e57565b6008546001600160a01b03908116908816036120d2576001546120cd906001600160a01b0316866123a2565b6120ec565b6001546120ec90889086906001600160a01b031688612272565b60018054604051631b5522f960e11b81526000926001600160a01b03909216916336aa45f291612128918c918a918d918d918a91600401612ea4565b6020604051808303816000875af1158015612147573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061216b919061293d565b905080886001600160a01b03167f164666df0cbe6896e7bda798468870a2933385c7517e10080233b7d1a1a4c2f08760018b8b604051611ea39493929190612edc565b6000826000036121c0575060006109a0565b60006121cc8385612e40565b9050826121d98583612f25565b14610bf75760405162461bcd60e51b815260206004820152602160248201527f536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f6044820152607760f81b6064820152608401610a0b565b6000610bf783836040518060400160405280601a81526020017f536166654d6174683a206469766973696f6e206279207a65726f000000000000815250612470565b604080516001600160a01b0385811660248301528481166044830152606480830185905283518084039091018152608490920183526020820180516001600160e01b03166323b872dd60e01b17905291516000928392908816916122d69190612f47565b6000604051808303816000865af19150503d8060008114612313576040519150601f19603f3d011682016040523d82523d6000602084013e612318565b606091505b50915091508180156123425750805115806123425750808060200190518101906123429190612b25565b61239a5760405162461bcd60e51b8152602060048201526024808201527f5472616e7366657248656c7065723a205452414e534645525f46524f4d5f46416044820152631253115160e21b6064820152608401610a0b565b505050505050565b604080516000808252602082019092526001600160a01b0384169083906040516123cc9190612f47565b60006040518083038185875af1925050503d8060008114612409576040519150601f19603f3d011682016040523d82523d6000602084013e61240e565b606091505b505090508061246b5760405162461bcd60e51b815260206004820152602360248201527f5472616e7366657248656c7065723a204554485f5452414e534645525f46414960448201526213115160ea1b6064820152608401610a0b565b505050565b600081836124915760405162461bcd60e51b8152600401610a0b9190612f63565b5060006116c28486612f25565b6001600160a01b03811681146124b357600080fd5b50565b600080604083850312156124c957600080fd5b82356124d48161249e565b946020939093013593505050565b602080825282518282018190526000919060409081850190868401855b82811015612524578151805185528601518685015292840192908501906001016124ff565b5091979650505050505050565b60006020828403121561254357600080fd5b8135610bf78161249e565b60008060006060848603121561256357600080fd5b833561256e8161249e565b92506020840135915060408401356125858161249e565b809150509250925092565b6020808252825182820181905260009190848201906040850190845b818110156125c8578351835292840192918401916001016125ac565b50909695505050505050565b6000806000606084860312156125e957600080fd5b83356125f48161249e565b95602085013595506040909401359392505050565b6000806040838503121561261c57600080fd5b50508035926020909101359150565b6020808252825182820181905260009190848201906040850190845b818110156125c85783516001600160a01b031683529284019291840191600101612647565b60005b8381101561268757818101518382015260200161266f565b50506000910152565b600081518084526126a881602086016020860161266c565b601f01601f19169290920160200192915050565b6001600160a01b03851681526080602082018190526000906126e090830186612690565b82810360408401526126f28186612690565b91505082606083015295945050505050565b6000806040838503121561271757600080fd5b82356127228161249e565b915060208301356127328161249e565b809150509250929050565b60006020828403121561274f57600080fd5b5035919050565b6000806000806080858703121561276c57600080fd5b84356127778161249e565b935060208501356127878161249e565b93969395505050506040820135916060013590565b6001600160a01b03929092168252602082015260400190565b634e487b7160e01b600052604160045260246000fd5b6040516080810167ffffffffffffffff811182821017156127ee576127ee6127b5565b60405290565b604051610120810167ffffffffffffffff811182821017156127ee576127ee6127b5565b604051610180810167ffffffffffffffff811182821017156127ee576127ee6127b5565b604051601f8201601f1916810167ffffffffffffffff81118282101715612865576128656127b5565b604052919050565b600067ffffffffffffffff821115612887576128876127b5565b5060051b60200190565b600060208083850312156128a457600080fd5b825167ffffffffffffffff8111156128bb57600080fd5b8301601f810185136128cc57600080fd5b80516128df6128da8261286d565b61283c565b81815260059190911b820183019083810190878311156128fe57600080fd5b928401925b8284101561291c57835182529284019290840190612903565b979650505050505050565b634e487b7160e01b600052603260045260246000fd5b60006020828403121561294f57600080fd5b5051919050565b634e487b7160e01b600052601160045260246000fd5b60006001820161297e5761297e612956565b5060010190565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b80516129c58161249e565b919050565b600082601f8301126129db57600080fd5b815167ffffffffffffffff8111156129f5576129f56127b5565b612a08601f8201601f191660200161283c565b818152846020838601011115612a1d57600080fd5b610d0782602083016020870161266c565b600060208284031215612a4057600080fd5b815167ffffffffffffffff80821115612a5857600080fd5b9083019060808286031215612a6c57600080fd5b612a746127cb565b8251612a7f8161249e565b8152602083015182811115612a9357600080fd5b612a9f878286016129ca565b602083015250604083015182811115612ab757600080fd5b612ac3878286016129ca565b6040830152506060830151606082015280935050505092915050565b60208082526026908201527f5468697320636f6e74726163742061646472657373206973206e6f74207375706040820152651c1bdc9d195960d21b606082015260800190565b600060208284031215612b3757600080fd5b81518015158114610bf757600080fd5b60006020808385031215612b5a57600080fd5b825167ffffffffffffffff811115612b7157600080fd5b8301601f81018513612b8257600080fd5b8051612b906128da8261286d565b81815260059190911b82018301908381019087831115612baf57600080fd5b928401925b8284101561291c578351612bc78161249e565b82529284019290840190612bb4565b60006101208284031215612be957600080fd5b612bf16127f4565b825181526020830151602082015260408301516040820152606083015160608201526080830151608082015260a083015160a082015260c083015160c082015260e083015160e08201526101008084015181830152508091505092915050565b8051600281106129c557600080fd5b8051600481106129c557600080fd5b60006101808284031215612c8257600080fd5b612c8a612818565b825181526020830151602082015260408301516040820152606083015160608201526080830151608082015260a083015160a082015260c083015160c082015260e083015160e0820152610100808401518183015250610120612cee818501612c51565b90820152610140612d00848201612c60565b90820152610160612d128482016129ba565b908201529392505050565b634e487b7160e01b600052602160045260246000fd5b600060208284031215612d4557600080fd5b8151610bf78161249e565b600181815b80851115612d8b578160001904821115612d7157612d71612956565b80851615612d7e57918102915b93841c9390800290612d55565b509250929050565b600082612da2575060016109a0565b81612daf575060006109a0565b8160018114612dc55760028114612dcf57612deb565b60019150506109a0565b60ff841115612de057612de0612956565b50506001821b6109a0565b5060208310610133831016604e8410600b8410161715612e0e575081810a6109a0565b612e188383612d50565b8060001904821115612e2c57612e2c612956565b029392505050565b6000610bf78383612d93565b80820281158282048414176109a0576109a0612956565b6020808252602d908201527f4d6178696d756d2073696e676c65207472616e73616374696f6e20616d6f756e60408201526c1d080c4c0c0c0c0c081554d115609a1b606082015260800190565b6001600160a01b03968716815294909516602085015260408401929092526060830152608082015260ff90911660a082015260c00190565b6001600160a01b03851681526080810160028510612f0a57634e487b7160e01b600052602160045260246000fd5b84602083015283604083015282606083015295945050505050565b600082612f4257634e487b7160e01b600052601260045260246000fd5b500490565b60008251612f5981846020870161266c565b9190910192915050565b602081526000610bf7602083018461269056fea264697066735822122046a912d34f63a36f8db25e86d36c32d96d3d096ee16e53424ae187fec646b01e64736f6c63430008110033

Deployed Bytecode

0x6080604052600436106102045760003560e01c80637017689611610118578063d4de8ad2116100a0578063edb258411161006f578063edb2584114610660578063f248d4bb146106e2578063f3da8edf14610702578063f7888aec14610722578063f79fde671461074257600080fd5b8063d4de8ad2146105e0578063e3dddfc814610600578063e501d5f414610620578063ed7a144f1461064057600080fd5b80639fd95a42116100e75780639fd95a4214610540578063b424bd8314610560578063bdda1d1a14610580578063c27b6f29146105a0578063ca5eb5e1146105c057600080fd5b806370176896146104cd5780637cb2b79c146104e057806394f27d081461050057806395265e6c1461052057600080fd5b806327f83af91161019b57806350ab38711161016a57806350ab3871146103d9578063594251341461043d578063597704381461045d5780635d4e94071461048d5780635f8e651e146104ad57600080fd5b806327f83af91461035957806341976e091461037957806347c3b77d146103995780634f9f21f9146103b957600080fd5b8063161b71fa116101d7578063161b71fa146102bd57806319ab453c146102ea5780631cbc5ab11461030c5780631f69ae121461032c57600080fd5b80630479569f1461020957806305a7b0411461023f578063083c63511461026d5780630afbe8731461028d575b600080fd5b34801561021557600080fd5b506102296102243660046124b6565b610757565b60405161023691906124e2565b60405180910390f35b34801561024b57600080fd5b5061025f61025a366004612531565b610929565b604051908152602001610236565b34801561027957600080fd5b5061025f610288366004612531565b6109a6565b34801561029957600080fd5b506102ad6102a836600461254e565b6109e0565b6040519015158152602001610236565b3480156102c957600080fd5b506102dd6102d83660046124b6565b610b7b565b6040516102369190612590565b3480156102f657600080fd5b5061030a610305366004612531565b610bfe565b005b34801561031857600080fd5b5061025f6103273660046125d4565b610ca3565b34801561033857600080fd5b5061034c610347366004612609565b610d0f565b604051610236919061262b565b34801561036557600080fd5b506102ad6103743660046124b6565b610d88565b34801561038557600080fd5b5061025f610394366004612531565b610eed565b3480156103a557600080fd5b506102dd6103b43660046125d4565b610f27565b3480156103c557600080fd5b506102dd6103d43660046125d4565b610fb0565b3480156103e557600080fd5b506103f96103f43660046124b6565b610ff8565b60408051998a5260208a0198909852968801959095526060870193909352608086019190915260a085015260c084015260e083015261010082015261012001610236565b34801561044957600080fd5b5061025f610458366004612531565b6110ce565b34801561046957600080fd5b5061047d610478366004612531565b611108565b60405161023694939291906126bc565b34801561049957600080fd5b506102296104a83660046124b6565b6111a7565b3480156104b957600080fd5b5061025f6104c8366004612704565b611370565b61025f6104db36600461273d565b6113ef565b3480156104ec57600080fd5b5061030a6104fb366004612531565b61140a565b34801561050c57600080fd5b506102dd61051b3660046124b6565b611456565b34801561052c57600080fd5b5061025f61053b3660046124b6565b61148d565b34801561054c57600080fd5b506102dd61055b3660046124b6565b6114c4565b34801561056c57600080fd5b5061025f61057b366004612531565b6114fb565b34801561058c57600080fd5b506102dd61059b3660046124b6565b611535565b3480156105ac57600080fd5b5061025f6105bb366004612704565b61156c565b3480156105cc57600080fd5b5061030a6105db366004612531565b6115ae565b3480156105ec57600080fd5b506102dd6105fb3660046124b6565b6115fa565b34801561060c57600080fd5b506102dd61061b366004612756565b611631565b34801561062c57600080fd5b5061025f61063b3660046124b6565b6116cb565b34801561064c57600080fd5b5061025f61065b3660046125d4565b611702565b34801561066c57600080fd5b5061068061067b3660046124b6565b611766565b604080519b8c5260208c019a909a52988a01979097526060890195909552608088019390935260a087019190915260c086015260e085015260ff908116610100850152166101208301526001600160a01b031661014082015261016001610236565b3480156106ee57600080fd5b506102dd6106fd366004612756565b611875565b34801561070e57600080fd5b5061025f61071d366004612609565b6118c5565b34801561072e57600080fd5b5061025f61073d366004612704565b6118e0565b34801561074e57600080fd5b5061025f611976565b60606000610763611b57565b90506000816001600160a01b0316639fd95a4286866040518363ffffffff1660e01b815260040161079592919061279c565b600060405180830381865afa1580156107b2573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526107da9190810190612891565b90508367ffffffffffffffff8111156107f5576107f56127b5565b60405190808252806020026020018201604052801561083a57816020015b60408051808201909152600080825260208201528152602001906001900390816108135790505b50925060005b8481101561092057600082828151811061085c5761085c612927565b602002602001015190506000846001600160a01b031663e501d5f489846040518363ffffffff1660e01b815260040161089692919061279c565b602060405180830381865afa1580156108b3573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906108d7919061293d565b905060405180604001604052808381526020018281525086848151811061090057610900612927565b6020026020010181905250505080806109189061296c565b915050610840565b50505092915050565b6000610933611b57565b6040516305a7b04160e01b81526001600160a01b03848116600483015291909116906305a7b041906024015b602060405180830381865afa15801561097c573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906109a0919061293d565b92915050565b60006109b0611b57565b60405163083c635160e01b81526001600160a01b038481166004830152919091169063083c63519060240161095f565b600080546001600160a01b03163314610a145760405162461bcd60e51b8152600401610a0b90612985565b60405180910390fd5b600254604051630b2ee08760e31b81526001600160a01b0386811660048301526000921690635977043890602401600060405180830381865afa158015610a5f573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052610a879190810190612a2e565b90506000816060015111610aad5760405162461bcd60e51b8152600401610a0b90612adf565b600154604051630e9cacff60e21b81526001600160a01b0387811660048301526024820187905285811660448301526000921690633a72b3fc906064016020604051808303816000875af1158015610b09573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610b2d9190612b25565b6040516001600160a01b03868116825291925086918816907f815e548fe24679a5c17a12d6857eba6a816b25878050abfcb7b0e88f07d6418b9060200160405180910390a395945050505050565b6060610b85611b57565b6001600160a01b031663161b71fa84846040518363ffffffff1660e01b8152600401610bb292919061279c565b600060405180830381865afa158015610bcf573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052610bf79190810190612891565b9392505050565b6000546001600160a01b03163314610c285760405162461bcd60e51b8152600401610a0b90612985565b6001546001600160a01b031615610c815760405162461bcd60e51b815260206004820152601960248201527f43616e206f6e6c792062652061737369676e6564206f6e6365000000000000006044820152606401610a0b565b600180546001600160a01b0319166001600160a01b0392909216919091179055565b6008546000906001600160a01b0390811690851603610cfb5760405162461bcd60e51b8152602060048201526014602482015273088decae640dcdee840e6eae0e0dee4e8408aa8960631b6044820152606401610a0b565b610d0784848433611bc5565b949350505050565b600254604051630fb4d70960e11b815260048101849052602481018390526060916001600160a01b031690631f69ae1290604401600060405180830381865afa158015610d60573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052610bf79190810190612b47565b600254604051630b2ee08760e31b81526001600160a01b0384811660048301526000928392911690635977043890602401600060405180830381865afa158015610dd6573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052610dfe9190810190612a2e565b90506000816060015111610e245760405162461bcd60e51b8152600401610a0b90612adf565b600154604051630e9cacff60e21b81526001600160a01b038681166004830152602482018690523360448301526000921690633a72b3fc906064016020604051808303816000875af1158015610e7e573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610ea29190612b25565b60405133815290915084906001600160a01b038716907f815e548fe24679a5c17a12d6857eba6a816b25878050abfcb7b0e88f07d6418b9060200160405180910390a3949350505050565b6000610ef7611b57565b6040516341976e0960e01b81526001600160a01b03848116600483015291909116906341976e099060240161095f565b6060610f31611b57565b6040516347c3b77d60e01b81526001600160a01b038681166004830152602482018690526044820185905291909116906347c3b77d906064015b600060405180830381865afa158015610f88573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052610d079190810190612891565b6060610fba611b57565b604051634f9f21f960e01b81526001600160a01b03868116600483015260248201869052604482018590529190911690634f9f21f990606401610f6b565b60008060008060008060008060008061100f611b57565b6001600160a01b03166350ab38718d8d6040518363ffffffff1660e01b815260040161103c92919061279c565b61012060405180830381865afa15801561105a573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061107e9190612bd6565b905080600001519950806020015198508060400151975080606001519650806080015195508060a0015194508060c0015193508060e0015192508061010001519150509295985092959850929598565b60006110d8611b57565b604051631650944d60e21b81526001600160a01b038481166004830152919091169063594251349060240161095f565b600254604051630b2ee08760e31b81526001600160a01b038381166004830152600092606092839285928392911690635977043890602401600060405180830381865afa15801561115d573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526111859190810190612a2e565b8051602082015160408301516060909301519199909850919650945092505050565b606060006111b3611b57565b90506000816001600160a01b031663d4de8ad286866040518363ffffffff1660e01b81526004016111e592919061279c565b600060405180830381865afa158015611202573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f1916820160405261122a9190810190612891565b90508367ffffffffffffffff811115611245576112456127b5565b60405190808252806020026020018201604052801561128a57816020015b60408051808201909152600080825260208201528152602001906001900390816112635790505b50925060005b848110156109205760008282815181106112ac576112ac612927565b602002602001015190506000846001600160a01b03166395265e6c89846040518363ffffffff1660e01b81526004016112e692919061279c565b602060405180830381865afa158015611303573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611327919061293d565b905060405180604001604052808381526020018281525086848151811061135057611350612927565b6020026020010181905250505080806113689061296c565b915050611290565b600061137a611b57565b604051632fc7328f60e11b81526001600160a01b03858116600483015284811660248301529190911690635f8e651e906044015b602060405180830381865afa1580156113cb573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610bf7919061293d565b6008546000906109a0906001600160a01b0316833433611eb6565b6000546001600160a01b031633146114345760405162461bcd60e51b8152600401610a0b90612985565b600280546001600160a01b0319166001600160a01b0392909216919091179055565b6060611460611b57565b6001600160a01b03166394f27d0884846040518363ffffffff1660e01b8152600401610bb292919061279c565b6000611497611b57565b6001600160a01b03166395265e6c84846040518363ffffffff1660e01b81526004016113ae92919061279c565b60606114ce611b57565b6001600160a01b0316639fd95a4284846040518363ffffffff1660e01b8152600401610bb292919061279c565b6000611505611b57565b60405163b424bd8360e01b81526001600160a01b038481166004830152919091169063b424bd839060240161095f565b606061153f611b57565b6001600160a01b031663bdda1d1a84846040518363ffffffff1660e01b8152600401610bb292919061279c565b6000611576611b57565b60405163c27b6f2960e01b81526001600160a01b0385811660048301528481166024830152919091169063c27b6f29906044016113ae565b6000546001600160a01b031633146115d85760405162461bcd60e51b8152600401610a0b90612985565b600380546001600160a01b0319166001600160a01b0392909216919091179055565b6060611604611b57565b6001600160a01b031663d4de8ad284846040518363ffffffff1660e01b8152600401610bb292919061279c565b606061163b611b57565b604051631c7bbbf960e31b81526001600160a01b03878116600483015286811660248301526044820186905260648201859052919091169063e3dddfc8906084015b600060405180830381865afa15801561169a573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526116c29190810190612891565b95945050505050565b60006116d5611b57565b6001600160a01b031663e501d5f484846040518363ffffffff1660e01b81526004016113ae92919061279c565b6008546000906001600160a01b039081169085160361175a5760405162461bcd60e51b8152602060048201526014602482015273088decae640dcdee840e6eae0e0dee4e8408aa8960631b6044820152606401610a0b565b610d0784848433611eb6565b600080600080600080600080600080600080611780611b57565b6001600160a01b031663edb258418f8f6040518363ffffffff1660e01b81526004016117ad92919061279c565b61018060405180830381865afa1580156117cb573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906117ef9190612c6f565b905080602001519b5080604001519a5080606001519950806080015198508060a0015197508060c0015196508060e0015195508061010001519450806101200151600181111561184157611841612d1d565b9350806101400151600381111561185a5761185a612d1d565b92508061016001519150509295989b509295989b9093969950565b606061187f611b57565b60405163f248d4bb60e01b81526001600160a01b03878116600483015286811660248301526044820186905260648201859052919091169063f248d4bb9060840161167d565b600854600090610bf7906001600160a01b0316848433611bc5565b60085460009081906001600160a01b039081169085160361190c57506001600160a01b03821631610bf7565b6040516370a0823160e01b81526001600160a01b0384811660048301528516906370a0823190602401602060405180830381865afa158015611952573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610d07919061293d565b600254604080516303c381ad60e61b815290516000926001600160a01b03169163f0e06b409160048083019260209291908290030181865afa1580156119c0573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906119e4919061293d565b905090565b611a1d604051806080016040528060006001600160a01b031681526020016060815260200160608152602001600081525090565b604051806080016040528073c2132d05d31c914a87c6611c10748aeb04b58e8f6001600160a01b03168152602001604051806040016040528060048152602001631554d11560e21b81525081526020016040518060400160405280600a81526020016915195d1a195c881554d160b21b81525081526020016006815250905090565b611ad3604051806080016040528060006001600160a01b031681526020016060815260200160608152602001600081525090565b604051806080016040528073eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee6001600160a01b03168152602001604051806040016040528060058152602001644d4154494360d81b81525081526020016040518060400160405280600b81526020016a26b0ba34b1902a37b5b2b760a91b81525081526020016012815250905090565b6001546040805163f9b6117f60e01b815290516000926001600160a01b03169163f9b6117f9160048083019260209291908290030181865afa158015611ba1573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906119e49190612d33565b6003546000906001600160a01b031615611c41576003546040516316b3980160e11b81526001600160a01b038781166004830152848116602483015290911690632d67300290604401600060405180830381600087803b158015611c2857600080fd5b505af1158015611c3c573d6000803e3d6000fd5b505050505b60008311611c8c5760405162461bcd60e51b81526020600482015260186024820152770546865207175616e746974792063616e6e6f7420626520360441b6044820152606401610a0b565b600254604051630b2ee08760e31b81526001600160a01b0387811660048301526000921690635977043890602401600060405180830381865afa158015611cd7573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052611cff9190810190612a2e565b90506000816060015111611d255760405162461bcd60e51b8152600401610a0b90612adf565b60008511611d645760405162461bcd60e51b815260206004820152600c60248201526b4e6f2c206e6f20707269636560a01b6044820152606401610a0b565b6000611d86611d7386886121ae565b6c0c9f2c9cd04674edea40000000612230565b600754909150611d9790600a612e34565b611da490620186a0612e40565b811115611dc35760405162461bcd60e51b8152600401610a0b90612e57565b600454600154611de2916001600160a01b039081169187911684612272565b600154604051631b5522f960e11b81526000916001600160a01b0316906336aa45f290611e1d908b9089908c908c9089908990600401612ea4565b6020604051808303816000875af1158015611e3c573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611e60919061293d565b905080886001600160a01b03167f164666df0cbe6896e7bda798468870a2933385c7517e10080233b7d1a1a4c2f08760008b8b604051611ea39493929190612edc565b60405180910390a3979650505050505050565b6003546000906001600160a01b031615611f325760035460405163f46dc94760e01b81526001600160a01b03878116600483015284811660248301529091169063f46dc94790604401600060405180830381600087803b158015611f1957600080fd5b505af1158015611f2d573d6000803e3d6000fd5b505050505b60008311611f7d5760405162461bcd60e51b81526020600482015260186024820152770546865207175616e746974792063616e6e6f7420626520360441b6044820152606401610a0b565b600254604051630b2ee08760e31b81526001600160a01b0387811660048301526000921690635977043890602401600060405180830381865afa158015611fc8573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052611ff09190810190612a2e565b905060008160600151116120165760405162461bcd60e51b8152600401610a0b90612adf565b600085116120555760405162461bcd60e51b815260206004820152600c60248201526b4e6f2c206e6f20707269636560a01b6044820152606401610a0b565b6000612064611d7386886121ae565b60075490915061207590600a612e34565b61208290620186a0612e40565b8111156120a15760405162461bcd60e51b8152600401610a0b90612e57565b6008546001600160a01b03908116908816036120d2576001546120cd906001600160a01b0316866123a2565b6120ec565b6001546120ec90889086906001600160a01b031688612272565b60018054604051631b5522f960e11b81526000926001600160a01b03909216916336aa45f291612128918c918a918d918d918a91600401612ea4565b6020604051808303816000875af1158015612147573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061216b919061293d565b905080886001600160a01b03167f164666df0cbe6896e7bda798468870a2933385c7517e10080233b7d1a1a4c2f08760018b8b604051611ea39493929190612edc565b6000826000036121c0575060006109a0565b60006121cc8385612e40565b9050826121d98583612f25565b14610bf75760405162461bcd60e51b815260206004820152602160248201527f536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f6044820152607760f81b6064820152608401610a0b565b6000610bf783836040518060400160405280601a81526020017f536166654d6174683a206469766973696f6e206279207a65726f000000000000815250612470565b604080516001600160a01b0385811660248301528481166044830152606480830185905283518084039091018152608490920183526020820180516001600160e01b03166323b872dd60e01b17905291516000928392908816916122d69190612f47565b6000604051808303816000865af19150503d8060008114612313576040519150601f19603f3d011682016040523d82523d6000602084013e612318565b606091505b50915091508180156123425750805115806123425750808060200190518101906123429190612b25565b61239a5760405162461bcd60e51b8152602060048201526024808201527f5472616e7366657248656c7065723a205452414e534645525f46524f4d5f46416044820152631253115160e21b6064820152608401610a0b565b505050505050565b604080516000808252602082019092526001600160a01b0384169083906040516123cc9190612f47565b60006040518083038185875af1925050503d8060008114612409576040519150601f19603f3d011682016040523d82523d6000602084013e61240e565b606091505b505090508061246b5760405162461bcd60e51b815260206004820152602360248201527f5472616e7366657248656c7065723a204554485f5452414e534645525f46414960448201526213115160ea1b6064820152608401610a0b565b505050565b600081836124915760405162461bcd60e51b8152600401610a0b9190612f63565b5060006116c28486612f25565b6001600160a01b03811681146124b357600080fd5b50565b600080604083850312156124c957600080fd5b82356124d48161249e565b946020939093013593505050565b602080825282518282018190526000919060409081850190868401855b82811015612524578151805185528601518685015292840192908501906001016124ff565b5091979650505050505050565b60006020828403121561254357600080fd5b8135610bf78161249e565b60008060006060848603121561256357600080fd5b833561256e8161249e565b92506020840135915060408401356125858161249e565b809150509250925092565b6020808252825182820181905260009190848201906040850190845b818110156125c8578351835292840192918401916001016125ac565b50909695505050505050565b6000806000606084860312156125e957600080fd5b83356125f48161249e565b95602085013595506040909401359392505050565b6000806040838503121561261c57600080fd5b50508035926020909101359150565b6020808252825182820181905260009190848201906040850190845b818110156125c85783516001600160a01b031683529284019291840191600101612647565b60005b8381101561268757818101518382015260200161266f565b50506000910152565b600081518084526126a881602086016020860161266c565b601f01601f19169290920160200192915050565b6001600160a01b03851681526080602082018190526000906126e090830186612690565b82810360408401526126f28186612690565b91505082606083015295945050505050565b6000806040838503121561271757600080fd5b82356127228161249e565b915060208301356127328161249e565b809150509250929050565b60006020828403121561274f57600080fd5b5035919050565b6000806000806080858703121561276c57600080fd5b84356127778161249e565b935060208501356127878161249e565b93969395505050506040820135916060013590565b6001600160a01b03929092168252602082015260400190565b634e487b7160e01b600052604160045260246000fd5b6040516080810167ffffffffffffffff811182821017156127ee576127ee6127b5565b60405290565b604051610120810167ffffffffffffffff811182821017156127ee576127ee6127b5565b604051610180810167ffffffffffffffff811182821017156127ee576127ee6127b5565b604051601f8201601f1916810167ffffffffffffffff81118282101715612865576128656127b5565b604052919050565b600067ffffffffffffffff821115612887576128876127b5565b5060051b60200190565b600060208083850312156128a457600080fd5b825167ffffffffffffffff8111156128bb57600080fd5b8301601f810185136128cc57600080fd5b80516128df6128da8261286d565b61283c565b81815260059190911b820183019083810190878311156128fe57600080fd5b928401925b8284101561291c57835182529284019290840190612903565b979650505050505050565b634e487b7160e01b600052603260045260246000fd5b60006020828403121561294f57600080fd5b5051919050565b634e487b7160e01b600052601160045260246000fd5b60006001820161297e5761297e612956565b5060010190565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b80516129c58161249e565b919050565b600082601f8301126129db57600080fd5b815167ffffffffffffffff8111156129f5576129f56127b5565b612a08601f8201601f191660200161283c565b818152846020838601011115612a1d57600080fd5b610d0782602083016020870161266c565b600060208284031215612a4057600080fd5b815167ffffffffffffffff80821115612a5857600080fd5b9083019060808286031215612a6c57600080fd5b612a746127cb565b8251612a7f8161249e565b8152602083015182811115612a9357600080fd5b612a9f878286016129ca565b602083015250604083015182811115612ab757600080fd5b612ac3878286016129ca565b6040830152506060830151606082015280935050505092915050565b60208082526026908201527f5468697320636f6e74726163742061646472657373206973206e6f74207375706040820152651c1bdc9d195960d21b606082015260800190565b600060208284031215612b3757600080fd5b81518015158114610bf757600080fd5b60006020808385031215612b5a57600080fd5b825167ffffffffffffffff811115612b7157600080fd5b8301601f81018513612b8257600080fd5b8051612b906128da8261286d565b81815260059190911b82018301908381019087831115612baf57600080fd5b928401925b8284101561291c578351612bc78161249e565b82529284019290840190612bb4565b60006101208284031215612be957600080fd5b612bf16127f4565b825181526020830151602082015260408301516040820152606083015160608201526080830151608082015260a083015160a082015260c083015160c082015260e083015160e08201526101008084015181830152508091505092915050565b8051600281106129c557600080fd5b8051600481106129c557600080fd5b60006101808284031215612c8257600080fd5b612c8a612818565b825181526020830151602082015260408301516040820152606083015160608201526080830151608082015260a083015160a082015260c083015160c082015260e083015160e0820152610100808401518183015250610120612cee818501612c51565b90820152610140612d00848201612c60565b90820152610160612d128482016129ba565b908201529392505050565b634e487b7160e01b600052602160045260246000fd5b600060208284031215612d4557600080fd5b8151610bf78161249e565b600181815b80851115612d8b578160001904821115612d7157612d71612956565b80851615612d7e57918102915b93841c9390800290612d55565b509250929050565b600082612da2575060016109a0565b81612daf575060006109a0565b8160018114612dc55760028114612dcf57612deb565b60019150506109a0565b60ff841115612de057612de0612956565b50506001821b6109a0565b5060208310610133831016604e8410600b8410161715612e0e575081810a6109a0565b612e188383612d50565b8060001904821115612e2c57612e2c612956565b029392505050565b6000610bf78383612d93565b80820281158282048414176109a0576109a0612956565b6020808252602d908201527f4d6178696d756d2073696e676c65207472616e73616374696f6e20616d6f756e60408201526c1d080c4c0c0c0c0c081554d115609a1b606082015260800190565b6001600160a01b03968716815294909516602085015260408401929092526060830152608082015260ff90911660a082015260c00190565b6001600160a01b03851681526080810160028510612f0a57634e487b7160e01b600052602160045260246000fd5b84602083015283604083015282606083015295945050505050565b600082612f4257634e487b7160e01b600052601260045260246000fd5b500490565b60008251612f5981846020870161266c565b9190910192915050565b602081526000610bf7602083018461269056fea264697066735822122046a912d34f63a36f8db25e86d36c32d96d3d096ee16e53424ae187fec646b01e64736f6c63430008110033

Deployed Bytecode Sourcemap

10825:13291:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;20519:551;;;;;;;;;;-1:-1:-1;20519:551:0;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;17695:164;;;;;;;;;;-1:-1:-1;17695:164:0;;;;;:::i;:::-;;:::i;:::-;;;1653:25:2;;;1641:2;1626:18;17695:164:0;1507:177:2;21302:186:0;;;;;;;;;;-1:-1:-1;21302:186:0;;;;;:::i;:::-;;:::i;16472:473::-;;;;;;;;;;-1:-1:-1;16472:473:0;;;;;:::i;:::-;;:::i;:::-;;;2315:14:2;;2308:22;2290:41;;2278:2;2263:18;16472:473:0;2150:187:2;21076:220:0;;;;;;;;;;-1:-1:-1;21076:220:0;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;11536:183::-;;;;;;;;;;-1:-1:-1;11536:183:0;;;;;:::i;:::-;;:::i;:::-;;13867:272;;;;;;;;;;-1:-1:-1;13867:272:0;;;;;:::i;:::-;;:::i;12536:192::-;;;;;;;;;;-1:-1:-1;12536:192:0;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;16018:448::-;;;;;;;;;;-1:-1:-1;16018:448:0;;;;;:::i;:::-;;:::i;17539:150::-;;;;;;;;;;-1:-1:-1;17539:150:0;;;;;:::i;:::-;;:::i;21494:224::-;;;;;;;;;;-1:-1:-1;21494:224:0;;;;;:::i;:::-;;:::i;19847:222::-;;;;;;;;;;-1:-1:-1;19847:222:0;;;;;:::i;:::-;;:::i;18917:734::-;;;;;;;;;;-1:-1:-1;18917:734:0;;;;;:::i;:::-;;:::i;:::-;;;;4654:25:2;;;4710:2;4695:18;;4688:34;;;;4738:18;;;4731:34;;;;4796:2;4781:18;;4774:34;;;;4839:3;4824:19;;4817:35;;;;4883:3;4868:19;;4861:35;4927:3;4912:19;;4905:35;4971:3;4956:19;;4949:35;5015:3;5000:19;;4993:35;4641:3;4626:19;18917:734:0;4283:751:2;19657:184:0;;;;;;;;;;-1:-1:-1;19657:184:0;;;;;:::i;:::-;;:::i;11961:413::-;;;;;;;;;;-1:-1:-1;11961:413:0;;;;;:::i;:::-;;:::i;:::-;;;;;;;;;;:::i;22172:554::-;;;;;;;;;;-1:-1:-1;22172:554:0;;;;;:::i;:::-;;:::i;23176:212::-;;;;;;;;;;-1:-1:-1;23176:212:0;;;;;:::i;:::-;;:::i;15853:159::-;;;;;;:::i;:::-;;:::i;11725:121::-;;;;;;;;;;-1:-1:-1;11725:121:0;;;;;:::i;:::-;;:::i;22732:222::-;;;;;;;;;;-1:-1:-1;22732:222:0;;;;;:::i;:::-;;:::i;21724:215::-;;;;;;;;;;-1:-1:-1;21724:215:0;;;;;:::i;:::-;;:::i;20294:219::-;;;;;;;;;;-1:-1:-1;20294:219:0;;;;;:::i;:::-;;:::i;17865:164::-;;;;;;;;;;-1:-1:-1;17865:164:0;;;;;:::i;:::-;;:::i;22960:210::-;;;;;;;;;;-1:-1:-1;22960:210:0;;;;;:::i;:::-;;:::i;23394:::-;;;;;;;;;;-1:-1:-1;23394:210:0;;;;;:::i;:::-;;:::i;11852:103::-;;;;;;;;;;-1:-1:-1;11852:103:0;;;;;:::i;:::-;;:::i;21945:221::-;;;;;;;;;;-1:-1:-1;21945:221:0;;;;;:::i;:::-;;:::i;23866:248::-;;;;;;;;;;-1:-1:-1;23866:248:0;;;;;:::i;:::-;;:::i;20075:213::-;;;;;;;;;;-1:-1:-1;20075:213:0;;;;;:::i;:::-;;:::i;15573:274::-;;;;;;;;;;-1:-1:-1;15573:274:0;;;;;:::i;:::-;;:::i;18035:876::-;;;;;;;;;;-1:-1:-1;18035:876:0;;;;;:::i;:::-;;:::i;:::-;;;;7656:25:2;;;7712:2;7697:18;;7690:34;;;;7740:18;;;7733:34;;;;7798:2;7783:18;;7776:34;;;;7841:3;7826:19;;7819:35;;;;7885:3;7870:19;;7863:35;;;;7929:3;7914:19;;7907:35;7973:3;7958:19;;7951:35;8035:4;8023:17;;;8017:3;8002:19;;7995:46;8078:17;8072:3;8057:19;;8050:46;-1:-1:-1;;;;;8133:33:2;8127:3;8112:19;;8105:62;7643:3;7628:19;18035:876:0;7236:937:2;23610:250:0;;;;;;;;;;-1:-1:-1;23610:250:0;;;;;:::i;:::-;;:::i;14145:176::-;;;;;;;;;;-1:-1:-1;14145:176:0;;;;;:::i;:::-;;:::i;17017:358::-;;;;;;;;;;-1:-1:-1;17017:358:0;;;;;:::i;:::-;;:::i;12380:150::-;;;;;;;;;;;;;:::i;20519:551::-;20608:18;20642:27;20672:17;:15;:17::i;:::-;20642:47;;20699:26;20728:12;-1:-1:-1;;;;;20728:42:0;;20771:14;20787:5;20728:65;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;20728:65:0;;;;;;;;;;;;:::i;:::-;20699:94;;20821:5;20810:17;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;;;;;;;20810:17:0;;;;;;;;;;;;;;;;20803:24;;20842:6;20837:227;20854:5;20852:1;:7;20837:227;;;20888:13;20904:9;20914:1;20904:12;;;;;;;;:::i;:::-;;;;;;;20888:28;;20930:14;20947:12;-1:-1:-1;;;;;20947:40:0;;20988:14;21004:5;20947:63;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;20930:80;;21034:19;;;;;;;;21039:5;21034:19;;;;21046:6;21034:19;;;21024:4;21029:1;21024:7;;;;;;;;:::i;:::-;;;;;;:29;;;;20874:190;;20861:3;;;;;:::i;:::-;;;;20837:227;;;;20632:438;;20519:551;;;;:::o;17695:164::-;17766:15;17804:17;:15;:17::i;:::-;:48;;-1:-1:-1;;;17804:48:0;;-1:-1:-1;;;;;11472:32:2;;;17804:48:0;;;11454:51:2;17804:32:0;;;;;;;11427:18:2;;17804:48:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;17797:55;17695:164;-1:-1:-1;;17695:164:0:o;21302:186::-;21386:11;21420:17;:15;:17::i;:::-;:61;;-1:-1:-1;;;21420:61:0;;-1:-1:-1;;;;;11472:32:2;;;21420:61:0;;;11454:51:2;21420:45:0;;;;;;;11427:18:2;;21420:61:0;11308:203:2;16472:473:0;16579:4;11455:6;;-1:-1:-1;;;;;11455:6:0;11465:10;11455:20;11447:65;;;;-1:-1:-1;;;11447:65:0;;;;;;;:::i;:::-;;;;;;;;;16635:13:::1;::::0;16620:54:::1;::::0;-1:-1:-1;;;16620:54:0;;-1:-1:-1;;;;;11472:32:2;;;16620:54:0::1;::::0;::::1;11454:51:2::0;16599:18:0::1;::::0;16635:13:::1;::::0;16620:38:::1;::::0;11427:18:2;;16620:54:0::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;::::0;;::::1;-1:-1:-1::0;;16620:54:0::1;::::0;::::1;;::::0;::::1;::::0;;;::::1;::::0;::::1;:::i;:::-;16599:75;;16709:1;16692:5;:14;;;:18;16684:69;;;;-1:-1:-1::0;;;16684:69:0::1;;;;;;;:::i;:::-;16791:13;::::0;16778:74:::1;::::0;-1:-1:-1;;;16778:74:0;;-1:-1:-1;;;;;14172:15:2;;;16778:74:0::1;::::0;::::1;14154:34:2::0;14204:18;;;14197:34;;;14267:15;;;14247:18;;;14240:43;16764:11:0::1;::::0;16791:13:::1;::::0;16778:39:::1;::::0;14089:18:2;;16778:74:0::1;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;16868:46;::::0;-1:-1:-1;;;;;11472:32:2;;;11454:51;;16764:88:0;;-1:-1:-1;16896:8:0;;16868:46;::::1;::::0;::::1;::::0;11442:2:2;11427:18;16868:46:0::1;;;;;;;16932:6:::0;16472:473;-1:-1:-1;;;;;16472:473:0:o;21076:220::-;21176:21;21220:17;:15;:17::i;:::-;-1:-1:-1;;;;;21220:45:0;;21266:14;21282:6;21220:69;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;21220:69:0;;;;;;;;;;;;:::i;:::-;21213:76;21076:220;-1:-1:-1;;;21076:220:0:o;11536:183::-;11455:6;;-1:-1:-1;;;;;11455:6:0;11465:10;11455:20;11447:65;;;;-1:-1:-1;;;11447:65:0;;;;;;;:::i;:::-;11615:13:::1;::::0;-1:-1:-1;;;;;11615:13:0::1;:27:::0;11607:65:::1;;;::::0;-1:-1:-1;;;11607:65:0;;14778:2:2;11607:65:0::1;::::0;::::1;14760:21:2::0;14817:2;14797:18;;;14790:30;14856:27;14836:18;;;14829:55;14901:18;;11607:65:0::1;14576:349:2::0;11607:65:0::1;11682:13;:30:::0;;-1:-1:-1;;;;;;11682:30:0::1;-1:-1:-1::0;;;;;11682:30:0;;;::::1;::::0;;;::::1;::::0;;11536:183::o;13867:272::-;14018:3;:17;13961:15;;-1:-1:-1;;;;;14018:17:0;;;14000:35;;;;13992:68;;;;-1:-1:-1;;;13992:68:0;;15132:2:2;13992:68:0;;;15114:21:2;15171:2;15151:18;;;15144:30;-1:-1:-1;;;15190:18:2;;;15183:50;15250:18;;13992:68:0;14930:344:2;13992:68:0;14077:55;14082:14;14098:6;14106:13;14121:10;14077:4;:55::i;:::-;14070:62;13867:272;-1:-1:-1;;;;13867:272:0:o;12536:192::-;12675:13;;12660:61;;-1:-1:-1;;;12660:61:0;;;;;15453:25:2;;;15494:18;;;15487:34;;;12616:21:0;;-1:-1:-1;;;;;12675:13:0;;12660:49;;15426:18:2;;12660:61:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;12660:61:0;;;;;;;;;;;;:::i;16018:448::-;16150:13;;16135:54;;-1:-1:-1;;;16135:54:0;;-1:-1:-1;;;;;11472:32:2;;;16135:54:0;;;11454:51:2;16094:4:0;;;;16150:13;;;16135:38;;11427:18:2;;16135:54:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;16135:54:0;;;;;;;;;;;;:::i;:::-;16114:75;;16224:1;16207:5;:14;;;:18;16199:69;;;;-1:-1:-1;;;16199:69:0;;;;;;;:::i;:::-;16306:13;;16293:77;;-1:-1:-1;;;16293:77:0;;-1:-1:-1;;;;;14172:15:2;;;16293:77:0;;;14154:34:2;14204:18;;;14197:34;;;16359:10:0;14247:18:2;;;14240:43;16279:11:0;;16306:13;;16293:39;;14089:18:2;;16293:77:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;16386:49;;16424:10;11454:51:2;;16279:91:0;;-1:-1:-1;16414:8:0;;-1:-1:-1;;;;;16386:49:0;;;;;11442:2:2;11427:18;16386:49:0;;;;;;;16453:6;16018:448;-1:-1:-1;;;;16018:448:0:o;17539:150::-;17604:13;17640:17;:15;:17::i;:::-;:42;;-1:-1:-1;;;17640:42:0;;-1:-1:-1;;;;;11472:32:2;;;17640:42:0;;;11454:51:2;17640:26:0;;;;;;;11427:18:2;;17640:42:0;11308:203:2;21494:224:0;21600:21;21644:17;:15;:17::i;:::-;:67;;-1:-1:-1;;;21644:67:0;;-1:-1:-1;;;;;16713:32:2;;;21644:67:0;;;16695:51:2;16762:18;;;16755:34;;;16805:18;;;16798:34;;;21644:39:0;;;;;;;16668:18:2;;21644:67:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;21644:67:0;;;;;;;;;;;;:::i;19847:222::-;19952:21;19996:17;:15;:17::i;:::-;:66;;-1:-1:-1;;;19996:66:0;;-1:-1:-1;;;;;16713:32:2;;;19996:66:0;;;16695:51:2;16762:18;;;16755:34;;;16805:18;;;16798:34;;;19996:38:0;;;;;;;16668:18:2;;19996:66:0;16493:345:2;18917:734:0;19009:15;19034:18;19062:19;19091:13;19114:17;19141:16;19167;19193:15;19218:12;19251:19;19273:17;:15;:17::i;:::-;-1:-1:-1;;;;;19273:26:0;;19300:14;19316:8;19273:52;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;19251:74;;19346:6;:14;;;19336:24;;19383:6;:17;;;19370:30;;19424:6;:18;;;19410:32;;19460:6;:12;;;19452:20;;19494:6;:16;;;19482:28;;19531:6;:15;;;19520:26;;19567:6;:15;;;19556:26;;19602:6;:14;;;19592:24;;19633:6;:11;;;19626:18;;19241:410;18917:734;;;;;;;;;;;:::o;19657:184::-;19740:11;19774:17;:15;:17::i;:::-;:60;;-1:-1:-1;;;19774:60:0;;-1:-1:-1;;;;;11472:32:2;;;19774:60:0;;;11454:51:2;19774:44:0;;;;;;;11427:18:2;;19774:60:0;11308:203:2;11961:413:0;12189:13;;12174:54;;-1:-1:-1;;;12174:54:0;;-1:-1:-1;;;;;11472:32:2;;;12174:54:0;;;11454:51:2;12035:21:0;;12066:20;;;;12035:21;;;;12189:13;;;12174:38;;11427:18:2;;12174:54:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;12174:54:0;;;;;;;;;;;;:::i;:::-;12255:19;;12293:12;;;;12322:10;;;;12353:14;;;;;12255:19;;12293:12;;-1:-1:-1;12322:10:0;;-1:-1:-1;12353:14:0;-1:-1:-1;11961:413:0;-1:-1:-1;;;11961:413:0:o;22172:554::-;22262:18;22296:27;22326:17;:15;:17::i;:::-;22296:47;;22353:26;22382:12;-1:-1:-1;;;;;22382:43:0;;22426:14;22442:5;22382:66;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;22382:66:0;;;;;;;;;;;;:::i;:::-;22353:95;;22476:5;22465:17;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;;;;;;;22465:17:0;;;;;;;;;;;;;;;;22458:24;;22497:6;22492:228;22509:5;22507:1;:7;22492:228;;;22543:13;22559:9;22569:1;22559:12;;;;;;;;:::i;:::-;;;;;;;22543:28;;22585:14;22602:12;-1:-1:-1;;;;;22602:41:0;;22644:14;22660:5;22602:64;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;22585:81;;22690:19;;;;;;;;22695:5;22690:19;;;;22702:6;22690:19;;;22680:4;22685:1;22680:7;;;;;;;;:::i;:::-;;;;;;:29;;;;22529:191;;22516:3;;;;;:::i;:::-;;;;22492:228;;23176:212;23277:11;23311:17;:15;:17::i;:::-;:70;;-1:-1:-1;;;23311:70:0;;-1:-1:-1;;;;;17852:15:2;;;23311:70:0;;;17834:34:2;17904:15;;;17884:18;;;17877:43;23311:45:0;;;;;;;17769:18:2;;23311:70:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;15853:159::-;15956:3;:17;15912:15;;15950:55;;-1:-1:-1;;;;;15956:17:0;15975:6;15983:9;15994:10;15950:5;:55::i;11725:121::-;11455:6;;-1:-1:-1;;;;;11455:6:0;11465:10;11455:20;11447:65;;;;-1:-1:-1;;;11447:65:0;;;;;;;:::i;:::-;11808:13:::1;:31:::0;;-1:-1:-1;;;;;;11808:31:0::1;-1:-1:-1::0;;;;;11808:31:0;;;::::1;::::0;;;::::1;::::0;;11725:121::o;22732:222::-;22833:21;22877:17;:15;:17::i;:::-;-1:-1:-1;;;;;22877:46:0;;22924:14;22940:6;22877:70;;;;;;;;;;;;;;;;:::i;21724:215::-;21825:14;21862:17;:15;:17::i;:::-;-1:-1:-1;;;;;21862:46:0;;21909:14;21925:6;21862:70;;;;;;;;;;;;;;;;:::i;20294:219::-;20392:21;20436:17;:15;:17::i;:::-;-1:-1:-1;;;;;20436:47:0;;20484:14;20500:5;20436:70;;;;;;;;;;;;;;;;:::i;17865:164::-;17936:15;17974:17;:15;:17::i;:::-;:48;;-1:-1:-1;;;17974:48:0;;-1:-1:-1;;;;;11472:32:2;;;17974:48:0;;;11454:51:2;17974:32:0;;;;;;;11427:18:2;;17974:48:0;11308:203:2;22960:210:0;23051:29;23103:17;:15;:17::i;:::-;-1:-1:-1;;;;;23103:34:0;;23138:14;23154:8;23103:60;;;;;;;;;;;;;;;;:::i;23394:210::-;23494:11;23528:17;:15;:17::i;:::-;:69;;-1:-1:-1;;;23528:69:0;;-1:-1:-1;;;;;17852:15:2;;;23528:69:0;;;17834:34:2;17904:15;;;17884:18;;;17877:43;23528:44:0;;;;;;;17769:18:2;;23528:69:0;17622:304:2;11852:103:0;11455:6;;-1:-1:-1;;;;;11455:6:0;11465:10;11455:20;11447:65;;;;-1:-1:-1;;;11447:65:0;;;;;;;:::i;:::-;11926:9:::1;:22:::0;;-1:-1:-1;;;;;;11926:22:0::1;-1:-1:-1::0;;;;;11926:22:0;;;::::1;::::0;;;::::1;::::0;;11852:103::o;21945:221::-;22044:21;22088:17;:15;:17::i;:::-;-1:-1:-1;;;;;22088:48:0;;22137:14;22153:5;22088:71;;;;;;;;;;;;;;;;:::i;23866:248::-;23988:21;24032:17;:15;:17::i;:::-;:75;;-1:-1:-1;;;24032:75:0;;-1:-1:-1;;;;;18218:15:2;;;24032:75:0;;;18200:34:2;18270:15;;;18250:18;;;18243:43;18302:18;;;18295:34;;;18345:18;;;18338:34;;;24032:38:0;;;;;;;18134:19:2;;24032:75:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;24032:75:0;;;;;;;;;;;;:::i;:::-;24025:82;23866:248;-1:-1:-1;;;;;23866:248:0:o;20075:213::-;20175:14;20212:17;:15;:17::i;:::-;-1:-1:-1;;;;;20212:45:0;;20258:14;20274:6;20212:69;;;;;;;;;;;;;;;;:::i;15573:274::-;15725:3;:17;15668:15;;-1:-1:-1;;;;;15725:17:0;;;15707:35;;;;15699:68;;;;-1:-1:-1;;;15699:68:0;;15132:2:2;15699:68:0;;;15114:21:2;15171:2;15151:18;;;15144:30;-1:-1:-1;;;15190:18:2;;;15183:50;15250:18;;15699:68:0;14930:344:2;15699:68:0;15784:56;15790:14;15806:6;15814:13;15829:10;15784:5;:56::i;18035:876::-;18127:13;18150:18;18178:20;18208:16;18234:19;18263:15;18288:19;18317:15;18342;18367:12;18389:14;18424:18;18445:17;:15;:17::i;:::-;-1:-1:-1;;;;;18445:26:0;;18472:14;18488:8;18445:52;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;18424:73;;18515:5;:11;;;18507:19;;18549:5;:16;;;18536:29;;18590:5;:18;;;18575:33;;18629:5;:14;;;18618:25;;18667:5;:17;;;18653:31;;18704:5;:13;;;18694:23;;18741:5;:17;;;18727:31;;18778:5;:13;;;18768:23;;18819:5;:15;;;18813:22;;;;;;;;:::i;:::-;18801:34;;18860:5;:12;;;18854:19;;;;;;;;:::i;:::-;18845:28;;18892:5;:12;;;18883:21;;18414:497;18035:876;;;;;;;;;;;;;;:::o;23610:250::-;23733:21;23777:17;:15;:17::i;:::-;:76;;-1:-1:-1;;;23777:76:0;;-1:-1:-1;;;;;18218:15:2;;;23777:76:0;;;18200:34:2;18270:15;;;18250:18;;;18243:43;18302:18;;;18295:34;;;18345:18;;;18338:34;;;23777:39:0;;;;;;;18134:19:2;;23777:76:0;17931:447:2;14145:176:0;14261:3;:17;14218:15;;14256:58;;-1:-1:-1;;;;;14261:17:0;14280:6;14288:13;14303:10;14256:4;:58::i;17017:358::-;17170:3;:17;17100:7;;;;-1:-1:-1;;;;;17170:17:0;;;17152:35;;;;17148:197;;-1:-1:-1;;;;;;17221:15:0;;;17148:197;;;17293:41;;-1:-1:-1;;;17293:41:0;;-1:-1:-1;;;;;11472:32:2;;;17293:41:0;;;11454:51:2;17293:32:0;;;;;11427:18:2;;17293:41:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;12380:150::-;12489:13;;12474:49;;;-1:-1:-1;;;12474:49:0;;;;12440:11;;-1:-1:-1;;;;;12489:13:0;;12474:47;;:49;;;;;;;;;;;;;;12489:13;12474:49;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;12467:56;;12380:150;:::o;218:254:1:-;257:12;-1:-1:-1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;257:12:1;292:173;;;;;;;;387:42;-1:-1:-1;;;;;292:173:1;;;;;;;;;;;;;;;;;;-1:-1:-1;;;292:173:1;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;292:173:1;;;;;;;453:1;292:173;;;285:180;;218:254;:::o;478:256::-;516:12;-1:-1:-1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;516:12:1;551:176;;;;;;;;648:42;-1:-1:-1;;;;;551:176:1;;;;;;;;;;;;;;;;;;-1:-1:-1;;;551:176:1;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;551:176:1;;;;;;;714:2;551:176;;;544:183;;478:256;:::o;17381:152:0:-;17496:13;;17483:42;;;-1:-1:-1;;;17483:42:0;;;;17431:14;;-1:-1:-1;;;;;17496:13:0;;17483:40;;:42;;;;;;;;;;;;;;17496:13;17483:42;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;12800:1061::-;12939:9;;12912:7;;-1:-1:-1;;;;;12939:9:0;:23;12935:85;;12979:9;;12964:56;;-1:-1:-1;;;12964:56:0;;-1:-1:-1;;;;;17852:15:2;;;12964:56:0;;;17834:34:2;17904:15;;;17884:18;;;17877:43;12979:9:0;;;;12964:31;;17769:18:2;;12964:56:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;12935:85;13055:1;13039:13;:17;13031:54;;;;-1:-1:-1;;;13031:54:0;;20400:2:2;13031:54:0;;;20382:21:2;20439:2;20419:18;;;20412:30;-1:-1:-1;;;20458:18:2;;;20451:54;20522:18;;13031:54:0;20198:348:2;13031:54:0;13132:13;;13117:54;;-1:-1:-1;;;13117:54:0;;-1:-1:-1;;;;;11472:32:2;;;13117:54:0;;;11454:51:2;13096:18:0;;13132:13;;13117:38;;11427:18:2;;13117:54:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;13117:54:0;;;;;;;;;;;;:::i;:::-;13096:75;;13206:1;13189:5;:14;;;:18;13181:69;;;;-1:-1:-1;;;13181:69:0;;;;;;;:::i;:::-;13277:1;13268:6;:10;13260:35;;;;-1:-1:-1;;;13260:35:0;;20753:2:2;13260:35:0;;;20735:21:2;20792:2;20772:18;;;20765:30;-1:-1:-1;;;20811:18:2;;;20804:42;20863:18;;13260:35:0;20551:336:2;13260:35:0;13306:20;13329:55;13342:35;13355:13;13370:6;13342:12;:35::i;:::-;94:4:1;13329:12:0;:55::i;:::-;13434:13;;13306:78;;-1:-1:-1;13428:19:0;;:2;:19;:::i;:::-;13419:28;;:6;:28;:::i;:::-;13403:12;:44;;13395:102;;;;-1:-1:-1;;;13395:102:0;;;;;;;:::i;:::-;13540:4;:18;;13569:13;13508:89;;-1:-1:-1;;;;;13540:18:0;;;;13560:7;;13569:13;13584:12;13508:31;:89::i;:::-;13639:13;;13626:104;;-1:-1:-1;;;13626:104:0;;13608:15;;-1:-1:-1;;;;;13639:13:0;;13626:39;;:104;;13666:14;;13682:7;;13691:6;;13699:13;;13714:12;;13608:15;;13626:104;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;13608:122;;13774:7;13758:14;-1:-1:-1;;;;;13746:83:0;;13783:7;13792:13;13807:6;13815:13;13746:83;;;;;;;;;:::i;:::-;;;;;;;;13847:7;12800:1061;-1:-1:-1;;;;;;;12800:1061:0:o;14327:1240::-;14467:9;;14440:7;;-1:-1:-1;;;;;14467:9:0;:23;14463:86;;14507:9;;14492:57;;-1:-1:-1;;;14492:57:0;;-1:-1:-1;;;;;17852:15:2;;;14492:57:0;;;17834:34:2;17904:15;;;17884:18;;;17877:43;14507:9:0;;;;14492:32;;17769:18:2;;14492:57:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;14463:86;14584:1;14568:13;:17;14560:54;;;;-1:-1:-1;;;14560:54:0;;20400:2:2;14560:54:0;;;20382:21:2;20439:2;20419:18;;;20412:30;-1:-1:-1;;;20458:18:2;;;20451:54;20522:18;;14560:54:0;20198:348:2;14560:54:0;14661:13;;14646:54;;-1:-1:-1;;;14646:54:0;;-1:-1:-1;;;;;11472:32:2;;;14646:54:0;;;11454:51:2;14625:18:0;;14661:13;;14646:38;;11427:18:2;;14646:54:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;14646:54:0;;;;;;;;;;;;:::i;:::-;14625:75;;14735:1;14718:5;:14;;;:18;14710:69;;;;-1:-1:-1;;;14710:69:0;;;;;;;:::i;:::-;14806:1;14797:6;:10;14789:35;;;;-1:-1:-1;;;14789:35:0;;20753:2:2;14789:35:0;;;20735:21:2;20792:2;20772:18;;;20765:30;-1:-1:-1;;;20811:18:2;;;20804:42;20863:18;;14789:35:0;20551:336:2;14789:35:0;14835:20;14858:55;14871:35;14884:13;14899:6;14871:12;:35::i;14858:55::-;14962:13;;14835:78;;-1:-1:-1;14956:19:0;;:2;:19;:::i;:::-;14947:28;;:6;:28;:::i;:::-;14931:12;:44;;14923:102;;;;-1:-1:-1;;;14923:102:0;;;;;;;:::i;:::-;15058:3;:17;-1:-1:-1;;;;;15058:17:0;;;15040:35;;;;15036:267;;15130:13;;15099:60;;-1:-1:-1;;;;;15130:13:0;15145;15099:30;:60::i;:::-;15036:267;;;15263:13;;15206:86;;15238:14;;15254:7;;-1:-1:-1;;;;;15263:13:0;15278;15206:31;:86::i;:::-;15344:13;;;15331:104;;-1:-1:-1;;;15331:104:0;;15313:15;;-1:-1:-1;;;;;15344:13:0;;;;15331:39;;:104;;15371:14;;15387:7;;15396:6;;15404:13;;15419:12;;15331:104;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;15313:122;;15479:7;15463:14;-1:-1:-1;;;;;15451:84:0;;15488:7;15497:14;15513:6;15521:13;15451:84;;;;;;;;;:::i;4038:459::-;4096:7;4337:1;4342;4337:6;4333:45;;-1:-1:-1;4366:1:0;4359:8;;4333:45;4388:9;4400:5;4404:1;4400;:5;:::i;:::-;4388:17;-1:-1:-1;4432:1:0;4423:5;4427:1;4388:17;4423:5;:::i;:::-;:10;4415:56;;;;-1:-1:-1;;;4415:56:0;;25089:2:2;4415:56:0;;;25071:21:2;25128:2;25108:18;;;25101:30;25167:34;25147:18;;;25140:62;-1:-1:-1;;;25218:18:2;;;25211:31;25259:19;;4415:56:0;24887:397:2;4503:130:0;4561:7;4587:39;4591:1;4594;4587:39;;;;;;;;;;;;;;;;;:3;:39::i;6300:398::-;6523:51;;;-1:-1:-1;;;;;25547:15:2;;;6523:51:0;;;25529:34:2;25599:15;;;25579:18;;;25572:43;25631:18;;;;25624:34;;;6523:51:0;;;;;;;;;;25464:18:2;;;;6523:51:0;;;;;;;-1:-1:-1;;;;;6523:51:0;-1:-1:-1;;;6523:51:0;;;6512:63;;-1:-1:-1;;;;6512:10:0;;;;:63;;6523:51;6512:63;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;6476:99;;;;6593:7;:57;;;;-1:-1:-1;6605:11:0;;:16;;:44;;;6636:4;6625:24;;;;;;;;;;;;:::i;:::-;6585:106;;;;-1:-1:-1;;;6585:106:0;;26163:2:2;6585:106:0;;;26145:21:2;26202:2;26182:18;;;26175:30;26241:34;26221:18;;;26214:62;-1:-1:-1;;;26292:18:2;;;26285:34;26336:19;;6585:106:0;25961:400:2;6585:106:0;6388:310;;6300:398;;;;:::o;6704:194::-;6813:12;;;6773;6813;;;;;;;;;-1:-1:-1;;;;;6790:7:0;;;6806:5;;6790:36;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;6772:54;;;6844:7;6836:55;;;;-1:-1:-1;;;6836:55:0;;26568:2:2;6836:55:0;;;26550:21:2;26607:2;26587:18;;;26580:30;26646:34;26626:18;;;26619:62;-1:-1:-1;;;26697:18:2;;;26690:33;26740:19;;6836:55:0;26366:399:2;6836:55:0;6762:136;6704:194;;:::o;4639:272::-;4725:7;4759:12;4752:5;4744:28;;;;-1:-1:-1;;;4744:28:0;;;;;;;;:::i;:::-;-1:-1:-1;4782:9:0;4794:5;4798:1;4794;:5;:::i;14:131:2:-;-1:-1:-1;;;;;89:31:2;;79:42;;69:70;;135:1;132;125:12;69:70;14:131;:::o;150:315::-;218:6;226;279:2;267:9;258:7;254:23;250:32;247:52;;;295:1;292;285:12;247:52;334:9;321:23;353:31;378:5;353:31;:::i;:::-;403:5;455:2;440:18;;;;427:32;;-1:-1:-1;;;150:315:2:o;470:780::-;683:2;735:21;;;805:13;;708:18;;;827:22;;;654:4;;683:2;868;;886:18;;;;927:15;;;654:4;970:254;984:6;981:1;978:13;970:254;;;1043:13;;1081:9;;1069:22;;1131:11;;1125:18;1111:12;;;1104:40;1164:12;;;;1199:15;;;;1006:1;999:9;970:254;;;-1:-1:-1;1241:3:2;;470:780;-1:-1:-1;;;;;;;470:780:2:o;1255:247::-;1314:6;1367:2;1355:9;1346:7;1342:23;1338:32;1335:52;;;1383:1;1380;1373:12;1335:52;1422:9;1409:23;1441:31;1466:5;1441:31;:::i;1689:456::-;1766:6;1774;1782;1835:2;1823:9;1814:7;1810:23;1806:32;1803:52;;;1851:1;1848;1841:12;1803:52;1890:9;1877:23;1909:31;1934:5;1909:31;:::i;:::-;1959:5;-1:-1:-1;2011:2:2;1996:18;;1983:32;;-1:-1:-1;2067:2:2;2052:18;;2039:32;2080:33;2039:32;2080:33;:::i;:::-;2132:7;2122:17;;;1689:456;;;;;:::o;2342:632::-;2513:2;2565:21;;;2635:13;;2538:18;;;2657:22;;;2484:4;;2513:2;2736:15;;;;2710:2;2695:18;;;2484:4;2779:169;2793:6;2790:1;2787:13;2779:169;;;2854:13;;2842:26;;2923:15;;;;2888:12;;;;2815:1;2808:9;2779:169;;;-1:-1:-1;2965:3:2;;2342:632;-1:-1:-1;;;;;;2342:632:2:o;2979:383::-;3056:6;3064;3072;3125:2;3113:9;3104:7;3100:23;3096:32;3093:52;;;3141:1;3138;3131:12;3093:52;3180:9;3167:23;3199:31;3224:5;3199:31;:::i;:::-;3249:5;3301:2;3286:18;;3273:32;;-1:-1:-1;3352:2:2;3337:18;;;3324:32;;2979:383;-1:-1:-1;;;2979:383:2:o;3367:248::-;3435:6;3443;3496:2;3484:9;3475:7;3471:23;3467:32;3464:52;;;3512:1;3509;3502:12;3464:52;-1:-1:-1;;3535:23:2;;;3605:2;3590:18;;;3577:32;;-1:-1:-1;3367:248:2:o;3620:658::-;3791:2;3843:21;;;3913:13;;3816:18;;;3935:22;;;3762:4;;3791:2;4014:15;;;;3988:2;3973:18;;;3762:4;4057:195;4071:6;4068:1;4065:13;4057:195;;;4136:13;;-1:-1:-1;;;;;4132:39:2;4120:52;;4227:15;;;;4192:12;;;;4168:1;4086:9;4057:195;;5039:250;5124:1;5134:113;5148:6;5145:1;5142:13;5134:113;;;5224:11;;;5218:18;5205:11;;;5198:39;5170:2;5163:10;5134:113;;;-1:-1:-1;;5281:1:2;5263:16;;5256:27;5039:250::o;5294:271::-;5336:3;5374:5;5368:12;5401:6;5396:3;5389:19;5417:76;5486:6;5479:4;5474:3;5470:14;5463:4;5456:5;5452:16;5417:76;:::i;:::-;5547:2;5526:15;-1:-1:-1;;5522:29:2;5513:39;;;;5554:4;5509:50;;5294:271;-1:-1:-1;;5294:271:2:o;5570:553::-;-1:-1:-1;;;;;5823:32:2;;5805:51;;5892:3;5887:2;5872:18;;5865:31;;;-1:-1:-1;;5919:46:2;;5945:19;;5937:6;5919:46;:::i;:::-;6013:9;6005:6;6001:22;5996:2;5985:9;5981:18;5974:50;6041:33;6067:6;6059;6041:33;:::i;:::-;6033:41;;;6110:6;6105:2;6094:9;6090:18;6083:34;5570:553;;;;;;;:::o;6128:388::-;6196:6;6204;6257:2;6245:9;6236:7;6232:23;6228:32;6225:52;;;6273:1;6270;6263:12;6225:52;6312:9;6299:23;6331:31;6356:5;6331:31;:::i;:::-;6381:5;-1:-1:-1;6438:2:2;6423:18;;6410:32;6451:33;6410:32;6451:33;:::i;:::-;6503:7;6493:17;;;6128:388;;;;;:::o;6521:180::-;6580:6;6633:2;6621:9;6612:7;6608:23;6604:32;6601:52;;;6649:1;6646;6639:12;6601:52;-1:-1:-1;6672:23:2;;6521:180;-1:-1:-1;6521:180:2:o;6706:525::-;6792:6;6800;6808;6816;6869:3;6857:9;6848:7;6844:23;6840:33;6837:53;;;6886:1;6883;6876:12;6837:53;6925:9;6912:23;6944:31;6969:5;6944:31;:::i;:::-;6994:5;-1:-1:-1;7051:2:2;7036:18;;7023:32;7064:33;7023:32;7064:33;:::i;:::-;6706:525;;7116:7;;-1:-1:-1;;;;7170:2:2;7155:18;;7142:32;;7221:2;7206:18;7193:32;;6706:525::o;8178:274::-;-1:-1:-1;;;;;8370:32:2;;;;8352:51;;8434:2;8419:18;;8412:34;8340:2;8325:18;;8178:274::o;8457:127::-;8518:10;8513:3;8509:20;8506:1;8499:31;8549:4;8546:1;8539:15;8573:4;8570:1;8563:15;8589:253;8661:2;8655:9;8703:4;8691:17;;8738:18;8723:34;;8759:22;;;8720:62;8717:88;;;8785:18;;:::i;:::-;8821:2;8814:22;8589:253;:::o;8847:252::-;8919:2;8913:9;8961:3;8949:16;;8995:18;8980:34;;9016:22;;;8977:62;8974:88;;;9042:18;;:::i;9104:252::-;9176:2;9170:9;9218:3;9206:16;;9252:18;9237:34;;9273:22;;;9234:62;9231:88;;;9299:18;;:::i;9361:275::-;9432:2;9426:9;9497:2;9478:13;;-1:-1:-1;;9474:27:2;9462:40;;9532:18;9517:34;;9553:22;;;9514:62;9511:88;;;9579:18;;:::i;:::-;9615:2;9608:22;9361:275;;-1:-1:-1;9361:275:2:o;9641:183::-;9701:4;9734:18;9726:6;9723:30;9720:56;;;9756:18;;:::i;:::-;-1:-1:-1;9801:1:2;9797:14;9813:4;9793:25;;9641:183::o;9829:881::-;9924:6;9955:2;9998;9986:9;9977:7;9973:23;9969:32;9966:52;;;10014:1;10011;10004:12;9966:52;10047:9;10041:16;10080:18;10072:6;10069:30;10066:50;;;10112:1;10109;10102:12;10066:50;10135:22;;10188:4;10180:13;;10176:27;-1:-1:-1;10166:55:2;;10217:1;10214;10207:12;10166:55;10246:2;10240:9;10269:60;10285:43;10325:2;10285:43;:::i;:::-;10269:60;:::i;:::-;10363:15;;;10445:1;10441:10;;;;10433:19;;10429:28;;;10394:12;;;;10469:19;;;10466:39;;;10501:1;10498;10491:12;10466:39;10525:11;;;;10545:135;10561:6;10556:3;10553:15;10545:135;;;10627:10;;10615:23;;10578:12;;;;10658;;;;10545:135;;;10699:5;9829:881;-1:-1:-1;;;;;;;9829:881:2:o;10715:127::-;10776:10;10771:3;10767:20;10764:1;10757:31;10807:4;10804:1;10797:15;10831:4;10828:1;10821:15;10847:184;10917:6;10970:2;10958:9;10949:7;10945:23;10941:32;10938:52;;;10986:1;10983;10976:12;10938:52;-1:-1:-1;11009:16:2;;10847:184;-1:-1:-1;10847:184:2:o;11036:127::-;11097:10;11092:3;11088:20;11085:1;11078:31;11128:4;11125:1;11118:15;11152:4;11149:1;11142:15;11168:135;11207:3;11228:17;;;11225:43;;11248:18;;:::i;:::-;-1:-1:-1;11295:1:2;11284:13;;11168:135::o;11516:356::-;11718:2;11700:21;;;11737:18;;;11730:30;11796:34;11791:2;11776:18;;11769:62;11863:2;11848:18;;11516:356::o;11877:138::-;11956:13;;11978:31;11956:13;11978:31;:::i;:::-;11877:138;;;:::o;12020:510::-;12074:5;12127:3;12120:4;12112:6;12108:17;12104:27;12094:55;;12145:1;12142;12135:12;12094:55;12174:6;12168:13;12200:18;12196:2;12193:26;12190:52;;;12222:18;;:::i;:::-;12266:55;12309:2;12290:13;;-1:-1:-1;;12286:27:2;12315:4;12282:38;12266:55;:::i;:::-;12346:2;12337:7;12330:19;12392:3;12385:4;12380:2;12372:6;12368:15;12364:26;12361:35;12358:55;;;12409:1;12406;12399:12;12358:55;12422:77;12496:2;12489:4;12480:7;12476:18;12469:4;12461:6;12457:17;12422:77;:::i;12535:967::-;12628:6;12681:2;12669:9;12660:7;12656:23;12652:32;12649:52;;;12697:1;12694;12687:12;12649:52;12730:9;12724:16;12759:18;12800:2;12792:6;12789:14;12786:34;;;12816:1;12813;12806:12;12786:34;12839:22;;;;12895:4;12877:16;;;12873:27;12870:47;;;12913:1;12910;12903:12;12870:47;12939:22;;:::i;:::-;12991:2;12985:9;13003:33;13028:7;13003:33;:::i;:::-;13045:22;;13106:2;13098:11;;13092:18;13122:16;;;13119:36;;;13151:1;13148;13141:12;13119:36;13187:56;13235:7;13224:8;13220:2;13216:17;13187:56;:::i;:::-;13182:2;13175:5;13171:14;13164:80;;13283:2;13279;13275:11;13269:18;13312:2;13302:8;13299:16;13296:36;;;13328:1;13325;13318:12;13296:36;13364:56;13412:7;13401:8;13397:2;13393:17;13364:56;:::i;:::-;13359:2;13352:5;13348:14;13341:80;;13467:2;13463;13459:11;13453:18;13448:2;13441:5;13437:14;13430:42;13491:5;13481:15;;;;;12535:967;;;;:::o;13507:402::-;13709:2;13691:21;;;13748:2;13728:18;;;13721:30;13787:34;13782:2;13767:18;;13760:62;-1:-1:-1;;;13853:2:2;13838:18;;13831:36;13899:3;13884:19;;13507:402::o;14294:277::-;14361:6;14414:2;14402:9;14393:7;14389:23;14385:32;14382:52;;;14430:1;14427;14420:12;14382:52;14462:9;14456:16;14515:5;14508:13;14501:21;14494:5;14491:32;14481:60;;14537:1;14534;14527:12;15532:956;15627:6;15658:2;15701;15689:9;15680:7;15676:23;15672:32;15669:52;;;15717:1;15714;15707:12;15669:52;15750:9;15744:16;15783:18;15775:6;15772:30;15769:50;;;15815:1;15812;15805:12;15769:50;15838:22;;15891:4;15883:13;;15879:27;-1:-1:-1;15869:55:2;;15920:1;15917;15910:12;15869:55;15949:2;15943:9;15972:60;15988:43;16028:2;15988:43;:::i;15972:60::-;16066:15;;;16148:1;16144:10;;;;16136:19;;16132:28;;;16097:12;;;;16172:19;;;16169:39;;;16204:1;16201;16194:12;16169:39;16228:11;;;;16248:210;16264:6;16259:3;16256:15;16248:210;;;16337:3;16331:10;16354:31;16379:5;16354:31;:::i;:::-;16398:18;;16281:12;;;;16436;;;;16248:210;;16843:774;16935:6;16988:3;16976:9;16967:7;16963:23;16959:33;16956:53;;;17005:1;17002;16995:12;16956:53;17031:22;;:::i;:::-;17082:9;17076:16;17069:5;17062:31;17146:2;17135:9;17131:18;17125:25;17120:2;17113:5;17109:14;17102:49;17204:2;17193:9;17189:18;17183:25;17178:2;17171:5;17167:14;17160:49;17262:2;17251:9;17247:18;17241:25;17236:2;17229:5;17225:14;17218:49;17321:3;17310:9;17306:19;17300:26;17294:3;17287:5;17283:15;17276:51;17381:3;17370:9;17366:19;17360:26;17354:3;17347:5;17343:15;17336:51;17441:3;17430:9;17426:19;17420:26;17414:3;17407:5;17403:15;17396:51;17501:3;17490:9;17486:19;17480:26;17474:3;17467:5;17463:15;17456:51;17526:3;17582:2;17571:9;17567:18;17561:25;17556:2;17549:5;17545:14;17538:49;;17606:5;17596:15;;;16843:774;;;;:::o;18383:154::-;18469:13;;18511:1;18501:12;;18491:40;;18527:1;18524;18517:12;18542:156;18630:13;;18672:1;18662:12;;18652:40;;18688:1;18685;18678:12;18703:1102;18795:6;18848:3;18836:9;18827:7;18823:23;18819:33;18816:53;;;18865:1;18862;18855:12;18816:53;18891:22;;:::i;:::-;18942:9;18936:16;18929:5;18922:31;19006:2;18995:9;18991:18;18985:25;18980:2;18973:5;18969:14;18962:49;19064:2;19053:9;19049:18;19043:25;19038:2;19031:5;19027:14;19020:49;19122:2;19111:9;19107:18;19101:25;19096:2;19089:5;19085:14;19078:49;19181:3;19170:9;19166:19;19160:26;19154:3;19147:5;19143:15;19136:51;19241:3;19230:9;19226:19;19220:26;19214:3;19207:5;19203:15;19196:51;19301:3;19290:9;19286:19;19280:26;19274:3;19267:5;19263:15;19256:51;19361:3;19350:9;19346:19;19340:26;19334:3;19327:5;19323:15;19316:51;19386:3;19442:2;19431:9;19427:18;19421:25;19416:2;19409:5;19405:14;19398:49;;19466:3;19501:56;19553:2;19542:9;19538:18;19501:56;:::i;:::-;19485:14;;;19478:80;19577:3;19612:58;19651:18;;;19612:58;:::i;:::-;19596:14;;;19589:82;19690:3;19725:49;19755:18;;;19725:49;:::i;:::-;19709:14;;;19702:73;19713:5;18703:1102;-1:-1:-1;;;18703:1102:2:o;19810:127::-;19871:10;19866:3;19862:20;19859:1;19852:31;19902:4;19899:1;19892:15;19926:4;19923:1;19916:15;19942:251;20012:6;20065:2;20053:9;20044:7;20040:23;20036:32;20033:52;;;20081:1;20078;20071:12;20033:52;20113:9;20107:16;20132:31;20157:5;20132:31;:::i;20892:422::-;20981:1;21024:5;20981:1;21038:270;21059:7;21049:8;21046:21;21038:270;;;21118:4;21114:1;21110:6;21106:17;21100:4;21097:27;21094:53;;;21127:18;;:::i;:::-;21177:7;21167:8;21163:22;21160:55;;;21197:16;;;;21160:55;21276:22;;;;21236:15;;;;21038:270;;;21042:3;20892:422;;;;;:::o;21319:806::-;21368:5;21398:8;21388:80;;-1:-1:-1;21439:1:2;21453:5;;21388:80;21487:4;21477:76;;-1:-1:-1;21524:1:2;21538:5;;21477:76;21569:4;21587:1;21582:59;;;;21655:1;21650:130;;;;21562:218;;21582:59;21612:1;21603:10;;21626:5;;;21650:130;21687:3;21677:8;21674:17;21671:43;;;21694:18;;:::i;:::-;-1:-1:-1;;21750:1:2;21736:16;;21765:5;;21562:218;;21864:2;21854:8;21851:16;21845:3;21839:4;21836:13;21832:36;21826:2;21816:8;21813:16;21808:2;21802:4;21799:12;21795:35;21792:77;21789:159;;;-1:-1:-1;21901:19:2;;;21933:5;;21789:159;21980:34;22005:8;21999:4;21980:34;:::i;:::-;22050:6;22046:1;22042:6;22038:19;22029:7;22026:32;22023:58;;;22061:18;;:::i;:::-;22099:20;;21319:806;-1:-1:-1;;;21319:806:2:o;22130:131::-;22190:5;22219:36;22246:8;22240:4;22219:36;:::i;22266:168::-;22339:9;;;22370;;22387:15;;;22381:22;;22367:37;22357:71;;22408:18;;:::i;22439:409::-;22641:2;22623:21;;;22680:2;22660:18;;;22653:30;22719:34;22714:2;22699:18;;22692:62;-1:-1:-1;;;22785:2:2;22770:18;;22763:43;22838:3;22823:19;;22439:409::o;22853:608::-;-1:-1:-1;;;;;23202:15:2;;;23184:34;;23254:15;;;;23249:2;23234:18;;23227:43;23301:2;23286:18;;23279:34;;;;23344:2;23329:18;;23322:34;23387:3;23372:19;;23365:35;23449:4;23437:17;;;23164:3;23416:19;;23409:46;23133:3;23118:19;;22853:608::o;23466:581::-;-1:-1:-1;;;;;23726:32:2;;23708:51;;23695:3;23680:19;;23789:1;23778:13;;23768:144;;23834:10;23829:3;23825:20;23822:1;23815:31;23869:4;23866:1;23859:15;23897:4;23894:1;23887:15;23768:144;23948:6;23943:2;23932:9;23928:18;23921:34;23991:6;23986:2;23975:9;23971:18;23964:34;24034:6;24029:2;24018:9;24014:18;24007:34;23466:581;;;;;;;:::o;24665:217::-;24705:1;24731;24721:132;;24775:10;24770:3;24766:20;24763:1;24756:31;24810:4;24807:1;24800:15;24838:4;24835:1;24828:15;24721:132;-1:-1:-1;24867:9:2;;24665:217::o;25669:287::-;25798:3;25836:6;25830:13;25852:66;25911:6;25906:3;25899:4;25891:6;25887:17;25852:66;:::i;:::-;25934:16;;;;;25669:287;-1:-1:-1;;25669:287:2:o;26770:220::-;26919:2;26908:9;26901:21;26882:4;26939:45;26980:2;26969:9;26965:18;26957:6;26939:45;:::i

Swarm Source

ipfs://46a912d34f63a36f8db25e86d36c32d96d3d096ee16e53424ae187fec646b01e

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
[ 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.