ETH Price: $3,338.65 (+0.30%)
 
Transaction Hash
Method
Block
From
To
Approve214863992024-12-26 11:40:115 days ago1735213211IN
Cream.Finance: CREAM/WETH
0 ETH0.000165346.84036834
Approve208984452024-10-05 9:29:5987 days ago1728120599IN
Cream.Finance: CREAM/WETH
0 ETH0.000101074.18165741
Approve207214582024-09-10 16:39:59112 days ago1725986399IN
Cream.Finance: CREAM/WETH
0 ETH0.00012925.34520797
Approve206535992024-09-01 5:21:59121 days ago1725168119IN
Cream.Finance: CREAM/WETH
0 ETH0.000013730.56807709
Approve192421392024-02-16 18:08:59319 days ago1708106939IN
Cream.Finance: CREAM/WETH
0 ETH0.0008577135.48398726
Approve192109342024-02-12 9:04:35323 days ago1707728675IN
Cream.Finance: CREAM/WETH
0 ETH0.0005123721.19704042
Approve190751612024-01-24 7:59:11342 days ago1706083151IN
Cream.Finance: CREAM/WETH
0 ETH0.0002471110.22328617
Exitswap Pool Am...187324392023-12-07 5:49:35390 days ago1701928175IN
Cream.Finance: CREAM/WETH
0 ETH0.0037956533.41455669
Approve176419742023-07-07 12:38:23543 days ago1688733503IN
Cream.Finance: CREAM/WETH
0 ETH0.0009060937.48512732
Approve175874532023-06-29 20:52:11551 days ago1688071931IN
Cream.Finance: CREAM/WETH
0 ETH0.0012759552.78647082
Approve170158312023-04-10 5:47:47631 days ago1681105667IN
Cream.Finance: CREAM/WETH
0 ETH0.0005947822.72587418
Approve170158162023-04-10 5:44:47631 days ago1681105487IN
Cream.Finance: CREAM/WETH
0 ETH0.0005635423.31384538
Approve169448852023-03-31 4:43:47641 days ago1680237827IN
Cream.Finance: CREAM/WETH
0 ETH0.000555222.96883418
Approve153302002022-08-13 0:28:17872 days ago1660350497IN
Cream.Finance: CREAM/WETH
0 ETH0.0002505510.3655232
Approve151397932022-07-14 8:59:53901 days ago1657789193IN
Cream.Finance: CREAM/WETH
0 ETH0.0002894411.97440948
Approve144355882022-03-22 10:32:481015 days ago1647945168IN
Cream.Finance: CREAM/WETH
0 ETH0.0006582927.23378605
Exit Pool143828512022-03-14 5:24:111023 days ago1647235451IN
Cream.Finance: CREAM/WETH
0 ETH0.0016770713.2083177
Approve140994842022-01-29 8:03:321067 days ago1643443412IN
Cream.Finance: CREAM/WETH
0 ETH0.00429406177.64608596
Approve138701192021-12-24 20:44:031103 days ago1640378643IN
Cream.Finance: CREAM/WETH
0 ETH0.0019637681.24138864
Exit Pool138636932021-12-23 20:53:321104 days ago1640292812IN
Cream.Finance: CREAM/WETH
0 ETH0.0107100584.34246374
Approve136757652021-11-24 6:56:031133 days ago1637736963IN
Cream.Finance: CREAM/WETH
0 ETH0.00243754100.84185885
Exit Pool129962432021-08-10 8:13:511239 days ago1628583231IN
Cream.Finance: CREAM/WETH
0 ETH0.0047021137.02944986
Approve127912012021-07-09 5:08:031271 days ago1625807283IN
Cream.Finance: CREAM/WETH
0 ETH0.0002752319
Swap Exact Amoun...127391382021-07-01 2:29:141280 days ago1625106554IN
Cream.Finance: CREAM/WETH
0 ETH0.0030154127
Swap Exact Amoun...127391212021-07-01 2:24:501280 days ago1625106290IN
Cream.Finance: CREAM/WETH
0 ETH0.0030154127
View all transactions

Latest 1 internal transaction

Advanced mode:
Parent Transaction Hash Block
From
To
108154412020-09-07 15:50:341576 days ago1599493834  Contract Creation0 ETH
Loading...
Loading

Similar Match Source Code
This contract matches the deployed Bytecode of the Source Code for Contract 0x4Fd2d9d6...C3D4d4b93
The constructor portion of the code might be different and could alter the actual behaviour of the contract

Contract Name:
BPool

Compiler Version
v0.5.12+commit.7709ece9

Optimization Enabled:
Yes with 100 runs

Other Settings:
default evmVersion, GNU GPLv3 license

Contract Source Code (Solidity Multiple files format)

File 1 of 6: BPool.sol
// This program is free software: you can redistribute it and/or modify
// it under the terms of the GNU General Public License as published by
// the Free Software Foundation, either version 3 of the License, or
// (at your option) any later version.

// This program is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
// GNU General Public License for more details.

// You should have received a copy of the GNU General Public License
// along with this program.  If not, see <http://www.gnu.org/licenses/>.

pragma solidity 0.5.12;

import "./BToken.sol";
import "./BMath.sol";

contract BPool is BBronze, BToken, BMath {

    struct Record {
        bool bound;   // is token bound to pool
        uint index;   // private
        uint denorm;  // denormalized weight
        uint balance;
    }

    event LOG_SWAP(
        address indexed caller,
        address indexed tokenIn,
        address indexed tokenOut,
        uint256         tokenAmountIn,
        uint256         tokenAmountOut
    );

    event LOG_JOIN(
        address indexed caller,
        address indexed tokenIn,
        uint256         tokenAmountIn
    );

    event LOG_EXIT(
        address indexed caller,
        address indexed tokenOut,
        uint256         tokenAmountOut
    );

    event LOG_DRAIN_RESERVES(
        address indexed caller,
        address indexed tokenOut,
        uint256         tokenAmountOut
    );

    event LOG_CALL(
        bytes4  indexed sig,
        address indexed caller,
        bytes           data
    ) anonymous;

    modifier _logs_() {
        emit LOG_CALL(msg.sig, msg.sender, msg.data);
        _;
    }

    modifier _lock_() {
        require(!_mutex);
        _mutex = true;
        _;
        _mutex = false;
    }

    modifier _viewlock_() {
        require(!_mutex);
        _;
    }

    bool private _mutex;

    address private _factory;    // BFactory address to push token exitFee to
    address private _controller; // has CONTROL role
    bool private _publicSwap; // true if PUBLIC can call SWAP functions

    // `setSwapFee` and `finalize` require CONTROL
    // `finalize` sets `PUBLIC can SWAP`, `PUBLIC can JOIN`
    uint private _swapFee;
    uint private _reservesRatio;
    bool private _finalized;

    address[] private _tokens;
    mapping(address=>Record) private  _records;
    mapping(address=>uint) public totalReserves;

    uint private _totalWeight;

    constructor() public {
        _controller = msg.sender;
        _factory = msg.sender;
        _swapFee = MIN_FEE;
        _reservesRatio = DEFAULT_RESERVES_RATIO;
        _publicSwap = false;
        _finalized = false;
    }

    function isPublicSwap()
        external view
        returns (bool)
    {
        return _publicSwap;
    }

    function isFinalized()
        external view
        returns (bool)
    {
        return _finalized;
    }

    function isBound(address t)
        external view
        returns (bool)
    {
        return _records[t].bound;
    }

    function getNumTokens()
        external view
        returns (uint) 
    {
        return _tokens.length;
    }

    function getCurrentTokens()
        external view _viewlock_
        returns (address[] memory tokens)
    {
        return _tokens;
    }

    function getFinalTokens()
        external view
        _viewlock_
        returns (address[] memory tokens)
    {
        require(_finalized);
        return _tokens;
    }

    function getDenormalizedWeight(address token)
        external view
        _viewlock_
        returns (uint)
    {

        require(_records[token].bound);
        return _records[token].denorm;
    }

    function getTotalDenormalizedWeight()
        external view
        _viewlock_
        returns (uint)
    {
        return _totalWeight;
    }

    function getNormalizedWeight(address token)
        external view
        _viewlock_
        returns (uint)
    {

        require(_records[token].bound);
        uint denorm = _records[token].denorm;
        return bdiv(denorm, _totalWeight);
    }

    function getBalance(address token)
        external view
        _viewlock_
        returns (uint)
    {

        require(_records[token].bound);
        return _records[token].balance;
    }

    function getSwapFee()
        external view
        _viewlock_
        returns (uint)
    {
        return _swapFee;
    }

    function getReservesRatio()
        external view
        _viewlock_
        returns (uint)
    {
        return _reservesRatio;
    }

    function getController()
        external view
        _viewlock_
        returns (address)
    {
        return _controller;
    }

    function setSwapFee(uint swapFee)
        external
        _logs_
        _lock_
    { 
        require(!_finalized);
        require(msg.sender == _controller);
        require(swapFee >= MIN_FEE);
        require(swapFee <= MAX_FEE);
        _swapFee = swapFee;
    }


    function setReservesRatio(uint reservesRatio)
        external
        _logs_
        _lock_
    {
        require(!_finalized);
        require(msg.sender == _controller);
        require(reservesRatio <= BONE);
        _reservesRatio = reservesRatio;
    }

    function setController(address manager)
        external
        _logs_
        _lock_
    {
        require(msg.sender == _controller);
        _controller = manager;
    }

    function setPublicSwap(bool public_)
        external
        _logs_
        _lock_
    {
        require(!_finalized);
        require(msg.sender == _controller);
        _publicSwap = public_;
    }

    function finalize()
        external
        _logs_
        _lock_
    {
        require(msg.sender == _controller);
        require(!_finalized);
        require(_tokens.length >= MIN_BOUND_TOKENS);

        _finalized = true;
        _publicSwap = true;

        _mintPoolShare(INIT_POOL_SUPPLY);
        _pushPoolShare(msg.sender, INIT_POOL_SUPPLY);
    }


    function bind(address token, uint balance, uint denorm)
        external
        _logs_
        // _lock_  Bind does not lock because it jumps to `rebind`, which does
    {
        require(msg.sender == _controller);
        require(!_records[token].bound);
        require(!_finalized);

        require(_tokens.length < MAX_BOUND_TOKENS);

        _records[token] = Record({
            bound: true,
            index: _tokens.length,
            denorm: 0,    // balance and denorm will be validated
            balance: 0   // and set by `rebind`
        });
        _tokens.push(token);
        rebind(token, balance, denorm);
    }

    function rebind(address token, uint balance, uint denorm)
        public
        _logs_
        _lock_
    {

        require(msg.sender == _controller);
        require(_records[token].bound);
        require(!_finalized);

        require(denorm >= MIN_WEIGHT);
        require(denorm <= MAX_WEIGHT);
        require(balance >= MIN_BALANCE);

        // Adjust the denorm and totalWeight
        uint oldWeight = _records[token].denorm;
        if (denorm > oldWeight) {
            _totalWeight = badd(_totalWeight, bsub(denorm, oldWeight));
            require(_totalWeight <= MAX_TOTAL_WEIGHT);
        } else if (denorm < oldWeight) {
            _totalWeight = bsub(_totalWeight, bsub(oldWeight, denorm));
        }        
        _records[token].denorm = denorm;

        // Adjust the balance record and actual token balance
        uint oldBalance = _records[token].balance;
        _records[token].balance = balance;
        if (balance > oldBalance) {
            _pullUnderlying(token, msg.sender, bsub(balance, oldBalance));
        } else if (balance < oldBalance) {
            // In this case liquidity is being withdrawn, so charge EXIT_FEE
            uint tokenBalanceWithdrawn = bsub(oldBalance, balance);
            uint tokenExitFee = bmul(tokenBalanceWithdrawn, EXIT_FEE);
            _pushUnderlying(token, msg.sender, bsub(tokenBalanceWithdrawn, tokenExitFee));
            _pushUnderlying(token, _factory, tokenExitFee);
        }
    }

    function unbind(address token)
        external
        _logs_
        _lock_
    {

        require(msg.sender == _controller);
        require(_records[token].bound);
        require(!_finalized);

        uint tokenBalance = _records[token].balance;
        uint tokenExitFee = bmul(tokenBalance, EXIT_FEE);

        _totalWeight = bsub(_totalWeight, _records[token].denorm);

        // Swap the token-to-unbind with the last token,
        // then delete the last token
        uint index = _records[token].index;
        uint last = _tokens.length - 1;
        _tokens[index] = _tokens[last];
        _records[_tokens[index]].index = index;
        _tokens.pop();
        _records[token] = Record({
            bound: false,
            index: 0,
            denorm: 0,
            balance: 0
        });

        _pushUnderlying(token, msg.sender, bsub(tokenBalance, tokenExitFee));
        _pushUnderlying(token, _factory, tokenExitFee);
    }

    // Absorb any tokens that have been sent to this contract into the pool
    function gulp(address token)
        external
        _logs_
        _lock_
    {
        require(_records[token].bound);
        _records[token].balance = IERC20(token).balanceOf(address(this));
    }

    function seize(address token, uint amount)
        external
        _logs_
        _lock_
    {
        require(msg.sender == _controller);
        require(!_records[token].bound);

        uint bal = IERC20(token).balanceOf(address(this));
        require(amount <= bal);

        _pushUnderlying(token, msg.sender, amount);
    }

    function getSpotPrice(address tokenIn, address tokenOut)
        external view
        _viewlock_
        returns (uint spotPrice)
    {
        require(_records[tokenIn].bound);
        require(_records[tokenOut].bound);
        Record storage inRecord = _records[tokenIn];
        Record storage outRecord = _records[tokenOut];
        return calcSpotPrice(inRecord.balance, inRecord.denorm, outRecord.balance, outRecord.denorm, _swapFee);
    }

    function getSpotPriceSansFee(address tokenIn, address tokenOut)
        external view
        _viewlock_
        returns (uint spotPrice)
    {
        require(_records[tokenIn].bound);
        require(_records[tokenOut].bound);
        Record storage inRecord = _records[tokenIn];
        Record storage outRecord = _records[tokenOut];
        return calcSpotPrice(inRecord.balance, inRecord.denorm, outRecord.balance, outRecord.denorm, 0);
    }

    function joinPool(uint poolAmountOut, uint[] calldata maxAmountsIn)
        external
        _logs_
        _lock_
    {
        require(_finalized);

        uint poolTotal = totalSupply();
        uint ratio = bdiv(poolAmountOut, poolTotal);
        require(ratio != 0);

        for (uint i = 0; i < _tokens.length; i++) {
            address t = _tokens[i];
            uint bal = _records[t].balance;
            uint tokenAmountIn = bmul(ratio, bal);
            require(tokenAmountIn != 0);
            require(tokenAmountIn <= maxAmountsIn[i]);
            _records[t].balance = badd(_records[t].balance, tokenAmountIn);
            emit LOG_JOIN(msg.sender, t, tokenAmountIn);
            _pullUnderlying(t, msg.sender, tokenAmountIn);
        }
        _mintPoolShare(poolAmountOut);
        _pushPoolShare(msg.sender, poolAmountOut);
    }

    function exitPool(uint poolAmountIn, uint[] calldata minAmountsOut)
        external
        _logs_
        _lock_
    {
        require(_finalized);

        uint poolTotal = totalSupply();
        uint exitFee = bmul(poolAmountIn, EXIT_FEE);
        uint pAiAfterExitFee = bsub(poolAmountIn, exitFee);
        uint ratio = bdiv(pAiAfterExitFee, poolTotal);
        require(ratio != 0);

        _pullPoolShare(msg.sender, poolAmountIn);
        _pushPoolShare(_factory, exitFee);
        _burnPoolShare(pAiAfterExitFee);

        for (uint i = 0; i < _tokens.length; i++) {
            address t = _tokens[i];
            uint bal = _records[t].balance;
            uint tokenAmountOut = bmul(ratio, bal);
            require(tokenAmountOut != 0);
            require(tokenAmountOut >= minAmountsOut[i]);
            _records[t].balance = bsub(_records[t].balance, tokenAmountOut);
            emit LOG_EXIT(msg.sender, t, tokenAmountOut);
            _pushUnderlying(t, msg.sender, tokenAmountOut);
        }

    }


    function swapExactAmountIn(
        address tokenIn,
        uint tokenAmountIn,
        address tokenOut,
        uint minAmountOut,
        uint maxPrice
    )
        external
        _logs_
        _lock_
        returns (uint tokenAmountOut, uint spotPriceAfter)
    {

        require(_records[tokenIn].bound);
        require(_records[tokenOut].bound);
        require(_publicSwap);

        Record storage inRecord = _records[address(tokenIn)];
        Record storage outRecord = _records[address(tokenOut)];

        require(tokenAmountIn <= bmul(inRecord.balance, MAX_IN_RATIO));

        uint spotPriceBefore = calcSpotPrice(
                                    inRecord.balance,
                                    inRecord.denorm,
                                    outRecord.balance,
                                    outRecord.denorm,
                                    _swapFee
                                );
        require(spotPriceBefore <= maxPrice);

        tokenAmountOut = calcOutGivenIn(
                            inRecord.balance,
                            inRecord.denorm,
                            outRecord.balance,
                            outRecord.denorm,
                            tokenAmountIn,
                            _swapFee
                        );
        require(tokenAmountOut >= minAmountOut);

        uint tokenAmountOutZeroFee = calcOutGivenIn(
                            inRecord.balance,
                            inRecord.denorm,
                            outRecord.balance,
                            outRecord.denorm,
                            tokenAmountIn,
                            0
                        );
        uint reserves = calcReserves(
            tokenAmountOutZeroFee,
            tokenAmountOut,
            _reservesRatio
        );

        inRecord.balance = badd(inRecord.balance, tokenAmountIn);
        // Subtract `reserves`.
        outRecord.balance = bsub(bsub(outRecord.balance, tokenAmountOut), reserves);

        spotPriceAfter = calcSpotPrice(
                                inRecord.balance,
                                inRecord.denorm,
                                outRecord.balance,
                                outRecord.denorm,
                                _swapFee
                            );
        require(spotPriceAfter >= spotPriceBefore);     
        require(spotPriceAfter <= maxPrice);
        require(spotPriceBefore <= bdiv(tokenAmountIn, tokenAmountOut));

        emit LOG_SWAP(msg.sender, tokenIn, tokenOut, tokenAmountIn, tokenAmountOut);

        totalReserves[address(tokenOut)] = badd(totalReserves[address(tokenOut)], reserves);

        _pullUnderlying(tokenIn, msg.sender, tokenAmountIn);
        _pushUnderlying(tokenOut, msg.sender, tokenAmountOut);

        return (tokenAmountOut, spotPriceAfter);
    }

    function swapExactAmountOut(
        address tokenIn,
        uint maxAmountIn,
        address tokenOut,
        uint tokenAmountOut,
        uint maxPrice
    )
        external
        _logs_
        _lock_ 
        returns (uint tokenAmountIn, uint spotPriceAfter)
    {
        require(_records[tokenIn].bound);
        require(_records[tokenOut].bound);
        require(_publicSwap);

        Record storage inRecord = _records[address(tokenIn)];
        Record storage outRecord = _records[address(tokenOut)];

        require(tokenAmountOut <= bmul(outRecord.balance, MAX_OUT_RATIO));

        uint spotPriceBefore = calcSpotPrice(
                                    inRecord.balance,
                                    inRecord.denorm,
                                    outRecord.balance,
                                    outRecord.denorm,
                                    _swapFee
                                );
        require(spotPriceBefore <= maxPrice);

        tokenAmountIn = calcInGivenOut(
                            inRecord.balance,
                            inRecord.denorm,
                            outRecord.balance,
                            outRecord.denorm,
                            tokenAmountOut,
                            _swapFee
                        );
        require(tokenAmountIn <= maxAmountIn);

        uint tokenAmountInZeroFee = calcInGivenOut(
                            inRecord.balance,
                            inRecord.denorm,
                            outRecord.balance,
                            outRecord.denorm,
                            tokenAmountOut,
                            0
                        );
        uint reserves = calcReserves(
            tokenAmountIn,
            tokenAmountInZeroFee,
            _reservesRatio
        );

        // Subtract `reserves` which is reserved for admin.
        inRecord.balance = bsub(badd(inRecord.balance, tokenAmountIn), reserves);
        outRecord.balance = bsub(outRecord.balance, tokenAmountOut);

        spotPriceAfter = calcSpotPrice(
                                inRecord.balance,
                                inRecord.denorm,
                                outRecord.balance,
                                outRecord.denorm,
                                _swapFee
                            );
        require(spotPriceAfter >= spotPriceBefore);
        require(spotPriceAfter <= maxPrice);
        require(spotPriceBefore <= bdiv(tokenAmountIn, tokenAmountOut));

        emit LOG_SWAP(msg.sender, tokenIn, tokenOut, tokenAmountIn, tokenAmountOut);

        totalReserves[address(tokenIn)] = badd(totalReserves[address(tokenIn)], reserves);

        _pullUnderlying(tokenIn, msg.sender, tokenAmountIn);
        _pushUnderlying(tokenOut, msg.sender, tokenAmountOut);

        return (tokenAmountIn, spotPriceAfter);
    }


    function joinswapExternAmountIn(address tokenIn, uint tokenAmountIn, uint minPoolAmountOut)
        external
        _logs_
        _lock_
        returns (uint poolAmountOut)

    {        
        require(_finalized);
        require(_records[tokenIn].bound);
        require(tokenAmountIn <= bmul(_records[tokenIn].balance, MAX_IN_RATIO));

        Record storage inRecord = _records[tokenIn];

        uint reserves;
        (poolAmountOut, reserves) = calcPoolOutGivenSingleIn(
                            inRecord.balance,
                            inRecord.denorm,
                            _totalSupply,
                            _totalWeight,
                            tokenAmountIn,
                            _swapFee,
                            _reservesRatio
                        );

        require(poolAmountOut >= minPoolAmountOut);

        inRecord.balance = bsub(badd(inRecord.balance, tokenAmountIn), reserves);

        emit LOG_JOIN(msg.sender, tokenIn, tokenAmountIn);

        totalReserves[address(tokenIn)] = badd(totalReserves[address(tokenIn)], reserves);

        _mintPoolShare(poolAmountOut);
        _pushPoolShare(msg.sender, poolAmountOut);
        _pullUnderlying(tokenIn, msg.sender, tokenAmountIn);

        return poolAmountOut;
    }

    function joinswapPoolAmountOut(address tokenIn, uint poolAmountOut, uint maxAmountIn)
        external
        _logs_
        _lock_
        returns (uint tokenAmountIn)
    {
        require(_finalized);
        require(_records[tokenIn].bound);

        Record storage inRecord = _records[tokenIn];

        tokenAmountIn = calcSingleInGivenPoolOut(
                            inRecord.balance,
                            inRecord.denorm,
                            _totalSupply,
                            _totalWeight,
                            poolAmountOut,
                            _swapFee
                        );

        require(tokenAmountIn != 0);
        require(tokenAmountIn <= maxAmountIn);
        
        require(tokenAmountIn <= bmul(_records[tokenIn].balance, MAX_IN_RATIO));

        uint tokenAmountInZeroFee = calcSingleInGivenPoolOut(
            inRecord.balance,
            inRecord.denorm,
            _totalSupply,
            _totalWeight,
            poolAmountOut,
            0
        );
        uint reserves = calcReserves(
            tokenAmountIn,
            tokenAmountInZeroFee,
            _reservesRatio
        );

        inRecord.balance = bsub(badd(inRecord.balance, tokenAmountIn), reserves);

        emit LOG_JOIN(msg.sender, tokenIn, tokenAmountIn);

        totalReserves[address(tokenIn)] = badd(totalReserves[address(tokenIn)], reserves);

        _mintPoolShare(poolAmountOut);
        _pushPoolShare(msg.sender, poolAmountOut);
        _pullUnderlying(tokenIn, msg.sender, tokenAmountIn);

        return tokenAmountIn;
    }

    function exitswapPoolAmountIn(address tokenOut, uint poolAmountIn, uint minAmountOut)
        external
        _logs_
        _lock_
        returns (uint tokenAmountOut)
    {
        require(_finalized);
        require(_records[tokenOut].bound);

        Record storage outRecord = _records[tokenOut];

        tokenAmountOut = calcSingleOutGivenPoolIn(
                            outRecord.balance,
                            outRecord.denorm,
                            _totalSupply,
                            _totalWeight,
                            poolAmountIn,
                            _swapFee
                        );

        require(tokenAmountOut >= minAmountOut);
        
        require(tokenAmountOut <= bmul(_records[tokenOut].balance, MAX_OUT_RATIO));

        uint tokenAmountOutZeroFee = calcSingleOutGivenPoolIn(
            outRecord.balance,
            outRecord.denorm,
            _totalSupply,
            _totalWeight,
            poolAmountIn,
            0
        );
        uint reserves = calcReserves(
            tokenAmountOutZeroFee,
            tokenAmountOut,
            _reservesRatio
        );

        outRecord.balance = bsub(bsub(outRecord.balance, tokenAmountOut), reserves);

        uint exitFee = bmul(poolAmountIn, EXIT_FEE);

        emit LOG_EXIT(msg.sender, tokenOut, tokenAmountOut);

        totalReserves[address(tokenOut)] = badd(totalReserves[address(tokenOut)], reserves);

        _pullPoolShare(msg.sender, poolAmountIn);
        _burnPoolShare(bsub(poolAmountIn, exitFee));
        _pushPoolShare(_factory, exitFee);
        _pushUnderlying(tokenOut, msg.sender, tokenAmountOut);

        return tokenAmountOut;
    }

    function exitswapExternAmountOut(address tokenOut, uint tokenAmountOut, uint maxPoolAmountIn)
        external
        _logs_
        _lock_
        returns (uint poolAmountIn)
    {
        require(_finalized);
        require(_records[tokenOut].bound);
        require(tokenAmountOut <= bmul(_records[tokenOut].balance, MAX_OUT_RATIO));

        Record storage outRecord = _records[tokenOut];

        uint reserves;
        (poolAmountIn, reserves) = calcPoolInGivenSingleOut(
                            outRecord.balance,
                            outRecord.denorm,
                            _totalSupply,
                            _totalWeight,
                            tokenAmountOut,
                            _swapFee,
                            _reservesRatio
                        );

        require(poolAmountIn != 0);
        require(poolAmountIn <= maxPoolAmountIn);

        outRecord.balance = bsub(bsub(outRecord.balance, tokenAmountOut), reserves);

        uint exitFee = bmul(poolAmountIn, EXIT_FEE);

        emit LOG_EXIT(msg.sender, tokenOut, tokenAmountOut);

        totalReserves[address(tokenOut)] = badd(totalReserves[address(tokenOut)], reserves);

        _pullPoolShare(msg.sender, poolAmountIn);
        _burnPoolShare(bsub(poolAmountIn, exitFee));
        _pushPoolShare(_factory, exitFee);
        _pushUnderlying(tokenOut, msg.sender, tokenAmountOut);        

        return poolAmountIn;
    }

    function drainTotalReserves(address reservesAddress)
        external
        _logs_
        _lock_
    {
        require(msg.sender == _factory);

        for (uint i = 0; i < _tokens.length; i++) {
            address t = _tokens[i];
            uint tokenAmountOut = totalReserves[t];
            totalReserves[t] = 0;
            emit LOG_DRAIN_RESERVES(reservesAddress, t, tokenAmountOut);
            _pushUnderlying(t, reservesAddress, tokenAmountOut);
        }
    }

    // ==
    // 'Underlying' token-manipulation functions make external calls but are NOT locked
    // You must `_lock_` or otherwise ensure reentry-safety

    function _pullUnderlying(address erc20, address from, uint amount)
        internal
    {
        bool xfer = IERC20(erc20).transferFrom(from, address(this), amount);
        require(xfer);
    }

    function _pushUnderlying(address erc20, address to, uint amount)
        internal
    {
        bool xfer = IERC20(erc20).transfer(to, amount);
        require(xfer);
    }

    function _pullPoolShare(address from, uint amount)
        internal
    {
        _pull(from, amount);
    }

    function _pushPoolShare(address to, uint amount)
        internal
    {
        _push(to, amount);
    }

    function _mintPoolShare(uint amount)
        internal
    {
        _mint(amount);
    }

    function _burnPoolShare(uint amount)
        internal
    {
        _burn(amount);
    }

}

