ETH Price: $3,168.90 (-8.43%)
Gas: 3 Gwei

Contract

0x9A2Af0AbB12bee5369B180976Be01E8c80D0e7B6
 

Overview

ETH Balance

0.054662086582447182 ETH

Eth Value

$173.22 (@ $3,168.90/ETH)

Token Holdings

Transaction Hash
Method
Block
From
To
Approve203812182024-07-25 4:37:114 hrs ago1721882231IN
Empire Token: EMPIRE Token
0 ETH0.000214074.59610671
Transfer203654432024-07-22 23:46:352 days ago1721691995IN
Empire Token: EMPIRE Token
0 ETH0.000708334.2093806
Transfer203653332024-07-22 23:24:352 days ago1721690675IN
Empire Token: EMPIRE Token
0 ETH0.000796474.3152873
Transfer203638592024-07-22 18:28:352 days ago1721672915IN
Empire Token: EMPIRE Token
0 ETH0.000811235.0234105
Approve203637672024-07-22 18:09:472 days ago1721671787IN
Empire Token: EMPIRE Token
0 ETH0.000313246.72518054
Approve203637472024-07-22 18:05:472 days ago1721671547IN
Empire Token: EMPIRE Token
0 ETH0.000256775.50579473
Transfer203637402024-07-22 18:04:232 days ago1721671463IN
Empire Token: EMPIRE Token
0 ETH0.001257126.7811085
Withdraw203633642024-07-22 16:48:472 days ago1721666927IN
Empire Token: EMPIRE Token
0 ETH0.0015233611.39142479
Transfer203621442024-07-22 12:43:112 days ago1721652191IN
Empire Token: EMPIRE Token
0 ETH0.0017323310.29395289
Transfer203620862024-07-22 12:31:352 days ago1721651495IN
Empire Token: EMPIRE Token
0 ETH0.0017158410.19594938
Transfer203619112024-07-22 11:55:592 days ago1721649359IN
Empire Token: EMPIRE Token
0 ETH0.001349068.05549244
Transfer203618242024-07-22 11:38:232 days ago1721648303IN
Empire Token: EMPIRE Token
0 ETH0.001334677.23122704
Approve203617822024-07-22 11:29:592 days ago1721647799IN
Empire Token: EMPIRE Token
0 ETH0.000264655.67475004
Transfer203606312024-07-22 7:38:353 days ago1721633915IN
Empire Token: EMPIRE Token
0 ETH0.001153496.25
Transfer203576032024-07-21 21:29:473 days ago1721597387IN
Empire Token: EMPIRE Token
0 ETH0.0019311.46854032
Transfer203557702024-07-21 15:20:593 days ago1721575259IN
Empire Token: EMPIRE Token
0 ETH0.000844754.57688012
Transfer203553972024-07-21 14:05:353 days ago1721570735IN
Empire Token: EMPIRE Token
0 ETH0.00068584.24667933
Withdraw203553762024-07-21 14:01:113 days ago1721570471IN
Empire Token: EMPIRE Token
0 ETH0.000393542.94286959
Transfer203522842024-07-21 3:40:114 days ago1721533211IN
Empire Token: EMPIRE Token
0 ETH0.001507029
Transfer203522592024-07-21 3:35:114 days ago1721532911IN
Empire Token: EMPIRE Token
0 ETH0.001660819
Transfer203487242024-07-20 15:45:354 days ago1721490335IN
Empire Token: EMPIRE Token
0 ETH0.001299147.03920657
Approve203484802024-07-20 14:56:474 days ago1721487407IN
Empire Token: EMPIRE Token
0 ETH0.000244845.25
Transfer203468342024-07-20 9:25:474 days ago1721467547IN
Empire Token: EMPIRE Token
0 ETH0.000654223.54481332
Transfer203447682024-07-20 2:30:355 days ago1721442635IN
Empire Token: EMPIRE Token
0 ETH0.000857484.62568196
Transfer203447072024-07-20 2:18:115 days ago1721441891IN
Empire Token: EMPIRE Token
0 ETH0.001660929
View all transactions

Latest 25 internal transactions (View All)

Advanced mode:
Parent Transaction Hash Block From To
193434972024-03-01 23:05:11145 days ago1709334311
Empire Token: EMPIRE Token
0.00077944 ETH
193434972024-03-01 23:05:11145 days ago1709334311
Empire Token: EMPIRE Token
0.19869251 ETH
193434972024-03-01 23:05:11145 days ago1709334311
Empire Token: EMPIRE Token
0.19869251 ETH
179327822023-08-17 6:34:59343 days ago1692254099
Empire Token: EMPIRE Token
0.00240757 ETH
179327822023-08-17 6:34:59343 days ago1692254099
Empire Token: EMPIRE Token
0.5127266 ETH
179327822023-08-17 6:34:59343 days ago1692254099
Empire Token: EMPIRE Token
0.5127266 ETH
178727742023-08-08 21:07:11351 days ago1691528831
Empire Token: EMPIRE Token
0.00265765 ETH
178727742023-08-08 21:07:11351 days ago1691528831
Empire Token: EMPIRE Token
0.53704779 ETH
178727742023-08-08 21:07:11351 days ago1691528831
Empire Token: EMPIRE Token
0.53704779 ETH
178325502023-08-03 6:01:11357 days ago1691042471
Empire Token: EMPIRE Token
0.00098784 ETH
178325502023-08-03 6:01:11357 days ago1691042471
Empire Token: EMPIRE Token
0.31487417 ETH
178325502023-08-03 6:01:11357 days ago1691042471
Empire Token: EMPIRE Token
0.31487417 ETH
175989162023-07-01 11:29:35389 days ago1688210975
Empire Token: EMPIRE Token
0 ETH
173224322023-05-23 14:09:11428 days ago1684850951
Empire Token: EMPIRE Token
0.00296203 ETH
173224322023-05-23 14:09:11428 days ago1684850951
Empire Token: EMPIRE Token
0.56144584 ETH
173224322023-05-23 14:09:11428 days ago1684850951
Empire Token: EMPIRE Token
0.56144584 ETH
170235302023-04-11 7:59:23471 days ago1681199963
Empire Token: EMPIRE Token
0 ETH
170235302023-04-11 7:59:23471 days ago1681199963
Empire Token: EMPIRE Token
0 ETH
170235182023-04-11 7:56:47471 days ago1681199807
Empire Token: EMPIRE Token
0 ETH
170235182023-04-11 7:56:47471 days ago1681199807
Empire Token: EMPIRE Token
0 ETH
170228102023-04-11 5:32:23471 days ago1681191143
Empire Token: EMPIRE Token
0 ETH
170228102023-04-11 5:32:23471 days ago1681191143
Empire Token: EMPIRE Token
0 ETH
170227402023-04-11 5:18:23471 days ago1681190303
Empire Token: EMPIRE Token
0 ETH
170227402023-04-11 5:18:23471 days ago1681190303
Empire Token: EMPIRE Token
0 ETH
170227392023-04-11 5:18:11471 days ago1681190291
Empire Token: EMPIRE Token
0 ETH
View All Internal Transactions
Loading...
Loading

Contract Source Code Verified (Exact Match)

Contract Name:
EmpireToken

Compiler Version
v0.8.15+commit.e14f2714

Optimization Enabled:
Yes with 200 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity)

/**
 *Submitted for verification at Etherscan.io on 2023-02-24
*/

// File: @openzeppelin/contracts/utils/math/SafeMath.sol


// OpenZeppelin Contracts (last updated v4.6.0) (utils/math/SafeMath.sol)

pragma solidity ^0.8.0;

// CAUTION
// This version of SafeMath should only be used with Solidity 0.8 or later,
// because it relies on the compiler's built in overflow checks.

/**
 * @dev Wrappers over Solidity's arithmetic operations.
 *
 * NOTE: `SafeMath` is generally not needed starting with Solidity 0.8, since the compiler
 * now has built in overflow checking.
 */
library SafeMath {
    /**
     * @dev Returns the addition of two unsigned integers, with an overflow flag.
     *
     * _Available since v3.4._
     */
    function tryAdd(uint256 a, uint256 b) internal pure returns (bool, uint256) {
        unchecked {
            uint256 c = a + b;
            if (c < a) return (false, 0);
            return (true, c);
        }
    }

    /**
     * @dev Returns the subtraction of two unsigned integers, with an overflow flag.
     *
     * _Available since v3.4._
     */
    function trySub(uint256 a, uint256 b) internal pure returns (bool, uint256) {
        unchecked {
            if (b > a) return (false, 0);
            return (true, a - b);
        }
    }

    /**
     * @dev Returns the multiplication of two unsigned integers, with an overflow flag.
     *
     * _Available since v3.4._
     */
    function tryMul(uint256 a, uint256 b) internal pure returns (bool, uint256) {
        unchecked {
            // 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 (true, 0);
            uint256 c = a * b;
            if (c / a != b) return (false, 0);
            return (true, c);
        }
    }

    /**
     * @dev Returns the division of two unsigned integers, with a division by zero flag.
     *
     * _Available since v3.4._
     */
    function tryDiv(uint256 a, uint256 b) internal pure returns (bool, uint256) {
        unchecked {
            if (b == 0) return (false, 0);
            return (true, a / b);
        }
    }

    /**
     * @dev Returns the remainder of dividing two unsigned integers, with a division by zero flag.
     *
     * _Available since v3.4._
     */
    function tryMod(uint256 a, uint256 b) internal pure returns (bool, uint256) {
        unchecked {
            if (b == 0) return (false, 0);
            return (true, a % b);
        }
    }

    /**
     * @dev Returns the addition of two unsigned integers, reverting on
     * overflow.
     *
     * Counterpart to Solidity's `+` operator.
     *
     * Requirements:
     *
     * - Addition cannot overflow.
     */
    function add(uint256 a, uint256 b) internal pure returns (uint256) {
        return a + b;
    }

    /**
     * @dev Returns the subtraction of two unsigned integers, reverting on
     * overflow (when the result is negative).
     *
     * Counterpart to Solidity's `-` operator.
     *
     * Requirements:
     *
     * - Subtraction cannot overflow.
     */
    function sub(uint256 a, uint256 b) internal pure returns (uint256) {
        return a - b;
    }

    /**
     * @dev Returns the multiplication of two unsigned integers, reverting on
     * overflow.
     *
     * Counterpart to Solidity's `*` operator.
     *
     * Requirements:
     *
     * - Multiplication cannot overflow.
     */
    function mul(uint256 a, uint256 b) internal pure returns (uint256) {
        return a * b;
    }

    /**
     * @dev Returns the integer division of two unsigned integers, reverting on
     * division by zero. The result is rounded towards zero.
     *
     * Counterpart to Solidity's `/` operator.
     *
     * Requirements:
     *
     * - The divisor cannot be zero.
     */
    function div(uint256 a, uint256 b) internal pure returns (uint256) {
        return a / b;
    }

    /**
     * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo),
     * reverting when dividing by zero.
     *
     * Counterpart to Solidity's `%` operator. This function uses a `revert`
     * opcode (which leaves remaining gas untouched) while Solidity uses an
     * invalid opcode to revert (consuming all remaining gas).
     *
     * Requirements:
     *
     * - The divisor cannot be zero.
     */
    function mod(uint256 a, uint256 b) internal pure returns (uint256) {
        return a % b;
    }

    /**
     * @dev Returns the subtraction of two unsigned integers, reverting with custom message on
     * overflow (when the result is negative).
     *
     * CAUTION: This function is deprecated because it requires allocating memory for the error
     * message unnecessarily. For custom revert reasons use {trySub}.
     *
     * Counterpart to Solidity's `-` operator.
     *
     * Requirements:
     *
     * - Subtraction cannot overflow.
     */
    function sub(
        uint256 a,
        uint256 b,
        string memory errorMessage
    ) internal pure returns (uint256) {
        unchecked {
            require(b <= a, errorMessage);
            return a - b;
        }
    }

    /**
     * @dev Returns the integer division of two unsigned integers, reverting with custom message on
     * division by zero. The result is rounded towards zero.
     *
     * Counterpart to Solidity's `/` operator. Note: this function uses a
     * `revert` opcode (which leaves remaining gas untouched) while Solidity
     * uses an invalid opcode to revert (consuming all remaining gas).
     *
     * Requirements:
     *
     * - The divisor cannot be zero.
     */
    function div(
        uint256 a,
        uint256 b,
        string memory errorMessage
    ) internal pure returns (uint256) {
        unchecked {
            require(b > 0, errorMessage);
            return a / b;
        }
    }

    /**
     * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo),
     * reverting with custom message when dividing by zero.
     *
     * CAUTION: This function is deprecated because it requires allocating memory for the error
     * message unnecessarily. For custom revert reasons use {tryMod}.
     *
     * Counterpart to Solidity's `%` operator. This function uses a `revert`
     * opcode (which leaves remaining gas untouched) while Solidity uses an
     * invalid opcode to revert (consuming all remaining gas).
     *
     * Requirements:
     *
     * - The divisor cannot be zero.
     */
    function mod(
        uint256 a,
        uint256 b,
        string memory errorMessage
    ) internal pure returns (uint256) {
        unchecked {
            require(b > 0, errorMessage);
            return a % b;
        }
    }
}

// File: @openzeppelin/contracts/utils/Context.sol


// OpenZeppelin Contracts v4.4.1 (utils/Context.sol)

pragma solidity ^0.8.0;

/**
 * @dev Provides information about the current execution context, including the
 * sender of the transaction and its data. While these are generally available
 * via msg.sender and msg.data, they should not be accessed in such a direct
 * manner, since when dealing with meta-transactions the account sending and
 * paying for execution may not be the actual sender (as far as an application
 * is concerned).
 *
 * This contract is only required for intermediate, library-like contracts.
 */
abstract contract Context {
    function _msgSender() internal view virtual returns (address) {
        return msg.sender;
    }

    function _msgData() internal view virtual returns (bytes calldata) {
        return msg.data;
    }
}

// File: @openzeppelin/contracts/access/Ownable.sol


// OpenZeppelin Contracts (last updated v4.7.0) (access/Ownable.sol)

pragma solidity ^0.8.0;


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

    event OwnershipTransferred(address indexed previousOwner, address indexed newOwner);

    /**
     * @dev Initializes the contract setting the deployer as the initial owner.
     */
    constructor() {
        _transferOwnership(_msgSender());
    }

    /**
     * @dev Throws if called by any account other than the owner.
     */
    modifier onlyOwner() {
        _checkOwner();
        _;
    }

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

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

    /**
     * @dev Leaves the contract without owner. It will not be possible to call
     * `onlyOwner` functions anymore. Can only be called by the current owner.
     *
     * NOTE: Renouncing ownership will leave the contract without an owner,
     * thereby removing any functionality that is only available to the owner.
     */
    function renounceOwnership() public virtual onlyOwner {
        _transferOwnership(address(0));
    }

    /**
     * @dev Transfers ownership of the contract to a new account (`newOwner`).
     * Can only be called by the current owner.
     */
    function transferOwnership(address newOwner) public virtual onlyOwner {
        require(newOwner != address(0), "Ownable: new owner is the zero address");
        _transferOwnership(newOwner);
    }

    /**
     * @dev Transfers ownership of the contract to a new account (`newOwner`).
     * Internal function without access restriction.
     */
    function _transferOwnership(address newOwner) internal virtual {
        address oldOwner = _owner;
        _owner = newOwner;
        emit OwnershipTransferred(oldOwner, newOwner);
    }
}

// File: @openzeppelin/contracts/token/ERC20/IERC20.sol


// OpenZeppelin Contracts (last updated v4.6.0) (token/ERC20/IERC20.sol)

pragma solidity ^0.8.0;

/**
 * @dev Interface of the ERC20 standard as defined in the EIP.
 */
interface IERC20 {
    /**
     * @dev Emitted when `value` tokens are moved from one account (`from`) to
     * another (`to`).
     *
     * Note that `value` may be zero.
     */
    event Transfer(address indexed from, address indexed to, uint256 value);

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

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

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

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

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

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

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

// File: contracts/35_EmpireToken.sol



pragma solidity 0.8.15;







interface IUniswapV2Factory {
    function createPair(address tokenA, address tokenB)
        external
        returns (address pair);
}

interface IUniswapV2Router01 {
    function factory() external pure returns (address);

    function WETH() external pure returns (address);

