ETH Price: $3,207.41 (+1.41%)

Token

Value Liquidity Provider (VLP)
 

Overview

Max Total Supply

1,088.836816643406448605 VLP

Holders

3

Total Transfers

-

Market

Onchain Market Cap

$0.00

Circulating Supply Market Cap

-

Other Info

Token Contract (WITH 18 Decimals)

Loading...
Loading
Loading...
Loading
Loading...
Loading

Click here to update the token information / general information
# Exchange Pair Price  24H Volume % Volume

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

Contract Name:
BPool

Compiler Version
v0.6.12+commit.27d51765

Optimization Enabled:
Yes with 200 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity)

/**
 *Submitted for verification at Etherscan.io on 2020-09-30
*/

// SPDX-License-Identifier: MIT

pragma solidity 0.6.12;

// 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/>.
library BConst {
    uint public constant BONE                     = 10**18;

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

    uint public constant DEFAULT_FEE              = BONE * 3 / 1000; // 0.3%
    uint public constant MIN_FEE                  = BONE / 10**6;
    uint public constant MAX_FEE                  = BONE / 10;

    uint public constant DEFAULT_COLLECTED_FEE    = BONE / 2000; // 0.05%
    uint public constant MAX_COLLECTED_FEE        = BONE / 200; // 0.5%

    uint public constant DEFAULT_EXIT_FEE         = 0;
    uint public constant MAX_EXIT_FEE             = BONE / 1000; // 0.1%

    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 DEFAULT_INIT_POOL_SUPPLY = BONE * 100;
    uint public constant MIN_INIT_POOL_SUPPLY     = BONE / 1000;
    uint public constant MAX_INIT_POOL_SUPPLY     = BONE * 10**18;

    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;
}

// 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/>.
contract BNum {

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

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

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

    function bsub(uint a, uint b)
        internal pure
        returns (uint)
    {
        (uint c, bool flag) = bsubSign(a, b);
        require(!flag, "sub underflow");
        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, "mul overflow");
        uint c1 = c0 + (BConst.BONE / 2);
        require(c1 >= c0, "mul overflow");
        uint c2 = c1 / BConst.BONE;
        return c2;
    }

    function bdiv(uint a, uint b)
        internal pure
        returns (uint)
    {
        require(b != 0, "div by 0");
        uint c0 = a * BConst.BONE;
        require(a == 0 || c0 / a == BConst.BONE, "div internal"); // bmul overflow
        uint c1 = c0 + (b / 2);
        require(c1 >= c0, "div internal"); //  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 : BConst.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 >= BConst.MIN_BPOW_BASE, "base too low");
        require(base <= BConst.MAX_BPOW_BASE, "base too high");

        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, BConst.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, BConst.BONE);
        uint term = BConst.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 * BConst.BONE;
            (uint c, bool cneg) = bsubSign(a, bsub(bigK, BConst.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;
    }

}

// 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/>.
// 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, "!bal");
        _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, "!bal");
        _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     = "Value Liquidity Provider";
    string  private _symbol   = "VLP";
    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 override view returns (uint) {
        return _allowance[src][dst];
    }

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

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

    function approve(address dst, uint amt) external override 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 override returns (bool) {
        _move(msg.sender, dst, amt);
        return true;
    }

    function transferFrom(address src, address dst, uint amt) external override returns (bool) {
        require(msg.sender == src || amt <= _allowance[src][msg.sender], "!spender");
        _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;
    }
}

// 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/>.
contract BMath is BNum {
    /**********************************************************************************************
    // calcSpotPrice                                                                             //
    // sP = spotPrice                                                                            //
    // bI = tokenBalanceIn                ( bI / wI )         1                                  //
    // bO = tokenBalanceOut         sP =  -----------  *  ----------                             //
    // wI = tokenWeightIn                 ( bO / wO )     ( 1 - sF )                             //
    // wO = tokenWeightOut                                                                       //
    // sF = swapFee (+ collectedFee)                                                             //
    **********************************************************************************************/
    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(BConst.BONE, bsub(BConst.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 (+ collectedFee)                                                             //
    **********************************************************************************************/
    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(BConst.BONE, swapFee);
        adjustedIn = bmul(tokenAmountIn, adjustedIn);
        uint y = bdiv(tokenBalanceIn, badd(tokenBalanceIn, adjustedIn));
        uint foo = bpow(y, weightRatio);
        uint bar = bsub(BConst.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 (+ collectedFee)                                                             //
    **********************************************************************************************/
    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, BConst.BONE);
        tokenAmountIn = bsub(BConst.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 (+ collectedFee)\                                              /              //
    **********************************************************************************************/
    function calcPoolOutGivenSingleIn(
        uint tokenBalanceIn,
        uint tokenWeightIn,
        uint poolSupply,
        uint totalWeight,
        uint tokenAmountIn,
        uint swapFee
    )
        public pure
        returns (uint poolAmountOut)
    {
        // @dev 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);
        uint zaz = bmul(bsub(BConst.BONE, normalizedWeight), swapFee);
        uint tokenAmountInAfterFee = bmul(tokenAmountIn, bsub(BConst.BONE, zaz));

        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;
    }

    /**********************************************************************************************
    // 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 (+ collectedFee)              \      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(BConst.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(BConst.BONE, normalizedWeight), swapFee);
        tokenAmountIn = bdiv(tokenAmountInAfterFee, bsub(BConst.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 (+ collectedFee)   *  | 1 - |  1 - ---- | * sF  |                            //
    // eF = exitFee                        \     \      tW /       /                             //
    **********************************************************************************************/
    function calcSingleOutGivenPoolIn(
        uint tokenBalanceOut,
        uint tokenWeightOut,
        uint poolSupply,
        uint totalWeight,
        uint poolAmountIn,
        uint swapFee,
        uint exitFee
    )
        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(BConst.BONE, exitFee));
        uint newPoolSupply = bsub(poolSupply, poolAmountInAfterExitFee);
        uint poolRatio = bdiv(newPoolSupply, poolSupply);
     
        // newBalTo = poolRatio^(1/weightTo) * balTo;
        uint tokenOutRatio = bpow(poolRatio, bdiv(BConst.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(BConst.BONE, normalizedWeight), swapFee);
        tokenAmountOut = bmul(tokenAmountOutBeforeSwapFee, bsub(BConst.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 (+ collectedFee)                       ( 1 - eF )                            //
    // eF = exitFee                                                                              //
    **********************************************************************************************/
    function calcPoolInGivenSingleOut(
        uint tokenBalanceOut,
        uint tokenWeightOut,
        uint poolSupply,
        uint totalWeight,
        uint tokenAmountOut,
        uint swapFee,
        uint exitFee
    )
        public pure
        returns (uint poolAmountIn)
    {

        // charge swap fee on the output token side 
        uint normalizedWeight = bdiv(tokenWeightOut, totalWeight);
        //uint tAoBeforeSwapFee = tAo / (1 - (1-weightTo) * swapFee) ;
        uint zoo = bsub(BConst.BONE, normalizedWeight);
        uint zar = bmul(zoo, swapFee);
        uint tokenAmountOutBeforeSwapFee = bdiv(tokenAmountOut, bsub(BConst.BONE, zar));

        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(BConst.BONE, exitFee));
        return poolAmountIn;
    }


}

// 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/>.
interface IBFactory {
    function collectedToken() external view returns(address);
}

contract BPool is 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_CALL(
        bytes4  indexed sig,
        address indexed caller,
        bytes           data
    ) anonymous;

    modifier _logs_() {
        emit LOG_CALL(msg.sig, msg.sender, msg.data);
        _;
    }
    event LOG_COLLECTED_FUND(
        address indexed collectedToken,
        uint256         collectedAmount
    );

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

    modifier _viewlock_() {
        require(!_mutex, "reentry");
        _;
    }

    bool private _mutex;

    uint public version = 1001;
    address public factory;    // BFactory address to push token exitFee to
    address public controller; // has CONTROL role
    bool public publicSwap;

    // `setSwapFee` and `finalize` require CONTROL
    // `finalize` sets `PUBLIC can SWAP`, `PUBLIC can JOIN`
    uint public initPoolSupply;
    uint public swapFee;
    uint public collectedFee; // 0.05% | https://yfv.finance/vip-vote/vip_5
    uint public exitFee;
    bool public finalized;

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

    constructor(address _factory) public {
        controller = _factory;
        factory = _factory;
        initPoolSupply = BConst.DEFAULT_INIT_POOL_SUPPLY;
        swapFee = BConst.DEFAULT_FEE;
        collectedFee = BConst.DEFAULT_COLLECTED_FEE;
        exitFee = BConst.DEFAULT_EXIT_FEE;
        publicSwap = false;
        finalized = false;
    }

    function setInitPoolSupply(uint _initPoolSupply) public _logs_ {
        require(!finalized, "finalized");
        require(msg.sender == controller, "!controller");
        require(_initPoolSupply >= BConst.MIN_INIT_POOL_SUPPLY, "<minInitPoolSup");
        require(_initPoolSupply <= BConst.MAX_INIT_POOL_SUPPLY, ">maxInitPoolSup");
        initPoolSupply = _initPoolSupply;
    }

    function setCollectedFee(uint _collectedFee) public _logs_ {
        require(msg.sender == factory, "!factory");
        require(_collectedFee <= BConst.MAX_COLLECTED_FEE, ">maxCoFee");
        require(bmul(_collectedFee, 2) <= swapFee, ">swapFee/2");
        collectedFee = _collectedFee;
    }

    function setExitFee(uint _exitFee) public _logs_ {
        require(!finalized, "finalized");
        require(msg.sender == factory, "!factory");
        require(_exitFee <= BConst.MAX_EXIT_FEE, ">maxExitFee");
        exitFee = _exitFee;
    }

    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, "!finalized");
        return _tokens;
    }

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

        require(_records[token].bound, "!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, "!bound");
        uint denorm = _records[token].denorm;
        return bdiv(denorm, _totalWeight);
    }

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

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

    function setSwapFee(uint _swapFee)
        external
        _lock_
        _logs_
    {
        require(!finalized, "finalized");
        require(msg.sender == controller, "!controller");
        require(_swapFee >= BConst.MIN_FEE, "<minFee");
        require(_swapFee <= BConst.MAX_FEE, ">maxFee");
        require(bmul(collectedFee, 2) <= _swapFee, "<collectedFee*2");
        swapFee = _swapFee;
    }

    function setController(address _controller)
        external
        _lock_
        _logs_
    {
        require(msg.sender == controller, "!controller");
        controller = _controller;
    }

    function setPublicSwap(bool _publicSwap)
        external
        _lock_
        _logs_
    {
        require(!finalized, "finalized");
        require(msg.sender == controller, "!controller");
        publicSwap = _publicSwap;
    }

    function finalize()
        external
        _lock_
        _logs_
    {
        require(msg.sender == controller, "!controller");
        require(!finalized, "finalized");
        require(_tokens.length >= BConst.MIN_BOUND_TOKENS, "<minTokens");

        finalized = true;
        publicSwap = true;

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


    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, "!controller");
        require(!_records[token].bound, "bound");
        require(!finalized, "finalized");

        require(_tokens.length < BConst.MAX_BOUND_TOKENS, ">maxTokens");

        _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
        _lock_
        _logs_
    {

        require(msg.sender == controller, "!controller");
        require(_records[token].bound, "!bound");
        require(!finalized, "finalized");

        require(denorm >= BConst.MIN_WEIGHT, "<minWeight");
        require(denorm <= BConst.MAX_WEIGHT, ">maxWeight");
        require(balance >= BConst.MIN_BALANCE, "<minBal");

        // Adjust the denorm and totalWeight
        uint oldWeight = _records[token].denorm;
        if (denorm > oldWeight) {
            _totalWeight = badd(_totalWeight, bsub(denorm, oldWeight));
            require(_totalWeight <= BConst.MAX_TOTAL_WEIGHT, ">maxTWeight");
        } 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, exitFee);
            _pushUnderlying(token, msg.sender, bsub(tokenBalanceWithdrawn, tokenExitFee));
            _pushUnderlying(token, factory, tokenExitFee);
        }
    }

    function unbind(address token)
        external
        _lock_
        _logs_
    {

        require(msg.sender == controller, "!controller");
        require(_records[token].bound, "!bound");
        require(!finalized, "finalized");

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

        _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, "!bound");
        _records[token].balance = IERC20(token).balanceOf(address(this));
    }

    function getSpotPrice(address tokenIn, address tokenOut)
        external view
        _viewlock_
        returns (uint spotPrice)
    {
        require(_records[tokenIn].bound, "!bound");
        require(_records[tokenOut].bound, "!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, "!bound");
        require(_records[tokenOut].bound, "!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
        _lock_
        _logs_
    {
        require(finalized, "!finalized");

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

        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, "errMathAprox");
            require(tokenAmountIn <= maxAmountsIn[i], "<limIn");
            _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
        _lock_
        _logs_
    {
        require(finalized, "!finalized");

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

        _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, "errMathAprox");
            require(tokenAmountOut >= minAmountsOut[i], "<limO");
            _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
        _lock_
        _logs_
        returns (uint tokenAmountOut, uint spotPriceAfter)
    {

        require(_records[tokenIn].bound, "!bound");
        require(_records[tokenOut].bound, "!bound");
        require(publicSwap, "!publicSwap");

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

        require(tokenAmountIn <= bmul(inRecord.balance, BConst.MAX_IN_RATIO), ">maxIRat");

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

        tokenAmountOut = calcOutGivenIn(
                            inRecord.balance,
                            inRecord.denorm,
                            outRecord.balance,
                            outRecord.denorm,
                            tokenAmountIn,
                            swapFee
                        );
        require(tokenAmountOut >= minAmountOut, "<limO");

        inRecord.balance = badd(inRecord.balance, tokenAmountIn);
        outRecord.balance = bsub(outRecord.balance, tokenAmountOut);

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

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

        _pullUnderlying(tokenIn, msg.sender, tokenAmountIn);
        uint _subTokenAmountIn;
        (_subTokenAmountIn, tokenAmountOut) = _pushCollectedFundGivenOut(tokenIn, tokenAmountIn, tokenOut, tokenAmountOut);
        if (_subTokenAmountIn > 0) inRecord.balance = bsub(inRecord.balance, _subTokenAmountIn);
        _pushUnderlying(tokenOut, msg.sender, tokenAmountOut);

        return (tokenAmountOut, spotPriceAfter);
    }

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

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

        require(tokenAmountOut <= bmul(outRecord.balance, BConst.MAX_OUT_RATIO), ">maxORat");

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

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

        inRecord.balance = badd(inRecord.balance, tokenAmountIn);
        outRecord.balance = bsub(outRecord.balance, tokenAmountOut);

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

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

        _pullUnderlying(tokenIn, msg.sender, tokenAmountIn);
        _pushUnderlying(tokenOut, msg.sender, tokenAmountOut);
        uint _collectedFeeAmount = _pushCollectedFundGivenIn(tokenIn, tokenAmountIn);
        if (_collectedFeeAmount > 0) inRecord.balance = bsub(inRecord.balance, _collectedFeeAmount);

        return (tokenAmountIn, spotPriceAfter);
    }


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

    {        
        require(finalized, "!finalized");
        require(_records[tokenIn].bound, "!bound");
        require(tokenAmountIn <= bmul(_records[tokenIn].balance, BConst.MAX_IN_RATIO), ">maxIRat");

        Record storage inRecord = _records[tokenIn];

        poolAmountOut = calcPoolOutGivenSingleIn(
                            inRecord.balance,
                            inRecord.denorm,
                            _totalSupply,
                            _totalWeight,
                            tokenAmountIn,
                            swapFee
                        );

        require(poolAmountOut >= minPoolAmountOut, "<limO");

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

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

        _mintPoolShare(poolAmountOut);
        _pullUnderlying(tokenIn, msg.sender, tokenAmountIn);
        uint _subTokenAmountIn;
        (_subTokenAmountIn, poolAmountOut) = _pushCollectedFundGivenOut(tokenIn, tokenAmountIn, address(this), poolAmountOut);
        if (_subTokenAmountIn > 0) inRecord.balance = bsub(inRecord.balance, _subTokenAmountIn);
        _pushPoolShare(msg.sender, poolAmountOut);

        return poolAmountOut;
    }

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

        Record storage inRecord = _records[tokenIn];

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

        require(tokenAmountIn != 0, "errMathAprox");
        require(tokenAmountIn <= maxAmountIn, "<limIn");
        
        require(tokenAmountIn <= bmul(_records[tokenIn].balance, BConst.MAX_IN_RATIO), ">maxIRat");

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

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

        _mintPoolShare(poolAmountOut);
        _pushPoolShare(msg.sender, poolAmountOut);
        _pullUnderlying(tokenIn, msg.sender, tokenAmountIn);
        uint _collectedFeeAmount = _pushCollectedFundGivenIn(tokenIn, tokenAmountIn);
        if (_collectedFeeAmount > 0) inRecord.balance = bsub(inRecord.balance, _collectedFeeAmount);

        return tokenAmountIn;
    }

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

        Record storage outRecord = _records[tokenOut];

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

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

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

        uint _exitFee = bmul(poolAmountIn, exitFee);

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

        _pullPoolShare(msg.sender, poolAmountIn);
        _burnPoolShare(bsub(poolAmountIn, _exitFee));
        _pushPoolShare(factory, _exitFee);
        (, tokenAmountOut) = _pushCollectedFundGivenOut(address(this), poolAmountIn, tokenOut, tokenAmountOut);
        _pushUnderlying(tokenOut, msg.sender, tokenAmountOut);

        return tokenAmountOut;
    }

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

        Record storage outRecord = _records[tokenOut];

        poolAmountIn = calcPoolInGivenSingleOut(
                            outRecord.balance,
                            outRecord.denorm,
                            _totalSupply,
                            _totalWeight,
                            tokenAmountOut,
                            swapFee,
                            exitFee
                        );

        require(poolAmountIn != 0, "errMathAprox");
        require(poolAmountIn <= maxPoolAmountIn, "<limIn");

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

        uint _exitFee = bmul(poolAmountIn, exitFee);

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

        _pullPoolShare(msg.sender, poolAmountIn);
        uint _collectedFeeAmount = _pushCollectedFundGivenIn(address(this), poolAmountIn);
        _burnPoolShare(bsub(bsub(poolAmountIn, _exitFee), _collectedFeeAmount));
        _pushPoolShare(factory, _exitFee);
        _pushUnderlying(tokenOut, msg.sender, tokenAmountOut);

        return poolAmountIn;
    }


    // ==
    // '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, "errErc20");
    }

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

    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);
    }

    function _pushCollectedFundGivenOut(address _tokenIn, uint _tokenAmountIn, address _tokenOut, uint _tokenAmountOut) internal returns (uint subTokenAmountIn, uint tokenAmountOut) {
        subTokenAmountIn = 0;
        tokenAmountOut = _tokenAmountOut;
        if (collectedFee > 0) {
            address _collectedToken = IBFactory(factory).collectedToken();
            if (_collectedToken == _tokenIn) {
                subTokenAmountIn = bdiv(bmul(_tokenAmountIn, collectedFee), BConst.BONE);
                _pushUnderlying(_tokenIn, factory, subTokenAmountIn);
                emit LOG_COLLECTED_FUND(_tokenIn, subTokenAmountIn);
            } else {
                uint _collectedFeeAmount = bdiv(bmul(_tokenAmountOut, collectedFee), BConst.BONE);
                _pushUnderlying(_tokenOut, factory, _collectedFeeAmount);
                tokenAmountOut = bsub(_tokenAmountOut, _collectedFeeAmount);
                emit LOG_COLLECTED_FUND(_tokenOut, _collectedFeeAmount);
            }
        }
    }

    // always push out _tokenIn (already have)
    function _pushCollectedFundGivenIn(address _tokenIn, uint _tokenAmountIn) internal returns (uint collectedFeeAmount) {
        collectedFeeAmount = 0;
        if (collectedFee > 0) {
            address _collectedToken = IBFactory(factory).collectedToken();
            if (_collectedToken != address(0)) {
                collectedFeeAmount = bdiv(bmul(_tokenAmountIn, collectedFee), BConst.BONE);
                _pushUnderlying(_tokenIn, factory, collectedFeeAmount);
                emit LOG_COLLECTED_FUND(_tokenIn, collectedFeeAmount);
            }
        }
    }
}

Contract Security Audit

Contract ABI

[{"inputs":[{"internalType":"address","name":"_factory","type":"address"}],"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":"collectedToken","type":"address"},{"indexed":false,"internalType":"uint256","name":"collectedAmount","type":"uint256"}],"name":"LOG_COLLECTED_FUND","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"},{"inputs":[{"internalType":"address","name":"src","type":"address"},{"internalType":"address","name":"dst","type":"address"}],"name":"allowance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"dst","type":"address"},{"internalType":"uint256","name":"amt","type":"uint256"}],"name":"approve","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"whom","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"token","type":"address"},{"internalType":"uint256","name":"balance","type":"uint256"},{"internalType":"uint256","name":"denorm","type":"uint256"}],"name":"bind","outputs":[],"stateMutability":"nonpayable","type":"function"},{"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"}],"stateMutability":"pure","type":"function"},{"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"}],"stateMutability":"pure","type":"function"},{"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":"exitFee","type":"uint256"}],"name":"calcPoolInGivenSingleOut","outputs":[{"internalType":"uint256","name":"poolAmountIn","type":"uint256"}],"stateMutability":"pure","type":"function"},{"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"}],"name":"calcPoolOutGivenSingleIn","outputs":[{"internalType":"uint256","name":"poolAmountOut","type":"uint256"}],"stateMutability":"pure","type":"function"},{"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"}],"stateMutability":"pure","type":"function"},{"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"},{"internalType":"uint256","name":"exitFee","type":"uint256"}],"name":"calcSingleOutGivenPoolIn","outputs":[{"internalType":"uint256","name":"tokenAmountOut","type":"uint256"}],"stateMutability":"pure","type":"function"},{"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"}],"stateMutability":"pure","type":"function"},{"inputs":[],"name":"collectedFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"controller","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"decimals","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"dst","type":"address"},{"internalType":"uint256","name":"amt","type":"uint256"}],"name":"decreaseApproval","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"exitFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"poolAmountIn","type":"uint256"},{"internalType":"uint256[]","name":"minAmountsOut","type":"uint256[]"}],"name":"exitPool","outputs":[],"stateMutability":"nonpayable","type":"function"},{"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"}],"stateMutability":"nonpayable","type":"function"},{"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"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"factory","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"finalize","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"finalized","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"token","type":"address"}],"name":"getBalance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getCurrentTokens","outputs":[{"internalType":"address[]","name":"tokens","type":"address[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"token","type":"address"}],"name":"getDenormalizedWeight","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getFinalTokens","outputs":[{"internalType":"address[]","name":"tokens","type":"address[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"token","type":"address"}],"name":"getNormalizedWeight","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getNumTokens","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"tokenIn","type":"address"},{"internalType":"address","name":"tokenOut","type":"address"}],"name":"getSpotPrice","outputs":[{"internalType":"uint256","name":"spotPrice","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"tokenIn","type":"address"},{"internalType":"address","name":"tokenOut","type":"address"}],"name":"getSpotPriceSansFee","outputs":[{"internalType":"uint256","name":"spotPrice","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getTotalDenormalizedWeight","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"token","type":"address"}],"name":"gulp","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"dst","type":"address"},{"internalType":"uint256","name":"amt","type":"uint256"}],"name":"increaseApproval","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"initPoolSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"t","type":"address"}],"name":"isBound","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"poolAmountOut","type":"uint256"},{"internalType":"uint256[]","name":"maxAmountsIn","type":"uint256[]"}],"name":"joinPool","outputs":[],"stateMutability":"nonpayable","type":"function"},{"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"}],"stateMutability":"nonpayable","type":"function"},{"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"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"publicSwap","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"token","type":"address"},{"internalType":"uint256","name":"balance","type":"uint256"},{"internalType":"uint256","name":"denorm","type":"uint256"}],"name":"rebind","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_collectedFee","type":"uint256"}],"name":"setCollectedFee","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_controller","type":"address"}],"name":"setController","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_exitFee","type":"uint256"}],"name":"setExitFee","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_initPoolSupply","type":"uint256"}],"name":"setInitPoolSupply","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"_publicSwap","type":"bool"}],"name":"setPublicSwap","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_swapFee","type":"uint256"}],"name":"setSwapFee","outputs":[],"stateMutability":"nonpayable","type":"function"},{"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"}],"stateMutability":"nonpayable","type":"function"},{"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"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"swapFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"dst","type":"address"},{"internalType":"uint256","name":"amt","type":"uint256"}],"name":"transfer","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"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"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"token","type":"address"}],"name":"unbind","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"version","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"}]