File 2 of 6: BColor.sol
// This program is free software: you can redistribute it and/or modify
// it under the terms of the GNU General Public License as published by
// the Free Software Foundation, either version 3 of the License, or
// (at your option) any later version.

// This program is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
// GNU General Public License for more details.

// You should have received a copy of the GNU General Public License
// along with this program.  If not, see <http://www.gnu.org/licenses/>.

pragma solidity 0.5.12;

contract BColor {
    function getColor()
        external view
        returns (bytes32);
}

contract BBronze is BColor {
    function getColor()
        external view
        returns (bytes32) {
            return bytes32("BRONZE");
        }
}

File 3 of 6: BConst.sol
// This program is free software: you can redistribute it and/or modify
// it under the terms of the GNU General Public License as published by
// the Free Software Foundation, either version 3 of the License, or
// (at your option) any later version.

// This program is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
// GNU General Public License for more details.

// You should have received a copy of the GNU General Public License
// along with this program.  If not, see <http://www.gnu.org/licenses/>.

pragma solidity 0.5.12;

import "./BColor.sol";

contract BConst is BBronze {
    uint public constant BONE              = 10**18;

    uint public constant MIN_BOUND_TOKENS  = 2;
    uint public constant MAX_BOUND_TOKENS  = 8;

    uint public constant MIN_FEE           = BONE / 10**6;
    uint public constant MAX_FEE           = BONE / 10;
    uint public constant EXIT_FEE          = 0;
    uint public constant DEFAULT_RESERVES_RATIO = BONE / 5;

    uint public constant MIN_WEIGHT        = BONE;
    uint public constant MAX_WEIGHT        = BONE * 50;
    uint public constant MAX_TOTAL_WEIGHT  = BONE * 50;
    uint public constant MIN_BALANCE       = BONE / 10**12;

    uint public constant INIT_POOL_SUPPLY  = BONE * 100;

    uint public constant MIN_BPOW_BASE     = 1 wei;
    uint public constant MAX_BPOW_BASE     = (2 * BONE) - 1 wei;
    uint public constant BPOW_PRECISION    = BONE / 10**10;

    uint public constant MAX_IN_RATIO      = BONE / 2;
    uint public constant MAX_OUT_RATIO     = (BONE / 3) + 1 wei;
}

File 4 of 6: BMath.sol
// This program is free software: you can redistribute it and/or modify
// it under the terms of the GNU General Public License as published by
// the Free Software Foundation, either version 3 of the License, or
// (at your option) any later version.

// This program is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
// GNU General Public License for more details.

// You should have received a copy of the GNU General Public License
// along with this program.  If not, see <http://www.gnu.org/licenses/>.

pragma solidity 0.5.12;

import "./BNum.sol";

contract BMath is BBronze, BConst, BNum {
    /**********************************************************************************************
    // calcSpotPrice                                                                             //
    // sP = spotPrice                                                                            //
    // bI = tokenBalanceIn                ( bI / wI )         1                                  //
    // bO = tokenBalanceOut         sP =  -----------  *  ----------                             //
    // wI = tokenWeightIn                 ( bO / wO )     ( 1 - sF )                             //
    // wO = tokenWeightOut                                                                       //
    // sF = swapFee                                                                              //
    **********************************************************************************************/
    function calcSpotPrice(
        uint tokenBalanceIn,
        uint tokenWeightIn,
        uint tokenBalanceOut,
        uint tokenWeightOut,
        uint swapFee
    )
        public pure
        returns (uint spotPrice)
    {
        uint numer = bdiv(tokenBalanceIn, tokenWeightIn);
        uint denom = bdiv(tokenBalanceOut, tokenWeightOut);
        uint ratio = bdiv(numer, denom);
        uint scale = bdiv(BONE, bsub(BONE, swapFee));
        return  (spotPrice = bmul(ratio, scale));
    }

    /**********************************************************************************************
    // calcOutGivenIn                                                                            //
    // aO = tokenAmountOut                                                                       //
    // bO = tokenBalanceOut                                                                      //
    // bI = tokenBalanceIn              /      /            bI             \    (wI / wO) \      //
    // aI = tokenAmountIn    aO = bO * |  1 - | --------------------------  | ^            |     //
    // wI = tokenWeightIn               \      \ ( bI + ( aI * ( 1 - sF )) /              /      //
    // wO = tokenWeightOut                                                                       //
    // sF = swapFee                                                                              //
    **********************************************************************************************/
    function calcOutGivenIn(
        uint tokenBalanceIn,
        uint tokenWeightIn,
        uint tokenBalanceOut,
        uint tokenWeightOut,
        uint tokenAmountIn,
        uint swapFee
    )
        public pure
        returns (uint tokenAmountOut)
    {
        uint weightRatio = bdiv(tokenWeightIn, tokenWeightOut);
        uint adjustedIn = bsub(BONE, swapFee);
        adjustedIn = bmul(tokenAmountIn, adjustedIn);
        uint y = bdiv(tokenBalanceIn, badd(tokenBalanceIn, adjustedIn));
        uint foo = bpow(y, weightRatio);
        uint bar = bsub(BONE, foo);
        tokenAmountOut = bmul(tokenBalanceOut, bar);
        return tokenAmountOut;
    }

    /**********************************************************************************************
    // calcInGivenOut                                                                            //
    // aI = tokenAmountIn                                                                        //
    // bO = tokenBalanceOut               /  /     bO      \    (wO / wI)      \                 //
    // bI = tokenBalanceIn          bI * |  | ------------  | ^            - 1  |                //
    // aO = tokenAmountOut    aI =        \  \ ( bO - aO ) /                   /                 //
    // wI = tokenWeightIn           --------------------------------------------                 //
    // wO = tokenWeightOut                          ( 1 - sF )                                   //
    // sF = swapFee                                                                              //
    **********************************************************************************************/
    function calcInGivenOut(
        uint tokenBalanceIn,
        uint tokenWeightIn,
        uint tokenBalanceOut,
        uint tokenWeightOut,
        uint tokenAmountOut,
        uint swapFee
    )
        public pure
        returns (uint tokenAmountIn)
    {
        uint weightRatio = bdiv(tokenWeightOut, tokenWeightIn);
        uint diff = bsub(tokenBalanceOut, tokenAmountOut);
        uint y = bdiv(tokenBalanceOut, diff);
        uint foo = bpow(y, weightRatio);
        foo = bsub(foo, BONE);
        tokenAmountIn = bsub(BONE, swapFee);
        tokenAmountIn = bdiv(bmul(tokenBalanceIn, foo), tokenAmountIn);
        return tokenAmountIn;
    }

    /**********************************************************************************************
    // calcPoolOutGivenSingleIn                                                                  //
    // pAo = poolAmountOut         /                                              \              //
    // tAi = tokenAmountIn        ///      /     //    wI \      \\       \     wI \             //
    // wI = tokenWeightIn        //| tAi *| 1 - || 1 - --  | * sF || + tBi \    --  \            //
    // tW = totalWeight     pAo=||  \      \     \\    tW /      //         | ^ tW   | * pS - pS //
    // tBi = tokenBalanceIn      \\  ------------------------------------- /        /            //
    // pS = poolSupply            \\                    tBi               /        /             //
    // sF = swapFee                \                                              /              //
    **********************************************************************************************/
    function calcPoolOutGivenSingleIn(
        uint tokenBalanceIn,
        uint tokenWeightIn,
        uint poolSupply,
        uint totalWeight,
        uint tokenAmountIn,
        uint swapFee,
        uint reservesRatio
    )
        public pure
        returns (uint poolAmountOut, uint reserves)
    {
        // Charge the trading fee for the proportion of tokenAi
        ///  which is implicitly traded to the other pool tokens.
        // That proportion is (1- weightTokenIn)
        // tokenAiAfterFee = tAi * (1 - (1-weightTi) * poolFee);
        uint normalizedWeight = bdiv(tokenWeightIn, totalWeight);
        // Exact fee portion of `tokenAmountIn`, i.e. (1- Wt)
        uint zaz = bmul(bsub(BONE, normalizedWeight), swapFee);
        uint tokenAmountInAfterFee = bmul(tokenAmountIn, bsub(BONE, zaz));

        reserves = calcReserves(tokenAmountIn, tokenAmountInAfterFee, reservesRatio);
        uint newTokenBalanceIn = badd(tokenBalanceIn, tokenAmountInAfterFee);
        uint tokenInRatio = bdiv(newTokenBalanceIn, tokenBalanceIn);

        // uint newPoolSupply = (ratioTi ^ weightTi) * poolSupply;
        uint poolRatio = bpow(tokenInRatio, normalizedWeight);
        uint newPoolSupply = bmul(poolRatio, poolSupply);
        poolAmountOut = bsub(newPoolSupply, poolSupply);
        return (poolAmountOut, reserves);
    }

    /**********************************************************************************************
    // calcSingleInGivenPoolOut                                                                  //
    // tAi = tokenAmountIn              //(pS + pAo)\     /    1    \\                           //
    // pS = poolSupply                 || ---------  | ^ | --------- || * bI - bI                //
    // pAo = poolAmountOut              \\    pS    /     \(wI / tW)//                           //
    // bI = balanceIn          tAi =  --------------------------------------------               //
    // wI = weightIn                              /      wI  \                                   //
    // tW = totalWeight                          |  1 - ----  |  * sF                            //
    // sF = swapFee                               \      tW  /                                   //
    **********************************************************************************************/
    function calcSingleInGivenPoolOut(
        uint tokenBalanceIn,
        uint tokenWeightIn,
        uint poolSupply,
        uint totalWeight,
        uint poolAmountOut,
        uint swapFee
    )
        public pure
        returns (uint tokenAmountIn)
    {
        uint normalizedWeight = bdiv(tokenWeightIn, totalWeight);
        uint newPoolSupply = badd(poolSupply, poolAmountOut);
        uint poolRatio = bdiv(newPoolSupply, poolSupply);
      
        //uint newBalTi = poolRatio^(1/weightTi) * balTi;
        uint boo = bdiv(BONE, normalizedWeight); 
        uint tokenInRatio = bpow(poolRatio, boo);
        uint newTokenBalanceIn = bmul(tokenInRatio, tokenBalanceIn);
        uint tokenAmountInAfterFee = bsub(newTokenBalanceIn, tokenBalanceIn);
        // Do reverse order of fees charged in joinswap_ExternAmountIn, this way 
        //     ``` pAo == joinswap_ExternAmountIn(Ti, joinswap_PoolAmountOut(pAo, Ti)) ```
        //uint tAi = tAiAfterFee / (1 - (1-weightTi) * swapFee) ;
        uint zar = bmul(bsub(BONE, normalizedWeight), swapFee);
        tokenAmountIn = bdiv(tokenAmountInAfterFee, bsub(BONE, zar));
        return tokenAmountIn;
    }

    /**********************************************************************************************
    // calcSingleOutGivenPoolIn                                                                  //
    // tAo = tokenAmountOut            /      /                                             \\   //
    // bO = tokenBalanceOut           /      // pS - (pAi * (1 - eF)) \     /    1    \      \\  //
    // pAi = poolAmountIn            | bO - || ----------------------- | ^ | --------- | * b0 || //
    // ps = poolSupply                \      \\          pS           /     \(wO / tW)/      //  //
    // wI = tokenWeightIn      tAo =   \      \                                             //   //
    // tW = totalWeight                    /     /      wO \       \                             //
    // sF = swapFee                    *  | 1 - |  1 - ---- | * sF  |                            //
    // eF = exitFee                        \     \      tW /       /                             //
    **********************************************************************************************/
    function calcSingleOutGivenPoolIn(
        uint tokenBalanceOut,
        uint tokenWeightOut,
        uint poolSupply,
        uint totalWeight,
        uint poolAmountIn,
        uint swapFee
    )
        public pure
        returns (uint tokenAmountOut)
    {
        uint normalizedWeight = bdiv(tokenWeightOut, totalWeight);
        // charge exit fee on the pool token side
        // pAiAfterExitFee = pAi*(1-exitFee)
        uint poolAmountInAfterExitFee = bmul(poolAmountIn, bsub(BONE, EXIT_FEE));
        uint newPoolSupply = bsub(poolSupply, poolAmountInAfterExitFee);
        uint poolRatio = bdiv(newPoolSupply, poolSupply);
     
        // newBalTo = poolRatio^(1/weightTo) * balTo;
        uint tokenOutRatio = bpow(poolRatio, bdiv(BONE, normalizedWeight));
        uint newTokenBalanceOut = bmul(tokenOutRatio, tokenBalanceOut);

        uint tokenAmountOutBeforeSwapFee = bsub(tokenBalanceOut, newTokenBalanceOut);

        // charge swap fee on the output token side 
        //uint tAo = tAoBeforeSwapFee * (1 - (1-weightTo) * swapFee)
        uint zaz = bmul(bsub(BONE, normalizedWeight), swapFee); 
        tokenAmountOut = bmul(tokenAmountOutBeforeSwapFee, bsub(BONE, zaz));
        return tokenAmountOut;
    }

    /**********************************************************************************************
    // calcPoolInGivenSingleOut                                                                  //
    // pAi = poolAmountIn               // /               tAo             \\     / wO \     \   //
    // bO = tokenBalanceOut            // | bO - -------------------------- |\   | ---- |     \  //
    // tAo = tokenAmountOut      pS - ||   \     1 - ((1 - (tO / tW)) * sF)/  | ^ \ tW /  * pS | //
    // ps = poolSupply                 \\ -----------------------------------/                /  //
    // wO = tokenWeightOut  pAi =       \\               bO                 /                /   //
    // tW = totalWeight           -------------------------------------------------------------  //
    // sF = swapFee                                        ( 1 - eF )                            //
    // eF = exitFee                                                                              //
    **********************************************************************************************/
    function calcPoolInGivenSingleOut(
        uint tokenBalanceOut,
        uint tokenWeightOut,
        uint poolSupply,
        uint totalWeight,
        uint tokenAmountOut,
        uint swapFee,
        uint reservesRatio
    )
        public pure
        returns (uint poolAmountIn, uint reserves)
    {

        // charge swap fee on the output token side
        uint normalizedWeight = bdiv(tokenWeightOut, totalWeight);
        uint zar = bmul(bsub(BONE, normalizedWeight), swapFee);
        uint tokenAmountOutBeforeSwapFee = bdiv(tokenAmountOut, bsub(BONE, zar));
        reserves = calcReserves(tokenAmountOutBeforeSwapFee, tokenAmountOut, reservesRatio);

        uint newTokenBalanceOut = bsub(tokenBalanceOut, tokenAmountOutBeforeSwapFee);
        uint tokenOutRatio = bdiv(newTokenBalanceOut, tokenBalanceOut);

        //uint newPoolSupply = (ratioTo ^ weightTo) * poolSupply;
        uint poolRatio = bpow(tokenOutRatio, normalizedWeight);
        uint newPoolSupply = bmul(poolRatio, poolSupply);
        uint poolAmountInAfterExitFee = bsub(poolSupply, newPoolSupply);

        // charge exit fee on the pool token side
        // pAi = pAiAfterExitFee/(1-exitFee)
        poolAmountIn = bdiv(poolAmountInAfterExitFee, bsub(BONE, EXIT_FEE));
        return (poolAmountIn, reserves);
    }

    // `swapFeeAndReserves = amountWithFee - amountWithoutFee` is the swap fee in balancer.
    // We divide `swapFeeAndReserves` into halves, `actualSwapFee` and `reserves`.
    // `reserves` goes to the admin and `actualSwapFee` still goes to the liquidity
    // providers.
    function calcReserves(uint amountWithFee, uint amountWithoutFee, uint reservesRatio)
        internal pure
        returns (uint reserves)
    {
        require(amountWithFee >= amountWithoutFee);
        require(reservesRatio <= BONE);
        uint swapFeeAndReserves = bsub(amountWithFee, amountWithoutFee);
        reserves = bmul(swapFeeAndReserves, reservesRatio);
        require(swapFeeAndReserves >= reserves);
    }

}