    function addLiquidityETH(
        address token,
        uint256 amountTokenDesired,
        uint256 amountTokenMin,
        uint256 amountETHMin,
        address to,
        uint256 deadline
    )
        external
        payable
        returns (
            uint256 amountToken,
            uint256 amountETH,
            uint256 liquidity
        );
}

interface IUniswapV2Router02 is IUniswapV2Router01 {
    function swapExactTokensForETHSupportingFeeOnTransferTokens(
        uint256 amountIn,
        uint256 amountOutMin,
        address[] calldata path,
        address to,
        uint256 deadline
    ) external;
}

contract EmpireToken is IERC20, Ownable{
    using SafeMath for uint256;

    mapping(address => uint256) private _rOwned;
    mapping(address => uint256) private _tOwned;
    mapping(address => mapping(address => uint256)) private _allowances;

    mapping(address => bool) public automatedMarketMakerPairs;

    mapping(address => bool) private _isExcludedFromFee;

    mapping(address => bool) private _isExcluded;
    address[] private _excluded;

    struct BuyFee {
        uint256 autoLp;
        uint256 burn;
        uint256 marketing;
        uint256 tax;
        uint256 team;
    }

    struct SellFee {
        uint256 autoLp;
        uint256 burn;
        uint256 marketing;
        uint256 tax;
        uint256 team;
    }

    BuyFee public buyFee;
    SellFee public sellFee;

    uint256 private constant MAX = ~uint256(0);
    uint256 private constant _tTotal = 10**9 * 10**9;
    uint256 private _rTotal = (MAX - (MAX % _tTotal));
    uint256 private _tFeeTotal;

    string private constant _name = "Empire Token";
    string private constant _symbol = "EMPIRE";
    uint8 private constant _decimals = 9;

    uint256 public _taxFee = 0;
    uint256 public _liquidityFee = 0;
    uint256 public _burnFee = 0;
    uint256 public _marketingFee = 0;
    uint256 public _teamFee = 0;

    address public marketingWallet;
    address public immutable burnWallet;
    address public liquidityWallet;
    address public teamWallet;

    // to accommodate lock or unlock balance by bridge
    address public bridgeVault;

    IUniswapV2Router02 public uniswapV2Router;

    address public bridge;

    bool private inSwapAndLiquify;
    bool private shouldTakeFee = false;
    bool public swapAndLiquifyEnabled = true;
    bool public isTradingEnabled;

    uint256 public numTokensSellToAddToLiquidity = 8000 * 10**9;

    event LogSetAutomatedMarketMakerPair(
        address indexed setter,
        address pair,
        bool enabled
    );
    event LogSwapAndLiquify(
        uint256 tokensSwapped,
        uint256 ethReceived,
        uint256 tokensIntoLiquidity
    );
    event LogSwapAndDistribute(
        uint256 forMarketing,
        uint256 forLiquidity,
        uint256 forBurn,
        uint256 forTeam
    );
    event LogSwapAndLiquifyEnabledUpdated(address indexed setter, bool enabled);
    event LogSetBridge(address indexed setter, address bridge);
    event LogSetSwapTokensAmount(address indexed setter, uint256 amount);
    event LogSetExcludeFromFee(
        address indexed setter,
        address account,
        bool enabled
    );
    event LogTransfer(address from, address to, uint amount);
    event LogExcludeFromReward(address indexed account);
    event LogIncludeInReward(address indexed account);
    event LogFallback(address from, uint256 amount);
    event LogReceive(address from, uint256 amount);
    event LogSetEnableTrading(bool enabled);
    event LogSetMarketingWallet(
        address indexed setter,
        address marketingWallet
    );
    
    event LogSetTeamWallet(address indexed setter, address teamWallet);
    event LogSetBuyFees(address indexed setter, BuyFee buyFee);
    event LogSetSellFees(address indexed setter, SellFee sellFee);
    event LogSetRouterAddress(address indexed setter, address router);
    event LogUpdateLiquidityWallet(
        address indexed setter,
        address liquidityWallet
    );
    event LogWithdrawalETH(address indexed recipient, uint256 amount);
    event LogWithdrawToken(
        address indexed token,
        address indexed recipient,
        uint256 amount
    );
    event LogWithdrawal(address indexed recipient, uint256 tAmount);
    event LogLockByBridge(address indexed account, uint256 tAmount);
    event LogUnlockByBridge(address indexed account, uint256 tAmount);
    event LogSetBridgeVault(address setter, address _bridgeVault);
    event LogDeliver(address indexed from, uint256 tAmount);


    modifier lockTheSwap() {
        inSwapAndLiquify = true;
        _;
        inSwapAndLiquify = false;
    }

    constructor(
        address _router,
        address _marketingWallet,
        address _teamWallet,
        address _bridgeVault
    ) payable {
        _rOwned[_msgSender()] = _rTotal;
        
        require(_router!=address(0) &&  _marketingWallet!=address(0) && _teamWallet!=address(0) && _bridgeVault!=address(0), "Zero address");

        marketingWallet = _marketingWallet;
        burnWallet = address(0xdead);
        liquidityWallet = owner();
        teamWallet = _teamWallet;

        // exclude bridge Vault from receive reflection
        bridgeVault = _bridgeVault;
        _isExcluded[bridgeVault] = true;
        _excluded.push(bridgeVault);


        // exclude burn address from receive reflection
        _isExcluded[burnWallet] = true;
        _excluded.push(burnWallet);


        IUniswapV2Router02 _uniswapV2Router = IUniswapV2Router02(_router);
        // Create a uniswap pair for this new token
        address pair = IUniswapV2Factory(_uniswapV2Router.factory()).createPair(
            address(this),
            _uniswapV2Router.WETH()
        );

        setAutomatedMarketMakerPair(pair, true);

        // set the rest of the contract variables
        uniswapV2Router = _uniswapV2Router;

        _isExcludedFromFee[address(this)] = true;
        _isExcludedFromFee[owner()] = true;

        buyFee.autoLp = 4;
        buyFee.burn = 0;
        buyFee.marketing = 3;
        buyFee.tax = 2;
        buyFee.team = 1;

        sellFee.autoLp = 4;
        sellFee.burn = 0;
        sellFee.marketing = 3;
        sellFee.tax = 2;
        sellFee.team = 1;

        emit Transfer(address(0), _msgSender(), _tTotal);
    }

    function setAutomatedMarketMakerPair(address pair, bool enabled)
        public
        onlyOwner
    {   
        require(automatedMarketMakerPairs[pair] != enabled, "Pair Already Enabled");
        automatedMarketMakerPairs[pair] = enabled;

        emit LogSetAutomatedMarketMakerPair(msg.sender, pair, enabled);
    }

    function name() external view returns (string memory) {
        return _name;
    }

    function symbol() external view returns (string memory) {
        return _symbol;
    }

    function decimals() external view returns (uint8) {
        return _decimals;
    }

    function totalSupply() external view override returns (uint256) {
        return _tTotal;
    }

    /**
     * @dev because bridgeVault not receive reward
     */
    function circulatingSupply() external view returns (uint256) {
        return _tTotal.sub(_tOwned[bridgeVault]).sub(_tOwned[burnWallet]);
    }

    /**
     * @dev Returns the subtraction of two unsigned integers, reverting with custom message on
     * overflow (when the result is negative). Referenced from SafeMath library to preserve transaction integrity.
     */
    function balanceCheck(
        uint256 a,
        uint256 b,
        string memory errorMessage
    ) internal pure returns (uint256) {
        require(b <= a, errorMessage);
        uint256 c = a.sub(b);

        return c;
    }

    function balanceOf(address account) public view override returns (uint256) {
        if (_isExcluded[account]) return _tOwned[account];
        return tokenFromReflection(_rOwned[account]);
    }

    function transfer(address recipient, uint256 amount) 
        external
        override
        returns (bool)
    {

        _transfer(_msgSender(), recipient, amount);
        emit LogTransfer(_msgSender(), recipient, amount);
        return true;
    }

    function allowance(address owner, address spender)
        external
        view
        override
        returns (uint256)
    {
        return _allowances[owner][spender];
    }

    function approve(address spender, uint256 amount)
        external
        override
        returns (bool)
    {
        _approve(_msgSender(), spender, amount);
        return true;
    }

    function transferFrom(
        address sender,
        address recipient,
        uint256 amount
    ) external override returns (bool) {
        _transfer(sender, recipient, amount);
        _approve(
            sender,
            _msgSender(),
            balanceCheck(
                _allowances[sender][_msgSender()],
                amount,
                "ERC20: transfer amount exceeds allowance"
            )
        );
        return true;
    }

    function increaseAllowance(address spender, uint256 addedValue)
        external
        virtual
        returns (bool)
    {
        _approve(
            _msgSender(),
            spender,
            _allowances[_msgSender()][spender].add(addedValue)
        );
        return true;
    }

    function decreaseAllowance(address spender, uint256 subtractedValue)
        external
        virtual
        returns (bool)
    {
        _approve(
            _msgSender(),
            spender,
            balanceCheck(
                _allowances[_msgSender()][spender],
                subtractedValue,
                "ERC20: decreased allowance below zero"
            )
        );
        return true;
    }

    function isExcludedFromReward(address account)
        external
        view
        returns (bool)
    {
        return _isExcluded[account];
    }

    function totalFees() external view returns (uint256) {
        return _tFeeTotal;
    }

     // reflection by action of volunteer
    function deliver(uint256 tAmount) external {
        address sender = _msgSender();
        require(
            !_isExcluded[sender],
            "Excluded addresses cannot call this function"
        );
        (uint256 rAmount, , , , , ) = _getValues(tAmount);
        _rOwned[sender] = _rOwned[sender].sub(rAmount);
        _rTotal = _rTotal.sub(rAmount);
        _tFeeTotal = _tFeeTotal.add(tAmount);

        emit LogDeliver(msg.sender, tAmount);
    }

    function reflectionFromToken(uint256 tAmount, bool deductTransferFee)
        external
        view
        returns (uint256)
    {
        require(tAmount <= _tTotal, "Amount must be less than supply");
        if (!deductTransferFee) {
            (uint256 rAmount, , , , , ) = _getValues(tAmount);
            return rAmount;
        } else {
            (, uint256 rTransferAmount, , , , ) = _getValues(tAmount);
            return rTransferAmount;
        }
    }

    function tokenFromReflection(uint256 rAmount)
        public
        view
        returns (uint256)
    {
        require(
            rAmount <= _rTotal,
            "Amount must be less than total reflections"
        );
        uint256 currentRate = _getRate();
        return rAmount.div(currentRate);
    }

    function excludeFromReward(address account) external onlyOwner {
        require(!_isExcluded[account], "Account is already excluded");
        if (_rOwned[account] > 0) {
            _tOwned[account] = tokenFromReflection(_rOwned[account]);
        }
        _isExcluded[account] = true;
        _excluded.push(account);

        emit LogExcludeFromReward(account);
    }

    function includeInReward(address account) external onlyOwner {
        require(account != bridgeVault, "Bridge Vault can't receive reward");
        require(_isExcluded[account], "Account is already included");
        for (uint256 i = 0; i < _excluded.length; i++) {
            if (_excluded[i] == account) {
                _excluded[i] = _excluded[_excluded.length - 1];
                _tOwned[account] = 0;
                _isExcluded[account] = false;
                _excluded.pop();
                break;
            }
        }

        emit LogIncludeInReward(account);
    }

    //to receive ETH from uniswapV2Router when swapping
    receive() external payable {
        emit LogReceive(msg.sender, msg.value);
    }

    fallback() external payable {
        emit LogFallback(msg.sender, msg.value);
    }
    

    // reflection
    function _reflectFee(uint256 rFee, uint256 tFee) private {
        _rTotal = _rTotal.sub(rFee);
        _tFeeTotal = _tFeeTotal.add(tFee);
    }

    function _getValues(uint256 tAmount)
        private
        view
        returns (
            uint256,
            uint256,
            uint256,
            uint256,
            uint256,
            uint256
        )
    {
        (
            uint256 tTransferAmount,
            uint256 tFee,
            uint256 tLiquidity,
            uint256 tMarketing,
            uint256 tBurn
        ) = _getTValues(tAmount);
        (uint256 rAmount, uint256 rTransferAmount, uint256 rFee) = _getRValues(
            tAmount,
            tFee,
            tLiquidity,
            tMarketing,
            tBurn,
            _getRate()
        );
        return (
            rAmount,
            rTransferAmount,
            rFee,
            tTransferAmount,
            tFee,
            tLiquidity
        );
    }

    function _getTValues(uint256 tAmount)
        private
        view
        returns (
            uint256,
            uint256,
            uint256,
            uint256,
            uint256
        )
    {
        uint256 tFee = calculateTaxFee(tAmount);
        uint256 tLiquidity = calculateLiquidityFee(tAmount);
        uint256 tMarketing = calculateMarketingFee(tAmount);
        uint256 tBurn = calculateBurnFee(tAmount);
        uint256 tTeam = calculateTeamFee(tAmount);
        uint256 tTransferAmount = tAmount.sub(tFee).sub(tLiquidity);
        tTransferAmount = tTransferAmount.sub(tMarketing).sub(tBurn).sub(tTeam);
        return (tTransferAmount, tFee, tLiquidity, tMarketing, tBurn);
    }

    function _getRValues(
        uint256 tAmount,
        uint256 tFee,
        uint256 tLiquidity,
        uint256 tMarketing,
        uint256 tBurn,
        uint256 currentRate
    )
        private
        view
        returns (
            uint256,
            uint256,
            uint256
        )
    {
        uint256 rAmount = tAmount.mul(currentRate);
        uint256 rFee = tFee.mul(currentRate);
        uint256 rLiquidity = tLiquidity.mul(currentRate);
        uint256 rMarketing = tMarketing.mul(currentRate);
        uint256 rBurn = tBurn.mul(currentRate);
        uint256 tTeam = calculateTeamFee(tAmount);
        uint256 rTeam = tTeam.mul(currentRate);
        uint256 totalDeduction = rFee.add(rLiquidity).add(rMarketing).add(rBurn).add(rTeam);
        uint256 rTransferAmount = rAmount.sub(totalDeduction);
        return (rAmount, rTransferAmount, rFee);
    }

    function _getRate() private view returns (uint256) {
        (uint256 rSupply, uint256 tSupply) = _getCurrentSupply();
        return rSupply.div(tSupply);
    }

    function _getCurrentSupply() private view returns (uint256, uint256) {
        uint256 rSupply = _rTotal;
        uint256 tSupply = _tTotal;
        for (uint256 i = 0; i < _excluded.length; i++) {
            if (
                _rOwned[_excluded[i]] > rSupply ||
                _tOwned[_excluded[i]] > tSupply
            ) return (_rTotal, _tTotal);
            rSupply = rSupply.sub(_rOwned[_excluded[i]]);
            tSupply = tSupply.sub(_tOwned[_excluded[i]]);
        }
        if (rSupply < _rTotal.div(_tTotal)) return (_rTotal, _tTotal);
        return (rSupply, tSupply);
    }

    function _takeLiquidity(uint256 tLiquidity) private {
        uint256 currentRate = _getRate();
        uint256 rLiquidity = tLiquidity.mul(currentRate);
        _rOwned[address(this)] = _rOwned[address(this)].add(rLiquidity);
        if (_isExcluded[address(this)])
            _tOwned[address(this)] = _tOwned[address(this)].add(tLiquidity);
    }

    function _takeTeam(uint256 tTeam) private {
        uint256 currentRate = _getRate();
        uint256 rTeam = tTeam.mul(currentRate);
        _rOwned[address(this)] = _rOwned[address(this)].add(rTeam);
        if (_isExcluded[address(this)])
            _tOwned[address(this)] = _tOwned[address(this)].add(tTeam);
    }

    function _takeMarketingAndBurn(uint256 tMarketing, uint256 tBurn) private {
        uint256 currentRate = _getRate();
        uint256 rMarketing = tMarketing.mul(currentRate);
        uint256 rBurn = tBurn.mul(currentRate);
        _rOwned[address(this)] = _rOwned[address(this)].add(rBurn).add(rMarketing);
        if (_isExcluded[address(this)])
            _tOwned[address(this)] =
                _tOwned[address(this)] +
                (tMarketing + tBurn);
    }

    function calculateTaxFee(uint256 _amount) private view returns (uint256) {
        return _amount.mul(_taxFee).div(10**2);
    }

    function calculateLiquidityFee(uint256 _amount)
        private
        view
        returns (uint256)
    {
        return _amount.mul(_liquidityFee).div(10**2);
    }

    function calculateBurnFee(uint256 _amount) private view returns (uint256) {
        return _amount.mul(_burnFee).div(10**2);
    }

    function calculateMarketingFee(uint256 _amount)
        private
        view
        returns (uint256)
    {
        return _amount.mul(_marketingFee).div(10**2);
    }

    function calculateTeamFee(uint256 _amount) private view returns (uint256) {
        return _amount.mul(_teamFee).div(10**2);
    }

    function restoreAllFee() private {
        _taxFee = 0;
        _liquidityFee = 0;
        _marketingFee = 0;
        _burnFee = 0;
        _teamFee = 0;
    }

    function setBuyFee() private {
        _taxFee = buyFee.tax;
        _liquidityFee = buyFee.autoLp;
        _marketingFee = buyFee.marketing;
        _burnFee = buyFee.burn;
        _teamFee = buyFee.team;
    }

    function setSellFee() private {
        _taxFee = sellFee.tax;
        _liquidityFee = sellFee.autoLp;
        _marketingFee = sellFee.marketing;
        _burnFee = sellFee.burn;
        _teamFee = sellFee.team;
    }

    function setEnableTrading(bool enable) external onlyOwner {
        require(isTradingEnabled != enable, "Already set Enable");
        isTradingEnabled = enable;

        emit LogSetEnableTrading(isTradingEnabled);
    }

    function setBridgeVault (address _bridgeVault) external onlyOwner {
        require(_bridgeVault != address(0), "Invalid address");
        require(bridgeVault != _bridgeVault, "Already set to this value");
        bridgeVault = _bridgeVault;
        emit LogSetBridgeVault(msg.sender, bridgeVault);
    }

    function isExcludedFromFee(address account) external view returns (bool) {
        return _isExcludedFromFee[account];
    }

    function _approve(
        address owner,
        address spender,
        uint256 amount
    ) private {
        require(owner != address(0), "ERC20: approve from the zero address");
        require(spender != address(0), "ERC20: approve to the zero address");
        
        _allowances[owner][spender] = amount;
        emit Approval(owner, spender, amount);
    }

    function _transfer(
        address from,
        address to,
        uint256 amount
    ) private {
        require(from != address(0), "ERC20: transfer from the zero address");
        require(to != address(0), "ERC20: transfer to the zero address");
        require(amount > 0, "Transfer amount must be greater than zero");

        uint256 contractTokenBalance = balanceOf(address(this));
        bool overMinTokenBalance = contractTokenBalance >=
            numTokensSellToAddToLiquidity;
        if (
            overMinTokenBalance &&
            !inSwapAndLiquify &&
            !automatedMarketMakerPairs[from] &&
            swapAndLiquifyEnabled &&
            from != liquidityWallet &&
            to != liquidityWallet
        ) {
            contractTokenBalance = numTokensSellToAddToLiquidity;

            swapAndDistribute(contractTokenBalance);
        }

        //transfer amount, it will take tax, Burn, liquidity fee
        _tokenTransfer(from, to, amount);
    }

    function swapAndDistribute(uint256 contractTokenBalance)
        private
        lockTheSwap
    {
        uint256 total = buyFee.marketing
            .add(sellFee.marketing)
            .add(buyFee.autoLp)
            .add(sellFee.autoLp)
            .add(buyFee.burn)
            .add(sellFee.burn)
            .add(buyFee.team)
            .add(sellFee.team);
            
        uint256 lp = buyFee.autoLp + sellFee.autoLp;
        uint256 forLiquidity = contractTokenBalance.mul(lp).div(total);
        swapAndLiquify(forLiquidity);

        uint256 totalBurn = buyFee.burn + sellFee.burn;
        uint256 forBurn = contractTokenBalance.mul(totalBurn).div(total);
        sendToBurn(forBurn);

        uint256 marketingFee = buyFee.marketing + sellFee.marketing;
        uint256 forMarketing = contractTokenBalance.mul(marketingFee).div(total);
        sendToMarketing(forMarketing);

        uint256 teamFee = buyFee.team + sellFee.team;
        uint256 forTeam = contractTokenBalance.mul(teamFee).div(total);
        sendToTeam(forTeam);

        emit LogSwapAndDistribute(forMarketing, forLiquidity, forBurn, forTeam);
    }

    function sendToBurn(uint256 tBurn) private {
        uint256 currentRate = _getRate();
        uint256 rBurn = tBurn.mul(currentRate);

        _rOwned[burnWallet] = _rOwned[burnWallet].add(rBurn);
        _rOwned[address(this)] = _rOwned[address(this)].sub(rBurn);

        if (_isExcluded[burnWallet])
            _tOwned[burnWallet] = _tOwned[burnWallet].add(tBurn);

        if (_isExcluded[address(this)])
            _tOwned[address(this)] = _tOwned[address(this)].sub(tBurn);

        emit Transfer(address(this), burnWallet, tBurn);
    }

    function sendToTeam(uint256 tTeam) private {
        uint256 currentRate = _getRate();
        uint256 rTeam = tTeam.mul(currentRate);

        _rOwned[teamWallet] = _rOwned[teamWallet].add(rTeam);
        _rOwned[address(this)] = _rOwned[address(this)].sub(rTeam);

        if (_isExcluded[teamWallet])
            _tOwned[teamWallet] = _tOwned[teamWallet].add(tTeam);

        if (_isExcluded[address(this)])
            _tOwned[address(this)] = _tOwned[address(this)].sub(tTeam);

        emit Transfer(address(this), teamWallet, tTeam);
    }

    function sendToMarketing(uint256 tMarketing) private {
        uint256 currentRate = _getRate();
        uint256 rMarketing = tMarketing.mul(currentRate);

        _rOwned[marketingWallet] = _rOwned[marketingWallet].add(rMarketing);
        _rOwned[address(this)] = _rOwned[address(this)].sub(rMarketing);

        if (_isExcluded[marketingWallet])
            _tOwned[marketingWallet] = _tOwned[marketingWallet].add(tMarketing);

        if (_isExcluded[address(this)])
            _tOwned[address(this)] = _tOwned[address(this)].sub(tMarketing);

        emit Transfer(address(this), marketingWallet, tMarketing);
    }

    function swapAndLiquify(uint256 tokens) private {
        uint256 half = tokens.div(2);
        uint256 otherHalf = tokens.sub(half);

        uint256 initialBalance = address(this).balance;

        swapTokensForETH(half);

        uint256 newBalance = address(this).balance.sub(initialBalance);

        addLiquidity(otherHalf, newBalance);

        emit LogSwapAndLiquify(half, newBalance, otherHalf);
    }

    function swapTokensForETH(uint256 tokenAmount) private {
        address[] memory path = new address[](2);
        path[0] = address(this);
        path[1] = uniswapV2Router.WETH();

        _approve(address(this), address(uniswapV2Router), tokenAmount);

        uniswapV2Router.swapExactTokensForETHSupportingFeeOnTransferTokens(
            tokenAmount,
            0,
            path,
            address(this),
            block.timestamp
        );
    }

    function addLiquidity(uint256 tokenAmount, uint256 ethAmount) private {
        _approve(address(this), address(uniswapV2Router), tokenAmount);

        uniswapV2Router.addLiquidityETH{value: ethAmount}(
            address(this),
            tokenAmount,
            0,
            0,
            liquidityWallet,
            block.timestamp
        );
    }

    function _tokenTransfer(
        address sender,
        address recipient,
        uint256 amount
    ) private {
        if (!_isExcludedFromFee[sender] && !_isExcludedFromFee[recipient]) {
            require(isTradingEnabled, "Trading is disabled");

            if (automatedMarketMakerPairs[sender] == true) {
                shouldTakeFee = true;
                setBuyFee();
            } else if (automatedMarketMakerPairs[recipient] == true) {
                shouldTakeFee = true;
                setSellFee();
            }
        }

        if (_isExcluded[sender] && !_isExcluded[recipient]) {
            _transferFromExcluded(sender, recipient, amount);
        } else if (!_isExcluded[sender] && _isExcluded[recipient]) {
            _transferToExcluded(sender, recipient, amount);
        } else if (_isExcluded[sender] && _isExcluded[recipient]) {
            _transferBothExcluded(sender, recipient, amount);
        } else {
            _transferStandard(sender, recipient, amount);
        }

        if (shouldTakeFee == true) {
            shouldTakeFee = false;
            restoreAllFee();
        }
    }

    function _takeFee(
        address sender,
        uint256 tAmount,
        uint256 tLiquidity,
        uint256 tFee,
        uint256 rFee
    ) private {
        if (shouldTakeFee == true) {
            uint256 tMarketing = calculateMarketingFee(tAmount);
            uint256 tBurn = calculateBurnFee(tAmount);
            uint256 tTeam = calculateTeamFee(tAmount);

            _takeLiquidity(tLiquidity);
            _takeMarketingAndBurn(tMarketing, tBurn);
            _takeTeam(tTeam);
            // reflection
            _reflectFee(rFee, tFee);

            // rFee, tFee
            // `tFee` will miss Transfer event and then with the `tFee`, reflect to all token holders.
            emit Transfer(
                sender,
                address(this),
                tLiquidity + tMarketing + tBurn + tTeam
            );
        }
    }

    function _transferStandard(
        address sender,
        address recipient,
        uint256 tAmount
    ) private {
        (
            uint256 rAmount,
            uint256 rTransferAmount,
            uint256 rFee,
            uint256 tTransferAmount,
            uint256 tFee,
            uint256 tLiquidity
        ) = _getValues(tAmount);
        _rOwned[sender] = _rOwned[sender].sub(rAmount);
        _rOwned[recipient] = _rOwned[recipient].add(rTransferAmount);
        _takeFee(sender, tAmount, tLiquidity, tFee, rFee);
        emit Transfer(sender, recipient, tTransferAmount);
    }

    function _transferToExcluded(
        address sender,
        address recipient,
        uint256 tAmount
    ) private {
        (
            uint256 rAmount,
            uint256 rTransferAmount,
            uint256 rFee,
            uint256 tTransferAmount,
            uint256 tFee,
            uint256 tLiquidity
        ) = _getValues(tAmount);
        _rOwned[sender] = _rOwned[sender].sub(rAmount);
        _tOwned[recipient] = _tOwned[recipient].add(tTransferAmount);
        _rOwned[recipient] = _rOwned[recipient].add(rTransferAmount);
        _takeFee(sender, tAmount, tLiquidity, tFee, rFee);
        emit Transfer(sender, recipient, tTransferAmount);
    }

    function _transferFromExcluded(
        address sender,
        address recipient,
        uint256 tAmount
    ) private {
        (
            uint256 rAmount,
            uint256 rTransferAmount,
            uint256 rFee,
            uint256 tTransferAmount,
            uint256 tFee,
            uint256 tLiquidity
        ) = _getValues(tAmount);
        _tOwned[sender] = _tOwned[sender].sub(tAmount);
        _rOwned[sender] = _rOwned[sender].sub(rAmount);
        _rOwned[recipient] = _rOwned[recipient].add(rTransferAmount);
        _takeFee(sender, tAmount, tLiquidity, tFee, rFee);
        emit Transfer(sender, recipient, tTransferAmount);
    }

    function _transferBothExcluded(
        address sender,
        address recipient,
        uint256 tAmount
    ) private {
        (
            uint256 rAmount,
            uint256 rTransferAmount,
            uint256 rFee,
            uint256 tTransferAmount,
            uint256 tFee,
            uint256 tLiquidity
        ) = _getValues(tAmount);
        _tOwned[sender] = _tOwned[sender].sub(tAmount);
        _rOwned[sender] = _rOwned[sender].sub(rAmount);
        _tOwned[recipient] = _tOwned[recipient].add(tTransferAmount);
        _rOwned[recipient] = _rOwned[recipient].add(rTransferAmount);
        _takeFee(sender, tAmount, tLiquidity, tFee, rFee);
        emit Transfer(sender, recipient, tTransferAmount);
    }

    function setExcludeFromFee(address account, bool enabled)
        external
        onlyOwner
    {
        require(account != address(0),"Zero Address");
        require(_isExcludedFromFee[account] != enabled,"Already enabled");
        _isExcludedFromFee[account] = enabled;
        emit LogSetExcludeFromFee(msg.sender, account, enabled);
    }

    function setMarketingWallet(address newWallet) external onlyOwner {
        require(newWallet != address(0), "Zero Address");
        require(newWallet != marketingWallet, "Same Address");
        marketingWallet = newWallet;
        emit LogSetMarketingWallet(msg.sender, marketingWallet);
    }

    function setTeamWallet(address newWallet) external onlyOwner {
        require(newWallet != address(0), "Zero Address");
        require(newWallet != teamWallet, "Same Address");
        teamWallet = newWallet;
        emit LogSetTeamWallet(msg.sender, teamWallet);
    }

    function setBuyFees(
        uint256 _lp,
        uint256 _marketing,
        uint256 _burn,
        uint256 _tax,
        uint256 _team
    ) external onlyOwner {
        require(_lp + _marketing + _burn + _tax + _team <= 50, "Max total fee is 50%");
        require(!(buyFee.autoLp == _lp && buyFee.marketing == _marketing && buyFee.burn == _burn && buyFee.tax == _tax &&  buyFee.team == _team), "Nothing is changed");
        buyFee.autoLp = _lp;
        buyFee.marketing = _marketing;
        buyFee.burn = _burn;
        buyFee.tax = _tax;
        buyFee.team = _team;

        emit LogSetBuyFees(msg.sender, buyFee);
    }

    function setSellFees(
        uint256 _lp,
        uint256 _marketing,
        uint256 _burn,
        uint256 _tax,
        uint256 _team
    ) external onlyOwner {
        require(_lp + _marketing + _burn + _tax + _team <= 50, "Max total fee is 50%");
        sellFee.autoLp = _lp;
        sellFee.marketing = _marketing;
        sellFee.burn = _burn;
        sellFee.tax = _tax;
        sellFee.team = _team;

        emit LogSetSellFees(msg.sender, sellFee);
    }

    function setRouterAddress(address newRouter) external onlyOwner {
        require(newRouter != address(0), "Zero Address");
        require(newRouter != address(uniswapV2Router), "Same Address");
        uniswapV2Router = IUniswapV2Router02(newRouter);

        emit LogSetRouterAddress(msg.sender, newRouter);
    }

    function setSwapAndLiquifyEnabled(bool _enabled) external onlyOwner {
        require(_enabled != swapAndLiquifyEnabled, "Already enabled");
        swapAndLiquifyEnabled = _enabled;

        emit LogSwapAndLiquifyEnabledUpdated(msg.sender, _enabled);
    }

    function setSwapTokensAmount(uint256 amount) external onlyOwner {
        require(amount != numTokensSellToAddToLiquidity, "Same Amount");
        numTokensSellToAddToLiquidity = amount;

        emit LogSetSwapTokensAmount(msg.sender, amount);
    }

    function updateLiquidityWallet(address newLiquidityWallet)
        external
        onlyOwner
    {
        require(newLiquidityWallet != address(0), "Zero Address");
        require(newLiquidityWallet != liquidityWallet,"The liquidity wallet is already this address" );
        liquidityWallet = newLiquidityWallet;

        emit LogUpdateLiquidityWallet(msg.sender, newLiquidityWallet);
    }

    function withdrawETH(address payable recipient, uint256 amount)
        external
        onlyOwner
    {
        require(recipient != address(0), "Zero Address");
        require(amount <= (address(this)).balance, "Incufficient funds");
        recipient.transfer(amount);
        emit LogWithdrawalETH(recipient, amount);
    }

    /**
     * @notice  Should not be withdrawn scam token or this Empire token.
     *          Use `withdraw` function to withdraw this Empire token.
     */
    function withdrawToken(
        IERC20 token,
        address recipient,
        uint256 amount
    ) external onlyOwner {
        require(address(token) != address(0), "Zero Address of Token");
        require(recipient != address(0), "Zero Address of Recepient");
        require(amount <= token.balanceOf(address(this)), "Incufficient funds");
        require(token.transfer(recipient, amount), "Transfer Fail");

        emit LogWithdrawToken(address(token), recipient, amount);
    }

    /**
     * @notice  The onlyOwner will withdraw this token to `recipient`.
     */
    function withdraw(address recipient, uint256 tAmount) external onlyOwner {
        require(recipient != address(0), "Zero Address");
        require(tAmount > 0, "Withdrawal amount must be greater than zero");

        if (_isExcluded[address(this)] && !_isExcluded[recipient]) {
            _transferFromExcluded(address(this), recipient, tAmount);
        } else if (!_isExcluded[address(this)] && _isExcluded[recipient]) {
            _transferToExcluded(address(this), recipient, tAmount);
        } else if (_isExcluded[address(this)] && _isExcluded[recipient]) {
            _transferBothExcluded(address(this), recipient, tAmount);
        } else {
            _transferStandard(address(this), recipient, tAmount);
        }

        emit LogWithdrawal(recipient, tAmount);
    }

    modifier onlyBridge() {
        require(msg.sender == bridge, "Only bridge can perform this action");
        _;
    }

    function setBridge(address _bridge) external onlyOwner {
        require(_bridge != address(0), "Zero Address");
        require(bridge != _bridge, "Same Bridge!");
        bridge = _bridge;

        emit LogSetBridge(msg.sender, bridge);
    }

    /**
     * @dev need approval from account
     */
    function lock(address account, uint256 tAmount) external onlyBridge {
        require(account != address(0), "Zero address");
        require(tAmount > 0, "Lock amount must be greater than zero");
        require(tAmount <= balanceOf(account), "Incufficient funds");
        require(_allowances[account][_msgSender()] >= tAmount, "ERC20: transfer amount exceeds allowance");

        if (!_isExcluded[account]) {
            _transferToExcluded(account, bridgeVault, tAmount);
        } else {
            _transferBothExcluded(account, bridgeVault, tAmount);
        }


        emit LogLockByBridge(account, tAmount);
    }

    /**
     * @dev no need approval, because bridgeVault balance is controlled by EMPIRE
     */
    function unlock(address account, uint256 tAmount) external onlyBridge {
        require(account != address(0), "Zero address");
        require(tAmount > 0, "Unlock amount must be greater than zero");
        require(tAmount <= balanceOf(bridgeVault), "Incufficient funds");


        if (!_isExcluded[account]) {
            _transferFromExcluded(bridgeVault, account, tAmount);
        } else {
            _transferBothExcluded(bridgeVault, account, tAmount);
        }

        emit LogUnlockByBridge(account, tAmount);
    }
}

Contract Security Audit

Contract ABI

[{"inputs":[{"internalType":"address","name":"_router","type":"address"},{"internalType":"address","name":"_marketingWallet","type":"address"},{"internalType":"address","name":"_teamWallet","type":"address"},{"internalType":"address","name":"_bridgeVault","type":"address"}],"stateMutability":"payable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"spender","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":false,"internalType":"uint256","name":"tAmount","type":"uint256"}],"name":"LogDeliver","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"account","type":"address"}],"name":"LogExcludeFromReward","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"from","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"LogFallback","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"account","type":"address"}],"name":"LogIncludeInReward","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"account","type":"address"},{"indexed":false,"internalType":"uint256","name":"tAmount","type":"uint256"}],"name":"LogLockByBridge","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"from","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"LogReceive","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"setter","type":"address"},{"indexed":false,"internalType":"address","name":"pair","type":"address"},{"indexed":false,"internalType":"bool","name":"enabled","type":"bool"}],"name":"LogSetAutomatedMarketMakerPair","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"setter","type":"address"},{"indexed":false,"internalType":"address","name":"bridge","type":"address"}],"name":"LogSetBridge","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"setter","type":"address"},{"indexed":false,"internalType":"address","name":"_bridgeVault","type":"address"}],"name":"LogSetBridgeVault","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"setter","type":"address"},{"components":[{"internalType":"uint256","name":"autoLp","type":"uint256"},{"internalType":"uint256","name":"burn","type":"uint256"},{"internalType":"uint256","name":"marketing","type":"uint256"},{"internalType":"uint256","name":"tax","type":"uint256"},{"internalType":"uint256","name":"team","type":"uint256"}],"indexed":false,"internalType":"struct EmpireToken.BuyFee","name":"buyFee","type":"tuple"}],"name":"LogSetBuyFees","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"bool","name":"enabled","type":"bool"}],"name":"LogSetEnableTrading","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"setter","type":"address"},{"indexed":false,"internalType":"address","name":"account","type":"address"},{"indexed":false,"internalType":"bool","name":"enabled","type":"bool"}],"name":"LogSetExcludeFromFee","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"setter","type":"address"},{"indexed":false,"internalType":"address","name":"marketingWallet","type":"address"}],"name":"LogSetMarketingWallet","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"setter","type":"address"},{"indexed":false,"internalType":"address","name":"router","type":"address"}],"name":"LogSetRouterAddress","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"setter","type":"address"},{"components":[{"internalType":"uint256","name":"autoLp","type":"uint256"},{"internalType":"uint256","name":"burn","type":"uint256"},{"internalType":"uint256","name":"marketing","type":"uint256"},{"internalType":"uint256","name":"tax","type":"uint256"},{"internalType":"uint256","name":"team","type":"uint256"}],"indexed":false,"internalType":"struct EmpireToken.SellFee","name":"sellFee","type":"tuple"}],"name":"LogSetSellFees","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"setter","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"LogSetSwapTokensAmount","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"setter","type":"address"},{"indexed":false,"internalType":"address","name":"teamWallet","type":"address"}],"name":"LogSetTeamWallet","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"forMarketing","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"forLiquidity","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"forBurn","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"forTeam","type":"uint256"}],"name":"LogSwapAndDistribute","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"tokensSwapped","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"ethReceived","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"tokensIntoLiquidity","type":"uint256"}],"name":"LogSwapAndLiquify","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"setter","type":"address"},{"indexed":false,"internalType":"bool","name":"enabled","type":"bool"}],"name":"LogSwapAndLiquifyEnabledUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"from","type":"address"},{"indexed":false,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"LogTransfer","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"account","type":"address"},{"indexed":false,"internalType":"uint256","name":"tAmount","type":"uint256"}],"name":"LogUnlockByBridge","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"setter","type":"address"},{"indexed":false,"internalType":"address","name":"liquidityWallet","type":"address"}],"name":"LogUpdateLiquidityWallet","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"token","type":"address"},{"indexed":true,"internalType":"address","name":"recipient","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"LogWithdrawToken","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"recipient","type":"address"},{"indexed":false,"internalType":"uint256","name":"tAmount","type":"uint256"}],"name":"LogWithdrawal","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"recipient","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"LogWithdrawalETH","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Transfer","type":"event"},{"stateMutability":"payable","type":"fallback"},{"inputs":[],"name":"_burnFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"_liquidityFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"_marketingFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"_taxFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"_teamFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"spender","type":"address"}],"name":"allowance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"approve","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"automatedMarketMakerPairs","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"bridge","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"bridgeVault","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"burnWallet","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"buyFee","outputs":[{"internalType":"uint256","name":"autoLp","type":"uint256"},{"internalType":"uint256","name":"burn","type":"uint256"},{"internalType":"uint256","name":"marketing","type":"uint256"},{"internalType":"uint256","name":"tax","type":"uint256"},{"internalType":"uint256","name":"team","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"circulatingSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"decimals","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"subtractedValue","type":"uint256"}],"name":"decreaseAllowance","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tAmount","type":"uint256"}],"name":"deliver","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"excludeFromReward","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"includeInReward","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"addedValue","type":"uint256"}],"name":"increaseAllowance","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"isExcludedFromFee","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"isExcludedFromReward","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"isTradingEnabled","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"liquidityWallet","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"uint256","name":"tAmount","type":"uint256"}],"name":"lock","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"marketingWallet","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"numTokensSellToAddToLiquidity","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tAmount","type":"uint256"},{"internalType":"bool","name":"deductTransferFee","type":"bool"}],"name":"reflectionFromToken","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"sellFee","outputs":[{"internalType":"uint256","name":"autoLp","type":"uint256"},{"internalType":"uint256","name":"burn","type":"uint256"},{"internalType":"uint256","name":"marketing","type":"uint256"},{"internalType":"uint256","name":"tax","type":"uint256"},{"internalType":"uint256","name":"team","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"pair","type":"address"},{"internalType":"bool","name":"enabled","type":"bool"}],"name":"setAutomatedMarketMakerPair","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_bridge","type":"address"}],"name":"setBridge","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_bridgeVault","type":"address"}],"name":"setBridgeVault","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_lp","type":"uint256"},{"internalType":"uint256","name":"_marketing","type":"uint256"},{"internalType":"uint256","name":"_burn","type":"uint256"},{"internalType":"uint256","name":"_tax","type":"uint256"},{"internalType":"uint256","name":"_team","type":"uint256"}],"name":"setBuyFees","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"enable","type":"bool"}],"name":"setEnableTrading","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"bool","name":"enabled","type":"bool"}],"name":"setExcludeFromFee","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newWallet","type":"address"}],"name":"setMarketingWallet","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newRouter","type":"address"}],"name":"setRouterAddress","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_lp","type":"uint256"},{"internalType":"uint256","name":"_marketing","type":"uint256"},{"internalType":"uint256","name":"_burn","type":"uint256"},{"internalType":"uint256","name":"_tax","type":"uint256"},{"internalType":"uint256","name":"_team","type":"uint256"}],"name":"setSellFees","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"_enabled","type":"bool"}],"name":"setSwapAndLiquifyEnabled","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"setSwapTokensAmount","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newWallet","type":"address"}],"name":"setTeamWallet","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"swapAndLiquifyEnabled","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"teamWallet","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"rAmount","type":"uint256"}],"name":"tokenFromReflection","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalFees","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"recipient","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transfer","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"sender","type":"address"},{"internalType":"address","name":"recipient","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transferFrom","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"uniswapV2Router","outputs":[{"internalType":"contract IUniswapV2Router02","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"uint256","name":"tAmount","type":"uint256"}],"name":"unlock","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newLiquidityWallet","type":"address"}],"name":"updateLiquidityWallet","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"recipient","type":"address"},{"internalType":"uint256","name":"tAmount","type":"uint256"}],"name":"withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address payable","name":"recipient","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"withdrawETH","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"contract IERC20","name":"token","type":"address"},{"internalType":"address","name":"recipient","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"withdrawToken","outputs":[],"stateMutability":"nonpayable","type":"function"},{"stateMutability":"payable","type":"receive"}]

60a06040526200001a670de0b6b3a76400006000196200062a565b62000028906000196200064d565b60125560006014819055601581905560168190556017819055601855601e805461ffff60a81b1916600160b01b179055650746a5288000601f5560405162004bbb38819003908190833981016040819052620000849162000690565b6200008f336200049b565b601254336000908152600160205260409020556001600160a01b03841615801590620000c357506001600160a01b03831615155b8015620000d857506001600160a01b03821615155b8015620000ed57506001600160a01b03811615155b6200012e5760405162461bcd60e51b815260206004820152600c60248201526b5a65726f206164647265737360a01b60448201526064015b60405180910390fd5b601980546001600160a01b0319166001600160a01b03851617905561dead608052620001626000546001600160a01b031690565b601a80546001600160a01b039283166001600160a01b031991821617909155601b8054858416908316179055601c8054848416908316811782556000908152600660209081526040808320805460ff19908116600190811790925594546007805480840182557fa66cc928b5edb82af9bd49922954155ab7b0942694bea4ce44661d9a8736c68890810180548a16938b1693909317909255608051891680875284872080549098168417909755805492830181558552018054909516909317909355815163c45a015560e01b81529151889491939185169263c45a01559260048083019391928290030181865afa15801562000262573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620002889190620006ed565b6001600160a01b031663c9c6539630846001600160a01b031663ad5c46486040518163ffffffff1660e01b8152600401602060405180830381865afa158015620002d6573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620002fc9190620006ed565b6040516001600160e01b031960e085901b1681526001600160a01b039283166004820152911660248201526044016020604051808303816000875af11580156200034a573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620003709190620006ed565b90506200037f816001620004eb565b601d80546001600160a01b0319166001600160a01b0384161790553060009081526005602081905260408220805460ff1916600190811790915591620003cd6000546001600160a01b031690565b6001600160a01b0316815260208101919091526040016000908120805460ff1916921515929092179091556004600881905560098290556003600a8190556002600b8190556001600c819055600d93909355600e93909355600f55601091909155601155620004393390565b6001600160a01b031660006001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef670de0b6b3a76400006040516200048791815260200190565b60405180910390a350505050505062000712565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b620004f5620005cc565b6001600160a01b03821660009081526004602052604090205481151560ff909116151503620005675760405162461bcd60e51b815260206004820152601460248201527f5061697220416c726561647920456e61626c6564000000000000000000000000604482015260640162000125565b6001600160a01b038216600081815260046020908152604091829020805460ff191685151590811790915582519384529083015233917fac0b2958c680afbcacee16a4305170e8004cf74c8270ac3edd2abc61b919e8ea910160405180910390a25050565b6000546001600160a01b03163314620006285760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015260640162000125565b565b6000826200064857634e487b7160e01b600052601260045260246000fd5b500690565b6000828210156200066e57634e487b7160e01b600052601160045260246000fd5b500390565b80516001600160a01b03811681146200068b57600080fd5b919050565b60008060008060808587031215620006a757600080fd5b620006b28562000673565b9350620006c26020860162000673565b9250620006d26040860162000673565b9150620006e26060860162000673565b905092959194509250565b6000602082840312156200070057600080fd5b6200070b8262000673565b9392505050565b60805161445c6200075f6000396000818161043901528181611e5e0152818161369d015281816136e30152818161373d0152818161377f015281816137c20152613845015261445c6000f3fe6080604052600436106103905760003560e01c80635d098b38116101dc578063ac03e9f011610102578063d12a7688116100a0578063e78cea921161006f578063e78cea9214610b97578063ebcb0b7a14610bb7578063f2fde38b14610bd7578063f3fef3a314610bf7576103d0565b8063d12a768814610afb578063d469801614610b11578063dd62ed3e14610b31578063e37ba8f914610b77576103d0565b8063b92ebd5f116100dc578063b92ebd5f14610a85578063c0b0fda214610aa5578063c1cf53c414610abb578063c49b9a8014610adb576103d0565b8063ac03e9f014610a15578063af9549e014610a35578063b62496f514610a55576103d0565b80638da5cb5b1161017a5780639a7a23d6116101495780639a7a23d61461099f5780639eb942e5146109bf578063a457c2d7146109d5578063a9059cbb146109f5576103d0565b80638da5cb5b1461091d5780638dd148021461093b5780639358928b1461095b57806395d89b4114610970576103d0565b8063715018a6116101b6578063715018a61461088f57806375f0a874146108a45780637eee288d146108c457806388f82020146108e4576103d0565b80635d098b38146108395780636bc87c3a1461085957806370a082311461086f576103d0565b8063313ce567116102c15780634549b0391161025f5780634a74bb021161022e5780634a74bb021461079f57806352390c02146107c05780635342acb4146107e05780635992704414610819576103d0565b80634549b0391461071857806347062402146107385780634782f7791461075f57806347a28b791461077f576103d0565b80633b124fe71161029b5780633b124fe7146106a25780633bd5d173146106b857806341cb87fc146106d857806343e716fe146106f8576103d0565b8063313ce567146106465780633685d419146106625780633950935114610682576103d0565b80631694505e1161032e57806323b872dd1161030857806323b872dd14610597578063282d3fdf146105b75780632b14ca56146105d75780632d83811914610626576103d0565b80631694505e1461054657806318160ddd1461056657806322976e0d14610581576103d0565b806306fdde031161036a57806306fdde03146104a9578063095ea7b3146104e757806313114a9d146105075780631525ff7d14610526576103d0565b806301e33667146104055780630622874914610427578063064a59d014610478576103d0565b366103d057604080513381523460208201527f98c44cd71a4f8250380570aaf8bf1f0fd2a19bc3428a18a782e9e4d6c1928b1391015b60405180910390a1005b604080513381523460208201527fc04e16d4878a87a7d627a5fb8c387ac4a2169e45f86d1935cc739c196c8a571591016103c6565b34801561041157600080fd5b50610425610420366004613f22565b610c17565b005b34801561043357600080fd5b5061045b7f000000000000000000000000000000000000000000000000000000000000000081565b6040516001600160a01b0390911681526020015b60405180910390f35b34801561048457600080fd5b50601e5461049990600160b81b900460ff1681565b604051901515815260200161046f565b3480156104b557600080fd5b5060408051808201909152600c81526b22b6b834b932902a37b5b2b760a11b60208201525b60405161046f9190613f63565b3480156104f357600080fd5b50610499610502366004613fb8565b610e50565b34801561051357600080fd5b506013545b60405190815260200161046f565b34801561053257600080fd5b50610425610541366004613fe4565b610e67565b34801561055257600080fd5b50601d5461045b906001600160a01b031681565b34801561057257600080fd5b50670de0b6b3a7640000610518565b34801561058d57600080fd5b5061051860175481565b3480156105a357600080fd5b506104996105b2366004613f22565b610f1a565b3480156105c357600080fd5b506104256105d2366004613fb8565b610f98565b3480156105e357600080fd5b50600d54600e54600f546010546011546105fe949392919085565b604080519586526020860194909452928401919091526060830152608082015260a00161046f565b34801561063257600080fd5b50610518610641366004614001565b6111ad565b34801561065257600080fd5b506040516009815260200161046f565b34801561066e57600080fd5b5061042561067d366004613fe4565b611231565b34801561068e57600080fd5b5061049961069d366004613fb8565b611462565b3480156106ae57600080fd5b5061051860145481565b3480156106c457600080fd5b506104256106d3366004614001565b611498565b3480156106e457600080fd5b506104256106f3366004613fe4565b6115b7565b34801561070457600080fd5b50610425610713366004614001565b611663565b34801561072457600080fd5b50610518610733366004614028565b6116e1565b34801561074457600080fd5b50600854600954600a54600b54600c546105fe949392919085565b34801561076b57600080fd5b5061042561077a366004613fb8565b611774565b34801561078b57600080fd5b5061042561079a366004614058565b611835565b3480156107ab57600080fd5b50601e5461049990600160b01b900460ff1681565b3480156107cc57600080fd5b506104256107db366004613fe4565b611983565b3480156107ec57600080fd5b506104996107fb366004613fe4565b6001600160a01b031660009081526005602052604090205460ff1690565b34801561082557600080fd5b50601b5461045b906001600160a01b031681565b34801561084557600080fd5b50610425610854366004613fe4565b611ada565b34801561086557600080fd5b5061051860155481565b34801561087b57600080fd5b5061051861088a366004613fe4565b611b86565b34801561089b57600080fd5b50610425611be5565b3480156108b057600080fd5b5060195461045b906001600160a01b031681565b3480156108d057600080fd5b506104256108df366004613fb8565b611bf9565b3480156108f057600080fd5b506104996108ff366004613fe4565b6001600160a01b031660009081526006602052604090205460ff1690565b34801561092957600080fd5b506000546001600160a01b031661045b565b34801561094757600080fd5b50610425610956366004613fe4565b611d8a565b34801561096757600080fd5b50610518611e54565b34801561097c57600080fd5b50604080518082019091526006815265454d5049524560d01b60208201526104da565b3480156109ab57600080fd5b506104256109ba366004614093565b611ebe565b3480156109cb57600080fd5b5061051860185481565b3480156109e157600080fd5b506104996109f0366004613fb8565b611f8b565b348015610a0157600080fd5b50610499610a10366004613fb8565b611fda565b348015610a2157600080fd5b50601c5461045b906001600160a01b031681565b348015610a4157600080fd5b50610425610a50366004614093565b612038565b348015610a6157600080fd5b50610499610a70366004613fe4565b60046020526000908152604090205460ff1681565b348015610a9157600080fd5b50610425610aa03660046140c1565b612126565b348015610ab157600080fd5b5061051860165481565b348015610ac757600080fd5b50610425610ad6366004614058565b6121e1565b348015610ae757600080fd5b50610425610af63660046140c1565b6122a5565b348015610b0757600080fd5b50610518601f5481565b348015610b1d57600080fd5b50601a5461045b906001600160a01b031681565b348015610b3d57600080fd5b50610518610b4c3660046140de565b6001600160a01b03918216600090815260036020908152604080832093909416825291909152205490565b348015610b8357600080fd5b50610425610b92366004613fe4565b61234d565b348015610ba357600080fd5b50601e5461045b906001600160a01b031681565b348015610bc357600080fd5b50610425610bd2366004613fe4565b61243e565b348015610be357600080fd5b50610425610bf2366004613fe4565b612540565b348015610c0357600080fd5b50610425610c12366004613fb8565b6125b9565b610c1f61276d565b6001600160a01b038316610c725760405162461bcd60e51b81526020600482015260156024820152742d32b9379020b2323932b9b99037b3102a37b5b2b760591b60448201526064015b60405180910390fd5b6001600160a01b038216610cc85760405162461bcd60e51b815260206004820152601960248201527f5a65726f2041646472657373206f6620526563657069656e74000000000000006044820152606401610c69565b6040516370a0823160e01b81523060048201526001600160a01b038416906370a0823190602401602060405180830381865afa158015610d0c573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610d30919061410c565b811115610d4f5760405162461bcd60e51b8152600401610c6990614125565b60405163a9059cbb60e01b81526001600160a01b0383811660048301526024820183905284169063a9059cbb906044016020604051808303816000875af1158015610d9e573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610dc29190614151565b610dfe5760405162461bcd60e51b815260206004820152600d60248201526c151c985b9cd9995c8811985a5b609a1b6044820152606401610c69565b816001600160a01b0316836001600160a01b03167f46ae78bc7b198b8b534ca0070d125569ac5f955976841c4343223079f3abf0de83604051610e4391815260200190565b60405180910390a3505050565b6000610e5d3384846127c7565b5060015b92915050565b610e6f61276d565b6001600160a01b038116610e955760405162461bcd60e51b8152600401610c699061416e565b601b546001600160a01b0390811690821603610ec35760405162461bcd60e51b8152600401610c6990614194565b601b80546001600160a01b0319166001600160a01b03831690811790915560405190815233907f6b23cabdb8b55d4883cb406993a5f14492a2c4c86e5ce8debed487c4dc5a45e6906020015b60405180910390a250565b6000610f278484846128e3565b610f8e84336001600160a01b0387166000908152600360205260408120610f8991336001600160a01b03166001600160a01b0316815260200190815260200160002054866040518060600160405280602881526020016143ba60289139612aca565b6127c7565b5060019392505050565b601e546001600160a01b03163314610fc25760405162461bcd60e51b8152600401610c69906141ba565b6001600160a01b0382166110075760405162461bcd60e51b815260206004820152600c60248201526b5a65726f206164647265737360a01b6044820152606401610c69565b600081116110655760405162461bcd60e51b815260206004820152602560248201527f4c6f636b20616d6f756e74206d7573742062652067726561746572207468616e604482015264207a65726f60d81b6064820152608401610c69565b61106e82611b86565b81111561108d5760405162461bcd60e51b8152600401610c6990614125565b6001600160a01b03821660009081526003602090815260408083203384529091529020548111156111115760405162461bcd60e51b815260206004820152602860248201527f45524332303a207472616e7366657220616d6f756e74206578636565647320616044820152676c6c6f77616e636560c01b6064820152608401610c69565b6001600160a01b03821660009081526006602052604090205460ff1661114e57601c546111499083906001600160a01b031683612b04565b611166565b601c546111669083906001600160a01b031683612c19565b816001600160a01b03167fd67292b41a781140f5a0da0649c6028bd549f6e3335f570c31cdd202db9fc0cf826040516111a191815260200190565b60405180910390a25050565b60006012548211156112145760405162461bcd60e51b815260206004820152602a60248201527f416d6f756e74206d757374206265206c657373207468616e20746f74616c207260448201526965666c656374696f6e7360b01b6064820152608401610c69565b600061121e612c8c565b905061122a8382612caf565b9392505050565b61123961276d565b601c546001600160a01b03908116908216036112a15760405162461bcd60e51b815260206004820152602160248201527f427269646765205661756c742063616e277420726563656976652072657761726044820152601960fa1b6064820152608401610c69565b6001600160a01b03811660009081526006602052604090205460ff166113095760405162461bcd60e51b815260206004820152601b60248201527f4163636f756e7420697320616c726561647920696e636c7564656400000000006044820152606401610c69565b60005b60075481101561142a57816001600160a01b031660078281548110611333576113336141fd565b6000918252602090912001546001600160a01b031603611418576007805461135d90600190614229565b8154811061136d5761136d6141fd565b600091825260209091200154600780546001600160a01b039092169183908110611399576113996141fd565b600091825260208083209190910180546001600160a01b0319166001600160a01b039485161790559184168152600282526040808220829055600690925220805460ff1916905560078054806113f1576113f1614240565b600082815260209020810160001990810180546001600160a01b031916905501905561142a565b8061142281614256565b91505061130c565b506040516001600160a01b038216907f5f05034ac7f3d648bc123a1fa9e17b8b56758b33c45ad85f418b7125cf0b9ce590600090a250565b3360008181526003602090815260408083206001600160a01b03871684529091528120549091610e5d918590610f899086612cbb565b3360008181526006602052604090205460ff161561150d5760405162461bcd60e51b815260206004820152602c60248201527f4578636c75646564206164647265737365732063616e6e6f742063616c6c207460448201526b3434b990333ab731ba34b7b760a11b6064820152608401610c69565b600061151883612cc7565b505050506001600160a01b03841660009081526001602052604090205491925061154491905082612d23565b6001600160a01b03831660009081526001602052604090205560125461156a9082612d23565b60125560135461157a9084612cbb565b60135560405183815233907f9745995e0db679b62281d9ca9200fed9b3cc7ee9ff131b05a3fb642b5d43dcc49060200160405180910390a2505050565b6115bf61276d565b6001600160a01b0381166115e55760405162461bcd60e51b8152600401610c699061416e565b601d546001600160a01b03908116908216036116135760405162461bcd60e51b8152600401610c6990614194565b601d80546001600160a01b0319166001600160a01b03831690811790915560405190815233907fac059041d07fde13bf50242296de370c33ddecff1f8ecb4d5ae0836f1ebe365d90602001610f0f565b61166b61276d565b601f5481036116aa5760405162461bcd60e51b815260206004820152600b60248201526a14d85b5948105b5bdd5b9d60aa1b6044820152606401610c69565b601f81905560405181815233907f9dcafbd759717e12afc2978cb500b553016b707cc2c3497e2d05f528ee77796190602001610f0f565b6000670de0b6b3a764000083111561173b5760405162461bcd60e51b815260206004820152601f60248201527f416d6f756e74206d757374206265206c657373207468616e20737570706c79006044820152606401610c69565b8161175a57600061174b84612cc7565b50939550610e61945050505050565b600061176584612cc7565b50929550610e61945050505050565b61177c61276d565b6001600160a01b0382166117a25760405162461bcd60e51b8152600401610c699061416e565b30318111156117c35760405162461bcd60e51b8152600401610c6990614125565b6040516001600160a01b0383169082156108fc029083906000818181858888f193505050501580156117f9573d6000803e3d6000fd5b50816001600160a01b03167f4d8420592b5127331542602906f9907d197ec28af2dfd4daa72324bcfadcc600826040516111a191815260200190565b61183d61276d565b603281838561184c888a61426f565b611856919061426f565b611860919061426f565b61186a919061426f565b11156118af5760405162461bcd60e51b81526020600482015260146024820152734d617820746f74616c206665652069732035302560601b6044820152606401610c69565b600854851480156118c15750600a5484145b80156118ce575060095483145b80156118db5750600b5482145b80156118e85750600c5481145b1561192a5760405162461bcd60e51b8152602060048201526012602482015271139bdd1a1a5b99c81a5cc818da185b99d95960721b6044820152606401610c69565b6008858155600a8590556009849055600b839055600c82905560405133917f5ed6fe211f244075ad220436a1126097caaea93ebdab2a44c01339432c70aa2d916119749190614287565b60405180910390a25050505050565b61198b61276d565b6001600160a01b03811660009081526006602052604090205460ff16156119f45760405162461bcd60e51b815260206004820152601b60248201527f4163636f756e7420697320616c7265616479206578636c7564656400000000006044820152606401610c69565b6001600160a01b03811660009081526001602052604090205415611a4e576001600160a01b038116600090815260016020526040902054611a34906111ad565b6001600160a01b0382166000908152600260205260409020555b6001600160a01b038116600081815260066020526040808220805460ff1916600190811790915560078054918201815583527fa66cc928b5edb82af9bd49922954155ab7b0942694bea4ce44661d9a8736c6880180546001600160a01b03191684179055517f4940d2d27c97c0426162178d4249cafef4a4e9ce874280d41948dc95ef4d79759190a250565b611ae261276d565b6001600160a01b038116611b085760405162461bcd60e51b8152600401610c699061416e565b6019546001600160a01b0390811690821603611b365760405162461bcd60e51b8152600401610c6990614194565b601980546001600160a01b0319166001600160a01b03831690811790915560405190815233907f1f8c951d17767e852874d7e6bc407c7e0bcf18713d8d8bbf1b562740ca43a47490602001610f0f565b6001600160a01b03811660009081526006602052604081205460ff1615611bc357506001600160a01b031660009081526002602052604090205490565b6001600160a01b038216600090815260016020526040902054610e61906111ad565b611bed61276d565b611bf76000612d2f565b565b601e546001600160a01b03163314611c235760405162461bcd60e51b8152600401610c69906141ba565b6001600160a01b038216611c685760405162461bcd60e51b815260206004820152600c60248201526b5a65726f206164647265737360a01b6044820152606401610c69565b60008111611cc85760405162461bcd60e51b815260206004820152602760248201527f556e6c6f636b20616d6f756e74206d7573742062652067726561746572207468604482015266616e207a65726f60c81b6064820152608401610c69565b601c54611cdd906001600160a01b0316611b86565b811115611cfc5760405162461bcd60e51b8152600401610c6990614125565b6001600160a01b03821660009081526006602052604090205460ff16611d3857601c54611d33906001600160a01b03168383612d7f565b611d4f565b601c54611d4f906001600160a01b03168383612c19565b816001600160a01b03167f6910e0daf9e4cb68a38b4c1a459b879944b8eb161a86c8f354d96e5a54faf0c0826040516111a191815260200190565b611d9261276d565b6001600160a01b038116611db85760405162461bcd60e51b8152600401610c699061416e565b601e546001600160a01b03808316911603611e045760405162461bcd60e51b815260206004820152600c60248201526b53616d65204272696467652160a01b6044820152606401610c69565b601e80546001600160a01b0319166001600160a01b03831690811790915560405190815233907fd94e52c58cb5870958c05be7a6183038f705e88c54604590d15d3986cf12a2c990602001610f0f565b6001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000811660009081526002602052604080822054601c5490931682528120549091611eb991611eb390670de0b6b3a764000090612d23565b90612d23565b905090565b611ec661276d565b6001600160a01b03821660009081526004602052604090205481151560ff909116151503611f2d5760405162461bcd60e51b815260206004820152601460248201527314185a5c88105b1c9958591e48115b98589b195960621b6044820152606401610c69565b6001600160a01b038216600081815260046020908152604091829020805460ff191685151590811790915582519384529083015233917fac0b2958c680afbcacee16a4305170e8004cf74c8270ac3edd2abc61b919e8ea91016111a1565b3360008181526003602090815260408083206001600160a01b038716845282528083205481516060810190925260258083529394610e5d9490938893610f899392899261440290830139612aca565b6000611fe73384846128e3565b604080513381526001600160a01b038516602082015280820184905290517f0a85107a334eae0d22d21cdf13af0f8e8125039ec60baaa843d2c4c5b06801749181900360600190a150600192915050565b61204061276d565b6001600160a01b0382166120665760405162461bcd60e51b8152600401610c699061416e565b6001600160a01b03821660009081526005602052604090205481151560ff9091161515036120c85760405162461bcd60e51b815260206004820152600f60248201526e105b1c9958591e48195b98589b1959608a1b6044820152606401610c69565b6001600160a01b038216600081815260056020908152604091829020805460ff191685151590811790915582519384529083015233917f76f22305305903e16255cd5e7860e85c184833a5d910944a72f17fec284b8e1f91016111a1565b61212e61276d565b801515601e60179054906101000a900460ff161515036121855760405162461bcd60e51b8152602060048201526012602482015271416c72656164792073657420456e61626c6560701b6044820152606401610c69565b601e805460ff60b81b1916600160b81b8315158102919091179182905560405160ff9190920416151581527f31bb29a860273cd60e45bfd8d53a143941df649ed22e5681a416fab2500c8b12906020015b60405180910390a150565b6121e961276d565b60328183856121f8888a61426f565b612202919061426f565b61220c919061426f565b612216919061426f565b111561225b5760405162461bcd60e51b81526020600482015260146024820152734d617820746f74616c206665652069732035302560601b6044820152606401610c69565b600d858155600f859055600e8490556010839055601182905560405133917feeafcf7f0f07b512f79535e74a0088e915295e3ba562933b8a5d5dcf4b0b5354916119749190614287565b6122ad61276d565b601e54600160b01b900460ff161515811515036122fe5760405162461bcd60e51b815260206004820152600f60248201526e105b1c9958591e48195b98589b1959608a1b6044820152606401610c69565b601e8054821515600160b01b0260ff60b01b1990911617905560405133907fb318bd8ba266a5ee667ec4d0326bb4b0be9a30e8aadeaa85fef0cdeac50d723690610f0f90841515815260200190565b61235561276d565b6001600160a01b03811661237b5760405162461bcd60e51b8152600401610c699061416e565b601a546001600160a01b03908116908216036123ee5760405162461bcd60e51b815260206004820152602c60248201527f546865206c69717569646974792077616c6c657420697320616c72656164792060448201526b74686973206164647265737360a01b6064820152608401610c69565b601a80546001600160a01b0319166001600160a01b03831690811790915560405190815233907f99cf746968302d2ab01f9f9b0f5410586a666bb17b3fe690b309f5d6e16f6cd390602001610f0f565b61244661276d565b6001600160a01b03811661248e5760405162461bcd60e51b815260206004820152600f60248201526e496e76616c6964206164647265737360881b6044820152606401610c69565b601c546001600160a01b038083169116036124eb5760405162461bcd60e51b815260206004820152601960248201527f416c72656164792073657420746f20746869732076616c7565000000000000006044820152606401610c69565b601c80546001600160a01b0319166001600160a01b0383169081179091556040805133815260208101929092527fb97f7a2535e0e53d65a1db2e5691bf70f020b2a06dcc9419e93976fa79e2b4ec91016121d6565b61254861276d565b6001600160a01b0381166125ad5760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610c69565b6125b681612d2f565b50565b6125c161276d565b6001600160a01b0382166125e75760405162461bcd60e51b8152600401610c699061416e565b6000811161264b5760405162461bcd60e51b815260206004820152602b60248201527f5769746864726177616c20616d6f756e74206d7573742062652067726561746560448201526a72207468616e207a65726f60a81b6064820152608401610c69565b3060009081526006602052604090205460ff16801561268357506001600160a01b03821660009081526006602052604090205460ff16155b1561269857612693308383612d7f565b612732565b3060009081526006602052604090205460ff161580156126d057506001600160a01b03821660009081526006602052604090205460ff165b156126e057612693308383612b04565b3060009081526006602052604090205460ff16801561271757506001600160a01b03821660009081526006602052604090205460ff165b1561272757612693308383612c19565b612732308383612e21565b816001600160a01b03167fb4214c8c54fc7442f36d3682f59aebaf09358a4431835b30efb29d52cf9e1e91826040516111a191815260200190565b6000546001600160a01b03163314611bf75760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610c69565b6001600160a01b0383166128295760405162461bcd60e51b8152602060048201526024808201527f45524332303a20617070726f76652066726f6d20746865207a65726f206164646044820152637265737360e01b6064820152608401610c69565b6001600160a01b03821661288a5760405162461bcd60e51b815260206004820152602260248201527f45524332303a20617070726f766520746f20746865207a65726f206164647265604482015261737360f01b6064820152608401610c69565b6001600160a01b0383811660008181526003602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b9259101610e43565b6001600160a01b0383166129475760405162461bcd60e51b815260206004820152602560248201527f45524332303a207472616e736665722066726f6d20746865207a65726f206164604482015264647265737360d81b6064820152608401610c69565b6001600160a01b0382166129a95760405162461bcd60e51b815260206004820152602360248201527f45524332303a207472616e7366657220746f20746865207a65726f206164647260448201526265737360e81b6064820152608401610c69565b60008111612a0b5760405162461bcd60e51b815260206004820152602960248201527f5472616e7366657220616d6f756e74206d7573742062652067726561746572206044820152687468616e207a65726f60b81b6064820152608401610c69565b6000612a1630611b86565b601f5490915081108015908190612a375750601e54600160a01b900460ff16155b8015612a5c57506001600160a01b03851660009081526004602052604090205460ff16155b8015612a715750601e54600160b01b900460ff165b8015612a8b5750601a546001600160a01b03868116911614155b8015612aa55750601a546001600160a01b03858116911614155b15612ab857601f549150612ab882612e65565b612ac3858585612fdf565b5050505050565b60008184841115612aee5760405162461bcd60e51b8152600401610c699190613f63565b506000612afb8585612d23565b95945050505050565b600080600080600080612b1687612cc7565b6001600160a01b038f16600090815260016020526040902054959b50939950919750955093509150612b489087612d23565b6001600160a01b03808b16600090815260016020908152604080832094909455918b16815260029091522054612b7e9084612cbb565b6001600160a01b038916600090815260026020908152604080832093909355600190522054612bad9086612cbb565b6001600160a01b038916600090815260016020526040902055612bd38988838588613278565b876001600160a01b0316896001600160a01b03166000805160206143e283398151915285604051612c0691815260200190565b60405180910390a3505050505050505050565b600080600080600080612c2b87612cc7565b6001600160a01b038f16600090815260026020526040902054959b50939950919750955093509150612c5d9088612d23565b6001600160a01b038a16600090815260026020908152604080832093909355600190522054612b489087612d23565b6000806000612c99613330565b9092509050612ca88282612caf565b9250505090565b600061122a82846142bc565b600061122a828461426f565b6000806000806000806000806000806000612ce18c6134c8565b945094509450945094506000806000612d058f88888888612d00612c8c565b613546565b919f509d509b50969950949750929550505050505091939550919395565b600061122a8284614229565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b600080600080600080612d9187612cc7565b6001600160a01b038f16600090815260026020526040902054959b50939950919750955093509150612dc39088612d23565b6001600160a01b038a16600090815260026020908152604080832093909355600190522054612df29087612d23565b6001600160a01b03808b1660009081526001602052604080822093909355908a1681522054612bad9086612cbb565b600080600080600080612e3387612cc7565b6001600160a01b038f16600090815260016020526040902054959b50939950919750955093509150612df29087612d23565b601e805460ff60a01b1916600160a01b179055601154600c54600e54600954600d54600854600f54600a54600097612eb8979096612eb29691958795919486948593849290918391612cbb565b90612cbb565b600d54600854919250600091612ece919061426f565b90506000612ee683612ee086856135e8565b90612caf565b9050612ef1816135f4565b600e54600954600091612f039161426f565b90506000612f1585612ee088856135e8565b9050612f208161367b565b600f54600a54600091612f329161426f565b90506000612f4487612ee08a856135e8565b9050612f4f81613880565b601154600c54600091612f619161426f565b90506000612f7389612ee08c856135e8565b9050612f7e816139d3565b6040805184815260208101899052908101869052606081018290527fab43d64ef8bfe74393a308a718f49af9d2f845de3bdc8f5e3cb528b4ffec85f79060800160405180910390a15050601e805460ff60a01b191690555050505050505050565b6001600160a01b03831660009081526005602052604090205460ff1615801561302157506001600160a01b03821660009081526005602052604090205460ff16155b1561313057601e54600160b81b900460ff166130755760405162461bcd60e51b8152602060048201526013602482015272151c98591a5b99c81a5cc8191a5cd8589b1959606a1b6044820152606401610c69565b6001600160a01b03831660009081526004602052604090205460ff1615156001036130d557601e805460ff60a81b1916600160a81b1790556130d0600b54601455600854601555600a54601755600954601655600c54601855565b613130565b6001600160a01b03821660009081526004602052604090205460ff16151560010361313057601e805460ff60a81b1916600160a81b179055613130601054601455600d54601555600f54601755600e54601655601154601855565b6001600160a01b03831660009081526006602052604090205460ff16801561317157506001600160a01b03821660009081526006602052604090205460ff16155b1561318657613181838383612d7f565b613232565b6001600160a01b03831660009081526006602052604090205460ff161580156131c757506001600160a01b03821660009081526006602052604090205460ff165b156131d757613181838383612b04565b6001600160a01b03831660009081526006602052604090205460ff16801561321757506001600160a01b03821660009081526006602052604090205460ff165b1561322757613181838383612c19565b613232838383612e21565b601e54600160a81b900460ff16151560010361327357601e805460ff60a81b1916905561327360006014819055601581905560178190556016819055601855565b505050565b601e54600160a81b900460ff161515600103612ac357600061329985613b26565b905060006132a686613b42565b905060006132b387613b5e565b90506132be86613b7a565b6132c88383613c02565b6132d181613b7a565b6132db8486613caa565b306001600160a01b0389166000805160206143e28339815191528385613301888c61426f565b61330b919061426f565b613315919061426f565b60405190815260200160405180910390a35050505050505050565b6012546000908190670de0b6b3a7640000825b60075481101561348d57826001600060078481548110613365576133656141fd565b60009182526020808320909101546001600160a01b0316835282019290925260400190205411806133d057508160026000600784815481106133a9576133a96141fd565b60009182526020808320909101546001600160a01b03168352820192909252604001902054115b156133eb57505060125493670de0b6b3a76400009350915050565b6134316001600060078481548110613405576134056141fd565b60009182526020808320909101546001600160a01b031683528201929092526040019020548490612d23565b9250613479600260006007848154811061344d5761344d6141fd565b60009182526020808320909101546001600160a01b031683528201929092526040019020548390612d23565b91508061348581614256565b915050613343565b506012546134a390670de0b6b3a7640000612caf565b8210156134bf57505060125492670de0b6b3a764000092509050565b90939092509050565b6000806000806000806134da87613cce565b905060006134e788613cea565b905060006134f489613b26565b905060006135018a613b42565b9050600061350e8b613b5e565b9050600061352085611eb38e89612d23565b905061353282611eb385818589612d23565b9c959b509399509197509550919350505050565b60008080806135558a866135e8565b905060006135638a876135e8565b905060006135718a886135e8565b9050600061357f8a896135e8565b9050600061358d8a8a6135e8565b9050600061359a8f613b5e565b905060006135a8828c6135e8565b905060006135be82612eb2868189818d8d612cbb565b905060006135cc8983612d23565b989b509799509597505050505050505096509650969350505050565b600061122a82846142de565b6000613601826002612caf565b9050600061360f8383612d23565b90504761361b83613d06565b60006136274783612d23565b90506136338382613e60565b60408051858152602081018390529081018490527f9d1cc8269ebbe9c8a971dd4c72fe5f591a00d412092c504fabeacee79732ac119060600160405180910390a15050505050565b6000613685612c8c565b9050600061369383836135e8565b6001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000166000908152600160205260409020549091506136d99082612cbb565b6001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000166000908152600160205260408082209290925530815220546137259082612d23565b306000908152600160209081526040808320939093557f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316825260069052205460ff16156137f2576001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000166000908152600260205260409020546137b89084612cbb565b6001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000166000908152600260205260409020555b3060009081526006602052604090205460ff161561383557306000908152600260205260409020546138249084612d23565b306000908152600260205260409020555b6040518381526001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000169030906000805160206143e283398151915290602001610e43565b600061388a612c8c565b9050600061389883836135e8565b6019546001600160a01b03166000908152600160205260409020549091506138c09082612cbb565b6019546001600160a01b03166000908152600160205260408082209290925530815220546138ee9082612d23565b306000908152600160209081526040808320939093556019546001600160a01b0316825260069052205460ff1615613961576019546001600160a01b03166000908152600260205260409020546139459084612cbb565b6019546001600160a01b03166000908152600260205260409020555b3060009081526006602052604090205460ff16156139a457306000908152600260205260409020546139939084612d23565b306000908152600260205260409020555b6019546040518481526001600160a01b039091169030906000805160206143e283398151915290602001610e43565b60006139dd612c8c565b905060006139eb83836135e8565b601b546001600160a01b0316600090815260016020526040902054909150613a139082612cbb565b601b546001600160a01b0316600090815260016020526040808220929092553081522054613a419082612d23565b30600090815260016020908152604080832093909355601b546001600160a01b0316825260069052205460ff1615613ab457601b546001600160a01b0316600090815260026020526040902054613a989084612cbb565b601b546001600160a01b03166000908152600260205260409020555b3060009081526006602052604090205460ff1615613af75730600090815260026020526040902054613ae69084612d23565b306000908152600260205260409020555b601b546040518481526001600160a01b039091169030906000805160206143e283398151915290602001610e43565b6000610e616064612ee0601754856135e890919063ffffffff16565b6000610e616064612ee0601654856135e890919063ffffffff16565b6000610e616064612ee0601854856135e890919063ffffffff16565b6000613b84612c8c565b90506000613b9283836135e8565b30600090815260016020526040902054909150613baf9082612cbb565b3060009081526001602090815260408083209390935560069052205460ff16156132735730600090815260026020526040902054613bed9084612cbb565b30600090815260026020526040902055505050565b6000613c0c612c8c565b90506000613c1a84836135e8565b90506000613c2884846135e8565b30600090815260016020526040902054909150613c4b908390612eb29084612cbb565b3060009081526001602090815260408083209390935560069052205460ff1615612ac357613c79848661426f565b30600090815260026020526040902054613c93919061426f565b306000908152600260205260409020555050505050565b601254613cb79083612d23565b601255601354613cc79082612cbb565b6013555050565b6000610e616064612ee0601454856135e890919063ffffffff16565b6000610e616064612ee0601554856135e890919063ffffffff16565b6040805160028082526060820183526000926020830190803683370190505090503081600081518110613d3b57613d3b6141fd565b6001600160a01b03928316602091820292909201810191909152601d54604080516315ab88c960e31b81529051919093169263ad5c46489260048083019391928290030181865afa158015613d94573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613db891906142fd565b81600181518110613dcb57613dcb6141fd565b6001600160a01b039283166020918202929092010152601d54613df191309116846127c7565b601d5460405163791ac94760e01b81526001600160a01b039091169063791ac94790613e2a90859060009086903090429060040161431a565b600060405180830381600087803b158015613e4457600080fd5b505af1158015613e58573d6000803e3d6000fd5b505050505050565b601d54613e789030906001600160a01b0316846127c7565b601d54601a5460405163f305d71960e01b81523060048201526024810185905260006044820181905260648201526001600160a01b0391821660848201524260a482015291169063f305d71990839060c40160606040518083038185885af1158015613ee8573d6000803e3d6000fd5b50505050506040513d601f19601f82011682018060405250810190612ac3919061438b565b6001600160a01b03811681146125b657600080fd5b600080600060608486031215613f3757600080fd5b8335613f4281613f0d565b92506020840135613f5281613f0d565b929592945050506040919091013590565b600060208083528351808285015260005b81811015613f9057858101830151858201604001528201613f74565b81811115613fa2576000604083870101525b50601f01601f1916929092016040019392505050565b60008060408385031215613fcb57600080fd5b8235613fd681613f0d565b946020939093013593505050565b600060208284031215613ff657600080fd5b813561122a81613f0d565b60006020828403121561401357600080fd5b5035919050565b80151581146125b657600080fd5b6000806040838503121561403b57600080fd5b82359150602083013561404d8161401a565b809150509250929050565b600080600080600060a0868803121561407057600080fd5b505083359560208501359550604085013594606081013594506080013592509050565b600080604083850312156140a657600080fd5b82356140b181613f0d565b9150602083013561404d8161401a565b6000602082840312156140d357600080fd5b813561122a8161401a565b600080604083850312156140f157600080fd5b82356140fc81613f0d565b9150602083013561404d81613f0d565b60006020828403121561411e57600080fd5b5051919050565b602080825260129082015271496e63756666696369656e742066756e647360701b604082015260600190565b60006020828403121561416357600080fd5b815161122a8161401a565b6020808252600c908201526b5a65726f204164647265737360a01b604082015260600190565b6020808252600c908201526b53616d65204164647265737360a01b604082015260600190565b60208082526023908201527f4f6e6c79206272696467652063616e20706572666f726d20746869732061637460408201526234b7b760e91b606082015260800190565b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052601160045260246000fd5b60008282101561423b5761423b614213565b500390565b634e487b7160e01b600052603160045260246000fd5b60006001820161426857614268614213565b5060010190565b6000821982111561428257614282614213565b500190565b815481526001820154602082015260028201546040820152600382015460608201526004820154608082015260a08101610e61565b6000826142d957634e487b7160e01b600052601260045260246000fd5b500490565b60008160001904831182151516156142f8576142f8614213565b500290565b60006020828403121561430f57600080fd5b815161122a81613f0d565b600060a082018783526020878185015260a0604085015281875180845260c086019150828901935060005b8181101561436a5784516001600160a01b031683529383019391830191600101614345565b50506001600160a01b03969096166060850152505050608001529392505050565b6000806000606084860312156143a057600080fd5b835192506020840151915060408401519050925092509256fe45524332303a207472616e7366657220616d6f756e74206578636565647320616c6c6f77616e6365ddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef45524332303a2064656372656173656420616c6c6f77616e63652062656c6f77207a65726fa26469706673582212208b76c3abc8074058bd6eb1af9b97726ea5880cc2726e3f0ccfef8a5a2659b82164736f6c634300080f00330000000000000000000000007a250d5630b4cf539739df2c5dacb4c659f2488d000000000000000000000000ebaecbc9f43eee833feddea0a7f9b8df0d99af19000000000000000000000000ebaecbc9f43eee833feddea0a7f9b8df0d99af19000000000000000000000000343def46f3424d10df63668fe548e38ae4924644

Deployed Bytecode

0x6080604052600436106103905760003560e01c80635d098b38116101dc578063ac03e9f011610102578063d12a7688116100a0578063e78cea921161006f578063e78cea9214610b97578063ebcb0b7a14610bb7578063f2fde38b14610bd7578063f3fef3a314610bf7576103d0565b8063d12a768814610afb578063d469801614610b11578063dd62ed3e14610b31578063e37ba8f914610b77576103d0565b8063b92ebd5f116100dc578063b92ebd5f14610a85578063c0b0fda214610aa5578063c1cf53c414610abb578063c49b9a8014610adb576103d0565b8063ac03e9f014610a15578063af9549e014610a35578063b62496f514610a55576103d0565b80638da5cb5b1161017a5780639a7a23d6116101495780639a7a23d61461099f5780639eb942e5146109bf578063a457c2d7146109d5578063a9059cbb146109f5576103d0565b80638da5cb5b1461091d5780638dd148021461093b5780639358928b1461095b57806395d89b4114610970576103d0565b8063715018a6116101b6578063715018a61461088f57806375f0a874146108a45780637eee288d146108c457806388f82020146108e4576103d0565b80635d098b38146108395780636bc87c3a1461085957806370a082311461086f576103d0565b8063313ce567116102c15780634549b0391161025f5780634a74bb021161022e5780634a74bb021461079f57806352390c02146107c05780635342acb4146107e05780635992704414610819576103d0565b80634549b0391461071857806347062402146107385780634782f7791461075f57806347a28b791461077f576103d0565b80633b124fe71161029b5780633b124fe7146106a25780633bd5d173146106b857806341cb87fc146106d857806343e716fe146106f8576103d0565b8063313ce567146106465780633685d419146106625780633950935114610682576103d0565b80631694505e1161032e57806323b872dd1161030857806323b872dd14610597578063282d3fdf146105b75780632b14ca56146105d75780632d83811914610626576103d0565b80631694505e1461054657806318160ddd1461056657806322976e0d14610581576103d0565b806306fdde031161036a57806306fdde03146104a9578063095ea7b3146104e757806313114a9d146105075780631525ff7d14610526576103d0565b806301e33667146104055780630622874914610427578063064a59d014610478576103d0565b366103d057604080513381523460208201527f98c44cd71a4f8250380570aaf8bf1f0fd2a19bc3428a18a782e9e4d6c1928b1391015b60405180910390a1005b604080513381523460208201527fc04e16d4878a87a7d627a5fb8c387ac4a2169e45f86d1935cc739c196c8a571591016103c6565b34801561041157600080fd5b50610425610420366004613f22565b610c17565b005b34801561043357600080fd5b5061045b7f000000000000000000000000000000000000000000000000000000000000dead81565b6040516001600160a01b0390911681526020015b60405180910390f35b34801561048457600080fd5b50601e5461049990600160b81b900460ff1681565b604051901515815260200161046f565b3480156104b557600080fd5b5060408051808201909152600c81526b22b6b834b932902a37b5b2b760a11b60208201525b60405161046f9190613f63565b3480156104f357600080fd5b50610499610502366004613fb8565b610e50565b34801561051357600080fd5b506013545b60405190815260200161046f565b34801561053257600080fd5b50610425610541366004613fe4565b610e67565b34801561055257600080fd5b50601d5461045b906001600160a01b031681565b34801561057257600080fd5b50670de0b6b3a7640000610518565b34801561058d57600080fd5b5061051860175481565b3480156105a357600080fd5b506104996105b2366004613f22565b610f1a565b3480156105c357600080fd5b506104256105d2366004613fb8565b610f98565b3480156105e357600080fd5b50600d54600e54600f546010546011546105fe949392919085565b604080519586526020860194909452928401919091526060830152608082015260a00161046f565b34801561063257600080fd5b50610518610641366004614001565b6111ad565b34801561065257600080fd5b506040516009815260200161046f565b34801561066e57600080fd5b5061042561067d366004613fe4565b611231565b34801561068e57600080fd5b5061049961069d366004613fb8565b611462565b3480156106ae57600080fd5b5061051860145481565b3480156106c457600080fd5b506104256106d3366004614001565b611498565b3480156106e457600080fd5b506104256106f3366004613fe4565b6115b7565b34801561070457600080fd5b50610425610713366004614001565b611663565b34801561072457600080fd5b50610518610733366004614028565b6116e1565b34801561074457600080fd5b50600854600954600a54600b54600c546105fe949392919085565b34801561076b57600080fd5b5061042561077a366004613fb8565b611774565b34801561078b57600080fd5b5061042561079a366004614058565b611835565b3480156107ab57600080fd5b50601e5461049990600160b01b900460ff1681565b3480156107cc57600080fd5b506104256107db366004613fe4565b611983565b3480156107ec57600080fd5b506104996107fb366004613fe4565b6001600160a01b031660009081526005602052604090205460ff1690565b34801561082557600080fd5b50601b5461045b906001600160a01b031681565b34801561084557600080fd5b50610425610854366004613fe4565b611ada565b34801561086557600080fd5b5061051860155481565b34801561087b57600080fd5b5061051861088a366004613fe4565b611b86565b34801561089b57600080fd5b50610425611be5565b3480156108b057600080fd5b5060195461045b906001600160a01b031681565b3480156108d057600080fd5b506104256108df366004613fb8565b611bf9565b3480156108f057600080fd5b506104996108ff366004613fe4565b6001600160a01b031660009081526006602052604090205460ff1690565b34801561092957600080fd5b506000546001600160a01b031661045b565b34801561094757600080fd5b50610425610956366004613fe4565b611d8a565b34801561096757600080fd5b50610518611e54565b34801561097c57600080fd5b50604080518082019091526006815265454d5049524560d01b60208201526104da565b3480156109ab57600080fd5b506104256109ba366004614093565b611ebe565b3480156109cb57600080fd5b5061051860185481565b3480156109e157600080fd5b506104996109f0366004613fb8565b611f8b565b348015610a0157600080fd5b50610499610a10366004613fb8565b611fda565b348015610a2157600080fd5b50601c5461045b906001600160a01b031681565b348015610a4157600080fd5b50610425610a50366004614093565b612038565b348015610a6157600080fd5b50610499610a70366004613fe4565b60046020526000908152604090205460ff1681565b348015610a9157600080fd5b50610425610aa03660046140c1565b612126565b348015610ab157600080fd5b5061051860165481565b348015610ac757600080fd5b50610425610ad6366004614058565b6121e1565b348015610ae757600080fd5b50610425610af63660046140c1565b6122a5565b348015610b0757600080fd5b50610518601f5481565b348015610b1d57600080fd5b50601a5461045b906001600160a01b031681565b348015610b3d57600080fd5b50610518610b4c3660046140de565b6001600160a01b03918216600090815260036020908152604080832093909416825291909152205490565b348015610b8357600080fd5b50610425610b92366004613fe4565b61234d565b348015610ba357600080fd5b50601e5461045b906001600160a01b031681565b348015610bc357600080fd5b50610425610bd2366004613fe4565b61243e565b348015610be357600080fd5b50610425610bf2366004613fe4565b612540565b348015610c0357600080fd5b50610425610c12366004613fb8565b6125b9565b610c1f61276d565b6001600160a01b038316610c725760405162461bcd60e51b81526020600482015260156024820152742d32b9379020b2323932b9b99037b3102a37b5b2b760591b60448201526064015b60405180910390fd5b6001600160a01b038216610cc85760405162461bcd60e51b815260206004820152601960248201527f5a65726f2041646472657373206f6620526563657069656e74000000000000006044820152606401610c69565b6040516370a0823160e01b81523060048201526001600160a01b038416906370a0823190602401602060405180830381865afa158015610d0c573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610d30919061410c565b811115610d4f5760405162461bcd60e51b8152600401610c6990614125565b60405163a9059cbb60e01b81526001600160a01b0383811660048301526024820183905284169063a9059cbb906044016020604051808303816000875af1158015610d9e573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610dc29190614151565b610dfe5760405162461bcd60e51b815260206004820152600d60248201526c151c985b9cd9995c8811985a5b609a1b6044820152606401610c69565b816001600160a01b0316836001600160a01b03167f46ae78bc7b198b8b534ca0070d125569ac5f955976841c4343223079f3abf0de83604051610e4391815260200190565b60405180910390a3505050565b6000610e5d3384846127c7565b5060015b92915050565b610e6f61276d565b6001600160a01b038116610e955760405162461bcd60e51b8152600401610c699061416e565b601b546001600160a01b0390811690821603610ec35760405162461bcd60e51b8152600401610c6990614194565b601b80546001600160a01b0319166001600160a01b03831690811790915560405190815233907f6b23cabdb8b55d4883cb406993a5f14492a2c4c86e5ce8debed487c4dc5a45e6906020015b60405180910390a250565b6000610f278484846128e3565b610f8e84336001600160a01b0387166000908152600360205260408120610f8991336001600160a01b03166001600160a01b0316815260200190815260200160002054866040518060600160405280602881526020016143ba60289139612aca565b6127c7565b5060019392505050565b601e546001600160a01b03163314610fc25760405162461bcd60e51b8152600401610c69906141ba565b6001600160a01b0382166110075760405162461bcd60e51b815260206004820152600c60248201526b5a65726f206164647265737360a01b6044820152606401610c69565b600081116110655760405162461bcd60e51b815260206004820152602560248201527f4c6f636b20616d6f756e74206d7573742062652067726561746572207468616e604482015264207a65726f60d81b6064820152608401610c69565b61106e82611b86565b81111561108d5760405162461bcd60e51b8152600401610c6990614125565b6001600160a01b03821660009081526003602090815260408083203384529091529020548111156111115760405162461bcd60e51b815260206004820152602860248201527f45524332303a207472616e7366657220616d6f756e74206578636565647320616044820152676c6c6f77616e636560c01b6064820152608401610c69565b6001600160a01b03821660009081526006602052604090205460ff1661114e57601c546111499083906001600160a01b031683612b04565b611166565b601c546111669083906001600160a01b031683612c19565b816001600160a01b03167fd67292b41a781140f5a0da0649c6028bd549f6e3335f570c31cdd202db9fc0cf826040516111a191815260200190565b60405180910390a25050565b60006012548211156112145760405162461bcd60e51b815260206004820152602a60248201527f416d6f756e74206d757374206265206c657373207468616e20746f74616c207260448201526965666c656374696f6e7360b01b6064820152608401610c69565b600061121e612c8c565b905061122a8382612caf565b9392505050565b61123961276d565b601c546001600160a01b03908116908216036112a15760405162461bcd60e51b815260206004820152602160248201527f427269646765205661756c742063616e277420726563656976652072657761726044820152601960fa1b6064820152608401610c69565b6001600160a01b03811660009081526006602052604090205460ff166113095760405162461bcd60e51b815260206004820152601b60248201527f4163636f756e7420697320616c726561647920696e636c7564656400000000006044820152606401610c69565b60005b60075481101561142a57816001600160a01b031660078281548110611333576113336141fd565b6000918252602090912001546001600160a01b031603611418576007805461135d90600190614229565b8154811061136d5761136d6141fd565b600091825260209091200154600780546001600160a01b039092169183908110611399576113996141fd565b600091825260208083209190910180546001600160a01b0319166001600160a01b039485161790559184168152600282526040808220829055600690925220805460ff1916905560078054806113f1576113f1614240565b600082815260209020810160001990810180546001600160a01b031916905501905561142a565b8061142281614256565b91505061130c565b506040516001600160a01b038216907f5f05034ac7f3d648bc123a1fa9e17b8b56758b33c45ad85f418b7125cf0b9ce590600090a250565b3360008181526003602090815260408083206001600160a01b03871684529091528120549091610e5d918590610f899086612cbb565b3360008181526006602052604090205460ff161561150d5760405162461bcd60e51b815260206004820152602c60248201527f4578636c75646564206164647265737365732063616e6e6f742063616c6c207460448201526b3434b990333ab731ba34b7b760a11b6064820152608401610c69565b600061151883612cc7565b505050506001600160a01b03841660009081526001602052604090205491925061154491905082612d23565b6001600160a01b03831660009081526001602052604090205560125461156a9082612d23565b60125560135461157a9084612cbb565b60135560405183815233907f9745995e0db679b62281d9ca9200fed9b3cc7ee9ff131b05a3fb642b5d43dcc49060200160405180910390a2505050565b6115bf61276d565b6001600160a01b0381166115e55760405162461bcd60e51b8152600401610c699061416e565b601d546001600160a01b03908116908216036116135760405162461bcd60e51b8152600401610c6990614194565b601d80546001600160a01b0319166001600160a01b03831690811790915560405190815233907fac059041d07fde13bf50242296de370c33ddecff1f8ecb4d5ae0836f1ebe365d90602001610f0f565b61166b61276d565b601f5481036116aa5760405162461bcd60e51b815260206004820152600b60248201526a14d85b5948105b5bdd5b9d60aa1b6044820152606401610c69565b601f81905560405181815233907f9dcafbd759717e12afc2978cb500b553016b707cc2c3497e2d05f528ee77796190602001610f0f565b6000670de0b6b3a764000083111561173b5760405162461bcd60e51b815260206004820152601f60248201527f416d6f756e74206d757374206265206c657373207468616e20737570706c79006044820152606401610c69565b8161175a57600061174b84612cc7565b50939550610e61945050505050565b600061176584612cc7565b50929550610e61945050505050565b61177c61276d565b6001600160a01b0382166117a25760405162461bcd60e51b8152600401610c699061416e565b30318111156117c35760405162461bcd60e51b8152600401610c6990614125565b6040516001600160a01b0383169082156108fc029083906000818181858888f193505050501580156117f9573d6000803e3d6000fd5b50816001600160a01b03167f4d8420592b5127331542602906f9907d197ec28af2dfd4daa72324bcfadcc600826040516111a191815260200190565b61183d61276d565b603281838561184c888a61426f565b611856919061426f565b611860919061426f565b61186a919061426f565b11156118af5760405162461bcd60e51b81526020600482015260146024820152734d617820746f74616c206665652069732035302560601b6044820152606401610c69565b600854851480156118c15750600a5484145b80156118ce575060095483145b80156118db5750600b5482145b80156118e85750600c5481145b1561192a5760405162461bcd60e51b8152602060048201526012602482015271139bdd1a1a5b99c81a5cc818da185b99d95960721b6044820152606401610c69565b6008858155600a8590556009849055600b839055600c82905560405133917f5ed6fe211f244075ad220436a1126097caaea93ebdab2a44c01339432c70aa2d916119749190614287565b60405180910390a25050505050565b61198b61276d565b6001600160a01b03811660009081526006602052604090205460ff16156119f45760405162461bcd60e51b815260206004820152601b60248201527f4163636f756e7420697320616c7265616479206578636c7564656400000000006044820152606401610c69565b6001600160a01b03811660009081526001602052604090205415611a4e576001600160a01b038116600090815260016020526040902054611a34906111ad565b6001600160a01b0382166000908152600260205260409020555b6001600160a01b038116600081815260066020526040808220805460ff1916600190811790915560078054918201815583527fa66cc928b5edb82af9bd49922954155ab7b0942694bea4ce44661d9a8736c6880180546001600160a01b03191684179055517f4940d2d27c97c0426162178d4249cafef4a4e9ce874280d41948dc95ef4d79759190a250565b611ae261276d565b6001600160a01b038116611b085760405162461bcd60e51b8152600401610c699061416e565b6019546001600160a01b0390811690821603611b365760405162461bcd60e51b8152600401610c6990614194565b601980546001600160a01b0319166001600160a01b03831690811790915560405190815233907f1f8c951d17767e852874d7e6bc407c7e0bcf18713d8d8bbf1b562740ca43a47490602001610f0f565b6001600160a01b03811660009081526006602052604081205460ff1615611bc357506001600160a01b031660009081526002602052604090205490565b6001600160a01b038216600090815260016020526040902054610e61906111ad565b611bed61276d565b611bf76000612d2f565b565b601e546001600160a01b03163314611c235760405162461bcd60e51b8152600401610c69906141ba565b6001600160a01b038216611c685760405162461bcd60e51b815260206004820152600c60248201526b5a65726f206164647265737360a01b6044820152606401610c69565b60008111611cc85760405162461bcd60e51b815260206004820152602760248201527f556e6c6f636b20616d6f756e74206d7573742062652067726561746572207468604482015266616e207a65726f60c81b6064820152608401610c69565b601c54611cdd906001600160a01b0316611b86565b811115611cfc5760405162461bcd60e51b8152600401610c6990614125565b6001600160a01b03821660009081526006602052604090205460ff16611d3857601c54611d33906001600160a01b03168383612d7f565b611d4f565b601c54611d4f906001600160a01b03168383612c19565b816001600160a01b03167f6910e0daf9e4cb68a38b4c1a459b879944b8eb161a86c8f354d96e5a54faf0c0826040516111a191815260200190565b611d9261276d565b6001600160a01b038116611db85760405162461bcd60e51b8152600401610c699061416e565b601e546001600160a01b03808316911603611e045760405162461bcd60e51b815260206004820152600c60248201526b53616d65204272696467652160a01b6044820152606401610c69565b601e80546001600160a01b0319166001600160a01b03831690811790915560405190815233907fd94e52c58cb5870958c05be7a6183038f705e88c54604590d15d3986cf12a2c990602001610f0f565b6001600160a01b037f000000000000000000000000000000000000000000000000000000000000dead811660009081526002602052604080822054601c5490931682528120549091611eb991611eb390670de0b6b3a764000090612d23565b90612d23565b905090565b611ec661276d565b6001600160a01b03821660009081526004602052604090205481151560ff909116151503611f2d5760405162461bcd60e51b815260206004820152601460248201527314185a5c88105b1c9958591e48115b98589b195960621b6044820152606401610c69565b6001600160a01b038216600081815260046020908152604091829020805460ff191685151590811790915582519384529083015233917fac0b2958c680afbcacee16a4305170e8004cf74c8270ac3edd2abc61b919e8ea91016111a1565b3360008181526003602090815260408083206001600160a01b038716845282528083205481516060810190925260258083529394610e5d9490938893610f899392899261440290830139612aca565b6000611fe73384846128e3565b604080513381526001600160a01b038516602082015280820184905290517f0a85107a334eae0d22d21cdf13af0f8e8125039ec60baaa843d2c4c5b06801749181900360600190a150600192915050565b61204061276d565b6001600160a01b0382166120665760405162461bcd60e51b8152600401610c699061416e565b6001600160a01b03821660009081526005602052604090205481151560ff9091161515036120c85760405162461bcd60e51b815260206004820152600f60248201526e105b1c9958591e48195b98589b1959608a1b6044820152606401610c69565b6001600160a01b038216600081815260056020908152604091829020805460ff191685151590811790915582519384529083015233917f76f22305305903e16255cd5e7860e85c184833a5d910944a72f17fec284b8e1f91016111a1565b61212e61276d565b801515601e60179054906101000a900460ff161515036121855760405162461bcd60e51b8152602060048201526012602482015271416c72656164792073657420456e61626c6560701b6044820152606401610c69565b601e805460ff60b81b1916600160b81b8315158102919091179182905560405160ff9190920416151581527f31bb29a860273cd60e45bfd8d53a143941df649ed22e5681a416fab2500c8b12906020015b60405180910390a150565b6121e961276d565b60328183856121f8888a61426f565b612202919061426f565b61220c919061426f565b612216919061426f565b111561225b5760405162461bcd60e51b81526020600482015260146024820152734d617820746f74616c206665652069732035302560601b6044820152606401610c69565b600d858155600f859055600e8490556010839055601182905560405133917feeafcf7f0f07b512f79535e74a0088e915295e3ba562933b8a5d5dcf4b0b5354916119749190614287565b6122ad61276d565b601e54600160b01b900460ff161515811515036122fe5760405162461bcd60e51b815260206004820152600f60248201526e105b1c9958591e48195b98589b1959608a1b6044820152606401610c69565b601e8054821515600160b01b0260ff60b01b1990911617905560405133907fb318bd8ba266a5ee667ec4d0326bb4b0be9a30e8aadeaa85fef0cdeac50d723690610f0f90841515815260200190565b61235561276d565b6001600160a01b03811661237b5760405162461bcd60e51b8152600401610c699061416e565b601a546001600160a01b03908116908216036123ee5760405162461bcd60e51b815260206004820152602c60248201527f546865206c69717569646974792077616c6c657420697320616c72656164792060448201526b74686973206164647265737360a01b6064820152608401610c69565b601a80546001600160a01b0319166001600160a01b03831690811790915560405190815233907f99cf746968302d2ab01f9f9b0f5410586a666bb17b3fe690b309f5d6e16f6cd390602001610f0f565b61244661276d565b6001600160a01b03811661248e5760405162461bcd60e51b815260206004820152600f60248201526e496e76616c6964206164647265737360881b6044820152606401610c69565b601c546001600160a01b038083169116036124eb5760405162461bcd60e51b815260206004820152601960248201527f416c72656164792073657420746f20746869732076616c7565000000000000006044820152606401610c69565b601c80546001600160a01b0319166001600160a01b0383169081179091556040805133815260208101929092527fb97f7a2535e0e53d65a1db2e5691bf70f020b2a06dcc9419e93976fa79e2b4ec91016121d6565b61254861276d565b6001600160a01b0381166125ad5760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610c69565b6125b681612d2f565b50565b6125c161276d565b6001600160a01b0382166125e75760405162461bcd60e51b8152600401610c699061416e565b6000811161264b5760405162461bcd60e51b815260206004820152602b60248201527f5769746864726177616c20616d6f756e74206d7573742062652067726561746560448201526a72207468616e207a65726f60a81b6064820152608401610c69565b3060009081526006602052604090205460ff16801561268357506001600160a01b03821660009081526006602052604090205460ff16155b1561269857612693308383612d7f565b612732565b3060009081526006602052604090205460ff161580156126d057506001600160a01b03821660009081526006602052604090205460ff165b156126e057612693308383612b04565b3060009081526006602052604090205460ff16801561271757506001600160a01b03821660009081526006602052604090205460ff165b1561272757612693308383612c19565b612732308383612e21565b816001600160a01b03167fb4214c8c54fc7442f36d3682f59aebaf09358a4431835b30efb29d52cf9e1e91826040516111a191815260200190565b6000546001600160a01b03163314611bf75760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610c69565b6001600160a01b0383166128295760405162461bcd60e51b8152602060048201526024808201527f45524332303a20617070726f76652066726f6d20746865207a65726f206164646044820152637265737360e01b6064820152608401610c69565b6001600160a01b03821661288a5760405162461bcd60e51b815260206004820152602260248201527f45524332303a20617070726f766520746f20746865207a65726f206164647265604482015261737360f01b6064820152608401610c69565b6001600160a01b0383811660008181526003602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b9259101610e43565b6001600160a01b0383166129475760405162461bcd60e51b815260206004820152602560248201527f45524332303a207472616e736665722066726f6d20746865207a65726f206164604482015264647265737360d81b6064820152608401610c69565b6001600160a01b0382166129a95760405162461bcd60e51b815260206004820152602360248201527f45524332303a207472616e7366657220746f20746865207a65726f206164647260448201526265737360e81b6064820152608401610c69565b60008111612a0b5760405162461bcd60e51b815260206004820152602960248201527f5472616e7366657220616d6f756e74206d7573742062652067726561746572206044820152687468616e207a65726f60b81b6064820152608401610c69565b6000612a1630611b86565b601f5490915081108015908190612a375750601e54600160a01b900460ff16155b8015612a5c57506001600160a01b03851660009081526004602052604090205460ff16155b8015612a715750601e54600160b01b900460ff165b8015612a8b5750601a546001600160a01b03868116911614155b8015612aa55750601a546001600160a01b03858116911614155b15612ab857601f549150612ab882612e65565b612ac3858585612fdf565b5050505050565b60008184841115612aee5760405162461bcd60e51b8152600401610c699190613f63565b506000612afb8585612d23565b95945050505050565b600080600080600080612b1687612cc7565b6001600160a01b038f16600090815260016020526040902054959b50939950919750955093509150612b489087612d23565b6001600160a01b03808b16600090815260016020908152604080832094909455918b16815260029091522054612b7e9084612cbb565b6001600160a01b038916600090815260026020908152604080832093909355600190522054612bad9086612cbb565b6001600160a01b038916600090815260016020526040902055612bd38988838588613278565b876001600160a01b0316896001600160a01b03166000805160206143e283398151915285604051612c0691815260200190565b60405180910390a3505050505050505050565b600080600080600080612c2b87612cc7565b6001600160a01b038f16600090815260026020526040902054959b50939950919750955093509150612c5d9088612d23565b6001600160a01b038a16600090815260026020908152604080832093909355600190522054612b489087612d23565b6000806000612c99613330565b9092509050612ca88282612caf565b9250505090565b600061122a82846142bc565b600061122a828461426f565b6000806000806000806000806000806000612ce18c6134c8565b945094509450945094506000806000612d058f88888888612d00612c8c565b613546565b919f509d509b50969950949750929550505050505091939550919395565b600061122a8284614229565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b600080600080600080612d9187612cc7565b6001600160a01b038f16600090815260026020526040902054959b50939950919750955093509150612dc39088612d23565b6001600160a01b038a16600090815260026020908152604080832093909355600190522054612df29087612d23565b6001600160a01b03808b1660009081526001602052604080822093909355908a1681522054612bad9086612cbb565b600080600080600080612e3387612cc7565b6001600160a01b038f16600090815260016020526040902054959b50939950919750955093509150612df29087612d23565b601e805460ff60a01b1916600160a01b179055601154600c54600e54600954600d54600854600f54600a54600097612eb8979096612eb29691958795919486948593849290918391612cbb565b90612cbb565b600d54600854919250600091612ece919061426f565b90506000612ee683612ee086856135e8565b90612caf565b9050612ef1816135f4565b600e54600954600091612f039161426f565b90506000612f1585612ee088856135e8565b9050612f208161367b565b600f54600a54600091612f329161426f565b90506000612f4487612ee08a856135e8565b9050612f4f81613880565b601154600c54600091612f619161426f565b90506000612f7389612ee08c856135e8565b9050612f7e816139d3565b6040805184815260208101899052908101869052606081018290527fab43d64ef8bfe74393a308a718f49af9d2f845de3bdc8f5e3cb528b4ffec85f79060800160405180910390a15050601e805460ff60a01b191690555050505050505050565b6001600160a01b03831660009081526005602052604090205460ff1615801561302157506001600160a01b03821660009081526005602052604090205460ff16155b1561313057601e54600160b81b900460ff166130755760405162461bcd60e51b8152602060048201526013602482015272151c98591a5b99c81a5cc8191a5cd8589b1959606a1b6044820152606401610c69565b6001600160a01b03831660009081526004602052604090205460ff1615156001036130d557601e805460ff60a81b1916600160a81b1790556130d0600b54601455600854601555600a54601755600954601655600c54601855565b613130565b6001600160a01b03821660009081526004602052604090205460ff16151560010361313057601e805460ff60a81b1916600160a81b179055613130601054601455600d54601555600f54601755600e54601655601154601855565b6001600160a01b03831660009081526006602052604090205460ff16801561317157506001600160a01b03821660009081526006602052604090205460ff16155b1561318657613181838383612d7f565b613232565b6001600160a01b03831660009081526006602052604090205460ff161580156131c757506001600160a01b03821660009081526006602052604090205460ff165b156131d757613181838383612b04565b6001600160a01b03831660009081526006602052604090205460ff16801561321757506001600160a01b03821660009081526006602052604090205460ff165b1561322757613181838383612c19565b613232838383612e21565b601e54600160a81b900460ff16151560010361327357601e805460ff60a81b1916905561327360006014819055601581905560178190556016819055601855565b505050565b601e54600160a81b900460ff161515600103612ac357600061329985613b26565b905060006132a686613b42565b905060006132b387613b5e565b90506132be86613b7a565b6132c88383613c02565b6132d181613b7a565b6132db8486613caa565b306001600160a01b0389166000805160206143e28339815191528385613301888c61426f565b61330b919061426f565b613315919061426f565b60405190815260200160405180910390a35050505050505050565b6012546000908190670de0b6b3a7640000825b60075481101561348d57826001600060078481548110613365576133656141fd565b60009182526020808320909101546001600160a01b0316835282019290925260400190205411806133d057508160026000600784815481106133a9576133a96141fd565b60009182526020808320909101546001600160a01b03168352820192909252604001902054115b156133eb57505060125493670de0b6b3a76400009350915050565b6134316001600060078481548110613405576134056141fd565b60009182526020808320909101546001600160a01b031683528201929092526040019020548490612d23565b9250613479600260006007848154811061344d5761344d6141fd565b60009182526020808320909101546001600160a01b031683528201929092526040019020548390612d23565b91508061348581614256565b915050613343565b506012546134a390670de0b6b3a7640000612caf565b8210156134bf57505060125492670de0b6b3a764000092509050565b90939092509050565b6000806000806000806134da87613cce565b905060006134e788613cea565b905060006134f489613b26565b905060006135018a613b42565b9050600061350e8b613b5e565b9050600061352085611eb38e89612d23565b905061353282611eb385818589612d23565b9c959b509399509197509550919350505050565b60008080806135558a866135e8565b905060006135638a876135e8565b905060006135718a886135e8565b9050600061357f8a896135e8565b9050600061358d8a8a6135e8565b9050600061359a8f613b5e565b905060006135a8828c6135e8565b905060006135be82612eb2868189818d8d612cbb565b905060006135cc8983612d23565b989b509799509597505050505050505096509650969350505050565b600061122a82846142de565b6000613601826002612caf565b9050600061360f8383612d23565b90504761361b83613d06565b60006136274783612d23565b90506136338382613e60565b60408051858152602081018390529081018490527f9d1cc8269ebbe9c8a971dd4c72fe5f591a00d412092c504fabeacee79732ac119060600160405180910390a15050505050565b6000613685612c8c565b9050600061369383836135e8565b6001600160a01b037f000000000000000000000000000000000000000000000000000000000000dead166000908152600160205260409020549091506136d99082612cbb565b6001600160a01b037f000000000000000000000000000000000000000000000000000000000000dead166000908152600160205260408082209290925530815220546137259082612d23565b306000908152600160209081526040808320939093557f000000000000000000000000000000000000000000000000000000000000dead6001600160a01b0316825260069052205460ff16156137f2576001600160a01b037f000000000000000000000000000000000000000000000000000000000000dead166000908152600260205260409020546137b89084612cbb565b6001600160a01b037f000000000000000000000000000000000000000000000000000000000000dead166000908152600260205260409020555b3060009081526006602052604090205460ff161561383557306000908152600260205260409020546138249084612d23565b306000908152600260205260409020555b6040518381526001600160a01b037f000000000000000000000000000000000000000000000000000000000000dead169030906000805160206143e283398151915290602001610e43565b600061388a612c8c565b9050600061389883836135e8565b6019546001600160a01b03166000908152600160205260409020549091506138c09082612cbb565b6019546001600160a01b03166000908152600160205260408082209290925530815220546138ee9082612d23565b306000908152600160209081526040808320939093556019546001600160a01b0316825260069052205460ff1615613961576019546001600160a01b03166000908152600260205260409020546139459084612cbb565b6019546001600160a01b03166000908152600260205260409020555b3060009081526006602052604090205460ff16156139a457306000908152600260205260409020546139939084612d23565b306000908152600260205260409020555b6019546040518481526001600160a01b039091169030906000805160206143e283398151915290602001610e43565b60006139dd612c8c565b905060006139eb83836135e8565b601b546001600160a01b0316600090815260016020526040902054909150613a139082612cbb565b601b546001600160a01b0316600090815260016020526040808220929092553081522054613a419082612d23565b30600090815260016020908152604080832093909355601b546001600160a01b0316825260069052205460ff1615613ab457601b546001600160a01b0316600090815260026020526040902054613a989084612cbb565b601b546001600160a01b03166000908152600260205260409020555b3060009081526006602052604090205460ff1615613af75730600090815260026020526040902054613ae69084612d23565b306000908152600260205260409020555b601b546040518481526001600160a01b039091169030906000805160206143e283398151915290602001610e43565b6000610e616064612ee0601754856135e890919063ffffffff16565b6000610e616064612ee0601654856135e890919063ffffffff16565b6000610e616064612ee0601854856135e890919063ffffffff16565b6000613b84612c8c565b90506000613b9283836135e8565b30600090815260016020526040902054909150613baf9082612cbb565b3060009081526001602090815260408083209390935560069052205460ff16156132735730600090815260026020526040902054613bed9084612cbb565b30600090815260026020526040902055505050565b6000613c0c612c8c565b90506000613c1a84836135e8565b90506000613c2884846135e8565b30600090815260016020526040902054909150613c4b908390612eb29084612cbb565b3060009081526001602090815260408083209390935560069052205460ff1615612ac357613c79848661426f565b30600090815260026020526040902054613c93919061426f565b306000908152600260205260409020555050505050565b601254613cb79083612d23565b601255601354613cc79082612cbb565b6013555050565b6000610e616064612ee0601454856135e890919063ffffffff16565b6000610e616064612ee0601554856135e890919063ffffffff16565b6040805160028082526060820183526000926020830190803683370190505090503081600081518110613d3b57613d3b6141fd565b6001600160a01b03928316602091820292909201810191909152601d54604080516315ab88c960e31b81529051919093169263ad5c46489260048083019391928290030181865afa158015613d94573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613db891906142fd565b81600181518110613dcb57613dcb6141fd565b6001600160a01b039283166020918202929092010152601d54613df191309116846127c7565b601d5460405163791ac94760e01b81526001600160a01b039091169063791ac94790613e2a90859060009086903090429060040161431a565b600060405180830381600087803b158015613e4457600080fd5b505af1158015613e58573d6000803e3d6000fd5b505050505050565b601d54613e789030906001600160a01b0316846127c7565b601d54601a5460405163f305d71960e01b81523060048201526024810185905260006044820181905260648201526001600160a01b0391821660848201524260a482015291169063f305d71990839060c40160606040518083038185885af1158015613ee8573d6000803e3d6000fd5b50505050506040513d601f19601f82011682018060405250810190612ac3919061438b565b6001600160a01b03811681146125b657600080fd5b600080600060608486031215613f3757600080fd5b8335613f4281613f0d565b92506020840135613f5281613f0d565b929592945050506040919091013590565b600060208083528351808285015260005b81811015613f9057858101830151858201604001528201613f74565b81811115613fa2576000604083870101525b50601f01601f1916929092016040019392505050565b60008060408385031215613fcb57600080fd5b8235613fd681613f0d565b946020939093013593505050565b600060208284031215613ff657600080fd5b813561122a81613f0d565b60006020828403121561401357600080fd5b5035919050565b80151581146125b657600080fd5b6000806040838503121561403b57600080fd5b82359150602083013561404d8161401a565b809150509250929050565b600080600080600060a0868803121561407057600080fd5b505083359560208501359550604085013594606081013594506080013592509050565b600080604083850312156140a657600080fd5b82356140b181613f0d565b9150602083013561404d8161401a565b6000602082840312156140d357600080fd5b813561122a8161401a565b600080604083850312156140f157600080fd5b82356140fc81613f0d565b9150602083013561404d81613f0d565b60006020828403121561411e57600080fd5b5051919050565b602080825260129082015271496e63756666696369656e742066756e647360701b604082015260600190565b60006020828403121561416357600080fd5b815161122a8161401a565b6020808252600c908201526b5a65726f204164647265737360a01b604082015260600190565b6020808252600c908201526b53616d65204164647265737360a01b604082015260600190565b60208082526023908201527f4f6e6c79206272696467652063616e20706572666f726d20746869732061637460408201526234b7b760e91b606082015260800190565b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052601160045260246000fd5b60008282101561423b5761423b614213565b500390565b634e487b7160e01b600052603160045260246000fd5b60006001820161426857614268614213565b5060010190565b6000821982111561428257614282614213565b500190565b815481526001820154602082015260028201546040820152600382015460608201526004820154608082015260a08101610e61565b6000826142d957634e487b7160e01b600052601260045260246000fd5b500490565b60008160001904831182151516156142f8576142f8614213565b500290565b60006020828403121561430f57600080fd5b815161122a81613f0d565b600060a082018783526020878185015260a0604085015281875180845260c086019150828901935060005b8181101561436a5784516001600160a01b031683529383019391830191600101614345565b50506001600160a01b03969096166060850152505050608001529392505050565b6000806000606084860312156143a057600080fd5b835192506020840151915060408401519050925092509256fe45524332303a207472616e7366657220616d6f756e74206578636565647320616c6c6f77616e6365ddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef45524332303a2064656372656173656420616c6c6f77616e63652062656c6f77207a65726fa26469706673582212208b76c3abc8074058bd6eb1af9b97726ea5880cc2726e3f0ccfef8a5a2659b82164736f6c634300080f0033

Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)

