ETH Price: $2,356.50 (+1.88%)

Contract

0xa91902085405CE0F648a7Eb82045Aefc1B7BAC01
 

Overview

ETH Balance

0 ETH

Eth Value

$0.00

Multichain Info

No addresses found
Transaction Hash
Method
Block
From
To
Swap155684042022-09-19 15:18:47721 days ago1663600727IN
0xa9190208...c1B7BAC01
0 ETH0.000994969.81585632
Swap155683222022-09-19 15:02:11721 days ago1663599731IN
0xa9190208...c1B7BAC01
0 ETH0.0013070612.89379042
Swap155680962022-09-19 14:16:35721 days ago1663596995IN
0xa9190208...c1B7BAC01
0 ETH0.0018741416.29084016
Remove Liquidity...121211482021-03-27 12:47:121262 days ago1616849232IN
0xa9190208...c1B7BAC01
0 ETH0.01559513113
Remove Liquidity...120138302021-03-10 23:36:251279 days ago1615419385IN
0xa9190208...c1B7BAC01
0 ETH0.0100914393.00000145
Remove Liquidity...120035162021-03-09 9:28:181281 days ago1615282098IN
0xa9190208...c1B7BAC01
0 ETH0.0107262599
Remove Liquidity...119722592021-03-04 14:10:471285 days ago1614867047IN
0xa9190208...c1B7BAC01
0 ETH0.0117334595
Remove Liquidity...119291582021-02-25 22:57:271292 days ago1614293847IN
0xa9190208...c1B7BAC01
0 ETH0.01630951151
Remove Liquidity...119288972021-02-25 21:55:481292 days ago1614290148IN
0xa9190208...c1B7BAC01
0 ETH0.01378077127
Remove Liquidity...119227062021-02-24 23:09:141293 days ago1614208154IN
0xa9190208...c1B7BAC01
0 ETH0.01540842142
Remove Liquidity...119203522021-02-24 14:20:271293 days ago1614176427IN
0xa9190208...c1B7BAC01
0 ETH0.01747011161
Remove Liquidity...119152462021-02-23 19:23:071294 days ago1614108187IN
0xa9190208...c1B7BAC01
0 ETH0.02368521171
Remove Liquidity...119093902021-02-22 21:54:561295 days ago1614030896IN
0xa9190208...c1B7BAC01
0 ETH0.01895643162
Remove Liquidity...119072162021-02-22 13:51:301295 days ago1614001890IN
0xa9190208...c1B7BAC01
0 ETH0.01882848176
Remove Liquidity...119071812021-02-22 13:43:411295 days ago1614001421IN
0xa9190208...c1B7BAC01
0 ETH0.01720288160
Remove Liquidity...119071602021-02-22 13:39:481295 days ago1614001188IN
0xa9190208...c1B7BAC01
0 ETH0.02278537186
Remove Liquidity...119070342021-02-22 13:12:011295 days ago1613999521IN
0xa9190208...c1B7BAC01
0 ETH0.02181051201
Remove Liquidity...119066242021-02-22 11:44:341296 days ago1613994274IN
0xa9190208...c1B7BAC01
0 ETH0.01457811135
Remove Liquidity...119065032021-02-22 11:17:151296 days ago1613992635IN
0xa9190208...c1B7BAC01
0 ETH0.01683575122
Remove Liquidity...119058562021-02-22 8:54:071296 days ago1613984047IN
0xa9190208...c1B7BAC01
0 ETH0.01512875123
Remove Liquidity...119057502021-02-22 8:27:331296 days ago1613982453IN
0xa9190208...c1B7BAC01
0 ETH0.01324907122.1
Remove Liquidity...119057262021-02-22 8:21:091296 days ago1613982069IN
0xa9190208...c1B7BAC01
0 ETH0.01457418118
Remove Liquidity...119054782021-02-22 7:25:581296 days ago1613978758IN
0xa9190208...c1B7BAC01
0 ETH0.0135861110
Remove Liquidity...119051052021-02-22 5:59:141296 days ago1613973554IN
0xa9190208...c1B7BAC01
0 ETH0.01236335100.1
Remove Liquidity...119040152021-02-22 2:00:011296 days ago1613959201IN
0xa9190208...c1B7BAC01
0 ETH0.01261952102.3
View all transactions

Latest 25 internal transactions (View All)

Advanced mode:
Parent Transaction Hash Block From To
118459432021-02-13 3:34:511305 days ago1613187291
0xa9190208...c1B7BAC01
 Contract Creation0 ETH
117657462021-01-31 19:35:371317 days ago1612121737
0xa9190208...c1B7BAC01
 Contract Creation0 ETH
116716532021-01-17 8:30:351332 days ago1610872235
0xa9190208...c1B7BAC01
 Contract Creation0 ETH
116498142021-01-13 23:44:011335 days ago1610581441
0xa9190208...c1B7BAC01
 Contract Creation0 ETH
116178972021-01-09 2:25:401340 days ago1610159140
0xa9190208...c1B7BAC01
 Contract Creation0 ETH
115711802021-01-01 22:37:151347 days ago1609540635
0xa9190208...c1B7BAC01
 Contract Creation0 ETH
115711792021-01-01 22:37:121347 days ago1609540632
0xa9190208...c1B7BAC01
 Contract Creation0 ETH
115711792021-01-01 22:37:121347 days ago1609540632
0xa9190208...c1B7BAC01
 Contract Creation0 ETH
115707632021-01-01 20:59:401347 days ago1609534780
0xa9190208...c1B7BAC01
 Contract Creation0 ETH
115697932021-01-01 17:22:141347 days ago1609521734
0xa9190208...c1B7BAC01
 Contract Creation0 ETH
115694402021-01-01 16:04:451347 days ago1609517085
0xa9190208...c1B7BAC01
 Contract Creation0 ETH
115693822021-01-01 15:52:451347 days ago1609516365
0xa9190208...c1B7BAC01
 Contract Creation0 ETH
115693232021-01-01 15:41:251347 days ago1609515685
0xa9190208...c1B7BAC01
 Contract Creation0 ETH
115691242021-01-01 15:00:381347 days ago1609513238
0xa9190208...c1B7BAC01
 Contract Creation0 ETH
115689182021-01-01 14:18:251347 days ago1609510705
0xa9190208...c1B7BAC01
 Contract Creation0 ETH
115689152021-01-01 14:18:041347 days ago1609510684
0xa9190208...c1B7BAC01
 Contract Creation0 ETH
115689132021-01-01 14:17:551347 days ago1609510675
0xa9190208...c1B7BAC01
 Contract Creation0 ETH
115688832021-01-01 14:11:511347 days ago1609510311
0xa9190208...c1B7BAC01
 Contract Creation0 ETH
115688382021-01-01 14:01:391347 days ago1609509699
0xa9190208...c1B7BAC01
 Contract Creation0 ETH
115688022021-01-01 13:54:031347 days ago1609509243
0xa9190208...c1B7BAC01
 Contract Creation0 ETH
115687672021-01-01 13:44:141347 days ago1609508654
0xa9190208...c1B7BAC01
 Contract Creation0 ETH
115687492021-01-01 13:39:301347 days ago1609508370
0xa9190208...c1B7BAC01
 Contract Creation0 ETH
115686732021-01-01 13:24:541347 days ago1609507494
0xa9190208...c1B7BAC01
 Contract Creation0 ETH
115686292021-01-01 13:15:021347 days ago1609506902
0xa9190208...c1B7BAC01
 Contract Creation0 ETH
115686272021-01-01 13:14:391347 days ago1609506879
0xa9190208...c1B7BAC01
 Contract Creation0 ETH
View All Internal Transactions
Loading...
Loading

Contract Source Code Verified (Exact Match)

Contract Name:
FlashApp

Compiler Version
v0.6.12+commit.27d51765

Optimization Enabled:
No with 200 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity)

/**
 *Submitted for verification at Etherscan.io on 2021-01-01
*/

// SPDX-License-Identifier: MIT

pragma solidity 0.6.12;

interface IERC20 {
    function totalSupply() external view returns (uint256);

    function balanceOf(address account) external view returns (uint256);

    function allowance(address owner, address spender) external view returns (uint256);

    function approve(address spender, uint256 amount) external returns (bool);

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

    function transferFrom(
        address sender,
        address recipient,
        uint256 amount
    ) external returns (bool);

    function burn(uint256 value) external returns (bool);
}


pragma solidity 0.6.12;

interface IFlashReceiver {
    function receiveFlash(
        bytes32 _id,
        uint256 _amountIn,
        uint256 _expireAfter,
        uint256 _mintedAmount,
        address _staker,
        bytes calldata _data
    ) external returns (uint256);
}


pragma solidity 0.6.12;

interface IFlashProtocol {
    function stake(
        uint256 _amountIn,
        uint256 _days,
        address _receiver,
        bytes calldata _data
    )
        external
        returns (
            uint256 mintedAmount,
            uint256 matchedAmount,
            bytes32 id
        );

    function unstake(bytes32 _id)
        external
        returns (uint256 withdrawAmount);

    function getFPY(uint256 _amountIn) external view returns (uint256);
}


pragma solidity 0.6.12;

// A library for performing overflow-safe math, courtesy of DappHub: https://github.com/dapphub/ds-math/blob/d0ef6d6a5f/src/math.sol
// Modified to include only the essentials
library SafeMath {
    function add(uint256 x, uint256 y) internal pure returns (uint256 z) {
        require((z = x + y) >= x, "MATH:: ADD_OVERFLOW");
    }

    function sub(uint256 x, uint256 y) internal pure returns (uint256 z) {
        require((z = x - y) <= x, "MATH:: SUB_UNDERFLOW");
    }

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

        uint256 c = a * b;
        require(c / a == b, "MATH:: MUL_OVERFLOW");

        return c;
    }

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

        return c;
    }

    function min(uint x, uint y) internal pure returns (uint z) {
        z = x < y ? x : y;
    }

    // babylonian method (https://en.wikipedia.org/wiki/Methods_of_computing_square_roots#Babylonian_method)
    function sqrt(uint y) internal pure returns (uint z) {
        if (y > 3) {
            z = y;
            uint x = y / 2 + 1;
            while (x < z) {
                z = x;
                x = (y / x + x) / 2;
            }
        } else if (y != 0) {
            z = 1;
        }
    }
}


pragma solidity 0.6.12;

/**
 * @dev Collection of functions related to the address type
 */
library Address {
    /**
     * @dev Returns true if `account` is a contract.
     *
     * [IMPORTANT]
     * ====
     * It is unsafe to assume that an address for which this function returns
     * false is an externally-owned account (EOA) and not a contract.
     *
     * Among others, `isContract` will return false for the following
     * types of addresses:
     *
     *  - an externally-owned account
     *  - a contract in construction
     *  - an address where a contract will be created
     *  - an address where a contract lived, but was destroyed
     * ====
     */
    function isContract(address account) internal view returns (bool) {
        // This method relies on extcodesize, which returns 0 for contracts in
        // construction, since the code is only stored at the end of the
        // constructor execution.

        uint256 size;
        // solhint-disable-next-line no-inline-assembly
        assembly {
            size := extcodesize(account)
        }
        return size > 0;
    }
}



pragma solidity ^0.6.0;

/**
 * @dev Helper to make usage of the `CREATE2` EVM opcode easier and safer.
 * `CREATE2` can be used to compute in advance the address where a smart
 * contract will be deployed, which allows for interesting new mechanisms known
 * as 'counterfactual interactions'.
 *
 * See the https://eips.ethereum.org/EIPS/eip-1014#motivation[EIP] for more
 * information.
 */
library Create2 {
    /**
     * @dev Deploys a contract using `CREATE2`. The address where the contract
     * will be deployed can be known in advance via {computeAddress}.
     *
     * The bytecode for a contract can be obtained from Solidity with
     * `type(contractName).creationCode`.
     *
     * Requirements:
     *
     * - `bytecode` must not be empty.
     * - `salt` must have not been used for `bytecode` already.
     * - the factory must have a balance of at least `amount`.
     * - if `amount` is non-zero, `bytecode` must have a `payable` constructor.
     */
    function deploy(uint256 amount, bytes32 salt, bytes memory bytecode) internal returns (address) {
        address addr;
        require(address(this).balance >= amount, "Create2: insufficient balance");
        require(bytecode.length != 0, "Create2: bytecode length is zero");
        // solhint-disable-next-line no-inline-assembly
        assembly {
            addr := create2(amount, add(bytecode, 0x20), mload(bytecode), salt)
        }
        require(addr != address(0), "Create2: Failed on deploy");
        return addr;
    }

    /**
     * @dev Returns the address where a contract will be stored if deployed via {deploy}. Any change in the
     * `bytecodeHash` or `salt` will result in a new destination address.
     */
    function computeAddress(bytes32 salt, bytes32 bytecodeHash) internal view returns (address) {
        return computeAddress(salt, bytecodeHash, address(this));
    }

    /**
     * @dev Returns the address where a contract will be stored if deployed via {deploy} from a contract located at
     * `deployer`. If `deployer` is this contract's address, returns the same value as {computeAddress}.
     */
    function computeAddress(bytes32 salt, bytes32 bytecodeHash, address deployer) internal pure returns (address) {
        bytes32 _data = keccak256(
            abi.encodePacked(bytes1(0xff), deployer, salt, bytecodeHash)
        );
        return address(uint256(_data));
    }
}