60c0604052601860808190527f56616c7565204c69717569646974792050726f7669646572000000000000000060a090815262000040916003919062000120565b50604080518082019091526003808252620564c560ec1b60209092019182526200006d9160049162000120565b506005805460ff191660121790556103e96006553480156200008e57600080fd5b5060405162005a4838038062005a4883398181016040526020811015620000b457600080fd5b505160088054600780546001600160a01b039094166001600160a01b0319948516811790915568056bc75e2d63100000600955660aa87bee538000600a556601c6bf52634000600b556000600c55921690911760ff60a01b19169055600d805460ff19169055620001bc565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f106200016357805160ff191683800117855562000193565b8280016001018555821562000193579182015b828111156200019357825182559160200191906001019062000176565b50620001a1929150620001a5565b5090565b5b80821115620001a15760008155600101620001a6565b61587c80620001cc6000396000f3fe608060405234801561001057600080fd5b50600436106103785760003560e01c80637c5e9ea4116101d3578063be3bbd2e11610104578063e4e1e538116100a2578063f1b8a9b71161007c578063f1b8a9b714610c26578063f77c479114610c4c578063f8b2cb4f14610c54578063f8d6aed414610c7a57610378565b8063e4e1e53814610bcf578063e5a583a914610c01578063e811f50a14610c1e57610378565b8063cd2ed8fb116100de578063cd2ed8fb14610b47578063cf5e7bd314610b4f578063d73dd62314610b75578063dd62ed3e14610ba157610378565b8063be3bbd2e14610ac3578063c45a015514610b1b578063cc77828d14610b3f57610378565b8063948d8ce611610171578063a9059cbb1161014b578063a9059cbb146109dd578063b02f0b7314610a09578063b3f05b9714610a80578063ba9530a614610a8857610378565b8063948d8ce61461097a57806395d89b41146109a0578063a221ee49146109a857610378565b80638c0ba32f116101ad5780638c0ba32f1461091e5780638c28cbe81461092657806392eefe9b1461094c578063936c34771461097257610378565b80637c5e9ea41461084a5780638201aa3f146108a35780638656b653146108e357610378565b8063429b4ae6116102ad5780635c1bbaf71161024b578063661884631161022557806366188463146107855780636d06dfa0146107b157806370a08231146107e357806379104ea61461080957610378565b80635c1bbaf7146107105780635db342771461074b5780636284ae411461077d57610378565b80634bb278f3116102875780634bb278f3146106815780634f69c0d41461068957806354cf2aeb1461070057806354fd4d501461070857610378565b8063429b4ae61461061357806346ab38f11461063057806349b595521461066257610378565b80631e1f761b1161031a5780632f37b624116102f45780632f37b62414610580578063313ce567146105a657806334e19907146105c45780633fdddaa2146105e157610378565b80631e1f761b1461052357806323b872dd1461052b5780632da778bc1461056157610378565b8063095ea7b311610356578063095ea7b31461047f5780631446a7ff146104bf57806315e84af9146104ed57806318160ddd1461051b57610378565b8063024eb2e31461037d57806302c96748146103d057806306fdde0314610402575b600080fd5b6103be600480360360e081101561039357600080fd5b5080359060208101359060408101359060608101359060808101359060a08101359060c00135610cb5565b60408051918252519081900360200190f35b6103be600480360360608110156103e657600080fd5b506001600160a01b038135169060208101359060400135610d79565b61040a6110c0565b6040805160208082528351818301528351919283929083019185019080838360005b8381101561044457818101518382015260200161042c565b50505050905090810190601f1680156104715780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b6104ab6004803603604081101561049557600080fd5b506001600160a01b038135169060200135611156565b604080519115158252519081900360200190f35b6103be600480360360408110156104d557600080fd5b506001600160a01b03813581169160200135166111ab565b6103be6004803603604081101561050357600080fd5b506001600160a01b03813581169160200135166112ee565b6103be611428565b6103be61142e565b6104ab6004803603606081101561054157600080fd5b506001600160a01b03813581169160208101359091169060400135611434565b61057e6004803603602081101561057757600080fd5b5035611581565b005b6104ab6004803603602081101561059657600080fd5b50356001600160a01b031661171c565b6105ae61173a565b6040805160ff9092168252519081900360200190f35b61057e600480360360208110156105da57600080fd5b5035611743565b61057e600480360360608110156105f757600080fd5b506001600160a01b038135169060208101359060400135611969565b61057e6004803603602081101561062957600080fd5b5035611d2d565b6103be6004803603606081101561064657600080fd5b506001600160a01b038135169060208101359060400135611e73565b61057e6004803603602081101561067857600080fd5b50351515612166565b61057e6122c7565b61057e6004803603604081101561069f57600080fd5b813591908101906040810160208201356401000000008111156106c157600080fd5b8201836020820111156106d357600080fd5b803590602001918460208302840111640100000000831117156106f557600080fd5b509092509050612489565b6103be61275b565b6103be612761565b6103be600480360360c081101561072657600080fd5b5080359060208101359060408101359060608101359060808101359060a00135612767565b6103be6004803603606081101561076157600080fd5b506001600160a01b03813516906020810135906040013561281a565b6103be612ae5565b6104ab6004803603604081101561079b57600080fd5b506001600160a01b038135169060200135612aeb565b6103be600480360360608110156107c757600080fd5b506001600160a01b038135169060208101359060400135612bc3565b6103be600480360360208110156107f957600080fd5b50356001600160a01b0316612edd565b6103be600480360360e081101561081f57600080fd5b5080359060208101359060408101359060608101359060808101359060a08101359060c00135612ef8565b61088a600480360360a081101561086057600080fd5b506001600160a01b0381358116916020810135916040820135169060608101359060800135612fc7565b6040805192835260208301919091528051918290030190f35b61088a600480360360a08110156108b957600080fd5b506001600160a01b038135811691602081013591604082013516906060810135906080013561347a565b6103be600480360360c08110156108f957600080fd5b5080359060208101359060408101359060608101359060808101359060a00135613916565b6104ab6139b2565b61057e6004803603602081101561093c57600080fd5b50356001600160a01b03166139c2565b61057e6004803603602081101561096257600080fd5b50356001600160a01b0316613b6b565b6103be613c8c565b6103be6004803603602081101561099057600080fd5b50356001600160a01b0316613cdd565b61040a613d9c565b6103be600480360360a08110156109be57600080fd5b5080359060208101359060408101359060608101359060800135613dfd565b6104ab600480360360408110156109f357600080fd5b506001600160a01b038135169060200135613e62565b61057e60048036036040811015610a1f57600080fd5b81359190810190604081016020820135640100000000811115610a4157600080fd5b820183602082011115610a5357600080fd5b80359060200191846020830284011164010000000083111715610a7557600080fd5b509092509050613e78565b6104ab614191565b6103be600480360360c0811015610a9e57600080fd5b5080359060208101359060408101359060608101359060808101359060a0013561419a565b610acb61421b565b60408051602080825283518183015283519192839290830191858101910280838360005b83811015610b07578181015183820152602001610aef565b505050509050019250505060405180910390f35b610b23614308565b604080516001600160a01b039092168252519081900360200190f35b610acb614317565b6103be614361565b61057e60048036036020811015610b6557600080fd5b50356001600160a01b0316614367565b6104ab60048036036040811015610b8b57600080fd5b506001600160a01b0381351690602001356146be565b6103be60048036036040811015610bb757600080fd5b506001600160a01b038135811691602001351661473f565b61057e60048036036060811015610be557600080fd5b506001600160a01b03813516906020810135906040013561476a565b61057e60048036036020811015610c1757600080fd5b50356149a8565b6103be614ae6565b6103be60048036036020811015610c3c57600080fd5b50356001600160a01b0316614aec565b610b23614bbd565b6103be60048036036020811015610c6a57600080fd5b50356001600160a01b0316614bcc565b6103be600480360360c0811015610c9057600080fd5b5080359060208101359060408101359060608101359060808101359060a00135614c8b565b600080610cc28887614d0e565b90506000610cd8670de0b6b3a764000083614e15565b90506000610ce68287614e73565b90506000610d0588610d00670de0b6b3a764000085614e15565b614d0e565b90506000610d138d83614e15565b90506000610d21828f614d0e565b90506000610d2f8288614f2d565b90506000610d3d828f614e73565b90506000610d4b8f83614e15565b9050610d6381610d00670de0b6b3a76400008e614e15565b9950505050505050505050979650505050505050565b600554600090610100900460ff1615610dc3576040805162461bcd60e51b81526020600482015260076024820152667265656e74727960c81b604482015290519081900360640190fd5b6005805461010061ff0019909116179055604080516020808252369082018190523392600080356001600160e01b0319169390929181908101848480828437600083820152604051601f909101601f19169092018290039550909350505050a2600d5460ff16610e67576040805162461bcd60e51b815260206004820152600a60248201526908599a5b985b1a5e995960b21b604482015290519081900360640190fd5b6001600160a01b0384166000908152600f602052604090205460ff16610ebd576040805162461bcd60e51b815260206004820152600660248201526508589bdd5b9960d21b604482015290519081900360640190fd5b6001600160a01b0384166000908152600f60205260409020600390810154610ef291670de0b6b3a76400005b04600101614e73565b831115610f31576040805162461bcd60e51b81526020600482015260086024820152670f9b585e13d4985d60c21b604482015290519081900360640190fd5b6001600160a01b0384166000908152600f6020526040902060038101546002808301549054601054600a54600c54610f6e95949392918a91610cb5565b915081610fb1576040805162461bcd60e51b815260206004820152600c60248201526b0cae4e49ac2e8d082e0e4def60a31b604482015290519081900360640190fd5b82821115610fef576040805162461bcd60e51b81526020600482015260066024820152651e3634b6a4b760d11b604482015290519081900360640190fd5b610ffd816003015485614e15565b8160030181905550600061101383600c54614e73565b6040805187815290519192506001600160a01b0388169133917fe74c91552b64c2e2e7bd255639e004e693bd3e1d01cc33e65610b86afcc1ffed919081900360200190a36110613384615029565b600061106d3085615037565b905061108a61108561107f8685614e15565b83614e15565b615143565b6007546110a0906001600160a01b03168361514f565b6110ab873388615159565b5050506005805461ff00191690559392505050565b60038054604080516020601f600260001961010060018816150201909516949094049384018190048102820181019092528281526060939092909183018282801561114c5780601f106111215761010080835404028352916020019161114c565b820191906000526020600020905b81548152906001019060200180831161112f57829003601f168201915b5050505050905090565b3360008181526001602090815260408083206001600160a01b03871680855290835281842086905581518681529151939490939092600080516020615827833981519152928290030190a35060015b92915050565b600554600090610100900460ff16156111f5576040805162461bcd60e51b81526020600482015260076024820152667265656e74727960c81b604482015290519081900360640190fd5b6001600160a01b0383166000908152600f602052604090205460ff1661124b576040805162461bcd60e51b815260206004820152600660248201526508589bdd5b9960d21b604482015290519081900360640190fd5b6001600160a01b0382166000908152600f602052604090205460ff166112a1576040805162461bcd60e51b815260206004820152600660248201526508589bdd5b9960d21b604482015290519081900360640190fd5b6001600160a01b038084166000908152600f602052604080822092851682528120600380840154600280860154928401549084015493946112e59492939290613dfd565b95945050505050565b600554600090610100900460ff1615611338576040805162461bcd60e51b81526020600482015260076024820152667265656e74727960c81b604482015290519081900360640190fd5b6001600160a01b0383166000908152600f602052604090205460ff1661138e576040805162461bcd60e51b815260206004820152600660248201526508589bdd5b9960d21b604482015290519081900360640190fd5b6001600160a01b0382166000908152600f602052604090205460ff166113e4576040805162461bcd60e51b815260206004820152600660248201526508589bdd5b9960d21b604482015290519081900360640190fd5b6001600160a01b038084166000908152600f6020526040808220928516825290206003808301546002808501549284015490840154600a546112e594929190613dfd565b60025490565b60095481565b6000336001600160a01b038516148061147057506001600160a01b03841660009081526001602090815260408083203384529091529020548211155b6114ac576040805162461bcd60e51b815260206004820152600860248201526710b9b832b73232b960c11b604482015290519081900360640190fd5b6114b7848484615223565b336001600160a01b038516148015906114f557506001600160a01b038416600090815260016020908152604080832033845290915290205460001914155b15611577576001600160a01b03841660009081526001602090815260408083203384529091529020546115289083614e15565b6001600160a01b03858116600090815260016020908152604080832033808552908352928190208590558051948552519287169391926000805160206158278339815191529281900390910190a35b5060019392505050565b336001600160a01b03166000356001600160e01b0319166001600160e01b03191660003660405180806020018281038252848482818152602001925080828437600083820152604051601f909101601f19169092018290039550909350505050a2600d5460ff1615611626576040805162461bcd60e51b8152602060048201526009602482015268199a5b985b1a5e995960ba1b604482015290519081900360640190fd5b6008546001600160a01b03163314611673576040805162461bcd60e51b815260206004820152600b60248201526a10b1b7b73a3937b63632b960a91b604482015290519081900360640190fd5b66038d7ea4c680008110156116c1576040805162461bcd60e51b815260206004820152600f60248201526e03c6d696e496e6974506f6f6c53757608c1b604482015290519081900360640190fd5b6ec097ce7bc90715b34b9f1000000000811115611717576040805162461bcd60e51b815260206004820152600f60248201526e03e6d6178496e6974506f6f6c53757608c1b604482015290519081900360640190fd5b600955565b6001600160a01b03166000908152600f602052604090205460ff1690565b60055460ff1690565b600554610100900460ff161561178a576040805162461bcd60e51b81526020600482015260076024820152667265656e74727960c81b604482015290519081900360640190fd5b6005805461010061ff0019909116179055604080516020808252369082018190523392600080356001600160e01b0319169390929181908101848480828437600083820152604051601f909101601f19169092018290039550909350505050a2600d5460ff161561182e576040805162461bcd60e51b8152602060048201526009602482015268199a5b985b1a5e995960ba1b604482015290519081900360640190fd5b6008546001600160a01b0316331461187b576040805162461bcd60e51b815260206004820152600b60248201526a10b1b7b73a3937b63632b960a91b604482015290519081900360640190fd5b64e8d4a510008110156118bf576040805162461bcd60e51b81526020600482015260076024820152663c6d696e46656560c81b604482015290519081900360640190fd5b67016345785d8a0000811115611906576040805162461bcd60e51b81526020600482015260076024820152663e6d617846656560c81b604482015290519081900360640190fd5b80611914600b546002614e73565b1115611959576040805162461bcd60e51b815260206004820152600f60248201526e1e31b7b63632b1ba32b22332b2951960891b604482015290519081900360640190fd5b600a556005805461ff0019169055565b600554610100900460ff16156119b0576040805162461bcd60e51b81526020600482015260076024820152667265656e74727960c81b604482015290519081900360640190fd5b6005805461010061ff0019909116179055604080516020808252369082018190523392600080356001600160e01b0319169390929181908101848480828437600083820152604051601f909101601f19169092018290039550909350505050a26008546001600160a01b03163314611a5d576040805162461bcd60e51b815260206004820152600b60248201526a10b1b7b73a3937b63632b960a91b604482015290519081900360640190fd5b6001600160a01b0383166000908152600f602052604090205460ff16611ab3576040805162461bcd60e51b815260206004820152600660248201526508589bdd5b9960d21b604482015290519081900360640190fd5b600d5460ff1615611af7576040805162461bcd60e51b8152602060048201526009602482015268199a5b985b1a5e995960ba1b604482015290519081900360640190fd5b670de0b6b3a7640000811015611b41576040805162461bcd60e51b815260206004820152600a6024820152690f1b5a5b95d95a59da1d60b21b604482015290519081900360640190fd5b6802b5e3af16b1880000811115611b8c576040805162461bcd60e51b815260206004820152600a6024820152690f9b585e15d95a59da1d60b21b604482015290519081900360640190fd5b620f4240821015611bce576040805162461bcd60e51b81526020600482015260076024820152660f1b5a5b90985b60ca1b604482015290519081900360640190fd5b6001600160a01b0383166000908152600f602052604090206002015480821115611c5c57611c07601054611c028484614e15565b615325565b60108190556802b5e3af16b18800001015611c57576040805162461bcd60e51b815260206004820152600b60248201526a0f9b585e1515d95a59da1d60aa1b604482015290519081900360640190fd5b611c7d565b80821015611c7d57611c79601054611c748385614e15565b614e15565b6010555b6001600160a01b0384166000908152600f602052604090206002810183905560030180549084905580841115611cc657611cc18533611cbc8785614e15565b61536e565b611d1b565b80841015611d1b576000611cda8286614e15565b90506000611cea82600c54614e73565b9050611d008733611cfb8585614e15565b615159565b600754611d189088906001600160a01b031683615159565b50505b50506005805461ff0019169055505050565b336001600160a01b03166000356001600160e01b0319166001600160e01b03191660003660405180806020018281038252848482818152602001925080828437600083820152604051601f909101601f19169092018290039550909350505050a26007546001600160a01b03163314611dd8576040805162461bcd60e51b815260206004820152600860248201526721666163746f727960c01b604482015290519081900360640190fd5b6611c37937e08000811115611e20576040805162461bcd60e51b81526020600482015260096024820152683e6d6178436f46656560b81b604482015290519081900360640190fd5b600a54611e2e826002614e73565b1115611e6e576040805162461bcd60e51b815260206004820152600a6024820152691f39bbb0b82332b2979960b11b604482015290519081900360640190fd5b600b55565b600554600090610100900460ff1615611ebd576040805162461bcd60e51b81526020600482015260076024820152667265656e74727960c81b604482015290519081900360640190fd5b6005805461010061ff0019909116179055604080516020808252369082018190523392600080356001600160e01b0319169390929181908101848480828437600083820152604051601f909101601f19169092018290039550909350505050a2600d5460ff16611f61576040805162461bcd60e51b815260206004820152600a60248201526908599a5b985b1a5e995960b21b604482015290519081900360640190fd5b6001600160a01b0384166000908152600f602052604090205460ff16611fb7576040805162461bcd60e51b815260206004820152600660248201526508589bdd5b9960d21b604482015290519081900360640190fd5b6001600160a01b0384166000908152600f6020526040902060038101546002808301549054601054600a54600c54611ff495949392918a91612ef8565b915082821015612033576040805162461bcd60e51b81526020600482015260056024820152643c6c696d4f60d81b604482015290519081900360640190fd5b6001600160a01b0385166000908152600f6020526040902060039081015461206391670de0b6b3a7640000610ee9565b8211156120a2576040805162461bcd60e51b81526020600482015260086024820152670f9b585e13d4985d60c21b604482015290519081900360640190fd5b6120b0816003015483614e15565b816003018190555060006120c685600c54614e73565b6040805185815290519192506001600160a01b0388169133917fe74c91552b64c2e2e7bd255639e004e693bd3e1d01cc33e65610b86afcc1ffed919081900360200190a36121143386615029565b6121216110858683614e15565b600754612137906001600160a01b03168261514f565b612143308688866153c7565b93506121529050863385615159565b50506005805461ff00191690559392505050565b600554610100900460ff16156121ad576040805162461bcd60e51b81526020600482015260076024820152667265656e74727960c81b604482015290519081900360640190fd5b6005805461010061ff0019909116179055604080516020808252369082018190523392600080356001600160e01b0319169390929181908101848480828437600083820152604051601f909101601f19169092018290039550909350505050a2600d5460ff1615612251576040805162461bcd60e51b8152602060048201526009602482015268199a5b985b1a5e995960ba1b604482015290519081900360640190fd5b6008546001600160a01b0316331461229e576040805162461bcd60e51b815260206004820152600b60248201526a10b1b7b73a3937b63632b960a91b604482015290519081900360640190fd5b60088054911515600160a01b0260ff60a01b199092169190911790556005805461ff0019169055565b600554610100900460ff161561230e576040805162461bcd60e51b81526020600482015260076024820152667265656e74727960c81b604482015290519081900360640190fd5b6005805461010061ff0019909116179055604080516020808252369082018190523392600080356001600160e01b0319169390929181908101848480828437600083820152604051601f909101601f19169092018290039550909350505050a26008546001600160a01b031633146123bb576040805162461bcd60e51b815260206004820152600b60248201526a10b1b7b73a3937b63632b960a91b604482015290519081900360640190fd5b600d5460ff16156123ff576040805162461bcd60e51b8152602060048201526009602482015268199a5b985b1a5e995960ba1b604482015290519081900360640190fd5b600e5460021115612444576040805162461bcd60e51b815260206004820152600a6024820152693c6d696e546f6b656e7360b01b604482015290519081900360640190fd5b600d805460ff191660011790556008805460ff60a01b1916600160a01b1790556009546124709061554d565b61247c3360095461514f565b6005805461ff0019169055565b600554610100900460ff16156124d0576040805162461bcd60e51b81526020600482015260076024820152667265656e74727960c81b604482015290519081900360640190fd5b6005805461010061ff0019909116179055604080516020808252369082018190523392600080356001600160e01b0319169390929181908101848480828437600083820152604051601f909101601f19169092018290039550909350505050a2600d5460ff16612574576040805162461bcd60e51b815260206004820152600a60248201526908599a5b985b1a5e995960b21b604482015290519081900360640190fd5b600061257e611428565b9050600061258c8583614d0e565b9050806125cf576040805162461bcd60e51b815260206004820152600c60248201526b0cae4e49ac2e8d082e0e4def60a31b604482015290519081900360640190fd5b60005b600e54811015612747576000600e82815481106125eb57fe5b60009182526020808320909101546001600160a01b0316808352600f9091526040822060030154909250906126208583614e73565b905080612663576040805162461bcd60e51b815260206004820152600c60248201526b0cae4e49ac2e8d082e0e4def60a31b604482015290519081900360640190fd5b87878581811061266f57fe5b905060200201358111156126b3576040805162461bcd60e51b81526020600482015260066024820152651e3634b6a4b760d11b604482015290519081900360640190fd5b6001600160a01b0383166000908152600f60205260409020600301546126d99082615325565b6001600160a01b0384166000818152600f60209081526040918290206003019390935580518481529051919233927f63982df10efd8dfaaaa0fcc7f50b2d93b7cba26ccc48adee2873220d485dc39a9281900390910190a361273c83338361536e565b5050506001016125d2565b506127518561554d565b611d1b338661514f565b600a5481565b60065481565b6000806127748786614d0e565b905060006127828786615325565b905060006127908289614d0e565b905060006127a6670de0b6b3a764000085614d0e565b905060006127b48383614f2d565b905060006127c2828e614e73565b905060006127d0828f614e15565b905060006127ef6127e9670de0b6b3a76400008a614e15565b8b614e73565b905061280782610d00670de0b6b3a764000084614e15565b9f9e505050505050505050505050505050565b600554600090610100900460ff1615612864576040805162461bcd60e51b81526020600482015260076024820152667265656e74727960c81b604482015290519081900360640190fd5b6005805461010061ff0019909116179055604080516020808252369082018190523392600080356001600160e01b0319169390929181908101848480828437600083820152604051601f909101601f19169092018290039550909350505050a2600d5460ff16612908576040805162461bcd60e51b815260206004820152600a60248201526908599a5b985b1a5e995960b21b604482015290519081900360640190fd5b6001600160a01b0384166000908152600f602052604090205460ff1661295e576040805162461bcd60e51b815260206004820152600660248201526508589bdd5b9960d21b604482015290519081900360640190fd5b6001600160a01b0384166000908152600f6020526040902060030154612990906002670de0b6b3a76400005b04614e73565b8311156129cf576040805162461bcd60e51b81526020600482015260086024820152670f9b585e1254985d60c21b604482015290519081900360640190fd5b6001600160a01b0384166000908152600f6020526040902060038101546002808301549054601054600a54612a0994939291908990613916565b915082821015612a48576040805162461bcd60e51b81526020600482015260056024820152643c6c696d4f60d81b604482015290519081900360640190fd5b612a56816003015485615325565b60038201556040805185815290516001600160a01b0387169133917f63982df10efd8dfaaaa0fcc7f50b2d93b7cba26ccc48adee2873220d485dc39a9181900360200190a3612aa48261554d565b612aaf85338661536e565b6000612abd868630866153c7565b935090508015612adb57612ad5826003015482614e15565b60038301555b612152338461514f565b600c5481565b3360009081526001602090815260408083206001600160a01b038616845290915281205480831115612b40573360009081526001602090815260408083206001600160a01b0388168452909152812055612b6f565b612b4a8184614e15565b3360009081526001602090815260408083206001600160a01b03891684529091529020555b3360008181526001602090815260408083206001600160a01b038916808552908352928190205481519081529051929392600080516020615827833981519152929181900390910190a35060019392505050565b600554600090610100900460ff1615612c0d576040805162461bcd60e51b81526020600482015260076024820152667265656e74727960c81b604482015290519081900360640190fd5b6005805461010061ff0019909116179055604080516020808252369082018190523392600080356001600160e01b0319169390929181908101848480828437600083820152604051601f909101601f19169092018290039550909350505050a2600d5460ff16612cb1576040805162461bcd60e51b815260206004820152600a60248201526908599a5b985b1a5e995960b21b604482015290519081900360640190fd5b6001600160a01b0384166000908152600f602052604090205460ff16612d07576040805162461bcd60e51b815260206004820152600660248201526508589bdd5b9960d21b604482015290519081900360640190fd5b6001600160a01b0384166000908152600f6020526040902060038101546002808301549054601054600a54612d4194939291908990612767565b915081612d84576040805162461bcd60e51b815260206004820152600c60248201526b0cae4e49ac2e8d082e0e4def60a31b604482015290519081900360640190fd5b82821115612dc2576040805162461bcd60e51b81526020600482015260066024820152651e3634b6a4b760d11b604482015290519081900360640190fd5b6001600160a01b0385166000908152600f6020526040902060030154612df2906002670de0b6b3a764000061298a565b821115612e31576040805162461bcd60e51b81526020600482015260086024820152670f9b585e1254985d60c21b604482015290519081900360640190fd5b612e3f816003015483615325565b60038201556040805183815290516001600160a01b0387169133917f63982df10efd8dfaaaa0fcc7f50b2d93b7cba26ccc48adee2873220d485dc39a9181900360200190a3612e8d8461554d565b612e97338561514f565b612ea285338461536e565b6000612eae8684615037565b9050801561215257612ec4826003015482614e15565b600383015550506005805461ff00191690559392505050565b6001600160a01b031660009081526020819052604090205490565b600080612f058887614d0e565b90506000612f2486612f1f670de0b6b3a764000087614e15565b614e73565b90506000612f328983614e15565b90506000612f40828b614d0e565b90506000612f5f82612f5a670de0b6b3a764000088614d0e565b614f2d565b90506000612f6d828f614e73565b90506000612f7b8f83614e15565b90506000612f9a612f94670de0b6b3a76400008a614e15565b8c614e73565b9050612fb282612f1f670de0b6b3a764000084614e15565b98505050505050505050979650505050505050565b6005546000908190610100900460ff1615613013576040805162461bcd60e51b81526020600482015260076024820152667265656e74727960c81b604482015290519081900360640190fd5b6005805461010061ff0019909116179055604080516020808252369082018190523392600080356001600160e01b0319169390929181908101848480828437600083820152604051601f909101601f19169092018290039550909350505050a26001600160a01b0387166000908152600f602052604090205460ff166130c9576040805162461bcd60e51b815260206004820152600660248201526508589bdd5b9960d21b604482015290519081900360640190fd5b6001600160a01b0385166000908152600f602052604090205460ff1661311f576040805162461bcd60e51b815260206004820152600660248201526508589bdd5b9960d21b604482015290519081900360640190fd5b600854600160a01b900460ff1661316b576040805162461bcd60e51b815260206004820152600b60248201526a0217075626c6963537761760ac1b604482015290519081900360640190fd5b6001600160a01b038088166000908152600f6020526040808220928816825290206003808201546131a491670de0b6b3a7640000610ee9565b8611156131e3576040805162461bcd60e51b81526020600482015260086024820152670f9b585e13d4985d60c21b604482015290519081900360640190fd5b60006132048360030154846002015484600301548560020154600a54613dfd565b905085811115613249576040805162461bcd60e51b815260206004820152600b60248201526a6261644c696d507269636560a81b604482015290519081900360640190fd5b61326983600301548460020154846003015485600201548b600a54614c8b565b9450888511156132a9576040805162461bcd60e51b81526020600482015260066024820152651e3634b6a4b760d11b604482015290519081900360640190fd5b6132b7836003015486615325565b83600301819055506132cd826003015488614e15565b600380840182905584015460028086015490850154600a546132f0949190613dfd565b935080841015613336576040805162461bcd60e51b815260206004820152600c60248201526b0cae4e49ac2e8d082e0e4def60a31b604482015290519081900360640190fd5b85841115613377576040805162461bcd60e51b81526020600482015260096024820152683e6c696d507269636560b81b604482015290519081900360640190fd5b6133818588614d0e565b8111156133c4576040805162461bcd60e51b815260206004820152600c60248201526b0cae4e49ac2e8d082e0e4def60a31b604482015290519081900360640190fd5b876001600160a01b03168a6001600160a01b0316336001600160a01b03167f908fb5ee8f16c6bc9bc3690973819f32a4d4b10188134543c88706e0e1d43378888b604051808381526020018281526020019250505060405180910390a461342c8a338761536e565b613437883389615159565b60006134438b87615037565b9050801561345f57613459846003015482614e15565b60038501555b505050506005805461ff001916905590969095509350505050565b6005546000908190610100900460ff16156134c6576040805162461bcd60e51b81526020600482015260076024820152667265656e74727960c81b604482015290519081900360640190fd5b6005805461010061ff0019909116179055604080516020808252369082018190523392600080356001600160e01b0319169390929181908101848480828437600083820152604051601f909101601f19169092018290039550909350505050a26001600160a01b0387166000908152600f602052604090205460ff1661357c576040805162461bcd60e51b815260206004820152600660248201526508589bdd5b9960d21b604482015290519081900360640190fd5b6001600160a01b0385166000908152600f602052604090205460ff166135d2576040805162461bcd60e51b815260206004820152600660248201526508589bdd5b9960d21b604482015290519081900360640190fd5b600854600160a01b900460ff1661361e576040805162461bcd60e51b815260206004820152600b60248201526a0217075626c6963537761760ac1b604482015290519081900360640190fd5b6001600160a01b038088166000908152600f6020526040808220928816825290206003820154613658906002670de0b6b3a764000061298a565b881115613697576040805162461bcd60e51b81526020600482015260086024820152670f9b585e1254985d60c21b604482015290519081900360640190fd5b60006136b88360030154846002015484600301548560020154600a54613dfd565b9050858111156136fd576040805162461bcd60e51b815260206004820152600b60248201526a6261644c696d507269636560a81b604482015290519081900360640190fd5b61371d83600301548460020154846003015485600201548d600a5461419a565b94508685101561375c576040805162461bcd60e51b81526020600482015260056024820152643c6c696d4f60d81b604482015290519081900360640190fd5b61376a83600301548a615325565b8360030181905550613780826003015486614e15565b600380840182905584015460028086015490850154600a546137a3949190613dfd565b9350808410156137e9576040805162461bcd60e51b815260206004820152600c60248201526b0cae4e49ac2e8d082e0e4def60a31b604482015290519081900360640190fd5b8584111561382a576040805162461bcd60e51b81526020600482015260096024820152683e6c696d507269636560b81b604482015290519081900360640190fd5b6138348986614d0e565b811115613877576040805162461bcd60e51b815260206004820152600c60248201526b0cae4e49ac2e8d082e0e4def60a31b604482015290519081900360640190fd5b876001600160a01b03168a6001600160a01b0316336001600160a01b03167f908fb5ee8f16c6bc9bc3690973819f32a4d4b10188134543c88706e0e1d433788c89604051808381526020018281526020019250505060405180910390a46138df8a338b61536e565b60006138ed8b8b8b896153c7565b96509050801561390b57613905846003015482614e15565b60038501555b61345f893388615159565b6000806139238786614d0e565b9050600061394261393c670de0b6b3a764000084614e15565b85614e73565b9050600061395c86612f1f670de0b6b3a764000085614e15565b9050600061396a8b83615325565b90506000613978828d614d0e565b905060006139868287614f2d565b90506000613994828d614e73565b90506139a0818d614e15565b9e9d5050505050505050505050505050565b600854600160a01b900460ff1681565b336001600160a01b03166000356001600160e01b0319166001600160e01b03191660003660405180806020018281038252848482818152602001925080828437600083820152604051601f909101601f19169092018290039550909350505050a2600554610100900460ff1615613a6a576040805162461bcd60e51b81526020600482015260076024820152667265656e74727960c81b604482015290519081900360640190fd5b6005805461ff0019166101001790556001600160a01b0381166000908152600f602052604090205460ff16613acf576040805162461bcd60e51b815260206004820152600660248201526508589bdd5b9960d21b604482015290519081900360640190fd5b604080516370a0823160e01b815230600482015290516001600160a01b038316916370a08231916024808301926020929190829003018186803b158015613b1557600080fd5b505afa158015613b29573d6000803e3d6000fd5b505050506040513d6020811015613b3f57600080fd5b50516001600160a01b039091166000908152600f60205260409020600301556005805461ff0019169055565b600554610100900460ff1615613bb2576040805162461bcd60e51b81526020600482015260076024820152667265656e74727960c81b604482015290519081900360640190fd5b6005805461010061ff0019909116179055604080516020808252369082018190523392600080356001600160e01b0319169390929181908101848480828437600083820152604051601f909101601f19169092018290039550909350505050a26008546001600160a01b03163314613c5f576040805162461bcd60e51b815260206004820152600b60248201526a10b1b7b73a3937b63632b960a91b604482015290519081900360640190fd5b600880546001600160a01b0319166001600160a01b03929092169190911790556005805461ff0019169055565b600554600090610100900460ff1615613cd6576040805162461bcd60e51b81526020600482015260076024820152667265656e74727960c81b604482015290519081900360640190fd5b5060105490565b600554600090610100900460ff1615613d27576040805162461bcd60e51b81526020600482015260076024820152667265656e74727960c81b604482015290519081900360640190fd5b6001600160a01b0382166000908152600f602052604090205460ff16613d7d576040805162461bcd60e51b815260206004820152600660248201526508589bdd5b9960d21b604482015290519081900360640190fd5b506001600160a01b03166000908152600f602052604090206002015490565b60048054604080516020601f600260001961010060018816150201909516949094049384018190048102820181019092528281526060939092909183018282801561114c5780601f106111215761010080835404028352916020019161114c565b600080613e0a8787614d0e565b90506000613e188686614d0e565b90506000613e268383614d0e565b90506000613e48670de0b6b3a7640000610d00670de0b6b3a764000089614e15565b9050613e548282614e73565b9a9950505050505050505050565b6000613e6f338484615223565b50600192915050565b600554610100900460ff1615613ebf576040805162461bcd60e51b81526020600482015260076024820152667265656e74727960c81b604482015290519081900360640190fd5b6005805461010061ff0019909116179055604080516020808252369082018190523392600080356001600160e01b0319169390929181908101848480828437600083820152604051601f909101601f19169092018290039550909350505050a2600d5460ff16613f63576040805162461bcd60e51b815260206004820152600a60248201526908599a5b985b1a5e995960b21b604482015290519081900360640190fd5b6000613f6d611428565b90506000613f7d85600c54614e73565b90506000613f8b8683614e15565b90506000613f998285614d0e565b905080613fdc576040805162461bcd60e51b815260206004820152600c60248201526b0cae4e49ac2e8d082e0e4def60a31b604482015290519081900360640190fd5b613fe63388615029565b600754613ffc906001600160a01b03168461514f565b61400582615143565b60005b600e5481101561417c576000600e828154811061402157fe5b60009182526020808320909101546001600160a01b0316808352600f9091526040822060030154909250906140568583614e73565b905080614099576040805162461bcd60e51b815260206004820152600c60248201526b0cae4e49ac2e8d082e0e4def60a31b604482015290519081900360640190fd5b8989858181106140a557fe5b905060200201358110156140e8576040805162461bcd60e51b81526020600482015260056024820152643c6c696d4f60d81b604482015290519081900360640190fd5b6001600160a01b0383166000908152600f602052604090206003015461410e9082614e15565b6001600160a01b0384166000818152600f60209081526040918290206003019390935580518481529051919233927fe74c91552b64c2e2e7bd255639e004e693bd3e1d01cc33e65610b86afcc1ffed9281900390910190a3614171833383615159565b505050600101614008565b50506005805461ff0019169055505050505050565b600d5460ff1681565b6000806141a78786614d0e565b905060006141bd670de0b6b3a764000085614e15565b90506141c98582614e73565b905060006141db8a610d008c85615325565b905060006141e98285614f2d565b905060006141ff670de0b6b3a764000083614e15565b905061420b8a82614e73565b9c9b505050505050505050505050565b600554606090610100900460ff1615614265576040805162461bcd60e51b81526020600482015260076024820152667265656e74727960c81b604482015290519081900360640190fd5b600d5460ff166142a9576040805162461bcd60e51b815260206004820152600a60248201526908599a5b985b1a5e995960b21b604482015290519081900360640190fd5b600e80548060200260200160405190810160405280929190818152602001828054801561114c57602002820191906000526020600020905b81546001600160a01b031681526001909101906020018083116142e1575050505050905090565b6007546001600160a01b031681565b600554606090610100900460ff16156142a9576040805162461bcd60e51b81526020600482015260076024820152667265656e74727960c81b604482015290519081900360640190fd5b600e5490565b600554610100900460ff16156143ae576040805162461bcd60e51b81526020600482015260076024820152667265656e74727960c81b604482015290519081900360640190fd5b6005805461010061ff0019909116179055604080516020808252369082018190523392600080356001600160e01b0319169390929181908101848480828437600083820152604051601f909101601f19169092018290039550909350505050a26008546001600160a01b0316331461445b576040805162461bcd60e51b815260206004820152600b60248201526a10b1b7b73a3937b63632b960a91b604482015290519081900360640190fd5b6001600160a01b0381166000908152600f602052604090205460ff166144b1576040805162461bcd60e51b815260206004820152600660248201526508589bdd5b9960d21b604482015290519081900360640190fd5b600d5460ff16156144f5576040805162461bcd60e51b8152602060048201526009602482015268199a5b985b1a5e995960ba1b604482015290519081900360640190fd5b6001600160a01b0381166000908152600f6020526040812060030154600c54909190614522908390614e73565b6010546001600160a01b0385166000908152600f602052604090206002015491925061454d91614e15565b6010556001600160a01b0383166000908152600f6020526040902060010154600e8054600019810191908290811061458157fe5b600091825260209091200154600e80546001600160a01b0390921691849081106145a757fe5b9060005260206000200160006101000a8154816001600160a01b0302191690836001600160a01b0316021790555081600f6000600e85815481106145e757fe5b60009182526020808320909101546001600160a01b03168352820192909252604001902060010155600e80548061461a57fe5b60008281526020808220600019908401810180546001600160a01b031916905590920190925560408051608081018252838152808301848152818301858152606083018681526001600160a01b038c168752600f909552929094209051815460ff191690151517815592516001840155516002830155516003909101556146a68533611cfb8787614e15565b600754611d1b9086906001600160a01b031685615159565b3360009081526001602090815260408083206001600160a01b03861684529091528120546146ec9083615325565b3360008181526001602090815260408083206001600160a01b038916808552908352928190208590558051948552519193600080516020615827833981519152929081900390910190a350600192915050565b6001600160a01b03918216600090815260016020908152604080832093909416825291909152205490565b336001600160a01b03166000356001600160e01b0319166001600160e01b03191660003660405180806020018281038252848482818152602001925080828437600083820152604051601f909101601f19169092018290039550909350505050a26008546001600160a01b03163314614818576040805162461bcd60e51b815260206004820152600b60248201526a10b1b7b73a3937b63632b960a91b604482015290519081900360640190fd5b6001600160a01b0383166000908152600f602052604090205460ff161561486e576040805162461bcd60e51b8152602060048201526005602482015264189bdd5b9960da1b604482015290519081900360640190fd5b600d5460ff16156148b2576040805162461bcd60e51b8152602060048201526009602482015268199a5b985b1a5e995960ba1b604482015290519081900360640190fd5b600e546008116148f6576040805162461bcd60e51b815260206004820152600a6024820152693e6d6178546f6b656e7360b01b604482015290519081900360640190fd5b604080516080810182526001808252600e805460208085019182526000858701818152606087018281526001600160a01b038c16808452600f9094529782209651875460ff1916901515178755925186860155915160028601559451600390940193909355805491820181559091527fbb7b4a454dc3493923482f07822329ed19e8244eff582cc204f8554c3620c3fd0180546001600160a01b03191690911790556149a3838383611969565b505050565b336001600160a01b03166000356001600160e01b0319166001600160e01b03191660003660405180806020018281038252848482818152602001925080828437600083820152604051601f909101601f19169092018290039550909350505050a2600d5460ff1615614a4d576040805162461bcd60e51b8152602060048201526009602482015268199a5b985b1a5e995960ba1b604482015290519081900360640190fd5b6007546001600160a01b03163314614a97576040805162461bcd60e51b815260206004820152600860248201526721666163746f727960c01b604482015290519081900360640190fd5b66038d7ea4c68000811115614ae1576040805162461bcd60e51b815260206004820152600b60248201526a3e6d61784578697446656560a81b604482015290519081900360640190fd5b600c55565b600b5481565b600554600090610100900460ff1615614b36576040805162461bcd60e51b81526020600482015260076024820152667265656e74727960c81b604482015290519081900360640190fd5b6001600160a01b0382166000908152600f602052604090205460ff16614b8c576040805162461bcd60e51b815260206004820152600660248201526508589bdd5b9960d21b604482015290519081900360640190fd5b6001600160a01b0382166000908152600f6020526040902060020154601054614bb6908290614d0e565b9392505050565b6008546001600160a01b031681565b600554600090610100900460ff1615614c16576040805162461bcd60e51b81526020600482015260076024820152667265656e74727960c81b604482015290519081900360640190fd5b6001600160a01b0382166000908152600f602052604090205460ff16614c6c576040805162461bcd60e51b815260206004820152600660248201526508589bdd5b9960d21b604482015290519081900360640190fd5b506001600160a01b03166000908152600f602052604090206003015490565b600080614c988588614d0e565b90506000614ca68786614e15565b90506000614cb48883614d0e565b90506000614cc28285614f2d565b9050614cd681670de0b6b3a7640000614e15565b9050614cea670de0b6b3a764000087614e15565b9450614cff614cf98c83614e73565b86614d0e565b9b9a5050505050505050505050565b600081614d4d576040805162461bcd60e51b8152602060048201526008602482015267064697620627920360c41b604482015290519081900360640190fd5b670de0b6b3a76400008302831580614d755750670de0b6b3a7640000848281614d7257fe5b04145b614db5576040805162461bcd60e51b815260206004820152600c60248201526b191a5d881a5b9d195c9b985b60a21b604482015290519081900360640190fd5b60028304810181811015614dff576040805162461bcd60e51b815260206004820152600c60248201526b191a5d881a5b9d195c9b985b60a21b604482015290519081900360640190fd5b6000848281614e0a57fe5b049695505050505050565b6000806000614e248585615556565b915091508015614e6b576040805162461bcd60e51b815260206004820152600d60248201526c73756220756e646572666c6f7760981b604482015290519081900360640190fd5b509392505050565b6000828202831580614e8d575082848281614e8a57fe5b04145b614ecd576040805162461bcd60e51b815260206004820152600c60248201526b6d756c206f766572666c6f7760a01b604482015290519081900360640190fd5b6706f05b59d3b20000810181811015614f1c576040805162461bcd60e51b815260206004820152600c60248201526b6d756c206f766572666c6f7760a01b604482015290519081900360640190fd5b6000670de0b6b3a764000082614e0a565b60006001831015614f74576040805162461bcd60e51b815260206004820152600c60248201526b6261736520746f6f206c6f7760a01b604482015290519081900360640190fd5b671bc16d674ec7ffff831115614fc1576040805162461bcd60e51b815260206004820152600d60248201526c0c4c2e6ca40e8dede40d0d2ced609b1b604482015290519081900360640190fd5b6000614fcc8361557b565b90506000614fda8483614e15565b90506000614ff086614feb85615596565b6155a4565b9050816150015792506111a5915050565b600061501287846305f5e1006155fb565b905061501e8282614e73565b979650505050505050565b61503382826156d9565b5050565b600b54600090156111a557600754604080516374b1330b60e11b815290516000926001600160a01b03169163e9626616916004808301926020929190829003018186803b15801561508757600080fd5b505afa15801561509b573d6000803e3d6000fd5b505050506040513d60208110156150b157600080fd5b505190506001600160a01b0381161561513c576150e16150d384600b54614e73565b670de0b6b3a7640000614d0e565b6007549092506150fc9085906001600160a01b031684615159565b6040805183815290516001600160a01b038616917faa299fc96f84481838321cf4ac49861748dc206dd9101e1b8ed3f34bb88cadbd919081900360200190a25b5092915050565b61514c816156e4565b50565b61503382826157a6565b6000836001600160a01b031663a9059cbb84846040518363ffffffff1660e01b815260040180836001600160a01b0316815260200182815260200192505050602060405180830381600087803b1580156151b257600080fd5b505af11580156151c6573d6000803e3d6000fd5b505050506040513d60208110156151dc57600080fd5b505190508061521d576040805162461bcd60e51b8152602060048201526008602482015267065727245726332360c41b604482015290519081900360640190fd5b50505050565b6001600160a01b038316600090815260208190526040902054811115615279576040805162461bcd60e51b815260206004808301919091526024820152630858985b60e21b604482015290519081900360640190fd5b6001600160a01b03831660009081526020819052604090205461529c9082614e15565b6001600160a01b0380851660009081526020819052604080822093909355908416815220546152cb9082615325565b6001600160a01b038084166000818152602081815260409182902094909455805185815290519193928716927fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef92918290030190a3505050565b600082820183811015614bb6576040805162461bcd60e51b815260206004820152600c60248201526b616464206f766572666c6f7760a01b604482015290519081900360640190fd5b604080516323b872dd60e01b81526001600160a01b0384811660048301523060248301526044820184905291516000928616916323b872dd91606480830192602092919082900301818787803b1580156151b257600080fd5b600b5460009082901561554457600754604080516374b1330b60e11b815290516000926001600160a01b03169163e9626616916004808301926020929190829003018186803b15801561541957600080fd5b505afa15801561542d573d6000803e3d6000fd5b505050506040513d602081101561544357600080fd5b505190506001600160a01b0380821690881614156154c95761546a6150d387600b54614e73565b6007549093506154859088906001600160a01b031685615159565b6040805184815290516001600160a01b038916917faa299fc96f84481838321cf4ac49861748dc206dd9101e1b8ed3f34bb88cadbd919081900360200190a2615542565b60006154da6150d386600b54614e73565b6007549091506154f59087906001600160a01b031683615159565b6154ff8582614e15565b6040805183815290519194506001600160a01b038816917faa299fc96f84481838321cf4ac49861748dc206dd9101e1b8ed3f34bb88cadbd9181900360200190a2505b505b94509492505050565b61514c816157b1565b60008082841061556c5750508082036000615574565b505081810360015b9250929050565b6000670de0b6b3a764000061558f83615596565b0292915050565b670de0b6b3a7640000900490565b600080600283066155bd57670de0b6b3a76400006155bf565b835b90506002830492505b8215614bb6576155d88485614e73565b935060028306156155f0576155ed8185614e73565b90505b6002830492506155c8565b600082818061561287670de0b6b3a7640000615556565b9092509050670de0b6b3a764000080600060015b8884106156ca576000670de0b6b3a76400008202905060008061565a8a61565585670de0b6b3a7640000614e15565b615556565b9150915061566c87612f1f848c614e73565b96506156788784614d0e565b965086615687575050506156ca565b8715615691579315935b801561569b579315935b84156156b2576156ab8688614e15565b95506156bf565b6156bc8688615325565b95505b505050600101615626565b50909998505050505050505050565b615033823083615223565b30600090815260208190526040902054811115615731576040805162461bcd60e51b815260206004808301919091526024820152630858985b60e21b604482015290519081900360640190fd5b3060009081526020819052604090205461574b9082614e15565b306000908152602081905260409020556002546157689082614e15565b60025560408051828152905160009130917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9181900360200190a350565b615033308383615223565b306000908152602081905260409020546157cb9082615325565b306000908152602081905260409020556002546157e89082615325565b60025560408051828152905130916000917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9181900360200190a35056fe8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925a26469706673582212204814ffc3fcf8d3e48bc307a87a7d058f3ac272a5642097cdb240483f9938a32564736f6c634300060c0033000000000000000000000000ebc44681c125d63210a33d30c55fd3d37762675b