0000000000000000000000007a250d5630b4cf539739df2c5dacb4c659f2488d000000000000000000000000ebaecbc9f43eee833feddea0a7f9b8df0d99af19000000000000000000000000ebaecbc9f43eee833feddea0a7f9b8df0d99af19000000000000000000000000343def46f3424d10df63668fe548e38ae4924644

-----Decoded View---------------
Arg [0] : _router (address): 0x7a250d5630B4cF539739dF2C5dAcb4c659F2488D
Arg [1] : _marketingWallet (address): 0xebaEcbc9f43eEe833fedDEa0A7f9B8Df0D99AF19
Arg [2] : _teamWallet (address): 0xebaEcbc9f43eEe833fedDEa0A7f9B8Df0D99AF19
Arg [3] : _bridgeVault (address): 0x343dEf46f3424D10Df63668Fe548e38aE4924644

-----Encoded View---------------
4 Constructor Arguments found :
Arg [0] : 0000000000000000000000007a250d5630b4cf539739df2c5dacb4c659f2488d
Arg [1] : 000000000000000000000000ebaecbc9f43eee833feddea0a7f9b8df0d99af19
Arg [2] : 000000000000000000000000ebaecbc9f43eee833feddea0a7f9b8df0d99af19
Arg [3] : 000000000000000000000000343def46f3424d10df63668fe548e38ae4924644