File 5 of 6: BNum.sol
// This program is free software: you can redistribute it and/or modify
// it under the terms of the GNU General Public License as published by
// the Free Software Foundation, either version 3 of the License, or
// (at your option) any later version.

// This program is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
// GNU General Public License for more details.

// You should have received a copy of the GNU General Public License
// along with this program.  If not, see <http://www.gnu.org/licenses/>.

pragma solidity 0.5.12;

import "./BConst.sol";

contract BNum is BConst {

    function btoi(uint a)
        internal pure 
        returns (uint)
    {
        return a / BONE;
    }

    function bfloor(uint a)
        internal pure
        returns (uint)
    {
        return btoi(a) * BONE;
    }

    function badd(uint a, uint b)
        internal pure
        returns (uint)
    {
        uint c = a + b;
        require(c >= a);
        return c;
    }

    function bsub(uint a, uint b)
        internal pure
        returns (uint)
    {
        (uint c, bool flag) = bsubSign(a, b);
        require(!flag);
        return c;
    }

    function bsubSign(uint a, uint b)
        internal pure
        returns (uint, bool)
    {
        if (a >= b) {
            return (a - b, false);
        } else {
            return (b - a, true);
        }
    }

    function bmul(uint a, uint b)
        internal pure
        returns (uint)
    {
        uint c0 = a * b;
        require(a == 0 || c0 / a == b);
        uint c1 = c0 + (BONE / 2);
        require(c1 >= c0);
        uint c2 = c1 / BONE;
        return c2;
    }

    function bdiv(uint a, uint b)
        internal pure
        returns (uint)
    {
        require(b != 0);
        uint c0 = a * BONE;
        require(a == 0 || c0 / a == BONE); // bmul overflow
        uint c1 = c0 + (b / 2);
        require(c1 >= c0); //  badd require
        uint c2 = c1 / b;
        return c2;
    }

    // DSMath.wpow
    function bpowi(uint a, uint n)
        internal pure
        returns (uint)
    {
        uint z = n % 2 != 0 ? a : BONE;

        for (n /= 2; n != 0; n /= 2) {
            a = bmul(a, a);

            if (n % 2 != 0) {
                z = bmul(z, a);
            }
        }
        return z;
    }

    // Compute b^(e.w) by splitting it into (b^e)*(b^0.w).
    // Use `bpowi` for `b^e` and `bpowK` for k iterations
    // of approximation of b^0.w
    function bpow(uint base, uint exp)
        internal pure
        returns (uint)
    {
        require(base >= MIN_BPOW_BASE);
        require(base <= MAX_BPOW_BASE);

        uint whole  = bfloor(exp);   
        uint remain = bsub(exp, whole);

        uint wholePow = bpowi(base, btoi(whole));

        if (remain == 0) {
            return wholePow;
        }

        uint partialResult = bpowApprox(base, remain, BPOW_PRECISION);
        return bmul(wholePow, partialResult);
    }

    function bpowApprox(uint base, uint exp, uint precision)
        internal pure
        returns (uint)
    {
        // term 0:
        uint a     = exp;
        (uint x, bool xneg)  = bsubSign(base, BONE);
        uint term = BONE;
        uint sum   = term;
        bool negative = false;


        // term(k) = numer / denom 
        //         = (product(a - i - 1, i=1-->k) * x^k) / (k!)
        // each iteration, multiply previous term by (a-(k-1)) * x / k
        // continue until term is less than precision
        for (uint i = 1; term >= precision; i++) {
            uint bigK = i * BONE;
            (uint c, bool cneg) = bsubSign(a, bsub(bigK, BONE));
            term = bmul(term, bmul(c, x));
            term = bdiv(term, bigK);
            if (term == 0) break;

            if (xneg) negative = !negative;
            if (cneg) negative = !negative;
            if (negative) {
                sum = bsub(sum, term);
            } else {
                sum = badd(sum, term);
            }
        }

        return sum;
    }

}

File 6 of 6: BToken.sol
// This program is free software: you can redistribute it and/or modify
// it under the terms of the GNU General Public License as published by
// the Free Software Foundation, either version 3 of the License, or
// (at your option) any later version.

// This program is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
// GNU General Public License for more details.

// You should have received a copy of the GNU General Public License
// along with this program.  If not, see <http://www.gnu.org/licenses/>.

pragma solidity 0.5.12;

import "./BNum.sol";

// Highly opinionated token implementation

interface IERC20 {
    event Approval(address indexed src, address indexed dst, uint amt);
    event Transfer(address indexed src, address indexed dst, uint amt);

    function totalSupply() external view returns (uint);
    function balanceOf(address whom) external view returns (uint);
    function allowance(address src, address dst) external view returns (uint);

    function approve(address dst, uint amt) external returns (bool);
    function transfer(address dst, uint amt) external returns (bool);
    function transferFrom(
        address src, address dst, uint amt
    ) external returns (bool);
}

contract BTokenBase is BNum {

    mapping(address => uint)                   internal _balance;
    mapping(address => mapping(address=>uint)) internal _allowance;
    uint internal _totalSupply;

    event Approval(address indexed src, address indexed dst, uint amt);
    event Transfer(address indexed src, address indexed dst, uint amt);

    function _mint(uint amt) internal {
        _balance[address(this)] = badd(_balance[address(this)], amt);
        _totalSupply = badd(_totalSupply, amt);
        emit Transfer(address(0), address(this), amt);
    }

    function _burn(uint amt) internal {
        require(_balance[address(this)] >= amt);
        _balance[address(this)] = bsub(_balance[address(this)], amt);
        _totalSupply = bsub(_totalSupply, amt);
        emit Transfer(address(this), address(0), amt);
    }

    function _move(address src, address dst, uint amt) internal {
        require(_balance[src] >= amt);
        _balance[src] = bsub(_balance[src], amt);
        _balance[dst] = badd(_balance[dst], amt);
        emit Transfer(src, dst, amt);
    }

    function _push(address to, uint amt) internal {
        _move(address(this), to, amt);
    }

    function _pull(address from, uint amt) internal {
        _move(from, address(this), amt);
    }
}

contract BToken is BTokenBase, IERC20 {

    string  private _name     = "Cream Pool Token";
    string  private _symbol   = "CRPT";
    uint8   private _decimals = 18;

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

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

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

    function allowance(address src, address dst) external view returns (uint) {
        return _allowance[src][dst];
    }

    function balanceOf(address whom) external view returns (uint) {
        return _balance[whom];
    }

    function totalSupply() public view returns (uint) {
        return _totalSupply;
    }

    function approve(address dst, uint amt) external returns (bool) {
        _allowance[msg.sender][dst] = amt;
        emit Approval(msg.sender, dst, amt);
        return true;
    }

    function increaseApproval(address dst, uint amt) external returns (bool) {
        _allowance[msg.sender][dst] = badd(_allowance[msg.sender][dst], amt);
        emit Approval(msg.sender, dst, _allowance[msg.sender][dst]);
        return true;
    }

    function decreaseApproval(address dst, uint amt) external returns (bool) {
        uint oldValue = _allowance[msg.sender][dst];
        if (amt > oldValue) {
            _allowance[msg.sender][dst] = 0;
        } else {
            _allowance[msg.sender][dst] = bsub(oldValue, amt);
        }
        emit Approval(msg.sender, dst, _allowance[msg.sender][dst]);
        return true;
    }

    function transfer(address dst, uint amt) external returns (bool) {
        _move(msg.sender, dst, amt);
        return true;
    }

    function transferFrom(address src, address dst, uint amt) external returns (bool) {
        require(msg.sender == src || amt <= _allowance[src][msg.sender]);
        _move(src, dst, amt);
        if (msg.sender != src && _allowance[src][msg.sender] != uint256(-1)) {
            _allowance[src][msg.sender] = bsub(_allowance[src][msg.sender], amt);
            emit Approval(msg.sender, dst, _allowance[src][msg.sender]);
        }
        return true;
    }
}

Contract Security Audit

Contract ABI

[{"inputs":[],"payable":false,"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"src","type":"address"},{"indexed":true,"internalType":"address","name":"dst","type":"address"},{"indexed":false,"internalType":"uint256","name":"amt","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":true,"inputs":[{"indexed":true,"internalType":"bytes4","name":"sig","type":"bytes4"},{"indexed":true,"internalType":"address","name":"caller","type":"address"},{"indexed":false,"internalType":"bytes","name":"data","type":"bytes"}],"name":"LOG_CALL","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"caller","type":"address"},{"indexed":true,"internalType":"address","name":"tokenOut","type":"address"},{"indexed":false,"internalType":"uint256","name":"tokenAmountOut","type":"uint256"}],"name":"LOG_DRAIN_RESERVES","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"caller","type":"address"},{"indexed":true,"internalType":"address","name":"tokenOut","type":"address"},{"indexed":false,"internalType":"uint256","name":"tokenAmountOut","type":"uint256"}],"name":"LOG_EXIT","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"caller","type":"address"},{"indexed":true,"internalType":"address","name":"tokenIn","type":"address"},{"indexed":false,"internalType":"uint256","name":"tokenAmountIn","type":"uint256"}],"name":"LOG_JOIN","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"caller","type":"address"},{"indexed":true,"internalType":"address","name":"tokenIn","type":"address"},{"indexed":true,"internalType":"address","name":"tokenOut","type":"address"},{"indexed":false,"internalType":"uint256","name":"tokenAmountIn","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"tokenAmountOut","type":"uint256"}],"name":"LOG_SWAP","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"src","type":"address"},{"indexed":true,"internalType":"address","name":"dst","type":"address"},{"indexed":false,"internalType":"uint256","name":"amt","type":"uint256"}],"name":"Transfer","type":"event"},{"constant":true,"inputs":[],"name":"BONE","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"BPOW_PRECISION","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"DEFAULT_RESERVES_RATIO","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"EXIT_FEE","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"INIT_POOL_SUPPLY","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"MAX_BOUND_TOKENS","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"MAX_BPOW_BASE","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"MAX_FEE","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"MAX_IN_RATIO","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"MAX_OUT_RATIO","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"MAX_TOTAL_WEIGHT","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"MAX_WEIGHT","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"MIN_BALANCE","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"MIN_BOUND_TOKENS","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"MIN_BPOW_BASE","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"MIN_FEE","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"MIN_WEIGHT","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"address","name":"src","type":"address"},{"internalType":"address","name":"dst","type":"address"}],"name":"allowance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"dst","type":"address"},{"internalType":"uint256","name":"amt","type":"uint256"}],"name":"approve","outputs":[{"internalType":"bool","name":"","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"internalType":"address","name":"whom","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"token","type":"address"},{"internalType":"uint256","name":"balance","type":"uint256"},{"internalType":"uint256","name":"denorm","type":"uint256"}],"name":"bind","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"internalType":"uint256","name":"tokenBalanceIn","type":"uint256"},{"internalType":"uint256","name":"tokenWeightIn","type":"uint256"},{"internalType":"uint256","name":"tokenBalanceOut","type":"uint256"},{"internalType":"uint256","name":"tokenWeightOut","type":"uint256"},{"internalType":"uint256","name":"tokenAmountOut","type":"uint256"},{"internalType":"uint256","name":"swapFee","type":"uint256"}],"name":"calcInGivenOut","outputs":[{"internalType":"uint256","name":"tokenAmountIn","type":"uint256"}],"payable":false,"stateMutability":"pure","type":"function"},{"constant":true,"inputs":[{"internalType":"uint256","name":"tokenBalanceIn","type":"uint256"},{"internalType":"uint256","name":"tokenWeightIn","type":"uint256"},{"internalType":"uint256","name":"tokenBalanceOut","type":"uint256"},{"internalType":"uint256","name":"tokenWeightOut","type":"uint256"},{"internalType":"uint256","name":"tokenAmountIn","type":"uint256"},{"internalType":"uint256","name":"swapFee","type":"uint256"}],"name":"calcOutGivenIn","outputs":[{"internalType":"uint256","name":"tokenAmountOut","type":"uint256"}],"payable":false,"stateMutability":"pure","type":"function"},{"constant":true,"inputs":[{"internalType":"uint256","name":"tokenBalanceOut","type":"uint256"},{"internalType":"uint256","name":"tokenWeightOut","type":"uint256"},{"internalType":"uint256","name":"poolSupply","type":"uint256"},{"internalType":"uint256","name":"totalWeight","type":"uint256"},{"internalType":"uint256","name":"tokenAmountOut","type":"uint256"},{"internalType":"uint256","name":"swapFee","type":"uint256"},{"internalType":"uint256","name":"reservesRatio","type":"uint256"}],"name":"calcPoolInGivenSingleOut","outputs":[{"internalType":"uint256","name":"poolAmountIn","type":"uint256"},{"internalType":"uint256","name":"reserves","type":"uint256"}],"payable":false,"stateMutability":"pure","type":"function"},{"constant":true,"inputs":[{"internalType":"uint256","name":"tokenBalanceIn","type":"uint256"},{"internalType":"uint256","name":"tokenWeightIn","type":"uint256"},{"internalType":"uint256","name":"poolSupply","type":"uint256"},{"internalType":"uint256","name":"totalWeight","type":"uint256"},{"internalType":"uint256","name":"tokenAmountIn","type":"uint256"},{"internalType":"uint256","name":"swapFee","type":"uint256"},{"internalType":"uint256","name":"reservesRatio","type":"uint256"}],"name":"calcPoolOutGivenSingleIn","outputs":[{"internalType":"uint256","name":"poolAmountOut","type":"uint256"},{"internalType":"uint256","name":"reserves","type":"uint256"}],"payable":false,"stateMutability":"pure","type":"function"},{"constant":true,"inputs":[{"internalType":"uint256","name":"tokenBalanceIn","type":"uint256"},{"internalType":"uint256","name":"tokenWeightIn","type":"uint256"},{"internalType":"uint256","name":"poolSupply","type":"uint256"},{"internalType":"uint256","name":"totalWeight","type":"uint256"},{"internalType":"uint256","name":"poolAmountOut","type":"uint256"},{"internalType":"uint256","name":"swapFee","type":"uint256"}],"name":"calcSingleInGivenPoolOut","outputs":[{"internalType":"uint256","name":"tokenAmountIn","type":"uint256"}],"payable":false,"stateMutability":"pure","type":"function"},{"constant":true,"inputs":[{"internalType":"uint256","name":"tokenBalanceOut","type":"uint256"},{"internalType":"uint256","name":"tokenWeightOut","type":"uint256"},{"internalType":"uint256","name":"poolSupply","type":"uint256"},{"internalType":"uint256","name":"totalWeight","type":"uint256"},{"internalType":"uint256","name":"poolAmountIn","type":"uint256"},{"internalType":"uint256","name":"swapFee","type":"uint256"}],"name":"calcSingleOutGivenPoolIn","outputs":[{"internalType":"uint256","name":"tokenAmountOut","type":"uint256"}],"payable":false,"stateMutability":"pure","type":"function"},{"constant":true,"inputs":[{"internalType":"uint256","name":"tokenBalanceIn","type":"uint256"},{"internalType":"uint256","name":"tokenWeightIn","type":"uint256"},{"internalType":"uint256","name":"tokenBalanceOut","type":"uint256"},{"internalType":"uint256","name":"tokenWeightOut","type":"uint256"},{"internalType":"uint256","name":"swapFee","type":"uint256"}],"name":"calcSpotPrice","outputs":[{"internalType":"uint256","name":"spotPrice","type":"uint256"}],"payable":false,"stateMutability":"pure","type":"function"},{"constant":true,"inputs":[],"name":"decimals","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"dst","type":"address"},{"internalType":"uint256","name":"amt","type":"uint256"}],"name":"decreaseApproval","outputs":[{"internalType":"bool","name":"","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"reservesAddress","type":"address"}],"name":"drainTotalReserves","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"uint256","name":"poolAmountIn","type":"uint256"},{"internalType":"uint256[]","name":"minAmountsOut","type":"uint256[]"}],"name":"exitPool","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"tokenOut","type":"address"},{"internalType":"uint256","name":"tokenAmountOut","type":"uint256"},{"internalType":"uint256","name":"maxPoolAmountIn","type":"uint256"}],"name":"exitswapExternAmountOut","outputs":[{"internalType":"uint256","name":"poolAmountIn","type":"uint256"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"tokenOut","type":"address"},{"internalType":"uint256","name":"poolAmountIn","type":"uint256"},{"internalType":"uint256","name":"minAmountOut","type":"uint256"}],"name":"exitswapPoolAmountIn","outputs":[{"internalType":"uint256","name":"tokenAmountOut","type":"uint256"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[],"name":"finalize","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"internalType":"address","name":"token","type":"address"}],"name":"getBalance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"getColor","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"getController","outputs":[{"internalType":"address","name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"getCurrentTokens","outputs":[{"internalType":"address[]","name":"tokens","type":"address[]"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"address","name":"token","type":"address"}],"name":"getDenormalizedWeight","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"getFinalTokens","outputs":[{"internalType":"address[]","name":"tokens","type":"address[]"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"address","name":"token","type":"address"}],"name":"getNormalizedWeight","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"getNumTokens","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"getReservesRatio","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"address","name":"tokenIn","type":"address"},{"internalType":"address","name":"tokenOut","type":"address"}],"name":"getSpotPrice","outputs":[{"internalType":"uint256","name":"spotPrice","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"address","name":"tokenIn","type":"address"},{"internalType":"address","name":"tokenOut","type":"address"}],"name":"getSpotPriceSansFee","outputs":[{"internalType":"uint256","name":"spotPrice","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"getSwapFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"getTotalDenormalizedWeight","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"token","type":"address"}],"name":"gulp","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"dst","type":"address"},{"internalType":"uint256","name":"amt","type":"uint256"}],"name":"increaseApproval","outputs":[{"internalType":"bool","name":"","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"internalType":"address","name":"t","type":"address"}],"name":"isBound","outputs":[{"internalType":"bool","name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"isFinalized","outputs":[{"internalType":"bool","name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"isPublicSwap","outputs":[{"internalType":"bool","name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"internalType":"uint256","name":"poolAmountOut","type":"uint256"},{"internalType":"uint256[]","name":"maxAmountsIn","type":"uint256[]"}],"name":"joinPool","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"tokenIn","type":"address"},{"internalType":"uint256","name":"tokenAmountIn","type":"uint256"},{"internalType":"uint256","name":"minPoolAmountOut","type":"uint256"}],"name":"joinswapExternAmountIn","outputs":[{"internalType":"uint256","name":"poolAmountOut","type":"uint256"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"tokenIn","type":"address"},{"internalType":"uint256","name":"poolAmountOut","type":"uint256"},{"internalType":"uint256","name":"maxAmountIn","type":"uint256"}],"name":"joinswapPoolAmountOut","outputs":[{"internalType":"uint256","name":"tokenAmountIn","type":"uint256"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"token","type":"address"},{"internalType":"uint256","name":"balance","type":"uint256"},{"internalType":"uint256","name":"denorm","type":"uint256"}],"name":"rebind","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"token","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"seize","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"manager","type":"address"}],"name":"setController","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"bool","name":"public_","type":"bool"}],"name":"setPublicSwap","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"uint256","name":"reservesRatio","type":"uint256"}],"name":"setReservesRatio","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"uint256","name":"swapFee","type":"uint256"}],"name":"setSwapFee","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"tokenIn","type":"address"},{"internalType":"uint256","name":"tokenAmountIn","type":"uint256"},{"internalType":"address","name":"tokenOut","type":"address"},{"internalType":"uint256","name":"minAmountOut","type":"uint256"},{"internalType":"uint256","name":"maxPrice","type":"uint256"}],"name":"swapExactAmountIn","outputs":[{"internalType":"uint256","name":"tokenAmountOut","type":"uint256"},{"internalType":"uint256","name":"spotPriceAfter","type":"uint256"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"tokenIn","type":"address"},{"internalType":"uint256","name":"maxAmountIn","type":"uint256"},{"internalType":"address","name":"tokenOut","type":"address"},{"internalType":"uint256","name":"tokenAmountOut","type":"uint256"},{"internalType":"uint256","name":"maxPrice","type":"uint256"}],"name":"swapExactAmountOut","outputs":[{"internalType":"uint256","name":"tokenAmountIn","type":"uint256"},{"internalType":"uint256","name":"spotPriceAfter","type":"uint256"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"totalReserves","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"dst","type":"address"},{"internalType":"uint256","name":"amt","type":"uint256"}],"name":"transfer","outputs":[{"internalType":"bool","name":"","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"src","type":"address"},{"internalType":"address","name":"dst","type":"address"},{"internalType":"uint256","name":"amt","type":"uint256"}],"name":"transferFrom","outputs":[{"internalType":"bool","name":"","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"token","type":"address"}],"name":"unbind","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"}]