Deployed Bytecode

0x608060405234801561001057600080fd5b50600436106103785760003560e01c80637c5e9ea4116101d3578063be3bbd2e11610104578063e4e1e538116100a2578063f1b8a9b71161007c578063f1b8a9b714610c26578063f77c479114610c4c578063f8b2cb4f14610c54578063f8d6aed414610c7a57610378565b8063e4e1e53814610bcf578063e5a583a914610c01578063e811f50a14610c1e57610378565b8063cd2ed8fb116100de578063cd2ed8fb14610b47578063cf5e7bd314610b4f578063d73dd62314610b75578063dd62ed3e14610ba157610378565b8063be3bbd2e14610ac3578063c45a015514610b1b578063cc77828d14610b3f57610378565b8063948d8ce611610171578063a9059cbb1161014b578063a9059cbb146109dd578063b02f0b7314610a09578063b3f05b9714610a80578063ba9530a614610a8857610378565b8063948d8ce61461097a57806395d89b41146109a0578063a221ee49146109a857610378565b80638c0ba32f116101ad5780638c0ba32f1461091e5780638c28cbe81461092657806392eefe9b1461094c578063936c34771461097257610378565b80637c5e9ea41461084a5780638201aa3f146108a35780638656b653146108e357610378565b8063429b4ae6116102ad5780635c1bbaf71161024b578063661884631161022557806366188463146107855780636d06dfa0146107b157806370a08231146107e357806379104ea61461080957610378565b80635c1bbaf7146107105780635db342771461074b5780636284ae411461077d57610378565b80634bb278f3116102875780634bb278f3146106815780634f69c0d41461068957806354cf2aeb1461070057806354fd4d501461070857610378565b8063429b4ae61461061357806346ab38f11461063057806349b595521461066257610378565b80631e1f761b1161031a5780632f37b624116102f45780632f37b62414610580578063313ce567146105a657806334e19907146105c45780633fdddaa2146105e157610378565b80631e1f761b1461052357806323b872dd1461052b5780632da778bc1461056157610378565b8063095ea7b311610356578063095ea7b31461047f5780631446a7ff146104bf57806315e84af9146104ed57806318160ddd1461051b57610378565b8063024eb2e31461037d57806302c96748146103d057806306fdde0314610402575b600080fd5b6103be600480360360e081101561039357600080fd5b5080359060208101359060408101359060608101359060808101359060a08101359060c00135610cb5565b60408051918252519081900360200190f35b6103be600480360360608110156103e657600080fd5b506001600160a01b038135169060208101359060400135610d79565b61040a6110c0565b6040805160208082528351818301528351919283929083019185019080838360005b8381101561044457818101518382015260200161042c565b50505050905090810190601f1680156104715780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b6104ab6004803603604081101561049557600080fd5b506001600160a01b038135169060200135611156565b604080519115158252519081900360200190f35b6103be600480360360408110156104d557600080fd5b506001600160a01b03813581169160200135166111ab565b6103be6004803603604081101561050357600080fd5b506001600160a01b03813581169160200135166112ee565b6103be611428565b6103be61142e565b6104ab6004803603606081101561054157600080fd5b506001600160a01b03813581169160208101359091169060400135611434565b61057e6004803603602081101561057757600080fd5b5035611581565b005b6104ab6004803603602081101561059657600080fd5b50356001600160a01b031661171c565b6105ae61173a565b6040805160ff9092168252519081900360200190f35b61057e600480360360208110156105da57600080fd5b5035611743565b61057e600480360360608110156105f757600080fd5b506001600160a01b038135169060208101359060400135611969565b61057e6004803603602081101561062957600080fd5b5035611d2d565b6103be6004803603606081101561064657600080fd5b506001600160a01b038135169060208101359060400135611e73565b61057e6004803603602081101561067857600080fd5b50351515612166565b61057e6122c7565b61057e6004803603604081101561069f57600080fd5b813591908101906040810160208201356401000000008111156106c157600080fd5b8201836020820111156106d357600080fd5b803590602001918460208302840111640100000000831117156106f557600080fd5b509092509050612489565b6103be61275b565b6103be612761565b6103be600480360360c081101561072657600080fd5b5080359060208101359060408101359060608101359060808101359060a00135612767565b6103be6004803603606081101561076157600080fd5b506001600160a01b03813516906020810135906040013561281a565b6103be612ae5565b6104ab6004803603604081101561079b57600080fd5b506001600160a01b038135169060200135612aeb565b6103be600480360360608110156107c757600080fd5b506001600160a01b038135169060208101359060400135612bc3565b6103be600480360360208110156107f957600080fd5b50356001600160a01b0316612edd565b6103be600480360360e081101561081f57600080fd5b5080359060208101359060408101359060608101359060808101359060a08101359060c00135612ef8565b61088a600480360360a081101561086057600080fd5b506001600160a01b0381358116916020810135916040820135169060608101359060800135612fc7565b6040805192835260208301919091528051918290030190f35b61088a600480360360a08110156108b957600080fd5b506001600160a01b038135811691602081013591604082013516906060810135906080013561347a565b6103be600480360360c08110156108f957600080fd5b5080359060208101359060408101359060608101359060808101359060a00135613916565b6104ab6139b2565b61057e6004803603602081101561093c57600080fd5b50356001600160a01b03166139c2565b61057e6004803603602081101561096257600080fd5b50356001600160a01b0316613b6b565b6103be613c8c565b6103be6004803603602081101561099057600080fd5b50356001600160a01b0316613cdd565b61040a613d9c565b6103be600480360360a08110156109be57600080fd5b5080359060208101359060408101359060608101359060800135613dfd565b6104ab600480360360408110156109f357600080fd5b506001600160a01b038135169060200135613e62565b61057e60048036036040811015610a1f57600080fd5b81359190810190604081016020820135640100000000811115610a4157600080fd5b820183602082011115610a5357600080fd5b80359060200191846020830284011164010000000083111715610a7557600080fd5b509092509050613e78565b6104ab614191565b6103be600480360360c0811015610a9e57600080fd5b5080359060208101359060408101359060608101359060808101359060a0013561419a565b610acb61421b565b60408051602080825283518183015283519192839290830191858101910280838360005b83811015610b07578181015183820152602001610aef565b505050509050019250505060405180910390f35b610b23614308565b604080516001600160a01b039092168252519081900360200190f35b610acb614317565b6103be614361565b61057e60048036036020811015610b6557600080fd5b50356001600160a01b0316614367565b6104ab60048036036040811015610b8b57600080fd5b506001600160a01b0381351690602001356146be565b6103be60048036036040811015610bb757600080fd5b506001600160a01b038135811691602001351661473f565b61057e60048036036060811015610be557600080fd5b506001600160a01b03813516906020810135906040013561476a565b61057e60048036036020811015610c1757600080fd5b50356149a8565b6103be614ae6565b6103be60048036036020811015610c3c57600080fd5b50356001600160a01b0316614aec565b610b23614bbd565b6103be60048036036020811015610c6a57600080fd5b50356001600160a01b0316614bcc565b6103be600480360360c0811015610c9057600080fd5b5080359060208101359060408101359060608101359060808101359060a00135614c8b565b600080610cc28887614d0e565b90506000610cd8670de0b6b3a764000083614e15565b90506000610ce68287614e73565b90506000610d0588610d00670de0b6b3a764000085614e15565b614d0e565b90506000610d138d83614e15565b90506000610d21828f614d0e565b90506000610d2f8288614f2d565b90506000610d3d828f614e73565b90506000610d4b8f83614e15565b9050610d6381610d00670de0b6b3a76400008e614e15565b9950505050505050505050979650505050505050565b600554600090610100900460ff1615610dc3576040805162461bcd60e51b81526020600482015260076024820152667265656e74727960c81b604482015290519081900360640190fd5b6005805461010061ff0019909116179055604080516020808252369082018190523392600080356001600160e01b0319169390929181908101848480828437600083820152604051601f909101601f19169092018290039550909350505050a2600d5460ff16610e67576040805162461bcd60e51b815260206004820152600a60248201526908599a5b985b1a5e995960b21b604482015290519081900360640190fd5b6001600160a01b0384166000908152600f602052604090205460ff16610ebd576040805162461bcd60e51b815260206004820152600660248201526508589bdd5b9960d21b604482015290519081900360640190fd5b6001600160a01b0384166000908152600f60205260409020600390810154610ef291670de0b6b3a76400005b04600101614e73565b831115610f31576040805162461bcd60e51b81526020600482015260086024820152670f9b585e13d4985d60c21b604482015290519081900360640190fd5b6001600160a01b0384166000908152600f6020526040902060038101546002808301549054601054600a54600c54610f6e95949392918a91610cb5565b915081610fb1576040805162461bcd60e51b815260206004820152600c60248201526b0cae4e49ac2e8d082e0e4def60a31b604482015290519081900360640190fd5b82821115610fef576040805162461bcd60e51b81526020600482015260066024820152651e3634b6a4b760d11b604482015290519081900360640190fd5b610ffd816003015485614e15565b8160030181905550600061101383600c54614e73565b6040805187815290519192506001600160a01b0388169133917fe74c91552b64c2e2e7bd255639e004e693bd3e1d01cc33e65610b86afcc1ffed919081900360200190a36110613384615029565b600061106d3085615037565b905061108a61108561107f8685614e15565b83614e15565b615143565b6007546110a0906001600160a01b03168361514f565b6110ab873388615159565b5050506005805461ff00191690559392505050565b60038054604080516020601f600260001961010060018816150201909516949094049384018190048102820181019092528281526060939092909183018282801561114c5780601f106111215761010080835404028352916020019161114c565b820191906000526020600020905b81548152906001019060200180831161112f57829003601f168201915b5050505050905090565b3360008181526001602090815260408083206001600160a01b03871680855290835281842086905581518681529151939490939092600080516020615827833981519152928290030190a35060015b92915050565b600554600090610100900460ff16156111f5576040805162461bcd60e51b81526020600482015260076024820152667265656e74727960c81b604482015290519081900360640190fd5b6001600160a01b0383166000908152600f602052604090205460ff1661124b576040805162461bcd60e51b815260206004820152600660248201526508589bdd5b9960d21b604482015290519081900360640190fd5b6001600160a01b0382166000908152600f602052604090205460ff166112a1576040805162461bcd60e51b815260206004820152600660248201526508589bdd5b9960d21b604482015290519081900360640190fd5b6001600160a01b038084166000908152600f602052604080822092851682528120600380840154600280860154928401549084015493946112e59492939290613dfd565b95945050505050565b600554600090610100900460ff1615611338576040805162461bcd60e51b81526020600482015260076024820152667265656e74727960c81b604482015290519081900360640190fd5b6001600160a01b0383166000908152600f602052604090205460ff1661138e576040805162461bcd60e51b815260206004820152600660248201526508589bdd5b9960d21b604482015290519081900360640190fd5b6001600160a01b0382166000908152600f602052604090205460ff166113e4576040805162461bcd60e51b815260206004820152600660248201526508589bdd5b9960d21b604482015290519081900360640190fd5b6001600160a01b038084166000908152600f6020526040808220928516825290206003808301546002808501549284015490840154600a546112e594929190613dfd565b60025490565b60095481565b6000336001600160a01b038516148061147057506001600160a01b03841660009081526001602090815260408083203384529091529020548211155b6114ac576040805162461bcd60e51b815260206004820152600860248201526710b9b832b73232b960c11b604482015290519081900360640190fd5b6114b7848484615223565b336001600160a01b038516148015906114f557506001600160a01b038416600090815260016020908152604080832033845290915290205460001914155b15611577576001600160a01b03841660009081526001602090815260408083203384529091529020546115289083614e15565b6001600160a01b03858116600090815260016020908152604080832033808552908352928190208590558051948552519287169391926000805160206158278339815191529281900390910190a35b5060019392505050565b336001600160a01b03166000356001600160e01b0319166001600160e01b03191660003660405180806020018281038252848482818152602001925080828437600083820152604051601f909101601f19169092018290039550909350505050a2600d5460ff1615611626576040805162461bcd60e51b8152602060048201526009602482015268199a5b985b1a5e995960ba1b604482015290519081900360640190fd5b6008546001600160a01b03163314611673576040805162461bcd60e51b815260206004820152600b60248201526a10b1b7b73a3937b63632b960a91b604482015290519081900360640190fd5b66038d7ea4c680008110156116c1576040805162461bcd60e51b815260206004820152600f60248201526e03c6d696e496e6974506f6f6c53757608c1b604482015290519081900360640190fd5b6ec097ce7bc90715b34b9f1000000000811115611717576040805162461bcd60e51b815260206004820152600f60248201526e03e6d6178496e6974506f6f6c53757608c1b604482015290519081900360640190fd5b600955565b6001600160a01b03166000908152600f602052604090205460ff1690565b60055460ff1690565b600554610100900460ff161561178a576040805162461bcd60e51b81526020600482015260076024820152667265656e74727960c81b604482015290519081900360640190fd5b6005805461010061ff0019909116179055604080516020808252369082018190523392600080356001600160e01b0319169390929181908101848480828437600083820152604051601f909101601f19169092018290039550909350505050a2600d5460ff161561182e576040805162461bcd60e51b8152602060048201526009602482015268199a5b985b1a5e995960ba1b604482015290519081900360640190fd5b6008546001600160a01b0316331461187b576040805162461bcd60e51b815260206004820152600b60248201526a10b1b7b73a3937b63632b960a91b604482015290519081900360640190fd5b64e8d4a510008110156118bf576040805162461bcd60e51b81526020600482015260076024820152663c6d696e46656560c81b604482015290519081900360640190fd5b67016345785d8a0000811115611906576040805162461bcd60e51b81526020600482015260076024820152663e6d617846656560c81b604482015290519081900360640190fd5b80611914600b546002614e73565b1115611959576040805162461bcd60e51b815260206004820152600f60248201526e1e31b7b63632b1ba32b22332b2951960891b604482015290519081900360640190fd5b600a556005805461ff0019169055565b600554610100900460ff16156119b0576040805162461bcd60e51b81526020600482015260076024820152667265656e74727960c81b604482015290519081900360640190fd5b6005805461010061ff0019909116179055604080516020808252369082018190523392600080356001600160e01b0319169390929181908101848480828437600083820152604051601f909101601f19169092018290039550909350505050a26008546001600160a01b03163314611a5d576040805162461bcd60e51b815260206004820152600b60248201526a10b1b7b73a3937b63632b960a91b604482015290519081900360640190fd5b6001600160a01b0383166000908152600f602052604090205460ff16611ab3576040805162461bcd60e51b815260206004820152600660248201526508589bdd5b9960d21b604482015290519081900360640190fd5b600d5460ff1615611af7576040805162461bcd60e51b8152602060048201526009602482015268199a5b985b1a5e995960ba1b604482015290519081900360640190fd5b670de0b6b3a7640000811015611b41576040805162461bcd60e51b815260206004820152600a6024820152690f1b5a5b95d95a59da1d60b21b604482015290519081900360640190fd5b6802b5e3af16b1880000811115611b8c576040805162461bcd60e51b815260206004820152600a6024820152690f9b585e15d95a59da1d60b21b604482015290519081900360640190fd5b620f4240821015611bce576040805162461bcd60e51b81526020600482015260076024820152660f1b5a5b90985b60ca1b604482015290519081900360640190fd5b6001600160a01b0383166000908152600f602052604090206002015480821115611c5c57611c07601054611c028484614e15565b615325565b60108190556802b5e3af16b18800001015611c57576040805162461bcd60e51b815260206004820152600b60248201526a0f9b585e1515d95a59da1d60aa1b604482015290519081900360640190fd5b611c7d565b80821015611c7d57611c79601054611c748385614e15565b614e15565b6010555b6001600160a01b0384166000908152600f602052604090206002810183905560030180549084905580841115611cc657611cc18533611cbc8785614e15565b61536e565b611d1b565b80841015611d1b576000611cda8286614e15565b90506000611cea82600c54614e73565b9050611d008733611cfb8585614e15565b615159565b600754611d189088906001600160a01b031683615159565b50505b50506005805461ff0019169055505050565b336001600160a01b03166000356001600160e01b0319166001600160e01b03191660003660405180806020018281038252848482818152602001925080828437600083820152604051601f909101601f19169092018290039550909350505050a26007546001600160a01b03163314611dd8576040805162461bcd60e51b815260206004820152600860248201526721666163746f727960c01b604482015290519081900360640190fd5b6611c37937e08000811115611e20576040805162461bcd60e51b81526020600482015260096024820152683e6d6178436f46656560b81b604482015290519081900360640190fd5b600a54611e2e826002614e73565b1115611e6e576040805162461bcd60e51b815260206004820152600a6024820152691f39bbb0b82332b2979960b11b604482015290519081900360640190fd5b600b55565b600554600090610100900460ff1615611ebd576040805162461bcd60e51b81526020600482015260076024820152667265656e74727960c81b604482015290519081900360640190fd5b6005805461010061ff0019909116179055604080516020808252369082018190523392600080356001600160e01b0319169390929181908101848480828437600083820152604051601f909101601f19169092018290039550909350505050a2600d5460ff16611f61576040805162461bcd60e51b815260206004820152600a60248201526908599a5b985b1a5e995960b21b604482015290519081900360640190fd5b6001600160a01b0384166000908152600f602052604090205460ff16611fb7576040805162461bcd60e51b815260206004820152600660248201526508589bdd5b9960d21b604482015290519081900360640190fd5b6001600160a01b0384166000908152600f6020526040902060038101546002808301549054601054600a54600c54611ff495949392918a91612ef8565b915082821015612033576040805162461bcd60e51b81526020600482015260056024820152643c6c696d4f60d81b604482015290519081900360640190fd5b6001600160a01b0385166000908152600f6020526040902060039081015461206391670de0b6b3a7640000610ee9565b8211156120a2576040805162461bcd60e51b81526020600482015260086024820152670f9b585e13d4985d60c21b604482015290519081900360640190fd5b6120b0816003015483614e15565b816003018190555060006120c685600c54614e73565b6040805185815290519192506001600160a01b0388169133917fe74c91552b64c2e2e7bd255639e004e693bd3e1d01cc33e65610b86afcc1ffed919081900360200190a36121143386615029565b6121216110858683614e15565b600754612137906001600160a01b03168261514f565b612143308688866153c7565b93506121529050863385615159565b50506005805461ff00191690559392505050565b600554610100900460ff16156121ad576040805162461bcd60e51b81526020600482015260076024820152667265656e74727960c81b604482015290519081900360640190fd5b6005805461010061ff0019909116179055604080516020808252369082018190523392600080356001600160e01b0319169390929181908101848480828437600083820152604051601f909101601f19169092018290039550909350505050a2600d5460ff1615612251576040805162461bcd60e51b8152602060048201526009602482015268199a5b985b1a5e995960ba1b604482015290519081900360640190fd5b6008546001600160a01b0316331461229e576040805162461bcd60e51b815260206004820152600b60248201526a10b1b7b73a3937b63632b960a91b604482015290519081900360640190fd5b60088054911515600160a01b0260ff60a01b199092169190911790556005805461ff0019169055565b600554610100900460ff161561230e576040805162461bcd60e51b81526020600482015260076024820152667265656e74727960c81b604482015290519081900360640190fd5b6005805461010061ff0019909116179055604080516020808252369082018190523392600080356001600160e01b0319169390929181908101848480828437600083820152604051601f909101601f19169092018290039550909350505050a26008546001600160a01b031633146123bb576040805162461bcd60e51b815260206004820152600b60248201526a10b1b7b73a3937b63632b960a91b604482015290519081900360640190fd5b600d5460ff16156123ff576040805162461bcd60e51b8152602060048201526009602482015268199a5b985b1a5e995960ba1b604482015290519081900360640190fd5b600e5460021115612444576040805162461bcd60e51b815260206004820152600a6024820152693c6d696e546f6b656e7360b01b604482015290519081900360640190fd5b600d805460ff191660011790556008805460ff60a01b1916600160a01b1790556009546124709061554d565b61247c3360095461514f565b6005805461ff0019169055565b600554610100900460ff16156124d0576040805162461bcd60e51b81526020600482015260076024820152667265656e74727960c81b604482015290519081900360640190fd5b6005805461010061ff0019909116179055604080516020808252369082018190523392600080356001600160e01b0319169390929181908101848480828437600083820152604051601f909101601f19169092018290039550909350505050a2600d5460ff16612574576040805162461bcd60e51b815260206004820152600a60248201526908599a5b985b1a5e995960b21b604482015290519081900360640190fd5b600061257e611428565b9050600061258c8583614d0e565b9050806125cf576040805162461bcd60e51b815260206004820152600c60248201526b0cae4e49ac2e8d082e0e4def60a31b604482015290519081900360640190fd5b60005b600e54811015612747576000600e82815481106125eb57fe5b60009182526020808320909101546001600160a01b0316808352600f9091526040822060030154909250906126208583614e73565b905080612663576040805162461bcd60e51b815260206004820152600c60248201526b0cae4e49ac2e8d082e0e4def60a31b604482015290519081900360640190fd5b87878581811061266f57fe5b905060200201358111156126b3576040805162461bcd60e51b81526020600482015260066024820152651e3634b6a4b760d11b604482015290519081900360640190fd5b6001600160a01b0383166000908152600f60205260409020600301546126d99082615325565b6001600160a01b0384166000818152600f60209081526040918290206003019390935580518481529051919233927f63982df10efd8dfaaaa0fcc7f50b2d93b7cba26ccc48adee2873220d485dc39a9281900390910190a361273c83338361536e565b5050506001016125d2565b506127518561554d565b611d1b338661514f565b600a5481565b60065481565b6000806127748786614d0e565b905060006127828786615325565b905060006127908289614d0e565b905060006127a6670de0b6b3a764000085614d0e565b905060006127b48383614f2d565b905060006127c2828e614e73565b905060006127d0828f614e15565b905060006127ef6127e9670de0b6b3a76400008a614e15565b8b614e73565b905061280782610d00670de0b6b3a764000084614e15565b9f9e505050505050505050505050505050565b600554600090610100900460ff1615612864576040805162461bcd60e51b81526020600482015260076024820152667265656e74727960c81b604482015290519081900360640190fd5b6005805461010061ff0019909116179055604080516020808252369082018190523392600080356001600160e01b0319169390929181908101848480828437600083820152604051601f909101601f19169092018290039550909350505050a2600d5460ff16612908576040805162461bcd60e51b815260206004820152600a60248201526908599a5b985b1a5e995960b21b604482015290519081900360640190fd5b6001600160a01b0384166000908152600f602052604090205460ff1661295e576040805162461bcd60e51b815260206004820152600660248201526508589bdd5b9960d21b604482015290519081900360640190fd5b6001600160a01b0384166000908152600f6020526040902060030154612990906002670de0b6b3a76400005b04614e73565b8311156129cf576040805162461bcd60e51b81526020600482015260086024820152670f9b585e1254985d60c21b604482015290519081900360640190fd5b6001600160a01b0384166000908152600f6020526040902060038101546002808301549054601054600a54612a0994939291908990613916565b915082821015612a48576040805162461bcd60e51b81526020600482015260056024820152643c6c696d4f60d81b604482015290519081900360640190fd5b612a56816003015485615325565b60038201556040805185815290516001600160a01b0387169133917f63982df10efd8dfaaaa0fcc7f50b2d93b7cba26ccc48adee2873220d485dc39a9181900360200190a3612aa48261554d565b612aaf85338661536e565b6000612abd868630866153c7565b935090508015612adb57612ad5826003015482614e15565b60038301555b612152338461514f565b600c5481565b3360009081526001602090815260408083206001600160a01b038616845290915281205480831115612b40573360009081526001602090815260408083206001600160a01b0388168452909152812055612b6f565b612b4a8184614e15565b3360009081526001602090815260408083206001600160a01b03891684529091529020555b3360008181526001602090815260408083206001600160a01b038916808552908352928190205481519081529051929392600080516020615827833981519152929181900390910190a35060019392505050565b600554600090610100900460ff1615612c0d576040805162461bcd60e51b81526020600482015260076024820152667265656e74727960c81b604482015290519081900360640190fd5b6005805461010061ff0019909116179055604080516020808252369082018190523392600080356001600160e01b0319169390929181908101848480828437600083820152604051601f909101601f19169092018290039550909350505050a2600d5460ff16612cb1576040805162461bcd60e51b815260206004820152600a60248201526908599a5b985b1a5e995960b21b604482015290519081900360640190fd5b6001600160a01b0384166000908152600f602052604090205460ff16612d07576040805162461bcd60e51b815260206004820152600660248201526508589bdd5b9960d21b604482015290519081900360640190fd5b6001600160a01b0384166000908152600f6020526040902060038101546002808301549054601054600a54612d4194939291908990612767565b915081612d84576040805162461bcd60e51b815260206004820152600c60248201526b0cae4e49ac2e8d082e0e4def60a31b604482015290519081900360640190fd5b82821115612dc2576040805162461bcd60e51b81526020600482015260066024820152651e3634b6a4b760d11b604482015290519081900360640190fd5b6001600160a01b0385166000908152600f6020526040902060030154612df2906002670de0b6b3a764000061298a565b821115612e31576040805162461bcd60e51b81526020600482015260086024820152670f9b585e1254985d60c21b604482015290519081900360640190fd5b612e3f816003015483615325565b60038201556040805183815290516001600160a01b0387169133917f63982df10efd8dfaaaa0fcc7f50b2d93b7cba26ccc48adee2873220d485dc39a9181900360200190a3612e8d8461554d565b612e97338561514f565b612ea285338461536e565b6000612eae8684615037565b9050801561215257612ec4826003015482614e15565b600383015550506005805461ff00191690559392505050565b6001600160a01b031660009081526020819052604090205490565b600080612f058887614d0e565b90506000612f2486612f1f670de0b6b3a764000087614e15565b614e73565b90506000612f328983614e15565b90506000612f40828b614d0e565b90506000612f5f82612f5a670de0b6b3a764000088614d0e565b614f2d565b90506000612f6d828f614e73565b90506000612f7b8f83614e15565b90506000612f9a612f94670de0b6b3a76400008a614e15565b8c614e73565b9050612fb282612f1f670de0b6b3a764000084614e15565b98505050505050505050979650505050505050565b6005546000908190610100900460ff1615613013576040805162461bcd60e51b81526020600482015260076024820152667265656e74727960c81b604482015290519081900360640190fd5b6005805461010061ff0019909116179055604080516020808252369082018190523392600080356001600160e01b0319169390929181908101848480828437600083820152604051601f909101601f19169092018290039550909350505050a26001600160a01b0387166000908152600f602052604090205460ff166130c9576040805162461bcd60e51b815260206004820152600660248201526508589bdd5b9960d21b604482015290519081900360640190fd5b6001600160a01b0385166000908152600f602052604090205460ff1661311f576040805162461bcd60e51b815260206004820152600660248201526508589bdd5b9960d21b604482015290519081900360640190fd5b600854600160a01b900460ff1661316b576040805162461bcd60e51b815260206004820152600b60248201526a0217075626c6963537761760ac1b604482015290519081900360640190fd5b6001600160a01b038088166000908152600f6020526040808220928816825290206003808201546131a491670de0b6b3a7640000610ee9565b8611156131e3576040805162461bcd60e51b81526020600482015260086024820152670f9b585e13d4985d60c21b604482015290519081900360640190fd5b60006132048360030154846002015484600301548560020154600a54613dfd565b905085811115613249576040805162461bcd60e51b815260206004820152600b60248201526a6261644c696d507269636560a81b604482015290519081900360640190fd5b61326983600301548460020154846003015485600201548b600a54614c8b565b9450888511156132a9576040805162461bcd60e51b81526020600482015260066024820152651e3634b6a4b760d11b604482015290519081900360640190fd5b6132b7836003015486615325565b83600301819055506132cd826003015488614e15565b600380840182905584015460028086015490850154600a546132f0949190613dfd565b935080841015613336576040805162461bcd60e51b815260206004820152600c60248201526b0cae4e49ac2e8d082e0e4def60a31b604482015290519081900360640190fd5b85841115613377576040805162461bcd60e51b81526020600482015260096024820152683e6c696d507269636560b81b604482015290519081900360640190fd5b6133818588614d0e565b8111156133c4576040805162461bcd60e51b815260206004820152600c60248201526b0cae4e49ac2e8d082e0e4def60a31b604482015290519081900360640190fd5b876001600160a01b03168a6001600160a01b0316336001600160a01b03167f908fb5ee8f16c6bc9bc3690973819f32a4d4b10188134543c88706e0e1d43378888b604051808381526020018281526020019250505060405180910390a461342c8a338761536e565b613437883389615159565b60006134438b87615037565b9050801561345f57613459846003015482614e15565b60038501555b505050506005805461ff001916905590969095509350505050565b6005546000908190610100900460ff16156134c6576040805162461bcd60e51b81526020600482015260076024820152667265656e74727960c81b604482015290519081900360640190fd5b6005805461010061ff0019909116179055604080516020808252369082018190523392600080356001600160e01b0319169390929181908101848480828437600083820152604051601f909101601f19169092018290039550909350505050a26001600160a01b0387166000908152600f602052604090205460ff1661357c576040805162461bcd60e51b815260206004820152600660248201526508589bdd5b9960d21b604482015290519081900360640190fd5b6001600160a01b0385166000908152600f602052604090205460ff166135d2576040805162461bcd60e51b815260206004820152600660248201526508589bdd5b9960d21b604482015290519081900360640190fd5b600854600160a01b900460ff1661361e576040805162461bcd60e51b815260206004820152600b60248201526a0217075626c6963537761760ac1b604482015290519081900360640190fd5b6001600160a01b038088166000908152600f6020526040808220928816825290206003820154613658906002670de0b6b3a764000061298a565b881115613697576040805162461bcd60e51b81526020600482015260086024820152670f9b585e1254985d60c21b604482015290519081900360640190fd5b60006136b88360030154846002015484600301548560020154600a54613dfd565b9050858111156136fd576040805162461bcd60e51b815260206004820152600b60248201526a6261644c696d507269636560a81b604482015290519081900360640190fd5b61371d83600301548460020154846003015485600201548d600a5461419a565b94508685101561375c576040805162461bcd60e51b81526020600482015260056024820152643c6c696d4f60d81b604482015290519081900360640190fd5b61376a83600301548a615325565b8360030181905550613780826003015486614e15565b600380840182905584015460028086015490850154600a546137a3949190613dfd565b9350808410156137e9576040805162461bcd60e51b815260206004820152600c60248201526b0cae4e49ac2e8d082e0e4def60a31b604482015290519081900360640190fd5b8584111561382a576040805162461bcd60e51b81526020600482015260096024820152683e6c696d507269636560b81b604482015290519081900360640190fd5b6138348986614d0e565b811115613877576040805162461bcd60e51b815260206004820152600c60248201526b0cae4e49ac2e8d082e0e4def60a31b604482015290519081900360640190fd5b876001600160a01b03168a6001600160a01b0316336001600160a01b03167f908fb5ee8f16c6bc9bc3690973819f32a4d4b10188134543c88706e0e1d433788c89604051808381526020018281526020019250505060405180910390a46138df8a338b61536e565b60006138ed8b8b8b896153c7565b96509050801561390b57613905846003015482614e15565b60038501555b61345f893388615159565b6000806139238786614d0e565b9050600061394261393c670de0b6b3a764000084614e15565b85614e73565b9050600061395c86612f1f670de0b6b3a764000085614e15565b9050600061396a8b83615325565b90506000613978828d614d0e565b905060006139868287614f2d565b90506000613994828d614e73565b90506139a0818d614e15565b9e9d5050505050505050505050505050565b600854600160a01b900460ff1681565b336001600160a01b03166000356001600160e01b0319166001600160e01b03191660003660405180806020018281038252848482818152602001925080828437600083820152604051601f909101601f19169092018290039550909350505050a2600554610100900460ff1615613a6a576040805162461bcd60e51b81526020600482015260076024820152667265656e74727960c81b604482015290519081900360640190fd5b6005805461ff0019166101001790556001600160a01b0381166000908152600f602052604090205460ff16613acf576040805162461bcd60e51b815260206004820152600660248201526508589bdd5b9960d21b604482015290519081900360640190fd5b604080516370a0823160e01b815230600482015290516001600160a01b038316916370a08231916024808301926020929190829003018186803b158015613b1557600080fd5b505afa158015613b29573d6000803e3d6000fd5b505050506040513d6020811015613b3f57600080fd5b50516001600160a01b039091166000908152600f60205260409020600301556005805461ff0019169055565b600554610100900460ff1615613bb2576040805162461bcd60e51b81526020600482015260076024820152667265656e74727960c81b604482015290519081900360640190fd5b6005805461010061ff0019909116179055604080516020808252369082018190523392600080356001600160e01b0319169390929181908101848480828437600083820152604051601f909101601f19169092018290039550909350505050a26008546001600160a01b03163314613c5f576040805162461bcd60e51b815260206004820152600b60248201526a10b1b7b73a3937b63632b960a91b604482015290519081900360640190fd5b600880546001600160a01b0319166001600160a01b03929092169190911790556005805461ff0019169055565b600554600090610100900460ff1615613cd6576040805162461bcd60e51b81526020600482015260076024820152667265656e74727960c81b604482015290519081900360640190fd5b5060105490565b600554600090610100900460ff1615613d27576040805162461bcd60e51b81526020600482015260076024820152667265656e74727960c81b604482015290519081900360640190fd5b6001600160a01b0382166000908152600f602052604090205460ff16613d7d576040805162461bcd60e51b815260206004820152600660248201526508589bdd5b9960d21b604482015290519081900360640190fd5b506001600160a01b03166000908152600f602052604090206002015490565b60048054604080516020601f600260001961010060018816150201909516949094049384018190048102820181019092528281526060939092909183018282801561114c5780601f106111215761010080835404028352916020019161114c565b600080613e0a8787614d0e565b90506000613e188686614d0e565b90506000613e268383614d0e565b90506000613e48670de0b6b3a7640000610d00670de0b6b3a764000089614e15565b9050613e548282614e73565b9a9950505050505050505050565b6000613e6f338484615223565b50600192915050565b600554610100900460ff1615613ebf576040805162461bcd60e51b81526020600482015260076024820152667265656e74727960c81b604482015290519081900360640190fd5b6005805461010061ff0019909116179055604080516020808252369082018190523392600080356001600160e01b0319169390929181908101848480828437600083820152604051601f909101601f19169092018290039550909350505050a2600d5460ff16613f63576040805162461bcd60e51b815260206004820152600a60248201526908599a5b985b1a5e995960b21b604482015290519081900360640190fd5b6000613f6d611428565b90506000613f7d85600c54614e73565b90506000613f8b8683614e15565b90506000613f998285614d0e565b905080613fdc576040805162461bcd60e51b815260206004820152600c60248201526b0cae4e49ac2e8d082e0e4def60a31b604482015290519081900360640190fd5b613fe63388615029565b600754613ffc906001600160a01b03168461514f565b61400582615143565b60005b600e5481101561417c576000600e828154811061402157fe5b60009182526020808320909101546001600160a01b0316808352600f9091526040822060030154909250906140568583614e73565b905080614099576040805162461bcd60e51b815260206004820152600c60248201526b0cae4e49ac2e8d082e0e4def60a31b604482015290519081900360640190fd5b8989858181106140a557fe5b905060200201358110156140e8576040805162461bcd60e51b81526020600482015260056024820152643c6c696d4f60d81b604482015290519081900360640190fd5b6001600160a01b0383166000908152600f602052604090206003015461410e9082614e15565b6001600160a01b0384166000818152600f60209081526040918290206003019390935580518481529051919233927fe74c91552b64c2e2e7bd255639e004e693bd3e1d01cc33e65610b86afcc1ffed9281900390910190a3614171833383615159565b505050600101614008565b50506005805461ff0019169055505050505050565b600d5460ff1681565b6000806141a78786614d0e565b905060006141bd670de0b6b3a764000085614e15565b90506141c98582614e73565b905060006141db8a610d008c85615325565b905060006141e98285614f2d565b905060006141ff670de0b6b3a764000083614e15565b905061420b8a82614e73565b9c9b505050505050505050505050565b600554606090610100900460ff1615614265576040805162461bcd60e51b81526020600482015260076024820152667265656e74727960c81b604482015290519081900360640190fd5b600d5460ff166142a9576040805162461bcd60e51b815260206004820152600a60248201526908599a5b985b1a5e995960b21b604482015290519081900360640190fd5b600e80548060200260200160405190810160405280929190818152602001828054801561114c57602002820191906000526020600020905b81546001600160a01b031681526001909101906020018083116142e1575050505050905090565b6007546001600160a01b031681565b600554606090610100900460ff16156142a9576040805162461bcd60e51b81526020600482015260076024820152667265656e74727960c81b604482015290519081900360640190fd5b600e5490565b600554610100900460ff16156143ae576040805162461bcd60e51b81526020600482015260076024820152667265656e74727960c81b604482015290519081900360640190fd5b6005805461010061ff0019909116179055604080516020808252369082018190523392600080356001600160e01b0319169390929181908101848480828437600083820152604051601f909101601f19169092018290039550909350505050a26008546001600160a01b0316331461445b576040805162461bcd60e51b815260206004820152600b60248201526a10b1b7b73a3937b63632b960a91b604482015290519081900360640190fd5b6001600160a01b0381166000908152600f602052604090205460ff166144b1576040805162461bcd60e51b815260206004820152600660248201526508589bdd5b9960d21b604482015290519081900360640190fd5b600d5460ff16156144f5576040805162461bcd60e51b8152602060048201526009602482015268199a5b985b1a5e995960ba1b604482015290519081900360640190fd5b6001600160a01b0381166000908152600f6020526040812060030154600c54909190614522908390614e73565b6010546001600160a01b0385166000908152600f602052604090206002015491925061454d91614e15565b6010556001600160a01b0383166000908152600f6020526040902060010154600e8054600019810191908290811061458157fe5b600091825260209091200154600e80546001600160a01b0390921691849081106145a757fe5b9060005260206000200160006101000a8154816001600160a01b0302191690836001600160a01b0316021790555081600f6000600e85815481106145e757fe5b60009182526020808320909101546001600160a01b03168352820192909252604001902060010155600e80548061461a57fe5b60008281526020808220600019908401810180546001600160a01b031916905590920190925560408051608081018252838152808301848152818301858152606083018681526001600160a01b038c168752600f909552929094209051815460ff191690151517815592516001840155516002830155516003909101556146a68533611cfb8787614e15565b600754611d1b9086906001600160a01b031685615159565b3360009081526001602090815260408083206001600160a01b03861684529091528120546146ec9083615325565b3360008181526001602090815260408083206001600160a01b038916808552908352928190208590558051948552519193600080516020615827833981519152929081900390910190a350600192915050565b6001600160a01b03918216600090815260016020908152604080832093909416825291909152205490565b336001600160a01b03166000356001600160e01b0319166001600160e01b03191660003660405180806020018281038252848482818152602001925080828437600083820152604051601f909101601f19169092018290039550909350505050a26008546001600160a01b03163314614818576040805162461bcd60e51b815260206004820152600b60248201526a10b1b7b73a3937b63632b960a91b604482015290519081900360640190fd5b6001600160a01b0383166000908152600f602052604090205460ff161561486e576040805162461bcd60e51b8152602060048201526005602482015264189bdd5b9960da1b604482015290519081900360640190fd5b600d5460ff16156148b2576040805162461bcd60e51b8152602060048201526009602482015268199a5b985b1a5e995960ba1b604482015290519081900360640190fd5b600e546008116148f6576040805162461bcd60e51b815260206004820152600a6024820152693e6d6178546f6b656e7360b01b604482015290519081900360640190fd5b604080516080810182526001808252600e805460208085019182526000858701818152606087018281526001600160a01b038c16808452600f9094529782209651875460ff1916901515178755925186860155915160028601559451600390940193909355805491820181559091527fbb7b4a454dc3493923482f07822329ed19e8244eff582cc204f8554c3620c3fd0180546001600160a01b03191690911790556149a3838383611969565b505050565b336001600160a01b03166000356001600160e01b0319166001600160e01b03191660003660405180806020018281038252848482818152602001925080828437600083820152604051601f909101601f19169092018290039550909350505050a2600d5460ff1615614a4d576040805162461bcd60e51b8152602060048201526009602482015268199a5b985b1a5e995960ba1b604482015290519081900360640190fd5b6007546001600160a01b03163314614a97576040805162461bcd60e51b815260206004820152600860248201526721666163746f727960c01b604482015290519081900360640190fd5b66038d7ea4c68000811115614ae1576040805162461bcd60e51b815260206004820152600b60248201526a3e6d61784578697446656560a81b604482015290519081900360640190fd5b600c55565b600b5481565b600554600090610100900460ff1615614b36576040805162461bcd60e51b81526020600482015260076024820152667265656e74727960c81b604482015290519081900360640190fd5b6001600160a01b0382166000908152600f602052604090205460ff16614b8c576040805162461bcd60e51b815260206004820152600660248201526508589bdd5b9960d21b604482015290519081900360640190fd5b6001600160a01b0382166000908152600f6020526040902060020154601054614bb6908290614d0e565b9392505050565b6008546001600160a01b031681565b600554600090610100900460ff1615614c16576040805162461bcd60e51b81526020600482015260076024820152667265656e74727960c81b604482015290519081900360640190fd5b6001600160a01b0382166000908152600f602052604090205460ff16614c6c576040805162461bcd60e51b815260206004820152600660248201526508589bdd5b9960d21b604482015290519081900360640190fd5b506001600160a01b03166000908152600f602052604090206003015490565b600080614c988588614d0e565b90506000614ca68786614e15565b90506000614cb48883614d0e565b90506000614cc28285614f2d565b9050614cd681670de0b6b3a7640000614e15565b9050614cea670de0b6b3a764000087614e15565b9450614cff614cf98c83614e73565b86614d0e565b9b9a5050505050505050505050565b600081614d4d576040805162461bcd60e51b8152602060048201526008602482015267064697620627920360c41b604482015290519081900360640190fd5b670de0b6b3a76400008302831580614d755750670de0b6b3a7640000848281614d7257fe5b04145b614db5576040805162461bcd60e51b815260206004820152600c60248201526b191a5d881a5b9d195c9b985b60a21b604482015290519081900360640190fd5b60028304810181811015614dff576040805162461bcd60e51b815260206004820152600c60248201526b191a5d881a5b9d195c9b985b60a21b604482015290519081900360640190fd5b6000848281614e0a57fe5b049695505050505050565b6000806000614e248585615556565b915091508015614e6b576040805162461bcd60e51b815260206004820152600d60248201526c73756220756e646572666c6f7760981b604482015290519081900360640190fd5b509392505050565b6000828202831580614e8d575082848281614e8a57fe5b04145b614ecd576040805162461bcd60e51b815260206004820152600c60248201526b6d756c206f766572666c6f7760a01b604482015290519081900360640190fd5b6706f05b59d3b20000810181811015614f1c576040805162461bcd60e51b815260206004820152600c60248201526b6d756c206f766572666c6f7760a01b604482015290519081900360640190fd5b6000670de0b6b3a764000082614e0a565b60006001831015614f74576040805162461bcd60e51b815260206004820152600c60248201526b6261736520746f6f206c6f7760a01b604482015290519081900360640190fd5b671bc16d674ec7ffff831115614fc1576040805162461bcd60e51b815260206004820152600d60248201526c0c4c2e6ca40e8dede40d0d2ced609b1b604482015290519081900360640190fd5b6000614fcc8361557b565b90506000614fda8483614e15565b90506000614ff086614feb85615596565b6155a4565b9050816150015792506111a5915050565b600061501287846305f5e1006155fb565b905061501e8282614e73565b979650505050505050565b61503382826156d9565b5050565b600b54600090156111a557600754604080516374b1330b60e11b815290516000926001600160a01b03169163e9626616916004808301926020929190829003018186803b15801561508757600080fd5b505afa15801561509b573d6000803e3d6000fd5b505050506040513d60208110156150b157600080fd5b505190506001600160a01b0381161561513c576150e16150d384600b54614e73565b670de0b6b3a7640000614d0e565b6007549092506150fc9085906001600160a01b031684615159565b6040805183815290516001600160a01b038616917faa299fc96f84481838321cf4ac49861748dc206dd9101e1b8ed3f34bb88cadbd919081900360200190a25b5092915050565b61514c816156e4565b50565b61503382826157a6565b6000836001600160a01b031663a9059cbb84846040518363ffffffff1660e01b815260040180836001600160a01b0316815260200182815260200192505050602060405180830381600087803b1580156151b257600080fd5b505af11580156151c6573d6000803e3d6000fd5b505050506040513d60208110156151dc57600080fd5b505190508061521d576040805162461bcd60e51b8152602060048201526008602482015267065727245726332360c41b604482015290519081900360640190fd5b50505050565b6001600160a01b038316600090815260208190526040902054811115615279576040805162461bcd60e51b815260206004808301919091526024820152630858985b60e21b604482015290519081900360640190fd5b6001600160a01b03831660009081526020819052604090205461529c9082614e15565b6001600160a01b0380851660009081526020819052604080822093909355908416815220546152cb9082615325565b6001600160a01b038084166000818152602081815260409182902094909455805185815290519193928716927fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef92918290030190a3505050565b600082820183811015614bb6576040805162461bcd60e51b815260206004820152600c60248201526b616464206f766572666c6f7760a01b604482015290519081900360640190fd5b604080516323b872dd60e01b81526001600160a01b0384811660048301523060248301526044820184905291516000928616916323b872dd91606480830192602092919082900301818787803b1580156151b257600080fd5b600b5460009082901561554457600754604080516374b1330b60e11b815290516000926001600160a01b03169163e9626616916004808301926020929190829003018186803b15801561541957600080fd5b505afa15801561542d573d6000803e3d6000fd5b505050506040513d602081101561544357600080fd5b505190506001600160a01b0380821690881614156154c95761546a6150d387600b54614e73565b6007549093506154859088906001600160a01b031685615159565b6040805184815290516001600160a01b038916917faa299fc96f84481838321cf4ac49861748dc206dd9101e1b8ed3f34bb88cadbd919081900360200190a2615542565b60006154da6150d386600b54614e73565b6007549091506154f59087906001600160a01b031683615159565b6154ff8582614e15565b6040805183815290519194506001600160a01b038816917faa299fc96f84481838321cf4ac49861748dc206dd9101e1b8ed3f34bb88cadbd9181900360200190a2505b505b94509492505050565b61514c816157b1565b60008082841061556c5750508082036000615574565b505081810360015b9250929050565b6000670de0b6b3a764000061558f83615596565b0292915050565b670de0b6b3a7640000900490565b600080600283066155bd57670de0b6b3a76400006155bf565b835b90506002830492505b8215614bb6576155d88485614e73565b935060028306156155f0576155ed8185614e73565b90505b6002830492506155c8565b600082818061561287670de0b6b3a7640000615556565b9092509050670de0b6b3a764000080600060015b8884106156ca576000670de0b6b3a76400008202905060008061565a8a61565585670de0b6b3a7640000614e15565b615556565b9150915061566c87612f1f848c614e73565b96506156788784614d0e565b965086615687575050506156ca565b8715615691579315935b801561569b579315935b84156156b2576156ab8688614e15565b95506156bf565b6156bc8688615325565b95505b505050600101615626565b50909998505050505050505050565b615033823083615223565b30600090815260208190526040902054811115615731576040805162461bcd60e51b815260206004808301919091526024820152630858985b60e21b604482015290519081900360640190fd5b3060009081526020819052604090205461574b9082614e15565b306000908152602081905260409020556002546157689082614e15565b60025560408051828152905160009130917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9181900360200190a350565b615033308383615223565b306000908152602081905260409020546157cb9082615325565b306000908152602081905260409020556002546157e89082615325565b60025560408051828152905130916000917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9181900360200190a35056fe8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925a26469706673582212204814ffc3fcf8d3e48bc307a87a7d058f3ac272a5642097cdb240483f9938a32564736f6c634300060c0033