pragma solidity 0.6.12;

interface IPool {
    function initialize(address _token) external;

    function stakeWithFeeRewardDistribution(
        uint256 _amountIn,
        address _staker,
        uint256 _expectedOutput
    ) external returns (uint256 result);

    function addLiquidity(
        uint256 _amountFLASH,
        uint256 _amountALT,
        uint256 _amountFLASHMin,
        uint256 _amountALTMin,
        address _maker
    )
        external
        returns (
            uint256,
            uint256,
            uint256
        );

    function removeLiquidity(address _maker) external returns (uint256, uint256);

    function swapWithFeeRewardDistribution(
        uint256 _amountIn,
        address _staker,
        uint256 _expectedOutput
    ) external returns (uint256 result);
}


pragma solidity 0.6.12;



// Lightweight token modelled after UNI-LP:
// https://github.com/Uniswap/uniswap-v2-core/blob/v1.0.1/contracts/UniswapV2ERC20.sol
// Adds:
//   - An exposed `mint()` with minting role
//   - An exposed `burn()`
//   - ERC-3009 (`transferWithAuthorization()`)
//   - flashMint() - allows to flashMint an arbitrary amount of FLASH, with the
//     condition that it is burned before the end of the transaction.
contract PoolERC20 is IERC20 {
    using SafeMath for uint256;

    // bytes32 private constant EIP712DOMAIN_HASH =
    // keccak256("EIP712Domain(string name,string version,uint256 chainId,address verifyingContract)")
    bytes32 private constant EIP712DOMAIN_HASH = 0x8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f;

    // bytes32 private constant NAME_HASH = keccak256("FLASH-ALT-LP Token")
    bytes32 private constant NAME_HASH = 0xfdde3a7807889787f51ab17062704a0d81341ba7debe5a9773b58a1b5e5f422c;

    // bytes32 private constant VERSION_HASH = keccak256("1")
    bytes32 private constant VERSION_HASH = 0xc89efdaa54c0f20c7adf612882df0950f5a951637e0307cdcb4c672f298b8bc6;

    // bytes32 public constant PERMIT_TYPEHASH =
    // keccak256("Permit(address owner,address spender,uint256 value,uint256 nonce,uint256 deadline)");
    bytes32 public constant PERMIT_TYPEHASH = 0x6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c9;

    // bytes32 public constant TRANSFER_WITH_AUTHORIZATION_TYPEHASH =
    // keccak256("TransferWithAuthorization(address from,address to,uint256 value,uint256 validAfter,uint256 validBefore,bytes32 nonce)");
    bytes32
        public constant TRANSFER_WITH_AUTHORIZATION_TYPEHASH = 0x7c7c6cdb67a18743f49ec6fa9b35f50d52ed05cbed4cc592e13b44501c1a2267;

    string public constant name = "FLASH-ALT-LP Token";
    string public constant symbol = "FLASH-ALT-LP";
    uint8 public constant decimals = 18;

    uint256 public override totalSupply;

    address public minter;

    mapping(address => uint256) public override balanceOf;
    mapping(address => mapping(address => uint256)) public override allowance;

    // ERC-2612, ERC-3009 state
    mapping(address => uint256) public nonces;
    mapping(address => mapping(bytes32 => bool)) public authorizationState;

    event Approval(address indexed owner, address indexed spender, uint256 value);
    event Transfer(address indexed from, address indexed to, uint256 value);
    event AuthorizationUsed(address indexed authorizer, bytes32 indexed nonce);

    function _validateSignedData(
        address signer,
        bytes32 encodeData,
        uint8 v,
        bytes32 r,
        bytes32 s
    ) internal view {
        bytes32 digest = keccak256(abi.encodePacked("\x19\x01", getDomainSeparator(), encodeData));
        address recoveredAddress = ecrecover(digest, v, r, s);
        // Explicitly disallow authorizations for address(0) as ecrecover returns address(0) on malformed messages
        require(recoveredAddress != address(0) && recoveredAddress == signer, "FLASH-ALT-LP Token:: INVALID_SIGNATURE");
    }

    function _mint(address to, uint256 value) internal {
        totalSupply = totalSupply.add(value);
        balanceOf[to] = balanceOf[to].add(value);
        emit Transfer(address(0), to, value);
    }

    function _burn(address from, uint256 value) internal {
        // Balance is implicitly checked with SafeMath's underflow protection
        balanceOf[from] = balanceOf[from].sub(value);
        totalSupply = totalSupply.sub(value);
        emit Transfer(from, address(0), value);
    }

    function _approve(
        address owner,
        address spender,
        uint256 value
    ) private {
        allowance[owner][spender] = value;
        emit Approval(owner, spender, value);
    }

    function _transfer(
        address from,
        address to,
        uint256 value
    ) private {
        require(to != address(0), "FLASH-ALT-LP Token:: RECEIVER_IS_TOKEN_OR_ZERO");
        // Balance is implicitly checked with SafeMath's underflow protection
        balanceOf[from] = balanceOf[from].sub(value);
        balanceOf[to] = balanceOf[to].add(value);
        emit Transfer(from, to, value);
    }

    function getChainId() public pure returns (uint256 chainId) {
        // solhint-disable-next-line no-inline-assembly
        assembly {
            chainId := chainid()
        }
    }

    function getDomainSeparator() public view returns (bytes32) {
        return keccak256(abi.encode(EIP712DOMAIN_HASH, NAME_HASH, VERSION_HASH, getChainId(), address(this)));
    }

    function burn(uint256 value) external override returns (bool) {
        _burn(msg.sender, value);
        return true;
    }

    function approve(address spender, uint256 value) external override returns (bool) {
        _approve(msg.sender, spender, value);
        return true;
    }

    function transfer(address to, uint256 value) external override returns (bool) {
        _transfer(msg.sender, to, value);
        return true;
    }

    function transferFrom(
        address from,
        address to,
        uint256 value
    ) external override returns (bool) {
        uint256 fromAllowance = allowance[from][msg.sender];
        if (fromAllowance != uint256(-1)) {
            // Allowance is implicitly checked with SafeMath's underflow protection
            allowance[from][msg.sender] = fromAllowance.sub(value);
        }
        _transfer(from, to, value);
        return true;
    }

    function permit(
        address owner,
        address spender,
        uint256 value,
        uint256 deadline,
        uint8 v,
        bytes32 r,
        bytes32 s
    ) external {
        require(deadline >= block.timestamp, "FLASH-ALT-LP Token:: AUTH_EXPIRED");

        bytes32 encodeData = keccak256(abi.encode(PERMIT_TYPEHASH, owner, spender, value, nonces[owner], deadline));
        nonces[owner] = nonces[owner].add(1);
        _validateSignedData(owner, encodeData, v, r, s);

        _approve(owner, spender, value);
    }

    function transferWithAuthorization(
        address from,
        address to,
        uint256 value,
        uint256 validAfter,
        uint256 validBefore,
        bytes32 nonce,
        uint8 v,
        bytes32 r,
        bytes32 s
    ) external {
        require(block.timestamp > validAfter, "FLASH-ALT-LP Token:: AUTH_NOT_YET_VALID");
        require(block.timestamp < validBefore, "FLASH-ALT-LP Token:: AUTH_EXPIRED");
        require(!authorizationState[from][nonce], "FLASH-ALT-LP Token:: AUTH_ALREADY_USED");

        bytes32 encodeData = keccak256(
            abi.encode(TRANSFER_WITH_AUTHORIZATION_TYPEHASH, from, to, value, validAfter, validBefore, nonce)
        );
        _validateSignedData(from, encodeData, v, r, s);

        authorizationState[from][nonce] = true;
        emit AuthorizationUsed(from, nonce);

        _transfer(from, to, value);
    }
}

// File: ../../../../media/shakeib98/xio-flashapp-contracts/contracts/pool/contracts/Pool.sol

pragma solidity 0.6.12;






contract Pool is PoolERC20, IPool {
    using SafeMath for uint256;

    uint256 public constant MINIMUM_LIQUIDITY = 10**3;
    bytes4 private constant TRANSFER_SELECTOR = bytes4(keccak256(bytes("transfer(address,uint256)")));
    address public constant FLASH_TOKEN = 0xB4467E8D621105312a914F1D42f10770C0Ffe3c8;
    address public constant FLASH_PROTOCOL = 0xEc02f813404656E2A2AEd5BaeEd41D785324E8D0;

    uint256 public reserveFlashAmount;
    uint256 public reserveAltAmount;
    uint256 private unlocked = 1;

    address public token;
    address public factory;

    modifier lock() {
        require(unlocked == 1, "Pool: LOCKED");
        unlocked = 0;
        _;
        unlocked = 1;
    }

    modifier onlyFactory() {
        require(msg.sender == factory, "Pool:: ONLY_FACTORY");
        _;
    }

    constructor() public {
        factory = msg.sender;
    }

    function _safeTransfer(
        address _token,
        address _to,
        uint256 _value
    ) private {
        (bool success, bytes memory data) = _token.call(abi.encodeWithSelector(TRANSFER_SELECTOR, _to, _value));
        require(success && (data.length == 0 || abi.decode(data, (bool))), "Pool:: TRANSFER_FAILED");
    }

    function initialize(address _token) public override onlyFactory {
        token = _token;
    }

    function swapWithFeeRewardDistribution(
        uint256 _amountIn,
        address _staker,
        uint256 _expectedOutput
    ) public override lock onlyFactory returns (uint256 result) {
        result = getAPYSwap(_amountIn);
        require(_expectedOutput <= result, "Pool:: EXPECTED_IS_GREATER");
        calcNewReserveSwap(_amountIn, result);
        _safeTransfer(FLASH_TOKEN, _staker, result);
    }

    function stakeWithFeeRewardDistribution(
        uint256 _amountIn,
        address _staker,
        uint256 _expectedOutput
    ) public override lock onlyFactory returns (uint256 result) {
        result = getAPYStake(_amountIn);
        require(_expectedOutput <= result, "Pool:: EXPECTED_IS_GREATER");
        calcNewReserveStake(_amountIn, result);
        _safeTransfer(token, _staker, result);
    }

    function addLiquidity(
        uint256 _amountFLASH,
        uint256 _amountALT,
        uint256 _amountFLASHMin,
        uint256 _amountALTMin,
        address _maker
    )
        public
        override
        onlyFactory
        returns (
            uint256 amountFLASH,
            uint256 amountALT,
            uint256 liquidity
        )
    {
        (amountFLASH, amountALT) = _addLiquidity(_amountFLASH, _amountALT, _amountFLASHMin, _amountALTMin);
        liquidity = mintLiquidityTokens(_maker, amountFLASH, amountALT);
        calcNewReserveAddLiquidity(amountFLASH, amountALT);
    }

    function removeLiquidity(address _maker)
        public
        override
        onlyFactory
        returns (uint256 amountFLASH, uint256 amountALT)
    {
        (amountFLASH, amountALT) = burn(_maker);
    }

    function getAPYStake(uint256 _amountIn) public view returns (uint256 result) {
        uint256 amountInWithFee = _amountIn.mul(getLPFee());
        uint256 num = amountInWithFee.mul(reserveAltAmount);
        uint256 den = (reserveFlashAmount.mul(1000)).add(amountInWithFee);
        result = num.div(den);
    }

    function getAPYSwap(uint256 _amountIn) public view returns (uint256 result) {
        uint256 amountInWithFee = _amountIn.mul(getLPFee());
        uint256 num = amountInWithFee.mul(reserveFlashAmount);
        uint256 den = (reserveAltAmount.mul(1000)).add(amountInWithFee);
        result = num.div(den);
    }

    function getLPFee() public view returns (uint256) {
        uint256 fpy = IFlashProtocol(FLASH_PROTOCOL).getFPY(0);
        return uint256(1000).sub(fpy.div(5e15));
    }

    function quote(
        uint256 _amountA,
        uint256 _reserveA,
        uint256 _reserveB
    ) public pure returns (uint256 amountB) {
        require(_amountA > 0, "Pool:: INSUFFICIENT_AMOUNT");
        require(_reserveA > 0 && _reserveB > 0, "Pool:: INSUFFICIENT_LIQUIDITY");
        amountB = _amountA.mul(_reserveB).div(_reserveA);
    }

    function burn(address to) private lock returns (uint256 amountFLASH, uint256 amountALT) {
        uint256 balanceFLASH = IERC20(FLASH_TOKEN).balanceOf(address(this));
        uint256 balanceALT = IERC20(token).balanceOf(address(this));
        uint256 liquidity = balanceOf[address(this)];

        amountFLASH = liquidity.mul(balanceFLASH) / totalSupply;
        amountALT = liquidity.mul(balanceALT) / totalSupply;

        require(amountFLASH > 0 && amountALT > 0, "Pool:: INSUFFICIENT_LIQUIDITY_BURNED");

        _burn(address(this), liquidity);

        _safeTransfer(FLASH_TOKEN, to, amountFLASH);
        _safeTransfer(token, to, amountALT);

        balanceFLASH = balanceFLASH.sub(IERC20(FLASH_TOKEN).balanceOf(address(this)));
        balanceALT = balanceALT.sub(IERC20(token).balanceOf(address(this)));

        calcNewReserveRemoveLiquidity(balanceFLASH, balanceALT);
    }

    function _addLiquidity(
        uint256 _amountFLASH,
        uint256 _amountALT,
        uint256 _amountFLASHMin,
        uint256 _amountALTMin
    ) private view returns (uint256 amountFLASH, uint256 amountALT) {
        if (reserveAltAmount == 0 && reserveFlashAmount == 0) {
            (amountFLASH, amountALT) = (_amountFLASH, _amountALT);
        } else {
            uint256 amountALTQuote = quote(_amountFLASH, reserveFlashAmount, reserveAltAmount);
            if (amountALTQuote <= _amountALT) {
                require(amountALTQuote >= _amountALTMin, "Pool:: INSUFFICIENT_B_AMOUNT");
                (amountFLASH, amountALT) = (_amountFLASH, amountALTQuote);
            } else {
                uint256 amountFLASHQuote = quote(_amountALT, reserveAltAmount, reserveFlashAmount);
                require(
                    (amountFLASHQuote <= _amountFLASH) && (amountFLASHQuote >= _amountFLASHMin),
                    "Pool:: INSUFFICIENT_A_AMOUNT"
                );
                (amountFLASH, amountALT) = (amountFLASHQuote, _amountALT);
            }
        }
    }

    function mintLiquidityTokens(
        address _to,
        uint256 _flashAmount,
        uint256 _altAmount
    ) private returns (uint256 liquidity) {
        if (totalSupply == 0) {
            liquidity = SafeMath.sqrt(_flashAmount.mul(_altAmount)).sub(MINIMUM_LIQUIDITY);
            _mint(address(0), MINIMUM_LIQUIDITY);
        } else {
            liquidity = SafeMath.min(
                _flashAmount.mul(totalSupply) / reserveFlashAmount,
                _altAmount.mul(totalSupply) / reserveAltAmount
            );
        }
        require(liquidity > 0, "Pool:: INSUFFICIENT_LIQUIDITY_MINTED");
        _mint(_to, liquidity);
    }

    function calcNewReserveStake(uint256 _amountIn, uint256 _amountOut) private {
        reserveFlashAmount = reserveFlashAmount.add(_amountIn);
        reserveAltAmount = reserveAltAmount.sub(_amountOut);
    }

    function calcNewReserveSwap(uint256 _amountIn, uint256 _amountOut) private {
        reserveFlashAmount = reserveFlashAmount.sub(_amountOut);
        reserveAltAmount = reserveAltAmount.add(_amountIn);
    }

    function calcNewReserveAddLiquidity(uint256 _amountFLASH, uint256 _amountALT) private {
        reserveFlashAmount = reserveFlashAmount.add(_amountFLASH);
        reserveAltAmount = reserveAltAmount.add(_amountALT);
    }

    function calcNewReserveRemoveLiquidity(uint256 _amountFLASH, uint256 _amountALT) private {
        reserveFlashAmount = reserveFlashAmount.sub(_amountFLASH);
        reserveAltAmount = reserveAltAmount.sub(_amountALT);
    }
}