Deployed Bytecode

0x608060405234801561001057600080fd5b506004361061039d5760003560e01c806392eefe9b116101eb578063bc694ea211610110578063dd62ed3e116100a8578063dd62ed3e14610c51578063e4a28a52146104fd578063e4e1e53814610c7f578063eb9253c014610cb1578063ec09302114610cdd578063f1b8a9b714610ce5578063f8b2cb4f14610d0b578063f8d6aed414610d31578063fde924f714610d6c5761039d565b8063bc694ea214610b7f578063be3bbd2e14610b87578063c36596a614610571578063c6580d1214610bdf578063cc77828d14610be7578063cd2ed8fb14610bef578063cf5e7bd314610bf7578063d4cadf6814610c1d578063d73dd62314610c255761039d565b8063a9059cbb11610183578063a9059cbb14610a40578063aeeead6614610a6c578063b02f0b7314610a92578063b0e0d13614610b07578063b4a8e10114610b0f578063b7b800a414610b2c578063ba019dab14610b34578063ba9530a614610b3c578063bc063e1a14610b775761039d565b806392eefe9b1461098f578063936c3477146109b55780639381cd2b146109bd57806393c88d14146109c5578063948d8ce6146109cd57806395d89b41146109f3578063992e2a92146109fb5780639a86139b14610a03578063a221ee4914610a0b5761039d565b806346ab38f1116102d15780636d0800bc116102695780636d0800bc1461084a57806370a082311461087057806376c7a3c7146108965780637c5e9ea41461089e5780638201aa3f146108de578063867378c51461091e57806389298012146109265780638c28cbe8146109615780638d4e4083146109875761039d565b806346ab38f1146106a957806349b59552146106db5780634bb278f3146106fa5780634d2fd81d146107025780634f69c0d41461070a5780635c1bbaf71461077f5780635db34277146107ba57806366188463146107ec5780636d06dfa0146108185761039d565b8063189d00ca11610344578063189d00ca14610569578063218b53821461057157806321abba011461057957806323b872dd146105ba5780632f37b624146105f05780633018205f14610616578063313ce5671461063a57806334e19907146106585780633fdddaa2146106775761039d565b8063024eb2e3146103a257806302c96748146103fc57806306fdde0314610440578063095ea7b3146104bd57806309a3bbe4146104fd5780631446a7ff1461050557806315e84af91461053357806318160ddd14610561575b600080fd5b6103e3600480360360e08110156103b857600080fd5b5080359060208101359060408101359060608101359060808101359060a08101359060c00135610d74565b6040805192835260208301919091528051918290030190f35b61042e6004803603606081101561041257600080fd5b506001600160a01b038135169060208101359060400135610e43565b60408051918252519081900360200190f35b610448611093565b6040805160208082528351818301528351919283929083019185019080838360005b8381101561048257818101518382015260200161046a565b50505050905090810190601f1680156104af5780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b6104e9600480360360408110156104d357600080fd5b506001600160a01b038135169060200135611129565b604080519115158252519081900360200190f35b61042e61117e565b61042e6004803603604081101561051b57600080fd5b506001600160a01b038135811691602001351661118b565b61042e6004803603604081101561054957600080fd5b506001600160a01b038135811691602001351661123a565b61042e6112e0565b61042e6112e6565b61042e6112fa565b6103e3600480360360e081101561058f57600080fd5b5080359060208101359060408101359060608101359060808101359060a08101359060c00135611306565b6104e9600480360360608110156105d057600080fd5b506001600160a01b038135811691602081013590911690604001356113b3565b6104e96004803603602081101561060657600080fd5b50356001600160a01b03166114cd565b61061e6114eb565b604080516001600160a01b039092168252519081900360200190f35b610642611513565b6040805160ff9092168252519081900360200190f35b6106756004803603602081101561066e57600080fd5b503561151c565b005b6106756004803603606081101561068d57600080fd5b506001600160a01b0381351690602081013590604001356115ff565b61042e600480360360608110156106bf57600080fd5b506001600160a01b03813516906020810135906040013561183b565b610675600480360360208110156106f157600080fd5b50351515611a8f565b610675611b64565b61042e611c74565b6106756004803603604081101561072057600080fd5b81359190810190604081016020820135600160201b81111561074157600080fd5b82018360208201111561075357600080fd5b803590602001918460208302840111600160201b8311171561077457600080fd5b509092509050611c93565b61042e600480360360c081101561079557600080fd5b5080359060208101359060408101359060608101359060808101359060a00135611e5d565b61042e600480360360608110156107d057600080fd5b506001600160a01b038135169060208101359060400135611f10565b6104e96004803603604081101561080257600080fd5b506001600160a01b038135169060200135612117565b61042e6004803603606081101561082e57600080fd5b506001600160a01b0381351690602081013590604001356121ef565b61042e6004803603602081101561086057600080fd5b50356001600160a01b0316612407565b61042e6004803603602081101561088657600080fd5b50356001600160a01b0316612419565b61042e612434565b6103e3600480360360a08110156108b457600080fd5b506001600160a01b0381358116916020810135916040820135169060608101359060800135612446565b6103e3600480360360a08110156108f457600080fd5b506001600160a01b038135811691602081013591604082013516906060810135906080013561273b565b61042e612a15565b61042e600480360360c081101561093c57600080fd5b5080359060208101359060408101359060608101359060808101359060a00135612a29565b6106756004803603602081101561097757600080fd5b50356001600160a01b0316612ad9565b6104e9612c1f565b610675600480360360208110156109a557600080fd5b50356001600160a01b0316612c28565b61042e612cf3565b61042e612d12565b61042e612d1f565b61042e600480360360208110156109e357600080fd5b50356001600160a01b0316612d2f565b610448612d8b565b61042e612dec565b61042e612df8565b61042e600480360360a0811015610a2157600080fd5b5080359060208101359060408101359060608101359060800135612e05565b6104e960048036036040811015610a5657600080fd5b506001600160a01b038135169060200135612e6a565b61067560048036036020811015610a8257600080fd5b50356001600160a01b0316612e80565b61067560048036036040811015610aa857600080fd5b81359190810190604081016020820135600160201b811115610ac957600080fd5b820183602082011115610adb57600080fd5b803590602001918460208302840111600160201b83111715610afc57600080fd5b509092509050612fc6565b61042e6131dd565b61067560048036036020811015610b2557600080fd5b50356131e2565b61042e6132b3565b61042e6132b8565b61042e600480360360c0811015610b5257600080fd5b5080359060208101359060408101359060608101359060808101359060a001356132bd565b61042e61333e565b61042e61334e565b610b8f61335a565b60408051602080825283518183015283519192839290830191858101910280838360005b83811015610bcb578181015183820152602001610bb3565b505050509050019250505060405180910390f35b61042e6133e0565b610b8f6133e5565b61042e6133fd565b61067560048036036020811015610c0d57600080fd5b50356001600160a01b0316613403565b61042e61369f565b6104e960048036036040811015610c3b57600080fd5b506001600160a01b0381351690602001356136be565b61042e60048036036040811015610c6757600080fd5b506001600160a01b038135811691602001351661373f565b61067560048036036060811015610c9557600080fd5b506001600160a01b03813516906020810135906040013561376a565b61067560048036036040811015610cc757600080fd5b506001600160a01b0381351690602001356138d9565b61042e613a3d565b61042e60048036036020811015610cfb57600080fd5b50356001600160a01b0316613a4d565b61042e60048036036020811015610d2157600080fd5b50356001600160a01b0316613abb565b61042e600480360360c0811015610d4757600080fd5b5080359060208101359060408101359060608101359060808101359060a00135613b17565b6104e9613b9a565b6000806000610d838988613baa565b90506000610da2610d9c670de0b6b3a764000084613c10565b87613c36565b90506000610dc188610dbc670de0b6b3a764000085613c10565b613baa565b9050610dce818988613c82565b93506000610ddc8d83613c10565b90506000610dea828f613baa565b90506000610df88287613ccd565b90506000610e06828f613c36565b90506000610e148f83613c10565b9050610e2d81610dbc670de0b6b3a76400006000613c10565b9950505050505050505097509795505050505050565b6000336001600160a01b03166000356001600160e01b0319166001600160e01b03191660003660405180806020018281038252848482818152602001925080828437600083820152604051601f909101601f19169092018290039550909350505050a2600554610100900460ff1615610ebb57600080fd5b6005805461ff00191661010017905560095460ff16610ed957600080fd5b6001600160a01b0384166000908152600b602052604090205460ff16610efe57600080fd5b6001600160a01b0384166000908152600b60205260409020600390810154610f3391670de0b6b3a76400005b04600101613c36565b831115610f3f57600080fd5b6000600b6000866001600160a01b03166001600160a01b0316815260200190815260200160002090506000610f8982600301548360020154600254600d5489600754600854610d74565b909350905082610f9857600080fd5b83831115610fa557600080fd5b610fbc610fb6836003015487613c10565b82613c10565b60038301556000610fcd8482613c36565b6040805188815290519192506001600160a01b0389169133916000805160206141fe833981519152919081900360200190a36001600160a01b0387166000908152600c60205260409020546110229083613d5a565b6001600160a01b0388166000908152600c60205260409020556110453385613d6c565b6110576110528583613c10565b613d7a565b600554611073906201000090046001600160a01b031682613d86565b61107e873388613d90565b5050506005805461ff00191690559392505050565b60038054604080516020601f600260001961010060018816150201909516949094049384018190048102820181019092528281526060939092909183018282801561111f5780601f106110f45761010080835404028352916020019161111f565b820191906000526020600020905b81548152906001019060200180831161110257829003601f168201915b5050505050905090565b3360008181526001602090815260408083206001600160a01b0387168085529083528184208690558151868152915193949093909260008051602061421e833981519152928290030190a35060015b92915050565b6802b5e3af16b188000081565b600554600090610100900460ff16156111a357600080fd5b6001600160a01b0383166000908152600b602052604090205460ff166111c857600080fd5b6001600160a01b0382166000908152600b602052604090205460ff166111ed57600080fd5b6001600160a01b038084166000908152600b602052604080822092851682528120600380840154600280860154928401549084015493946112319492939290612e05565b95945050505050565b600554600090610100900460ff161561125257600080fd5b6001600160a01b0383166000908152600b602052604090205460ff1661127757600080fd5b6001600160a01b0382166000908152600b602052604090205460ff1661129c57600080fd5b6001600160a01b038084166000908152600b602052604080822092851682529020600380830154600280850154928401549084015460075461123194929190612e05565b60025490565b6402540be400670de0b6b3a76400005b0481565b670de0b6b3a764000081565b60008060006113158988613baa565b9050600061132e610d9c670de0b6b3a764000084613c10565b9050600061134d88611348670de0b6b3a764000085613c10565b613c36565b905061135a888288613c82565b935060006113688d83613d5a565b90506000611376828f613baa565b905060006113848287613ccd565b90506000611392828f613c36565b905061139e818f613c10565b98505050505050505097509795505050505050565b6000336001600160a01b03851614806113ef57506001600160a01b03841660009081526001602090815260408083203384529091529020548211155b6113f857600080fd5b611403848484613e21565b336001600160a01b0385161480159061144157506001600160a01b038416600090815260016020908152604080832033845290915290205460001914155b156114c3576001600160a01b03841660009081526001602090815260408083203384529091529020546114749083613c10565b6001600160a01b038581166000908152600160209081526040808320338085529083529281902085905580519485525192871693919260008051602061421e8339815191529281900390910190a35b5060019392505050565b6001600160a01b03166000908152600b602052604090205460ff1690565b600554600090610100900460ff161561150357600080fd5b506006546001600160a01b031690565b60055460ff1690565b336001600160a01b03166000356001600160e01b0319166001600160e01b03191660003660405180806020018281038252848482818152602001925080828437600083820152604051601f909101601f19169092018290039550909350505050a2600554610100900460ff161561159257600080fd5b6005805461ff00191661010017905560095460ff16156115b157600080fd5b6006546001600160a01b031633146115c857600080fd5b64e8d4a510008110156115da57600080fd5b67016345785d8a00008111156115ef57600080fd5b6007556005805461ff0019169055565b336001600160a01b03166000356001600160e01b0319166001600160e01b03191660003660405180806020018281038252848482818152602001925080828437600083820152604051601f909101601f19169092018290039550909350505050a2600554610100900460ff161561167557600080fd5b6005805461ff001916610100179055600654336001600160a01b039091161461169d57600080fd5b6001600160a01b0383166000908152600b602052604090205460ff166116c257600080fd5b60095460ff16156116d257600080fd5b670de0b6b3a76400008110156116e757600080fd5b6802b5e3af16b18800008111156116fd57600080fd5b620f424082101561170d57600080fd5b6001600160a01b0383166000908152600b60205260409020600201548082111561176557611746600d546117418484613c10565b613d5a565b600d8190556802b5e3af16b1880000101561176057600080fd5b611786565b8082101561178657611782600d5461177d8385613c10565b613c10565b600d555b6001600160a01b0384166000908152600b6020526040902060028101839055600301805490849055808411156117cf576117ca85336117c58785613c10565b613ee0565b611829565b808410156118295760006117e38286613c10565b905060006117f2826000613c36565b905061180887336118038585613c10565b613d90565b6005546118269088906201000090046001600160a01b031683613d90565b50505b50506005805461ff0019169055505050565b6000336001600160a01b03166000356001600160e01b0319166001600160e01b03191660003660405180806020018281038252848482818152602001925080828437600083820152604051601f909101601f19169092018290039550909350505050a2600554610100900460ff16156118b357600080fd5b6005805461ff00191661010017905560095460ff166118d157600080fd5b6001600160a01b0384166000908152600b602052604090205460ff166118f657600080fd5b6001600160a01b0384166000908152600b6020526040902060038101546002808301549054600d5460075461193094939291908990612a29565b91508282101561193f57600080fd5b6001600160a01b0385166000908152600b6020526040902060039081015461196f91670de0b6b3a7640000610f2a565b82111561197b57600080fd5b600061199882600301548360020154600254600d54896000612a29565b905060006119a98285600854613c82565b90506119bc610fb6846003015486613c10565b600384015560006119cd8782613c36565b6040805187815290519192506001600160a01b038a169133916000805160206141fe833981519152919081900360200190a36001600160a01b0388166000908152600c6020526040902054611a229083613d5a565b6001600160a01b0389166000908152600c6020526040902055611a453388613d6c565b611a526110528883613c10565b600554611a6e906201000090046001600160a01b031682613d86565b611a79883387613d90565b505050506005805461ff00191690559392505050565b336001600160a01b03166000356001600160e01b0319166001600160e01b03191660003660405180806020018281038252848482818152602001925080828437600083820152604051601f909101601f19169092018290039550909350505050a2600554610100900460ff1615611b0557600080fd5b6005805461ff00191661010017905560095460ff1615611b2457600080fd5b6006546001600160a01b03163314611b3b57600080fd5b60068054911515600160a01b0260ff60a01b199092169190911790556005805461ff0019169055565b336001600160a01b03166000356001600160e01b0319166001600160e01b03191660003660405180806020018281038252848482818152602001925080828437600083820152604051601f909101601f19169092018290039550909350505050a2600554610100900460ff1615611bda57600080fd5b6005805461ff001916610100179055600654336001600160a01b0390911614611c0257600080fd5b60095460ff1615611c1257600080fd5b600a5460021115611c2257600080fd5b6009805460ff191660011790556006805460ff60a01b1916600160a01b179055611c5468056bc75e2d63100000613f39565b611c673368056bc75e2d63100000613d86565b6005805461ff0019169055565b600554600090610100900460ff1615611c8c57600080fd5b5060085490565b336001600160a01b03166000356001600160e01b0319166001600160e01b03191660003660405180806020018281038252848482818152602001925080828437600083820152604051601f909101601f19169092018290039550909350505050a2600554610100900460ff1615611d0957600080fd5b6005805461ff00191661010017905560095460ff16611d2757600080fd5b6000611d316112e0565b90506000611d3f8583613baa565b905080611d4b57600080fd5b60005b600a54811015611e49576000600a8281548110611d6757fe5b60009182526020808320909101546001600160a01b0316808352600b909152604082206003015490925090611d9c8583613c36565b905080611da857600080fd5b878785818110611db457fe5b90506020020135811115611dc757600080fd5b6001600160a01b0383166000908152600b6020526040902060030154611ded9082613d5a565b6001600160a01b0384166000818152600b60209081526040918290206003019390935580518481529051919233926000805160206141be8339815191529281900390910190a3611e3e833383613ee0565b505050600101611d4e565b50611e5385613f39565b6118293386613d86565b600080611e6a8786613baa565b90506000611e788786613d5a565b90506000611e868289613baa565b90506000611e9c670de0b6b3a764000085613baa565b90506000611eaa8383613ccd565b90506000611eb8828e613c36565b90506000611ec6828f613c10565b90506000611ee5611edf670de0b6b3a76400008a613c10565b8b613c36565b9050611efd82610dbc670de0b6b3a764000084613c10565b9f9e505050505050505050505050505050565b6000336001600160a01b03166000356001600160e01b0319166001600160e01b03191660003660405180806020018281038252848482818152602001925080828437600083820152604051601f909101601f19169092018290039550909350505050a2600554610100900460ff1615611f8857600080fd5b6005805461ff00191661010017905560095460ff16611fa657600080fd5b6001600160a01b0384166000908152600b602052604090205460ff16611fcb57600080fd5b6001600160a01b0384166000908152600b6020526040902060030154611ffd906002670de0b6b3a76400005b04613c36565b83111561200957600080fd5b6000600b6000866001600160a01b03166001600160a01b031681526020019081526020016000209050600061205382600301548360020154600254600d5489600754600854611306565b90935090508383101561206557600080fd5b612076610fb6836003015487613d5a565b60038301556040805186815290516001600160a01b0388169133916000805160206141be8339815191529181900360200190a36001600160a01b0386166000908152600c60205260409020546120cc9082613d5a565b6001600160a01b0387166000908152600c60205260409020556120ee83613f39565b6120f83384613d86565b612103863387613ee0565b50506005805461ff00191690559392505050565b3360009081526001602090815260408083206001600160a01b03861684529091528120548083111561216c573360009081526001602090815260408083206001600160a01b038816845290915281205561219b565b6121768184613c10565b3360009081526001602090815260408083206001600160a01b03891684529091529020555b3360008181526001602090815260408083206001600160a01b03891680855290835292819020548151908152905192939260008051602061421e833981519152929181900390910190a35060019392505050565b6000336001600160a01b03166000356001600160e01b0319166001600160e01b03191660003660405180806020018281038252848482818152602001925080828437600083820152604051601f909101601f19169092018290039550909350505050a2600554610100900460ff161561226757600080fd5b6005805461ff00191661010017905560095460ff1661228557600080fd5b6001600160a01b0384166000908152600b602052604090205460ff166122aa57600080fd5b6001600160a01b0384166000908152600b6020526040902060038101546002808301549054600d546007546122e494939291908990611e5d565b9150816122f057600080fd5b828211156122fd57600080fd5b6001600160a01b0385166000908152600b602052604090206003015461232d906002670de0b6b3a7640000611ff7565b82111561233957600080fd5b600061235682600301548360020154600254600d54896000611e5d565b905060006123678483600854613c82565b905061237a610fb6846003015486613d5a565b60038401556040805185815290516001600160a01b0389169133916000805160206141be8339815191529181900360200190a36001600160a01b0387166000908152600c60205260409020546123d09082613d5a565b6001600160a01b0388166000908152600c60205260409020556123f286613f39565b6123fc3387613d86565b61107e873386613ee0565b600c6020526000908152604090205481565b6001600160a01b031660009081526020819052604090205490565b620f4240670de0b6b3a76400006112f6565b60408051602080825236908201819052600092839233926001600160e01b03198535169285929081908101848480828437600083820152604051601f909101601f19169092018290039550909350505050a2600554610100900460ff16156124ad57600080fd5b6005805461ff0019166101001790556001600160a01b0387166000908152600b602052604090205460ff166124e157600080fd5b6001600160a01b0385166000908152600b602052604090205460ff1661250657600080fd5b600654600160a01b900460ff1661251c57600080fd5b6001600160a01b038088166000908152600b60205260408082209288168252902060038082015461255591670de0b6b3a7640000610f2a565b86111561256157600080fd5b60006125828360030154846002015484600301548560020154600754612e05565b90508581111561259157600080fd5b6125b183600301548460020154846003015485600201548b600754613b17565b9450888511156125c057600080fd5b60006125e184600301548560020154856003015486600201548c6000613b17565b905060006125f28783600854613c82565b9050612605610fb6866003015489613d5a565b856003018190555061261b84600301548a613c10565b60038086018290558601546002808801549087015460075461263e949190612e05565b95508286101561264d57600080fd5b8786111561265a57600080fd5b612664878a613baa565b83111561267057600080fd5b896001600160a01b03168c6001600160a01b0316336001600160a01b03167f908fb5ee8f16c6bc9bc3690973819f32a4d4b10188134543c88706e0e1d433788a8d604051808381526020018281526020019250505060405180910390a46001600160a01b038c166000908152600c60205260409020546126f09082613d5a565b6001600160a01b038d166000908152600c60205260409020556127148c3389613ee0565b61271f8a338b613d90565b50505050506005805461ff001916905590969095509350505050565b60408051602080825236908201819052600092839233926001600160e01b03198535169285929081908101848480828437600083820152604051601f909101601f19169092018290039550909350505050a2600554610100900460ff16156127a257600080fd5b6005805461ff0019166101001790556001600160a01b0387166000908152600b602052604090205460ff166127d657600080fd5b6001600160a01b0385166000908152600b602052604090205460ff166127fb57600080fd5b600654600160a01b900460ff1661281157600080fd5b6001600160a01b038088166000908152600b602052604080822092881682529020600382015461284b906002670de0b6b3a7640000611ff7565b88111561285757600080fd5b60006128788360030154846002015484600301548560020154600754612e05565b90508581111561288757600080fd5b6128a783600301548460020154846003015485600201548d6007546132bd565b9450868510156128b657600080fd5b60006128d784600301548560020154856003015486600201548e60006132bd565b905060006128e88288600854613c82565b90506128f885600301548c613d5a565b8560030181905550612911610fb6856003015489613c10565b600380860182905586015460028088015490870154600754612934949190612e05565b95508286101561294357600080fd5b8786111561295057600080fd5b61295a8b88613baa565b83111561296657600080fd5b896001600160a01b03168c6001600160a01b0316336001600160a01b03167f908fb5ee8f16c6bc9bc3690973819f32a4d4b10188134543c88706e0e1d433788e8b604051808381526020018281526020019250505060405180910390a46001600160a01b038a166000908152600c60205260409020546129e69082613d5a565b6001600160a01b038b166000908152600c6020526040902055612a0a8c338d613ee0565b61271f8a3389613d90565b64e8d4a51000670de0b6b3a76400006112f6565b600080612a368786613baa565b90506000612a5185611348670de0b6b3a76400006000613c10565b90506000612a5f8883613c10565b90506000612a6d828a613baa565b90506000612a8c82612a87670de0b6b3a764000088613baa565b613ccd565b90506000612a9a828e613c36565b90506000612aa88e83613c10565b90506000612ac1611edf670de0b6b3a76400008a613c10565b9050611efd82611348670de0b6b3a764000084613c10565b336001600160a01b03166000356001600160e01b0319166001600160e01b03191660003660405180806020018281038252848482818152602001925080828437600083820152604051601f909101601f19169092018290039550909350505050a2600554610100900460ff1615612b4f57600080fd5b6005805461ff0019166101001790556001600160a01b0381166000908152600b602052604090205460ff16612b8357600080fd5b604080516370a0823160e01b815230600482015290516001600160a01b038316916370a08231916024808301926020929190829003018186803b158015612bc957600080fd5b505afa158015612bdd573d6000803e3d6000fd5b505050506040513d6020811015612bf357600080fd5b50516001600160a01b039091166000908152600b60205260409020600301556005805461ff0019169055565b60095460ff1690565b336001600160a01b03166000356001600160e01b0319166001600160e01b03191660003660405180806020018281038252848482818152602001925080828437600083820152604051601f909101601f19169092018290039550909350505050a2600554610100900460ff1615612c9e57600080fd5b6005805461ff001916610100179055600654336001600160a01b0390911614612cc657600080fd5b600680546001600160a01b0319166001600160a01b03929092169190911790556005805461ff0019169055565b600554600090610100900460ff1615612d0b57600080fd5b50600d5490565b68056bc75e2d6310000081565b6005670de0b6b3a76400006112f6565b600554600090610100900460ff1615612d4757600080fd5b6001600160a01b0382166000908152600b602052604090205460ff16612d6c57600080fd5b506001600160a01b03166000908152600b602052604090206002015490565b60048054604080516020601f600260001961010060018816150201909516949094049384018190048102820181019092528281526060939092909183018282801561111f5780601f106110f45761010080835404028352916020019161111f565b6704a03ce68d21555681565b6542524f4e5a4560d01b90565b600080612e128787613baa565b90506000612e208686613baa565b90506000612e2e8383613baa565b90506000612e50670de0b6b3a7640000610dbc670de0b6b3a764000089613c10565b9050612e5c8282613c36565b9a9950505050505050505050565b6000612e77338484613e21565b50600192915050565b336001600160a01b03166000356001600160e01b0319166001600160e01b03191660003660405180806020018281038252848482818152602001925080828437600083820152604051601f909101601f19169092018290039550909350505050a2600554610100900460ff1615612ef657600080fd5b6005805461010061ff001990911617908190556201000090046001600160a01b03163314612f2357600080fd5b60005b600a54811015612fb7576000600a8281548110612f3f57fe5b60009182526020808320909101546001600160a01b03908116808452600c835260408085208054959055805185815290519195508593928816927f261074971f6b45f02124a88c43d5c95e174626f867c87684fb60dbbe35ec2cd292918290030190a3612fad828583613d90565b5050600101612f26565b50506005805461ff0019169055565b336001600160a01b03166000356001600160e01b0319166001600160e01b03191660003660405180806020018281038252848482818152602001925080828437600083820152604051601f909101601f19169092018290039550909350505050a2600554610100900460ff161561303c57600080fd5b6005805461ff00191661010017905560095460ff1661305a57600080fd5b60006130646112e0565b90506000613073856000613c36565b905060006130818683613c10565b9050600061308f8285613baa565b90508061309b57600080fd5b6130a53388613d6c565b6005546130c1906201000090046001600160a01b031684613d86565b6130ca82613d7a565b60005b600a548110156131c8576000600a82815481106130e657fe5b60009182526020808320909101546001600160a01b0316808352600b90915260408220600301549092509061311b8583613c36565b90508061312757600080fd5b89898581811061313357fe5b9050602002013581101561314657600080fd5b6001600160a01b0383166000908152600b602052604090206003015461316c9082613c10565b6001600160a01b0384166000818152600b60209081526040918290206003019390935580518481529051919233926000805160206141fe8339815191529281900390910190a36131bd833383613d90565b5050506001016130cd565b50506005805461ff0019169055505050505050565b600881565b336001600160a01b03166000356001600160e01b0319166001600160e01b03191660003660405180806020018281038252848482818152602001925080828437600083820152604051601f909101601f19169092018290039550909350505050a2600554610100900460ff161561325857600080fd5b6005805461ff00191661010017905560095460ff161561327757600080fd5b6006546001600160a01b0316331461328e57600080fd5b670de0b6b3a76400008111156132a357600080fd5b6008556005805461ff0019169055565b600281565b600181565b6000806132ca8786613baa565b905060006132e0670de0b6b3a764000085613c10565b90506132ec8582613c36565b905060006132fe8a610dbc8c85613d5a565b9050600061330c8285613ccd565b90506000613322670de0b6b3a764000083613c10565b905061332e8a82613c36565b9c9b505050505050505050505050565b600a670de0b6b3a76400006112f6565b671bc16d674ec7ffff81565b600554606090610100900460ff161561337257600080fd5b60095460ff1661338157600080fd5b600a80548060200260200160405190810160405280929190818152602001828054801561111f57602002820191906000526020600020905b81546001600160a01b031681526001909101906020018083116133b9575050505050905090565b600081565b600554606090610100900460ff161561338157600080fd5b600a5490565b336001600160a01b03166000356001600160e01b0319166001600160e01b03191660003660405180806020018281038252848482818152602001925080828437600083820152604051601f909101601f19169092018290039550909350505050a2600554610100900460ff161561347957600080fd5b6005805461ff001916610100179055600654336001600160a01b03909116146134a157600080fd5b6001600160a01b0381166000908152600b602052604090205460ff166134c657600080fd5b60095460ff16156134d657600080fd5b6001600160a01b0381166000908152600b6020526040812060030154906134fd8282613c36565b600d546001600160a01b0385166000908152600b602052604090206002015491925061352891613c10565b600d556001600160a01b0383166000908152600b6020526040902060010154600a8054600019810191908290811061355c57fe5b600091825260209091200154600a80546001600160a01b03909216918490811061358257fe5b9060005260206000200160006101000a8154816001600160a01b0302191690836001600160a01b0316021790555081600b6000600a85815481106135c257fe5b60009182526020808320909101546001600160a01b03168352820192909252604001902060010155600a8054806135f557fe5b60008281526020808220600019908401810180546001600160a01b031916905590920190925560408051608081018252838152808301848152818301858152606083018681526001600160a01b038c168752600b909552929094209051815460ff1916901515178155925160018401555160028301555160039091015561368185336118038787613c10565b6005546118299086906201000090046001600160a01b031685613d90565b600554600090610100900460ff16156136b757600080fd5b5060075490565b3360009081526001602090815260408083206001600160a01b03861684529091528120546136ec9083613d5a565b3360008181526001602090815260408083206001600160a01b03891680855290835292819020859055805194855251919360008051602061421e833981519152929081900390910190a350600192915050565b6001600160a01b03918216600090815260016020908152604080832093909416825291909152205490565b336001600160a01b03166000356001600160e01b0319166001600160e01b03191660003660405180806020018281038252848482818152602001925080828437600083820152604051601f909101601f19169092018290039550909350505050a26006546001600160a01b031633146137e257600080fd5b6001600160a01b0383166000908152600b602052604090205460ff161561380857600080fd5b60095460ff161561381857600080fd5b600a5460081161382757600080fd5b604080516080810182526001808252600a805460208085019182526000858701818152606087018281526001600160a01b038c16808452600b9094529782209651875460ff1916901515178755925186860155915160028601559451600390940193909355805491820181559091527fc65a7bb8d6351c1cf70c95a316cc6a92839c986682d98bc35f958f4883f9d2a80180546001600160a01b03191690911790556138d48383836115ff565b505050565b336001600160a01b03166000356001600160e01b0319166001600160e01b03191660003660405180806020018281038252848482818152602001925080828437600083820152604051601f909101601f19169092018290039550909350505050a2600554610100900460ff161561394f57600080fd5b6005805461ff001916610100179055600654336001600160a01b039091161461397757600080fd5b6001600160a01b0382166000908152600b602052604090205460ff161561399d57600080fd5b604080516370a0823160e01b815230600482015290516000916001600160a01b038516916370a0823191602480820192602092909190829003018186803b1580156139e757600080fd5b505afa1580156139fb573d6000803e3d6000fd5b505050506040513d6020811015613a1157600080fd5b5051905080821115613a2257600080fd5b613a2d833384613d90565b50506005805461ff001916905550565b6002670de0b6b3a76400006112f6565b600554600090610100900460ff1615613a6557600080fd5b6001600160a01b0382166000908152600b602052604090205460ff16613a8a57600080fd5b6001600160a01b0382166000908152600b6020526040902060020154600d54613ab4908290613baa565b9392505050565b600554600090610100900460ff1615613ad357600080fd5b6001600160a01b0382166000908152600b602052604090205460ff16613af857600080fd5b506001600160a01b03166000908152600b602052604090206003015490565b600080613b248588613baa565b90506000613b328786613c10565b90506000613b408883613baa565b90506000613b4e8285613ccd565b9050613b6281670de0b6b3a7640000613c10565b9050613b76670de0b6b3a764000087613c10565b9450613b8b613b858c83613c36565b86613baa565b9b9a5050505050505050505050565b600654600160a01b900460ff1690565b600081613bb657600080fd5b670de0b6b3a76400008302831580613bde5750670de0b6b3a7640000848281613bdb57fe5b04145b613be757600080fd5b60028304810181811015613bfa57600080fd5b6000848281613c0557fe5b049695505050505050565b6000806000613c1f8585613f42565b915091508015613c2e57600080fd5b509392505050565b6000828202831580613c50575082848281613c4d57fe5b04145b613c5957600080fd5b6706f05b59d3b20000810181811015613c7157600080fd5b6000670de0b6b3a764000082613c05565b600082841015613c9157600080fd5b670de0b6b3a7640000821115613ca657600080fd5b6000613cb28585613c10565b9050613cbe8184613c36565b915081811015613c2e57600080fd5b60006001831015613cdd57600080fd5b671bc16d674ec7ffff831115613cf257600080fd5b6000613cfd83613f67565b90506000613d0b8483613c10565b90506000613d2186613d1c85613f82565b613f90565b905081613d32579250611178915050565b6000613d4387846305f5e100613fe7565b9050613d4f8282613c36565b979650505050505050565b600082820183811015613ab457600080fd5b613d7682826140c5565b5050565b613d83816140d0565b50565b613d76828261414f565b6040805163a9059cbb60e01b81526001600160a01b03848116600483015260248201849052915160009286169163a9059cbb91604480830192602092919082900301818787803b158015613de357600080fd5b505af1158015613df7573d6000803e3d6000fd5b505050506040513d6020811015613e0d57600080fd5b5051905080613e1b57600080fd5b50505050565b6001600160a01b038316600090815260208190526040902054811115613e4657600080fd5b6001600160a01b038316600090815260208190526040902054613e699082613c10565b6001600160a01b038085166000908152602081905260408082209390935590841681522054613e989082613d5a565b6001600160a01b038084166000818152602081815260409182902094909455805185815290519193928716926000805160206141de83398151915292918290030190a3505050565b604080516323b872dd60e01b81526001600160a01b0384811660048301523060248301526044820184905291516000928616916323b872dd91606480830192602092919082900301818787803b158015613de357600080fd5b613d838161415a565b600080828410613f585750508082036000613f60565b505081810360015b9250929050565b6000670de0b6b3a7640000613f7b83613f82565b0292915050565b670de0b6b3a7640000900490565b60008060028306613fa957670de0b6b3a7640000613fab565b835b90506002830492505b8215613ab457613fc48485613c36565b93506002830615613fdc57613fd98185613c36565b90505b600283049250613fb4565b6000828180613ffe87670de0b6b3a7640000613f42565b9092509050670de0b6b3a764000080600060015b8884106140b6576000670de0b6b3a7640000820290506000806140468a61404185670de0b6b3a7640000613c10565b613f42565b9150915061405887611348848c613c36565b96506140648784613baa565b965086614073575050506140b6565b871561407d579315935b8015614087579315935b841561409e576140978688613c10565b95506140ab565b6140a88688613d5a565b95505b505050600101614012565b50909998505050505050505050565b613d76823083613e21565b306000908152602081905260409020548111156140ec57600080fd5b306000908152602081905260409020546141069082613c10565b306000908152602081905260409020556002546141239082613c10565b60025560408051828152905160009130916000805160206141de8339815191529181900360200190a350565b613d76308383613e21565b306000908152602081905260409020546141749082613d5a565b306000908152602081905260409020556002546141919082613d5a565b60025560408051828152905130916000916000805160206141de8339815191529181900360200190a35056fe63982df10efd8dfaaaa0fcc7f50b2d93b7cba26ccc48adee2873220d485dc39addf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3efe74c91552b64c2e2e7bd255639e004e693bd3e1d01cc33e65610b86afcc1ffed8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925a265627a7a72315820993ab7d9193add493b90f3fbc114d124f2515ee3286bb646c67d794789a25cb064736f6c634300050c0032