Deployed Bytecode Sourcemap

27241:26571:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;25162:1327;;;;;;;;;;;;;;;;-1:-1:-1;25162:1327:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;49613:1509;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;49613:1509:0;;;;;;;;;;;;;:::i;9501:83::-;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;10138:193;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;10138:193:0;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;37437:477;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;37437:477:0;;;;;;;;;;:::i;36953:476::-;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;36953:476:0;;;;;;;;;;:::i;10033:97::-;;;:::i;28860:26::-;;;:::i;11154:487::-;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;11154:487:0;;;;;;;;;;;;;;;;;:::i;29535:386::-;;;;;;;;;;;;;;;;-1:-1:-1;29535:386:0;;:::i;:::-;;30493:123;;;;;;;;;;;;;;;;-1:-1:-1;30493:123:0;-1:-1:-1;;;;;30493:123:0;;:::i;9687:82::-;;;:::i;:::-;;;;;;;;;;;;;;;;;;;31977:415;;;;;;;;;;;;;;;;-1:-1:-1;31977:415:0;;:::i;34001:1617::-;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;34001:1617:0;;;;;;;;;;;;;:::i;29929:300::-;;;;;;;;;;;;;;;;-1:-1:-1;29929:300:0;;:::i;48151:1454::-;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;48151:1454:0;;;;;;;;;;;;;:::i;32609:241::-;;;;;;;;;;;;;;;;-1:-1:-1;32609:241:0;;;;:::i;32858:413::-;;;:::i;37922:928::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;37922:928:0;;-1:-1:-1;37922:928:0;-1:-1:-1;37922:928:0;:::i;28893:19::-;;;:::i;28554:26::-;;;:::i;20399:1213::-;;;;;;;;;;;;;;;;-1:-1:-1;20399:1213:0;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;45281:1440::-;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;45281:1440:0;;;;;;;;;;;;;:::i;28996:19::-;;;:::i;10599:397::-;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;10599:397:0;;;;;;;;:::i;46729:1414::-;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;46729:1414:0;;;;;;;;;;;;;:::i;9914:111::-;;;;;;;;;;;;;;;;-1:-1:-1;9914:111:0;-1:-1:-1;;;;;9914:111:0;;:::i;22731:1312::-;;;;;;;;;;;;;;;;-1:-1:-1;22731:1312:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;42657:2614::-;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;42657:2614:0;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;39967:2682;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;39967:2682:0;;;;;;;;;;;;;;;;;;;;;;;;;:::i;18198:1183::-;;;;;;;;;;;;;;;;-1:-1:-1;18198:1183:0;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;28716:22::-;;;:::i;36727:218::-;;;;;;;;;;;;;;;;-1:-1:-1;36727:218:0;-1:-1:-1;;;;;36727:218:0;;:::i;32400:201::-;;;;;;;;;;;;;;;;-1:-1:-1;32400:201:0;-1:-1:-1;;;;;32400:201:0;;:::i;31328:148::-;;;:::i;31101:219::-;;;;;;;;;;;;;;;;-1:-1:-1;31101:219:0;-1:-1:-1;;;;;31101:219:0;;:::i;9592:87::-;;;:::i;13237:523::-;;;;;;;;;;;;;;;;-1:-1:-1;13237:523:0;;;;;;;;;;;;;;;;;;;;;;:::i;11004:142::-;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;11004:142:0;;;;;;;;:::i;38858:1099::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;38858:1099:0;;-1:-1:-1;38858:1099:0;-1:-1:-1;38858:1099:0;:::i;29022:21::-;;;:::i;14778:697::-;;;;;;;;;;;;;;;;-1:-1:-1;14778:697:0;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;30900:193::-;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;28587:22;;;:::i;:::-;;;;-1:-1:-1;;;;;28587:22:0;;;;;;;;;;;;;;30749:143;;;:::i;30624:117::-;;;:::i;35626:1016::-;;;;;;;;;;;;;;;;-1:-1:-1;35626:1016:0;-1:-1:-1;;;;;35626:1016:0;;:::i;10339:252::-;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;10339:252:0;;;;;;;;:::i;9777:129::-;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;9777:129:0;;;;;;;;;;:::i;33281:712::-;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;33281:712:0;;;;;;;;;;;;;:::i;30237:248::-;;;;;;;;;;;;;;;;-1:-1:-1;30237:248:0;;:::i;28919:24::-;;;:::i;31484:268::-;;;;;;;;;;;;;;;;-1:-1:-1;31484:268:0;-1:-1:-1;;;;;31484:268:0;;:::i;28664:25::-;;;:::i;31760:209::-;;;;;;;;;;;;;;;;-1:-1:-1;31760:209:0;-1:-1:-1;;;;;31760:209:0;;:::i;16493:686::-;;;;;;;;;;;;;;;;-1:-1:-1;16493:686:0;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;25162:1327::-;25432:17;25523:21;25547:33;25552:14;25568:11;25547:4;:33::i;:::-;25523:57;;25663:8;25674:35;782:6;25692:16;25674:4;:35::i;:::-;25663:46;;25720:8;25731:18;25736:3;25741:7;25731:4;:18::i;:::-;25720:29;;25760:32;25795:44;25800:14;25816:22;782:6;25834:3;25816:4;:22::i;:::-;25795:4;:44::i;:::-;25760:79;;25852:23;25878:50;25883:15;25900:27;25878:4;:50::i;:::-;25852:76;;25939:18;25960:41;25965:18;25985:15;25960:4;:41::i;:::-;25939:62;;26081:14;26098:37;26103:13;26118:16;26098:4;:37::i;:::-;26081:54;;26146:18;26167:27;26172:9;26183:10;26167:4;:27::i;:::-;26146:48;;26205:29;26237:31;26242:10;26254:13;26237:4;:31::i;:::-;26205:63;;26393:58;26398:24;26424:26;782:6;26442:7;26424:4;:26::i;26393:58::-;26378:73;;26462:19;;;;;;;;;25162:1327;;;;;;;;;:::o;49613:1509::-;28343:6;;49775:17;;28343:6;;;;;28342:7;28334:27;;;;;-1:-1:-1;;;28334:27:0;;;;;;;;;;;;-1:-1:-1;;;28334:27:0;;;;;;;;;;;;;;;28372:6;:13;;;-1:-1:-1;;28372:13:0;;;;;;28117:39:::1;::::0;;::::1;::::0;;;28147:8:::1;28117:39:::0;;::::1;::::0;;;28135:10:::1;::::0;-1:-1:-1;28126:7:0;::::1;-1:-1:-1::0;;;;;;28126:7:0::1;::::0;-1:-1:-1;;28147:8:0;28117:39;;;;-1:-1:-1;28147:8:0;;-1:-1:-1;28117:39:0;::::1;;::::0;;::::1;::::0;::::1;::::0;::::1;::::0;;::::1;-1:-1:-1::0;;28117:39:0::1;::::0;;::::1;::::0;;::::1;::::0;-1:-1:-1;28117:39:0;;-1:-1:-1;;;;28117:39:0::1;49818:9:::2;::::0;::::2;;49810:32;;;::::0;;-1:-1:-1;;;49810:32:0;;::::2;;::::0;::::2;::::0;::::2;::::0;;;;-1:-1:-1;;;49810:32:0;;;;;;;;;;;;;::::2;;-1:-1:-1::0;;;;;49861:18:0;::::2;;::::0;;;:8:::2;:18;::::0;;;;:24;::::2;;49853:43;;;::::0;;-1:-1:-1;;;49853:43:0;;::::2;;::::0;::::2;::::0;::::2;::::0;;;;-1:-1:-1;;;49853:43:0;;;;;;;;;;;;;::::2;;-1:-1:-1::0;;;;;49938:18:0;::::2;;::::0;;;:8:::2;:18;::::0;;;;:26:::2;::::0;;::::2;::::0;49933:54:::2;::::0;782:6:::2;2177:8;;2189:5;2176:18;49933:4;:54::i;:::-;49915:14;:72;;49907:93;;;::::0;;-1:-1:-1;;;49907:93:0;;::::2;;::::0;::::2;::::0;::::2;::::0;;;;-1:-1:-1;;;49907:93:0;;;;;;;;;;;;;::::2;;-1:-1:-1::0;;;;;50040:18:0;::::2;50013:24;50040:18:::0;;;:8:::2;:18;::::0;;;;50141:17:::2;::::0;::::2;::::0;50189:16:::2;::::0;;::::2;::::0;50236:12;;50279::::2;::::0;50367:7:::2;::::0;50405::::2;::::0;50086:353:::2;::::0;50141:17;50189:16;50236:12;50279;50322:14;;50086:24:::2;:353::i;:::-;50071:368:::0;-1:-1:-1;50460:17:0;50452:42:::2;;;::::0;;-1:-1:-1;;;50452:42:0;;::::2;;::::0;::::2;::::0;::::2;::::0;;;;-1:-1:-1;;;50452:42:0;;;;;;;;;;;;;::::2;;50529:15;50513:12;:31;;50505:50;;;::::0;;-1:-1:-1;;;50505:50:0;;::::2;;::::0;::::2;::::0;::::2;::::0;;;;-1:-1:-1;;;50505:50:0;;;;;;;;;;;;;::::2;;50588:39;50593:9;:17;;;50612:14;50588:4;:39::i;:::-;50568:9;:17;;:59;;;;50640:13;50656:27;50661:12;50675:7;;50656:4;:27::i;:::-;50701:46;::::0;;;;;;;50640:43;;-1:-1:-1;;;;;;50701:46:0;::::2;::::0;50710:10:::2;::::0;50701:46:::2;::::0;;;;;::::2;::::0;;::::2;50760:40;50775:10;50787:12;50760:14;:40::i;:::-;50811:24;50838:54;50872:4;50879:12;50838:25;:54::i;:::-;50811:81;;50903:71;50918:55;50923:28;50928:12;50942:8;50923:4;:28::i;:::-;50953:19;50918:4;:55::i;:::-;50903:14;:71::i;:::-;51000:7;::::0;50985:33:::2;::::0;-1:-1:-1;;;;;51000:7:0::2;51009:8:::0;50985:14:::2;:33::i;:::-;51029:53;51045:8;51055:10;51067:14;51029:15;:53::i;:::-;51095:19;;;28408:6:::0;:14;;-1:-1:-1;;28408:14:0;;;49613:1509;;-1:-1:-1;;;49613:1509:0:o;9501:83::-;9571:5;9564:12;;;;;;;;-1:-1:-1;;9564:12:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;9538:13;;9564:12;;9571:5;;9564:12;;9571:5;9564:12;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;9501:83;:::o;10138:193::-;10233:10;10205:4;10222:22;;;:10;:22;;;;;;;;-1:-1:-1;;;;;10222:27:0;;;;;;;;;;;:33;;;10271:30;;;;;;;10205:4;;10222:27;;10233:10;;-1:-1:-1;;;;;;;;;;;10271:30:0;;;;;;;-1:-1:-1;10319:4:0;10138:193;;;;;:::o;37437:477::-;28480:6;;37562:14;;28480:6;;;;;28479:7;28471:27;;;;;-1:-1:-1;;;28471:27:0;;;;;;;;;;;;-1:-1:-1;;;28471:27:0;;;;;;;;;;;;;;;-1:-1:-1;;;;;37602:17:0;::::1;;::::0;;;:8:::1;:17;::::0;;;;:23;::::1;;37594:42;;;::::0;;-1:-1:-1;;;37594:42:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;-1:-1:-1;;;37594:42:0;;;;;;;;;;;;;::::1;;-1:-1:-1::0;;;;;37655:18:0;::::1;;::::0;;;:8:::1;:18;::::0;;;;:24;::::1;;37647:43;;;::::0;;-1:-1:-1;;;37647:43:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;-1:-1:-1;;;37647:43:0;;;;;;;;;;;;;::::1;;-1:-1:-1::0;;;;;37727:17:0;;::::1;37701:23;37727:17:::0;;;:8:::1;:17;::::0;;;;;37782:18;;::::1;::::0;;;;37832:16:::1;::::0;;::::1;::::0;37850:15:::1;::::0;;::::1;::::0;37867:17;;::::1;::::0;37886:16;;::::1;::::0;37782:18;;37818:88:::1;::::0;37832:16;;37850:15;37886:16;37818:13:::1;:88::i;:::-;37811:95:::0;37437:477;-1:-1:-1;;;;;37437:477:0:o;36953:476::-;28480:6;;37071:14;;28480:6;;;;;28479:7;28471:27;;;;;-1:-1:-1;;;28471:27:0;;;;;;;;;;;;-1:-1:-1;;;28471:27:0;;;;;;;;;;;;;;;-1:-1:-1;;;;;37111:17:0;::::1;;::::0;;;:8:::1;:17;::::0;;;;:23;::::1;;37103:42;;;::::0;;-1:-1:-1;;;37103:42:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;-1:-1:-1;;;37103:42:0;;;;;;;;;;;;;::::1;;-1:-1:-1::0;;;;;37164:18:0;::::1;;::::0;;;:8:::1;:18;::::0;;;;:24;::::1;;37156:43;;;::::0;;-1:-1:-1;;;37156:43:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;-1:-1:-1;;;37156:43:0;;;;;;;;;;;;;::::1;;-1:-1:-1::0;;;;;37236:17:0;;::::1;37210:23;37236:17:::0;;;:8:::1;:17;::::0;;;;;37291:18;;::::1;::::0;;;;37341:16:::1;::::0;;::::1;::::0;37359:15:::1;::::0;;::::1;::::0;37376:17;;::::1;::::0;37395:16;;::::1;::::0;37413:7:::1;::::0;37327:94:::1;::::0;37359:15;37376:17;37395:16;37327:13:::1;:94::i;10033:97::-:0;10110:12;;10033:97;:::o;28860:26::-;;;;:::o;11154:487::-;11239:4;11264:10;-1:-1:-1;;;;;11264:17:0;;;;:55;;-1:-1:-1;;;;;;11292:15:0;;;;;;:10;:15;;;;;;;;11308:10;11292:27;;;;;;;;11285:34;;;11264:55;11256:76;;;;;-1:-1:-1;;;11256:76:0;;;;;;;;;;;;-1:-1:-1;;;11256:76:0;;;;;;;;;;;;;;;11343:20;11349:3;11354;11359;11343:5;:20::i;:::-;11378:10;-1:-1:-1;;;;;11378:17:0;;;;;;:63;;-1:-1:-1;;;;;;11399:15:0;;;;;;:10;:15;;;;;;;;11415:10;11399:27;;;;;;;;-1:-1:-1;;11399:42:0;;11378:63;11374:238;;;-1:-1:-1;;;;;11493:15:0;;;;;;:10;:15;;;;;;;;11509:10;11493:27;;;;;;;;11488:38;;11522:3;11488:4;:38::i;:::-;-1:-1:-1;;;;;11458:15:0;;;;;;;:10;:15;;;;;;;;11474:10;11458:27;;;;;;;;;;:68;;;11546:54;;;;;;;;;;11474:10;;-1:-1:-1;;;;;;;;;;;11546:54:0;;;;;;;;;11374:238;-1:-1:-1;11629:4:0;11154:487;;;;;:::o;29535:386::-;28135:10;-1:-1:-1;;;;;28117:39:0;28126:7;;-1:-1:-1;;;;;;28126:7:0;-1:-1:-1;;;;;28117:39:0;;28147:8;;28117:39;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;28117:39:0;;;;;;;;-1:-1:-1;28117:39:0;;-1:-1:-1;;;;28117:39:0;29618:9:::1;::::0;::::1;;29617:10;29609:32;;;::::0;;-1:-1:-1;;;29609:32:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;-1:-1:-1;;;29609:32:0;;;;;;;;;;;;;::::1;;29674:10;::::0;-1:-1:-1;;;;;29674:10:0::1;29660;:24;29652:48;;;::::0;;-1:-1:-1;;;29652:48:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;-1:-1:-1;;;29652:48:0;;;;;;;;;;;;;::::1;;1774:11:::0;29719:46;::::1;;29711:74;;;::::0;;-1:-1:-1;;;29711:74:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;-1:-1:-1;;;29711:74:0;;;;;;;;;;;;;::::1;;1840:13:::0;29804:46;::::1;;29796:74;;;::::0;;-1:-1:-1;;;29796:74:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;-1:-1:-1;;;29796:74:0;;;;;;;;;;;;;::::1;;29881:14;:32:::0;29535:386::o;30493:123::-;-1:-1:-1;;;;;30591:11:0;30562:4;30591:11;;;:8;:11;;;;;:17;;;;30493:123::o;9687:82::-;9752:9;;;;9687:82;:::o;31977:415::-;28343:6;;;;;;;28342:7;28334:27;;;;;-1:-1:-1;;;28334:27:0;;;;;;;;;;;;-1:-1:-1;;;28334:27:0;;;;;;;;;;;;;;;28372:6;:13;;;-1:-1:-1;;28372:13:0;;;;;;28117:39:::1;::::0;;::::1;::::0;;;28147:8:::1;28117:39:::0;;::::1;::::0;;;28135:10:::1;::::0;-1:-1:-1;28126:7:0;::::1;-1:-1:-1::0;;;;;;28126:7:0::1;::::0;-1:-1:-1;;28147:8:0;28117:39;;;;-1:-1:-1;28147:8:0;;-1:-1:-1;28117:39:0;::::1;;::::0;;::::1;::::0;::::1;::::0;::::1;::::0;;::::1;-1:-1:-1::0;;28117:39:0::1;::::0;;::::1;::::0;;::::1;::::0;-1:-1:-1;28117:39:0;;-1:-1:-1;;;;28117:39:0::1;32087:9:::2;::::0;::::2;;32086:10;32078:32;;;::::0;;-1:-1:-1;;;32078:32:0;;::::2;;::::0;::::2;::::0;::::2;::::0;;;;-1:-1:-1;;;32078:32:0;;;;;;;;;;;;;::::2;;32143:10;::::0;-1:-1:-1;;;;;32143:10:0::2;32129;:24;32121:48;;;::::0;;-1:-1:-1;;;32121:48:0;;::::2;;::::0;::::2;::::0;::::2;::::0;;;;-1:-1:-1;;;32121:48:0;;;;;;;;;;;;;::::2;;1037:12:::0;32188:26;::::2;;32180:46;;;::::0;;-1:-1:-1;;;32180:46:0;;::::2;;::::0;::::2;::::0;::::2;::::0;;;;-1:-1:-1;;;32180:46:0;;;;;;;;;;;;;::::2;;1104:9:::0;32245:26;::::2;;32237:46;;;::::0;;-1:-1:-1;;;32237:46:0;;::::2;;::::0;::::2;::::0;::::2;::::0;;;;-1:-1:-1;;;32237:46:0;;;;;;;;;;;;;::::2;;32327:8;32302:21;32307:12;;32321:1;32302:4;:21::i;:::-;:33;;32294:61;;;::::0;;-1:-1:-1;;;32294:61:0;;::::2;;::::0;::::2;::::0;::::2;::::0;;;;-1:-1:-1;;;32294:61:0;;;;;;;;;;;;;::::2;;32366:7;:18:::0;28408:6;:14;;-1:-1:-1;;28408:14:0;;;31977:415::o;34001:1617::-;28343:6;;;;;;;28342:7;28334:27;;;;;-1:-1:-1;;;28334:27:0;;;;;;;;;;;;-1:-1:-1;;;28334:27:0;;;;;;;;;;;;;;;28372:6;:13;;;-1:-1:-1;;28372:13:0;;;;;;28117:39:::1;::::0;;::::1;::::0;;;28147:8:::1;28117:39:::0;;::::1;::::0;;;28135:10:::1;::::0;-1:-1:-1;28126:7:0;::::1;-1:-1:-1::0;;;;;;28126:7:0::1;::::0;-1:-1:-1;;28147:8:0;28117:39;;;;-1:-1:-1;28147:8:0;;-1:-1:-1;28117:39:0;::::1;;::::0;;::::1;::::0;::::1;::::0;::::1;::::0;;::::1;-1:-1:-1::0;;28117:39:0::1;::::0;;::::1;::::0;;::::1;::::0;-1:-1:-1;28117:39:0;;-1:-1:-1;;;;28117:39:0::1;34147:10:::2;::::0;-1:-1:-1;;;;;34147:10:0::2;34133;:24;34125:48;;;::::0;;-1:-1:-1;;;34125:48:0;;::::2;;::::0;::::2;::::0;::::2;::::0;;;;-1:-1:-1;;;34125:48:0;;;;;;;;;;;;;::::2;;-1:-1:-1::0;;;;;34192:15:0;::::2;;::::0;;;:8:::2;:15;::::0;;;;:21;::::2;;34184:40;;;::::0;;-1:-1:-1;;;34184:40:0;;::::2;;::::0;::::2;::::0;::::2;::::0;;;;-1:-1:-1;;;34184:40:0;;;;;;;;;;;;;::::2;;34244:9;::::0;::::2;;34243:10;34235:32;;;::::0;;-1:-1:-1;;;34235:32:0;;::::2;;::::0;::::2;::::0;::::2;::::0;;;;-1:-1:-1;;;34235:32:0;;;;;;;;;;;;;::::2;;782:6;34288;:27;;34280:50;;;::::0;;-1:-1:-1;;;34280:50:0;;::::2;;::::0;::::2;::::0;::::2;::::0;;;;-1:-1:-1;;;34280:50:0;;;;;;;;;;;;;::::2;;1511:9:::0;34349:27;::::2;;34341:50;;;::::0;;-1:-1:-1;;;34341:50:0;;::::2;;::::0;::::2;::::0;::::2;::::0;;;;-1:-1:-1;;;34341:50:0;;;;;;;;;;;;;::::2;;1639:13:::0;34410:29;::::2;;34402:49;;;::::0;;-1:-1:-1;;;34402:49:0;;::::2;;::::0;::::2;::::0;::::2;::::0;;;;-1:-1:-1;;;34402:49:0;;;;;;;;;;;;;::::2;;-1:-1:-1::0;;;;;34527:15:0;::::2;34510:14;34527:15:::0;;;:8:::2;:15;::::0;;;;:22:::2;;::::0;34564:18;;::::2;34560:302;;;34614:43;34619:12;;34633:23;34638:6;34646:9;34633:4;:23::i;:::-;34614:4;:43::i;:::-;34599:12;:58:::0;;;1575:9;-1:-1:-1;34680:39:0::2;34672:63;;;::::0;;-1:-1:-1;;;34672:63:0;;::::2;;::::0;::::2;::::0;::::2;::::0;;;;-1:-1:-1;;;34672:63:0;;;;;;;;;;;;;::::2;;34560:302;;;34766:9;34757:6;:18;34753:109;;;34807:43;34812:12;;34826:23;34831:9;34842:6;34826:4;:23::i;:::-;34807:4;:43::i;:::-;34792:12;:58:::0;34753:109:::2;-1:-1:-1::0;;;;;34880:15:0;::::2;;::::0;;;:8:::2;:15;::::0;;;;:22:::2;::::0;::::2;:31:::0;;;35005:23:::2;;::::0;;35039:33;;;;35087:20;;::::2;35083:528;;;35124:61;35140:5;35147:10;35159:25;35164:7;35173:10;35159:4;:25::i;:::-;35124:15;:61::i;:::-;35083:528;;;35217:10;35207:7;:20;35203:408;;;35322:26;35351:25;35356:10;35368:7;35351:4;:25::i;:::-;35322:54;;35391:17;35411:36;35416:21;35439:7;;35411:4;:36::i;:::-;35391:56;;35462:77;35478:5;35485:10;35497:41;35502:21;35525:12;35497:4;:41::i;:::-;35462:15;:77::i;:::-;35577:7;::::0;35554:45:::2;::::0;35570:5;;-1:-1:-1;;;;;35577:7:0::2;35586:12:::0;35554:15:::2;:45::i;:::-;35203:408;;;-1:-1:-1::0;;28408:6:0;:14;;-1:-1:-1;;28408:14:0;;;-1:-1:-1;;;34001:1617:0:o;29929:300::-;28135:10;-1:-1:-1;;;;;28117:39:0;28126:7;;-1:-1:-1;;;;;;28126:7:0;-1:-1:-1;;;;;28117:39:0;;28147:8;;28117:39;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;28117:39:0;;;;;;;;-1:-1:-1;28117:39:0;;-1:-1:-1;;;;28117:39:0;30021:7:::1;::::0;-1:-1:-1;;;;;30021:7:0::1;30007:10;:21;29999:42;;;::::0;;-1:-1:-1;;;29999:42:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;-1:-1:-1;;;29999:42:0;;;;;;;;;;;;;::::1;;1245:10:::0;30060:41;::::1;;30052:63;;;::::0;;-1:-1:-1;;;30052:63:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;-1:-1:-1;;;30052:63:0;;;;;;;;;;;;;::::1;;30160:7;;30134:22;30139:13;30154:1;30134:4;:22::i;:::-;:33;;30126:56;;;::::0;;-1:-1:-1;;;30126:56:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;-1:-1:-1;;;30126:56:0;;;;;;;;;;;;;::::1;;30193:12;:28:::0;29929:300::o;48151:1454::-;28343:6;;48305:19;;28343:6;;;;;28342:7;28334:27;;;;;-1:-1:-1;;;28334:27:0;;;;;;;;;;;;-1:-1:-1;;;28334:27:0;;;;;;;;;;;;;;;28372:6;:13;;;-1:-1:-1;;28372:13:0;;;;;;28117:39:::1;::::0;;::::1;::::0;;;28147:8:::1;28117:39:::0;;::::1;::::0;;;28135:10:::1;::::0;-1:-1:-1;28126:7:0;::::1;-1:-1:-1::0;;;;;;28126:7:0::1;::::0;-1:-1:-1;;28147:8:0;28117:39;;;;-1:-1:-1;28147:8:0;;-1:-1:-1;28117:39:0;::::1;;::::0;;::::1;::::0;::::1;::::0;::::1;::::0;;::::1;-1:-1:-1::0;;28117:39:0::1;::::0;;::::1;::::0;;::::1;::::0;-1:-1:-1;28117:39:0;;-1:-1:-1;;;;28117:39:0::1;48350:9:::2;::::0;::::2;;48342:32;;;::::0;;-1:-1:-1;;;48342:32:0;;::::2;;::::0;::::2;::::0;::::2;::::0;;;;-1:-1:-1;;;48342:32:0;;;;;;;;;;;;;::::2;;-1:-1:-1::0;;;;;48393:18:0;::::2;;::::0;;;:8:::2;:18;::::0;;;;:24;::::2;;48385:43;;;::::0;;-1:-1:-1;;;48385:43:0;;::::2;;::::0;::::2;::::0;::::2;::::0;;;;-1:-1:-1;;;48385:43:0;;;;;;;;;;;;;::::2;;-1:-1:-1::0;;;;;48468:18:0;::::2;48441:24;48468:18:::0;;;:8:::2;:18;::::0;;;;48571:17:::2;::::0;::::2;::::0;48619:16:::2;::::0;;::::2;::::0;48666:12;;48709::::2;::::0;48795:7:::2;::::0;48833::::2;::::0;48516:351:::2;::::0;48571:17;48619:16;48666:12;48709;48752;;48516:24:::2;:351::i;:::-;48499:368;;48906:12;48888:14;:30;;48880:48;;;::::0;;-1:-1:-1;;;48880:48:0;;::::2;;::::0;::::2;::::0;::::2;::::0;;;;-1:-1:-1;;;48880:48:0;;;;;;;;;;;;;::::2;;-1:-1:-1::0;;;;;48980:18:0;::::2;;::::0;;;:8:::2;:18;::::0;;;;:26:::2;::::0;;::::2;::::0;48975:54:::2;::::0;782:6:::2;2177:8;::::0;48975:54:::2;48957:14;:72;;48949:93;;;::::0;;-1:-1:-1;;;48949:93:0;;::::2;;::::0;::::2;::::0;::::2;::::0;;;;-1:-1:-1;;;48949:93:0;;;;;;;;;;;;;::::2;;49075:39;49080:9;:17;;;49099:14;49075:4;:39::i;:::-;49055:9;:17;;:59;;;;49127:13;49143:27;49148:12;49162:7;;49143:4;:27::i;:::-;49188:46;::::0;;;;;;;49127:43;;-1:-1:-1;;;;;;49188:46:0;::::2;::::0;49197:10:::2;::::0;49188:46:::2;::::0;;;;;::::2;::::0;;::::2;49247:40;49262:10;49274:12;49247:14;:40::i;:::-;49298:44;49313:28;49318:12;49332:8;49313:4;:28::i;49298:44::-;49368:7;::::0;49353:33:::2;::::0;-1:-1:-1;;;;;49368:7:0::2;49377:8:::0;49353:14:::2;:33::i;:::-;49418:81;49453:4;49460:12;49474:8;49484:14;49418:26;:81::i;:::-;49397:102:::0;-1:-1:-1;49510:53:0::2;::::0;-1:-1:-1;49526:8:0;49536:10:::2;49397:102:::0;49510:15:::2;:53::i;:::-;49576:21;;28408:6:::0;:14;;-1:-1:-1;;28408:14:0;;;48151:1454;;-1:-1:-1;;;48151:1454:0:o;32609:241::-;28343:6;;;;;;;28342:7;28334:27;;;;;-1:-1:-1;;;28334:27:0;;;;;;;;;;;;-1:-1:-1;;;28334:27:0;;;;;;;;;;;;;;;28372:6;:13;;;-1:-1:-1;;28372:13:0;;;;;;28117:39:::1;::::0;;::::1;::::0;;;28147:8:::1;28117:39:::0;;::::1;::::0;;;28135:10:::1;::::0;-1:-1:-1;28126:7:0;::::1;-1:-1:-1::0;;;;;;28126:7:0::1;::::0;-1:-1:-1;;28147:8:0;28117:39;;;;-1:-1:-1;28147:8:0;;-1:-1:-1;28117:39:0;::::1;;::::0;;::::1;::::0;::::1;::::0;::::1;::::0;;::::1;-1:-1:-1::0;;28117:39:0::1;::::0;;::::1;::::0;;::::1;::::0;-1:-1:-1;28117:39:0;;-1:-1:-1;;;;28117:39:0::1;32725:9:::2;::::0;::::2;;32724:10;32716:32;;;::::0;;-1:-1:-1;;;32716:32:0;;::::2;;::::0;::::2;::::0;::::2;::::0;;;;-1:-1:-1;;;32716:32:0;;;;;;;;;;;;;::::2;;32781:10;::::0;-1:-1:-1;;;;;32781:10:0::2;32767;:24;32759:48;;;::::0;;-1:-1:-1;;;32759:48:0;;::::2;;::::0;::::2;::::0;::::2;::::0;;;;-1:-1:-1;;;32759:48:0;;;;;;;;;;;;;::::2;;32818:10;:24:::0;;;::::2;;-1:-1:-1::0;;;32818:24:0::2;-1:-1:-1::0;;;;32818:24:0;;::::2;::::0;;;::::2;::::0;;28408:6;:14;;-1:-1:-1;;28408:14:0;;;32609:241::o;32858:413::-;28343:6;;;;;;;28342:7;28334:27;;;;;-1:-1:-1;;;28334:27:0;;;;;;;;;;;;-1:-1:-1;;;28334:27:0;;;;;;;;;;;;;;;28372:6;:13;;;-1:-1:-1;;28372:13:0;;;;;;28117:39:::1;::::0;;::::1;::::0;;;28147:8:::1;28117:39:::0;;::::1;::::0;;;28135:10:::1;::::0;-1:-1:-1;28126:7:0;::::1;-1:-1:-1::0;;;;;;28126:7:0::1;::::0;-1:-1:-1;;28147:8:0;28117:39;;;;-1:-1:-1;28147:8:0;;-1:-1:-1;28117:39:0;::::1;;::::0;;::::1;::::0;::::1;::::0;::::1;::::0;;::::1;-1:-1:-1::0;;28117:39:0::1;::::0;;::::1;::::0;;::::1;::::0;-1:-1:-1;28117:39:0;;-1:-1:-1;;;;28117:39:0::1;32966:10:::2;::::0;-1:-1:-1;;;;;32966:10:0::2;32952;:24;32944:48;;;::::0;;-1:-1:-1;;;32944:48:0;;::::2;;::::0;::::2;::::0;::::2;::::0;;;;-1:-1:-1;;;32944:48:0;;;;;;;;;;;;;::::2;;33012:9;::::0;::::2;;33011:10;33003:32;;;::::0;;-1:-1:-1;;;33003:32:0;;::::2;;::::0;::::2;::::0;::::2;::::0;;;;-1:-1:-1;;;33003:32:0;;;;;;;;;;;;;::::2;;33054:7;:14:::0;845:1:::2;-1:-1:-1::0;33054:41:0::2;33046:64;;;::::0;;-1:-1:-1;;;33046:64:0;;::::2;;::::0;::::2;::::0;::::2;::::0;;;;-1:-1:-1;;;33046:64:0;;;;;;;;;;;;;::::2;;33123:9;:16:::0;;-1:-1:-1;;33123:16:0::2;33135:4;33123:16;::::0;;33150:10:::2;:17:::0;;-1:-1:-1;;;;33150:17:0::2;-1:-1:-1::0;;;33150:17:0::2;::::0;;33195:14:::2;::::0;33180:30:::2;::::0;:14:::2;:30::i;:::-;33221:42;33236:10;33248:14;;33221;:42::i;:::-;28408:6:::0;:14;;-1:-1:-1;;28408:14:0;;;32858:413::o;37922:928::-;28343:6;;;;;;;28342:7;28334:27;;;;;-1:-1:-1;;;28334:27:0;;;;;;;;;;;;-1:-1:-1;;;28334:27:0;;;;;;;;;;;;;;;28372:6;:13;;;-1:-1:-1;;28372:13:0;;;;;;28117:39:::1;::::0;;::::1;::::0;;;28147:8:::1;28117:39:::0;;::::1;::::0;;;28135:10:::1;::::0;-1:-1:-1;28126:7:0;::::1;-1:-1:-1::0;;;;;;28126:7:0::1;::::0;-1:-1:-1;;28147:8:0;28117:39;;;;-1:-1:-1;28147:8:0;;-1:-1:-1;28117:39:0;::::1;;::::0;;::::1;::::0;::::1;::::0;::::1;::::0;;::::1;-1:-1:-1::0;;28117:39:0::1;::::0;;::::1;::::0;;::::1;::::0;-1:-1:-1;28117:39:0;;-1:-1:-1;;;;28117:39:0::1;38064:9:::2;::::0;::::2;;38056:32;;;::::0;;-1:-1:-1;;;38056:32:0;;::::2;;::::0;::::2;::::0;::::2;::::0;;;;-1:-1:-1;;;38056:32:0;;;;;;;;;;;;;::::2;;38101:14;38118:13;:11;:13::i;:::-;38101:30;;38142:10;38155:30;38160:13;38175:9;38155:4;:30::i;:::-;38142:43:::0;-1:-1:-1;38204:10:0;38196:35:::2;;;::::0;;-1:-1:-1;;;38196:35:0;;::::2;;::::0;::::2;::::0;::::2;::::0;;;;-1:-1:-1;;;38196:35:0;;;;;;;;;;;;;::::2;;38249:6;38244:507;38265:7;:14:::0;38261:18;::::2;38244:507;;;38301:9;38313:7;38321:1;38313:10;;;;;;;;;::::0;;;::::2;::::0;;;;;::::2;::::0;-1:-1:-1;;;;;38313:10:0::2;38349:11:::0;;;:8:::2;:11:::0;;;;;;:19:::2;;::::0;38313:10;;-1:-1:-1;38349:19:0;38404:16:::2;38409:5:::0;38349:19;38404:4:::2;:16::i;:::-;38383:37:::0;-1:-1:-1;38443:18:0;38435:43:::2;;;::::0;;-1:-1:-1;;;38435:43:0;;::::2;;::::0;::::2;::::0;::::2;::::0;;;;-1:-1:-1;;;38435:43:0;;;;;;;;;;;;;::::2;;38518:12;;38531:1;38518:15;;;;;;;;;;;;;38501:13;:32;;38493:51;;;::::0;;-1:-1:-1;;;38493:51:0;;::::2;;::::0;::::2;::::0;::::2;::::0;;;;-1:-1:-1;;;38493:51:0;;;;;;;;;;;;;::::2;;-1:-1:-1::0;;;;;38586:11:0;::::2;;::::0;;;:8:::2;:11;::::0;;;;:19:::2;;::::0;38581:40:::2;::::0;38607:13;38581:4:::2;:40::i;:::-;-1:-1:-1::0;;;;;38559:11:0;::::2;;::::0;;;:8:::2;:11;::::0;;;;;;;;:19:::2;;:62:::0;;;;38641:38;;;;;;;38559:11;;38650:10:::2;::::0;38641:38:::2;::::0;;;;;;;;::::2;38694:45;38710:1;38713:10;38725:13;38694:15;:45::i;:::-;-1:-1:-1::0;;;38281:3:0::2;;38244:507;;;;38761:29;38776:13;38761:14;:29::i;:::-;38801:41;38816:10;38828:13;38801:14;:41::i;28893:19::-:0;;;;:::o;28554:26::-;;;;:::o;20399:1213::-;20643:18;20679:21;20703:32;20708:13;20723:11;20703:4;:32::i;:::-;20679:56;;20746:18;20767:31;20772:10;20784:13;20767:4;:31::i;:::-;20746:52;;20809:14;20826:31;20831:13;20846:10;20826:4;:31::i;:::-;20809:48;;20935:8;20946:35;782:6;20964:16;20946:4;:35::i;:::-;20935:46;;20992:17;21012:20;21017:9;21028:3;21012:4;:20::i;:::-;20992:40;;21043:22;21068:34;21073:12;21087:14;21068:4;:34::i;:::-;21043:59;;21113:26;21142:39;21147:17;21166:14;21142:4;:39::i;:::-;21113:68;;21434:8;21445:50;21450:35;782:6;21468:16;21450:4;:35::i;:::-;21487:7;21445:4;:50::i;:::-;21434:61;;21522:51;21527:21;21550:22;782:6;21568:3;21550:4;:22::i;21522:51::-;21506:67;20399:1213;-1:-1:-1;;;;;;;;;;;;;;;20399:1213:0:o;45281:1440::-;28343:6;;45441:18;;28343:6;;;;;28342:7;28334:27;;;;;-1:-1:-1;;;28334:27:0;;;;;;;;;;;;-1:-1:-1;;;28334:27:0;;;;;;;;;;;;;;;28372:6;:13;;;-1:-1:-1;;28372:13:0;;;;;;28117:39:::1;::::0;;::::1;::::0;;;28147:8:::1;28117:39:::0;;::::1;::::0;;;28135:10:::1;::::0;-1:-1:-1;28126:7:0;::::1;-1:-1:-1::0;;;;;;28126:7:0::1;::::0;-1:-1:-1;;28147:8:0;28117:39;;;;-1:-1:-1;28147:8:0;;-1:-1:-1;28117:39:0;::::1;;::::0;;::::1;::::0;::::1;::::0;::::1;::::0;;::::1;-1:-1:-1::0;;28117:39:0::1;::::0;;::::1;::::0;;::::1;::::0;-1:-1:-1;28117:39:0;;-1:-1:-1;;;;28117:39:0::1;45495:9:::2;::::0;::::2;;45487:32;;;::::0;;-1:-1:-1;;;45487:32:0;;::::2;;::::0;::::2;::::0;::::2;::::0;;;;-1:-1:-1;;;45487:32:0;;;;;;;;;;;;;::::2;;-1:-1:-1::0;;;;;45538:17:0;::::2;;::::0;;;:8:::2;:17;::::0;;;;:23;::::2;;45530:42;;;::::0;;-1:-1:-1;;;45530:42:0;;::::2;;::::0;::::2;::::0;::::2;::::0;;;;-1:-1:-1;;;45530:42:0;;;;;;;;;;;;;::::2;;-1:-1:-1::0;;;;;45613:17:0;::::2;;::::0;;;:8:::2;:17;::::0;;;;:25:::2;;::::0;45608:52:::2;::::0;2120:1:::2;782:6;2113:8;;45608:4;:52::i;:::-;45591:13;:69;;45583:90;;;::::0;;-1:-1:-1;;;45583:90:0;;::::2;;::::0;::::2;::::0;::::2;::::0;;;;-1:-1:-1;;;45583:90:0;;;;;;;;;;;;;::::2;;-1:-1:-1::0;;;;;45712:17:0;::::2;45686:23;45712:17:::0;;;:8:::2;:17;::::0;;;;45813:16:::2;::::0;::::2;::::0;45860:15:::2;::::0;;::::2;::::0;45906:12;;45949::::2;::::0;46036:7:::2;::::0;45758:312:::2;::::0;45813:16;45860:15;45906:12;45949;45992:13;;45758:24:::2;:312::i;:::-;45742:328;;46108:16;46091:13;:33;;46083:51;;;::::0;;-1:-1:-1;;;46083:51:0;;::::2;;::::0;::::2;::::0;::::2;::::0;;;;-1:-1:-1;;;46083:51:0;;;;;;;;;;;;;::::2;;46166:37;46171:8;:16;;;46189:13;46166:4;:37::i;:::-;46147:16;::::0;::::2;:56:::0;46221:44:::2;::::0;;;;;;;-1:-1:-1;;;;;46221:44:0;::::2;::::0;46230:10:::2;::::0;46221:44:::2;::::0;;;;::::2;::::0;;::::2;46278:29;46293:13;46278:14;:29::i;:::-;46318:51;46334:7;46343:10;46355:13;46318:15;:51::i;:::-;46380:22;46450:80;46477:7;46486:13;46509:4;46516:13;46450:26;:80::i;:::-;46413:117:::0;-1:-1:-1;46413:117:0;-1:-1:-1;46545:21:0;;46541:87:::2;;46587:41;46592:8;:16;;;46610:17;46587:4;:41::i;:::-;46568:16;::::0;::::2;:60:::0;46541:87:::2;46639:41;46654:10;46666:13;46639:14;:41::i;28996:19::-:0;;;;:::o;10599:397::-;10710:10;10666:4;10699:22;;;:10;:22;;;;;;;;-1:-1:-1;;;;;10699:27:0;;;;;;;;;;10741:14;;;10737:160;;;10783:10;10802:1;10772:22;;;:10;:22;;;;;;;;-1:-1:-1;;;;;10772:27:0;;;;;;;;;:31;10737:160;;;10866:19;10871:8;10881:3;10866:4;:19::i;:::-;10847:10;10836:22;;;;:10;:22;;;;;;;;-1:-1:-1;;;;;10836:27:0;;;;;;;;;:49;10737:160;10921:10;10938:22;;;;:10;:22;;;;;;;;-1:-1:-1;;;;;10912:54:0;;10938:27;;;;;;;;;;;10912:54;;;;;;;;;10921:10;-1:-1:-1;;;;;;;;;;;10912:54:0;;;;;;;;;;-1:-1:-1;10984:4:0;;10599:397;-1:-1:-1;;;10599:397:0:o;46729:1414::-;28343:6;;46883:18;;28343:6;;;;;28342:7;28334:27;;;;;-1:-1:-1;;;28334:27:0;;;;;;;;;;;;-1:-1:-1;;;28334:27:0;;;;;;;;;;;;;;;28372:6;:13;;;-1:-1:-1;;28372:13:0;;;;;;28117:39:::1;::::0;;::::1;::::0;;;28147:8:::1;28117:39:::0;;::::1;::::0;;;28135:10:::1;::::0;-1:-1:-1;28126:7:0;::::1;-1:-1:-1::0;;;;;;28126:7:0::1;::::0;-1:-1:-1;;28147:8:0;28117:39;;;;-1:-1:-1;28147:8:0;;-1:-1:-1;28117:39:0;::::1;;::::0;;::::1;::::0;::::1;::::0;::::1;::::0;;::::1;-1:-1:-1::0;;28117:39:0::1;::::0;;::::1;::::0;;::::1;::::0;-1:-1:-1;28117:39:0;;-1:-1:-1;;;;28117:39:0::1;46927:9:::2;::::0;::::2;;46919:32;;;::::0;;-1:-1:-1;;;46919:32:0;;::::2;;::::0;::::2;::::0;::::2;::::0;;;;-1:-1:-1;;;46919:32:0;;;;;;;;;;;;;::::2;;-1:-1:-1::0;;;;;46970:17:0;::::2;;::::0;;;:8:::2;:17;::::0;;;;:23;::::2;;46962:42;;;::::0;;-1:-1:-1;;;46962:42:0;;::::2;;::::0;::::2;::::0;::::2;::::0;;;;-1:-1:-1;;;46962:42:0;;;;;;;;;;;;;::::2;;-1:-1:-1::0;;;;;47043:17:0;::::2;47017:23;47043:17:::0;;;:8:::2;:17;::::0;;;;47144:16:::2;::::0;::::2;::::0;47191:15:::2;::::0;;::::2;::::0;47237:12;;47280::::2;::::0;47367:7:::2;::::0;47089:312:::2;::::0;47144:16;47191:15;47237:12;47280;47323:13;;47089:24:::2;:312::i;:::-;47073:328:::0;-1:-1:-1;47422:18:0;47414:43:::2;;;::::0;;-1:-1:-1;;;47414:43:0;;::::2;;::::0;::::2;::::0;::::2;::::0;;;;-1:-1:-1;;;47414:43:0;;;;;;;;;;;;;::::2;;47493:11;47476:13;:28;;47468:47;;;::::0;;-1:-1:-1;;;47468:47:0;;::::2;;::::0;::::2;::::0;::::2;::::0;;;;-1:-1:-1;;;47468:47:0;;;;;;;;;;;;;::::2;;-1:-1:-1::0;;;;;47566:17:0;::::2;;::::0;;;:8:::2;:17;::::0;;;;:25:::2;;::::0;47561:52:::2;::::0;2120:1:::2;782:6;2113:8;::::0;47561:52:::2;47544:13;:69;;47536:90;;;::::0;;-1:-1:-1;;;47536:90:0;;::::2;;::::0;::::2;::::0;::::2;::::0;;;;-1:-1:-1;;;47536:90:0;;;;;;;;;;;;;::::2;;47658:37;47663:8;:16;;;47681:13;47658:4;:37::i;:::-;47639:16;::::0;::::2;:56:::0;47713:44:::2;::::0;;;;;;;-1:-1:-1;;;;;47713:44:0;::::2;::::0;47722:10:::2;::::0;47713:44:::2;::::0;;;;::::2;::::0;;::::2;47770:29;47785:13;47770:14;:29::i;:::-;47810:41;47825:10;47837:13;47810:14;:41::i;:::-;47862:51;47878:7;47887:10;47899:13;47862:15;:51::i;:::-;47924:24;47951:49;47977:7;47986:13;47951:25;:49::i;:::-;47924:76:::0;-1:-1:-1;48015:23:0;;48011:91:::2;;48059:43;48064:8;:16;;;48082:19;48059:4;:43::i;:::-;48040:16;::::0;::::2;:62:::0;48115:20:::2;;28408:6:::0;:14;;-1:-1:-1;;28408:14:0;;;46729:1414;;-1:-1:-1;;;46729:1414:0:o;9914:111::-;-1:-1:-1;;;;;10003:14:0;9979:4;10003:14;;;;;;;;;;;;9914:111::o;22731:1312::-;22999:19;23036:21;23060:33;23065:14;23081:11;23060:4;:33::i;:::-;23036:57;;23201:29;23233:46;23238:12;23252:26;782:6;23270:7;23252:4;:26::i;:::-;23233:4;:46::i;:::-;23201:78;;23290:18;23311:42;23316:10;23328:24;23311:4;:42::i;:::-;23290:63;;23364:14;23381:31;23386:13;23401:10;23381:4;:31::i;:::-;23364:48;;23485:18;23506:52;23511:9;23522:35;782:6;23540:16;23522:4;:35::i;:::-;23506:4;:52::i;:::-;23485:73;;23569:23;23595:36;23600:13;23615:15;23595:4;:36::i;:::-;23569:62;;23644:32;23679:41;23684:15;23701:18;23679:4;:41::i;:::-;23644:76;;23857:8;23868:50;23873:35;782:6;23891:16;23873:4;:35::i;:::-;23910:7;23868:4;:50::i;:::-;23857:61;;23946:57;23951:27;23980:22;782:6;23998:3;23980:4;:22::i;23946:57::-;23929:74;;24014:21;;;;;;;;22731:1312;;;;;;;;;:::o;42657:2614::-;28343:6;;42894:18;;;;28343:6;;;;;28342:7;28334:27;;;;;-1:-1:-1;;;28334:27:0;;;;;;;;;;;;-1:-1:-1;;;28334:27:0;;;;;;;;;;;;;;;28372:6;:13;;;-1:-1:-1;;28372:13:0;;;;;;28117:39:::1;::::0;;::::1;::::0;;;28147:8:::1;28117:39:::0;;::::1;::::0;;;28135:10:::1;::::0;-1:-1:-1;28126:7:0;::::1;-1:-1:-1::0;;;;;;28126:7:0::1;::::0;-1:-1:-1;;28147:8:0;28117:39;;;;-1:-1:-1;28147:8:0;;-1:-1:-1;28117:39:0;::::1;;::::0;;::::1;::::0;::::1;::::0;::::1;::::0;;::::1;-1:-1:-1::0;;28117:39:0::1;::::0;;::::1;::::0;;::::1;::::0;-1:-1:-1;28117:39:0;;-1:-1:-1;;;;28117:39:0::1;-1:-1:-1::0;;;;;42959:17:0;::::2;;::::0;;;:8:::2;:17;::::0;;;;:23;::::2;;42951:42;;;::::0;;-1:-1:-1;;;42951:42:0;;::::2;;::::0;::::2;::::0;::::2;::::0;;;;-1:-1:-1;;;42951:42:0;;;;;;;;;;;;;::::2;;-1:-1:-1::0;;;;;43012:18:0;::::2;;::::0;;;:8:::2;:18;::::0;;;;:24;::::2;;43004:43;;;::::0;;-1:-1:-1;;;43004:43:0;;::::2;;::::0;::::2;::::0;::::2;::::0;;;;-1:-1:-1;;;43004:43:0;;;;;;;;;;;;;::::2;;43066:10;::::0;-1:-1:-1;;;43066:10:0;::::2;;;43058:34;;;::::0;;-1:-1:-1;;;43058:34:0;;::::2;;::::0;::::2;::::0;::::2;::::0;;;;-1:-1:-1;;;43058:34:0;;;;;;;;;;;;;::::2;;-1:-1:-1::0;;;;;43131:26:0;;::::2;43105:23;43131:26:::0;;;:8:::2;:26;::::0;;;;;43195:27;;::::2;::::0;;;;43266:17:::2;::::0;;::::2;::::0;43261:45:::2;::::0;782:6:::2;2177:8;::::0;43261:45:::2;43243:14;:63;;43235:84;;;::::0;;-1:-1:-1;;;43235:84:0;;::::2;;::::0;::::2;::::0;::::2;::::0;;;;-1:-1:-1;;;43235:84:0;;;;;;;;;;;;;::::2;;43332:20;43355:314;43407:8;:16;;;43462:8;:15;;;43516:9;:17;;;43572:9;:16;;;43627:7;;43355:13;:314::i;:::-;43332:337;;43707:8;43688:15;:27;;43680:51;;;::::0;;-1:-1:-1;;;43680:51:0;;::::2;;::::0;::::2;::::0;::::2;::::0;;;;-1:-1:-1;;;43680:51:0;;;;;;;;;;;;;::::2;;43760:312;43805:8;:16;;;43852:8;:15;;;43898:9;:17;;;43946:9;:16;;;43993:14;44038:7;;43760:14;:312::i;:::-;43744:328;;44108:11;44091:13;:28;;44083:47;;;::::0;;-1:-1:-1;;;44083:47:0;;::::2;;::::0;::::2;::::0;::::2;::::0;;;;-1:-1:-1;;;44083:47:0;;;;;;;;;;;;;::::2;;44162:37;44167:8;:16;;;44185:13;44162:4;:37::i;:::-;44143:8;:16;;:56;;;;44230:39;44235:9;:17;;;44254:14;44230:4;:39::i;:::-;44210:17;::::0;;::::2;:59:::0;;;44347:16;::::2;::::0;44398:15:::2;::::0;;::::2;::::0;44500:16;;::::2;::::0;44551:7:::2;::::0;44299:290:::2;::::0;44210:59;44500:16;44299:13:::2;:290::i;:::-;44282:307;;44626:15;44608:14;:33;;44600:58;;;::::0;;-1:-1:-1;;;44600:58:0;;::::2;;::::0;::::2;::::0;::::2;::::0;;;;-1:-1:-1;;;44600:58:0;;;;;;;;;;;;;::::2;;44695:8;44677:14;:26;;44669:48;;;::::0;;-1:-1:-1;;;44669:48:0;;::::2;;::::0;::::2;::::0;::::2;::::0;;;;-1:-1:-1;;;44669:48:0;;;;;;;;;;;;;::::2;;44755:35;44760:13;44775:14;44755:4;:35::i;:::-;44736:15;:54;;44728:79;;;::::0;;-1:-1:-1;;;44728:79:0;;::::2;;::::0;::::2;::::0;::::2;::::0;;;;-1:-1:-1;;;44728:79:0;;;;;;;;;;;;;::::2;;44855:8;-1:-1:-1::0;;;;;44825:70:0::2;44846:7;-1:-1:-1::0;;;;;44825:70:0::2;44834:10;-1:-1:-1::0;;;;;44825:70:0::2;;44865:13;44880:14;44825:70;;;;;;;;;;;;;;;;;;;;;;;;44908:51;44924:7;44933:10;44945:13;44908:15;:51::i;:::-;44970:53;44986:8;44996:10;45008:14;44970:15;:53::i;:::-;45034:24;45061:49;45087:7;45096:13;45061:25;:49::i;:::-;45034:76:::0;-1:-1:-1;45125:23:0;;45121:91:::2;;45169:43;45174:8;:16;;;45192:19;45169:4;:43::i;:::-;45150:16;::::0;::::2;:62:::0;45121:91:::2;45225:38;;;;28408:6:::0;:14;;-1:-1:-1;;28408:14:0;;;42657:2614;;;;-1:-1:-1;42657:2614:0;-1:-1:-1;;;;42657:2614:0:o;39967:2682::-;28343:6;;40203:19;;;;28343:6;;;;;28342:7;28334:27;;;;;-1:-1:-1;;;28334:27:0;;;;;;;;;;;;-1:-1:-1;;;28334:27:0;;;;;;;;;;;;;;;28372:6;:13;;;-1:-1:-1;;28372:13:0;;;;;;28117:39:::1;::::0;;::::1;::::0;;;28147:8:::1;28117:39:::0;;::::1;::::0;;;28135:10:::1;::::0;-1:-1:-1;28126:7:0;::::1;-1:-1:-1::0;;;;;;28126:7:0::1;::::0;-1:-1:-1;;28147:8:0;28117:39;;;;-1:-1:-1;28147:8:0;;-1:-1:-1;28117:39:0;::::1;;::::0;;::::1;::::0;::::1;::::0;::::1;::::0;;::::1;-1:-1:-1::0;;28117:39:0::1;::::0;;::::1;::::0;;::::1;::::0;-1:-1:-1;28117:39:0;;-1:-1:-1;;;;28117:39:0::1;-1:-1:-1::0;;;;;40271:17:0;::::2;;::::0;;;:8:::2;:17;::::0;;;;:23;::::2;;40263:42;;;::::0;;-1:-1:-1;;;40263:42:0;;::::2;;::::0;::::2;::::0;::::2;::::0;;;;-1:-1:-1;;;40263:42:0;;;;;;;;;;;;;::::2;;-1:-1:-1::0;;;;;40324:18:0;::::2;;::::0;;;:8:::2;:18;::::0;;;;:24;::::2;;40316:43;;;::::0;;-1:-1:-1;;;40316:43:0;;::::2;;::::0;::::2;::::0;::::2;::::0;;;;-1:-1:-1;;;40316:43:0;;;;;;;;;;;;;::::2;;40378:10;::::0;-1:-1:-1;;;40378:10:0;::::2;;;40370:34;;;::::0;;-1:-1:-1;;;40370:34:0;;::::2;;::::0;::::2;::::0;::::2;::::0;;;;-1:-1:-1;;;40370:34:0;;;;;;;;;;;;;::::2;;-1:-1:-1::0;;;;;40443:26:0;;::::2;40417:23;40443:26:::0;;;:8:::2;:26;::::0;;;;;40507:27;;::::2;::::0;;;;40577:16:::2;::::0;::::2;::::0;40572:43:::2;::::0;2120:1:::2;782:6;2113:8;::::0;40572:43:::2;40555:13;:60;;40547:81;;;::::0;;-1:-1:-1;;;40547:81:0;;::::2;;::::0;::::2;::::0;::::2;::::0;;;;-1:-1:-1;;;40547:81:0;;;;;;;;;;;;;::::2;;40641:20;40664:314;40716:8;:16;;;40771:8;:15;;;40825:9;:17;;;40881:9;:16;;;40936:7;;40664:13;:314::i;:::-;40641:337;;41016:8;40997:15;:27;;40989:51;;;::::0;;-1:-1:-1;;;40989:51:0;;::::2;;::::0;::::2;::::0;::::2;::::0;;;;-1:-1:-1;;;40989:51:0;;;;;;;;;;;;;::::2;;41070:311;41115:8;:16;;;41162:8;:15;;;41208:9;:17;;;41256:9;:16;;;41303:13;41347:7;;41070:14;:311::i;:::-;41053:328;;41418:12;41400:14;:30;;41392:48;;;::::0;;-1:-1:-1;;;41392:48:0;;::::2;;::::0;::::2;::::0;::::2;::::0;;;;-1:-1:-1;;;41392:48:0;;;;;;;;;;;;;::::2;;41472:37;41477:8;:16;;;41495:13;41472:4;:37::i;:::-;41453:8;:16;;:56;;;;41540:39;41545:9;:17;;;41564:14;41540:4;:39::i;:::-;41520:17;::::0;;::::2;:59:::0;;;41657:16;::::2;::::0;41708:15:::2;::::0;;::::2;::::0;41810:16;;::::2;::::0;41861:7:::2;::::0;41609:290:::2;::::0;41520:59;41810:16;41609:13:::2;:290::i;:::-;41592:307;;41936:15;41918:14;:33;;41910:58;;;::::0;;-1:-1:-1;;;41910:58:0;;::::2;;::::0;::::2;::::0;::::2;::::0;;;;-1:-1:-1;;;41910:58:0;;;;;;;;;;;;;::::2;;42005:8;41987:14;:26;;41979:48;;;::::0;;-1:-1:-1;;;41979:48:0;;::::2;;::::0;::::2;::::0;::::2;::::0;;;;-1:-1:-1;;;41979:48:0;;;;;;;;;;;;;::::2;;42065:35;42070:13;42085:14;42065:4;:35::i;:::-;42046:15;:54;;42038:79;;;::::0;;-1:-1:-1;;;42038:79:0;;::::2;;::::0;::::2;::::0;::::2;::::0;;;;-1:-1:-1;;;42038:79:0;;;;;;;;;;;;;::::2;;42165:8;-1:-1:-1::0;;;;;42135:70:0::2;42156:7;-1:-1:-1::0;;;;;42135:70:0::2;42144:10;-1:-1:-1::0;;;;;42135:70:0::2;;42175:13;42190:14;42135:70;;;;;;;;;;;;;;;;;;;;;;;;42218:51;42234:7;42243:10;42255:13;42218:15;:51::i;:::-;42280:22;42351:76;42378:7;42387:13;42402:8;42412:14;42351:26;:76::i;:::-;42313:114:::0;-1:-1:-1;42313:114:0;-1:-1:-1;42442:21:0;;42438:87:::2;;42484:41;42489:8;:16;;;42507:17;42484:4;:41::i;:::-;42465:16;::::0;::::2;:60:::0;42438:87:::2;42536:53;42552:8;42562:10;42574:14;42536:15;:53::i;18198:1183::-:0;18442:18;18729:21;18753:32;18758:13;18773:11;18753:4;:32::i;:::-;18729:56;;18796:8;18807:50;18812:35;782:6;18830:16;18812:4;:35::i;:::-;18849:7;18807:4;:50::i;:::-;18796:61;;18868:26;18897:43;18902:13;18917:22;782:6;18935:3;18917:4;:22::i;18897:43::-;18868:72;;18953:22;18978:43;18983:14;18999:21;18978:4;:43::i;:::-;18953:68;;19032:17;19052:39;19057:17;19076:14;19052:4;:39::i;:::-;19032:59;;19172:14;19189:36;19194:12;19208:16;19189:4;:36::i;:::-;19172:53;;19236:18;19257:27;19262:9;19273:10;19257:4;:27::i;:::-;19236:48;;19311:31;19316:13;19331:10;19311:4;:31::i;:::-;19295:47;18198:1183;-1:-1:-1;;;;;;;;;;;;;;18198:1183:0:o;28716:22::-;;;-1:-1:-1;;;28716:22:0;;;;;:::o;36727:218::-;28135:10;-1:-1:-1;;;;;28117:39:0;28126:7;;-1:-1:-1;;;;;;28126:7:0;-1:-1:-1;;;;;28117:39:0;;28147:8;;28117:39;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;28117:39:0;;;;;;;;-1:-1:-1;28117:39:0;;-1:-1:-1;;;;28117:39:0;28343:6:::1;::::0;::::1;::::0;::::1;;;28342:7;28334:27;;;::::0;;-1:-1:-1;;;28334:27:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;-1:-1:-1;;;28334:27:0;;;;;;;;;;;;;::::1;;28372:6;:13:::0;;-1:-1:-1;;28372:13:0::1;;;::::0;;-1:-1:-1;;;;;36830:15:0;::::2;28372:13:::0;36830:15;;;:8:::2;:15;::::0;;;;:21;28372:13:::1;36830:21:::2;36822:40;;;::::0;;-1:-1:-1;;;36822:40:0;;::::2;;::::0;::::2;::::0;::::2;::::0;;;;-1:-1:-1;;;36822:40:0;;;;;;;;;;;;;::::2;;36899:38;::::0;;-1:-1:-1;;;36899:38:0;;36931:4:::2;36899:38;::::0;::::2;::::0;;;-1:-1:-1;;;;;36899:23:0;::::2;::::0;::::2;::::0;:38;;;;;::::2;::::0;;;;;;;;:23;:38;::::2;;::::0;::::2;;;;::::0;::::2;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;;;;;;;;::::0;::::2;;-1:-1:-1::0;36899:38:0;-1:-1:-1;;;;;36873:15:0;;::::2;;::::0;;;:8:::2;36899:38;36873:15:::0;;;;:23:::2;;:64:::0;28408:6:::1;:14:::0;;-1:-1:-1;;28408:14:0::1;::::0;;36727:218::o;32400:201::-;28343:6;;;;;;;28342:7;28334:27;;;;;-1:-1:-1;;;28334:27:0;;;;;;;;;;;;-1:-1:-1;;;28334:27:0;;;;;;;;;;;;;;;28372:6;:13;;;-1:-1:-1;;28372:13:0;;;;;;28117:39:::1;::::0;;::::1;::::0;;;28147:8:::1;28117:39:::0;;::::1;::::0;;;28135:10:::1;::::0;-1:-1:-1;28126:7:0;::::1;-1:-1:-1::0;;;;;;28126:7:0::1;::::0;-1:-1:-1;;28147:8:0;28117:39;;;;-1:-1:-1;28147:8:0;;-1:-1:-1;28117:39:0;::::1;;::::0;;::::1;::::0;::::1;::::0;::::1;::::0;;::::1;-1:-1:-1::0;;28117:39:0::1;::::0;;::::1;::::0;;::::1;::::0;-1:-1:-1;28117:39:0;;-1:-1:-1;;;;28117:39:0::1;32532:10:::2;::::0;-1:-1:-1;;;;;32532:10:0::2;32518;:24;32510:48;;;::::0;;-1:-1:-1;;;32510:48:0;;::::2;;::::0;::::2;::::0;::::2;::::0;;;;-1:-1:-1;;;32510:48:0;;;;;;;;;;;;;::::2;;32569:10;:24:::0;;-1:-1:-1;;;;;;32569:24:0::2;-1:-1:-1::0;;;;;32569:24:0;;;::::2;::::0;;;::::2;::::0;;28408:6;:14;;-1:-1:-1;;28408:14:0;;;32400:201::o;31328:148::-;28480:6;;31427:4;;28480:6;;;;;28479:7;28471:27;;;;;-1:-1:-1;;;28471:27:0;;;;;;;;;;;;-1:-1:-1;;;28471:27:0;;;;;;;;;;;;;;;-1:-1:-1;31456:12:0::1;::::0;31328:148;:::o;31101:219::-;28480:6;;31208:4;;28480:6;;;;;28479:7;28471:27;;;;;-1:-1:-1;;;28471:27:0;;;;;;;;;;;;-1:-1:-1;;;28471:27:0;;;;;;;;;;;;;;;-1:-1:-1;;;;;31240:15:0;::::1;;::::0;;;:8:::1;:15;::::0;;;;:21;::::1;;31232:40;;;::::0;;-1:-1:-1;;;31232:40:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;-1:-1:-1;;;31232:40:0;;;;;;;;;;;;;::::1;;-1:-1:-1::0;;;;;;31290:15:0::1;;::::0;;;:8:::1;:15;::::0;;;;:22:::1;;::::0;;31101:219::o;9592:87::-;9664:7;9657:14;;;;;;;;-1:-1:-1;;9657:14:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;9631:13;;9657:14;;9664:7;;9657:14;;9664:7;9657:14;;;;;;;;;;;;;;;;;;;;;;;;13237:523;13449:14;13481:10;13494:35;13499:14;13515:13;13494:4;:35::i;:::-;13481:48;;13540:10;13553:37;13558:15;13575:14;13553:4;:37::i;:::-;13540:50;;13601:10;13614:18;13619:5;13626;13614:4;:18::i;:::-;13601:31;;13643:10;13656:45;782:6;13674:26;782:6;13692:7;13674:4;:26::i;13656:45::-;13643:58;;13733:18;13738:5;13745;13733:4;:18::i;:::-;13721:30;13237:523;-1:-1:-1;;;;;;;;;;13237:523:0:o;11004:142::-;11072:4;11089:27;11095:10;11107:3;11112;11089:5;:27::i;:::-;-1:-1:-1;11134:4:0;11004:142;;;;:::o;38858:1099::-;28343:6;;;;;;;28342:7;28334:27;;;;;-1:-1:-1;;;28334:27:0;;;;;;;;;;;;-1:-1:-1;;;28334:27:0;;;;;;;;;;;;;;;28372:6;:13;;;-1:-1:-1;;28372:13:0;;;;;;28117:39:::1;::::0;;::::1;::::0;;;28147:8:::1;28117:39:::0;;::::1;::::0;;;28135:10:::1;::::0;-1:-1:-1;28126:7:0;::::1;-1:-1:-1::0;;;;;;28126:7:0::1;::::0;-1:-1:-1;;28147:8:0;28117:39;;;;-1:-1:-1;28147:8:0;;-1:-1:-1;28117:39:0;::::1;;::::0;;::::1;::::0;::::1;::::0;::::1;::::0;;::::1;-1:-1:-1::0;;28117:39:0::1;::::0;;::::1;::::0;;::::1;::::0;-1:-1:-1;28117:39:0;;-1:-1:-1;;;;28117:39:0::1;39000:9:::2;::::0;::::2;;38992:32;;;::::0;;-1:-1:-1;;;38992:32:0;;::::2;;::::0;::::2;::::0;::::2;::::0;;;;-1:-1:-1;;;38992:32:0;;;;;;;;;;;;;::::2;;39037:14;39054:13;:11;:13::i;:::-;39037:30;;39078:13;39094:27;39099:12;39113:7;;39094:4;:27::i;:::-;39078:43;;39132:20;39155:28;39160:12;39174:8;39155:4;:28::i;:::-;39132:51;;39194:10;39207:32;39212:15;39229:9;39207:4;:32::i;:::-;39194:45:::0;-1:-1:-1;39258:10:0;39250:35:::2;;;::::0;;-1:-1:-1;;;39250:35:0;;::::2;;::::0;::::2;::::0;::::2;::::0;;;;-1:-1:-1;;;39250:35:0;;;;;;;;;;;;;::::2;;39298:40;39313:10;39325:12;39298:14;:40::i;:::-;39364:7;::::0;39349:33:::2;::::0;-1:-1:-1;;;;;39364:7:0::2;39373:8:::0;39349:14:::2;:33::i;:::-;39393:31;39408:15;39393:14;:31::i;:::-;39442:6;39437:513;39458:7;:14:::0;39454:18;::::2;39437:513;;;39494:9;39506:7;39514:1;39506:10;;;;;;;;;::::0;;;::::2;::::0;;;;;::::2;::::0;-1:-1:-1;;;;;39506:10:0::2;39542:11:::0;;;:8:::2;:11:::0;;;;;;:19:::2;;::::0;39506:10;;-1:-1:-1;39542:19:0;39598:16:::2;39603:5:::0;39542:19;39598:4:::2;:16::i;:::-;39576:38:::0;-1:-1:-1;39637:19:0;39629:44:::2;;;::::0;;-1:-1:-1;;;39629:44:0;;::::2;;::::0;::::2;::::0;::::2;::::0;;;;-1:-1:-1;;;39629:44:0;;;;;;;;;;;;;::::2;;39714:13;;39728:1;39714:16;;;;;;;;;;;;;39696:14;:34;;39688:52;;;::::0;;-1:-1:-1;;;39688:52:0;;::::2;;::::0;::::2;::::0;::::2;::::0;;;;-1:-1:-1;;;39688:52:0;;;;;;;;;;;;;::::2;;-1:-1:-1::0;;;;;39782:11:0;::::2;;::::0;;;:8:::2;:11;::::0;;;;:19:::2;;::::0;39777:41:::2;::::0;39803:14;39777:4:::2;:41::i;:::-;-1:-1:-1::0;;;;;39755:11:0;::::2;;::::0;;;:8:::2;:11;::::0;;;;;;;;:19:::2;;:63:::0;;;;39838:39;;;;;;;39755:11;;39847:10:::2;::::0;39838:39:::2;::::0;;;;;;;;::::2;39892:46;39908:1;39911:10;39923:14;39892:15;:46::i;:::-;-1:-1:-1::0;;;39474:3:0::2;;39437:513;;;-1:-1:-1::0;;28408:6:0;:14;;-1:-1:-1;;28408:14:0;;;-1:-1:-1;;;;;;38858:1099:0:o;29022:21::-;;;;;;:::o;14778:697::-;15020:19;15057:16;15076:35;15081:13;15096:14;15076:4;:35::i;:::-;15057:54;;15122:15;15140:26;782:6;15158:7;15140:4;:26::i;:::-;15122:44;;15190:31;15195:13;15210:10;15190:4;:31::i;:::-;15177:44;;15232:6;15241:54;15246:14;15262:32;15267:14;15283:10;15262:4;:32::i;15241:54::-;15232:63;;15306:8;15317:20;15322:1;15325:11;15317:4;:20::i;:::-;15306:31;;15348:8;15359:22;782:6;15377:3;15359:4;:22::i;:::-;15348:33;;15409:26;15414:15;15431:3;15409:4;:26::i;:::-;15392:43;14778:697;-1:-1:-1;;;;;;;;;;;;14778:697:0:o;30900:193::-;28480:6;;30987:23;;28480:6;;;;;28479:7;28471:27;;;;;-1:-1:-1;;;28471:27:0;;;;;;;;;;;;-1:-1:-1;;;28471:27:0;;;;;;;;;;;;;;;31036:9:::1;::::0;::::1;;31028:32;;;::::0;;-1:-1:-1;;;31028:32:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;-1:-1:-1;;;31028:32:0;;;;;;;;;;;;;::::1;;31078:7;31071:14;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;;-1:-1:-1;;;;;31071:14:0::1;::::0;;;;;::::1;::::0;::::1;;::::0;;::::1;;;;;;;;;;30900:193:::0;:::o;28587:22::-;;;-1:-1:-1;;;;;28587:22:0;;:::o;30749:143::-;28480:6;;30829:23;;28480:6;;;;;28479:7;28471:27;;;;;-1:-1:-1;;;28471:27:0;;;;;;;;;;;;-1:-1:-1;;;28471:27:0;;;;;;;;;;;;;;30624:117;30719:7;:14;30624:117;:::o;35626:1016::-;28343:6;;;;;;;28342:7;28334:27;;;;;-1:-1:-1;;;28334:27:0;;;;;;;;;;;;-1:-1:-1;;;28334:27:0;;;;;;;;;;;;;;;28372:6;:13;;;-1:-1:-1;;28372:13:0;;;;;;28117:39:::1;::::0;;::::1;::::0;;;28147:8:::1;28117:39:::0;;::::1;::::0;;;28135:10:::1;::::0;-1:-1:-1;28126:7:0;::::1;-1:-1:-1::0;;;;;;28126:7:0::1;::::0;-1:-1:-1;;28147:8:0;28117:39;;;;-1:-1:-1;28147:8:0;;-1:-1:-1;28117:39:0;::::1;;::::0;;::::1;::::0;::::1;::::0;::::1;::::0;;::::1;-1:-1:-1::0;;28117:39:0::1;::::0;;::::1;::::0;;::::1;::::0;-1:-1:-1;28117:39:0;;-1:-1:-1;;;;28117:39:0::1;35747:10:::2;::::0;-1:-1:-1;;;;;35747:10:0::2;35733;:24;35725:48;;;::::0;;-1:-1:-1;;;35725:48:0;;::::2;;::::0;::::2;::::0;::::2;::::0;;;;-1:-1:-1;;;35725:48:0;;;;;;;;;;;;;::::2;;-1:-1:-1::0;;;;;35792:15:0;::::2;;::::0;;;:8:::2;:15;::::0;;;;:21;::::2;;35784:40;;;::::0;;-1:-1:-1;;;35784:40:0;;::::2;;::::0;::::2;::::0;::::2;::::0;;;;-1:-1:-1;;;35784:40:0;;;;;;;;;;;;;::::2;;35844:9;::::0;::::2;;35843:10;35835:32;;;::::0;;-1:-1:-1;;;35835:32:0;;::::2;;::::0;::::2;::::0;::::2;::::0;;;;-1:-1:-1;;;35835:32:0;;;;;;;;;;;;;::::2;;-1:-1:-1::0;;;;;35900:15:0;::::2;35880:17;35900:15:::0;;;:8:::2;:15;::::0;;;;:23:::2;;::::0;35973:7:::2;::::0;35900:23;;35880:17;35954:27:::2;::::0;35900:23;;35954:4:::2;:27::i;:::-;36014:12;::::0;-1:-1:-1;;;;;36028:15:0;::::2;;::::0;;;:8:::2;:15;::::0;;;;:22:::2;;::::0;35934:47;;-1:-1:-1;36009:42:0::2;::::0;:4:::2;:42::i;:::-;35994:12;:57:::0;-1:-1:-1;;;;;36174:15:0;::::2;36161:10;36174:15:::0;;;:8:::2;:15;::::0;;;;:21:::2;;::::0;36218:7:::2;:14:::0;;-1:-1:-1;;36218:18:0;;;:7;:18;;36264:13;::::2;;;;;;::::0;;;::::2;::::0;;;::::2;::::0;36247:7:::2;:14:::0;;-1:-1:-1;;;;;36264:13:0;;::::2;::::0;36255:5;;36247:14;::::2;;;;;;;;;;;;;:30;;;;;-1:-1:-1::0;;;;;36247:30:0::2;;;;;-1:-1:-1::0;;;;;36247:30:0::2;;;;;;36321:5;36288:8;:24;36297:7;36305:5;36297:14;;;;;;;;;::::0;;;::::2;::::0;;;;;::::2;::::0;-1:-1:-1;;;;;36297:14:0::2;36288:24:::0;;;::::2;::::0;;;;;;;;36297:14;36288:30:::2;:38:::0;36337:7:::2;:13:::0;;;::::2;;;;;::::0;;;::::2;::::0;;;-1:-1:-1;;36337:13:0;;;;;;;-1:-1:-1;;;;;;36337:13:0::2;::::0;;;;;;;;36379:118:::2;::::0;;::::2;::::0;::::2;::::0;;;;;;;::::2;::::0;;;;;;;;;;;;;;;-1:-1:-1;;;;;36361:15:0;::::2;::::0;;:8:::2;:15:::0;;;;;;;:136;;;;-1:-1:-1;;36361:136:0::2;::::0;::::2;;;::::0;;;;-1:-1:-1;36361:136:0;::::2;::::0;;::::2;::::0;::::2;::::0;;::::2;::::0;;::::2;::::0;36510:68:::2;36361:15:::0;36533:10:::2;36545:32;36550:12:::0;36564;36545:4:::2;:32::i;36510:68::-;36612:7;::::0;36589:45:::2;::::0;36605:5;;-1:-1:-1;;;;;36612:7:0::2;36621:12:::0;36589:15:::2;:45::i;10339:252::-:0;10469:10;10406:4;10458:22;;;:10;:22;;;;;;;;-1:-1:-1;;;;;10458:27:0;;;;;;;;;;10453:38;;10487:3;10453:4;:38::i;:::-;10434:10;10423:22;;;;:10;:22;;;;;;;;-1:-1:-1;;;;;10423:27:0;;;;;;;;;;;;:68;;;10507:54;;;;;;10423:27;;-1:-1:-1;;;;;;;;;;;10507:54:0;;;;;;;;;;-1:-1:-1;10579:4:0;10339:252;;;;:::o;9777:129::-;-1:-1:-1;;;;;9878:15:0;;;9854:4;9878:15;;;:10;:15;;;;;;;;:20;;;;;;;;;;;;;9777:129::o;33281:712::-;28135:10;-1:-1:-1;;;;;28117:39:0;28126:7;;-1:-1:-1;;;;;;28126:7:0;-1:-1:-1;;;;;28117:39:0;;28147:8;;28117:39;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;28117:39:0;;;;;;;;-1:-1:-1;28117:39:0;;-1:-1:-1;;;;28117:39:0;33489:10:::1;::::0;-1:-1:-1;;;;;33489:10:0::1;33475;:24;33467:48;;;::::0;;-1:-1:-1;;;33467:48:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;-1:-1:-1;;;33467:48:0;;;;;;;;;;;;;::::1;;-1:-1:-1::0;;;;;33535:15:0;::::1;;::::0;;;:8:::1;:15;::::0;;;;:21;::::1;;33534:22;33526:40;;;::::0;;-1:-1:-1;;;33526:40:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;-1:-1:-1;;;33526:40:0;;;;;;;;;;;;;::::1;;33586:9;::::0;::::1;;33585:10;33577:32;;;::::0;;-1:-1:-1;;;33577:32:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;-1:-1:-1;;;33577:32:0;;;;;;;;;;;;;::::1;;33630:7;:14:::0;901:1:::1;-1:-1:-1::0;33622:63:0::1;;;::::0;;-1:-1:-1;;;33622:63:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;-1:-1:-1;;;33622:63:0;;;;;;;;;;;;;::::1;;33716:198;::::0;;::::1;::::0;::::1;::::0;;33745:4:::1;33716:198:::0;;;33771:7:::1;:14:::0;;33716:198:::1;::::0;;::::1;::::0;;;-1:-1:-1;33716:198:0;;;;;;;;;;;;-1:-1:-1;;;;;33698:15:0;::::1;::::0;;;:8:::1;:15:::0;;;;;;:216;;;;-1:-1:-1;;33698:216:0::1;::::0;::::1;;;::::0;;;;;;::::1;::::0;;;::::1;::::0;::::1;::::0;;;::::1;::::0;;::::1;::::0;;;;33925:19;;;;::::1;::::0;;;;;;::::1;::::0;;-1:-1:-1;;;;;;33925:19:0::1;::::0;;::::1;::::0;;33955:30:::1;33698:15:::0;33969:7;33978:6;33955::::1;:30::i;:::-;33281:712:::0;;;:::o;30237:248::-;28135:10;-1:-1:-1;;;;;28117:39:0;28126:7;;-1:-1:-1;;;;;;28126:7:0;-1:-1:-1;;;;;28117:39:0;;28147:8;;28117:39;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;28117:39:0;;;;;;;;-1:-1:-1;28117:39:0;;-1:-1:-1;;;;28117:39:0;30306:9:::1;::::0;::::1;;30305:10;30297:32;;;::::0;;-1:-1:-1;;;30297:32:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;-1:-1:-1;;;30297:32:0;;;;;;;;;;;;;::::1;;30362:7;::::0;-1:-1:-1;;;;;30362:7:0::1;30348:10;:21;30340:42;;;::::0;;-1:-1:-1;;;30340:42:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;-1:-1:-1;;;30340:42:0;;;;;;;;;;;;;::::1;;1376:11:::0;30401:31;::::1;;30393:55;;;::::0;;-1:-1:-1;;;30393:55:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;-1:-1:-1;;;30393:55:0;;;;;;;;;;;;;::::1;;30459:7;:18:::0;30237:248::o;28919:24::-;;;;:::o;31484:268::-;28480:6;;31589:4;;28480:6;;;;;28479:7;28471:27;;;;;-1:-1:-1;;;28471:27:0;;;;;;;;;;;;-1:-1:-1;;;28471:27:0;;;;;;;;;;;;;;;-1:-1:-1;;;;;31621:15:0;::::1;;::::0;;;:8:::1;:15;::::0;;;;:21;::::1;;31613:40;;;::::0;;-1:-1:-1;;;31613:40:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;-1:-1:-1;;;31613:40:0;;;;;;;;;;;;;::::1;;-1:-1:-1::0;;;;;31678:15:0;::::1;31664:11;31678:15:::0;;;:8:::1;:15;::::0;;;;:22:::1;;::::0;31731:12:::1;::::0;31718:26:::1;::::0;31678:22;;31718:4:::1;:26::i;:::-;31711:33:::0;31484:268;-1:-1:-1;;;31484:268:0:o;28664:25::-;;;-1:-1:-1;;;;;28664:25:0;;:::o;31760:209::-;28480:6;;31856:4;;28480:6;;;;;28479:7;28471:27;;;;;-1:-1:-1;;;28471:27:0;;;;;;;;;;;;-1:-1:-1;;;28471:27:0;;;;;;;;;;;;;;;-1:-1:-1;;;;;31888:15:0;::::1;;::::0;;;:8:::1;:15;::::0;;;;:21;::::1;;31880:40;;;::::0;;-1:-1:-1;;;31880:40:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;-1:-1:-1;;;31880:40:0;;;;;;;;;;;;;::::1;;-1:-1:-1::0;;;;;;31938:15:0::1;;::::0;;;:8:::1;:15;::::0;;;;:23:::1;;::::0;;31760:209::o;16493:686::-;16736:18;16772:16;16791:35;16796:14;16812:13;16791:4;:35::i;:::-;16772:54;;16837:9;16849:37;16854:15;16871:14;16849:4;:37::i;:::-;16837:49;;16897:6;16906:27;16911:15;16928:4;16906;:27::i;:::-;16897:36;;16944:8;16955:20;16960:1;16963:11;16955:4;:20::i;:::-;16944:31;;16992:22;16997:3;782:6;16992:4;:22::i;:::-;16986:28;;17041:26;782:6;17059:7;17041:4;:26::i;:::-;17025:42;;17094:46;17099:25;17104:14;17120:3;17099:4;:25::i;:::-;17126:13;17094:4;:46::i;:::-;17078:62;16493:686;-1:-1:-1;;;;;;;;;;;16493:686:0:o;4076:389::-;4147:4;4177:6;4169:27;;;;;-1:-1:-1;;;4169:27:0;;;;;;;;;;;;-1:-1:-1;;;4169:27:0;;;;;;;;;;;;;;;782:6;4217:15;;4251:6;;;:31;;;782:6;4266:1;4261:2;:6;;;;;;:21;4251:31;4243:56;;;;;-1:-1:-1;;;4243:56:0;;;;;;;;;;;;-1:-1:-1;;;4243:56:0;;;;;;;;;;;;;;;4347:1;4343:5;;4337:12;;4368:8;;;;4360:33;;;;;-1:-1:-1;;;4360:33:0;;;;;;;;;;;;-1:-1:-1;;;4360:33:0;;;;;;;;;;;;;;;4421:7;4436:1;4431:2;:6;;;;;;;4076:389;-1:-1:-1;;;;;;4076:389:0:o;3314:198::-;3385:4;3408:6;3416:9;3429:14;3438:1;3441;3429:8;:14::i;:::-;3407:36;;;;3463:4;3462:5;3454:31;;;;;-1:-1:-1;;;3454:31:0;;;;;;;;;;;;-1:-1:-1;;;3454:31:0;;;;;;;;;;;;;;;-1:-1:-1;3503:1:0;3314:198;-1:-1:-1;;;3314:198:0:o;3751:317::-;3822:4;3854:5;;;3878:6;;;:21;;;3898:1;3893;3888:2;:6;;;;;;:11;3878:21;3870:46;;;;;-1:-1:-1;;;3870:46:0;;;;;;;;;;;;-1:-1:-1;;;3870:46:0;;;;;;;;;;;;;;;3943:15;3937:22;;3978:8;;;;3970:33;;;;;-1:-1:-1;;;3970:33:0;;;;;;;;;;;;-1:-1:-1;;;3970:33:0;;;;;;;;;;;;;;;4014:7;782:6;4024:2;:16;;4975:558;5051:4;1910:5;5081:4;:28;;5073:53;;;;;-1:-1:-1;;;5073:53:0;;;;;;;;;;;;-1:-1:-1;;;5073:53:0;;;;;;;;;;;;;;;1970:18;5145:28;;;5137:54;;;;;-1:-1:-1;;;5137:54:0;;;;;;;;;;;;-1:-1:-1;;;5137:54:0;;;;;;;;;;;;;;;5204:10;5218:11;5225:3;5218:6;:11::i;:::-;5204:25;;5243:11;5257:16;5262:3;5267:5;5257:4;:16::i;:::-;5243:30;;5286:13;5302:24;5308:4;5314:11;5319:5;5314:4;:11::i;:::-;5302:5;:24::i;:::-;5286:40;-1:-1:-1;5343:11:0;5339:59;;5378:8;-1:-1:-1;5371:15:0;;-1:-1:-1;;5371:15:0;5339:59;5410:18;5431:47;5442:4;5448:6;2043:13;5431:10;:47::i;:::-;5410:68;;5496:29;5501:8;5511:13;5496:4;:29::i;:::-;5489:36;4975:558;-1:-1:-1;;;;;;;4975:558:0:o;51712:112::-;51797:19;51803:4;51809:6;51797:5;:19::i;:::-;51712:112;;:::o;53228:581::-;53393:12;;53320:23;;53393:16;53389:413;;53462:7;;53452:35;;;-1:-1:-1;;;53452:35:0;;;;53426:23;;-1:-1:-1;;;;;53462:7:0;;53452:33;;:35;;;;;;;;;;;;;;53462:7;53452:35;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;53452:35:0;;-1:-1:-1;;;;;;53506:29:0;;;53502:289;;53577:53;53582:34;53587:14;53603:12;;53582:4;:34::i;:::-;782:6;53577:4;:53::i;:::-;53675:7;;53556:74;;-1:-1:-1;53649:54:0;;53665:8;;-1:-1:-1;;;;;53675:7:0;53556:74;53649:15;:54::i;:::-;53727:48;;;;;;;;-1:-1:-1;;;;;53727:48:0;;;;;;;;;;;;;53502:289;53389:413;53228:581;;;;:::o;52048:92::-;52119:13;52125:6;52119:5;:13::i;:::-;52048:92;:::o;51832:108::-;51915:17;51921:2;51925:6;51915:5;:17::i;51515:189::-;51614:9;51633:5;-1:-1:-1;;;;;51626:22:0;;51649:2;51653:6;51626:34;;;;;;;;;;;;;-1:-1:-1;;;;;51626:34:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;51626:34:0;;-1:-1:-1;51626:34:0;51671:25;;;;;-1:-1:-1;;;51671:25:0;;;;;;;;;;;;-1:-1:-1;;;51671:25:0;;;;;;;;;;;;;;;51515:189;;;;:::o;8844:257::-;-1:-1:-1;;;;;8923:13:0;;:8;:13;;;;;;;;;;;:20;-1:-1:-1;8923:20:0;8915:37;;;;;-1:-1:-1;;;8915:37:0;;;;;;;;;;;;;;;-1:-1:-1;;;8915:37:0;;;;;;;;;;;;;;;-1:-1:-1;;;;;8984:13:0;;:8;:13;;;;;;;;;;;8979:24;;8999:3;8979:4;:24::i;:::-;-1:-1:-1;;;;;8963:13:0;;;:8;:13;;;;;;;;;;;:40;;;;9035:13;;;;;;;9030:24;;9050:3;9030:4;:24::i;:::-;-1:-1:-1;;;;;9014:13:0;;;:8;:13;;;;;;;;;;;;:40;;;;9070:23;;;;;;;9014:13;;9070:23;;;;;;;;;;;;;8844:257;;;:::o;3130:176::-;3201:4;3232:5;;;3256:6;;;;3248:31;;;;;-1:-1:-1;;;3248:31:0;;;;;;;;;;;;-1:-1:-1;;;3248:31:0;;;;;;;;;;;;;;51295:212;51408:55;;;-1:-1:-1;;;51408:55:0;;-1:-1:-1;;;;;51408:55:0;;;;;;;51449:4;51408:55;;;;;;;;;;;;51396:9;;51408:26;;;;;:55;;;;;;;;;;;;;;51396:9;51408:26;:55;;;;;;;;;;52148:1024;52415:12;;52282:21;;52385:15;;52415:16;52411:754;;52484:7;;52474:35;;;-1:-1:-1;;;52474:35:0;;;;52448:23;;-1:-1:-1;;;;;52484:7:0;;52474:33;;:35;;;;;;;;;;;;;;52484:7;52474:35;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;52474:35:0;;-1:-1:-1;;;;;;52528:27:0;;;;;;;52524:630;;;52595:53;52600:34;52605:14;52621:12;;52600:4;:34::i;52595:53::-;52693:7;;52576:72;;-1:-1:-1;52667:52:0;;52683:8;;-1:-1:-1;;;;;52693:7:0;52576:72;52667:15;:52::i;:::-;52743:46;;;;;;;;-1:-1:-1;;;;;52743:46:0;;;;;;;;;;;;;52524:630;;;52830:24;52857:54;52862:35;52867:15;52884:12;;52862:4;:35::i;52857:54::-;52957:7;;52830:81;;-1:-1:-1;52930:56:0;;52946:9;;-1:-1:-1;;;;;52957:7:0;52830:81;52930:15;:56::i;:::-;53022:42;53027:15;53044:19;53022:4;:42::i;:::-;53088:50;;;;;;;;53005:59;;-1:-1:-1;;;;;;53088:50:0;;;;;;;;;;;;52524:630;;52411:754;;52148:1024;;;;;;;:::o;51948:92::-;52019:13;52025:6;52019:5;:13::i;3520:223::-;3595:4;3601;3632:1;3627;:6;3623:113;;-1:-1:-1;;3658:5:0;;;3665;3650:21;;3623:113;-1:-1:-1;;3712:5:0;;;3719:4;3623:113;3520:223;;;;;:::o;2999:123::-;3064:4;782:6;3093:7;3098:1;3093:4;:7::i;:::-;:21;;2999:123;-1:-1:-1;;2999:123:0:o;2875:116::-;782:6;2968:15;;;2875:116::o;4493:321::-;4565:4;;4600:1;4596;:5;:28;;782:6;4596:28;;;4609:1;4596:28;4587:37;-1:-1:-1;4647:1:0;4642:6;;;;4637:151;4650:6;;4637:151;;4685:10;4690:1;4693;4685:4;:10::i;:::-;4681:14;-1:-1:-1;4720:1:0;4716;:5;:10;4712:65;;4751:10;4756:1;4759;4751:4;:10::i;:::-;4747:14;;4712:65;4663:1;4658:6;;;;4637:151;;5541:1108;5639:4;5694:3;5639:4;;5731:27;5740:4;782:6;5731:8;:27::i;:::-;5708:50;;-1:-1:-1;5708:50:0;-1:-1:-1;782:6:0;;5769:9;6110:1;6096:523;6121:9;6113:4;:17;6096:523;;6152:9;782:6;6164:1;:15;6152:27;;6195:6;6203:9;6216:36;6225:1;6228:23;6233:4;782:6;6228:4;:23::i;:::-;6216:8;:36::i;:::-;6194:58;;;;6274:22;6279:4;6285:10;6290:1;6293;6285:4;:10::i;6274:22::-;6267:29;;6318:16;6323:4;6329;6318;:16::i;:::-;6311:23;-1:-1:-1;6353:9:0;6349:20;;6364:5;;;;;6349:20;6390:4;6386:30;;;6407:9;;;6386:30;6435:4;6431:30;;;6452:9;;;6431:30;6480:8;6476:132;;;6515:15;6520:3;6525:4;6515;:15::i;:::-;6509:21;;6476:132;;;6577:15;6582:3;6587:4;6577;:15::i;:::-;6571:21;;6476:132;-1:-1:-1;;;6132:3:0;;6096:523;;;-1:-1:-1;6638:3:0;;5541:1108;-1:-1:-1;;;;;;;;;5541:1108:0:o;9211:98::-;9270:31;9276:4;9290;9297:3;9270:5;:31::i;8560:276::-;8630:4;8613:8;:23;;;;;;;;;;;:30;-1:-1:-1;8613:30:0;8605:47;;;;;-1:-1:-1;;;8605:47:0;;;;;;;;;;;;;;;-1:-1:-1;;;8605:47:0;;;;;;;;;;;;;;;8711:4;8694:8;:23;;;;;;;;;;;8689:34;;8719:3;8689:4;:34::i;:::-;8680:4;8663:8;:23;;;;;;;;;;:60;8754:12;;8749:23;;8768:3;8749:4;:23::i;:::-;8734:12;:38;8788:40;;;;;;;;8820:1;;8805:4;;8788:40;;;;;;;;;8560:276;:::o;9109:94::-;9166:29;9180:4;9187:2;9191:3;9166:5;:29::i;8334:218::-;8427:4;8410:8;:23;;;;;;;;;;;8405:34;;8435:3;8405:4;:34::i;:::-;8396:4;8379:8;:23;;;;;;;;;;:60;8470:12;;8465:23;;8484:3;8465:4;:23::i;:::-;8450:12;:38;8504:40;;;;;;;;8533:4;;8521:1;;8504:40;;;;;;;;;8334:218;:::o

Swarm Source

ipfs://4814ffc3fcf8d3e48bc307a87a7d058f3ac272a5642097cdb240483f9938a325
Loading...
Loading
Loading...
Loading
[ Download: CSV Export  ]
[ Download: CSV Export  ]

A token is a representation of an on-chain or off-chain asset. The token page shows information such as price, total supply, holders, transfers and social links. Learn more about this page in our Knowledge Base.