pragma solidity 0.6.12;









contract FlashApp is IFlashReceiver {
    using SafeMath for uint256;

    address public constant FLASH_TOKEN = 0xB4467E8D621105312a914F1D42f10770C0Ffe3c8;
    address public constant FLASH_PROTOCOL = 0xEc02f813404656E2A2AEd5BaeEd41D785324E8D0;

    mapping(bytes32 => uint256) public stakerReward;
    mapping(address => address) public pools; // token -> pools

    event PoolCreated(address _pool, address _token);

    event Staked(bytes32 _id, uint256 _rewardAmount, address _pool);

    event LiquidityAdded(address _pool, uint256 _amountFLASH, uint256 _amountALT, uint256 _liquidity, address _sender);

    event LiquidityRemoved(
        address _pool,
        uint256 _amountFLASH,
        uint256 _amountALT,
        uint256 _liquidity,
        address _sender
    );

    event Swapped(address _sender, uint256 _swapAmount, uint256 _flashReceived, address _pool);

    modifier onlyProtocol() {
        require(msg.sender == FLASH_PROTOCOL, "FlashApp:: ONLY_PROTOCOL");
        _;
    }

    function createPool(address _token) external returns (address poolAddress) {
        require(_token != address(0), "FlashApp:: INVALID_TOKEN_ADDRESS");
        require(pools[_token] == address(0), "FlashApp:: POOL_ALREADY_EXISTS");
        bytes memory bytecode = type(Pool).creationCode;
        bytes32 salt = keccak256(abi.encodePacked(block.timestamp, msg.sender));
        poolAddress = Create2.deploy(0, salt, bytecode);
        pools[_token] = poolAddress;
        IPool(poolAddress).initialize(_token);
        emit PoolCreated(poolAddress, _token);
    }

    function receiveFlash(
        bytes32 _id,
        uint256 _amountIn, //unused
        uint256 _expireAfter, //unused
        uint256 _mintedAmount,
        address _staker,
        bytes calldata _data
    ) external override onlyProtocol returns (uint256) {
        (address token, uint256 expectedOutput) = abi.decode(_data, (address, uint256));
        address pool = pools[token];
        IERC20(FLASH_TOKEN).transfer(pool, _mintedAmount);
        uint256 reward = IPool(pool).stakeWithFeeRewardDistribution(_mintedAmount, _staker, expectedOutput);
        stakerReward[_id] = reward;
        emit Staked(_id, reward, pool);
    }

    function unstake(bytes32[] memory _expiredIds) public {
        for (uint256 i = 0; i < _expiredIds.length; i = i.add(1)) {
            IFlashProtocol(FLASH_PROTOCOL).unstake(_expiredIds[i]);
        }
    }

    function swap(
        uint256 _altQuantity,
        address _token,
        uint256 _expectedOutput
    ) public returns (uint256 result) {
        address user = msg.sender;
        address pool = pools[_token];

        require(pool != address(0), "FlashApp:: POOL_DOESNT_EXIST");
        require(_altQuantity > 0, "FlashApp:: INVALID_AMOUNT");

        IERC20(_token).transferFrom(user, address(this), _altQuantity);
        IERC20(_token).transfer(pool, _altQuantity);

        result = IPool(pool).swapWithFeeRewardDistribution(_altQuantity, user, _expectedOutput);

        emit Swapped(user, _altQuantity, result, pool);
    }

    function addLiquidityInPool(
        uint256 _amountFLASH,
        uint256 _amountALT,
        uint256 _amountFLASHMin,
        uint256 _amountALTMin,
        address _token
    ) public {
        address maker = msg.sender;
        address pool = pools[_token];

        require(pool != address(0), "FlashApp:: POOL_DOESNT_EXIST");
        require(_amountFLASH > 0 && _amountALT > 0, "FlashApp:: INVALID_AMOUNT");

        (uint256 amountFLASH, uint256 amountALT, uint256 liquidity) = IPool(pool).addLiquidity(
            _amountFLASH,
            _amountALT,
            _amountFLASHMin,
            _amountALTMin,
            maker
        );

        IERC20(FLASH_TOKEN).transferFrom(maker, address(this), amountFLASH);
        IERC20(FLASH_TOKEN).transfer(pool, amountFLASH);
        IERC20(_token).transferFrom(maker, address(this), amountALT);
        IERC20(_token).transfer(pool, amountALT);

        emit LiquidityAdded(pool, amountFLASH, amountALT, liquidity, maker);
    }

    function removeLiquidityInPool(uint256 _liquidity, address _token) public {
        address maker = msg.sender;

        address pool = pools[_token];

        require(pool != address(0), "FlashApp:: POOL_DOESNT_EXIST");

        IERC20(pool).transferFrom(maker, address(this), _liquidity);
        IERC20(pool).transfer(pool, _liquidity);

        (uint256 amountFLASH, uint256 amountALT) = IPool(pool).removeLiquidity(maker);

        emit LiquidityRemoved(pool, amountFLASH, amountALT, _liquidity, maker);
    }
}

Contract Security Audit

Contract ABI

[{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"_pool","type":"address"},{"indexed":false,"internalType":"uint256","name":"_amountFLASH","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"_amountALT","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"_liquidity","type":"uint256"},{"indexed":false,"internalType":"address","name":"_sender","type":"address"}],"name":"LiquidityAdded","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"_pool","type":"address"},{"indexed":false,"internalType":"uint256","name":"_amountFLASH","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"_amountALT","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"_liquidity","type":"uint256"},{"indexed":false,"internalType":"address","name":"_sender","type":"address"}],"name":"LiquidityRemoved","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"_pool","type":"address"},{"indexed":false,"internalType":"address","name":"_token","type":"address"}],"name":"PoolCreated","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"bytes32","name":"_id","type":"bytes32"},{"indexed":false,"internalType":"uint256","name":"_rewardAmount","type":"uint256"},{"indexed":false,"internalType":"address","name":"_pool","type":"address"}],"name":"Staked","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"_sender","type":"address"},{"indexed":false,"internalType":"uint256","name":"_swapAmount","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"_flashReceived","type":"uint256"},{"indexed":false,"internalType":"address","name":"_pool","type":"address"}],"name":"Swapped","type":"event"},{"inputs":[],"name":"FLASH_PROTOCOL","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"FLASH_TOKEN","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_amountFLASH","type":"uint256"},{"internalType":"uint256","name":"_amountALT","type":"uint256"},{"internalType":"uint256","name":"_amountFLASHMin","type":"uint256"},{"internalType":"uint256","name":"_amountALTMin","type":"uint256"},{"internalType":"address","name":"_token","type":"address"}],"name":"addLiquidityInPool","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_token","type":"address"}],"name":"createPool","outputs":[{"internalType":"address","name":"poolAddress","type":"address"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"pools","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"_id","type":"bytes32"},{"internalType":"uint256","name":"_amountIn","type":"uint256"},{"internalType":"uint256","name":"_expireAfter","type":"uint256"},{"internalType":"uint256","name":"_mintedAmount","type":"uint256"},{"internalType":"address","name":"_staker","type":"address"},{"internalType":"bytes","name":"_data","type":"bytes"}],"name":"receiveFlash","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_liquidity","type":"uint256"},{"internalType":"address","name":"_token","type":"address"}],"name":"removeLiquidityInPool","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"name":"stakerReward","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_altQuantity","type":"uint256"},{"internalType":"address","name":"_token","type":"address"},{"internalType":"uint256","name":"_expectedOutput","type":"uint256"}],"name":"swap","outputs":[{"internalType":"uint256","name":"result","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32[]","name":"_expiredIds","type":"bytes32[]"}],"name":"unstake","outputs":[],"stateMutability":"nonpayable","type":"function"}]