Deployed Bytecode Sourcemap

714:25084:4:-;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;714:25084:4;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;13426:1305:2;;;;;;13:3:-1;8;5:12;2:2;;;30:1;27;20:12;2:2;-1:-1;13426:1305:2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;22919:1445:4;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;;;;;;22919:1445:4;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;2803:81:5;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8:100:-1;33:3;30:1;27:10;8:100;;;90:11;;;84:18;71:11;;;64:39;52:2;45:10;8:100;;;12:14;2803:81:5;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;3389:180;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;;;;;;3389:180:5;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;1207:50:1;;;:::i;10222:447:4:-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;;;;;;10222:447:4;;;;;;;;;;:::i;9769:::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;;;;;;9769:447:4;;;;;;;;;;:::i;3297:86:5:-;;;:::i;1499:54:1:-;;;:::i;1100:45::-;;;:::i;6465:1342:2:-;;;;;;13:3:-1;8;5:12;2:2;;;30:1;27;20:12;2:2;-1:-1;6465:1342:2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;4359:458:5:-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;;;;;;4359:458:5;;;;;;;;;;;;;;;;;:::i;3011:118:4:-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;3011:118:4;-1:-1:-1;;;;;3011:118:4;;:::i;4651:131::-;;;:::i;:::-;;;;-1:-1:-1;;;;;4651:131:4;;;;;;;;;;;;;;2981:80:5;;;:::i;:::-;;;;;;;;;;;;;;;;;;;4788:269:4;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;4788:269:4;;:::i;:::-;;6721:1465;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;;;;;;6721:1465:4;;;;;;;;;;;;;:::i;21220:1693::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;;;;;;21220:1693:4;;;;;;;;;;;;;:::i;5507:200::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;5507:200:4;;;;:::i;5713:358::-;;;:::i;4511:134::-;;;:::i;10675:850::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;10675:850:4;;;;;;;;;;;;;;-1:-1:-1;;;5:28;;2:2;;;46:1;43;36:12;2:2;10675:850:4;;35:9:-1;28:4;12:14;8:25;5:40;2:2;;;58:1;55;48:12;2:2;10675:850:4;;;;;;101:9:-1;95:2;81:12;77:21;67:8;63:36;60:51;-1:-1;;;25:12;22:29;11:108;8:2;;;132:1;129;122:12;8:2;-1:-1;10675:850:4;;-1:-1:-1;10675:850:4;-1:-1:-1;10675:850:4;:::i;8813:1167:2:-;;;;;;13:3:-1;8;5:12;2:2;;;30:1;27;20:12;2:2;-1:-1;8813:1167:2;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;18328:1285:4:-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;;;;;;18328:1285:4;;;;;;;;;;;;;:::i;3829:388:5:-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;;;;;;3829:388:5;;;;;;;;:::i;19619:1595:4:-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;;;;;;19619:1595:4;;;;;;;;;;;;;:::i;2470:43::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;2470:43:4;-1:-1:-1;;;;;2470:43:4;;:::i;3191:100:5:-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;3191:100:5;-1:-1:-1;;;;;3191:100:5;;:::i;876:53:1:-;;;:::i;15432:2889:4:-;;;;;;13:3:-1;8;5:12;2:2;;;30:1;27;20:12;2:2;-1:-1;;;;;;15432:2889:4;;;;;;;;;;;;;;;;;;;;;;;;;:::i;12556:2870::-;;;;;;13:3:-1;8;5:12;2:2;;;30:1;27;20:12;2:2;-1:-1;;;;;;12556:2870:4;;;;;;;;;;;;;;;;;;;;;;;;;:::i;1263:54:1:-;;;:::i;11086:1234:2:-;;;;;;13:3:-1;8;5:12;2:2;;;30:1;27;20:12;2:2;-1:-1;11086:1234:2;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;9225:201:4:-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;9225:201:4;-1:-1:-1;;;;;9225:201:4;;:::i;2899:106::-;;;:::i;5328:173::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;5328:173:4;-1:-1:-1;;;;;5328:173:4;;:::i;3783:142::-;;;:::i;1324:51:1:-;;;:::i;1039:54::-;;;:::i;3576:201:4:-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;3576:201:4;-1:-1:-1;;;;;3576:201:4;;:::i;2890:85:5:-;;;:::i;1615:59:1:-;;;:::i;795:117:0:-;;;:::i;1636:494:2:-;;;;;;13:3:-1;8;5:12;2:2;;;30:1;27;20:12;2:2;-1:-1;1636:494:2;;;;;;;;;;;;;;;;;;;;;;:::i;4223:130:5:-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;;;;;;4223:130:5;;;;;;;;:::i;24370:475:4:-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;24370:475:4;-1:-1:-1;;;;;24370:475:4;;:::i;11531:1018::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;11531:1018:4;;;;;;;;;;;;;;-1:-1:-1;;;5:28;;2:2;;;46:1;43;36:12;2:2;11531:1018:4;;35:9:-1;28:4;12:14;8:25;5:40;2:2;;;58:1;55;48:12;2:2;11531:1018:4;;;;;;101:9:-1;95:2;81:12;77:21;67:8;63:36;60:51;-1:-1;;;25:12;22:29;11:108;8:2;;;132:1;129;122:12;8:2;-1:-1;11531:1018:4;;-1:-1:-1;11531:1018:4;-1:-1:-1;11531:1018:4;:::i;827:42:1:-;;;:::i;5064:258:4:-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;5064:258:4;;:::i;779:42:1:-;;;:::i;1382:46::-;;;:::i;3136:664:2:-;;;;;;13:3:-1;8;5:12;2:2;;;30:1;27;20:12;2:2;-1:-1;3136:664:2;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;935:50:1:-;;;:::i;1434:59::-;;;:::i;3397:173:4:-;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8:100:-1;33:3;30:1;27:10;8:100;;;90:11;;;84:18;71:11;;;64:39;52:2;45:10;8:100;;;12:14;3397:173:4;;;;;;;;;;;;;;;;;991:42:1;;;:::i;3253:138:4:-;;;:::i;3135:112::-;;;:::i;8192:951::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;8192:951:4;-1:-1:-1;;;;;8192:951:4;;:::i;4383:122::-;;;:::i;3575:248:5:-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;;;;;;3575:248:5;;;;;;;;:::i;3067:118::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;;;;;;3067:118:5;;;;;;;;;;:::i;6078:637:4:-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;;;;;;6078:637:4;;;;;;;;;;;;;:::i;9432:331::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;;;;;;9432:331:4;;;;;;;;:::i;1560:49:1:-;;;:::i;3931:249:4:-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;3931:249:4;-1:-1:-1;;;;;3931:249:4;;:::i;4186:191::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;4186:191:4;-1:-1:-1;;;;;4186:191:4;;:::i;4806:653:2:-;;;;;;13:3:-1;8;5:12;2:2;;;30:1;27;20:12;2:2;-1:-1;4806:653:2;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;2785:108:4:-;;;:::i;13426:1305:2:-;13692:17;13711:13;13793:21;13817:33;13822:14;13838:11;13817:4;:33::i;:::-;13793:57;;13860:8;13871:43;13876:28;766:6:1;13887:16:2;13876:4;:28::i;:::-;13906:7;13871:4;:43::i;:::-;13860:54;;13924:32;13959:37;13964:14;13980:15;766:6:1;13991:3:2;13980:4;:15::i;:::-;13959:4;:37::i;:::-;13924:72;;14017;14030:27;14059:14;14075:13;14017:12;:72::i;:::-;14006:83;;14100:23;14126:50;14131:15;14148:27;14126:4;:50::i;:::-;14100:76;;14186:18;14207:41;14212:18;14232:15;14207:4;:41::i;:::-;14186:62;;14325:14;14342:37;14347:13;14362:16;14342:4;:37::i;:::-;14325:54;;14389:18;14410:27;14415:9;14426:10;14410:4;:27::i;:::-;14389:48;;14447:29;14479:31;14484:10;14496:13;14479:4;:31::i;:::-;14447:63;;14631:52;14636:24;14662:20;766:6:1;1032:1;14662:4:2;:20::i;14631:52::-;14616:67;-1:-1:-1;;;;;;;;;13426:1305:2;;;;;;;;;;:::o;22919:1445:4:-;23077:17;1728:10;-1:-1:-1;;;;;1710:39:4;1719:7;;-1:-1:-1;;;;;;1719:7:4;-1:-1:-1;;;;;1710:39:4;;1740:8;;1710:39;;;;;;;;;;;;;;;;;;;;;30:3:-1;22:6;14;1:33;99:1;81:16;;;74:27;1710:39:4;;137:4:-1;117:14;;;-1:-1;;113:30;157:16;;;1710:39:4;;;;-1:-1:-1;1710:39:4;;-1:-1:-1;;;;1710:39:4;1810:6;;;;;;;1809:7;1801:16;;;;;;1827:6;:13;;-1:-1:-1;;1827:13:4;;;;;23118:10;;1827:13;23118:10;23110:19;;;;;;-1:-1:-1;;;;;23147:18:4;;;;;;:8;:18;;;;;:24;;;23139:33;;;;;;-1:-1:-1;;;;;23213:18:4;;;;;;:8;:18;;;;;:26;;;;;23208:47;;766:6:1;1657:8;;1669:5;1656:18;23208:4:4;:47::i;:::-;23190:14;:65;;23182:74;;;;;;23267:24;23294:8;:18;23303:8;-1:-1:-1;;;;;23294:18:4;-1:-1:-1;;;;;23294:18:4;;;;;;;;;;;;23267:45;;23323:13;23373:353;23427:9;:17;;;23474:9;:16;;;23520:12;;23562;;23604:14;23648:8;;23686:14;;23373:24;:353::i;:::-;23346:380;;-1:-1:-1;23346:380:4;-1:-1:-1;23745:17:4;23737:26;;;;;;23797:15;23781:12;:31;;23773:40;;;;;;23844:55;23849:39;23854:9;:17;;;23873:14;23849:4;:39::i;:::-;23890:8;23844:4;:55::i;:::-;23824:17;;;:75;23910:12;23925:28;23930:12;23910;23925:4;:28::i;:::-;23969:46;;;;;;;;23910:43;;-1:-1:-1;;;;;;23969:46:4;;;23978:10;;-1:-1:-1;;;;;;;;;;;23969:46:4;;;;;;;;;-1:-1:-1;;;;;24066:32:4;;;;;;:13;:32;;;;;;24061:48;;24100:8;24061:4;:48::i;:::-;-1:-1:-1;;;;;24026:32:4;;;;;;:13;:32;;;;;:83;24120:40;24135:10;24147:12;24120:14;:40::i;:::-;24170:43;24185:27;24190:12;24204:7;24185:4;:27::i;:::-;24170:14;:43::i;:::-;24238:8;;24223:33;;24238:8;;;-1:-1:-1;;;;;24238:8:4;24248:7;24223:14;:33::i;:::-;24266:53;24282:8;24292:10;24304:14;24266:15;:53::i;:::-;-1:-1:-1;;;1861:6:4;:14;;-1:-1:-1;;1861:14:4;;;22919:1445;;-1:-1:-1;;;22919:1445:4:o;2803:81:5:-;2872:5;2865:12;;;;;;;;-1:-1:-1;;2865:12:5;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2840:13;;2865:12;;2872:5;;2865:12;;2872:5;2865:12;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2803:81;:::o;3389:180::-;3474:10;3447:4;3463:22;;;:10;:22;;;;;;;;-1:-1:-1;;;;;3463:27:5;;;;;;;;;;;:33;;;3511:30;;;;;;;3447:4;;3463:27;;3474:10;;-1:-1:-1;;;;;;;;;;;3511:30:5;;;;;;;-1:-1:-1;3558:4:5;3389:180;;;;;:::o;1207:50:1:-;1248:9;1207:50;:::o;10222:447:4:-;1929:6;;10344:14;;1929:6;;;;;1928:7;1920:16;;;;;;-1:-1:-1;;;;;10382:17:4;;;;;;:8;:17;;;;;:23;;;10374:32;;;;;;-1:-1:-1;;;;;10424:18:4;;;;;;:8;:18;;;;;:24;;;10416:33;;;;;;-1:-1:-1;;;;;10485:17:4;;;10459:23;10485:17;;;:8;:17;;;;;;10539:18;;;;;;;10588:16;;;;;10606:15;;;;;10623:17;;;;10642:16;;;;10539:18;;10574:88;;10588:16;;10606:15;10642:16;10574:13;:88::i;:::-;10567:95;10222:447;-1:-1:-1;;;;;10222:447:4:o;9769:::-;1929:6;;9884:14;;1929:6;;;;;1928:7;1920:16;;;;;;-1:-1:-1;;;;;9922:17:4;;;;;;:8;:17;;;;;:23;;;9914:32;;;;;;-1:-1:-1;;;;;9964:18:4;;;;;;:8;:18;;;;;:24;;;9956:33;;;;;;-1:-1:-1;;;;;10025:17:4;;;9999:23;10025:17;;;:8;:17;;;;;;10079:18;;;;;;;10128:16;;;;;10146:15;;;;;10163:17;;;;10182:16;;;;10200:8;;10114:95;;10146:15;10163:17;10182:16;10114:13;:95::i;3297:86:5:-;3364:12;;3297:86;:::o;1499:54:1:-;1547:6;766;1540:13;;1499:54;:::o;1100:45::-;766:6;1100:45;:::o;6465:1342:2:-;6728:18;6748:13;7021:21;7045:32;7050:13;7065:11;7045:4;:32::i;:::-;7021:56;;7149:8;7160:43;7165:28;766:6:1;7176:16:2;7165:4;:28::i;7160:43::-;7149:54;;7213:26;7242:36;7247:13;7262:15;766:6:1;7273:3:2;7262:4;:15::i;:::-;7242:4;:36::i;:::-;7213:65;;7300;7313:13;7328:21;7351:13;7300:12;:65::i;:::-;7289:76;;7375:22;7400:43;7405:14;7421:21;7400:4;:43::i;:::-;7375:68;;7453:17;7473:39;7478:17;7497:14;7473:4;:39::i;:::-;7453:59;;7590:14;7607:36;7612:12;7626:16;7607:4;:36::i;:::-;7590:53;;7653:18;7674:27;7679:9;7690:10;7674:4;:27::i;:::-;7653:48;;7727:31;7732:13;7747:10;7727:4;:31::i;:::-;7711:47;-1:-1:-1;;;;;;;;6465:1342:2;;;;;;;;;;:::o;4359:458:5:-;4435:4;4459:10;-1:-1:-1;;;;;4459:17:5;;;;:55;;-1:-1:-1;;;;;;4487:15:5;;;;;;:10;:15;;;;;;;;4503:10;4487:27;;;;;;;;4480:34;;;4459:55;4451:64;;;;;;4525:20;4531:3;4536;4541;4525:5;:20::i;:::-;4559:10;-1:-1:-1;;;;;4559:17:5;;;;;;:63;;-1:-1:-1;;;;;;4580:15:5;;;;;;:10;:15;;;;;;;;4596:10;4580:27;;;;;;;;-1:-1:-1;;4580:42:5;;4559:63;4555:235;;;-1:-1:-1;;;;;4673:15:5;;;;;;:10;:15;;;;;;;;4689:10;4673:27;;;;;;;;4668:38;;4702:3;4668:4;:38::i;:::-;-1:-1:-1;;;;;4638:15:5;;;;;;;:10;:15;;;;;;;;4654:10;4638:27;;;;;;;;;;:68;;;4725:54;;;;;;;;;;4654:10;;-1:-1:-1;;;;;;;;;;;4725:54:5;;;;;;;;;4555:235;-1:-1:-1;4806:4:5;4359:458;;;;;:::o;3011:118:4:-;-1:-1:-1;;;;;3105:11:4;3078:4;3105:11;;;:8;:11;;;;;:17;;;;3011:118::o;4651:131::-;1929:6;;4734:7;;1929:6;;;;;1928:7;1920:16;;;;;;-1:-1:-1;4764:11:4;;-1:-1:-1;;;;;4764:11:4;4651:131;:::o;2981:80:5:-;3045:9;;;;2981:80;:::o;4788:269:4:-;1728:10;-1:-1:-1;;;;;1710:39:4;1719:7;;-1:-1:-1;;;;;;1719:7:4;-1:-1:-1;;;;;1710:39:4;;1740:8;;1710:39;;;;;;;;;;;;;;;;;;;;;30:3:-1;22:6;14;1:33;99:1;81:16;;;74:27;1710:39:4;;137:4:-1;117:14;;;-1:-1;;113:30;157:16;;;1710:39:4;;;;-1:-1:-1;1710:39:4;;-1:-1:-1;;;;1710:39:4;1810:6;;;;;;;1809:7;1801:16;;;;;;1827:6;:13;;-1:-1:-1;;1827:13:4;;;;;4893:10;;1827:13;4893:10;4892:11;4884:20;;;;;;4936:11;;-1:-1:-1;;;;;4936:11:4;4922:10;:25;4914:34;;;;;;917:12:1;4966:18:4;;;4958:27;;;;;;976:9:1;5003:18:4;;;4995:27;;;;;;5032:8;:18;1861:6;:14;;-1:-1:-1;;1861:14:4;;;4788:269::o;6721:1465::-;1728:10;-1:-1:-1;;;;;1710:39:4;1719:7;;-1:-1:-1;;;;;;1719:7:4;-1:-1:-1;;;;;1710:39:4;;1740:8;;1710:39;;;;;;;;;;;;;;;;;;;;;30:3:-1;22:6;14;1:33;99:1;81:16;;;74:27;1710:39:4;;137:4:-1;117:14;;;-1:-1;;113:30;157:16;;;1710:39:4;;;;-1:-1:-1;1710:39:4;;-1:-1:-1;;;;1710:39:4;1810:6;;;;;;;1809:7;1801:16;;;;;;1827:6;:13;;-1:-1:-1;;1827:13:4;;;;;6861:11;;6847:10;-1:-1:-1;;;;;6861:11:4;;;6847:25;6839:34;;;;;;-1:-1:-1;;;;;6891:15:4;;;;;;:8;:15;;;;;:21;;;6883:30;;;;;;6932:10;;;;6931:11;6923:20;;;;;;766:6:1;6962::4;:20;;6954:29;;;;;;1192:9:1;7001:20:4;;;6993:29;;;;;;1304:13:1;7040:22:4;;;7032:31;;;;;;-1:-1:-1;;;;;7136:15:4;;7119:14;7136:15;;;:8;:15;;;;;:22;;;7172:18;;;7168:275;;;7221:43;7226:12;;7240:23;7245:6;7253:9;7240:4;:23::i;:::-;7221:4;:43::i;:::-;7206:12;:58;;;1248:9:1;-1:-1:-1;7286:32:4;7278:41;;;;;;7168:275;;;7349:9;7340:6;:18;7336:107;;;7389:43;7394:12;;7408:23;7413:9;7424:6;7408:4;:23::i;:::-;7389:4;:43::i;:::-;7374:12;:58;7336:107;-1:-1:-1;;;;;7460:15:4;;;;;;:8;:15;;;;;:22;;;:31;;;7582:23;;;;7615:33;;;;7662:20;;;7658:522;;;7698:61;7714:5;7721:10;7733:25;7738:7;7747:10;7733:4;:25::i;:::-;7698:15;:61::i;:::-;7658:522;;;7790:10;7780:7;:20;7776:404;;;7893:26;7922:25;7927:10;7939:7;7922:4;:25::i;:::-;7893:54;;7961:17;7981:37;7986:21;1032:1:1;7981:4:4;:37::i;:::-;7961:57;;8032:77;8048:5;8055:10;8067:41;8072:21;8095:12;8067:4;:41::i;:::-;8032:15;:77::i;:::-;8146:8;;8123:46;;8139:5;;8146:8;;;-1:-1:-1;;;;;8146:8:4;8156:12;8123:15;:46::i;:::-;7776:404;;;-1:-1:-1;;1861:6:4;:14;;-1:-1:-1;;1861:14:4;;;-1:-1:-1;;;6721:1465:4:o;21220:1693::-;21370:19;1728:10;-1:-1:-1;;;;;1710:39:4;1719:7;;-1:-1:-1;;;;;;1719:7:4;-1:-1:-1;;;;;1710:39:4;;1740:8;;1710:39;;;;;;;;;;;;;;;;;;;;;30:3:-1;22:6;14;1:33;99:1;81:16;;;74:27;1710:39:4;;137:4:-1;117:14;;;-1:-1;;113:30;157:16;;;1710:39:4;;;;-1:-1:-1;1710:39:4;;-1:-1:-1;;;;1710:39:4;1810:6;;;;;;;1809:7;1801:16;;;;;;1827:6;:13;;-1:-1:-1;;1827:13:4;;;;;21413:10;;1827:13;21413:10;21405:19;;;;;;-1:-1:-1;;;;;21442:18:4;;;;;;:8;:18;;;;;:24;;;21434:33;;;;;;-1:-1:-1;;;;;21505:18:4;;21478:24;21505:18;;;:8;:18;;;;;21605:17;;;;21652:16;;;;;21698:12;;21740;;21824:8;;21551:307;;21605:17;21652:16;21698:12;21740;21782;;21551:24;:307::i;:::-;21534:324;;21895:12;21877:14;:30;;21869:39;;;;;;-1:-1:-1;;;;;21958:18:4;;;;;;:8;:18;;;;;:26;;;;;21953:47;;766:6:1;1657:8;;21953:47:4;21935:14;:65;;21927:74;;;;;;22012:26;22041:188;22079:9;:17;;;22110:9;:16;;;22140:12;;22166;;22192;22218:1;22041:24;:188::i;:::-;22012:217;;22239:13;22255:113;22281:21;22316:14;22344;;22255:12;:113::i;:::-;22239:129;;22399:55;22404:39;22409:9;:17;;;22428:14;22404:4;:39::i;22399:55::-;22379:17;;;:75;22465:12;22480:28;22485:12;22465;22480:4;:28::i;:::-;22524:46;;;;;;;;22465:43;;-1:-1:-1;;;;;;22524:46:4;;;22533:10;;-1:-1:-1;;;;;;;;;;;22524:46:4;;;;;;;;;-1:-1:-1;;;;;22621:32:4;;;;;;:13;:32;;;;;;22616:48;;22655:8;22616:4;:48::i;:::-;-1:-1:-1;;;;;22581:32:4;;;;;;:13;:32;;;;;:83;22675:40;22690:10;22702:12;22675:14;:40::i;:::-;22725:43;22740:27;22745:12;22759:7;22740:4;:27::i;22725:43::-;22793:8;;22778:33;;22793:8;;;-1:-1:-1;;;;;22793:8:4;22803:7;22778:14;:33::i;:::-;22821:53;22837:8;22847:10;22859:14;22821:15;:53::i;:::-;-1:-1:-1;;;;1861:6:4;:14;;-1:-1:-1;;1861:14:4;;;21220:1693;;-1:-1:-1;;;21220:1693:4:o;5507:200::-;1728:10;-1:-1:-1;;;;;1710:39:4;1719:7;;-1:-1:-1;;;;;;1719:7:4;-1:-1:-1;;;;;1710:39:4;;1740:8;;1710:39;;;;;;;;;;;;;;;;;;;;;30:3:-1;22:6;14;1:33;99:1;81:16;;;74:27;1710:39:4;;137:4:-1;117:14;;;-1:-1;;113:30;157:16;;;1710:39:4;;;;-1:-1:-1;1710:39:4;;-1:-1:-1;;;;1710:39:4;1810:6;;;;;;;1809:7;1801:16;;;;;;1827:6;:13;;-1:-1:-1;;1827:13:4;;;;;5614:10;;1827:13;5614:10;5613:11;5605:20;;;;;;5657:11;;-1:-1:-1;;;;;5657:11:4;5643:10;:25;5635:34;;;;;;5679:11;:21;;;;;-1:-1:-1;;;5679:21:4;-1:-1:-1;;;;5679:21:4;;;;;;;;;1861:6;:14;;-1:-1:-1;;1861:14:4;;;5507:200::o;5713:358::-;1728:10;-1:-1:-1;;;;;1710:39:4;1719:7;;-1:-1:-1;;;;;;1719:7:4;-1:-1:-1;;;;;1710:39:4;;1740:8;;1710:39;;;;;;;;;;;;;;;;;;;;;30:3:-1;22:6;14;1:33;99:1;81:16;;;74:27;1710:39:4;;137:4:-1;117:14;;;-1:-1;;113:30;157:16;;;1710:39:4;;;;-1:-1:-1;1710:39:4;;-1:-1:-1;;;;1710:39:4;1810:6;;;;;;;1809:7;1801:16;;;;;;1827:6;:13;;-1:-1:-1;;1827:13:4;;;;;5816:11;;5802:10;-1:-1:-1;;;;;5816:11:4;;;5802:25;5794:34;;;;;;5847:10;;;;5846:11;5838:20;;;;;;5876:7;:14;820:1:1;-1:-1:-1;5876:34:4;5868:43;;;;;;5922:10;:17;;-1:-1:-1;;5922:17:4;5935:4;5922:17;;;5949:11;:18;;-1:-1:-1;;;;5949:18:4;-1:-1:-1;;;5949:18:4;;;5978:32;1365:10:1;5978:14:4;:32::i;:::-;6020:44;6035:10;1365::1;6020:14:4;:44::i;:::-;1861:6;:14;;-1:-1:-1;;1861:14:4;;;5713:358::o;4511:134::-;1929:6;;4597:4;;1929:6;;;;;1928:7;1920:16;;;;;;-1:-1:-1;4624:14:4;;4511:134;:::o;10675:850::-;1728:10;-1:-1:-1;;;;;1710:39:4;1719:7;;-1:-1:-1;;;;;;1719:7:4;-1:-1:-1;;;;;1710:39:4;;1740:8;;1710:39;;;;;;;;;;;;;;;;;;;;;30:3:-1;22:6;14;1:33;99:1;81:16;;;74:27;1710:39:4;;137:4:-1;117:14;;;-1:-1;;113:30;157:16;;;1710:39:4;;;;-1:-1:-1;1710:39:4;;-1:-1:-1;;;;1710:39:4;1810:6;;;;;;;1809:7;1801:16;;;;;;1827:6;:13;;-1:-1:-1;;1827:13:4;;;;;10812:10;;1827:13;10812:10;10804:19;;;;;;10834:14;10851:13;:11;:13::i;:::-;10834:30;;10874:10;10887:30;10892:13;10907:9;10887:4;:30::i;:::-;10874:43;-1:-1:-1;10935:10:4;10927:19;;;;;;10962:6;10957:472;10978:7;:14;10974:18;;10957:472;;;11013:9;11025:7;11033:1;11025:10;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;11025:10:4;11060:11;;;:8;:11;;;;;;:19;;;11025:10;;-1:-1:-1;11060:19:4;11114:16;11119:5;11060:19;11114:4;:16::i;:::-;11093:37;-1:-1:-1;11152:18:4;11144:27;;;;;;11210:12;;11223:1;11210:15;;;;;;;;;;;;;11193:13;:32;;11185:41;;;;;;-1:-1:-1;;;;;11267:11:4;;;;;;:8;:11;;;;;:19;;;11262:40;;11288:13;11262:4;:40::i;:::-;-1:-1:-1;;;;;11240:11:4;;;;;;:8;:11;;;;;;;;;:19;;:62;;;;11321:38;;;;;;;11240:11;;11330:10;;-1:-1:-1;;;;;;;;;;;11321:38:4;;;;;;;;;11373:45;11389:1;11392:10;11404:13;11373:15;:45::i;:::-;-1:-1:-1;;;10994:3:4;;10957:472;;;;11438:29;11453:13;11438:14;:29::i;:::-;11477:41;11492:10;11504:13;11477:14;:41::i;8813:1167:2:-;9048:18;9082:21;9106:32;9111:13;9126:11;9106:4;:32::i;:::-;9082:56;;9148:18;9169:31;9174:10;9186:13;9169:4;:31::i;:::-;9148:52;;9210:14;9227:31;9232:13;9247:10;9227:4;:31::i;:::-;9210:48;;9333:8;9344:28;766:6:1;9355:16:2;9344:4;:28::i;:::-;9333:39;;9383:17;9403:20;9408:9;9419:3;9403:4;:20::i;:::-;9383:40;;9433:22;9458:34;9463:12;9477:14;9458:4;:34::i;:::-;9433:59;;9502:26;9531:39;9536:17;9555:14;9531:4;:39::i;:::-;9502:68;;9819:8;9830:43;9835:28;766:6:1;9846:16:2;9835:4;:28::i;:::-;9865:7;9830:4;:43::i;:::-;9819:54;;9899:44;9904:21;9927:15;766:6:1;9938:3:2;9927:4;:15::i;9899:44::-;9883:60;8813:1167;-1:-1:-1;;;;;;;;;;;;;;;8813:1167:2:o;18328:1285:4:-;18484:18;1728:10;-1:-1:-1;;;;;1710:39:4;1719:7;;-1:-1:-1;;;;;;1719:7:4;-1:-1:-1;;;;;1710:39:4;;1740:8;;1710:39;;;;;;;;;;;;;;;;;;;;;30:3:-1;22:6;14;1:33;99:1;81:16;;;74:27;1710:39:4;;137:4:-1;117:14;;;-1:-1;;113:30;157:16;;;1710:39:4;;;;-1:-1:-1;1710:39:4;;-1:-1:-1;;;;1710:39:4;1810:6;;;;;;;1809:7;1801:16;;;;;;1827:6;:13;;-1:-1:-1;;1827:13:4;;;;;18535:10;;1827:13;18535:10;18527:19;;;;;;-1:-1:-1;;;;;18564:17:4;;;;;;:8;:17;;;;;:23;;;18556:32;;;;;;-1:-1:-1;;;;;18628:17:4;;;;;;:8;:17;;;;;:25;;;18623:45;;1608:1:1;766:6;1601:8;;18623:4:4;:45::i;:::-;18606:13;:62;;18598:71;;;;;;18680:23;18706:8;:17;18715:7;-1:-1:-1;;;;;18706:17:4;-1:-1:-1;;;;;18706:17:4;;;;;;;;;;;;18680:43;;18734:13;18785:350;18839:8;:16;;;18885:8;:15;;;18930:12;;18972;;19014:13;19057:8;;19095:14;;18785:24;:350::i;:::-;18757:378;;-1:-1:-1;18757:378:4;-1:-1:-1;19154:33:4;;;;19146:42;;;;;;19218:53;19223:37;19228:8;:16;;;19246:13;19223:4;:37::i;19218:53::-;19199:16;;;:72;19287:44;;;;;;;;-1:-1:-1;;;;;19287:44:4;;;19296:10;;-1:-1:-1;;;;;;;;;;;19287:44:4;;;;;;;;-1:-1:-1;;;;;19381:31:4;;;;;;:13;:31;;;;;;19376:47;;19414:8;19376:4;:47::i;:::-;-1:-1:-1;;;;;19342:31:4;;;;;;:13;:31;;;;;:81;19434:29;19449:13;19434:14;:29::i;:::-;19473:41;19488:10;19500:13;19473:14;:41::i;:::-;19524:51;19540:7;19549:10;19561:13;19524:15;:51::i;:::-;-1:-1:-1;;1861:6:4;:14;;-1:-1:-1;;1861:14:4;;;18328:1285;;-1:-1:-1;;;18328:1285:4:o;3829:388:5:-;3939:10;3896:4;3928:22;;;:10;:22;;;;;;;;-1:-1:-1;;;;;3928:27:5;;;;;;;;;;3969:14;;;3965:156;;;4010:10;4029:1;3999:22;;;:10;:22;;;;;;;;-1:-1:-1;;;;;3999:27:5;;;;;;;;;:31;3965:156;;;4091:19;4096:8;4106:3;4091:4;:19::i;:::-;4072:10;4061:22;;;;:10;:22;;;;;;;;-1:-1:-1;;;;;4061:27:5;;;;;;;;;:49;3965:156;4144:10;4161:22;;;;:10;:22;;;;;;;;-1:-1:-1;;;;;4135:54:5;;4161:27;;;;;;;;;;;4135:54;;;;;;;;;4144:10;-1:-1:-1;;;;;;;;;;;4135:54:5;;;;;;;;;;-1:-1:-1;4206:4:5;;3829:388;-1:-1:-1;;;3829:388:5:o;19619:1595:4:-;19769:18;1728:10;-1:-1:-1;;;;;1710:39:4;1719:7;;-1:-1:-1;;;;;;1719:7:4;-1:-1:-1;;;;;1710:39:4;;1740:8;;1710:39;;;;;;;;;;;;;;;;;;;;;30:3:-1;22:6;14;1:33;99:1;81:16;;;74:27;1710:39:4;;137:4:-1;117:14;;;-1:-1;;113:30;157:16;;;1710:39:4;;;;-1:-1:-1;1710:39:4;;-1:-1:-1;;;;1710:39:4;1810:6;;;;;;;1809:7;1801:16;;;;;;1827:6;:13;;-1:-1:-1;;1827:13:4;;;;;19811:10;;1827:13;19811:10;19803:19;;;;;;-1:-1:-1;;;;;19840:17:4;;;;;;:8;:17;;;;;:23;;;19832:32;;;;;;-1:-1:-1;;;;;19901:17:4;;19875:23;19901:17;;;:8;:17;;;;;19999:16;;;;20045:15;;;;;20090:12;;20132;;20217:8;;19945:306;;19999:16;20045:15;20090:12;20132;20174:13;;19945:24;:306::i;:::-;19929:322;-1:-1:-1;20270:18:4;20262:27;;;;;;20324:11;20307:13;:28;;20299:37;;;;;;-1:-1:-1;;;;;20385:17:4;;;;;;:8;:17;;;;;:25;;;20380:45;;1608:1:1;766:6;1601:8;;20380:45:4;20363:13;:62;;20355:71;;;;;;20437:25;20465:187;20503:8;:16;;;20533:8;:15;;;20562:12;;20588;;20614:13;20641:1;20465:24;:187::i;:::-;20437:215;;20662:13;20678:111;20704:13;20731:20;20765:14;;20678:12;:111::i;:::-;20662:127;;20819:53;20824:37;20829:8;:16;;;20847:13;20824:4;:37::i;20819:53::-;20800:16;;;:72;20888:44;;;;;;;;-1:-1:-1;;;;;20888:44:4;;;20897:10;;-1:-1:-1;;;;;;;;;;;20888:44:4;;;;;;;;-1:-1:-1;;;;;20982:31:4;;;;;;:13;:31;;;;;;20977:47;;21015:8;20977:4;:47::i;:::-;-1:-1:-1;;;;;20943:31:4;;;;;;:13;:31;;;;;:81;21035:29;21050:13;21035:14;:29::i;:::-;21074:41;21089:10;21101:13;21074:14;:41::i;:::-;21125:51;21141:7;21150:10;21162:13;21125:15;:51::i;2470:43::-;;;;;;;;;;;;;:::o;3191:100:5:-;-1:-1:-1;;;;;3270:14:5;3247:4;3270:14;;;;;;;;;;;;3191:100::o;876:53:1:-;924:5;766:6;917:12;;15432:2889:4;1710:39;;;;;;;1740:8;1710:39;;;;;;15660:18;;;;1728:10;;-1:-1:-1;;;;;;1719:7:4;;;;15660:18;;1710:39;;;;;15660:18;1740:8;;15660:18;1710:39;1:33:-1;99:1;81:16;;;74:27;1710:39:4;;137:4:-1;117:14;;;-1:-1;;113:30;157:16;;;1710:39:4;;;;-1:-1:-1;1710:39:4;;-1:-1:-1;;;;1710:39:4;1810:6;;;;;;;1809:7;1801:16;;;;;;1827:6;:13;;-1:-1:-1;;1827:13:4;;;;;-1:-1:-1;;;;;15723:17:4;;1827:13;15723:17;;;:8;:17;;;;;:23;1827:13;15723:23;15715:32;;;;;;-1:-1:-1;;;;;15765:18:4;;;;;;:8;:18;;;;;:24;;;15757:33;;;;;;15808:11;;-1:-1:-1;;;15808:11:4;;;;15800:20;;;;;;-1:-1:-1;;;;;15857:26:4;;;15831:23;15857:26;;;:8;:26;;;;;;15920:27;;;;;;;15989:17;;;;;15984:38;;766:6:1;1657:8;;15984:38:4;15966:14;:56;;15958:65;;;;;;16034:20;16057:309;16108:8;:16;;;16162:8;:15;;;16215:9;:17;;;16270:9;:16;;;16324:8;;16057:13;:309::i;:::-;16034:332;;16403:8;16384:15;:27;;16376:36;;;;;;16439:306;16483:8;:16;;;16529:8;:15;;;16574:9;:17;;;16621:9;:16;;;16667:14;16711:8;;16439:14;:306::i;:::-;16423:322;;16780:11;16763:13;:28;;16755:37;;;;;;16803:25;16831:299;16875:8;:16;;;16921:8;:15;;;16966:9;:17;;;17013:9;:16;;;17059:14;17103:1;16831:14;:299::i;:::-;16803:327;;17140:13;17156:111;17182:13;17209:20;17243:14;;17156:12;:111::i;:::-;17140:127;;17357:53;17362:37;17367:8;:16;;;17385:13;17362:4;:37::i;17357:53::-;17338:8;:16;;:72;;;;17440:39;17445:9;:17;;;17464:14;17440:4;:39::i;:::-;17420:17;;;;:59;;;17554:16;;;17604:15;;;;;17704:16;;;;17754:8;;17507:285;;17420:59;17704:16;17507:13;:285::i;:::-;17490:302;;17828:15;17810:14;:33;;17802:42;;;;;;17880:8;17862:14;:26;;17854:35;;;;;;17926;17931:13;17946:14;17926:4;:35::i;:::-;17907:15;:54;;17899:63;;;;;;18008:8;-1:-1:-1;;;;;17978:70:4;17999:7;-1:-1:-1;;;;;17978:70:4;17987:10;-1:-1:-1;;;;;17978:70:4;;18018:13;18033:14;17978:70;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;18098:31:4;;;;;;:13;:31;;;;;;18093:47;;18131:8;18093:4;:47::i;:::-;-1:-1:-1;;;;;18059:31:4;;;;;;:13;:31;;;;;:81;18151:51;18081:7;18176:10;18188:13;18151:15;:51::i;:::-;18212:53;18228:8;18238:10;18250:14;18212:15;:53::i;:::-;-1:-1:-1;;;;;1861:6:4;:14;;-1:-1:-1;;1861:14:4;;;15432:2889;;;;-1:-1:-1;15432:2889:4;-1:-1:-1;;;;15432:2889:4:o;12556:2870::-;1710:39;;;;;;;1740:8;1710:39;;;;;;12782:19;;;;1728:10;;-1:-1:-1;;;;;;1719:7:4;;;;12782:19;;1710:39;;;;;12782:19;1740:8;;12782:19;1710:39;1:33:-1;99:1;81:16;;;74:27;1710:39:4;;137:4:-1;117:14;;;-1:-1;;113:30;157:16;;;1710:39:4;;;;-1:-1:-1;1710:39:4;;-1:-1:-1;;;;1710:39:4;1810:6;;;;;;;1809:7;1801:16;;;;;;1827:6;:13;;-1:-1:-1;;1827:13:4;;;;;-1:-1:-1;;;;;12847:17:4;;1827:13;12847:17;;;:8;:17;;;;;:23;1827:13;12847:23;12839:32;;;;;;-1:-1:-1;;;;;12889:18:4;;;;;;:8;:18;;;;;:24;;;12881:33;;;;;;12932:11;;-1:-1:-1;;;12932:11:4;;;;12924:20;;;;;;-1:-1:-1;;;;;12981:26:4;;;12955:23;12981:26;;;:8;:26;;;;;;13044:27;;;;;;;13112:16;;;;13107:36;;1608:1:1;766:6;1601:8;;13107:36:4;13090:13;:53;;13082:62;;;;;;13155:20;13178:309;13229:8;:16;;;13283:8;:15;;;13336:9;:17;;;13391:9;:16;;;13445:8;;13178:13;:309::i;:::-;13155:332;;13524:8;13505:15;:27;;13497:36;;;;;;13561:305;13605:8;:16;;;13651:8;:15;;;13696:9;:17;;;13743:9;:16;;;13789:13;13832:8;;13561:14;:305::i;:::-;13544:322;;13902:12;13884:14;:30;;13876:39;;;;;;13926:26;13955:298;13999:8;:16;;;14045:8;:15;;;14090:9;:17;;;14137:9;:16;;;14183:13;14226:1;13955:14;:298::i;:::-;13926:327;;14263:13;14279:113;14305:21;14340:14;14368;;14279:12;:113::i;:::-;14263:129;;14422:37;14427:8;:16;;;14445:13;14422:4;:37::i;:::-;14403:8;:16;;:56;;;;14521:55;14526:39;14531:9;:17;;;14550:14;14526:4;:39::i;14521:55::-;14501:17;;;;:75;;;14651:16;;;14701:15;;;;;14801:16;;;;14851:8;;14604:285;;14501:75;14801:16;14604:13;:285::i;:::-;14587:302;;14925:15;14907:14;:33;;14899:42;;;;;;14982:8;14964:14;:26;;14956:35;;;;;;15028;15033:13;15048:14;15028:4;:35::i;:::-;15009:15;:54;;15001:63;;;;;;15110:8;-1:-1:-1;;;;;15080:70:4;15101:7;-1:-1:-1;;;;;15080:70:4;15089:10;-1:-1:-1;;;;;15080:70:4;;15120:13;15135:14;15080:70;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;15201:32:4;;;;;;:13;:32;;;;;;15196:48;;15235:8;15196:4;:48::i;:::-;-1:-1:-1;;;;;15161:32:4;;;;;;:13;:32;;;;;:83;15255:51;15271:7;15280:10;15292:13;15255:15;:51::i;:::-;15316:53;15332:8;15342:10;15354:14;15316:15;:53::i;1263:54:1:-;1311:6;766;1304:13;;11086:1234:2;11322:19;11357:21;11381:33;11386:14;11402:11;11381:4;:33::i;:::-;11357:57;;11519:29;11551:40;11556:12;11570:20;766:6:1;1032:1;11570:4:2;:20::i;11551:40::-;11519:72;;11601:18;11622:42;11627:10;11639:24;11622:4;:42::i;:::-;11601:63;;11674:14;11691:31;11696:13;11711:10;11691:4;:31::i;:::-;11674:48;;11792:18;11813:45;11818:9;11829:28;766:6:1;11840:16:2;11829:4;:28::i;:::-;11813:4;:45::i;:::-;11792:66;;11868:23;11894:36;11899:13;11914:15;11894:4;:36::i;:::-;11868:62;;11941:32;11976:41;11981:15;11998:18;11976:4;:41::i;:::-;11941:76;;12150:8;12161:43;12166:28;766:6:1;12177:16:2;12166:4;:28::i;12161:43::-;12150:54;;12232:50;12237:27;12266:15;766:6:1;12277:3:2;12266:4;:15::i;9225:201:4:-;1728:10;-1:-1:-1;;;;;1710:39:4;1719:7;;-1:-1:-1;;;;;;1719:7:4;-1:-1:-1;;;;;1710:39:4;;1740:8;;1710:39;;;;;;;;;;;;;;;;;;;;;30:3:-1;22:6;14;1:33;99:1;81:16;;;74:27;1710:39:4;;137:4:-1;117:14;;;-1:-1;;113:30;157:16;;;1710:39:4;;;;-1:-1:-1;1710:39:4;;-1:-1:-1;;;;1710:39:4;1810:6;;;;;;;1809:7;1801:16;;;;;;1827:6;:13;;-1:-1:-1;;1827:13:4;;;;;-1:-1:-1;;;;;9323:15:4;;1827:13;9323:15;;;:8;:15;;;;;:21;1827:13;9323:21;9315:30;;;;;;9381:38;;;-1:-1:-1;;;9381:38:4;;9413:4;9381:38;;;;;;-1:-1:-1;;;;;9381:23:4;;;;;:38;;;;;;;;;;;;;;:23;:38;;;5:2:-1;;;;30:1;27;20:12;5:2;9381:38:4;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;9381:38:4;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;9381:38:4;-1:-1:-1;;;;;9355:15:4;;;;;;;:8;9381:38;9355:15;;;;:23;;:64;1861:6;:14;;-1:-1:-1;;1861:14:4;;;9225:201::o;2899:106::-;2988:10;;;;2899:106;:::o;5328:173::-;1728:10;-1:-1:-1;;;;;1710:39:4;1719:7;;-1:-1:-1;;;;;;1719:7:4;-1:-1:-1;;;;;1710:39:4;;1740:8;;1710:39;;;;;;;;;;;;;;;;;;;;;30:3:-1;22:6;14;1:33;99:1;81:16;;;74:27;1710:39:4;;137:4:-1;117:14;;;-1:-1;;113:30;157:16;;;1710:39:4;;;;-1:-1:-1;1710:39:4;;-1:-1:-1;;;;1710:39:4;1810:6;;;;;;;1809:7;1801:16;;;;;;1827:6;:13;;-1:-1:-1;;1827:13:4;;;;;5451:11;;5437:10;-1:-1:-1;;;;;5451:11:4;;;5437:25;5429:34;;;;;;5473:11;:21;;-1:-1:-1;;;;;;5473:21:4;-1:-1:-1;;;;;5473:21:4;;;;;;;;;;1861:6;:14;;-1:-1:-1;;1861:14:4;;;5328:173::o;3783:142::-;1929:6;;3879:4;;1929:6;;;;;1928:7;1920:16;;;;;;-1:-1:-1;3906:12:4;;3783:142;:::o;1324:51:1:-;1365:10;1324:51;:::o;1039:54::-;1092:1;766:6;1085:8;;3576:201:4;1929:6;;3680:4;;1929:6;;;;;1928:7;1920:16;;;;;;-1:-1:-1;;;;;3709:15:4;;;;;;:8;:15;;;;;:21;;;3701:30;;;;;;-1:-1:-1;;;;;;3748:15:4;;;;;:8;:15;;;;;:22;;;;3576:201::o;2890:85:5:-;2961:7;2954:14;;;;;;;;-1:-1:-1;;2954:14:5;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2929:13;;2954:14;;2961:7;;2954:14;;2961:7;2954:14;;;;;;;;;;;;;;;;;;;;;;;;1615:59:1;1656:18;1615:59;:::o;795:117:0:-;-1:-1:-1;;;795:117:0;:::o;1636:494:2:-;1840:14;1870:10;1883:35;1888:14;1904:13;1883:4;:35::i;:::-;1870:48;;1928:10;1941:37;1946:15;1963:14;1941:4;:37::i;:::-;1928:50;;1988:10;2001:18;2006:5;2013;2001:4;:18::i;:::-;1988:31;;2029:10;2042:31;766:6:1;2053:19:2;766:6:1;2064:7:2;2053:4;:19::i;2042:31::-;2029:44;;2104:18;2109:5;2116;2104:4;:18::i;:::-;2092:30;1636:494;-1:-1:-1;;;;;;;;;;1636:494:2:o;4223:130:5:-;4282:4;4298:27;4304:10;4316:3;4321;4298:5;:27::i;:::-;-1:-1:-1;4342:4:5;4223:130;;;;:::o;24370:475:4:-;1728:10;-1:-1:-1;;;;;1710:39:4;1719:7;;-1:-1:-1;;;;;;1719:7:4;-1:-1:-1;;;;;1710:39:4;;1740:8;;1710:39;;;;;;;;;;;;;;;;;;;;;30:3:-1;22:6;14;1:33;99:1;81:16;;;74:27;1710:39:4;;137:4:-1;117:14;;;-1:-1;;113:30;157:16;;;1710:39:4;;;;-1:-1:-1;1710:39:4;;-1:-1:-1;;;;1710:39:4;1810:6;;;;;;;1809:7;1801:16;;;;;;1827:6;:13;;;-1:-1:-1;;1827:13:4;;;;;;;;24506:8;;;-1:-1:-1;;;;;24506:8:4;24492:10;:22;24484:31;;;;;;24531:6;24526:313;24547:7;:14;24543:18;;24526:313;;;24582:9;24594:7;24602:1;24594:10;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;24594:10:4;;;24640:16;;;:13;:16;;;;;;;;24670:20;;;24709:54;;;;;;;24594:10;;-1:-1:-1;24594:10:4;;24709:54;;;;;;;;;;;;;24777:51;24793:1;24796:15;24813:14;24777:15;:51::i;:::-;-1:-1:-1;;24563:3:4;;24526:313;;;-1:-1:-1;;1861:6:4;:14;;-1:-1:-1;;1861:14:4;;;24370:475::o;11531:1018::-;1728:10;-1:-1:-1;;;;;1710:39:4;1719:7;;-1:-1:-1;;;;;;1719:7:4;-1:-1:-1;;;;;1710:39:4;;1740:8;;1710:39;;;;;;;;;;;;;;;;;;;;;30:3:-1;22:6;14;1:33;99:1;81:16;;;74:27;1710:39:4;;137:4:-1;117:14;;;-1:-1;;113:30;157:16;;;1710:39:4;;;;-1:-1:-1;1710:39:4;;-1:-1:-1;;;;1710:39:4;1810:6;;;;;;;1809:7;1801:16;;;;;;1827:6;:13;;-1:-1:-1;;1827:13:4;;;;;11668:10;;1827:13;11668:10;11660:19;;;;;;11690:14;11707:13;:11;:13::i;:::-;11690:30;;11730:12;11745:28;11750:12;1032:1:1;11745:4:4;:28::i;:::-;11730:43;;11783:20;11806:27;11811:12;11825:7;11806:4;:27::i;:::-;11783:50;;11843:10;11856:32;11861:15;11878:9;11856:4;:32::i;:::-;11843:45;-1:-1:-1;11906:10:4;11898:19;;;;;;11928:40;11943:10;11955:12;11928:14;:40::i;:::-;11993:8;;11978:33;;11993:8;;;-1:-1:-1;;;;;11993:8:4;12003:7;11978:14;:33::i;:::-;12021:31;12036:15;12021:14;:31::i;:::-;12068:6;12063:479;12084:7;:14;12080:18;;12063:479;;;12119:9;12131:7;12139:1;12131:10;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;12131:10:4;12166:11;;;:8;:11;;;;;;:19;;;12131:10;;-1:-1:-1;12166:19:4;12221:16;12226:5;12166:19;12221:4;:16::i;:::-;12199:38;-1:-1:-1;12259:19:4;12251:28;;;;;;12319:13;;12333:1;12319:16;;;;;;;;;;;;;12301:14;:34;;12293:43;;;;;;-1:-1:-1;;;;;12377:11:4;;;;;;:8;:11;;;;;:19;;;12372:41;;12398:14;12372:4;:41::i;:::-;-1:-1:-1;;;;;12350:11:4;;;;;;:8;:11;;;;;;;;;:19;;:63;;;;12432:39;;;;;;;12350:11;;12441:10;;-1:-1:-1;;;;;;;;;;;12432:39:4;;;;;;;;;12485:46;12501:1;12504:10;12516:14;12485:15;:46::i;:::-;-1:-1:-1;;;12100:3:4;;12063:479;;;-1:-1:-1;;1861:6:4;:14;;-1:-1:-1;;1861:14:4;;;-1:-1:-1;;;;;;11531:1018:4:o;827:42:1:-;868:1;827:42;:::o;5064:258:4:-;1728:10;-1:-1:-1;;;;;1710:39:4;1719:7;;-1:-1:-1;;;;;;1719:7:4;-1:-1:-1;;;;;1710:39:4;;1740:8;;1710:39;;;;;;;;;;;;;;;;;;;;;30:3:-1;22:6;14;1:33;99:1;81:16;;;74:27;1710:39:4;;137:4:-1;117:14;;;-1:-1;;113:30;157:16;;;1710:39:4;;;;-1:-1:-1;1710:39:4;;-1:-1:-1;;;;1710:39:4;1810:6;;;;;;;1809:7;1801:16;;;;;;1827:6;:13;;-1:-1:-1;;1827:13:4;;;;;5180:10;;1827:13;5180:10;5179:11;5171:20;;;;;;5223:11;;-1:-1:-1;;;;;5223:11:4;5209:10;:25;5201:34;;;;;;766:6:1;5253:13:4;:21;;5245:30;;;;;;5285:14;:30;1861:6;:14;;-1:-1:-1;;1861:14:4;;;5064:258::o;779:42:1:-;820:1;779:42;:::o;1382:46::-;1423:5;1382:46;:::o;3136:664:2:-;3369:19;3404:16;3423:35;3428:13;3443:14;3423:4;:35::i;:::-;3404:54;;3468:15;3486:19;766:6:1;3497:7:2;3486:4;:19::i;:::-;3468:37;;3528:31;3533:13;3548:10;3528:4;:31::i;:::-;3515:44;;3569:6;3578:54;3583:14;3599:32;3604:14;3620:10;3599:4;:32::i;3578:54::-;3569:63;;3642:8;3653:20;3658:1;3661:11;3653:4;:20::i;:::-;3642:31;;3683:8;3694:15;766:6:1;3705:3:2;3694:4;:15::i;:::-;3683:26;;3736;3741:15;3758:3;3736:4;:26::i;:::-;3719:43;3136:664;-1:-1:-1;;;;;;;;;;;;3136:664:2:o;935:50:1:-;983:2;766:6;976:9;;1434:59;1475:18;1434:59;:::o;3397:173:4:-;1929:6;;3481:23;;1929:6;;;;;1928:7;1920:16;;;;;;3528:10;;;;3520:19;;;;;;3556:7;3549:14;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;3549:14:4;;;;;;;;;;;;;;;;;;;;;;3397:173;:::o;991:42:1:-;1032:1;991:42;:::o;3253:138:4:-;1929:6;;3331:23;;1929:6;;;;;1928:7;1920:16;;;;;3135:112;3226:7;:14;3135:112;:::o;8192:951::-;1728:10;-1:-1:-1;;;;;1710:39:4;1719:7;;-1:-1:-1;;;;;;1719:7:4;-1:-1:-1;;;;;1710:39:4;;1740:8;;1710:39;;;;;;;;;;;;;;;;;;;;;30:3:-1;22:6;14;1:33;99:1;81:16;;;74:27;1710:39:4;;137:4:-1;117:14;;;-1:-1;;113:30;157:16;;;1710:39:4;;;;-1:-1:-1;1710:39:4;;-1:-1:-1;;;;1710:39:4;1810:6;;;;;;;1809:7;1801:16;;;;;;1827:6;:13;;-1:-1:-1;;1827:13:4;;;;;8307:11;;8293:10;-1:-1:-1;;;;;8307:11:4;;;8293:25;8285:34;;;;;;-1:-1:-1;;;;;8337:15:4;;;;;;:8;:15;;;;;:21;;;8329:30;;;;;;8378:10;;;;8377:11;8369:20;;;;;;-1:-1:-1;;;;;8420:15:4;;8400:17;8420:15;;;:8;:15;;;;;:23;;;;8473:28;8420:23;8400:17;8473:4;:28::i;:::-;8532:12;;-1:-1:-1;;;;;8546:15:4;;;;;;:8;:15;;;;;:22;;;8453:48;;-1:-1:-1;8527:42:4;;:4;:42::i;:::-;8512:12;:57;-1:-1:-1;;;;;8688:15:4;;8675:10;8688:15;;;:8;:15;;;;;:21;;;8731:7;:14;;-1:-1:-1;;8731:18:4;;;:7;:18;;8776:13;;;;;;;;;;;;;;;;8759:7;:14;;-1:-1:-1;;;;;8776:13:4;;;;8767:5;;8759:14;;;;;;;;;;;;;;:30;;;;;-1:-1:-1;;;;;8759:30:4;;;;;-1:-1:-1;;;;;8759:30:4;;;;;;8832:5;8799:8;:24;8808:7;8816:5;8808:14;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;8808:14:4;8799:24;;;;;;;;;;;;8808:14;8799:30;:38;8847:7;:13;;;;;;;;;;;;;;;-1:-1:-1;;8847:13:4;;;;;;;-1:-1:-1;;;;;;8847:13:4;;;;;;;;;8888:113;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;8870:15:4;;;;:8;:15;;;;;;;:131;;;;-1:-1:-1;;8870:131:4;;;;;;;;;-1:-1:-1;8870:131:4;;;;;;;;;;;;;;9012:68;8870:15;9035:10;9047:32;9052:12;9066;9047:4;:32::i;9012:68::-;9113:8;;9090:46;;9106:5;;9113:8;;;-1:-1:-1;;;;;9113:8:4;9123:12;9090:15;:46::i;4383:122::-;1929:6;;4463:4;;1929:6;;;;;1928:7;1920:16;;;;;;-1:-1:-1;4490:8:4;;4383:122;:::o;3575:248:5:-;3704:10;3642:4;3693:22;;;:10;:22;;;;;;;;-1:-1:-1;;;;;3693:27:5;;;;;;;;;;3688:38;;3722:3;3688:4;:38::i;:::-;3669:10;3658:22;;;;:10;:22;;;;;;;;-1:-1:-1;;;;;3658:27:5;;;;;;;;;;;;:68;;;3741:54;;;;;;3658:27;;-1:-1:-1;;;;;;;;;;;3741:54:5;;;;;;;;;;-1:-1:-1;3812:4:5;3575:248;;;;:::o;3067:118::-;-1:-1:-1;;;;;3158:15:5;;;3135:4;3158:15;;;:10;:15;;;;;;;;:20;;;;;;;;;;;;;3067:118::o;6078:637:4:-;1728:10;-1:-1:-1;;;;;1710:39:4;1719:7;;-1:-1:-1;;;;;;1719:7:4;-1:-1:-1;;;;;1710:39:4;;1740:8;;1710:39;;;;;;;;;;;;;;;;;;;;;30:3:-1;22:6;14;1:33;99:1;81:16;;;74:27;1710:39:4;;137:4:-1;117:14;;;-1:-1;;113:30;157:16;;;1710:39:4;;;;-1:-1:-1;1710:39:4;;-1:-1:-1;;;;1710:39:4;6281:11;;-1:-1:-1;;;;;6281:11:4;6267:10;:25;6259:34;;;;;;-1:-1:-1;;;;;6312:15:4;;;;;;:8;:15;;;;;:21;;;6311:22;6303:31;;;;;;6353:10;;;;6352:11;6344:20;;;;;;6383:7;:14;868:1:1;-1:-1:-1;6375:42:4;;;;;;6446:193;;;;;;;;6474:4;6446:193;;;6499:7;:14;;6446:193;;;;;;;-1:-1:-1;6446:193:4;;;;;;;;;;;;-1:-1:-1;;;;;6428:15:4;;;;;:8;:15;;;;;;:211;;;;-1:-1:-1;;6428:211:4;;;;;;;;;;;;;;;;;;;;;;;;;;;;;27:10:-1;;23:18;;;45:23;;6649:19:4;;;;;;;-1:-1:-1;;;;;;6649:19:4;;;;;;6678:30;6428:15;6692:7;6701:6;6678;:30::i;:::-;6078:637;;;:::o;9432:331::-;1728:10;-1:-1:-1;;;;;1710:39:4;1719:7;;-1:-1:-1;;;;;;1719:7:4;-1:-1:-1;;;;;1710:39:4;;1740:8;;1710:39;;;;;;;;;;;;;;;;;;;;;30:3:-1;22:6;14;1:33;99:1;81:16;;;74:27;1710:39:4;;137:4:-1;117:14;;;-1:-1;;113:30;157:16;;;1710:39:4;;;;-1:-1:-1;1710:39:4;;-1:-1:-1;;;;1710:39:4;1810:6;;;;;;;1809:7;1801:16;;;;;;1827:6;:13;;-1:-1:-1;;1827:13:4;;;;;9558:11;;9544:10;-1:-1:-1;;;;;9558:11:4;;;9544:25;9536:34;;;;;;-1:-1:-1;;;;;9589:15:4;;;;;;:8;:15;;;;;:21;;;9588:22;9580:31;;;;;;9633:38;;;-1:-1:-1;;;9633:38:4;;9665:4;9633:38;;;;;;9622:8;;-1:-1:-1;;;;;9633:23:4;;;;;:38;;;;;;;;;;;;;;;:23;:38;;;5:2:-1;;;;30:1;27;20:12;5:2;9633:38:4;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;9633:38:4;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;9633:38:4;;-1:-1:-1;9689:13:4;;;;9681:22;;;;;;9714:42;9730:5;9737:10;9749:6;9714:15;:42::i;:::-;-1:-1:-1;;1861:6:4;:14;;-1:-1:-1;;1861:14:4;;;-1:-1:-1;9432:331:4:o;1560:49:1:-;1608:1;766:6;1601:8;;3931:249:4;1929:6;;4033:4;;1929:6;;;;;1928:7;1920:16;;;;;;-1:-1:-1;;;;;4062:15:4;;;;;;:8;:15;;;;;:21;;;4054:30;;;;;;-1:-1:-1;;;;;4108:15:4;;4094:11;4108:15;;;:8;:15;;;;;:22;;;4160:12;;4147:26;;4108:22;;4147:4;:26::i;:::-;4140:33;3931:249;-1:-1:-1;;;3931:249:4:o;4186:191::-;1929:6;;4279:4;;1929:6;;;;;1928:7;1920:16;;;;;;-1:-1:-1;;;;;4308:15:4;;;;;;:8;:15;;;;;:21;;;4300:30;;;;;;-1:-1:-1;;;;;;4347:15:4;;;;;:8;:15;;;;;:23;;;;4186:191::o;4806:653:2:-;5040:18;5074:16;5093:35;5098:14;5114:13;5093:4;:35::i;:::-;5074:54;;5138:9;5150:37;5155:15;5172:14;5150:4;:37::i;:::-;5138:49;;5197:6;5206:27;5211:15;5228:4;5206;:27::i;:::-;5197:36;;5243:8;5254:20;5259:1;5262:11;5254:4;:20::i;:::-;5243:31;;5290:15;5295:3;766:6:1;5290:4:2;:15::i;:::-;5284:21;;5331:19;766:6:1;5342:7:2;5331:4;:19::i;:::-;5315:35;;5376:46;5381:25;5386:14;5402:3;5381:4;:25::i;:::-;5408:13;5376:4;:46::i;:::-;5360:62;4806:653;-1:-1:-1;;;;;;;;;;;4806:653:2:o;2785:108:4:-;2875:11;;-1:-1:-1;;;2875:11:4;;;;;2785:108::o;1776:320:3:-;1845:4;1873:6;1865:15;;;;;;766:6:1;1900:8:3;;1926:6;;;:24;;;766:6:1;1941:1:3;1936:2;:6;;;;;;:14;1926:24;1918:33;;;;;;1998:1;1994:5;;1988:12;;2018:8;;;;2010:17;;;;;;2054:7;2069:1;2064:2;:6;;;;;;;1776:320;-1:-1:-1;;;;;;1776:320:3:o;1109:174::-;1178:4;1199:6;1207:9;1220:14;1229:1;1232;1220:8;:14::i;:::-;1198:36;;;;1253:4;1252:5;1244:14;;;;;;-1:-1:-1;1275:1:3;1109:174;-1:-1:-1;;;1109:174:3:o;1509:261::-;1578:4;1608:5;;;1631:6;;;:21;;;1651:1;1646;1641:2;:6;;;;;;:11;1631:21;1623:30;;;;;;1679:8;1673:15;;1706:8;;;;1698:17;;;;;;1725:7;766:6:1;1735:2:3;:9;;15014:424:2;15138:13;15192:16;15175:13;:33;;15167:42;;;;;;766:6:1;15227:13:2;:21;;15219:30;;;;;;15259:23;15285:37;15290:13;15305:16;15285:4;:37::i;:::-;15259:63;;15343:39;15348:18;15368:13;15343:4;:39::i;:::-;15332:50;;15422:8;15400:18;:30;;15392:39;;;;;2577:486:3;2651:4;1423:5:1;2679:4:3;:21;;2671:30;;;;;;1475:18:1;2719:21:3;;;2711:30;;;;;;2752:10;2766:11;2773:3;2766:6;:11::i;:::-;2752:25;;2790:11;2804:16;2809:3;2814:5;2804:4;:16::i;:::-;2790:30;;2831:13;2847:24;2853:4;2859:11;2864:5;2859:4;:11::i;:::-;2847:5;:24::i;:::-;2831:40;-1:-1:-1;2886:11:3;2882:57;;2920:8;-1:-1:-1;2913:15:3;;-1:-1:-1;;2913:15:3;2882:57;2949:18;2970:40;2981:4;2987:6;1540:13:1;2970:10:3;:40::i;:::-;2949:61;;3027:29;3032:8;3042:13;3027:4;:29::i;:::-;3020:36;2577:486;-1:-1:-1;;;;;;;2577:486:3:o;950:153::-;1019:4;1048:5;;;1071:6;;;;1063:15;;;;;25389:108:4;25471:19;25477:4;25483:6;25471:5;:19::i;:::-;25389:108;;:::o;25707:88::-;25775:13;25781:6;25775:5;:13::i;:::-;25707:88;:::o;25503:104::-;25583:17;25589:2;25593:6;25583:5;:17::i;25211:172::-;25319:34;;;-1:-1:-1;;;25319:34:4;;-1:-1:-1;;;;;25319:34:4;;;;;;;;;;;;;;;25307:9;;25319:22;;;;;:34;;;;;;;;;;;;;;25307:9;25319:22;:34;;;5:2:-1;;;;30:1;27;20:12;5:2;25319:34:4;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;25319:34:4;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;25319:34:4;;-1:-1:-1;25319:34:4;25363:13;;;;;;25211:172;;;;:::o;2181:244:5:-;-1:-1:-1;;;;;2259:13:5;;:8;:13;;;;;;;;;;;:20;-1:-1:-1;2259:20:5;2251:29;;;;;;-1:-1:-1;;;;;2311:13:5;;:8;:13;;;;;;;;;;;2306:24;;2326:3;2306:4;:24::i;:::-;-1:-1:-1;;;;;2290:13:5;;;:8;:13;;;;;;;;;;;:40;;;;2361:13;;;;;;;2356:24;;2376:3;2356:4;:24::i;:::-;-1:-1:-1;;;;;2340:13:5;;;:8;:13;;;;;;;;;;;;:40;;;;2395:23;;;;;;;2340:13;;2395:23;;;;-1:-1:-1;;;;;;;;;;;2395:23:5;;;;;;;;2181:244;;;:::o;25010:195:4:-;25120:55;;;-1:-1:-1;;;25120:55:4;;-1:-1:-1;;;;;25120:55:4;;;;;;;25161:4;25120:55;;;;;;;;;;;;25108:9;;25120:26;;;;;:55;;;;;;;;;;;;;;25108:9;25120:26;:55;;;5:2:-1;;;;30:1;27;20:12;25613:88:4;25681:13;25687:6;25681:5;:13::i;1289:214:3:-;1362:4;1368;1397:1;1392;:6;1388:109;;-1:-1:-1;;1422:5:3;;;1429;1414:21;;1388:109;-1:-1:-1;;1474:5:3;;;1481:4;1388:109;1289:214;;;;;:::o;833:111::-;896:4;766:6:1;923:7:3;928:1;923:4;:7::i;:::-;:14;;833:111;-1:-1:-1;;833:111:3:o;723:104::-;766:6:1;812:8:3;;;723:104::o;2121:300::-;2191:4;;2224:1;2220;:5;:21;;766:6:1;2220:21:3;;;2233:1;2220:21;2211:30;-1:-1:-1;2262:1:3;2257:6;;;;2252:145;2265:6;;2252:145;;2299:10;2304:1;2307;2299:4;:10::i;:::-;2295:14;-1:-1:-1;2332:1:3;2328;:5;:10;2324:63;;2362:10;2367:1;2370;2362:4;:10::i;:::-;2358:14;;2324:63;2278:1;2273:6;;;;2252:145;;3069:1047;3165:4;3217:3;3165:4;;3253:20;3262:4;766:6:1;3253:8:3;:20::i;:::-;3230:43;;-1:-1:-1;3230:43:3;-1:-1:-1;766:6:1;;3283:9:3;3608:1;3594:495;3619:9;3611:4;:17;3594:495;;3649:9;766:6:1;3661:1:3;:8;3649:20;;3684:6;3692:9;3705:29;3714:1;3717:16;3722:4;766:6:1;3717:4:3;:16::i;:::-;3705:8;:29::i;:::-;3683:51;;;;3755:22;3760:4;3766:10;3771:1;3774;3766:4;:10::i;3755:22::-;3748:29;;3798:16;3803:4;3809;3798;:16::i;:::-;3791:23;-1:-1:-1;3832:9:3;3828:20;;3843:5;;;;;3828:20;3867:4;3863:30;;;3884:9;;;3863:30;3911:4;3907:30;;;3928:9;;;3907:30;3955:8;3951:128;;;3989:15;3994:3;3999:4;3989;:15::i;:::-;3983:21;;3951:128;;;4049:15;4054:3;4059:4;4049;:15::i;:::-;4043:21;;3951:128;-1:-1:-1;;;3630:3:3;;3594:495;;;-1:-1:-1;4106:3:3;;3069:1047;-1:-1:-1;;;;;;;;;3069:1047:3:o;2529:96:5:-;2587:31;2593:4;2607;2614:3;2587:5;:31::i;1912:263::-;1981:4;1964:8;:23;;;;;;;;;;;:30;-1:-1:-1;1964:30:5;1956:39;;;;;;2053:4;2036:8;:23;;;;;;;;;;;2031:34;;2061:3;2031:4;:34::i;:::-;2022:4;2005:8;:23;;;;;;;;;;:60;2095:12;;2090:23;;2109:3;2090:4;:23::i;:::-;2075:12;:38;2128:40;;;;;;;;2160:1;;2145:4;;-1:-1:-1;;;;;;;;;;;2128:40:5;;;;;;;;1912:263;:::o;2431:92::-;2487:29;2501:4;2508:2;2512:3;2487:5;:29::i;1692:214::-;1784:4;1767:8;:23;;;;;;;;;;;1762:34;;1792:3;1762:4;:34::i;:::-;1753:4;1736:8;:23;;;;;;;;;;:60;1826:12;;1821:23;;1840:3;1821:4;:23::i;:::-;1806:12;:38;1859:40;;;;;;;;1888:4;;1876:1;;-1:-1:-1;;;;;;;;;;;1859:40:5;;;;;;;;1692:214;:::o

Swarm Source

bzzr://993ab7d9193add493b90f3fbc114d124f2515ee3286bb646c67d794789a25cb0

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.