Deployed Bytecode Sourcemap

14547:36482:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;26655:33;;;26666:10;188:51:1;;26678:9:0;270:2:1;255:18;;248:34;26655:33:0;;161:18:1;26655:33:0;;;;;;;;14547:36482;;26748:34;;;26760:10;188:51:1;;26772:9:0;270:2:1;255:18;;248:34;26748::0;;161:18:1;26748:34:0;14:274:1;47885:499:0;;;;;;;;;;-1:-1:-1;47885:499:0;;;;;:::i;:::-;;:::i;:::-;;15938:35;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;1092:32:1;;;1074:51;;1062:2;1047:18;15938:35:0;;;;;;;;16346:28;;;;;;;;;;-1:-1:-1;16346:28:0;;;;-1:-1:-1;;;16346:28:0;;;;;;;;;1301:14:1;;1294:22;1276:41;;1264:2;1249:18;16346:28:0;1136:187:1;20766:85:0;;;;;;;;;;-1:-1:-1;20838:5:0;;;;;;;;;;;;-1:-1:-1;;;20838:5:0;;;;20766:85;;;;;;;:::i;22525:195::-;;;;;;;;;;-1:-1:-1;22525:195:0;;;;;:::i;:::-;;:::i;24120:89::-;;;;;;;;;;-1:-1:-1;24191:10:0;;24120:89;;;2404:25:1;;;2392:2;2377:18;24120:89:0;2258:177:1;44677:276:0;;;;;;;;;;-1:-1:-1;44677:276:0;;;;;:::i;:::-;;:::i;16142:41::-;;;;;;;;;;-1:-1:-1;16142:41:0;;;;-1:-1:-1;;;;;16142:41:0;;;21049:97;;;;;;;;;;-1:-1:-1;15462:13:0;21049:97;;15826:32;;;;;;;;;;;;;;;;22728:475;;;;;;;;;;-1:-1:-1;22728:475:0;;;;;:::i;:::-;;:::i;49736:639::-;;;;;;;;;;-1:-1:-1;49736:639:0;;;;;:::i;:::-;;:::i;15347:22::-;;;;;;;;;;-1:-1:-1;15347:22:0;;;;;;;;;;;;;;;;;;;;;;3670:25:1;;;3726:2;3711:18;;3704:34;;;;3754:18;;;3747:34;;;;3812:2;3797:18;;3790:34;3855:3;3840:19;;3833:35;3657:3;3642:19;15347:22:0;3411:463:1;25227:322:0;;;;;;;;;;-1:-1:-1;25227:322:0;;;;;:::i;:::-;;:::i;20956:85::-;;;;;;;;;;-1:-1:-1;20956:85:0;;15710:1;4206:36:1;;4194:2;4179:18;20956:85:0;4064:184:1;25946:601:0;;;;;;;;;;-1:-1:-1;25946:601:0;;;;;:::i;:::-;;:::i;23211:302::-;;;;;;;;;;-1:-1:-1;23211:302:0;;;;;:::i;:::-;;:::i;15720:26::-;;;;;;;;;;;;;;;;24260:470;;;;;;;;;;-1:-1:-1;24260:470:0;;;;;:::i;:::-;;:::i;46103:322::-;;;;;;;;;;-1:-1:-1;46103:322:0;;;;;:::i;:::-;;:::i;46703:255::-;;;;;;;;;;-1:-1:-1;46703:255:0;;;;;:::i;:::-;;:::i;24738:481::-;;;;;;;;;;-1:-1:-1;24738:481:0;;;;;:::i;:::-;;:::i;15320:20::-;;;;;;;;;;-1:-1:-1;15320:20:0;;;;;;;;;;;;;;;;;;47377:336;;;;;;;;;;-1:-1:-1;47377:336:0;;;;;:::i;:::-;;:::i;44961:644::-;;;;;;;;;;-1:-1:-1;44961:644:0;;;;;:::i;:::-;;:::i;16299:40::-;;;;;;;;;;-1:-1:-1;16299:40:0;;;;-1:-1:-1;;;16299:40:0;;;;;;25557:381;;;;;;;;;;-1:-1:-1;25557:381:0;;;;;:::i;:::-;;:::i;33406:126::-;;;;;;;;;;-1:-1:-1;33406:126:0;;;;;:::i;:::-;-1:-1:-1;;;;;33497:27:0;33473:4;33497:27;;;:18;:27;;;;;;;;;33406:126;16017:25;;;;;;;;;;-1:-1:-1;16017:25:0;;;;-1:-1:-1;;;;;16017:25:0;;;44368:301;;;;;;;;;;-1:-1:-1;44368:301:0;;;;;:::i;:::-;;:::i;15753:32::-;;;;;;;;;;;;;;;;21853:198;;;;;;;;;;-1:-1:-1;21853:198:0;;;;;:::i;:::-;;:::i;9817:103::-;;;;;;;;;;;;;:::i;15901:30::-;;;;;;;;;;-1:-1:-1;15901:30:0;;;;-1:-1:-1;;;;;15901:30:0;;;50484:542;;;;;;;;;;-1:-1:-1;50484:542:0;;;;;:::i;:::-;;:::i;23958:154::-;;;;;;;;;;-1:-1:-1;23958:154:0;;;;;:::i;:::-;-1:-1:-1;;;;;24084:20:0;24055:4;24084:20;;;:11;:20;;;;;;;;;23958:154;9169:87;;;;;;;;;;-1:-1:-1;9215:7:0;9242:6;-1:-1:-1;;;;;9242:6:0;9169:87;;49420:250;;;;;;;;;;-1:-1:-1;49420:250:0;;;;;:::i;:::-;;:::i;21224:145::-;;;;;;;;;;;;;:::i;20859:89::-;;;;;;;;;;-1:-1:-1;20933:7:0;;;;;;;;;;;;-1:-1:-1;;;20933:7:0;;;;20859:89;;20429:329;;;;;;;;;;-1:-1:-1;20429:329:0;;;;;:::i;:::-;;:::i;15865:27::-;;;;;;;;;;;;;;;;23521:429;;;;;;;;;;-1:-1:-1;23521:429:0;;;;;:::i;:::-;;:::i;22059:264::-;;;;;;;;;;-1:-1:-1;22059:264:0;;;;;:::i;:::-;;:::i;16107:26::-;;;;;;;;;;-1:-1:-1;16107:26:0;;;;-1:-1:-1;;;;;16107:26:0;;;44006:354;;;;;;;;;;-1:-1:-1;44006:354:0;;;;;:::i;:::-;;:::i;14804:57::-;;;;;;;;;;-1:-1:-1;14804:57:0;;;;;:::i;:::-;;;;;;;;;;;;;;;;32855:225;;;;;;;;;;-1:-1:-1;32855:225:0;;;;;:::i;:::-;;:::i;15792:27::-;;;;;;;;;;;;;;;;45613:482;;;;;;;;;;-1:-1:-1;45613:482:0;;;;;:::i;:::-;;:::i;46433:262::-;;;;;;;;;;-1:-1:-1;46433:262:0;;;;;:::i;:::-;;:::i;16383:59::-;;;;;;;;;;;;;;;;15980:30;;;;;;;;;;-1:-1:-1;15980:30:0;;;;-1:-1:-1;;;;;15980:30:0;;;22331:186;;;;;;;;;;-1:-1:-1;22331:186:0;;;;;:::i;:::-;-1:-1:-1;;;;;22482:18:0;;;22450:7;22482:18;;;:11;:18;;;;;;;;:27;;;;;;;;;;;;;22331:186;46966:403;;;;;;;;;;-1:-1:-1;46966:403:0;;;;;:::i;:::-;;:::i;16192:21::-;;;;;;;;;;-1:-1:-1;16192:21:0;;;;-1:-1:-1;;;;;16192:21:0;;;33088:310;;;;;;;;;;-1:-1:-1;33088:310:0;;;;;:::i;:::-;;:::i;10075:201::-;;;;;;;;;;-1:-1:-1;10075:201:0;;;;;:::i;:::-;;:::i;48482:801::-;;;;;;;;;;-1:-1:-1;48482:801:0;;;;;:::i;:::-;;:::i;47885:499::-;9055:13;:11;:13::i;:::-;-1:-1:-1;;;;;48029:28:0;::::1;48021:62;;;::::0;-1:-1:-1;;;48021:62:0;;6737:2:1;48021:62:0::1;::::0;::::1;6719:21:1::0;6776:2;6756:18;;;6749:30;-1:-1:-1;;;6795:18:1;;;6788:51;6856:18;;48021:62:0::1;;;;;;;;;-1:-1:-1::0;;;;;48102:23:0;::::1;48094:61;;;::::0;-1:-1:-1;;;48094:61:0;;7087:2:1;48094:61:0::1;::::0;::::1;7069:21:1::0;7126:2;7106:18;;;7099:30;7165:27;7145:18;;;7138:55;7210:18;;48094:61:0::1;6885:349:1::0;48094:61:0::1;48184:30;::::0;-1:-1:-1;;;48184:30:0;;48208:4:::1;48184:30;::::0;::::1;1074:51:1::0;-1:-1:-1;;;;;48184:15:0;::::1;::::0;::::1;::::0;1047:18:1;;48184:30:0::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;48174:6;:40;;48166:71;;;;-1:-1:-1::0;;;48166:71:0::1;;;;;;;:::i;:::-;48256:33;::::0;-1:-1:-1;;;48256:33:0;;-1:-1:-1;;;;;206:32:1;;;48256:33:0::1;::::0;::::1;188:51:1::0;255:18;;;248:34;;;48256:14:0;::::1;::::0;::::1;::::0;161:18:1;;48256:33:0::1;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;48248:59;;;::::0;-1:-1:-1;;;48248:59:0;;8227:2:1;48248:59:0::1;::::0;::::1;8209:21:1::0;8266:2;8246:18;;;8239:30;-1:-1:-1;;;8285:18:1;;;8278:43;8338:18;;48248:59:0::1;8025:337:1::0;48248:59:0::1;48358:9;-1:-1:-1::0;;;;;48325:51:0::1;48350:5;-1:-1:-1::0;;;;;48325:51:0::1;;48369:6;48325:51;;;;2404:25:1::0;;2392:2;2377:18;;2258:177;48325:51:0::1;;;;;;;;47885:499:::0;;;:::o;22525:195::-;22629:4;22651:39;7800:10;22674:7;22683:6;22651:8;:39::i;:::-;-1:-1:-1;22708:4:0;22525:195;;;;;:::o;44677:276::-;9055:13;:11;:13::i;:::-;-1:-1:-1;;;;;44757:23:0;::::1;44749:48;;;;-1:-1:-1::0;;;44749:48:0::1;;;;;;;:::i;:::-;44829:10;::::0;-1:-1:-1;;;;;44829:10:0;;::::1;44816:23:::0;;::::1;::::0;44808:48:::1;;;;-1:-1:-1::0;;;44808:48:0::1;;;;;;;:::i;:::-;44867:10;:22:::0;;-1:-1:-1;;;;;;44867:22:0::1;-1:-1:-1::0;;;;;44867:22:0;::::1;::::0;;::::1;::::0;;;44905:40:::1;::::0;1074:51:1;;;44922:10:0::1;::::0;44905:40:::1;::::0;1062:2:1;1047:18;44905:40:0::1;;;;;;;;44677:276:::0;:::o;22728:475::-;22862:4;22879:36;22889:6;22897:9;22908:6;22879:9;:36::i;:::-;22926:247;22949:6;7800:10;-1:-1:-1;;;;;23028:19:0;;;;;;:11;:19;;;;;22997:165;;7800:10;-1:-1:-1;;;;;23028:33:0;-1:-1:-1;;;;;23028:33:0;;;;;;;;;;;;;23080:6;22997:165;;;;;;;;;;;;;;;;;:12;:165::i;:::-;22926:8;:247::i;:::-;-1:-1:-1;23191:4:0;22728:475;;;;;:::o;49736:639::-;49346:6;;-1:-1:-1;;;;;49346:6:0;49332:10;:20;49324:68;;;;-1:-1:-1;;;49324:68:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;49823:21:0;::::1;49815:46;;;::::0;-1:-1:-1;;;49815:46:0;;9655:2:1;49815:46:0::1;::::0;::::1;9637:21:1::0;9694:2;9674:18;;;9667:30;-1:-1:-1;;;9713:18:1;;;9706:42;9765:18;;49815:46:0::1;9453:336:1::0;49815:46:0::1;49890:1;49880:7;:11;49872:61;;;::::0;-1:-1:-1;;;49872:61:0;;9996:2:1;49872:61:0::1;::::0;::::1;9978:21:1::0;10035:2;10015:18;;;10008:30;10074:34;10054:18;;;10047:62;-1:-1:-1;;;10125:18:1;;;10118:35;10170:19;;49872:61:0::1;9794:401:1::0;49872:61:0::1;49963:18;49973:7;49963:9;:18::i;:::-;49952:7;:29;;49944:60;;;;-1:-1:-1::0;;;49944:60:0::1;;;;;;;:::i;:::-;-1:-1:-1::0;;;;;50023:20:0;::::1;;::::0;;;:11:::1;:20;::::0;;;;;;;7800:10;50023:34;;;;;;;;:45;-1:-1:-1;50023:45:0::1;50015:98;;;::::0;-1:-1:-1;;;50015:98:0;;10402:2:1;50015:98:0::1;::::0;::::1;10384:21:1::0;10441:2;10421:18;;;10414:30;10480:34;10460:18;;;10453:62;-1:-1:-1;;;10531:18:1;;;10524:38;10579:19;;50015:98:0::1;10200:404:1::0;50015:98:0::1;-1:-1:-1::0;;;;;50131:20:0;::::1;;::::0;;;:11:::1;:20;::::0;;;;;::::1;;50126:189;;50197:11;::::0;50168:50:::1;::::0;50188:7;;-1:-1:-1;;;;;50197:11:0::1;50210:7:::0;50168:19:::1;:50::i;:::-;50126:189;;;50282:11;::::0;50251:52:::1;::::0;50273:7;;-1:-1:-1;;;;;50282:11:0::1;50295:7:::0;50251:21:::1;:52::i;:::-;50350:7;-1:-1:-1::0;;;;;50334:33:0::1;;50359:7;50334:33;;;;2404:25:1::0;;2392:2;2377:18;;2258:177;50334:33:0::1;;;;;;;;49736:639:::0;;:::o;25227:322::-;25321:7;25379;;25368;:18;;25346:110;;;;-1:-1:-1;;;25346:110:0;;10811:2:1;25346:110:0;;;10793:21:1;10850:2;10830:18;;;10823:30;10889:34;10869:18;;;10862:62;-1:-1:-1;;;10940:18:1;;;10933:40;10990:19;;25346:110:0;10609:406:1;25346:110:0;25467:19;25489:10;:8;:10::i;:::-;25467:32;-1:-1:-1;25517:24:0;:7;25467:32;25517:11;:24::i;:::-;25510:31;25227:322;-1:-1:-1;;;25227:322:0:o;25946:601::-;9055:13;:11;:13::i;:::-;26037:11:::1;::::0;-1:-1:-1;;;;;26037:11:0;;::::1;26026:22:::0;;::::1;::::0;26018:68:::1;;;::::0;-1:-1:-1;;;26018:68:0;;11222:2:1;26018:68:0::1;::::0;::::1;11204:21:1::0;11261:2;11241:18;;;11234:30;11300:34;11280:18;;;11273:62;-1:-1:-1;;;11351:18:1;;;11344:31;11392:19;;26018:68:0::1;11020:397:1::0;26018:68:0::1;-1:-1:-1::0;;;;;26105:20:0;::::1;;::::0;;;:11:::1;:20;::::0;;;;;::::1;;26097:60;;;::::0;-1:-1:-1;;;26097:60:0;;11624:2:1;26097:60:0::1;::::0;::::1;11606:21:1::0;11663:2;11643:18;;;11636:30;11702:29;11682:18;;;11675:57;11749:18;;26097:60:0::1;11422:351:1::0;26097:60:0::1;26173:9;26168:327;26192:9;:16:::0;26188:20;::::1;26168:327;;;26250:7;-1:-1:-1::0;;;;;26234:23:0::1;:9;26244:1;26234:12;;;;;;;;:::i;:::-;;::::0;;;::::1;::::0;;;::::1;::::0;-1:-1:-1;;;;;26234:12:0::1;:23:::0;26230:254:::1;;26293:9;26303:16:::0;;:20:::1;::::0;26322:1:::1;::::0;26303:20:::1;:::i;:::-;26293:31;;;;;;;;:::i;:::-;;::::0;;;::::1;::::0;;;::::1;::::0;26278:9:::1;:12:::0;;-1:-1:-1;;;;;26293:31:0;;::::1;::::0;26288:1;;26278:12;::::1;;;;;:::i;:::-;;::::0;;;::::1;::::0;;;;;;::::1;:46:::0;;-1:-1:-1;;;;;;26278:46:0::1;-1:-1:-1::0;;;;;26278:46:0;;::::1;;::::0;;26343:16;;::::1;::::0;;:7:::1;:16:::0;;;;;;:20;;;26382:11:::1;:20:::0;;;;:28;;-1:-1:-1;;26382:28:0::1;::::0;;26429:9:::1;:15:::0;;;::::1;;;;:::i;:::-;;::::0;;;::::1;::::0;;;;-1:-1:-1;;26429:15:0;;;;;-1:-1:-1;;;;;;26429:15:0::1;::::0;;;;;26463:5:::1;;26230:254;26210:3:::0;::::1;::::0;::::1;:::i;:::-;;;;26168:327;;;-1:-1:-1::0;26512:27:0::1;::::0;-1:-1:-1;;;;;26512:27:0;::::1;::::0;::::1;::::0;;;::::1;25946:601:::0;:::o;23211:302::-;7800:10;23328:4;23422:25;;;:11;:25;;;;;;;;-1:-1:-1;;;;;23422:34:0;;;;;;;;;;23328:4;;23350:133;;23400:7;;23422:50;;23461:10;23422:38;:50::i;24260:470::-;7800:10;24314:14;24377:19;;;:11;:19;;;;;;;;24376:20;24354:114;;;;-1:-1:-1;;;24354:114:0;;12646:2:1;24354:114:0;;;12628:21:1;12685:2;12665:18;;;12658:30;12724:34;12704:18;;;12697:62;-1:-1:-1;;;12775:18:1;;;12768:42;12827:19;;24354:114:0;12444:408:1;24354:114:0;24480:15;24509:19;24520:7;24509:10;:19::i;:::-;-1:-1:-1;;;;;;;;;24557:15:0;;;;;;:7;:15;;;;;;24479:49;;-1:-1:-1;24557:28:0;;:15;-1:-1:-1;24479:49:0;24557:19;:28::i;:::-;-1:-1:-1;;;;;24539:15:0;;;;;;:7;:15;;;;;:46;24606:7;;:20;;24618:7;24606:11;:20::i;:::-;24596:7;:30;24650:10;;:23;;24665:7;24650:14;:23::i;:::-;24637:10;:36;24691:31;;2404:25:1;;;24702:10:0;;24691:31;;2392:2:1;2377:18;24691:31:0;;;;;;;24303:427;;24260:470;:::o;46103:322::-;9055:13;:11;:13::i;:::-;-1:-1:-1;;;;;46186:23:0;::::1;46178:48;;;;-1:-1:-1::0;;;46178:48:0::1;;;;;;;:::i;:::-;46266:15;::::0;-1:-1:-1;;;;;46266:15:0;;::::1;46245:37:::0;;::::1;::::0;46237:62:::1;;;;-1:-1:-1::0;;;46237:62:0::1;;;;;;;:::i;:::-;46310:15;:47:::0;;-1:-1:-1;;;;;;46310:47:0::1;-1:-1:-1::0;;;;;46310:47:0;::::1;::::0;;::::1;::::0;;;46375:42:::1;::::0;1074:51:1;;;46395:10:0::1;::::0;46375:42:::1;::::0;1062:2:1;1047:18;46375:42:0::1;928:203:1::0;46703:255:0;9055:13;:11;:13::i;:::-;46796:29:::1;;46786:6;:39:::0;46778:63:::1;;;::::0;-1:-1:-1;;;46778:63:0;;13059:2:1;46778:63:0::1;::::0;::::1;13041:21:1::0;13098:2;13078:18;;;13071:30;-1:-1:-1;;;13117:18:1;;;13110:41;13168:18;;46778:63:0::1;12857:335:1::0;46778:63:0::1;46852:29;:38:::0;;;46908:42:::1;::::0;2404:25:1;;;46931:10:0::1;::::0;46908:42:::1;::::0;2392:2:1;2377:18;46908:42:0::1;2258:177:1::0;24738:481:0;24858:7;15462:13;24891:7;:18;;24883:62;;;;-1:-1:-1;;;24883:62:0;;13399:2:1;24883:62:0;;;13381:21:1;13438:2;13418:18;;;13411:30;13477:33;13457:18;;;13450:61;13528:18;;24883:62:0;13197:355:1;24883:62:0;24961:17;24956:256;;24996:15;25025:19;25036:7;25025:10;:19::i;:::-;-1:-1:-1;24995:49:0;;-1:-1:-1;25059:14:0;;-1:-1:-1;;;;;25059:14:0;24956:256;25109:23;25144:19;25155:7;25144:10;:19::i;:::-;-1:-1:-1;25106:57:0;;-1:-1:-1;25178:22:0;;-1:-1:-1;;;;;25178:22:0;47377:336;9055:13;:11;:13::i;:::-;-1:-1:-1;;;;;47502:23:0;::::1;47494:48;;;;-1:-1:-1::0;;;47494:48:0::1;;;;;;;:::i;:::-;47580:4;47571:23;47561:33:::0;::::1;;47553:64;;;;-1:-1:-1::0;;;47553:64:0::1;;;;;;;:::i;:::-;47628:26;::::0;-1:-1:-1;;;;;47628:18:0;::::1;::::0;:26;::::1;;;::::0;47647:6;;47628:26:::1;::::0;;;47647:6;47628:18;:26;::::1;;;;;;;;;;;;;::::0;::::1;;;;;;47687:9;-1:-1:-1::0;;;;;47670:35:0::1;;47698:6;47670:35;;;;2404:25:1::0;;2392:2;2377:18;;2258:177;44961:644:0;9055:13;:11;:13::i;:::-;45191:2:::1;45182:5:::0;45175:4;45167:5;45148:16:::1;45154:10:::0;45148:3;:16:::1;:::i;:::-;:24;;;;:::i;:::-;:31;;;;:::i;:::-;:39;;;;:::i;:::-;:45;;45140:78;;;::::0;-1:-1:-1;;;45140:78:0;;13892:2:1;45140:78:0::1;::::0;::::1;13874:21:1::0;13931:2;13911:18;;;13904:30;-1:-1:-1;;;13950:18:1;;;13943:50;14010:18;;45140:78:0::1;13690:344:1::0;45140:78:0::1;45239:6;:13:::0;:20;::::1;:54:::0;::::1;;;-1:-1:-1::0;45263:16:0;;:30;::::1;45239:54;:78;;;;-1:-1:-1::0;45297:11:0;;:20;::::1;45239:78;:100;;;;-1:-1:-1::0;45321:10:0;;:18;::::1;45239:100;:125;;;;-1:-1:-1::0;45344:11:0;;:20;::::1;45239:125;45237:128;45229:159;;;::::0;-1:-1:-1;;;45229:159:0;;14241:2:1;45229:159:0::1;::::0;::::1;14223:21:1::0;14280:2;14260:18;;;14253:30;-1:-1:-1;;;14299:18:1;;;14292:48;14357:18;;45229:159:0::1;14039:342:1::0;45229:159:0::1;45399:6;:19:::0;;;45429:16;:29;;;45469:11;:19;;;45499:10;:17;;;45527:11;:19;;;45564:33:::1;::::0;45578:10:::1;::::0;45564:33:::1;::::0;::::1;::::0;45399:6;45564:33:::1;:::i;:::-;;;;;;;;44961:644:::0;;;;;:::o;25557:381::-;9055:13;:11;:13::i;:::-;-1:-1:-1;;;;;25640:20:0;::::1;;::::0;;;:11:::1;:20;::::0;;;;;::::1;;25639:21;25631:61;;;::::0;-1:-1:-1;;;25631:61:0;;15168:2:1;25631:61:0::1;::::0;::::1;15150:21:1::0;15207:2;15187:18;;;15180:30;15246:29;15226:18;;;15219:57;15293:18;;25631:61:0::1;14966:351:1::0;25631:61:0::1;-1:-1:-1::0;;;;;25707:16:0;::::1;25726:1;25707:16:::0;;;:7:::1;:16;::::0;;;;;:20;25703:109:::1;;-1:-1:-1::0;;;;;25783:16:0;::::1;;::::0;;;:7:::1;:16;::::0;;;;;25763:37:::1;::::0;:19:::1;:37::i;:::-;-1:-1:-1::0;;;;;25744:16:0;::::1;;::::0;;;:7:::1;:16;::::0;;;;:56;25703:109:::1;-1:-1:-1::0;;;;;25822:20:0;::::1;;::::0;;;:11:::1;:20;::::0;;;;;:27;;-1:-1:-1;;25822:27:0::1;25845:4;25822:27:::0;;::::1;::::0;;;25860:9:::1;:23:::0;;;;::::1;::::0;;;;;::::1;::::0;;-1:-1:-1;;;;;;25860:23:0::1;::::0;::::1;::::0;;25901:29;::::1;::::0;25822:20;25901:29:::1;25557:381:::0;:::o;44368:301::-;9055:13;:11;:13::i;:::-;-1:-1:-1;;;;;44453:23:0;::::1;44445:48;;;;-1:-1:-1::0;;;44445:48:0::1;;;;;;;:::i;:::-;44525:15;::::0;-1:-1:-1;;;;;44525:15:0;;::::1;44512:28:::0;;::::1;::::0;44504:53:::1;;;;-1:-1:-1::0;;;44504:53:0::1;;;;;;;:::i;:::-;44568:15;:27:::0;;-1:-1:-1;;;;;;44568:27:0::1;-1:-1:-1::0;;;;;44568:27:0;::::1;::::0;;::::1;::::0;;;44611:50:::1;::::0;1074:51:1;;;44633:10:0::1;::::0;44611:50:::1;::::0;1062:2:1;1047:18;44611:50:0::1;928:203:1::0;21853:198:0;-1:-1:-1;;;;;21943:20:0;;21919:7;21943:20;;;:11;:20;;;;;;;;21939:49;;;-1:-1:-1;;;;;;21972:16:0;;;;;:7;:16;;;;;;;21853:198::o;21939:49::-;-1:-1:-1;;;;;22026:16:0;;;;;;:7;:16;;;;;;22006:37;;:19;:37::i;9817:103::-;9055:13;:11;:13::i;:::-;9882:30:::1;9909:1;9882:18;:30::i;:::-;9817:103::o:0;50484:542::-;49346:6;;-1:-1:-1;;;;;49346:6:0;49332:10;:20;49324:68;;;;-1:-1:-1;;;49324:68:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;50573:21:0;::::1;50565:46;;;::::0;-1:-1:-1;;;50565:46:0;;9655:2:1;50565:46:0::1;::::0;::::1;9637:21:1::0;9694:2;9674:18;;;9667:30;-1:-1:-1;;;9713:18:1;;;9706:42;9765:18;;50565:46:0::1;9453:336:1::0;50565:46:0::1;50640:1;50630:7;:11;50622:63;;;::::0;-1:-1:-1;;;50622:63:0;;15524:2:1;50622:63:0::1;::::0;::::1;15506:21:1::0;15563:2;15543:18;;;15536:30;15602:34;15582:18;;;15575:62;-1:-1:-1;;;15653:18:1;;;15646:37;15700:19;;50622:63:0::1;15322:403:1::0;50622:63:0::1;50725:11;::::0;50715:22:::1;::::0;-1:-1:-1;;;;;50725:11:0::1;50715:9;:22::i;:::-;50704:7;:33;;50696:64;;;;-1:-1:-1::0;;;50696:64:0::1;;;;;;;:::i;:::-;-1:-1:-1::0;;;;;50780:20:0;::::1;;::::0;;;:11:::1;:20;::::0;;;;;::::1;;50775:191;;50839:11;::::0;50817:52:::1;::::0;-1:-1:-1;;;;;50839:11:0::1;50852:7:::0;50861;50817:21:::1;:52::i;:::-;50775:191;;;50924:11;::::0;50902:52:::1;::::0;-1:-1:-1;;;;;50924:11:0::1;50937:7:::0;50946;50902:21:::1;:52::i;:::-;51001:7;-1:-1:-1::0;;;;;50983:35:0::1;;51010:7;50983:35;;;;2404:25:1::0;;2392:2;2377:18;;2258:177;49420:250:0;9055:13;:11;:13::i;:::-;-1:-1:-1;;;;;49494:21:0;::::1;49486:46;;;;-1:-1:-1::0;;;49486:46:0::1;;;;;;;:::i;:::-;49551:6;::::0;-1:-1:-1;;;;;49551:17:0;;::::1;:6:::0;::::1;:17:::0;49543:42:::1;;;::::0;-1:-1:-1;;;49543:42:0;;15932:2:1;49543:42:0::1;::::0;::::1;15914:21:1::0;15971:2;15951:18;;;15944:30;-1:-1:-1;;;15990:18:1;;;15983:42;16042:18;;49543:42:0::1;15730:336:1::0;49543:42:0::1;49596:6;:16:::0;;-1:-1:-1;;;;;;49596:16:0::1;-1:-1:-1::0;;;;;49596:16:0;::::1;::::0;;::::1;::::0;;;49630:32:::1;::::0;1074:51:1;;;49643:10:0::1;::::0;49630:32:::1;::::0;1062:2:1;1047:18;49630:32:0::1;928:203:1::0;21224:145:0;-1:-1:-1;;;;;21349:10:0;21341:19;;21276:7;21341:19;;;:7;:19;;;;;;;21323:11;;;;;21315:20;;;;;21276:7;;21303:58;;:33;;15462:13;;21303:11;:33::i;:::-;:37;;:58::i;:::-;21296:65;;21224:145;:::o;20429:329::-;9055:13;:11;:13::i;:::-;-1:-1:-1;;;;;20556:31:0;::::1;;::::0;;;:25:::1;:31;::::0;;;;;:42;::::1;;:31;::::0;;::::1;:42;;::::0;20548:75:::1;;;::::0;-1:-1:-1;;;20548:75:0;;16273:2:1;20548:75:0::1;::::0;::::1;16255:21:1::0;16312:2;16292:18;;;16285:30;-1:-1:-1;;;16331:18:1;;;16324:50;16391:18;;20548:75:0::1;16071:344:1::0;20548:75:0::1;-1:-1:-1::0;;;;;20634:31:0;::::1;;::::0;;;:25:::1;:31;::::0;;;;;;;;:41;;-1:-1:-1;;20634:41:0::1;::::0;::::1;;::::0;;::::1;::::0;;;20693:57;;16588:51:1;;;16655:18;;;16648:50;20724:10:0::1;::::0;20693:57:::1;::::0;16561:18:1;20693:57:0::1;16420:284:1::0;23521:429:0;7800:10;23643:4;23768:25;;;:11;:25;;;;;;;;-1:-1:-1;;;;;23768:34:0;;;;;;;;;;23737:172;;;;;;;;;;;;23643:4;;23665:255;;7800:10;;23715:7;;23737:172;;23768:34;23821:15;;23737:172;;;;;:12;:172::i;22059:264::-;22167:4;22191:42;7800:10;22215:9;22226:6;22191:9;:42::i;:::-;22249:44;;;7800:10;16949:34:1;;-1:-1:-1;;;;;17019:15:1;;17014:2;16999:18;;16992:43;17051:18;;;17044:34;;;22249:44:0;;;;;;;16899:2:1;22249:44:0;;;-1:-1:-1;22311:4:0;22059:264;;;;:::o;44006:354::-;9055:13;:11;:13::i;:::-;-1:-1:-1;;;;;44125:21:0;::::1;44117:45;;;;-1:-1:-1::0;;;44117:45:0::1;;;;;;;:::i;:::-;-1:-1:-1::0;;;;;44181:27:0;::::1;;::::0;;;:18:::1;:27;::::0;;;;;:38;::::1;;:27;::::0;;::::1;:38;;::::0;44173:65:::1;;;::::0;-1:-1:-1;;;44173:65:0;;17291:2:1;44173:65:0::1;::::0;::::1;17273:21:1::0;17330:2;17310:18;;;17303:30;-1:-1:-1;;;17349:18:1;;;17342:45;17404:18;;44173:65:0::1;17089:339:1::0;44173:65:0::1;-1:-1:-1::0;;;;;44249:27:0;::::1;;::::0;;;:18:::1;:27;::::0;;;;;;;;:37;;-1:-1:-1;;44249:37:0::1;::::0;::::1;;::::0;;::::1;::::0;;;44302:50;;16588:51:1;;;16655:18;;;16648:50;44323:10:0::1;::::0;44302:50:::1;::::0;16561:18:1;44302:50:0::1;16420:284:1::0;32855:225:0;9055:13;:11;:13::i;:::-;32952:6:::1;32932:26;;:16;;;;;;;;;;;:26;;::::0;32924:57:::1;;;::::0;-1:-1:-1;;;32924:57:0;;17635:2:1;32924:57:0::1;::::0;::::1;17617:21:1::0;17674:2;17654:18;;;17647:30;-1:-1:-1;;;17693:18:1;;;17686:48;17751:18;;32924:57:0::1;17433:342:1::0;32924:57:0::1;32992:16;:25:::0;;-1:-1:-1;;;;32992:25:0::1;-1:-1:-1::0;;;32992:25:0;::::1;;::::0;::::1;::::0;;;::::1;::::0;;;;33035:37:::1;::::0;32992:25:::1;33055:16:::0;;;::::1;;1301:14:1::0;1294:22;1276:41;;33035:37:0::1;::::0;1264:2:1;1249:18;33035:37:0::1;;;;;;;;32855:225:::0;:::o;45613:482::-;9055:13;:11;:13::i;:::-;45844:2:::1;45835:5:::0;45828:4;45820:5;45801:16:::1;45807:10:::0;45801:3;:16:::1;:::i;:::-;:24;;;;:::i;:::-;:31;;;;:::i;:::-;:39;;;;:::i;:::-;:45;;45793:78;;;::::0;-1:-1:-1;;;45793:78:0;;13892:2:1;45793:78:0::1;::::0;::::1;13874:21:1::0;13931:2;13911:18;;;13904:30;-1:-1:-1;;;13950:18:1;;;13943:50;14010:18;;45793:78:0::1;13690:344:1::0;45793:78:0::1;45882:7;:20:::0;;;45913:17;:30;;;45954:12;:20;;;45985:11;:18;;;46014:12;:20;;;46052:35:::1;::::0;46067:10:::1;::::0;46052:35:::1;::::0;::::1;::::0;45882:7;46052:35:::1;:::i;46433:262::-:0;9055:13;:11;:13::i;:::-;46532:21:::1;::::0;-1:-1:-1;;;46532:21:0;::::1;;;46520:33;;::::0;::::1;;::::0;46512:61:::1;;;::::0;-1:-1:-1;;;46512:61:0;;17291:2:1;46512:61:0::1;::::0;::::1;17273:21:1::0;17330:2;17310:18;;;17303:30;-1:-1:-1;;;17349:18:1;;;17342:45;17404:18;;46512:61:0::1;17089:339:1::0;46512:61:0::1;46584:21;:32:::0;;;::::1;;-1:-1:-1::0;;;46584:32:0::1;-1:-1:-1::0;;;;46584:32:0;;::::1;;::::0;;46634:53:::1;::::0;46666:10:::1;::::0;46634:53:::1;::::0;::::1;::::0;46608:8;1301:14:1;1294:22;1276:41;;1264:2;1249:18;;1136:187;46966:403:0;9055:13;:11;:13::i;:::-;-1:-1:-1;;;;;47086:32:0;::::1;47078:57;;;;-1:-1:-1::0;;;47078:57:0::1;;;;;;;:::i;:::-;47176:15;::::0;-1:-1:-1;;;;;47176:15:0;;::::1;47154:37:::0;;::::1;::::0;47146:94:::1;;;::::0;-1:-1:-1;;;47146:94:0;;18236:2:1;47146:94:0::1;::::0;::::1;18218:21:1::0;18275:2;18255:18;;;18248:30;18314:34;18294:18;;;18287:62;-1:-1:-1;;;18365:18:1;;;18358:42;18417:19;;47146:94:0::1;18034:408:1::0;47146:94:0::1;47251:15;:36:::0;;-1:-1:-1;;;;;;47251:36:0::1;-1:-1:-1::0;;;;;47251:36:0;::::1;::::0;;::::1;::::0;;;47305:56:::1;::::0;1074:51:1;;;47330:10:0::1;::::0;47305:56:::1;::::0;1062:2:1;1047:18;47305:56:0::1;928:203:1::0;33088:310:0;9055:13;:11;:13::i;:::-;-1:-1:-1;;;;;33173:26:0;::::1;33165:54;;;::::0;-1:-1:-1;;;33165:54:0;;18649:2:1;33165:54:0::1;::::0;::::1;18631:21:1::0;18688:2;18668:18;;;18661:30;-1:-1:-1;;;18707:18:1;;;18700:45;18762:18;;33165:54:0::1;18447:339:1::0;33165:54:0::1;33238:11;::::0;-1:-1:-1;;;;;33238:27:0;;::::1;:11:::0;::::1;:27:::0;33230:65:::1;;;::::0;-1:-1:-1;;;33230:65:0;;18993:2:1;33230:65:0::1;::::0;::::1;18975:21:1::0;19032:2;19012:18;;;19005:30;19071:27;19051:18;;;19044:55;19116:18;;33230:65:0::1;18791:349:1::0;33230:65:0::1;33306:11;:26:::0;;-1:-1:-1;;;;;;33306:26:0::1;-1:-1:-1::0;;;;;33306:26:0;::::1;::::0;;::::1;::::0;;;33348:42:::1;::::0;;33366:10:::1;19357:34:1::0;;19422:2;19407:18;;19400:43;;;;33348:42:0::1;::::0;19292:18:1;33348:42:0::1;19145:304:1::0;10075:201:0;9055:13;:11;:13::i;:::-;-1:-1:-1;;;;;10164:22:0;::::1;10156:73;;;::::0;-1:-1:-1;;;10156:73:0;;19656:2:1;10156:73:0::1;::::0;::::1;19638:21:1::0;19695:2;19675:18;;;19668:30;19734:34;19714:18;;;19707:62;-1:-1:-1;;;19785:18:1;;;19778:36;19831:19;;10156:73:0::1;19454:402:1::0;10156:73:0::1;10240:28;10259:8;10240:18;:28::i;:::-;10075:201:::0;:::o;48482:801::-;9055:13;:11;:13::i;:::-;-1:-1:-1;;;;;48574:23:0;::::1;48566:48;;;;-1:-1:-1::0;;;48566:48:0::1;;;;;;;:::i;:::-;48643:1;48633:7;:11;48625:67;;;::::0;-1:-1:-1;;;48625:67:0;;20063:2:1;48625:67:0::1;::::0;::::1;20045:21:1::0;20102:2;20082:18;;;20075:30;20141:34;20121:18;;;20114:62;-1:-1:-1;;;20192:18:1;;;20185:41;20243:19;;48625:67:0::1;19861:407:1::0;48625:67:0::1;48729:4;48709:26;::::0;;;:11:::1;:26;::::0;;;;;::::1;;:53:::0;::::1;;;-1:-1:-1::0;;;;;;48740:22:0;::::1;;::::0;;;:11:::1;:22;::::0;;;;;::::1;;48739:23;48709:53;48705:520;;;48779:56;48809:4;48816:9;48827:7;48779:21;:56::i;:::-;48705:520;;;48878:4;48858:26;::::0;;;:11:::1;:26;::::0;;;;;::::1;;48857:27;:53:::0;::::1;;;-1:-1:-1::0;;;;;;48888:22:0;::::1;;::::0;;;:11:::1;:22;::::0;;;;;::::1;;48857:53;48853:372;;;48927:54;48955:4;48962:9;48973:7;48927:19;:54::i;48853:372::-;49023:4;49003:26;::::0;;;:11:::1;:26;::::0;;;;;::::1;;:52:::0;::::1;;;-1:-1:-1::0;;;;;;49033:22:0;::::1;;::::0;;;:11:::1;:22;::::0;;;;;::::1;;49003:52;48999:226;;;49072:56;49102:4;49109:9;49120:7;49072:21;:56::i;48999:226::-;49161:52;49187:4;49194:9;49205:7;49161:17;:52::i;:::-;49256:9;-1:-1:-1::0;;;;;49242:33:0::1;;49267:7;49242:33;;;;2404:25:1::0;;2392:2;2377:18;;2258:177;9334:132:0;9215:7;9242:6;-1:-1:-1;;;;;9242:6:0;7800:10;9398:23;9390:68;;;;-1:-1:-1;;;9390:68:0;;20475:2:1;9390:68:0;;;20457:21:1;;;20494:18;;;20487:30;20553:34;20533:18;;;20526:62;20605:18;;9390:68:0;20273:356:1;33540:379:0;-1:-1:-1;;;;;33667:19:0;;33659:68;;;;-1:-1:-1;;;33659:68:0;;20836:2:1;33659:68:0;;;20818:21:1;20875:2;20855:18;;;20848:30;20914:34;20894:18;;;20887:62;-1:-1:-1;;;20965:18:1;;;20958:34;21009:19;;33659:68:0;20634:400:1;33659:68:0;-1:-1:-1;;;;;33746:21:0;;33738:68;;;;-1:-1:-1;;;33738:68:0;;21241:2:1;33738:68:0;;;21223:21:1;21280:2;21260:18;;;21253:30;21319:34;21299:18;;;21292:62;-1:-1:-1;;;21370:18:1;;;21363:32;21412:19;;33738:68:0;21039:398:1;33738:68:0;-1:-1:-1;;;;;33827:18:0;;;;;;;:11;:18;;;;;;;;:27;;;;;;;;;;;;;:36;;;33879:32;;2404:25:1;;;33879:32:0;;2377:18:1;33879:32:0;2258:177:1;33927:1016:0;-1:-1:-1;;;;;34049:18:0;;34041:68;;;;-1:-1:-1;;;34041:68:0;;21644:2:1;34041:68:0;;;21626:21:1;21683:2;21663:18;;;21656:30;21722:34;21702:18;;;21695:62;-1:-1:-1;;;21773:18:1;;;21766:35;21818:19;;34041:68:0;21442:401:1;34041:68:0;-1:-1:-1;;;;;34128:16:0;;34120:64;;;;-1:-1:-1;;;34120:64:0;;22050:2:1;34120:64:0;;;22032:21:1;22089:2;22069:18;;;22062:30;22128:34;22108:18;;;22101:62;-1:-1:-1;;;22179:18:1;;;22172:33;22222:19;;34120:64:0;21848:399:1;34120:64:0;34212:1;34203:6;:10;34195:64;;;;-1:-1:-1;;;34195:64:0;;22454:2:1;34195:64:0;;;22436:21:1;22493:2;22473:18;;;22466:30;22532:34;22512:18;;;22505:62;-1:-1:-1;;;22583:18:1;;;22576:39;22632:19;;34195:64:0;22252:405:1;34195:64:0;34272:28;34303:24;34321:4;34303:9;:24::i;:::-;34402:29;;34272:55;;-1:-1:-1;34365:66:0;;;;;;;34460:53;;-1:-1:-1;34497:16:0;;-1:-1:-1;;;34497:16:0;;;;34496:17;34460:53;:102;;;;-1:-1:-1;;;;;;34531:31:0;;;;;;:25;:31;;;;;;;;34530:32;34460:102;:140;;;;-1:-1:-1;34579:21:0;;-1:-1:-1;;;34579:21:0;;;;34460:140;:180;;;;-1:-1:-1;34625:15:0;;-1:-1:-1;;;;;34617:23:0;;;34625:15;;34617:23;;34460:180;:218;;;;-1:-1:-1;34663:15:0;;-1:-1:-1;;;;;34657:21:0;;;34663:15;;34657:21;;34460:218;34442:383;;;34728:29;;34705:52;;34774:39;34792:20;34774:17;:39::i;:::-;34903:32;34918:4;34924:2;34928:6;34903:14;:32::i;:::-;34030:913;;33927:1016;;;:::o;21607:238::-;21736:7;21772:12;21764:6;;;;21756:29;;;;-1:-1:-1;;;21756:29:0;;;;;;;;:::i;:::-;-1:-1:-1;21796:9:0;21808:8;:1;21814;21808:5;:8::i;:::-;21796:20;21607:238;-1:-1:-1;;;;;21607:238:0:o;41874:687::-;42023:15;42053:23;42091:12;42118:23;42156:12;42183:18;42215:19;42226:7;42215:10;:19::i;:::-;-1:-1:-1;;;;;42263:15:0;;;;;;:7;:15;;;;;;42008:226;;-1:-1:-1;42008:226:0;;-1:-1:-1;42008:226:0;;-1:-1:-1;42008:226:0;-1:-1:-1;42008:226:0;-1:-1:-1;42008:226:0;-1:-1:-1;42263:28:0;;42008:226;42263:19;:28::i;:::-;-1:-1:-1;;;;;42245:15:0;;;;;;;:7;:15;;;;;;;;:46;;;;42323:18;;;;;:7;:18;;;;;:39;;42346:15;42323:22;:39::i;:::-;-1:-1:-1;;;;;42302:18:0;;;;;;:7;:18;;;;;;;;:60;;;;42394:7;:18;;;;:39;;42417:15;42394:22;:39::i;:::-;-1:-1:-1;;;;;42373:18:0;;;;;;:7;:18;;;;;:60;42444:49;42453:6;42461:7;42470:10;42482:4;42488;42444:8;:49::i;:::-;42526:9;-1:-1:-1;;;;;42509:44:0;42518:6;-1:-1:-1;;;;;42509:44:0;-1:-1:-1;;;;;;;;;;;42537:15:0;42509:44;;;;2404:25:1;;2392:2;2377:18;;2258:177;42509:44:0;;;;;;;;41997:564;;;;;;41874:687;;;:::o;43252:746::-;43403:15;43433:23;43471:12;43498:23;43536:12;43563:18;43595:19;43606:7;43595:10;:19::i;:::-;-1:-1:-1;;;;;43643:15:0;;;;;;:7;:15;;;;;;43388:226;;-1:-1:-1;43388:226:0;;-1:-1:-1;43388:226:0;;-1:-1:-1;43388:226:0;-1:-1:-1;43388:226:0;-1:-1:-1;43388:226:0;-1:-1:-1;43643:28:0;;43663:7;43643:19;:28::i;:::-;-1:-1:-1;;;;;43625:15:0;;;;;;:7;:15;;;;;;;;:46;;;;43700:7;:15;;;;:28;;43720:7;43700:19;:28::i;29477:164::-;29519:7;29540:15;29557;29576:19;:17;:19::i;:::-;29539:56;;-1:-1:-1;29539:56:0;-1:-1:-1;29613:20:0;29539:56;;29613:11;:20::i;:::-;29606:27;;;;29477:164;:::o;4013:98::-;4071:7;4098:5;4102:1;4098;:5;:::i;2876:98::-;2934:7;2961:5;2965:1;2961;:5;:::i;26978:848::-;27078:7;27100;27122;27144;27166;27188;27238:23;27276:12;27303:18;27336;27369:13;27396:20;27408:7;27396:11;:20::i;:::-;27223:193;;;;;;;;;;27428:15;27445:23;27470:12;27486:158;27512:7;27534:4;27553:10;27578;27603:5;27623:10;:8;:10::i;:::-;27486:11;:158::i;:::-;27427:217;;-1:-1:-1;27427:217:0;-1:-1:-1;27427:217:0;-1:-1:-1;27748:15:0;;-1:-1:-1;27778:4:0;;-1:-1:-1;27797:10:0;;-1:-1:-1;;;;;;26978:848:0;;;;;;;:::o;3257:98::-;3315:7;3342:5;3346:1;3342;:5;:::i;10436:191::-;10510:16;10529:6;;-1:-1:-1;;;;;10546:17:0;;;-1:-1:-1;;;;;;10546:17:0;;;;;;10579:40;;10529:6;;;;;;;10579:40;;10510:16;10579:40;10499:128;10436:191;:::o;42569:675::-;42720:15;42750:23;42788:12;42815:23;42853:12;42880:18;42912:19;42923:7;42912:10;:19::i;:::-;-1:-1:-1;;;;;42960:15:0;;;;;;:7;:15;;;;;;42705:226;;-1:-1:-1;42705:226:0;;-1:-1:-1;42705:226:0;;-1:-1:-1;42705:226:0;-1:-1:-1;42705:226:0;-1:-1:-1;42705:226:0;-1:-1:-1;42960:28:0;;42980:7;42960:19;:28::i;:::-;-1:-1:-1;;;;;42942:15:0;;;;;;:7;:15;;;;;;;;:46;;;;43017:7;:15;;;;:28;;43037:7;43017:19;:28::i;:::-;-1:-1:-1;;;;;42999:15:0;;;;;;;:7;:15;;;;;;:46;;;;43077:18;;;;;;;:39;;43100:15;43077:22;:39::i;41252:614::-;41399:15;41429:23;41467:12;41494:23;41532:12;41559:18;41591:19;41602:7;41591:10;:19::i;:::-;-1:-1:-1;;;;;41639:15:0;;;;;;:7;:15;;;;;;41384:226;;-1:-1:-1;41384:226:0;;-1:-1:-1;41384:226:0;;-1:-1:-1;41384:226:0;-1:-1:-1;41384:226:0;-1:-1:-1;41384:226:0;-1:-1:-1;41639:28:0;;41384:226;41639:19;:28::i;34951:1164::-;18629:16;:23;;-1:-1:-1;;;;18629:23:0;-1:-1:-1;;;18629:23:0;;;35311:12;;35280:11;;35248:12;;35217:11;;35311:7:::1;35183:14:::0;35280:6:::1;35150:13:::0;35113:17;;35078:16;;18629:23;;35078:246:::1;::::0;35311:12;;35078:214:::1;::::0;35280:11;;35078:214;;35248:12;;35078:214;;;;;;35150:13;;35078:214;;:34:::1;:53::i;:::-;:71:::0;::::1;:86::i;:246::-;35378:7;:14:::0;35362:6:::1;:13:::0;35062:262;;-1:-1:-1;35349:10:0::1;::::0;35362:30:::1;::::0;35378:14;35362:30:::1;:::i;:::-;35349:43:::0;-1:-1:-1;35403:20:0::1;35426:39;35459:5:::0;35426:28:::1;:20:::0;35349:43;35426:24:::1;:28::i;:::-;:32:::0;::::1;:39::i;:::-;35403:62;;35476:28;35491:12;35476:14;:28::i;:::-;35551:12:::0;;35537:11;;35517:17:::1;::::0;35537:26:::1;::::0;::::1;:::i;:::-;35517:46:::0;-1:-1:-1;35574:15:0::1;35592:46;35632:5:::0;35592:35:::1;:20:::0;35517:46;35592:24:::1;:35::i;:46::-;35574:64;;35649:19;35660:7;35649:10;:19::i;:::-;35723:17:::0;;35704:16;;35681:20:::1;::::0;35704:36:::1;::::0;::::1;:::i;:::-;35681:59:::0;-1:-1:-1;35751:20:0::1;35774:49;35817:5:::0;35774:38:::1;:20:::0;35681:59;35774:24:::1;:38::i;:49::-;35751:72;;35834:29;35850:12;35834:15;:29::i;:::-;35908:12:::0;;35894:11;;35876:15:::1;::::0;35894:26:::1;::::0;::::1;:::i;:::-;35876:44:::0;-1:-1:-1;35931:15:0::1;35949:44;35987:5:::0;35949:33:::1;:20:::0;35876:44;35949:24:::1;:33::i;:44::-;35931:62;;36004:19;36015:7;36004:10;:19::i;:::-;36041:66;::::0;;23115:25:1;;;23171:2;23156:18;;23149:34;;;23199:18;;;23192:34;;;23257:2;23242:18;;23235:34;;;36041:66:0::1;::::0;23102:3:1;23087:19;36041:66:0::1;;;;;;;-1:-1:-1::0;;18675:16:0;:24;;-1:-1:-1;;;;18675:24:0;;;-1:-1:-1;;;;;;;;34951:1164:0:o;39194:1163::-;-1:-1:-1;;;;;39327:26:0;;;;;;:18;:26;;;;;;;;39326:27;:61;;;;-1:-1:-1;;;;;;39358:29:0;;;;;;:18;:29;;;;;;;;39357:30;39326:61;39322:432;;;39412:16;;-1:-1:-1;;;39412:16:0;;;;39404:48;;;;-1:-1:-1;;;39404:48:0;;23482:2:1;39404:48:0;;;23464:21:1;23521:2;23501:18;;;23494:30;-1:-1:-1;;;23540:18:1;;;23533:49;23599:18;;39404:48:0;23280:343:1;39404:48:0;-1:-1:-1;;;;;39473:33:0;;;;;;:25;:33;;;;;;;;:41;;:33;:41;39469:274;;39535:13;:20;;-1:-1:-1;;;;39535:20:0;-1:-1:-1;;;39535:20:0;;;39574:11;32449:10;;32439:7;:20;32449:6;32486:13;32470;:29;32526:16;;32510:13;:32;32564:11;;32553:8;:22;32597:11;;32586:8;:22;32399:217;39574:11;39469:274;;;-1:-1:-1;;;;;39611:36:0;;;;;;:25;:36;;;;;;;;:44;;:36;:44;39607:136;;39676:13;:20;;-1:-1:-1;;;;39676:20:0;-1:-1:-1;;;39676:20:0;;;39715:12;32675:11;;32665:7;:21;32675:7;32713:14;32697:13;:30;32754:17;;32738:13;:33;32793:12;;32782:8;:23;32827:12;;32816:8;:23;32624:223;39715:12;-1:-1:-1;;;;;39770:19:0;;;;;;:11;:19;;;;;;;;:46;;;;-1:-1:-1;;;;;;39794:22:0;;;;;;:11;:22;;;;;;;;39793:23;39770:46;39766:467;;;39833:48;39855:6;39863:9;39874:6;39833:21;:48::i;:::-;39766:467;;;-1:-1:-1;;;;;39904:19:0;;;;;;:11;:19;;;;;;;;39903:20;:46;;;;-1:-1:-1;;;;;;39927:22:0;;;;;;:11;:22;;;;;;;;39903:46;39899:334;;;39966:46;39986:6;39994:9;40005:6;39966:19;:46::i;39899:334::-;-1:-1:-1;;;;;40034:19:0;;;;;;:11;:19;;;;;;;;:45;;;;-1:-1:-1;;;;;;40057:22:0;;;;;;:11;:22;;;;;;;;40034:45;40030:203;;;40096:48;40118:6;40126:9;40137:6;40096:21;:48::i;40030:203::-;40177:44;40195:6;40203:9;40214:6;40177:17;:44::i;:::-;40249:13;;-1:-1:-1;;;40249:13:0;;;;:21;;40266:4;40249:21;40245:105;;40287:13;:21;;-1:-1:-1;;;;40287:21:0;;;40323:15;32280:1;32270:7;:11;;;32292:13;:17;;;32320:13;:17;;;32348:8;:12;;;32371:8;:12;32226:165;40323:15;39194:1163;;;:::o;40365:879::-;40539:13;;-1:-1:-1;;;40539:13:0;;;;:21;;40556:4;40539:21;40535:702;;40577:18;40598:30;40620:7;40598:21;:30::i;:::-;40577:51;;40643:13;40659:25;40676:7;40659:16;:25::i;:::-;40643:41;;40699:13;40715:25;40732:7;40715:16;:25::i;:::-;40699:41;;40757:26;40772:10;40757:14;:26::i;:::-;40798:40;40820:10;40832:5;40798:21;:40::i;:::-;40853:16;40863:5;40853:9;:16::i;:::-;40911:23;40923:4;40929;40911:11;:23::i;:::-;41147:4;-1:-1:-1;;;;;41087:138:0;;-1:-1:-1;;;;;;;;;;;41205:5:0;41197;41171:23;41184:10;41171;:23;:::i;:::-;:31;;;;:::i;:::-;:39;;;;:::i;:::-;41087:138;;2404:25:1;;;2392:2;2377:18;41087:138:0;;;;;;;40562:675;;;40365:879;;;;;:::o;29649:605::-;29747:7;;29700;;;;15462:13;29700:7;29801:338;29825:9;:16;29821:20;;29801:338;;;29909:7;29885;:21;29893:9;29903:1;29893:12;;;;;;;;:::i;:::-;;;;;;;;;;;;;-1:-1:-1;;;;;29893:12:0;29885:21;;;;;;;;;;;;;:31;;:83;;;29961:7;29937;:21;29945:9;29955:1;29945:12;;;;;;;;:::i;:::-;;;;;;;;;;;;;-1:-1:-1;;;;;29945:12:0;29937:21;;;;;;;;;;;;;:31;29885:83;29863:146;;;-1:-1:-1;;29992:7:0;;;15462:13;;-1:-1:-1;29649:605:0;-1:-1:-1;;29649:605:0:o;29863:146::-;30034:34;30046:7;:21;30054:9;30064:1;30054:12;;;;;;;;:::i;:::-;;;;;;;;;;;;;-1:-1:-1;;;;;30054:12:0;30046:21;;;;;;;;;;;;;30034:7;;:11;:34::i;:::-;30024:44;;30093:34;30105:7;:21;30113:9;30123:1;30113:12;;;;;;;;:::i;:::-;;;;;;;;;;;;;-1:-1:-1;;;;;30113:12:0;30105:21;;;;;;;;;;;;;30093:7;;:11;:34::i;:::-;30083:44;-1:-1:-1;29843:3:0;;;;:::i;:::-;;;;29801:338;;;-1:-1:-1;30163:7:0;;:20;;15462:13;30163:11;:20::i;:::-;30153:7;:30;30149:61;;;-1:-1:-1;;30193:7:0;;;15462:13;;-1:-1:-1;29649:605:0;-1:-1:-1;29649:605:0:o;30149:61::-;30229:7;;30238;;-1:-1:-1;29649:605:0;-1:-1:-1;29649:605:0:o;27834:723::-;27935:7;27957;27979;28001;28023;28058:12;28073:24;28089:7;28073:15;:24::i;:::-;28058:39;;28108:18;28129:30;28151:7;28129:21;:30::i;:::-;28108:51;;28170:18;28191:30;28213:7;28191:21;:30::i;:::-;28170:51;;28232:13;28248:25;28265:7;28248:16;:25::i;:::-;28232:41;;28284:13;28300:25;28317:7;28300:16;:25::i;:::-;28284:41;-1:-1:-1;28336:23:0;28362:33;28384:10;28362:17;:7;28374:4;28362:11;:17::i;:33::-;28336:59;-1:-1:-1;28424:53:0;28471:5;28424:42;28460:5;28424:42;28336:59;28444:10;28424:19;:31::i;:53::-;28406:71;28513:4;;-1:-1:-1;28519:10:0;;-1:-1:-1;28531:10:0;;-1:-1:-1;28531:10:0;-1:-1:-1;27834:723:0;;-1:-1:-1;;;;27834:723:0:o;28565:904::-;28817:7;;;;28914:24;:7;28926:11;28914;:24::i;:::-;28896:42;-1:-1:-1;28949:12:0;28964:21;:4;28973:11;28964:8;:21::i;:::-;28949:36;-1:-1:-1;28996:18:0;29017:27;:10;29032:11;29017:14;:27::i;:::-;28996:48;-1:-1:-1;29055:18:0;29076:27;:10;29091:11;29076:14;:27::i;:::-;29055:48;-1:-1:-1;29114:13:0;29130:22;:5;29140:11;29130:9;:22::i;:::-;29114:38;;29163:13;29179:25;29196:7;29179:16;:25::i;:::-;29163:41;-1:-1:-1;29215:13:0;29231:22;29163:41;29241:11;29231:9;:22::i;:::-;29215:38;-1:-1:-1;29264:22:0;29289:58;29215:38;29289:47;29330:5;29289:47;29314:10;29289:47;:4;29298:10;29289:8;:20::i;:58::-;29264:83;-1:-1:-1;29358:23:0;29384:27;:7;29264:83;29384:11;:27::i;:::-;29430:7;;-1:-1:-1;29358:53:0;;-1:-1:-1;29456:4:0;;-1:-1:-1;;;;;;;;28565:904:0;;;;;;;;;;:::o;3614:98::-;3672:7;3699:5;3703:1;3699;:5;:::i;37902:423::-;37961:12;37976:13;:6;37987:1;37976:10;:13::i;:::-;37961:28;-1:-1:-1;38000:17:0;38020:16;:6;37961:28;38020:10;:16::i;:::-;38000:36;-1:-1:-1;38074:21:0;38108:22;38125:4;38108:16;:22::i;:::-;38143:18;38164:41;:21;38190:14;38164:25;:41::i;:::-;38143:62;;38218:35;38231:9;38242:10;38218:12;:35::i;:::-;38271:46;;;24003:25:1;;;24059:2;24044:18;;24037:34;;;24087:18;;;24080:34;;;38271:46:0;;23991:2:1;23976:18;38271:46:0;;;;;;;37950:375;;;;37902:423;:::o;36123:560::-;36177:19;36199:10;:8;:10::i;:::-;36177:32;-1:-1:-1;36220:13:0;36236:22;:5;36177:32;36236:9;:22::i;:::-;-1:-1:-1;;;;;36301:10:0;36293:19;;;;;:7;:19;;;;;;36220:38;;-1:-1:-1;36293:30:0;;36220:38;36293:23;:30::i;:::-;-1:-1:-1;;;;;36279:10:0;36271:19;;;;;:7;:19;;;;;;:52;;;;36375:4;36359:22;;;;:33;;36386:5;36359:26;:33::i;:::-;36350:4;36334:22;;;;:7;:22;;;;;;;;:58;;;;36421:10;-1:-1:-1;;;;;36409:23:0;;;:11;:23;;;;;;36405:94;;;-1:-1:-1;;;;;36477:10:0;36469:19;;;;;:7;:19;;;;;;:30;;36493:5;36469:23;:30::i;:::-;-1:-1:-1;;;;;36455:10:0;36447:19;;;;;:7;:19;;;;;:52;36405:94;36536:4;36516:26;;;;:11;:26;;;;;;;;36512:103;;;36598:4;36582:22;;;;:7;:22;;;;;;:33;;36609:5;36582:26;:33::i;:::-;36573:4;36557:22;;;;:7;:22;;;;;:58;36512:103;36633:42;;2404:25:1;;;-1:-1:-1;;;;;36657:10:0;36633:42;;36650:4;;-1:-1:-1;;;;;;;;;;;36633:42:0;2392:2:1;2377:18;36633:42:0;2258:177:1;37259:635:0;37323:19;37345:10;:8;:10::i;:::-;37323:32;-1:-1:-1;37366:18:0;37387:27;:10;37323:32;37387:14;:27::i;:::-;37462:15;;-1:-1:-1;;;;;37462:15:0;37454:24;;;;:7;:24;;;;;;37366:48;;-1:-1:-1;37454:40:0;;37366:48;37454:28;:40::i;:::-;37435:15;;-1:-1:-1;;;;;37435:15:0;37427:24;;;;:7;:24;;;;;;:67;;;;37546:4;37530:22;;;;:38;;37557:10;37530:26;:38::i;:::-;37521:4;37505:22;;;;:7;:22;;;;;;;;:63;;;;37597:15;;-1:-1:-1;;;;;37597:15:0;37585:28;;:11;:28;;;;;;37581:114;;;37663:15;;-1:-1:-1;;;;;37663:15:0;37655:24;;;;:7;:24;;;;;;:40;;37684:10;37655:28;:40::i;:::-;37636:15;;-1:-1:-1;;;;;37636:15:0;37628:24;;;;:7;:24;;;;;:67;37581:114;37732:4;37712:26;;;;:11;:26;;;;;;;;37708:108;;;37794:4;37778:22;;;;:7;:22;;;;;;:38;;37805:10;37778:26;:38::i;:::-;37769:4;37753:22;;;;:7;:22;;;;;:63;37708:108;37858:15;;37834:52;;2404:25:1;;;-1:-1:-1;;;;;37858:15:0;;;;37851:4;;-1:-1:-1;;;;;;;;;;;37834:52:0;2392:2:1;2377:18;37834:52:0;2258:177:1;36691:560:0;36745:19;36767:10;:8;:10::i;:::-;36745:32;-1:-1:-1;36788:13:0;36804:22;:5;36745:32;36804:9;:22::i;:::-;36869:10;;-1:-1:-1;;;;;36869:10:0;36861:19;;;;:7;:19;;;;;;36788:38;;-1:-1:-1;36861:30:0;;36788:38;36861:23;:30::i;:::-;36847:10;;-1:-1:-1;;;;;36847:10:0;36839:19;;;;:7;:19;;;;;;:52;;;;36943:4;36927:22;;;;:33;;36954:5;36927:26;:33::i;:::-;36918:4;36902:22;;;;:7;:22;;;;;;;;:58;;;;36989:10;;-1:-1:-1;;;;;36989:10:0;36977:23;;:11;:23;;;;;;36973:94;;;37045:10;;-1:-1:-1;;;;;37045:10:0;37037:19;;;;:7;:19;;;;;;:30;;37061:5;37037:23;:30::i;:::-;37023:10;;-1:-1:-1;;;;;37023:10:0;37015:19;;;;:7;:19;;;;;:52;36973:94;37104:4;37084:26;;;;:11;:26;;;;;;;;37080:103;;;37166:4;37150:22;;;;:7;:22;;;;;;:33;;37177:5;37150:26;:33::i;:::-;37141:4;37125:22;;;;:7;:22;;;;;:58;37080:103;37225:10;;37201:42;;2404:25:1;;;-1:-1:-1;;;;;37225:10:0;;;;37218:4;;-1:-1:-1;;;;;;;;;;;37201:42:0;2392:2:1;2377:18;37201:42:0;2258:177:1;31904:174:0;32001:7;32033:37;32064:5;32033:26;32045:13;;32033:7;:11;;:26;;;;:::i;31764:132::-;31829:7;31856:32;31882:5;31856:21;31868:8;;31856:7;:11;;:21;;;;:::i;32086:132::-;32151:7;32178:32;32204:5;32178:21;32190:8;;32178:7;:11;;:21;;;;:::i;30262:355::-;30325:19;30347:10;:8;:10::i;:::-;30325:32;-1:-1:-1;30368:18:0;30389:27;:10;30325:32;30389:14;:27::i;:::-;30468:4;30452:22;;;;:7;:22;;;;;;30368:48;;-1:-1:-1;30452:38:0;;30368:48;30452:26;:38::i;:::-;30443:4;30427:22;;;;:7;:22;;;;;;;;:63;;;;30505:11;:26;;;;;;30501:108;;;30587:4;30571:22;;;;:7;:22;;;;;;:38;;30598:10;30571:26;:38::i;:::-;30562:4;30546:22;;;;:7;:22;;;;;:63;30314:303;;30262:355;:::o;30958:478::-;31043:19;31065:10;:8;:10::i;:::-;31043:32;-1:-1:-1;31086:18:0;31107:27;:10;31043:32;31107:14;:27::i;:::-;31086:48;-1:-1:-1;31145:13:0;31161:22;:5;31171:11;31161:9;:22::i;:::-;31235:4;31219:22;;;;:7;:22;;;;;;31145:38;;-1:-1:-1;31219:49:0;;31257:10;;31219:33;;31145:38;31219:26;:33::i;:49::-;31210:4;31194:22;;;;:7;:22;;;;;;;;:74;;;;31283:11;:26;;;;;;31279:149;;;31409:18;31422:5;31409:10;:18;:::i;:::-;31382:4;31366:22;;;;:7;:22;;;;;;:62;;;;:::i;:::-;31340:4;31324:22;;;;:7;:22;;;;;:104;31032:404;;;30958:478;;:::o;26823:147::-;26901:7;;:17;;26913:4;26901:11;:17::i;:::-;26891:7;:27;26942:10;;:20;;26957:4;26942:14;:20::i;:::-;26929:10;:33;-1:-1:-1;;26823:147:0:o;31444:130::-;31508:7;31535:31;31560:5;31535:20;31547:7;;31535;:11;;:20;;;;:::i;31582:174::-;31679:7;31711:37;31742:5;31711:26;31723:13;;31711:7;:11;;:26;;;;:::i;38333:475::-;38423:16;;;38437:1;38423:16;;;;;;;;38399:21;;38423:16;;;;;;;;;;-1:-1:-1;38423:16:0;38399:40;;38468:4;38450;38455:1;38450:7;;;;;;;;:::i;:::-;-1:-1:-1;;;;;38450:23:0;;;:7;;;;;;;;;;:23;;;;38494:15;;:22;;;-1:-1:-1;;;38494:22:0;;;;:15;;;;;:20;;:22;;;;;38450:7;;38494:22;;;;;:15;:22;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;38484:4;38489:1;38484:7;;;;;;;;:::i;:::-;-1:-1:-1;;;;;38484:32:0;;;:7;;;;;;;;;:32;38561:15;;38529:62;;38546:4;;38561:15;38579:11;38529:8;:62::i;:::-;38604:15;;:196;;-1:-1:-1;;;38604:196:0;;-1:-1:-1;;;;;38604:15:0;;;;:66;;:196;;38685:11;;38604:15;;38727:4;;38754;;38774:15;;38604:196;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;38388:420;38333:475;:::o;38816:370::-;38929:15;;38897:62;;38914:4;;-1:-1:-1;;;;;38929:15:0;38947:11;38897:8;:62::i;:::-;38972:15;;39122;;38972:206;;-1:-1:-1;;;38972:206:0;;39044:4;38972:206;;;25847:34:1;25897:18;;;25890:34;;;38972:15:0;25940:18:1;;;25933:34;;;25983:18;;;25976:34;-1:-1:-1;;;;;39122:15:0;;;26026:19:1;;;26019:44;39152:15:0;26079:19:1;;;26072:35;38972:15:0;;;:31;;39011:9;;25781:19:1;;38972:206:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;293:139:1:-;-1:-1:-1;;;;;376:31:1;;366:42;;356:70;;422:1;419;412:12;437:486;528:6;536;544;597:2;585:9;576:7;572:23;568:32;565:52;;;613:1;610;603:12;565:52;652:9;639:23;671:39;704:5;671:39;:::i;:::-;729:5;-1:-1:-1;786:2:1;771:18;;758:32;799:41;758:32;799:41;:::i;:::-;437:486;;859:7;;-1:-1:-1;;;913:2:1;898:18;;;;885:32;;437:486::o;1328:597::-;1440:4;1469:2;1498;1487:9;1480:21;1530:6;1524:13;1573:6;1568:2;1557:9;1553:18;1546:34;1598:1;1608:140;1622:6;1619:1;1616:13;1608:140;;;1717:14;;;1713:23;;1707:30;1683:17;;;1702:2;1679:26;1672:66;1637:10;;1608:140;;;1766:6;1763:1;1760:13;1757:91;;;1836:1;1831:2;1822:6;1811:9;1807:22;1803:31;1796:42;1757:91;-1:-1:-1;1909:2:1;1888:15;-1:-1:-1;;1884:29:1;1869:45;;;;1916:2;1865:54;;1328:597;-1:-1:-1;;;1328:597:1:o;1930:323::-;1998:6;2006;2059:2;2047:9;2038:7;2034:23;2030:32;2027:52;;;2075:1;2072;2065:12;2027:52;2114:9;2101:23;2133:39;2166:5;2133:39;:::i;:::-;2191:5;2243:2;2228:18;;;;2215:32;;-1:-1:-1;;;1930:323:1:o;2440:255::-;2499:6;2552:2;2540:9;2531:7;2527:23;2523:32;2520:52;;;2568:1;2565;2558:12;2520:52;2607:9;2594:23;2626:39;2659:5;2626:39;:::i;3879:180::-;3938:6;3991:2;3979:9;3970:7;3966:23;3962:32;3959:52;;;4007:1;4004;3997:12;3959:52;-1:-1:-1;4030:23:1;;3879:180;-1:-1:-1;3879:180:1:o;4253:118::-;4339:5;4332:13;4325:21;4318:5;4315:32;4305:60;;4361:1;4358;4351:12;4376:309;4441:6;4449;4502:2;4490:9;4481:7;4477:23;4473:32;4470:52;;;4518:1;4515;4508:12;4470:52;4554:9;4541:23;4531:33;;4614:2;4603:9;4599:18;4586:32;4627:28;4649:5;4627:28;:::i;:::-;4674:5;4664:15;;;4376:309;;;;;:::o;5026:454::-;5121:6;5129;5137;5145;5153;5206:3;5194:9;5185:7;5181:23;5177:33;5174:53;;;5223:1;5220;5213:12;5174:53;-1:-1:-1;;5246:23:1;;;5316:2;5301:18;;5288:32;;-1:-1:-1;5367:2:1;5352:18;;5339:32;;5418:2;5403:18;;5390:32;;-1:-1:-1;5469:3:1;5454:19;5441:33;;-1:-1:-1;5026:454:1;-1:-1:-1;5026:454:1:o;5485:390::-;5550:6;5558;5611:2;5599:9;5590:7;5586:23;5582:32;5579:52;;;5627:1;5624;5617:12;5579:52;5666:9;5653:23;5685:39;5718:5;5685:39;:::i;:::-;5743:5;-1:-1:-1;5800:2:1;5785:18;;5772:32;5813:30;5772:32;5813:30;:::i;5880:241::-;5936:6;5989:2;5977:9;5968:7;5964:23;5960:32;5957:52;;;6005:1;6002;5995:12;5957:52;6044:9;6031:23;6063:28;6085:5;6063:28;:::i;6126:404::-;6194:6;6202;6255:2;6243:9;6234:7;6230:23;6226:32;6223:52;;;6271:1;6268;6261:12;6223:52;6310:9;6297:23;6329:39;6362:5;6329:39;:::i;:::-;6387:5;-1:-1:-1;6444:2:1;6429:18;;6416:32;6457:41;6416:32;6457:41;:::i;7239:184::-;7309:6;7362:2;7350:9;7341:7;7337:23;7333:32;7330:52;;;7378:1;7375;7368:12;7330:52;-1:-1:-1;7401:16:1;;7239:184;-1:-1:-1;7239:184:1:o;7428:342::-;7630:2;7612:21;;;7669:2;7649:18;;;7642:30;-1:-1:-1;;;7703:2:1;7688:18;;7681:48;7761:2;7746:18;;7428:342::o;7775:245::-;7842:6;7895:2;7883:9;7874:7;7870:23;7866:32;7863:52;;;7911:1;7908;7901:12;7863:52;7943:9;7937:16;7962:28;7984:5;7962:28;:::i;8367:336::-;8569:2;8551:21;;;8608:2;8588:18;;;8581:30;-1:-1:-1;;;8642:2:1;8627:18;;8620:42;8694:2;8679:18;;8367:336::o;8708:::-;8910:2;8892:21;;;8949:2;8929:18;;;8922:30;-1:-1:-1;;;8983:2:1;8968:18;;8961:42;9035:2;9020:18;;8708:336::o;9049:399::-;9251:2;9233:21;;;9290:2;9270:18;;;9263:30;9329:34;9324:2;9309:18;;9302:62;-1:-1:-1;;;9395:2:1;9380:18;;9373:33;9438:3;9423:19;;9049:399::o;11778:127::-;11839:10;11834:3;11830:20;11827:1;11820:31;11870:4;11867:1;11860:15;11894:4;11891:1;11884:15;11910:127;11971:10;11966:3;11962:20;11959:1;11952:31;12002:4;11999:1;11992:15;12026:4;12023:1;12016:15;12042:125;12082:4;12110:1;12107;12104:8;12101:34;;;12115:18;;:::i;:::-;-1:-1:-1;12152:9:1;;12042:125::o;12172:127::-;12233:10;12228:3;12224:20;12221:1;12214:31;12264:4;12261:1;12254:15;12288:4;12285:1;12278:15;12304:135;12343:3;12364:17;;;12361:43;;12384:18;;:::i;:::-;-1:-1:-1;12431:1:1;12420:13;;12304:135::o;13557:128::-;13597:3;13628:1;13624:6;13621:1;13618:13;13615:39;;;13634:18;;:::i;:::-;-1:-1:-1;13670:9:1;;13557:128::o;14714:247::-;14466:12;;14454:25;;14528:4;14517:16;;14511:23;14504:4;14495:14;;14488:47;14584:4;14573:16;;14567:23;14560:4;14551:14;;14544:47;14640:4;14629:16;;14623:23;14616:4;14607:14;;14600:47;14696:4;14685:16;;14679:23;14672:4;14663:14;;14656:47;14891:3;14876:19;;14904:51;14386:323;22662:217;22702:1;22728;22718:132;;22772:10;22767:3;22763:20;22760:1;22753:31;22807:4;22804:1;22797:15;22835:4;22832:1;22825:15;22718:132;-1:-1:-1;22864:9:1;;22662:217::o;23628:168::-;23668:7;23734:1;23730;23726:6;23722:14;23719:1;23716:21;23711:1;23704:9;23697:17;23693:45;23690:71;;;23741:18;;:::i;:::-;-1:-1:-1;23781:9:1;;23628:168::o;24257:259::-;24327:6;24380:2;24368:9;24359:7;24355:23;24351:32;24348:52;;;24396:1;24393;24386:12;24348:52;24428:9;24422:16;24447:39;24480:5;24447:39;:::i;24521:980::-;24783:4;24831:3;24820:9;24816:19;24862:6;24851:9;24844:25;24888:2;24926:6;24921:2;24910:9;24906:18;24899:34;24969:3;24964:2;24953:9;24949:18;24942:31;24993:6;25028;25022:13;25059:6;25051;25044:22;25097:3;25086:9;25082:19;25075:26;;25136:2;25128:6;25124:15;25110:29;;25157:1;25167:195;25181:6;25178:1;25175:13;25167:195;;;25246:13;;-1:-1:-1;;;;;25242:39:1;25230:52;;25337:15;;;;25302:12;;;;25278:1;25196:9;25167:195;;;-1:-1:-1;;;;;;;25418:32:1;;;;25413:2;25398:18;;25391:60;-1:-1:-1;;;25482:3:1;25467:19;25460:35;25379:3;24521:980;-1:-1:-1;;;24521:980:1:o;26118:306::-;26206:6;26214;26222;26275:2;26263:9;26254:7;26250:23;26246:32;26243:52;;;26291:1;26288;26281:12;26243:52;26320:9;26314:16;26304:26;;26370:2;26359:9;26355:18;26349:25;26339:35;;26414:2;26403:9;26399:18;26393:25;26383:35;;26118:306;;;;;:::o

Swarm Source

ipfs://8b76c3abc8074058bd6eb1af9b97726ea5880cc2726e3f0ccfef8a5a2659b821

Block Transaction Difficulty Gas Used Reward
View All Blocks Produced

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

OVERVIEW

Empire is building an ecosystem of market-driven decentralized applications to facilitate the growth of all DeFi users. We focus on bringing decentralization to the mainstream and helping people get started with DeFi by equipping them with the tools they need.

Validator Index Block Amount
View All Withdrawals

Transaction Hash Block Value Eth2 PubKey Valid
View All Deposits
Loading...
Loading
[ Download: CSV Export  ]
[ Download: CSV Export  ]

A contract address hosts a smart contract, which is a set of code stored on the blockchain that runs when predetermined conditions are met. Learn more about addresses in our Knowledge Base.