608060405234801561001057600080fd5b50615336806100206000396000f3fe608060405234801561001057600080fd5b506004361061009e5760003560e01c8063a4063dbc11610066578063a4063dbc146102d4578063a7f0e90314610342578063b12c10f714610376578063d959d8bc1461042e578063eb1ce2211461049a5761009e565b80631d994a53146100a357806323c6e14c146100f15780632cbff4461461012557806343264349146101fa5780639049f9d214610266575b600080fd5b6100ef600480360360408110156100b957600080fd5b8101908080359060200190929190803573ffffffffffffffffffffffffffffffffffffffff1690602001909291905050506104dc565b005b6100f961089f565b604051808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b6101e4600480360360c081101561013b57600080fd5b8101908080359060200190929190803590602001909291908035906020019092919080359060200190929190803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803590602001906401000000008111156101a057600080fd5b8201836020820111156101b257600080fd5b803590602001918460018302840111640100000000831117156101d457600080fd5b90919293919293905050506108b7565b6040518082815260200191505060405180910390f35b6102506004803603606081101561021057600080fd5b8101908080359060200190929190803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190505050610c16565b6040518082815260200191505060405180910390f35b6102a86004803603602081101561027c57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919050505061104b565b604051808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b610316600480360360208110156102ea57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff1690602001909291905050506113e3565b604051808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b61034a611416565b604051808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b61042c6004803603602081101561038c57600080fd5b81019080803590602001906401000000008111156103a957600080fd5b8201836020820111156103bb57600080fd5b803590602001918460208302840111640100000000831117156103dd57600080fd5b919080806020026020016040519081016040528093929190818152602001838360200280828437600081840152601f19601f82011690508083019250505050505050919291929050505061142e565b005b610498600480360360a081101561044457600080fd5b8101908080359060200190929190803590602001909291908035906020019092919080359060200190929190803573ffffffffffffffffffffffffffffffffffffffff16906020019092919050505061150f565b005b6104c6600480360360208110156104b057600080fd5b8101908080359060200190929190505050611b27565b6040518082815260200191505060405180910390f35b60003390506000600160008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614156105e8576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601c8152602001807f466c6173684170703a3a20504f4f4c5f444f45534e545f45584953540000000081525060200191505060405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff166323b872dd8330876040518463ffffffff1660e01b8152600401808473ffffffffffffffffffffffffffffffffffffffff1681526020018373ffffffffffffffffffffffffffffffffffffffff1681526020018281526020019350505050602060405180830381600087803b15801561067757600080fd5b505af115801561068b573d6000803e3d6000fd5b505050506040513d60208110156106a157600080fd5b8101908080519060200190929190505050508073ffffffffffffffffffffffffffffffffffffffff1663a9059cbb82866040518363ffffffff1660e01b8152600401808373ffffffffffffffffffffffffffffffffffffffff16815260200182815260200192505050602060405180830381600087803b15801561072457600080fd5b505af1158015610738573d6000803e3d6000fd5b505050506040513d602081101561074e57600080fd5b8101908080519060200190929190505050506000808273ffffffffffffffffffffffffffffffffffffffff1663d798f86e856040518263ffffffff1660e01b8152600401808273ffffffffffffffffffffffffffffffffffffffff1681526020019150506040805180830381600087803b1580156107cb57600080fd5b505af11580156107df573d6000803e3d6000fd5b505050506040513d60408110156107f557600080fd5b810190808051906020019092919080519060200190929190505050915091507f941e65c2e86e52e4d4bf73adc9a87775f81da9fa2aff39eda7322e562b08fd6e8383838988604051808673ffffffffffffffffffffffffffffffffffffffff1681526020018581526020018481526020018381526020018273ffffffffffffffffffffffffffffffffffffffff1681526020019550505050505060405180910390a1505050505050565b73b4467e8d621105312a914f1d42f10770c0ffe3c881565b600073ec02f813404656e2a2aed5baeed41d785324e8d073ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161461096e576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260188152602001807f466c6173684170703a3a204f4e4c595f50524f544f434f4c000000000000000081525060200191505060405180910390fd5b6000808484604081101561098157600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190505050915091506000600160008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905073b4467e8d621105312a914f1d42f10770c0ffe3c873ffffffffffffffffffffffffffffffffffffffff1663a9059cbb828a6040518363ffffffff1660e01b8152600401808373ffffffffffffffffffffffffffffffffffffffff16815260200182815260200192505050602060405180830381600087803b158015610a9f57600080fd5b505af1158015610ab3573d6000803e3d6000fd5b505050506040513d6020811015610ac957600080fd5b81019080805190602001909291905050505060008173ffffffffffffffffffffffffffffffffffffffff1663687fbed88a8a866040518463ffffffff1660e01b8152600401808481526020018373ffffffffffffffffffffffffffffffffffffffff1681526020018281526020019350505050602060405180830381600087803b158015610b5657600080fd5b505af1158015610b6a573d6000803e3d6000fd5b505050506040513d6020811015610b8057600080fd5b81019080805190602001909291905050509050806000808e8152602001908152602001600020819055507f23581b9afdc2170a53868d0b64508f096844aa55c3ad98caf14032a91c41cc528c8284604051808481526020018381526020018273ffffffffffffffffffffffffffffffffffffffff168152602001935050505060405180910390a150505050979650505050505050565b6000803390506000600160008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415610d23576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601c8152602001807f466c6173684170703a3a20504f4f4c5f444f45534e545f45584953540000000081525060200191505060405180910390fd5b60008611610d99576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260198152602001807f466c6173684170703a3a20494e56414c49445f414d4f554e540000000000000081525060200191505060405180910390fd5b8473ffffffffffffffffffffffffffffffffffffffff166323b872dd8330896040518463ffffffff1660e01b8152600401808473ffffffffffffffffffffffffffffffffffffffff1681526020018373ffffffffffffffffffffffffffffffffffffffff1681526020018281526020019350505050602060405180830381600087803b158015610e2857600080fd5b505af1158015610e3c573d6000803e3d6000fd5b505050506040513d6020811015610e5257600080fd5b8101908080519060200190929190505050508473ffffffffffffffffffffffffffffffffffffffff1663a9059cbb82886040518363ffffffff1660e01b8152600401808373ffffffffffffffffffffffffffffffffffffffff16815260200182815260200192505050602060405180830381600087803b158015610ed557600080fd5b505af1158015610ee9573d6000803e3d6000fd5b505050506040513d6020811015610eff57600080fd5b8101908080519060200190929190505050508073ffffffffffffffffffffffffffffffffffffffff166350b814a08784876040518463ffffffff1660e01b8152600401808481526020018373ffffffffffffffffffffffffffffffffffffffff1681526020018281526020019350505050602060405180830381600087803b158015610f8a57600080fd5b505af1158015610f9e573d6000803e3d6000fd5b505050506040513d6020811015610fb457600080fd5b810190808051906020019092919050505092507f50994f8bcf54474cf3e35793e3537d1f44ec39d92f19a3d7a01b36723b886fc082878584604051808573ffffffffffffffffffffffffffffffffffffffff1681526020018481526020018381526020018273ffffffffffffffffffffffffffffffffffffffff16815260200194505050505060405180910390a150509392505050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156110ef576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f466c6173684170703a3a20494e56414c49445f544f4b454e5f4144445245535381525060200191505060405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff16600160008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16146111f0576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601e8152602001807f466c6173684170703a3a20504f4f4c5f414c52454144595f455849535453000081525060200191505060405180910390fd5b60606040518060200161120290611d6c565b6020820181038252601f19601f82011660405250905060004233604051602001808381526020018273ffffffffffffffffffffffffffffffffffffffff1660601b81526014019250505060405160208183030381529060405280519060200120905061127060008284611b3f565b925082600160008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508273ffffffffffffffffffffffffffffffffffffffff1663c4d66de8856040518263ffffffff1660e01b8152600401808273ffffffffffffffffffffffffffffffffffffffff168152602001915050600060405180830381600087803b15801561135957600080fd5b505af115801561136d573d6000803e3d6000fd5b505050507f4f2ce4e40f623ca765fc0167a25cb7842ceaafb8d82d3dec26ca0d0e0d2d48968385604051808373ffffffffffffffffffffffffffffffffffffffff1681526020018273ffffffffffffffffffffffffffffffffffffffff1681526020019250505060405180910390a15050919050565b60016020528060005260406000206000915054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b73ec02f813404656e2a2aed5baeed41d785324e8d081565b60005b815181101561150b5773ec02f813404656e2a2aed5baeed41d785324e8d073ffffffffffffffffffffffffffffffffffffffff166371ed5d1a83838151811061147657fe5b60200260200101516040518263ffffffff1660e01b815260040180828152602001915050602060405180830381600087803b1580156114b457600080fd5b505af11580156114c8573d6000803e3d6000fd5b505050506040513d60208110156114de57600080fd5b810190808051906020019092919050505050611504600182611ce990919063ffffffff16565b9050611431565b5050565b60003390506000600160008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16141561161b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601c8152602001807f466c6173684170703a3a20504f4f4c5f444f45534e545f45584953540000000081525060200191505060405180910390fd5b60008711801561162b5750600086115b61169d576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260198152602001807f466c6173684170703a3a20494e56414c49445f414d4f554e540000000000000081525060200191505060405180910390fd5b60008060008373ffffffffffffffffffffffffffffffffffffffff1663e0ab07728b8b8b8b8a6040518663ffffffff1660e01b8152600401808681526020018581526020018481526020018381526020018273ffffffffffffffffffffffffffffffffffffffff16815260200195505050505050606060405180830381600087803b15801561172b57600080fd5b505af115801561173f573d6000803e3d6000fd5b505050506040513d606081101561175557600080fd5b8101908080519060200190929190805190602001909291908051906020019092919050505092509250925073b4467e8d621105312a914f1d42f10770c0ffe3c873ffffffffffffffffffffffffffffffffffffffff166323b872dd8630866040518463ffffffff1660e01b8152600401808473ffffffffffffffffffffffffffffffffffffffff1681526020018373ffffffffffffffffffffffffffffffffffffffff1681526020018281526020019350505050602060405180830381600087803b15801561182357600080fd5b505af1158015611837573d6000803e3d6000fd5b505050506040513d602081101561184d57600080fd5b81019080805190602001909291905050505073b4467e8d621105312a914f1d42f10770c0ffe3c873ffffffffffffffffffffffffffffffffffffffff1663a9059cbb85856040518363ffffffff1660e01b8152600401808373ffffffffffffffffffffffffffffffffffffffff16815260200182815260200192505050602060405180830381600087803b1580156118e457600080fd5b505af11580156118f8573d6000803e3d6000fd5b505050506040513d602081101561190e57600080fd5b8101908080519060200190929190505050508573ffffffffffffffffffffffffffffffffffffffff166323b872dd8630856040518463ffffffff1660e01b8152600401808473ffffffffffffffffffffffffffffffffffffffff1681526020018373ffffffffffffffffffffffffffffffffffffffff1681526020018281526020019350505050602060405180830381600087803b1580156119af57600080fd5b505af11580156119c3573d6000803e3d6000fd5b505050506040513d60208110156119d957600080fd5b8101908080519060200190929190505050508573ffffffffffffffffffffffffffffffffffffffff1663a9059cbb85846040518363ffffffff1660e01b8152600401808373ffffffffffffffffffffffffffffffffffffffff16815260200182815260200192505050602060405180830381600087803b158015611a5c57600080fd5b505af1158015611a70573d6000803e3d6000fd5b505050506040513d6020811015611a8657600080fd5b8101908080519060200190929190505050507f42199b399eec9bceda8511afd1d6412eb81c0cc2fdbfcaf1892164387c964d418484848489604051808673ffffffffffffffffffffffffffffffffffffffff1681526020018581526020018481526020018381526020018273ffffffffffffffffffffffffffffffffffffffff1681526020019550505050505060405180910390a150505050505050505050565b60006020528060005260406000206000915090505481565b60008084471015611bb8576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601d8152602001807f437265617465323a20696e73756666696369656e742062616c616e636500000081525060200191505060405180910390fd5b600083511415611c30576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f437265617465323a2062797465636f6465206c656e677468206973207a65726f81525060200191505060405180910390fd5b8383516020850187f59050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415611cde576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260198152602001807f437265617465323a204661696c6564206f6e206465706c6f790000000000000081525060200191505060405180910390fd5b809150509392505050565b6000828284019150811015611d66576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260138152602001807f4d4154483a3a204144445f4f564552464c4f570000000000000000000000000081525060200191505060405180910390fd5b92915050565b61358780611d7a8339019056fe6080604052600160085534801561001557600080fd5b5033600a60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550613521806100666000396000f3fe608060405234801561001057600080fd5b50600436106102115760003560e01c806395d89b4111610125578063c4d66de8116100ad578063e0ab07721161007c578063e0ab077214610aa3578063e3ee160e14610b31578063e94a010214610bdf578063ed24911d14610c43578063fc0c546a14610c6157610211565b8063c4d66de8146108ef578063d505accf14610933578063d798f86e146109cc578063dd62ed3e14610a2b57610211565b8063a9059cbb116100f4578063a9059cbb146107c5578063ad615dec14610829578063ba9a7a561461087f578063c0bd9f161461089d578063c45a0155146108bb57610211565b806395d89b41146106ae578063a0cc6a6814610731578063a10adb171461074f578063a7f0e9031461079157610211565b80633408e470116101a85780634d861ece116101775780634d861ece1461050857806350b814a014610526578063687fbed81461059257806370a08231146105fe5780637ecebe001461065657610211565b80633408e470146104465780633750a8bd14610464578063411542701461048257806342966c68146104c457610211565b806323b872dd116101e457806323b872dd1461034f57806323c6e14c146103d357806330adf81f14610407578063313ce5671461042557610211565b806306fdde03146102165780630754617214610299578063095ea7b3146102cd57806318160ddd14610331575b600080fd5b61021e610c95565b6040518080602001828103825283818151815260200191508051906020019080838360005b8381101561025e578082015181840152602081019050610243565b50505050905090810190601f16801561028b5780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b6102a1610cce565b604051808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b610319600480360360408110156102e357600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190505050610cf4565b60405180821515815260200191505060405180910390f35b610339610d0b565b6040518082815260200191505060405180910390f35b6103bb6004803603606081101561036557600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190505050610d11565b60405180821515815260200191505060405180910390f35b6103db610e65565b604051808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b61040f610e7d565b6040518082815260200191505060405180910390f35b61042d610ea4565b604051808260ff16815260200191505060405180910390f35b61044e610ea9565b6040518082815260200191505060405180910390f35b61046c610eb1565b6040518082815260200191505060405180910390f35b6104ae6004803603602081101561049857600080fd5b8101908080359060200190929190505050610f8b565b6040518082815260200191505060405180910390f35b6104f0600480360360208110156104da57600080fd5b810190808035906020019092919050505061100d565b60405180821515815260200191505060405180910390f35b610510611022565b6040518082815260200191505060405180910390f35b61057c6004803603606081101561053c57600080fd5b8101908080359060200190929190803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190505050611028565b6040518082815260200191505060405180910390f35b6105e8600480360360608110156105a857600080fd5b8101908080359060200190929190803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190505050611226565b6040518082815260200191505060405180910390f35b6106406004803603602081101561061457600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050611432565b6040518082815260200191505060405180910390f35b6106986004803603602081101561066c57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919050505061144a565b6040518082815260200191505060405180910390f35b6106b6611462565b6040518080602001828103825283818151815260200191508051906020019080838360005b838110156106f65780820151818401526020810190506106db565b50505050905090810190601f1680156107235780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b61073961149b565b6040518082815260200191505060405180910390f35b61077b6004803603602081101561076557600080fd5b81019080803590602001909291905050506114c2565b6040518082815260200191505060405180910390f35b610799611544565b604051808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b610811600480360360408110156107db57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff1690602001909291908035906020019092919050505061155c565b60405180821515815260200191505060405180910390f35b6108696004803603606081101561083f57600080fd5b81019080803590602001909291908035906020019092919080359060200190929190505050611573565b6040518082815260200191505060405180910390f35b61088761169a565b6040518082815260200191505060405180910390f35b6108a56116a0565b6040518082815260200191505060405180910390f35b6108c36116a6565b604051808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b6109316004803603602081101561090557600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff1690602001909291905050506116cc565b005b6109ca600480360360e081101561094957600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff1690602001909291908035906020019092919080359060200190929190803560ff16906020019092919080359060200190929190803590602001909291905050506117d3565b005b610a0e600480360360208110156109e257600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff1690602001909291905050506119c5565b604051808381526020018281526020019250505060405180910390f35b610a8d60048036036040811015610a4157600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050611aa1565b6040518082815260200191505060405180910390f35b610b0d600480360360a0811015610ab957600080fd5b8101908080359060200190929190803590602001909291908035906020019092919080359060200190929190803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050611ac6565b60405180848152602001838152602001828152602001935050505060405180910390f35b610bdd6004803603610120811015610b4857600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190803590602001909291908035906020019092919080359060200190929190803560ff1690602001909291908035906020019092919080359060200190929190505050611bc4565b005b610c2b60048036036040811015610bf557600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190505050611ea3565b60405180821515815260200191505060405180910390f35b610c4b611ed2565b6040518082815260200191505060405180910390f35b610c69611fa6565b604051808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b6040518060400160405280601281526020017f464c4153482d414c542d4c5020546f6b656e000000000000000000000000000081525081565b600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6000610d01338484611fcc565b6001905092915050565b60005481565b600080600360008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205490507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8114610e4e57610dcd83826120b790919063ffffffff16565b600360008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055505b610e5985858561213a565b60019150509392505050565b73b4467e8d621105312a914f1d42f10770c0ffe3c881565b7f6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c960001b81565b601281565b600046905090565b60008073ec02f813404656e2a2aed5baeed41d785324e8d073ffffffffffffffffffffffffffffffffffffffff1663cc704d5460006040518263ffffffff1660e01b81526004018082815260200191505060206040518083038186803b158015610f1a57600080fd5b505afa158015610f2e573d6000803e3d6000fd5b505050506040513d6020811015610f4457600080fd5b81019080805190602001909291905050509050610f85610f746611c37937e080008361235490919063ffffffff16565b6103e86120b790919063ffffffff16565b91505090565b600080610fa8610f99610eb1565b846123e390919063ffffffff16565b90506000610fc1600754836123e390919063ffffffff16565b90506000610fee83610fe06103e86006546123e390919063ffffffff16565b61248690919063ffffffff16565b9050611003818361235490919063ffffffff16565b9350505050919050565b60006110193383612509565b60019050919050565b60065481565b60006001600854146110a2576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252600c8152602001807f506f6f6c3a204c4f434b4544000000000000000000000000000000000000000081525060200191505060405180910390fd5b6000600881905550600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161461116d576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260138152602001807f506f6f6c3a3a204f4e4c595f464143544f52590000000000000000000000000081525060200191505060405180910390fd5b611176846114c2565b9050808211156111ee576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601a8152602001807f506f6f6c3a3a2045585045435445445f49535f4752454154455200000000000081525060200191505060405180910390fd5b6111f88482612623565b61121773b4467e8d621105312a914f1d42f10770c0ffe3c8848361265d565b60016008819055509392505050565b60006001600854146112a0576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252600c8152602001807f506f6f6c3a204c4f434b4544000000000000000000000000000000000000000081525060200191505060405180910390fd5b6000600881905550600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161461136b576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260138152602001807f506f6f6c3a3a204f4e4c595f464143544f52590000000000000000000000000081525060200191505060405180910390fd5b61137484610f8b565b9050808211156113ec576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601a8152602001807f506f6f6c3a3a2045585045435445445f49535f4752454154455200000000000081525060200191505060405180910390fd5b6113f68482612894565b611423600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16848361265d565b60016008819055509392505050565b60026020528060005260406000206000915090505481565b60046020528060005260406000206000915090505481565b6040518060400160405280600c81526020017f464c4153482d414c542d4c50000000000000000000000000000000000000000081525081565b7f7c7c6cdb67a18743f49ec6fa9b35f50d52ed05cbed4cc592e13b44501c1a226760001b81565b6000806114df6114d0610eb1565b846123e390919063ffffffff16565b905060006114f8600654836123e390919063ffffffff16565b90506000611525836115176103e86007546123e390919063ffffffff16565b61248690919063ffffffff16565b905061153a818361235490919063ffffffff16565b9350505050919050565b73ec02f813404656e2a2aed5baeed41d785324e8d081565b600061156933848461213a565b6001905092915050565b60008084116115ea576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601a8152602001807f506f6f6c3a3a20494e53554646494349454e545f414d4f554e5400000000000081525060200191505060405180910390fd5b6000831180156115fa5750600082115b61166c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601d8152602001807f506f6f6c3a3a20494e53554646494349454e545f4c495155494449545900000081525060200191505060405180910390fd5b6116918361168384876123e390919063ffffffff16565b61235490919063ffffffff16565b90509392505050565b6103e881565b60075481565b600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161461178f576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260138152602001807f506f6f6c3a3a204f4e4c595f464143544f52590000000000000000000000000081525060200191505060405180910390fd5b80600960006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b4284101561182c576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260218152602001806134366021913960400191505060405180910390fd5b60007f6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c960001b888888600460008d73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205489604051602001808781526020018673ffffffffffffffffffffffffffffffffffffffff1681526020018573ffffffffffffffffffffffffffffffffffffffff16815260200184815260200183815260200182815260200196505050505050506040516020818303038152906040528051906020012090506119606001600460008b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205461248690919063ffffffff16565b600460008a73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055506119b088828686866128ce565b6119bb888888611fcc565b5050505050505050565b600080600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614611a8b576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260138152602001807f506f6f6c3a3a204f4e4c595f464143544f52590000000000000000000000000081525060200191505060405180910390fd5b611a9483612a5e565b8092508193505050915091565b6003602052816000526040600020602052806000526040600020600091509150505481565b6000806000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614611b8e576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260138152602001807f506f6f6c3a3a204f4e4c595f464143544f52590000000000000000000000000081525060200191505060405180910390fd5b611b9a88888888612f5e565b8093508194505050611bad8484846130d4565b9050611bb983836131d8565b955095509592505050565b854211611c1c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602781526020018061347d6027913960400191505060405180910390fd5b844210611c74576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260218152602001806134366021913960400191505060405180910390fd5b600560008a73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600085815260200190815260200160002060009054906101000a900460ff1615611d28576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260268152602001806133e26026913960400191505060405180910390fd5b60007f7c7c6cdb67a18743f49ec6fa9b35f50d52ed05cbed4cc592e13b44501c1a226760001b8a8a8a8a8a8a604051602001808881526020018773ffffffffffffffffffffffffffffffffffffffff1681526020018673ffffffffffffffffffffffffffffffffffffffff168152602001858152602001848152602001838152602001828152602001975050505050505050604051602081830303815290604052805190602001209050611ddf8a828686866128ce565b6001600560008c73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600087815260200190815260200160002060006101000a81548160ff021916908315150217905550848a73ffffffffffffffffffffffffffffffffffffffff167f98de503528ee59b575ef0c0a2576a82497bfc029a5685b209e9ec333479b10a560405160405180910390a3611e978a8a8a61213a565b50505050505050505050565b60056020528160005260406000206020528060005260406000206000915091509054906101000a900460ff1681565b60007f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f60001b7ffdde3a7807889787f51ab17062704a0d81341ba7debe5a9773b58a1b5e5f422c60001b7fc89efdaa54c0f20c7adf612882df0950f5a951637e0307cdcb4c672f298b8bc660001b611f48610ea9565b30604051602001808681526020018581526020018481526020018381526020018273ffffffffffffffffffffffffffffffffffffffff1681526020019550505050505060405160208183030381529060405280519060200120905090565b600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b80600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925836040518082815260200191505060405180910390a3505050565b6000828284039150811115612134576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260148152602001807f4d4154483a3a205355425f554e444552464c4f5700000000000000000000000081525060200191505060405180910390fd5b92915050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156121c0576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602e815260200180613408602e913960400191505060405180910390fd5b61221281600260008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546120b790919063ffffffff16565b600260008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055506122a781600260008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205461248690919063ffffffff16565b600260008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef836040518082815260200191505060405180910390a3505050565b60008082116123cb576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260178152602001807f4d4154483a3a204449564953494f4e5f42595f5a45524f00000000000000000081525060200191505060405180910390fd5b60008284816123d657fe5b0490508091505092915050565b6000808314156123f65760009050612480565b600082840290508284828161240757fe5b041461247b576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260138152602001807f4d4154483a3a204d554c5f4f564552464c4f570000000000000000000000000081525060200191505060405180910390fd5b809150505b92915050565b6000828284019150811015612503576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260138152602001807f4d4154483a3a204144445f4f564552464c4f570000000000000000000000000081525060200191505060405180910390fd5b92915050565b61255b81600260008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546120b790919063ffffffff16565b600260008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055506125b3816000546120b790919063ffffffff16565b600081905550600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef836040518082815260200191505060405180910390a35050565b612638816006546120b790919063ffffffff16565b6006819055506126538260075461248690919063ffffffff16565b6007819055505050565b600060608473ffffffffffffffffffffffffffffffffffffffff166040518060400160405280601981526020017f7472616e7366657228616464726573732c75696e743235362900000000000000815250805190602001208585604051602401808373ffffffffffffffffffffffffffffffffffffffff16815260200182815260200192505050604051602081830303815290604052907bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff83818316178352505050506040518082805190602001908083835b602083106127745780518252602082019150602081019050602083039250612751565b6001836020036101000a0380198251168184511680821785525050505050509050019150506000604051808303816000865af19150503d80600081146127d6576040519150601f19603f3d011682016040523d82523d6000602084013e6127db565b606091505b509150915081801561281b575060008151148061281a575080806020019051602081101561280857600080fd5b81019080805190602001909291905050505b5b61288d576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260168152602001807f506f6f6c3a3a205452414e534645525f4641494c45440000000000000000000081525060200191505060405180910390fd5b5050505050565b6128a98260065461248690919063ffffffff16565b6006819055506128c4816007546120b790919063ffffffff16565b6007819055505050565b60006128d8611ed2565b8560405160200180807f190100000000000000000000000000000000000000000000000000000000000081525060020183815260200182815260200192505050604051602081830303815290604052805190602001209050600060018286868660405160008152602001604052604051808581526020018460ff1681526020018381526020018281526020019450505050506020604051602081039080840390855afa15801561298c573d6000803e3d6000fd5b505050602060405103519050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614158015612a0057508673ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16145b612a55576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260268152602001806134576026913960400191505060405180910390fd5b50505050505050565b600080600160085414612ad9576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252600c8152602001807f506f6f6c3a204c4f434b4544000000000000000000000000000000000000000081525060200191505060405180910390fd5b6000600881905550600073b4467e8d621105312a914f1d42f10770c0ffe3c873ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b8152600401808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060206040518083038186803b158015612b5e57600080fd5b505afa158015612b72573d6000803e3d6000fd5b505050506040513d6020811015612b8857600080fd5b810190808051906020019092919050505090506000600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b8152600401808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060206040518083038186803b158015612c2657600080fd5b505afa158015612c3a573d6000803e3d6000fd5b505050506040513d6020811015612c5057600080fd5b810190808051906020019092919050505090506000600260003073ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050600054612cbd84836123e390919063ffffffff16565b81612cc457fe5b049450600054612cdd83836123e390919063ffffffff16565b81612ce457fe5b049350600085118015612cf75750600084115b612d4c576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260248152602001806134a46024913960400191505060405180910390fd5b612d563082612509565b612d7573b4467e8d621105312a914f1d42f10770c0ffe3c8878761265d565b612da2600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16878661265d565b612e6a73b4467e8d621105312a914f1d42f10770c0ffe3c873ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b8152600401808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060206040518083038186803b158015612e2057600080fd5b505afa158015612e34573d6000803e3d6000fd5b505050506040513d6020811015612e4a57600080fd5b8101908080519060200190929190505050846120b790919063ffffffff16565b9250612f42600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b8152600401808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060206040518083038186803b158015612ef857600080fd5b505afa158015612f0c573d6000803e3d6000fd5b505050506040513d6020811015612f2257600080fd5b8101908080519060200190929190505050836120b790919063ffffffff16565b9150612f4e8383613212565b5050506001600881905550915091565b6000806000600754148015612f7557506000600654145b15612f8957858580925081935050506130cb565b6000612f9a87600654600754611573565b90508581116130285783811015613019576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601c8152602001807f506f6f6c3a3a20494e53554646494349454e545f425f414d4f554e540000000081525060200191505060405180910390fd5b868180935081945050506130c9565b600061303987600754600654611573565b905087811115801561304b5750858110155b6130bd576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601c8152602001807f506f6f6c3a3a20494e53554646494349454e545f415f414d4f554e540000000081525060200191505060405180910390fd5b80878094508195505050505b505b94509492505050565b60008060005414156131235761310f6103e86131016130fc85876123e390919063ffffffff16565b61324c565b6120b790919063ffffffff16565b905061311e60006103e86132ae565b61316e565b61316b60065461313e600054866123e390919063ffffffff16565b8161314557fe5b0460075461315e600054866123e390919063ffffffff16565b8161316557fe5b046133c8565b90505b600081116131c7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260248152602001806134c86024913960400191505060405180910390fd5b6131d184826132ae565b9392505050565b6131ed8260065461248690919063ffffffff16565b6006819055506132088160075461248690919063ffffffff16565b6007819055505050565b613227826006546120b790919063ffffffff16565b600681905550613242816007546120b790919063ffffffff16565b6007819055505050565b6000600382111561329b57819050600060016002848161326857fe5b040190505b818110156132955780915060028182858161328457fe5b04018161328d57fe5b04905061326d565b506132a9565b600082146132a857600190505b5b919050565b6132c38160005461248690919063ffffffff16565b60008190555061331b81600260008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205461248690919063ffffffff16565b600260008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508173ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef836040518082815260200191505060405180910390a35050565b60008183106133d757816133d9565b825b90509291505056fe464c4153482d414c542d4c5020546f6b656e3a3a20415554485f414c52454144595f55534544464c4153482d414c542d4c5020546f6b656e3a3a2052454345495645525f49535f544f4b454e5f4f525f5a45524f464c4153482d414c542d4c5020546f6b656e3a3a20415554485f45585049524544464c4153482d414c542d4c5020546f6b656e3a3a20494e56414c49445f5349474e4154555245464c4153482d414c542d4c5020546f6b656e3a3a20415554485f4e4f545f5945545f56414c4944506f6f6c3a3a20494e53554646494349454e545f4c49515549444954595f4255524e4544506f6f6c3a3a20494e53554646494349454e545f4c49515549444954595f4d494e544544a2646970667358221220a303fd62f349c50b6d9027293ed3707e0ca21c2a55fdb4ab6e1f684983b562db64736f6c634300060c0033a26469706673582212209d839cc9fb5b62ee208926dbb39706d7e64f35d486cdf2211120671def7eb97164736f6c634300060c0033

Deployed Bytecode

0x608060405234801561001057600080fd5b506004361061009e5760003560e01c8063a4063dbc11610066578063a4063dbc146102d4578063a7f0e90314610342578063b12c10f714610376578063d959d8bc1461042e578063eb1ce2211461049a5761009e565b80631d994a53146100a357806323c6e14c146100f15780632cbff4461461012557806343264349146101fa5780639049f9d214610266575b600080fd5b6100ef600480360360408110156100b957600080fd5b8101908080359060200190929190803573ffffffffffffffffffffffffffffffffffffffff1690602001909291905050506104dc565b005b6100f961089f565b604051808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b6101e4600480360360c081101561013b57600080fd5b8101908080359060200190929190803590602001909291908035906020019092919080359060200190929190803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803590602001906401000000008111156101a057600080fd5b8201836020820111156101b257600080fd5b803590602001918460018302840111640100000000831117156101d457600080fd5b90919293919293905050506108b7565b6040518082815260200191505060405180910390f35b6102506004803603606081101561021057600080fd5b8101908080359060200190929190803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190505050610c16565b6040518082815260200191505060405180910390f35b6102a86004803603602081101561027c57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919050505061104b565b604051808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b610316600480360360208110156102ea57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff1690602001909291905050506113e3565b604051808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b61034a611416565b604051808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b61042c6004803603602081101561038c57600080fd5b81019080803590602001906401000000008111156103a957600080fd5b8201836020820111156103bb57600080fd5b803590602001918460208302840111640100000000831117156103dd57600080fd5b919080806020026020016040519081016040528093929190818152602001838360200280828437600081840152601f19601f82011690508083019250505050505050919291929050505061142e565b005b610498600480360360a081101561044457600080fd5b8101908080359060200190929190803590602001909291908035906020019092919080359060200190929190803573ffffffffffffffffffffffffffffffffffffffff16906020019092919050505061150f565b005b6104c6600480360360208110156104b057600080fd5b8101908080359060200190929190505050611b27565b6040518082815260200191505060405180910390f35b60003390506000600160008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614156105e8576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601c8152602001807f466c6173684170703a3a20504f4f4c5f444f45534e545f45584953540000000081525060200191505060405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff166323b872dd8330876040518463ffffffff1660e01b8152600401808473ffffffffffffffffffffffffffffffffffffffff1681526020018373ffffffffffffffffffffffffffffffffffffffff1681526020018281526020019350505050602060405180830381600087803b15801561067757600080fd5b505af115801561068b573d6000803e3d6000fd5b505050506040513d60208110156106a157600080fd5b8101908080519060200190929190505050508073ffffffffffffffffffffffffffffffffffffffff1663a9059cbb82866040518363ffffffff1660e01b8152600401808373ffffffffffffffffffffffffffffffffffffffff16815260200182815260200192505050602060405180830381600087803b15801561072457600080fd5b505af1158015610738573d6000803e3d6000fd5b505050506040513d602081101561074e57600080fd5b8101908080519060200190929190505050506000808273ffffffffffffffffffffffffffffffffffffffff1663d798f86e856040518263ffffffff1660e01b8152600401808273ffffffffffffffffffffffffffffffffffffffff1681526020019150506040805180830381600087803b1580156107cb57600080fd5b505af11580156107df573d6000803e3d6000fd5b505050506040513d60408110156107f557600080fd5b810190808051906020019092919080519060200190929190505050915091507f941e65c2e86e52e4d4bf73adc9a87775f81da9fa2aff39eda7322e562b08fd6e8383838988604051808673ffffffffffffffffffffffffffffffffffffffff1681526020018581526020018481526020018381526020018273ffffffffffffffffffffffffffffffffffffffff1681526020019550505050505060405180910390a1505050505050565b73b4467e8d621105312a914f1d42f10770c0ffe3c881565b600073ec02f813404656e2a2aed5baeed41d785324e8d073ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161461096e576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260188152602001807f466c6173684170703a3a204f4e4c595f50524f544f434f4c000000000000000081525060200191505060405180910390fd5b6000808484604081101561098157600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190505050915091506000600160008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905073b4467e8d621105312a914f1d42f10770c0ffe3c873ffffffffffffffffffffffffffffffffffffffff1663a9059cbb828a6040518363ffffffff1660e01b8152600401808373ffffffffffffffffffffffffffffffffffffffff16815260200182815260200192505050602060405180830381600087803b158015610a9f57600080fd5b505af1158015610ab3573d6000803e3d6000fd5b505050506040513d6020811015610ac957600080fd5b81019080805190602001909291905050505060008173ffffffffffffffffffffffffffffffffffffffff1663687fbed88a8a866040518463ffffffff1660e01b8152600401808481526020018373ffffffffffffffffffffffffffffffffffffffff1681526020018281526020019350505050602060405180830381600087803b158015610b5657600080fd5b505af1158015610b6a573d6000803e3d6000fd5b505050506040513d6020811015610b8057600080fd5b81019080805190602001909291905050509050806000808e8152602001908152602001600020819055507f23581b9afdc2170a53868d0b64508f096844aa55c3ad98caf14032a91c41cc528c8284604051808481526020018381526020018273ffffffffffffffffffffffffffffffffffffffff168152602001935050505060405180910390a150505050979650505050505050565b6000803390506000600160008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415610d23576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601c8152602001807f466c6173684170703a3a20504f4f4c5f444f45534e545f45584953540000000081525060200191505060405180910390fd5b60008611610d99576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260198152602001807f466c6173684170703a3a20494e56414c49445f414d4f554e540000000000000081525060200191505060405180910390fd5b8473ffffffffffffffffffffffffffffffffffffffff166323b872dd8330896040518463ffffffff1660e01b8152600401808473ffffffffffffffffffffffffffffffffffffffff1681526020018373ffffffffffffffffffffffffffffffffffffffff1681526020018281526020019350505050602060405180830381600087803b158015610e2857600080fd5b505af1158015610e3c573d6000803e3d6000fd5b505050506040513d6020811015610e5257600080fd5b8101908080519060200190929190505050508473ffffffffffffffffffffffffffffffffffffffff1663a9059cbb82886040518363ffffffff1660e01b8152600401808373ffffffffffffffffffffffffffffffffffffffff16815260200182815260200192505050602060405180830381600087803b158015610ed557600080fd5b505af1158015610ee9573d6000803e3d6000fd5b505050506040513d6020811015610eff57600080fd5b8101908080519060200190929190505050508073ffffffffffffffffffffffffffffffffffffffff166350b814a08784876040518463ffffffff1660e01b8152600401808481526020018373ffffffffffffffffffffffffffffffffffffffff1681526020018281526020019350505050602060405180830381600087803b158015610f8a57600080fd5b505af1158015610f9e573d6000803e3d6000fd5b505050506040513d6020811015610fb457600080fd5b810190808051906020019092919050505092507f50994f8bcf54474cf3e35793e3537d1f44ec39d92f19a3d7a01b36723b886fc082878584604051808573ffffffffffffffffffffffffffffffffffffffff1681526020018481526020018381526020018273ffffffffffffffffffffffffffffffffffffffff16815260200194505050505060405180910390a150509392505050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156110ef576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f466c6173684170703a3a20494e56414c49445f544f4b454e5f4144445245535381525060200191505060405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff16600160008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16146111f0576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601e8152602001807f466c6173684170703a3a20504f4f4c5f414c52454144595f455849535453000081525060200191505060405180910390fd5b60606040518060200161120290611d6c565b6020820181038252601f19601f82011660405250905060004233604051602001808381526020018273ffffffffffffffffffffffffffffffffffffffff1660601b81526014019250505060405160208183030381529060405280519060200120905061127060008284611b3f565b925082600160008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508273ffffffffffffffffffffffffffffffffffffffff1663c4d66de8856040518263ffffffff1660e01b8152600401808273ffffffffffffffffffffffffffffffffffffffff168152602001915050600060405180830381600087803b15801561135957600080fd5b505af115801561136d573d6000803e3d6000fd5b505050507f4f2ce4e40f623ca765fc0167a25cb7842ceaafb8d82d3dec26ca0d0e0d2d48968385604051808373ffffffffffffffffffffffffffffffffffffffff1681526020018273ffffffffffffffffffffffffffffffffffffffff1681526020019250505060405180910390a15050919050565b60016020528060005260406000206000915054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b73ec02f813404656e2a2aed5baeed41d785324e8d081565b60005b815181101561150b5773ec02f813404656e2a2aed5baeed41d785324e8d073ffffffffffffffffffffffffffffffffffffffff166371ed5d1a83838151811061147657fe5b60200260200101516040518263ffffffff1660e01b815260040180828152602001915050602060405180830381600087803b1580156114b457600080fd5b505af11580156114c8573d6000803e3d6000fd5b505050506040513d60208110156114de57600080fd5b810190808051906020019092919050505050611504600182611ce990919063ffffffff16565b9050611431565b5050565b60003390506000600160008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16141561161b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601c8152602001807f466c6173684170703a3a20504f4f4c5f444f45534e545f45584953540000000081525060200191505060405180910390fd5b60008711801561162b5750600086115b61169d576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260198152602001807f466c6173684170703a3a20494e56414c49445f414d4f554e540000000000000081525060200191505060405180910390fd5b60008060008373ffffffffffffffffffffffffffffffffffffffff1663e0ab07728b8b8b8b8a6040518663ffffffff1660e01b8152600401808681526020018581526020018481526020018381526020018273ffffffffffffffffffffffffffffffffffffffff16815260200195505050505050606060405180830381600087803b15801561172b57600080fd5b505af115801561173f573d6000803e3d6000fd5b505050506040513d606081101561175557600080fd5b8101908080519060200190929190805190602001909291908051906020019092919050505092509250925073b4467e8d621105312a914f1d42f10770c0ffe3c873ffffffffffffffffffffffffffffffffffffffff166323b872dd8630866040518463ffffffff1660e01b8152600401808473ffffffffffffffffffffffffffffffffffffffff1681526020018373ffffffffffffffffffffffffffffffffffffffff1681526020018281526020019350505050602060405180830381600087803b15801561182357600080fd5b505af1158015611837573d6000803e3d6000fd5b505050506040513d602081101561184d57600080fd5b81019080805190602001909291905050505073b4467e8d621105312a914f1d42f10770c0ffe3c873ffffffffffffffffffffffffffffffffffffffff1663a9059cbb85856040518363ffffffff1660e01b8152600401808373ffffffffffffffffffffffffffffffffffffffff16815260200182815260200192505050602060405180830381600087803b1580156118e457600080fd5b505af11580156118f8573d6000803e3d6000fd5b505050506040513d602081101561190e57600080fd5b8101908080519060200190929190505050508573ffffffffffffffffffffffffffffffffffffffff166323b872dd8630856040518463ffffffff1660e01b8152600401808473ffffffffffffffffffffffffffffffffffffffff1681526020018373ffffffffffffffffffffffffffffffffffffffff1681526020018281526020019350505050602060405180830381600087803b1580156119af57600080fd5b505af11580156119c3573d6000803e3d6000fd5b505050506040513d60208110156119d957600080fd5b8101908080519060200190929190505050508573ffffffffffffffffffffffffffffffffffffffff1663a9059cbb85846040518363ffffffff1660e01b8152600401808373ffffffffffffffffffffffffffffffffffffffff16815260200182815260200192505050602060405180830381600087803b158015611a5c57600080fd5b505af1158015611a70573d6000803e3d6000fd5b505050506040513d6020811015611a8657600080fd5b8101908080519060200190929190505050507f42199b399eec9bceda8511afd1d6412eb81c0cc2fdbfcaf1892164387c964d418484848489604051808673ffffffffffffffffffffffffffffffffffffffff1681526020018581526020018481526020018381526020018273ffffffffffffffffffffffffffffffffffffffff1681526020019550505050505060405180910390a150505050505050505050565b60006020528060005260406000206000915090505481565b60008084471015611bb8576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601d8152602001807f437265617465323a20696e73756666696369656e742062616c616e636500000081525060200191505060405180910390fd5b600083511415611c30576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f437265617465323a2062797465636f6465206c656e677468206973207a65726f81525060200191505060405180910390fd5b8383516020850187f59050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415611cde576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260198152602001807f437265617465323a204661696c6564206f6e206465706c6f790000000000000081525060200191505060405180910390fd5b809150509392505050565b6000828284019150811015611d66576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260138152602001807f4d4154483a3a204144445f4f564552464c4f570000000000000000000000000081525060200191505060405180910390fd5b92915050565b61358780611d7a8339019056fe6080604052600160085534801561001557600080fd5b5033600a60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550613521806100666000396000f3fe608060405234801561001057600080fd5b50600436106102115760003560e01c806395d89b4111610125578063c4d66de8116100ad578063e0ab07721161007c578063e0ab077214610aa3578063e3ee160e14610b31578063e94a010214610bdf578063ed24911d14610c43578063fc0c546a14610c6157610211565b8063c4d66de8146108ef578063d505accf14610933578063d798f86e146109cc578063dd62ed3e14610a2b57610211565b8063a9059cbb116100f4578063a9059cbb146107c5578063ad615dec14610829578063ba9a7a561461087f578063c0bd9f161461089d578063c45a0155146108bb57610211565b806395d89b41146106ae578063a0cc6a6814610731578063a10adb171461074f578063a7f0e9031461079157610211565b80633408e470116101a85780634d861ece116101775780634d861ece1461050857806350b814a014610526578063687fbed81461059257806370a08231146105fe5780637ecebe001461065657610211565b80633408e470146104465780633750a8bd14610464578063411542701461048257806342966c68146104c457610211565b806323b872dd116101e457806323b872dd1461034f57806323c6e14c146103d357806330adf81f14610407578063313ce5671461042557610211565b806306fdde03146102165780630754617214610299578063095ea7b3146102cd57806318160ddd14610331575b600080fd5b61021e610c95565b6040518080602001828103825283818151815260200191508051906020019080838360005b8381101561025e578082015181840152602081019050610243565b50505050905090810190601f16801561028b5780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b6102a1610cce565b604051808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b610319600480360360408110156102e357600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190505050610cf4565b60405180821515815260200191505060405180910390f35b610339610d0b565b6040518082815260200191505060405180910390f35b6103bb6004803603606081101561036557600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190505050610d11565b60405180821515815260200191505060405180910390f35b6103db610e65565b604051808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b61040f610e7d565b6040518082815260200191505060405180910390f35b61042d610ea4565b604051808260ff16815260200191505060405180910390f35b61044e610ea9565b6040518082815260200191505060405180910390f35b61046c610eb1565b6040518082815260200191505060405180910390f35b6104ae6004803603602081101561049857600080fd5b8101908080359060200190929190505050610f8b565b6040518082815260200191505060405180910390f35b6104f0600480360360208110156104da57600080fd5b810190808035906020019092919050505061100d565b60405180821515815260200191505060405180910390f35b610510611022565b6040518082815260200191505060405180910390f35b61057c6004803603606081101561053c57600080fd5b8101908080359060200190929190803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190505050611028565b6040518082815260200191505060405180910390f35b6105e8600480360360608110156105a857600080fd5b8101908080359060200190929190803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190505050611226565b6040518082815260200191505060405180910390f35b6106406004803603602081101561061457600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050611432565b6040518082815260200191505060405180910390f35b6106986004803603602081101561066c57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919050505061144a565b6040518082815260200191505060405180910390f35b6106b6611462565b6040518080602001828103825283818151815260200191508051906020019080838360005b838110156106f65780820151818401526020810190506106db565b50505050905090810190601f1680156107235780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b61073961149b565b6040518082815260200191505060405180910390f35b61077b6004803603602081101561076557600080fd5b81019080803590602001909291905050506114c2565b6040518082815260200191505060405180910390f35b610799611544565b604051808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b610811600480360360408110156107db57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff1690602001909291908035906020019092919050505061155c565b60405180821515815260200191505060405180910390f35b6108696004803603606081101561083f57600080fd5b81019080803590602001909291908035906020019092919080359060200190929190505050611573565b6040518082815260200191505060405180910390f35b61088761169a565b6040518082815260200191505060405180910390f35b6108a56116a0565b6040518082815260200191505060405180910390f35b6108c36116a6565b604051808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b6109316004803603602081101561090557600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff1690602001909291905050506116cc565b005b6109ca600480360360e081101561094957600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff1690602001909291908035906020019092919080359060200190929190803560ff16906020019092919080359060200190929190803590602001909291905050506117d3565b005b610a0e600480360360208110156109e257600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff1690602001909291905050506119c5565b604051808381526020018281526020019250505060405180910390f35b610a8d60048036036040811015610a4157600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050611aa1565b6040518082815260200191505060405180910390f35b610b0d600480360360a0811015610ab957600080fd5b8101908080359060200190929190803590602001909291908035906020019092919080359060200190929190803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050611ac6565b60405180848152602001838152602001828152602001935050505060405180910390f35b610bdd6004803603610120811015610b4857600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190803590602001909291908035906020019092919080359060200190929190803560ff1690602001909291908035906020019092919080359060200190929190505050611bc4565b005b610c2b60048036036040811015610bf557600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190505050611ea3565b60405180821515815260200191505060405180910390f35b610c4b611ed2565b6040518082815260200191505060405180910390f35b610c69611fa6565b604051808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b6040518060400160405280601281526020017f464c4153482d414c542d4c5020546f6b656e000000000000000000000000000081525081565b600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6000610d01338484611fcc565b6001905092915050565b60005481565b600080600360008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205490507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8114610e4e57610dcd83826120b790919063ffffffff16565b600360008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055505b610e5985858561213a565b60019150509392505050565b73b4467e8d621105312a914f1d42f10770c0ffe3c881565b7f6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c960001b81565b601281565b600046905090565b60008073ec02f813404656e2a2aed5baeed41d785324e8d073ffffffffffffffffffffffffffffffffffffffff1663cc704d5460006040518263ffffffff1660e01b81526004018082815260200191505060206040518083038186803b158015610f1a57600080fd5b505afa158015610f2e573d6000803e3d6000fd5b505050506040513d6020811015610f4457600080fd5b81019080805190602001909291905050509050610f85610f746611c37937e080008361235490919063ffffffff16565b6103e86120b790919063ffffffff16565b91505090565b600080610fa8610f99610eb1565b846123e390919063ffffffff16565b90506000610fc1600754836123e390919063ffffffff16565b90506000610fee83610fe06103e86006546123e390919063ffffffff16565b61248690919063ffffffff16565b9050611003818361235490919063ffffffff16565b9350505050919050565b60006110193383612509565b60019050919050565b60065481565b60006001600854146110a2576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252600c8152602001807f506f6f6c3a204c4f434b4544000000000000000000000000000000000000000081525060200191505060405180910390fd5b6000600881905550600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161461116d576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260138152602001807f506f6f6c3a3a204f4e4c595f464143544f52590000000000000000000000000081525060200191505060405180910390fd5b611176846114c2565b9050808211156111ee576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601a8152602001807f506f6f6c3a3a2045585045435445445f49535f4752454154455200000000000081525060200191505060405180910390fd5b6111f88482612623565b61121773b4467e8d621105312a914f1d42f10770c0ffe3c8848361265d565b60016008819055509392505050565b60006001600854146112a0576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252600c8152602001807f506f6f6c3a204c4f434b4544000000000000000000000000000000000000000081525060200191505060405180910390fd5b6000600881905550600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161461136b576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260138152602001807f506f6f6c3a3a204f4e4c595f464143544f52590000000000000000000000000081525060200191505060405180910390fd5b61137484610f8b565b9050808211156113ec576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601a8152602001807f506f6f6c3a3a2045585045435445445f49535f4752454154455200000000000081525060200191505060405180910390fd5b6113f68482612894565b611423600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16848361265d565b60016008819055509392505050565b60026020528060005260406000206000915090505481565b60046020528060005260406000206000915090505481565b6040518060400160405280600c81526020017f464c4153482d414c542d4c50000000000000000000000000000000000000000081525081565b7f7c7c6cdb67a18743f49ec6fa9b35f50d52ed05cbed4cc592e13b44501c1a226760001b81565b6000806114df6114d0610eb1565b846123e390919063ffffffff16565b905060006114f8600654836123e390919063ffffffff16565b90506000611525836115176103e86007546123e390919063ffffffff16565b61248690919063ffffffff16565b905061153a818361235490919063ffffffff16565b9350505050919050565b73ec02f813404656e2a2aed5baeed41d785324e8d081565b600061156933848461213a565b6001905092915050565b60008084116115ea576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601a8152602001807f506f6f6c3a3a20494e53554646494349454e545f414d4f554e5400000000000081525060200191505060405180910390fd5b6000831180156115fa5750600082115b61166c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601d8152602001807f506f6f6c3a3a20494e53554646494349454e545f4c495155494449545900000081525060200191505060405180910390fd5b6116918361168384876123e390919063ffffffff16565b61235490919063ffffffff16565b90509392505050565b6103e881565b60075481565b600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161461178f576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260138152602001807f506f6f6c3a3a204f4e4c595f464143544f52590000000000000000000000000081525060200191505060405180910390fd5b80600960006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b4284101561182c576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260218152602001806134366021913960400191505060405180910390fd5b60007f6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c960001b888888600460008d73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205489604051602001808781526020018673ffffffffffffffffffffffffffffffffffffffff1681526020018573ffffffffffffffffffffffffffffffffffffffff16815260200184815260200183815260200182815260200196505050505050506040516020818303038152906040528051906020012090506119606001600460008b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205461248690919063ffffffff16565b600460008a73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055506119b088828686866128ce565b6119bb888888611fcc565b5050505050505050565b600080600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614611a8b576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260138152602001807f506f6f6c3a3a204f4e4c595f464143544f52590000000000000000000000000081525060200191505060405180910390fd5b611a9483612a5e565b8092508193505050915091565b6003602052816000526040600020602052806000526040600020600091509150505481565b6000806000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614611b8e576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260138152602001807f506f6f6c3a3a204f4e4c595f464143544f52590000000000000000000000000081525060200191505060405180910390fd5b611b9a88888888612f5e565b8093508194505050611bad8484846130d4565b9050611bb983836131d8565b955095509592505050565b854211611c1c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602781526020018061347d6027913960400191505060405180910390fd5b844210611c74576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260218152602001806134366021913960400191505060405180910390fd5b600560008a73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600085815260200190815260200160002060009054906101000a900460ff1615611d28576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260268152602001806133e26026913960400191505060405180910390fd5b60007f7c7c6cdb67a18743f49ec6fa9b35f50d52ed05cbed4cc592e13b44501c1a226760001b8a8a8a8a8a8a604051602001808881526020018773ffffffffffffffffffffffffffffffffffffffff1681526020018673ffffffffffffffffffffffffffffffffffffffff168152602001858152602001848152602001838152602001828152602001975050505050505050604051602081830303815290604052805190602001209050611ddf8a828686866128ce565b6001600560008c73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600087815260200190815260200160002060006101000a81548160ff021916908315150217905550848a73ffffffffffffffffffffffffffffffffffffffff167f98de503528ee59b575ef0c0a2576a82497bfc029a5685b209e9ec333479b10a560405160405180910390a3611e978a8a8a61213a565b50505050505050505050565b60056020528160005260406000206020528060005260406000206000915091509054906101000a900460ff1681565b60007f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f60001b7ffdde3a7807889787f51ab17062704a0d81341ba7debe5a9773b58a1b5e5f422c60001b7fc89efdaa54c0f20c7adf612882df0950f5a951637e0307cdcb4c672f298b8bc660001b611f48610ea9565b30604051602001808681526020018581526020018481526020018381526020018273ffffffffffffffffffffffffffffffffffffffff1681526020019550505050505060405160208183030381529060405280519060200120905090565b600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b80600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925836040518082815260200191505060405180910390a3505050565b6000828284039150811115612134576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260148152602001807f4d4154483a3a205355425f554e444552464c4f5700000000000000000000000081525060200191505060405180910390fd5b92915050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156121c0576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602e815260200180613408602e913960400191505060405180910390fd5b61221281600260008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546120b790919063ffffffff16565b600260008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055506122a781600260008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205461248690919063ffffffff16565b600260008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef836040518082815260200191505060405180910390a3505050565b60008082116123cb576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260178152602001807f4d4154483a3a204449564953494f4e5f42595f5a45524f00000000000000000081525060200191505060405180910390fd5b60008284816123d657fe5b0490508091505092915050565b6000808314156123f65760009050612480565b600082840290508284828161240757fe5b041461247b576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260138152602001807f4d4154483a3a204d554c5f4f564552464c4f570000000000000000000000000081525060200191505060405180910390fd5b809150505b92915050565b6000828284019150811015612503576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260138152602001807f4d4154483a3a204144445f4f564552464c4f570000000000000000000000000081525060200191505060405180910390fd5b92915050565b61255b81600260008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546120b790919063ffffffff16565b600260008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055506125b3816000546120b790919063ffffffff16565b600081905550600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef836040518082815260200191505060405180910390a35050565b612638816006546120b790919063ffffffff16565b6006819055506126538260075461248690919063ffffffff16565b6007819055505050565b600060608473ffffffffffffffffffffffffffffffffffffffff166040518060400160405280601981526020017f7472616e7366657228616464726573732c75696e743235362900000000000000815250805190602001208585604051602401808373ffffffffffffffffffffffffffffffffffffffff16815260200182815260200192505050604051602081830303815290604052907bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff83818316178352505050506040518082805190602001908083835b602083106127745780518252602082019150602081019050602083039250612751565b6001836020036101000a0380198251168184511680821785525050505050509050019150506000604051808303816000865af19150503d80600081146127d6576040519150601f19603f3d011682016040523d82523d6000602084013e6127db565b606091505b509150915081801561281b575060008151148061281a575080806020019051602081101561280857600080fd5b81019080805190602001909291905050505b5b61288d576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260168152602001807f506f6f6c3a3a205452414e534645525f4641494c45440000000000000000000081525060200191505060405180910390fd5b5050505050565b6128a98260065461248690919063ffffffff16565b6006819055506128c4816007546120b790919063ffffffff16565b6007819055505050565b60006128d8611ed2565b8560405160200180807f190100000000000000000000000000000000000000000000000000000000000081525060020183815260200182815260200192505050604051602081830303815290604052805190602001209050600060018286868660405160008152602001604052604051808581526020018460ff1681526020018381526020018281526020019450505050506020604051602081039080840390855afa15801561298c573d6000803e3d6000fd5b505050602060405103519050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614158015612a0057508673ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16145b612a55576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260268152602001806134576026913960400191505060405180910390fd5b50505050505050565b600080600160085414612ad9576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252600c8152602001807f506f6f6c3a204c4f434b4544000000000000000000000000000000000000000081525060200191505060405180910390fd5b6000600881905550600073b4467e8d621105312a914f1d42f10770c0ffe3c873ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b8152600401808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060206040518083038186803b158015612b5e57600080fd5b505afa158015612b72573d6000803e3d6000fd5b505050506040513d6020811015612b8857600080fd5b810190808051906020019092919050505090506000600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b8152600401808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060206040518083038186803b158015612c2657600080fd5b505afa158015612c3a573d6000803e3d6000fd5b505050506040513d6020811015612c5057600080fd5b810190808051906020019092919050505090506000600260003073ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050600054612cbd84836123e390919063ffffffff16565b81612cc457fe5b049450600054612cdd83836123e390919063ffffffff16565b81612ce457fe5b049350600085118015612cf75750600084115b612d4c576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260248152602001806134a46024913960400191505060405180910390fd5b612d563082612509565b612d7573b4467e8d621105312a914f1d42f10770c0ffe3c8878761265d565b612da2600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16878661265d565b612e6a73b4467e8d621105312a914f1d42f10770c0ffe3c873ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b8152600401808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060206040518083038186803b158015612e2057600080fd5b505afa158015612e34573d6000803e3d6000fd5b505050506040513d6020811015612e4a57600080fd5b8101908080519060200190929190505050846120b790919063ffffffff16565b9250612f42600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b8152600401808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060206040518083038186803b158015612ef857600080fd5b505afa158015612f0c573d6000803e3d6000fd5b505050506040513d6020811015612f2257600080fd5b8101908080519060200190929190505050836120b790919063ffffffff16565b9150612f4e8383613212565b5050506001600881905550915091565b6000806000600754148015612f7557506000600654145b15612f8957858580925081935050506130cb565b6000612f9a87600654600754611573565b90508581116130285783811015613019576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601c8152602001807f506f6f6c3a3a20494e53554646494349454e545f425f414d4f554e540000000081525060200191505060405180910390fd5b868180935081945050506130c9565b600061303987600754600654611573565b905087811115801561304b5750858110155b6130bd576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601c8152602001807f506f6f6c3a3a20494e53554646494349454e545f415f414d4f554e540000000081525060200191505060405180910390fd5b80878094508195505050505b505b94509492505050565b60008060005414156131235761310f6103e86131016130fc85876123e390919063ffffffff16565b61324c565b6120b790919063ffffffff16565b905061311e60006103e86132ae565b61316e565b61316b60065461313e600054866123e390919063ffffffff16565b8161314557fe5b0460075461315e600054866123e390919063ffffffff16565b8161316557fe5b046133c8565b90505b600081116131c7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260248152602001806134c86024913960400191505060405180910390fd5b6131d184826132ae565b9392505050565b6131ed8260065461248690919063ffffffff16565b6006819055506132088160075461248690919063ffffffff16565b6007819055505050565b613227826006546120b790919063ffffffff16565b600681905550613242816007546120b790919063ffffffff16565b6007819055505050565b6000600382111561329b57819050600060016002848161326857fe5b040190505b818110156132955780915060028182858161328457fe5b04018161328d57fe5b04905061326d565b506132a9565b600082146132a857600190505b5b919050565b6132c38160005461248690919063ffffffff16565b60008190555061331b81600260008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205461248690919063ffffffff16565b600260008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508173ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef836040518082815260200191505060405180910390a35050565b60008183106133d757816133d9565b825b90509291505056fe464c4153482d414c542d4c5020546f6b656e3a3a20415554485f414c52454144595f55534544464c4153482d414c542d4c5020546f6b656e3a3a2052454345495645525f49535f544f4b454e5f4f525f5a45524f464c4153482d414c542d4c5020546f6b656e3a3a20415554485f45585049524544464c4153482d414c542d4c5020546f6b656e3a3a20494e56414c49445f5349474e4154555245464c4153482d414c542d4c5020546f6b656e3a3a20415554485f4e4f545f5945545f56414c4944506f6f6c3a3a20494e53554646494349454e545f4c49515549444954595f4255524e4544506f6f6c3a3a20494e53554646494349454e545f4c49515549444954595f4d494e544544a2646970667358221220a303fd62f349c50b6d9027293ed3707e0ca21c2a55fdb4ab6e1f684983b562db64736f6c634300060c0033a26469706673582212209d839cc9fb5b62ee208926dbb39706d7e64f35d486cdf2211120671def7eb97164736f6c634300060c0033

Deployed Bytecode Sourcemap

22877:4700:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;27047:527;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;22955:80;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;24491:650;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;25368:651;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;23911:572;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;23188:40;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;23042:83;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;25149:211;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;26027:1012;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;23134:47;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;27047:527;27132:13;27148:10;27132:26;;27171:12;27186:5;:13;27192:6;27186:13;;;;;;;;;;;;;;;;;;;;;;;;;27171:28;;27236:1;27220:18;;:4;:18;;;;27212:59;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;27291:4;27284:25;;;27310:5;27325:4;27332:10;27284:59;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;27361:4;27354:21;;;27376:4;27382:10;27354:39;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;27407:19;27428:17;27455:4;27449:27;;;27477:5;27449:34;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;27406:77;;;;27501:65;27518:4;27524:11;27537:9;27548:10;27560:5;27501:65;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;27047:527;;;;;;:::o;22955:80::-;22993:42;22955:80;:::o;24491:650::-;24748:7;23083:42;23826:28;;:10;:28;;;23818:65;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;24769:13:::1;24784:22:::0;24821:5:::1;;24810:37;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;24768:79;;;;24858:12;24873:5;:12;24879:5;24873:12;;;;;;;;;;;;;;;;;;;;;;;;;24858:27;;22993:42;24896:28;;;24925:4;24931:13;24896:49;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;24956:14;24979:4;24973:42;;;25016:13;25031:7;25040:14;24973:82;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;24956:99;;25086:6;25066:12;:17:::0;25079:3:::1;25066:17;;;;;;;;;;;:26;;;;25108:25;25115:3;25120:6;25128:4;25108:25;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23894:1;;;;24491:650:::0;;;;;;;;;:::o;25368:651::-;25495:14;25522:12;25537:10;25522:25;;25558:12;25573:5;:13;25579:6;25573:13;;;;;;;;;;;;;;;;;;;;;;;;;25558:28;;25623:1;25607:18;;:4;:18;;;;25599:59;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;25692:1;25677:12;:16;25669:54;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;25743:6;25736:27;;;25764:4;25778;25785:12;25736:62;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;25816:6;25809:23;;;25833:4;25839:12;25809:43;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;25880:4;25874:41;;;25916:12;25930:4;25936:15;25874:78;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;25865:87;;25970:41;25978:4;25984:12;25998:6;26006:4;25970:41;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;25368:651;;;;;;;:::o;23911:572::-;23965:19;24023:1;24005:20;;:6;:20;;;;23997:65;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;24106:1;24081:27;;:5;:13;24087:6;24081:13;;;;;;;;;;;;;;;;;;;;;;;;;:27;;;24073:70;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;24154:21;24178:23;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;24154:47;;24212:12;24254:15;24271:10;24237:45;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;24227:56;;;;;;24212:71;;24308:33;24323:1;24326:4;24332:8;24308:14;:33::i;:::-;24294:47;;24368:11;24352:5;:13;24358:6;24352:13;;;;;;;;;;;;;;;;:27;;;;;;;;;;;;;;;;;;24396:11;24390:29;;;24420:6;24390:37;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;24443:32;24455:11;24468:6;24443:32;;;;;;;;;;;;;;;;;;;;;;;;;;;;23911:572;;;;;:::o;23188:40::-;;;;;;;;;;;;;;;;;;;;;;:::o;23042:83::-;23083:42;23042:83;:::o;25149:211::-;25219:9;25214:139;25238:11;:18;25234:1;:22;25214:139;;;23083:42;25287:38;;;25326:11;25338:1;25326:14;;;;;;;;;;;;;;25287:54;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;25262:8;25268:1;25262;:5;;:8;;;;:::i;:::-;25258:12;;25214:139;;;;25149:211;:::o;26027:1012::-;26231:13;26247:10;26231:26;;26268:12;26283:5;:13;26289:6;26283:13;;;;;;;;;;;;;;;;;;;;;;;;;26268:28;;26333:1;26317:18;;:4;:18;;;;26309:59;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;26402:1;26387:12;:16;:34;;;;;26420:1;26407:10;:14;26387:34;26379:72;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;26465:19;26486:17;26505;26532:4;26526:24;;;26565:12;26592:10;26617:15;26647:13;26675:5;26526:165;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;26464:227;;;;;;22993:42;26704:32;;;26737:5;26752:4;26759:11;26704:67;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;22993:42;26782:28;;;26811:4;26817:11;26782:47;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;26847:6;26840:27;;;26868:5;26883:4;26890:9;26840:60;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;26918:6;26911:23;;;26935:4;26941:9;26911:40;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;26969:62;26984:4;26990:11;27003:9;27014;27025:5;26969:62;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;26027:1012;;;;;;;;;;:::o;23134:47::-;;;;;;;;;;;;;;;;;:::o;5444:545::-;5531:7;5551:12;5607:6;5582:21;:31;;5574:73;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;5685:1;5666:8;:15;:20;;5658:65;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;5877:4;5866:8;5860:15;5853:4;5843:8;5839:19;5831:6;5823:59;5815:67;;5927:1;5911:18;;:4;:18;;;;5903:56;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;5977:4;5970:11;;;5444:545;;;;;:::o;1724:136::-;1782:9;1827:1;1821;1817;:5;1813:9;;;1812:16;;1804:48;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1724:136;;;;:::o;-1:-1:-1:-;;;;;;;;:::o

Swarm Source

ipfs://9d839cc9fb5b62ee208926dbb39706d7e64f35d486cdf2211120671def7eb971

Block Transaction Difficulty Gas Used Reward
View All Blocks Produced

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

Validator Index Block Amount
View All Withdrawals

Transaction Hash Block Value Eth2 PubKey Valid
View All Deposits
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.