Feature Tip: Add private address tag to any address under My Name Tag !
ERC-20
Overview
Max Total Supply
0.591595674530415077 BPT
Holders
10
Market
Onchain Market Cap
$0.00
Circulating Supply Market Cap
-
Other Info
Token Contract (WITH 18 Decimals)
Loading...
Loading
Loading...
Loading
Loading...
Loading
# | Exchange | Pair | Price | 24H Volume | % Volume |
---|
Similar Match Source Code This contract matches the deployed Bytecode of the Source Code for Contract 0xE5D1fAB0...0E1Ec4498 The constructor portion of the code might be different and could alter the actual behaviour of the contract
Contract Name:
BPool
Compiler Version
v0.5.12+commit.7709ece9
Contract Source Code (Solidity Multiple files format)
// This program is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // You should have received a copy of the GNU General Public License // along with this program. If not, see <http://www.gnu.org/licenses/>. pragma solidity 0.5.12; import "./BToken.sol"; import "./BMath.sol"; contract BPool is BBronze, BToken, BMath { struct Record { bool bound; // is token bound to pool uint index; // private uint denorm; // denormalized weight uint balance; } event LOG_SWAP( address indexed caller, address indexed tokenIn, address indexed tokenOut, uint256 tokenAmountIn, uint256 tokenAmountOut ); event LOG_JOIN( address indexed caller, address indexed tokenIn, uint256 tokenAmountIn ); event LOG_EXIT( address indexed caller, address indexed tokenOut, uint256 tokenAmountOut ); event LOG_CALL( bytes4 indexed sig, address indexed caller, bytes data ) anonymous; modifier _logs_() { emit LOG_CALL(msg.sig, msg.sender, msg.data); _; } modifier _lock_() { require(!_mutex, "ERR_REENTRY"); _mutex = true; _; _mutex = false; } modifier _viewlock_() { require(!_mutex, "ERR_REENTRY"); _; } bool private _mutex; address private _factory; // BFactory address to push token exitFee to address private _controller; // has CONTROL role bool private _publicSwap; // true if PUBLIC can call SWAP functions // `setSwapFee` and `finalize` require CONTROL // `finalize` sets `PUBLIC can SWAP`, `PUBLIC can JOIN` uint private _swapFee; bool private _finalized; address[] private _tokens; mapping(address=>Record) private _records; uint private _totalWeight; constructor() public { _controller = msg.sender; _factory = msg.sender; _swapFee = MIN_FEE; _publicSwap = false; _finalized = false; } function isPublicSwap() external view returns (bool) { return _publicSwap; } function isFinalized() external view returns (bool) { return _finalized; } function isBound(address t) external view returns (bool) { return _records[t].bound; } function getNumTokens() external view returns (uint) { return _tokens.length; } function getCurrentTokens() external view _viewlock_ returns (address[] memory tokens) { return _tokens; } function getFinalTokens() external view _viewlock_ returns (address[] memory tokens) { require(_finalized, "ERR_NOT_FINALIZED"); return _tokens; } function getDenormalizedWeight(address token) external view _viewlock_ returns (uint) { require(_records[token].bound, "ERR_NOT_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, "ERR_NOT_BOUND"); uint denorm = _records[token].denorm; return bdiv(denorm, _totalWeight); } function getBalance(address token) external view _viewlock_ returns (uint) { require(_records[token].bound, "ERR_NOT_BOUND"); return _records[token].balance; } function getSwapFee() external view _viewlock_ returns (uint) { return _swapFee; } function getController() external view _viewlock_ returns (address) { return _controller; } function setSwapFee(uint swapFee) external _logs_ _lock_ { require(!_finalized, "ERR_IS_FINALIZED"); require(msg.sender == _controller, "ERR_NOT_CONTROLLER"); require(swapFee >= MIN_FEE, "ERR_MIN_FEE"); require(swapFee <= MAX_FEE, "ERR_MAX_FEE"); _swapFee = swapFee; } function setController(address manager) external _logs_ _lock_ { require(msg.sender == _controller, "ERR_NOT_CONTROLLER"); _controller = manager; } function setPublicSwap(bool public_) external _logs_ _lock_ { require(!_finalized, "ERR_IS_FINALIZED"); require(msg.sender == _controller, "ERR_NOT_CONTROLLER"); _publicSwap = public_; } function finalize() external _logs_ _lock_ { require(msg.sender == _controller, "ERR_NOT_CONTROLLER"); require(!_finalized, "ERR_IS_FINALIZED"); require(_tokens.length >= MIN_BOUND_TOKENS, "ERR_MIN_TOKENS"); _finalized = true; _publicSwap = true; _mintPoolShare(INIT_POOL_SUPPLY); _pushPoolShare(msg.sender, INIT_POOL_SUPPLY); } function bind(address token, uint balance, uint denorm) external _logs_ // _lock_ Bind does not lock because it jumps to `rebind`, which does { require(msg.sender == _controller, "ERR_NOT_CONTROLLER"); require(!_records[token].bound, "ERR_IS_BOUND"); require(!_finalized, "ERR_IS_FINALIZED"); require(_tokens.length < MAX_BOUND_TOKENS, "ERR_MAX_TOKENS"); _records[token] = Record({ bound: true, index: _tokens.length, denorm: 0, // balance and denorm will be validated balance: 0 // and set by `rebind` }); _tokens.push(token); rebind(token, balance, denorm); } function rebind(address token, uint balance, uint denorm) public _logs_ _lock_ { require(msg.sender == _controller, "ERR_NOT_CONTROLLER"); require(_records[token].bound, "ERR_NOT_BOUND"); require(!_finalized, "ERR_IS_FINALIZED"); require(denorm >= MIN_WEIGHT, "ERR_MIN_WEIGHT"); require(denorm <= MAX_WEIGHT, "ERR_MAX_WEIGHT"); require(balance >= MIN_BALANCE, "ERR_MIN_BALANCE"); // Adjust the denorm and totalWeight uint oldWeight = _records[token].denorm; if (denorm > oldWeight) { _totalWeight = badd(_totalWeight, bsub(denorm, oldWeight)); require(_totalWeight <= MAX_TOTAL_WEIGHT, "ERR_MAX_TOTAL_WEIGHT"); } else if (denorm < oldWeight) { _totalWeight = bsub(_totalWeight, bsub(oldWeight, denorm)); } _records[token].denorm = denorm; // Adjust the balance record and actual token balance uint oldBalance = _records[token].balance; _records[token].balance = balance; if (balance > oldBalance) { _pullUnderlying(token, msg.sender, bsub(balance, oldBalance)); } else if (balance < oldBalance) { // In this case liquidity is being withdrawn, so charge EXIT_FEE uint tokenBalanceWithdrawn = bsub(oldBalance, balance); uint tokenExitFee = bmul(tokenBalanceWithdrawn, EXIT_FEE); _pushUnderlying(token, msg.sender, bsub(tokenBalanceWithdrawn, tokenExitFee)); _pushUnderlying(token, _factory, tokenExitFee); } } function unbind(address token) external _logs_ _lock_ { require(msg.sender == _controller, "ERR_NOT_CONTROLLER"); require(_records[token].bound, "ERR_NOT_BOUND"); require(!_finalized, "ERR_IS_FINALIZED"); uint tokenBalance = _records[token].balance; uint tokenExitFee = bmul(tokenBalance, EXIT_FEE); _totalWeight = bsub(_totalWeight, _records[token].denorm); // Swap the token-to-unbind with the last token, // then delete the last token uint index = _records[token].index; uint last = _tokens.length - 1; _tokens[index] = _tokens[last]; _records[_tokens[index]].index = index; _tokens.pop(); _records[token] = Record({ bound: false, index: 0, denorm: 0, balance: 0 }); _pushUnderlying(token, msg.sender, bsub(tokenBalance, tokenExitFee)); _pushUnderlying(token, _factory, tokenExitFee); } // Absorb any tokens that have been sent to this contract into the pool function gulp(address token) external _logs_ _lock_ { require(_records[token].bound, "ERR_NOT_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, "ERR_NOT_BOUND"); require(_records[tokenOut].bound, "ERR_NOT_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, "ERR_NOT_BOUND"); require(_records[tokenOut].bound, "ERR_NOT_BOUND"); Record storage inRecord = _records[tokenIn]; Record storage outRecord = _records[tokenOut]; return calcSpotPrice(inRecord.balance, inRecord.denorm, outRecord.balance, outRecord.denorm, 0); } function joinPool(uint poolAmountOut, uint[] calldata maxAmountsIn) external _logs_ _lock_ { require(_finalized, "ERR_NOT_FINALIZED"); uint poolTotal = totalSupply(); uint ratio = bdiv(poolAmountOut, poolTotal); require(ratio != 0, "ERR_MATH_APPROX"); 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, "ERR_MATH_APPROX"); require(tokenAmountIn <= maxAmountsIn[i], "ERR_LIMIT_IN"); _records[t].balance = badd(_records[t].balance, tokenAmountIn); emit LOG_JOIN(msg.sender, t, tokenAmountIn); _pullUnderlying(t, msg.sender, tokenAmountIn); } _mintPoolShare(poolAmountOut); _pushPoolShare(msg.sender, poolAmountOut); } function exitPool(uint poolAmountIn, uint[] calldata minAmountsOut) external _logs_ _lock_ { require(_finalized, "ERR_NOT_FINALIZED"); uint poolTotal = totalSupply(); uint exitFee = bmul(poolAmountIn, EXIT_FEE); uint pAiAfterExitFee = bsub(poolAmountIn, exitFee); uint ratio = bdiv(pAiAfterExitFee, poolTotal); require(ratio != 0, "ERR_MATH_APPROX"); _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, "ERR_MATH_APPROX"); require(tokenAmountOut >= minAmountsOut[i], "ERR_LIMIT_OUT"); _records[t].balance = bsub(_records[t].balance, tokenAmountOut); emit LOG_EXIT(msg.sender, t, tokenAmountOut); _pushUnderlying(t, msg.sender, tokenAmountOut); } } function swapExactAmountIn( address tokenIn, uint tokenAmountIn, address tokenOut, uint minAmountOut, uint maxPrice ) external _logs_ _lock_ returns (uint tokenAmountOut, uint spotPriceAfter) { require(_records[tokenIn].bound, "ERR_NOT_BOUND"); require(_records[tokenOut].bound, "ERR_NOT_BOUND"); require(_publicSwap, "ERR_SWAP_NOT_PUBLIC"); Record storage inRecord = _records[address(tokenIn)]; Record storage outRecord = _records[address(tokenOut)]; require(tokenAmountIn <= bmul(inRecord.balance, MAX_IN_RATIO), "ERR_MAX_IN_RATIO"); uint spotPriceBefore = calcSpotPrice( inRecord.balance, inRecord.denorm, outRecord.balance, outRecord.denorm, _swapFee ); require(spotPriceBefore <= maxPrice, "ERR_BAD_LIMIT_PRICE"); tokenAmountOut = calcOutGivenIn( inRecord.balance, inRecord.denorm, outRecord.balance, outRecord.denorm, tokenAmountIn, _swapFee ); require(tokenAmountOut >= minAmountOut, "ERR_LIMIT_OUT"); 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, "ERR_MATH_APPROX"); require(spotPriceAfter <= maxPrice, "ERR_LIMIT_PRICE"); require(spotPriceBefore <= bdiv(tokenAmountIn, tokenAmountOut), "ERR_MATH_APPROX"); emit LOG_SWAP(msg.sender, tokenIn, tokenOut, tokenAmountIn, tokenAmountOut); _pullUnderlying(tokenIn, msg.sender, tokenAmountIn); _pushUnderlying(tokenOut, msg.sender, tokenAmountOut); return (tokenAmountOut, spotPriceAfter); } function swapExactAmountOut( address tokenIn, uint maxAmountIn, address tokenOut, uint tokenAmountOut, uint maxPrice ) external _logs_ _lock_ returns (uint tokenAmountIn, uint spotPriceAfter) { require(_records[tokenIn].bound, "ERR_NOT_BOUND"); require(_records[tokenOut].bound, "ERR_NOT_BOUND"); require(_publicSwap, "ERR_SWAP_NOT_PUBLIC"); Record storage inRecord = _records[address(tokenIn)]; Record storage outRecord = _records[address(tokenOut)]; require(tokenAmountOut <= bmul(outRecord.balance, MAX_OUT_RATIO), "ERR_MAX_OUT_RATIO"); uint spotPriceBefore = calcSpotPrice( inRecord.balance, inRecord.denorm, outRecord.balance, outRecord.denorm, _swapFee ); require(spotPriceBefore <= maxPrice, "ERR_BAD_LIMIT_PRICE"); tokenAmountIn = calcInGivenOut( inRecord.balance, inRecord.denorm, outRecord.balance, outRecord.denorm, tokenAmountOut, _swapFee ); require(tokenAmountIn <= maxAmountIn, "ERR_LIMIT_IN"); 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, "ERR_MATH_APPROX"); require(spotPriceAfter <= maxPrice, "ERR_LIMIT_PRICE"); require(spotPriceBefore <= bdiv(tokenAmountIn, tokenAmountOut), "ERR_MATH_APPROX"); emit LOG_SWAP(msg.sender, tokenIn, tokenOut, tokenAmountIn, tokenAmountOut); _pullUnderlying(tokenIn, msg.sender, tokenAmountIn); _pushUnderlying(tokenOut, msg.sender, tokenAmountOut); return (tokenAmountIn, spotPriceAfter); } function joinswapExternAmountIn(address tokenIn, uint tokenAmountIn, uint minPoolAmountOut) external _logs_ _lock_ returns (uint poolAmountOut) { require(_finalized, "ERR_NOT_FINALIZED"); require(_records[tokenIn].bound, "ERR_NOT_BOUND"); require(tokenAmountIn <= bmul(_records[tokenIn].balance, MAX_IN_RATIO), "ERR_MAX_IN_RATIO"); Record storage inRecord = _records[tokenIn]; poolAmountOut = calcPoolOutGivenSingleIn( inRecord.balance, inRecord.denorm, _totalSupply, _totalWeight, tokenAmountIn, _swapFee ); require(poolAmountOut >= minPoolAmountOut, "ERR_LIMIT_OUT"); inRecord.balance = badd(inRecord.balance, tokenAmountIn); emit LOG_JOIN(msg.sender, tokenIn, tokenAmountIn); _mintPoolShare(poolAmountOut); _pushPoolShare(msg.sender, poolAmountOut); _pullUnderlying(tokenIn, msg.sender, tokenAmountIn); return poolAmountOut; } function joinswapPoolAmountOut(address tokenIn, uint poolAmountOut, uint maxAmountIn) external _logs_ _lock_ returns (uint tokenAmountIn) { require(_finalized, "ERR_NOT_FINALIZED"); require(_records[tokenIn].bound, "ERR_NOT_BOUND"); Record storage inRecord = _records[tokenIn]; tokenAmountIn = calcSingleInGivenPoolOut( inRecord.balance, inRecord.denorm, _totalSupply, _totalWeight, poolAmountOut, _swapFee ); require(tokenAmountIn != 0, "ERR_MATH_APPROX"); require(tokenAmountIn <= maxAmountIn, "ERR_LIMIT_IN"); require(tokenAmountIn <= bmul(_records[tokenIn].balance, MAX_IN_RATIO), "ERR_MAX_IN_RATIO"); inRecord.balance = badd(inRecord.balance, tokenAmountIn); emit LOG_JOIN(msg.sender, tokenIn, tokenAmountIn); _mintPoolShare(poolAmountOut); _pushPoolShare(msg.sender, poolAmountOut); _pullUnderlying(tokenIn, msg.sender, tokenAmountIn); return tokenAmountIn; } function exitswapPoolAmountIn(address tokenOut, uint poolAmountIn, uint minAmountOut) external _logs_ _lock_ returns (uint tokenAmountOut) { require(_finalized, "ERR_NOT_FINALIZED"); require(_records[tokenOut].bound, "ERR_NOT_BOUND"); Record storage outRecord = _records[tokenOut]; tokenAmountOut = calcSingleOutGivenPoolIn( outRecord.balance, outRecord.denorm, _totalSupply, _totalWeight, poolAmountIn, _swapFee ); require(tokenAmountOut >= minAmountOut, "ERR_LIMIT_OUT"); require(tokenAmountOut <= bmul(_records[tokenOut].balance, MAX_OUT_RATIO), "ERR_MAX_OUT_RATIO"); outRecord.balance = bsub(outRecord.balance, tokenAmountOut); uint exitFee = bmul(poolAmountIn, EXIT_FEE); emit LOG_EXIT(msg.sender, tokenOut, tokenAmountOut); _pullPoolShare(msg.sender, poolAmountIn); _burnPoolShare(bsub(poolAmountIn, exitFee)); _pushPoolShare(_factory, exitFee); _pushUnderlying(tokenOut, msg.sender, tokenAmountOut); return tokenAmountOut; } function exitswapExternAmountOut(address tokenOut, uint tokenAmountOut, uint maxPoolAmountIn) external _logs_ _lock_ returns (uint poolAmountIn) { require(_finalized, "ERR_NOT_FINALIZED"); require(_records[tokenOut].bound, "ERR_NOT_BOUND"); require(tokenAmountOut <= bmul(_records[tokenOut].balance, MAX_OUT_RATIO), "ERR_MAX_OUT_RATIO"); Record storage outRecord = _records[tokenOut]; poolAmountIn = calcPoolInGivenSingleOut( outRecord.balance, outRecord.denorm, _totalSupply, _totalWeight, tokenAmountOut, _swapFee ); require(poolAmountIn != 0, "ERR_MATH_APPROX"); require(poolAmountIn <= maxPoolAmountIn, "ERR_LIMIT_IN"); outRecord.balance = bsub(outRecord.balance, tokenAmountOut); uint exitFee = bmul(poolAmountIn, EXIT_FEE); emit LOG_EXIT(msg.sender, tokenOut, tokenAmountOut); _pullPoolShare(msg.sender, poolAmountIn); _burnPoolShare(bsub(poolAmountIn, exitFee)); _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, "ERR_ERC20_FALSE"); } function _pushUnderlying(address erc20, address to, uint amount) internal { bool xfer = IERC20(erc20).transfer(to, amount); require(xfer, "ERR_ERC20_FALSE"); } 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); } }
// This program is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // You should have received a copy of the GNU General Public License // along with this program. If not, see <http://www.gnu.org/licenses/>. pragma solidity 0.5.12; contract BColor { function getColor() external view returns (bytes32); } contract BBronze is BColor { function getColor() external view returns (bytes32) { return bytes32("BRONZE"); } }
// This program is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // You should have received a copy of the GNU General Public License // along with this program. If not, see <http://www.gnu.org/licenses/>. pragma solidity 0.5.12; import "./BColor.sol"; contract BConst is BBronze { uint public constant BONE = 10**18; uint public constant MIN_BOUND_TOKENS = 2; uint public constant MAX_BOUND_TOKENS = 8; uint public constant MIN_FEE = BONE / 10**6; uint public constant MAX_FEE = BONE / 10; uint public constant EXIT_FEE = 0; uint public constant MIN_WEIGHT = BONE; uint public constant MAX_WEIGHT = BONE * 50; uint public constant MAX_TOTAL_WEIGHT = BONE * 50; uint public constant MIN_BALANCE = BONE / 10**12; uint public constant INIT_POOL_SUPPLY = BONE * 100; uint public constant MIN_BPOW_BASE = 1 wei; uint public constant MAX_BPOW_BASE = (2 * BONE) - 1 wei; uint public constant BPOW_PRECISION = BONE / 10**10; uint public constant MAX_IN_RATIO = BONE / 2; uint public constant MAX_OUT_RATIO = (BONE / 3) + 1 wei; }
// This program is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // You should have received a copy of the GNU General Public License // along with this program. If not, see <http://www.gnu.org/licenses/>. pragma solidity 0.5.12; import "./BNum.sol"; contract BMath is BBronze, BConst, BNum { /********************************************************************************************** // calcSpotPrice // // sP = spotPrice // // bI = tokenBalanceIn ( bI / wI ) 1 // // bO = tokenBalanceOut sP = ----------- * ---------- // // wI = tokenWeightIn ( bO / wO ) ( 1 - sF ) // // wO = tokenWeightOut // // sF = swapFee // **********************************************************************************************/ function calcSpotPrice( uint tokenBalanceIn, uint tokenWeightIn, uint tokenBalanceOut, uint tokenWeightOut, uint swapFee ) public pure returns (uint spotPrice) { uint numer = bdiv(tokenBalanceIn, tokenWeightIn); uint denom = bdiv(tokenBalanceOut, tokenWeightOut); uint ratio = bdiv(numer, denom); uint scale = bdiv(BONE, bsub(BONE, swapFee)); return (spotPrice = bmul(ratio, scale)); } /********************************************************************************************** // calcOutGivenIn // // aO = tokenAmountOut // // bO = tokenBalanceOut // // bI = tokenBalanceIn / / bI \ (wI / wO) \ // // aI = tokenAmountIn aO = bO * | 1 - | -------------------------- | ^ | // // wI = tokenWeightIn \ \ ( bI + ( aI * ( 1 - sF )) / / // // wO = tokenWeightOut // // sF = swapFee // **********************************************************************************************/ function calcOutGivenIn( uint tokenBalanceIn, uint tokenWeightIn, uint tokenBalanceOut, uint tokenWeightOut, uint tokenAmountIn, uint swapFee ) public pure returns (uint tokenAmountOut) { uint weightRatio = bdiv(tokenWeightIn, tokenWeightOut); uint adjustedIn = bsub(BONE, swapFee); adjustedIn = bmul(tokenAmountIn, adjustedIn); uint y = bdiv(tokenBalanceIn, badd(tokenBalanceIn, adjustedIn)); uint foo = bpow(y, weightRatio); uint bar = bsub(BONE, foo); tokenAmountOut = bmul(tokenBalanceOut, bar); return tokenAmountOut; } /********************************************************************************************** // calcInGivenOut // // aI = tokenAmountIn // // bO = tokenBalanceOut / / bO \ (wO / wI) \ // // bI = tokenBalanceIn bI * | | ------------ | ^ - 1 | // // aO = tokenAmountOut aI = \ \ ( bO - aO ) / / // // wI = tokenWeightIn -------------------------------------------- // // wO = tokenWeightOut ( 1 - sF ) // // sF = swapFee // **********************************************************************************************/ function calcInGivenOut( uint tokenBalanceIn, uint tokenWeightIn, uint tokenBalanceOut, uint tokenWeightOut, uint tokenAmountOut, uint swapFee ) public pure returns (uint tokenAmountIn) { uint weightRatio = bdiv(tokenWeightOut, tokenWeightIn); uint diff = bsub(tokenBalanceOut, tokenAmountOut); uint y = bdiv(tokenBalanceOut, diff); uint foo = bpow(y, weightRatio); foo = bsub(foo, BONE); tokenAmountIn = bsub(BONE, swapFee); tokenAmountIn = bdiv(bmul(tokenBalanceIn, foo), tokenAmountIn); return tokenAmountIn; } /********************************************************************************************** // calcPoolOutGivenSingleIn // // pAo = poolAmountOut / \ // // tAi = tokenAmountIn /// / // wI \ \\ \ wI \ // // wI = tokenWeightIn //| tAi *| 1 - || 1 - -- | * sF || + tBi \ -- \ // // tW = totalWeight pAo=|| \ \ \\ tW / // | ^ tW | * pS - pS // // tBi = tokenBalanceIn \\ ------------------------------------- / / // // pS = poolSupply \\ tBi / / // // sF = swapFee \ / // **********************************************************************************************/ function calcPoolOutGivenSingleIn( uint tokenBalanceIn, uint tokenWeightIn, uint poolSupply, uint totalWeight, uint tokenAmountIn, uint swapFee ) public pure returns (uint poolAmountOut) { // 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(BONE, normalizedWeight), swapFee); uint tokenAmountInAfterFee = bmul(tokenAmountIn, bsub(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 \ tW / // **********************************************************************************************/ function calcSingleInGivenPoolOut( uint tokenBalanceIn, uint tokenWeightIn, uint poolSupply, uint totalWeight, uint poolAmountOut, uint swapFee ) public pure returns (uint tokenAmountIn) { uint normalizedWeight = bdiv(tokenWeightIn, totalWeight); uint newPoolSupply = badd(poolSupply, poolAmountOut); uint poolRatio = bdiv(newPoolSupply, poolSupply); //uint newBalTi = poolRatio^(1/weightTi) * balTi; uint boo = bdiv(BONE, normalizedWeight); uint tokenInRatio = bpow(poolRatio, boo); uint newTokenBalanceIn = bmul(tokenInRatio, tokenBalanceIn); uint tokenAmountInAfterFee = bsub(newTokenBalanceIn, tokenBalanceIn); // Do reverse order of fees charged in joinswap_ExternAmountIn, this way // ``` pAo == joinswap_ExternAmountIn(Ti, joinswap_PoolAmountOut(pAo, Ti)) ``` //uint tAi = tAiAfterFee / (1 - (1-weightTi) * swapFee) ; uint zar = bmul(bsub(BONE, normalizedWeight), swapFee); tokenAmountIn = bdiv(tokenAmountInAfterFee, bsub(BONE, zar)); return tokenAmountIn; } /********************************************************************************************** // calcSingleOutGivenPoolIn // // tAo = tokenAmountOut / / \\ // // bO = tokenBalanceOut / // pS - (pAi * (1 - eF)) \ / 1 \ \\ // // pAi = poolAmountIn | bO - || ----------------------- | ^ | --------- | * b0 || // // ps = poolSupply \ \\ pS / \(wO / tW)/ // // // wI = tokenWeightIn tAo = \ \ // // // tW = totalWeight / / wO \ \ // // sF = swapFee * | 1 - | 1 - ---- | * sF | // // eF = exitFee \ \ tW / / // **********************************************************************************************/ function calcSingleOutGivenPoolIn( uint tokenBalanceOut, uint tokenWeightOut, uint poolSupply, uint totalWeight, uint poolAmountIn, uint swapFee ) public pure returns (uint tokenAmountOut) { uint normalizedWeight = bdiv(tokenWeightOut, totalWeight); // charge exit fee on the pool token side // pAiAfterExitFee = pAi*(1-exitFee) uint poolAmountInAfterExitFee = bmul(poolAmountIn, bsub(BONE, EXIT_FEE)); uint newPoolSupply = bsub(poolSupply, poolAmountInAfterExitFee); uint poolRatio = bdiv(newPoolSupply, poolSupply); // newBalTo = poolRatio^(1/weightTo) * balTo; uint tokenOutRatio = bpow(poolRatio, bdiv(BONE, normalizedWeight)); uint newTokenBalanceOut = bmul(tokenOutRatio, tokenBalanceOut); uint tokenAmountOutBeforeSwapFee = bsub(tokenBalanceOut, newTokenBalanceOut); // charge swap fee on the output token side //uint tAo = tAoBeforeSwapFee * (1 - (1-weightTo) * swapFee) uint zaz = bmul(bsub(BONE, normalizedWeight), swapFee); tokenAmountOut = bmul(tokenAmountOutBeforeSwapFee, bsub(BONE, zaz)); return tokenAmountOut; } /********************************************************************************************** // calcPoolInGivenSingleOut // // pAi = poolAmountIn // / tAo \\ / wO \ \ // // bO = tokenBalanceOut // | bO - -------------------------- |\ | ---- | \ // // tAo = tokenAmountOut pS - || \ 1 - ((1 - (tO / tW)) * sF)/ | ^ \ tW / * pS | // // ps = poolSupply \\ -----------------------------------/ / // // wO = tokenWeightOut pAi = \\ bO / / // // tW = totalWeight ------------------------------------------------------------- // // sF = swapFee ( 1 - eF ) // // eF = exitFee // **********************************************************************************************/ function calcPoolInGivenSingleOut( uint tokenBalanceOut, uint tokenWeightOut, uint poolSupply, uint totalWeight, uint tokenAmountOut, uint swapFee ) 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(BONE, normalizedWeight); uint zar = bmul(zoo, swapFee); uint tokenAmountOutBeforeSwapFee = bdiv(tokenAmountOut, bsub(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(BONE, EXIT_FEE)); 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/>. pragma solidity 0.5.12; import "./BConst.sol"; contract BNum is BConst { function btoi(uint a) internal pure returns (uint) { return a / BONE; } function bfloor(uint a) internal pure returns (uint) { return btoi(a) * BONE; } function badd(uint a, uint b) internal pure returns (uint) { uint c = a + b; require(c >= a, "ERR_ADD_OVERFLOW"); return c; } function bsub(uint a, uint b) internal pure returns (uint) { (uint c, bool flag) = bsubSign(a, b); require(!flag, "ERR_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, "ERR_MUL_OVERFLOW"); uint c1 = c0 + (BONE / 2); require(c1 >= c0, "ERR_MUL_OVERFLOW"); uint c2 = c1 / BONE; return c2; } function bdiv(uint a, uint b) internal pure returns (uint) { require(b != 0, "ERR_DIV_ZERO"); uint c0 = a * BONE; require(a == 0 || c0 / a == BONE, "ERR_DIV_INTERNAL"); // bmul overflow uint c1 = c0 + (b / 2); require(c1 >= c0, "ERR_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 : BONE; for (n /= 2; n != 0; n /= 2) { a = bmul(a, a); if (n % 2 != 0) { z = bmul(z, a); } } return z; } // Compute b^(e.w) by splitting it into (b^e)*(b^0.w). // Use `bpowi` for `b^e` and `bpowK` for k iterations // of approximation of b^0.w function bpow(uint base, uint exp) internal pure returns (uint) { require(base >= MIN_BPOW_BASE, "ERR_BPOW_BASE_TOO_LOW"); require(base <= MAX_BPOW_BASE, "ERR_BPOW_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, BPOW_PRECISION); return bmul(wholePow, partialResult); } function bpowApprox(uint base, uint exp, uint precision) internal pure returns (uint) { // term 0: uint a = exp; (uint x, bool xneg) = bsubSign(base, BONE); uint term = BONE; uint sum = term; bool negative = false; // term(k) = numer / denom // = (product(a - i - 1, i=1-->k) * x^k) / (k!) // each iteration, multiply previous term by (a-(k-1)) * x / k // continue until term is less than precision for (uint i = 1; term >= precision; i++) { uint bigK = i * BONE; (uint c, bool cneg) = bsubSign(a, bsub(bigK, BONE)); term = bmul(term, bmul(c, x)); term = bdiv(term, bigK); if (term == 0) break; if (xneg) negative = !negative; if (cneg) negative = !negative; if (negative) { sum = bsub(sum, term); } else { sum = badd(sum, term); } } return sum; } }
// This program is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // You should have received a copy of the GNU General Public License // along with this program. If not, see <http://www.gnu.org/licenses/>. pragma solidity 0.5.12; import "./BNum.sol"; // Highly opinionated token implementation interface IERC20 { event Approval(address indexed src, address indexed dst, uint amt); event Transfer(address indexed src, address indexed dst, uint amt); function totalSupply() external view returns (uint); function balanceOf(address whom) external view returns (uint); function allowance(address src, address dst) external view returns (uint); function approve(address dst, uint amt) external returns (bool); function transfer(address dst, uint amt) external returns (bool); function transferFrom( address src, address dst, uint amt ) external returns (bool); } contract BTokenBase is BNum { mapping(address => uint) internal _balance; mapping(address => mapping(address=>uint)) internal _allowance; uint internal _totalSupply; event Approval(address indexed src, address indexed dst, uint amt); event Transfer(address indexed src, address indexed dst, uint amt); function _mint(uint amt) internal { _balance[address(this)] = badd(_balance[address(this)], amt); _totalSupply = badd(_totalSupply, amt); emit Transfer(address(0), address(this), amt); } function _burn(uint amt) internal { require(_balance[address(this)] >= amt, "ERR_INSUFFICIENT_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, "ERR_INSUFFICIENT_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 = "Balancer Pool Token"; string private _symbol = "BPT"; uint8 private _decimals = 18; function name() public view returns (string memory) { return _name; } function symbol() public view returns (string memory) { return _symbol; } function decimals() public view returns(uint8) { return _decimals; } function allowance(address src, address dst) external view returns (uint) { return _allowance[src][dst]; } function balanceOf(address whom) external view returns (uint) { return _balance[whom]; } function totalSupply() public view returns (uint) { return _totalSupply; } function approve(address dst, uint amt) external returns (bool) { _allowance[msg.sender][dst] = amt; emit Approval(msg.sender, dst, amt); return true; } function increaseApproval(address dst, uint amt) external returns (bool) { _allowance[msg.sender][dst] = badd(_allowance[msg.sender][dst], amt); emit Approval(msg.sender, dst, _allowance[msg.sender][dst]); return true; } function decreaseApproval(address dst, uint amt) external returns (bool) { uint oldValue = _allowance[msg.sender][dst]; if (amt > oldValue) { _allowance[msg.sender][dst] = 0; } else { _allowance[msg.sender][dst] = bsub(oldValue, amt); } emit Approval(msg.sender, dst, _allowance[msg.sender][dst]); return true; } function transfer(address dst, uint amt) external returns (bool) { _move(msg.sender, dst, amt); return true; } function transferFrom(address src, address dst, uint amt) external returns (bool) { require(msg.sender == src || amt <= _allowance[src][msg.sender], "ERR_BTOKEN_BAD_CALLER"); _move(src, dst, amt); if (msg.sender != src && _allowance[src][msg.sender] != uint256(-1)) { _allowance[src][msg.sender] = bsub(_allowance[src][msg.sender], amt); emit Approval(msg.sender, dst, _allowance[src][msg.sender]); } return true; } }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"inputs":[],"payable":false,"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"src","type":"address"},{"indexed":true,"internalType":"address","name":"dst","type":"address"},{"indexed":false,"internalType":"uint256","name":"amt","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":true,"inputs":[{"indexed":true,"internalType":"bytes4","name":"sig","type":"bytes4"},{"indexed":true,"internalType":"address","name":"caller","type":"address"},{"indexed":false,"internalType":"bytes","name":"data","type":"bytes"}],"name":"LOG_CALL","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"caller","type":"address"},{"indexed":true,"internalType":"address","name":"tokenOut","type":"address"},{"indexed":false,"internalType":"uint256","name":"tokenAmountOut","type":"uint256"}],"name":"LOG_EXIT","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"caller","type":"address"},{"indexed":true,"internalType":"address","name":"tokenIn","type":"address"},{"indexed":false,"internalType":"uint256","name":"tokenAmountIn","type":"uint256"}],"name":"LOG_JOIN","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"caller","type":"address"},{"indexed":true,"internalType":"address","name":"tokenIn","type":"address"},{"indexed":true,"internalType":"address","name":"tokenOut","type":"address"},{"indexed":false,"internalType":"uint256","name":"tokenAmountIn","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"tokenAmountOut","type":"uint256"}],"name":"LOG_SWAP","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"src","type":"address"},{"indexed":true,"internalType":"address","name":"dst","type":"address"},{"indexed":false,"internalType":"uint256","name":"amt","type":"uint256"}],"name":"Transfer","type":"event"},{"constant":true,"inputs":[],"name":"BONE","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"BPOW_PRECISION","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"EXIT_FEE","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"INIT_POOL_SUPPLY","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"MAX_BOUND_TOKENS","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"MAX_BPOW_BASE","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"MAX_FEE","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"MAX_IN_RATIO","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"MAX_OUT_RATIO","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"MAX_TOTAL_WEIGHT","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"MAX_WEIGHT","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"MIN_BALANCE","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"MIN_BOUND_TOKENS","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"MIN_BPOW_BASE","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"MIN_FEE","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"MIN_WEIGHT","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"address","name":"src","type":"address"},{"internalType":"address","name":"dst","type":"address"}],"name":"allowance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"dst","type":"address"},{"internalType":"uint256","name":"amt","type":"uint256"}],"name":"approve","outputs":[{"internalType":"bool","name":"","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"internalType":"address","name":"whom","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"token","type":"address"},{"internalType":"uint256","name":"balance","type":"uint256"},{"internalType":"uint256","name":"denorm","type":"uint256"}],"name":"bind","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"internalType":"uint256","name":"tokenBalanceIn","type":"uint256"},{"internalType":"uint256","name":"tokenWeightIn","type":"uint256"},{"internalType":"uint256","name":"tokenBalanceOut","type":"uint256"},{"internalType":"uint256","name":"tokenWeightOut","type":"uint256"},{"internalType":"uint256","name":"tokenAmountOut","type":"uint256"},{"internalType":"uint256","name":"swapFee","type":"uint256"}],"name":"calcInGivenOut","outputs":[{"internalType":"uint256","name":"tokenAmountIn","type":"uint256"}],"payable":false,"stateMutability":"pure","type":"function"},{"constant":true,"inputs":[{"internalType":"uint256","name":"tokenBalanceIn","type":"uint256"},{"internalType":"uint256","name":"tokenWeightIn","type":"uint256"},{"internalType":"uint256","name":"tokenBalanceOut","type":"uint256"},{"internalType":"uint256","name":"tokenWeightOut","type":"uint256"},{"internalType":"uint256","name":"tokenAmountIn","type":"uint256"},{"internalType":"uint256","name":"swapFee","type":"uint256"}],"name":"calcOutGivenIn","outputs":[{"internalType":"uint256","name":"tokenAmountOut","type":"uint256"}],"payable":false,"stateMutability":"pure","type":"function"},{"constant":true,"inputs":[{"internalType":"uint256","name":"tokenBalanceOut","type":"uint256"},{"internalType":"uint256","name":"tokenWeightOut","type":"uint256"},{"internalType":"uint256","name":"poolSupply","type":"uint256"},{"internalType":"uint256","name":"totalWeight","type":"uint256"},{"internalType":"uint256","name":"tokenAmountOut","type":"uint256"},{"internalType":"uint256","name":"swapFee","type":"uint256"}],"name":"calcPoolInGivenSingleOut","outputs":[{"internalType":"uint256","name":"poolAmountIn","type":"uint256"}],"payable":false,"stateMutability":"pure","type":"function"},{"constant":true,"inputs":[{"internalType":"uint256","name":"tokenBalanceIn","type":"uint256"},{"internalType":"uint256","name":"tokenWeightIn","type":"uint256"},{"internalType":"uint256","name":"poolSupply","type":"uint256"},{"internalType":"uint256","name":"totalWeight","type":"uint256"},{"internalType":"uint256","name":"tokenAmountIn","type":"uint256"},{"internalType":"uint256","name":"swapFee","type":"uint256"}],"name":"calcPoolOutGivenSingleIn","outputs":[{"internalType":"uint256","name":"poolAmountOut","type":"uint256"}],"payable":false,"stateMutability":"pure","type":"function"},{"constant":true,"inputs":[{"internalType":"uint256","name":"tokenBalanceIn","type":"uint256"},{"internalType":"uint256","name":"tokenWeightIn","type":"uint256"},{"internalType":"uint256","name":"poolSupply","type":"uint256"},{"internalType":"uint256","name":"totalWeight","type":"uint256"},{"internalType":"uint256","name":"poolAmountOut","type":"uint256"},{"internalType":"uint256","name":"swapFee","type":"uint256"}],"name":"calcSingleInGivenPoolOut","outputs":[{"internalType":"uint256","name":"tokenAmountIn","type":"uint256"}],"payable":false,"stateMutability":"pure","type":"function"},{"constant":true,"inputs":[{"internalType":"uint256","name":"tokenBalanceOut","type":"uint256"},{"internalType":"uint256","name":"tokenWeightOut","type":"uint256"},{"internalType":"uint256","name":"poolSupply","type":"uint256"},{"internalType":"uint256","name":"totalWeight","type":"uint256"},{"internalType":"uint256","name":"poolAmountIn","type":"uint256"},{"internalType":"uint256","name":"swapFee","type":"uint256"}],"name":"calcSingleOutGivenPoolIn","outputs":[{"internalType":"uint256","name":"tokenAmountOut","type":"uint256"}],"payable":false,"stateMutability":"pure","type":"function"},{"constant":true,"inputs":[{"internalType":"uint256","name":"tokenBalanceIn","type":"uint256"},{"internalType":"uint256","name":"tokenWeightIn","type":"uint256"},{"internalType":"uint256","name":"tokenBalanceOut","type":"uint256"},{"internalType":"uint256","name":"tokenWeightOut","type":"uint256"},{"internalType":"uint256","name":"swapFee","type":"uint256"}],"name":"calcSpotPrice","outputs":[{"internalType":"uint256","name":"spotPrice","type":"uint256"}],"payable":false,"stateMutability":"pure","type":"function"},{"constant":true,"inputs":[],"name":"decimals","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"dst","type":"address"},{"internalType":"uint256","name":"amt","type":"uint256"}],"name":"decreaseApproval","outputs":[{"internalType":"bool","name":"","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"uint256","name":"poolAmountIn","type":"uint256"},{"internalType":"uint256[]","name":"minAmountsOut","type":"uint256[]"}],"name":"exitPool","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"tokenOut","type":"address"},{"internalType":"uint256","name":"tokenAmountOut","type":"uint256"},{"internalType":"uint256","name":"maxPoolAmountIn","type":"uint256"}],"name":"exitswapExternAmountOut","outputs":[{"internalType":"uint256","name":"poolAmountIn","type":"uint256"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"tokenOut","type":"address"},{"internalType":"uint256","name":"poolAmountIn","type":"uint256"},{"internalType":"uint256","name":"minAmountOut","type":"uint256"}],"name":"exitswapPoolAmountIn","outputs":[{"internalType":"uint256","name":"tokenAmountOut","type":"uint256"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[],"name":"finalize","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"internalType":"address","name":"token","type":"address"}],"name":"getBalance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"getColor","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"getController","outputs":[{"internalType":"address","name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"getCurrentTokens","outputs":[{"internalType":"address[]","name":"tokens","type":"address[]"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"address","name":"token","type":"address"}],"name":"getDenormalizedWeight","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"getFinalTokens","outputs":[{"internalType":"address[]","name":"tokens","type":"address[]"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"address","name":"token","type":"address"}],"name":"getNormalizedWeight","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"getNumTokens","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"address","name":"tokenIn","type":"address"},{"internalType":"address","name":"tokenOut","type":"address"}],"name":"getSpotPrice","outputs":[{"internalType":"uint256","name":"spotPrice","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"address","name":"tokenIn","type":"address"},{"internalType":"address","name":"tokenOut","type":"address"}],"name":"getSpotPriceSansFee","outputs":[{"internalType":"uint256","name":"spotPrice","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"getSwapFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"getTotalDenormalizedWeight","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"token","type":"address"}],"name":"gulp","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"dst","type":"address"},{"internalType":"uint256","name":"amt","type":"uint256"}],"name":"increaseApproval","outputs":[{"internalType":"bool","name":"","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"internalType":"address","name":"t","type":"address"}],"name":"isBound","outputs":[{"internalType":"bool","name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"isFinalized","outputs":[{"internalType":"bool","name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"isPublicSwap","outputs":[{"internalType":"bool","name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"internalType":"uint256","name":"poolAmountOut","type":"uint256"},{"internalType":"uint256[]","name":"maxAmountsIn","type":"uint256[]"}],"name":"joinPool","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"tokenIn","type":"address"},{"internalType":"uint256","name":"tokenAmountIn","type":"uint256"},{"internalType":"uint256","name":"minPoolAmountOut","type":"uint256"}],"name":"joinswapExternAmountIn","outputs":[{"internalType":"uint256","name":"poolAmountOut","type":"uint256"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"tokenIn","type":"address"},{"internalType":"uint256","name":"poolAmountOut","type":"uint256"},{"internalType":"uint256","name":"maxAmountIn","type":"uint256"}],"name":"joinswapPoolAmountOut","outputs":[{"internalType":"uint256","name":"tokenAmountIn","type":"uint256"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"token","type":"address"},{"internalType":"uint256","name":"balance","type":"uint256"},{"internalType":"uint256","name":"denorm","type":"uint256"}],"name":"rebind","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"manager","type":"address"}],"name":"setController","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"bool","name":"public_","type":"bool"}],"name":"setPublicSwap","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"uint256","name":"swapFee","type":"uint256"}],"name":"setSwapFee","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"tokenIn","type":"address"},{"internalType":"uint256","name":"tokenAmountIn","type":"uint256"},{"internalType":"address","name":"tokenOut","type":"address"},{"internalType":"uint256","name":"minAmountOut","type":"uint256"},{"internalType":"uint256","name":"maxPrice","type":"uint256"}],"name":"swapExactAmountIn","outputs":[{"internalType":"uint256","name":"tokenAmountOut","type":"uint256"},{"internalType":"uint256","name":"spotPriceAfter","type":"uint256"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"tokenIn","type":"address"},{"internalType":"uint256","name":"maxAmountIn","type":"uint256"},{"internalType":"address","name":"tokenOut","type":"address"},{"internalType":"uint256","name":"tokenAmountOut","type":"uint256"},{"internalType":"uint256","name":"maxPrice","type":"uint256"}],"name":"swapExactAmountOut","outputs":[{"internalType":"uint256","name":"tokenAmountIn","type":"uint256"},{"internalType":"uint256","name":"spotPriceAfter","type":"uint256"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"dst","type":"address"},{"internalType":"uint256","name":"amt","type":"uint256"}],"name":"transfer","outputs":[{"internalType":"bool","name":"","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"src","type":"address"},{"internalType":"address","name":"dst","type":"address"},{"internalType":"uint256","name":"amt","type":"uint256"}],"name":"transferFrom","outputs":[{"internalType":"bool","name":"","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"token","type":"address"}],"name":"unbind","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"}]
Contract Creation Code
60c0604052601360808190527f42616c616e63657220506f6f6c20546f6b656e0000000000000000000000000060a0908152620000409160039190620000f4565b506040805180820190915260038082527f425054000000000000000000000000000000000000000000000000000000000060209092019182526200008791600491620000f4565b506005805460ff19166012179055348015620000a257600080fd5b50600680546005805462010000600160b01b031916336201000081029190911790915564e8d4a510006007556001600160a01b03199091161760ff60a01b191690556008805460ff1916905562000199565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f106200013757805160ff191683800117855562000167565b8280016001018555821562000167579182015b82811115620001675782518255916020019190600101906200014a565b506200017592915062000179565b5090565b6200019691905b8082111562000175576000815560010162000180565b90565b61580980620001a96000396000f3fe608060405234801561001057600080fd5b50600436106103eb5760003560e01c80638d4e40831161021a578063bc694ea211610135578063d73dd623116100c8578063ec09302111610097578063f8b2cb4f1161007c578063f8b2cb4f14610cac578063f8d6aed414610cd2578063fde924f714610d0d576103eb565b8063ec09302114610c7e578063f1b8a9b714610c86576103eb565b8063d73dd62314610bf2578063dd62ed3e14610c1e578063e4a28a52146104f1578063e4e1e53814610c4c576103eb565b8063cc77828d11610104578063cc77828d14610bb4578063cd2ed8fb14610bbc578063cf5e7bd314610bc4578063d4cadf6814610bea576103eb565b8063bc694ea214610b4c578063be3bbd2e14610b54578063c36596a614610565578063c6580d1214610bac576103eb565b8063a221ee49116101ad578063b7b800a41161017c578063b7b800a414610af9578063ba019dab14610b01578063ba9530a614610b09578063bc063e1a14610b44576103eb565b8063a221ee4914610a19578063a9059cbb14610a4e578063b02f0b7314610a7a578063b0e0d13614610af1576103eb565b8063948d8ce6116101e9578063948d8ce6146109db57806395d89b4114610a01578063992e2a9214610a095780639a86139b14610a11576103eb565b80638d4e40831461099d57806392eefe9b146109a5578063936c3477146109cb5780639381cd2b146109d3576103eb565b806349b595521161030a57806376c7a3c71161029d5780638656b6531161026c5780638656b653146108f9578063867378c514610934578063892980121461093c5780638c28cbe814610977576103eb565b806376c7a3c71461081d5780637c5e9ea4146108255780638201aa3f1461087e57806382f652ad146108be576103eb565b80635db34277116102d95780635db342771461076757806366188463146107995780636d06dfa0146107c557806370a08231146107f7576103eb565b806349b595521461068e5780634bb278f3146106ad5780634f69c0d4146106b55780635c1bbaf71461072c576103eb565b8063218b538211610382578063313ce56711610351578063313ce567146105ed57806334e199071461060b5780633fdddaa21461062a57806346ab38f11461065c576103eb565b8063218b53821461056557806323b872dd1461056d5780632f37b624146105a35780633018205f146105c9576103eb565b80631446a7ff116103be5780631446a7ff146104f957806315e84af91461052757806318160ddd14610555578063189d00ca1461055d576103eb565b806302c96748146103f057806306fdde0314610434578063095ea7b3146104b157806309a3bbe4146104f1575b600080fd5b6104226004803603606081101561040657600080fd5b506001600160a01b038135169060208101359060400135610d15565b60408051918252519081900360200190f35b61043c611081565b6040805160208082528351818301528351919283929083019185019080838360005b8381101561047657818101518382015260200161045e565b50505050905090810190601f1680156104a35780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b6104dd600480360360408110156104c757600080fd5b506001600160a01b038135169060200135611117565b604080519115158252519081900360200190f35b61042261117e565b6104226004803603604081101561050f57600080fd5b506001600160a01b038135811691602001351661118b565b6104226004803603604081101561053d57600080fd5b506001600160a01b03813581169160200135166112e0565b61042261142c565b610422611432565b610422611446565b6104dd6004803603606081101561058357600080fd5b506001600160a01b03813581169160208101359091169060400135611452565b6104dd600480360360208110156105b957600080fd5b50356001600160a01b03166115c6565b6105d16115e4565b604080516001600160a01b039092168252519081900360200190f35b6105f5611642565b6040805160ff9092168252519081900360200190f35b6106286004803603602081101561062157600080fd5b503561164b565b005b6106286004803603606081101561064057600080fd5b506001600160a01b03813516906020810135906040013561186c565b6104226004803603606081101561067257600080fd5b506001600160a01b038135169060208101359060400135611cae565b610628600480360360208110156106a457600080fd5b50351515611fb9565b610628612157565b610628600480360360408110156106cb57600080fd5b813591908101906040810160208201356401000000008111156106ed57600080fd5b8201836020820111156106ff57600080fd5b8035906020019184602083028401116401000000008311171561072157600080fd5b509092509050612378565b610422600480360360c081101561074257600080fd5b5080359060208101359060408101359060608101359060808101359060a00135612671565b6104226004803603606081101561077d57600080fd5b506001600160a01b038135169060208101359060400135612729565b6104dd600480360360408110156107af57600080fd5b506001600160a01b038135169060200135612a19565b610422600480360360608110156107db57600080fd5b506001600160a01b038135169060208101359060400135612b03565b6104226004803603602081101561080d57600080fd5b50356001600160a01b0316612e21565b610422612e3c565b610865600480360360a081101561083b57600080fd5b506001600160a01b0381358116916020810135916040820135169060608101359060800135612e4e565b6040805192835260208301919091528051918290030190f35b610865600480360360a081101561089457600080fd5b506001600160a01b038135811691602081013591604082013516906060810135906080013561333f565b610422600480360360c08110156108d457600080fd5b5080359060208101359060408101359060608101359060808101359060a00135613818565b610422600480360360c081101561090f57600080fd5b5080359060208101359060408101359060608101359060808101359060a001356138d7565b610422613978565b610422600480360360c081101561095257600080fd5b5080359060208101359060408101359060608101359060808101359060a0013561398c565b6106286004803603602081101561098d57600080fd5b50356001600160a01b0316613a3c565b6104dd613c09565b610628600480360360208110156109bb57600080fd5b50356001600160a01b0316613c12565b610422613d5d565b610422613db2565b610422600480360360208110156109f157600080fd5b50356001600160a01b0316613dbf565b61043c613e89565b610422613eea565b610422613ef6565b610422600480360360a0811015610a2f57600080fd5b5080359060208101359060408101359060608101359060800135613f1a565b6104dd60048036036040811015610a6457600080fd5b506001600160a01b038135169060200135613f7f565b61062860048036036040811015610a9057600080fd5b81359190810190604081016020820135640100000000811115610ab257600080fd5b820183602082011115610ac457600080fd5b80359060200191846020830284011164010000000083111715610ae657600080fd5b509092509050613f95565b6104226142dc565b6104226142e1565b6104226142e6565b610422600480360360c0811015610b1f57600080fd5b5080359060208101359060408101359060608101359060808101359060a001356142eb565b61042261436c565b61042261437c565b610b5c614388565b60408051602080825283518183015283519192839290830191858101910280838360005b83811015610b98578181015183820152602001610b80565b505050509050019250505060405180910390f35b610422614480565b610b5c614485565b6104226144d3565b61062860048036036020811015610bda57600080fd5b50356001600160a01b03166144d9565b610422614868565b6104dd60048036036040811015610c0857600080fd5b506001600160a01b0381351690602001356148bd565b61042260048036036040811015610c3457600080fd5b506001600160a01b0381358116916020013516614950565b61062860048036036060811015610c6257600080fd5b506001600160a01b03813516906020810135906040013561497b565b610422614bff565b61042260048036036020811015610c9c57600080fd5b50356001600160a01b0316614c0f565b61042260048036036020811015610cc257600080fd5b50356001600160a01b0316614ceb565b610422600480360360c0811015610ce857600080fd5b5080359060208101359060408101359060608101359060808101359060a00135614db5565b6104dd614e38565b6000336001600160a01b03166000356001600160e01b0319166001600160e01b03191660003660405180806020018281038252848482818152602001925080828437600083820152604051601f909101601f19169092018290039550909350505050a2600554610100900460ff1615610dc3576040805162461bcd60e51b815260206004820152600b60248201526a4552525f5245454e54525960a81b604482015290519081900360640190fd5b6005805461ff00191661010017905560085460ff16610e1d576040805162461bcd60e51b815260206004820152601160248201527011549497d393d517d19253905312569151607a1b604482015290519081900360640190fd5b6001600160a01b0384166000908152600a602052604090205460ff16610e7a576040805162461bcd60e51b815260206004820152600d60248201526c11549497d393d517d093d55391609a1b604482015290519081900360640190fd5b6001600160a01b0384166000908152600a60205260409020600390810154610eaf91670de0b6b3a76400005b04600101614e48565b831115610f03576040805162461bcd60e51b815260206004820152601160248201527f4552525f4d41585f4f55545f524154494f000000000000000000000000000000604482015290519081900360640190fd5b6001600160a01b0384166000908152600a6020526040902060038101546002808301549054600b54600754610f3d94939291908990613818565b915081610f83576040805162461bcd60e51b815260206004820152600f60248201526e08aa4a4be9a82a890be82a0a0a49eb608b1b604482015290519081900360640190fd5b82821115610fc7576040805162461bcd60e51b815260206004820152600c60248201526b22a9292fa624a6a4aa2fa4a760a11b604482015290519081900360640190fd5b610fd5816003015485614f2b565b60038201556000610fe68382614e48565b6040805187815290519192506001600160a01b0388169133917fe74c91552b64c2e2e7bd255639e004e693bd3e1d01cc33e65610b86afcc1ffed919081900360200190a36110343384614f99565b6110466110418483614f2b565b614fa7565b600554611062906201000090046001600160a01b031682614fb3565b61106d863387614fbd565b50506005805461ff00191690559392505050565b60038054604080516020601f600260001961010060018816150201909516949094049384018190048102820181019092528281526060939092909183018282801561110d5780601f106110e25761010080835404028352916020019161110d565b820191906000526020600020905b8154815290600101906020018083116110f057829003601f168201915b5050505050905090565b3360008181526001602090815260408083206001600160a01b038716808552908352818420869055815186815291519394909390927f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925928290030190a35060015b92915050565b6802b5e3af16b188000081565b600554600090610100900460ff16156111d9576040805162461bcd60e51b815260206004820152600b60248201526a4552525f5245454e54525960a81b604482015290519081900360640190fd5b6001600160a01b0383166000908152600a602052604090205460ff16611236576040805162461bcd60e51b815260206004820152600d60248201526c11549497d393d517d093d55391609a1b604482015290519081900360640190fd5b6001600160a01b0382166000908152600a602052604090205460ff16611293576040805162461bcd60e51b815260206004820152600d60248201526c11549497d393d517d093d55391609a1b604482015290519081900360640190fd5b6001600160a01b038084166000908152600a602052604080822092851682528120600380840154600280860154928401549084015493946112d79492939290613f1a565b95945050505050565b600554600090610100900460ff161561132e576040805162461bcd60e51b815260206004820152600b60248201526a4552525f5245454e54525960a81b604482015290519081900360640190fd5b6001600160a01b0383166000908152600a602052604090205460ff1661138b576040805162461bcd60e51b815260206004820152600d60248201526c11549497d393d517d093d55391609a1b604482015290519081900360640190fd5b6001600160a01b0382166000908152600a602052604090205460ff166113e8576040805162461bcd60e51b815260206004820152600d60248201526c11549497d393d517d093d55391609a1b604482015290519081900360640190fd5b6001600160a01b038084166000908152600a60205260408082209285168252902060038083015460028085015492840154908401546007546112d794929190613f1a565b60025490565b6402540be400670de0b6b3a76400005b0481565b670de0b6b3a764000081565b6000336001600160a01b038516148061148e57506001600160a01b03841660009081526001602090815260408083203384529091529020548211155b6114df576040805162461bcd60e51b815260206004820152601560248201527f4552525f42544f4b454e5f4241445f43414c4c45520000000000000000000000604482015290519081900360640190fd5b6114ea8484846150af565b336001600160a01b0385161480159061152857506001600160a01b038416600090815260016020908152604080832033845290915290205460001914155b156115bc576001600160a01b038416600090815260016020908152604080832033845290915290205461155b9083614f2b565b6001600160a01b03858116600090815260016020908152604080832033808552908352928190208590558051948552519287169391927f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b9259281900390910190a35b5060019392505050565b6001600160a01b03166000908152600a602052604090205460ff1690565b600554600090610100900460ff1615611632576040805162461bcd60e51b815260206004820152600b60248201526a4552525f5245454e54525960a81b604482015290519081900360640190fd5b506006546001600160a01b031690565b60055460ff1690565b336001600160a01b03166000356001600160e01b0319166001600160e01b03191660003660405180806020018281038252848482818152602001925080828437600083820152604051601f909101601f19169092018290039550909350505050a2600554610100900460ff16156116f7576040805162461bcd60e51b815260206004820152600b60248201526a4552525f5245454e54525960a81b604482015290519081900360640190fd5b6005805461ff00191661010017905560085460ff1615611751576040805162461bcd60e51b815260206004820152601060248201526f11549497d254d7d1925390531256915160821b604482015290519081900360640190fd5b6006546001600160a01b031633146117a5576040805162461bcd60e51b815260206004820152601260248201527122a9292fa727aa2fa1a7a72a2927a62622a960711b604482015290519081900360640190fd5b64e8d4a510008110156117ff576040805162461bcd60e51b815260206004820152600b60248201527f4552525f4d494e5f464545000000000000000000000000000000000000000000604482015290519081900360640190fd5b67016345785d8a000081111561185c576040805162461bcd60e51b815260206004820152600b60248201527f4552525f4d41585f464545000000000000000000000000000000000000000000604482015290519081900360640190fd5b6007556005805461ff0019169055565b336001600160a01b03166000356001600160e01b0319166001600160e01b03191660003660405180806020018281038252848482818152602001925080828437600083820152604051601f909101601f19169092018290039550909350505050a2600554610100900460ff1615611918576040805162461bcd60e51b815260206004820152600b60248201526a4552525f5245454e54525960a81b604482015290519081900360640190fd5b6005805461ff001916610100179055600654336001600160a01b039091161461197d576040805162461bcd60e51b815260206004820152601260248201527122a9292fa727aa2fa1a7a72a2927a62622a960711b604482015290519081900360640190fd5b6001600160a01b0383166000908152600a602052604090205460ff166119da576040805162461bcd60e51b815260206004820152600d60248201526c11549497d393d517d093d55391609a1b604482015290519081900360640190fd5b60085460ff1615611a25576040805162461bcd60e51b815260206004820152601060248201526f11549497d254d7d1925390531256915160821b604482015290519081900360640190fd5b670de0b6b3a7640000811015611a82576040805162461bcd60e51b815260206004820152600e60248201527f4552525f4d494e5f574549474854000000000000000000000000000000000000604482015290519081900360640190fd5b6802b5e3af16b1880000811115611ae0576040805162461bcd60e51b815260206004820152600e60248201527f4552525f4d41585f574549474854000000000000000000000000000000000000604482015290519081900360640190fd5b620f4240821015611b38576040805162461bcd60e51b815260206004820152600f60248201527f4552525f4d494e5f42414c414e43450000000000000000000000000000000000604482015290519081900360640190fd5b6001600160a01b0383166000908152600a602052604090206002015480821115611bd857611b71600b54611b6c8484614f2b565b6151c8565b600b8190556802b5e3af16b18800001015611bd3576040805162461bcd60e51b815260206004820152601460248201527f4552525f4d41585f544f54414c5f574549474854000000000000000000000000604482015290519081900360640190fd5b611bf9565b80821015611bf957611bf5600b54611bf08385614f2b565b614f2b565b600b555b6001600160a01b0384166000908152600a602052604090206002810183905560030180549084905580841115611c4257611c3d8533611c388785614f2b565b615222565b611c9c565b80841015611c9c576000611c568286614f2b565b90506000611c65826000614e48565b9050611c7b8733611c768585614f2b565b614fbd565b600554611c999088906201000090046001600160a01b031683614fbd565b50505b50506005805461ff0019169055505050565b6000336001600160a01b03166000356001600160e01b0319166001600160e01b03191660003660405180806020018281038252848482818152602001925080828437600083820152604051601f909101601f19169092018290039550909350505050a2600554610100900460ff1615611d5c576040805162461bcd60e51b815260206004820152600b60248201526a4552525f5245454e54525960a81b604482015290519081900360640190fd5b6005805461ff00191661010017905560085460ff16611db6576040805162461bcd60e51b815260206004820152601160248201527011549497d393d517d19253905312569151607a1b604482015290519081900360640190fd5b6001600160a01b0384166000908152600a602052604090205460ff16611e13576040805162461bcd60e51b815260206004820152600d60248201526c11549497d393d517d093d55391609a1b604482015290519081900360640190fd5b6001600160a01b0384166000908152600a6020526040902060038101546002808301549054600b54600754611e4d9493929190899061398c565b915082821015611e94576040805162461bcd60e51b815260206004820152600d60248201526c11549497d31253525517d3d555609a1b604482015290519081900360640190fd5b6001600160a01b0385166000908152600a60205260409020600390810154611ec491670de0b6b3a7640000610ea6565b821115611f18576040805162461bcd60e51b815260206004820152601160248201527f4552525f4d41585f4f55545f524154494f000000000000000000000000000000604482015290519081900360640190fd5b611f26816003015483614f2b565b60038201556000611f378582614e48565b6040805185815290519192506001600160a01b0388169133917fe74c91552b64c2e2e7bd255639e004e693bd3e1d01cc33e65610b86afcc1ffed919081900360200190a3611f853386614f99565b611f926110418683614f2b565b600554611fae906201000090046001600160a01b031682614fb3565b61106d863385614fbd565b336001600160a01b03166000356001600160e01b0319166001600160e01b03191660003660405180806020018281038252848482818152602001925080828437600083820152604051601f909101601f19169092018290039550909350505050a2600554610100900460ff1615612065576040805162461bcd60e51b815260206004820152600b60248201526a4552525f5245454e54525960a81b604482015290519081900360640190fd5b6005805461ff00191661010017905560085460ff16156120bf576040805162461bcd60e51b815260206004820152601060248201526f11549497d254d7d1925390531256915160821b604482015290519081900360640190fd5b6006546001600160a01b03163314612113576040805162461bcd60e51b815260206004820152601260248201527122a9292fa727aa2fa1a7a72a2927a62622a960711b604482015290519081900360640190fd5b60068054911515600160a01b027fffffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffff9092169190911790556005805461ff0019169055565b336001600160a01b03166000356001600160e01b0319166001600160e01b03191660003660405180806020018281038252848482818152602001925080828437600083820152604051601f909101601f19169092018290039550909350505050a2600554610100900460ff1615612203576040805162461bcd60e51b815260206004820152600b60248201526a4552525f5245454e54525960a81b604482015290519081900360640190fd5b6005805461ff001916610100179055600654336001600160a01b0390911614612268576040805162461bcd60e51b815260206004820152601260248201527122a9292fa727aa2fa1a7a72a2927a62622a960711b604482015290519081900360640190fd5b60085460ff16156122b3576040805162461bcd60e51b815260206004820152601060248201526f11549497d254d7d1925390531256915160821b604482015290519081900360640190fd5b6009546002111561230b576040805162461bcd60e51b815260206004820152600e60248201527f4552525f4d494e5f544f4b454e53000000000000000000000000000000000000604482015290519081900360640190fd5b6008805460ff19166001179055600680547fffffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffff16600160a01b17905561235868056bc75e2d63100000615294565b61236b3368056bc75e2d63100000614fb3565b6005805461ff0019169055565b336001600160a01b03166000356001600160e01b0319166001600160e01b03191660003660405180806020018281038252848482818152602001925080828437600083820152604051601f909101601f19169092018290039550909350505050a2600554610100900460ff1615612424576040805162461bcd60e51b815260206004820152600b60248201526a4552525f5245454e54525960a81b604482015290519081900360640190fd5b6005805461ff00191661010017905560085460ff1661247e576040805162461bcd60e51b815260206004820152601160248201527011549497d393d517d19253905312569151607a1b604482015290519081900360640190fd5b600061248861142c565b90506000612496858361529d565b9050806124dc576040805162461bcd60e51b815260206004820152600f60248201526e08aa4a4be9a82a890be82a0a0a49eb608b1b604482015290519081900360640190fd5b60005b60095481101561265d576000600982815481106124f857fe5b60009182526020808320909101546001600160a01b0316808352600a90915260408220600301549092509061252d8583614e48565b905080612573576040805162461bcd60e51b815260206004820152600f60248201526e08aa4a4be9a82a890be82a0a0a49eb608b1b604482015290519081900360640190fd5b87878581811061257f57fe5b905060200201358111156125c9576040805162461bcd60e51b815260206004820152600c60248201526b22a9292fa624a6a4aa2fa4a760a11b604482015290519081900360640190fd5b6001600160a01b0383166000908152600a60205260409020600301546125ef90826151c8565b6001600160a01b0384166000818152600a60209081526040918290206003019390935580518481529051919233927f63982df10efd8dfaaaa0fcc7f50b2d93b7cba26ccc48adee2873220d485dc39a9281900390910190a3612652833383615222565b5050506001016124df565b5061266785615294565b611c9c3386614fb3565b60008061267e878661529d565b9050600061268c87866151c8565b9050600061269a828961529d565b905060006126b0670de0b6b3a76400008561529d565b905060006126be83836153d0565b905060006126cc828e614e48565b905060006126da828f614f2b565b905060006126f96126f3670de0b6b3a76400008a614f2b565b8b614e48565b905061271682612711670de0b6b3a764000084614f2b565b61529d565b9f9e505050505050505050505050505050565b6000336001600160a01b03166000356001600160e01b0319166001600160e01b03191660003660405180806020018281038252848482818152602001925080828437600083820152604051601f909101601f19169092018290039550909350505050a2600554610100900460ff16156127d7576040805162461bcd60e51b815260206004820152600b60248201526a4552525f5245454e54525960a81b604482015290519081900360640190fd5b6005805461ff00191661010017905560085460ff16612831576040805162461bcd60e51b815260206004820152601160248201527011549497d393d517d19253905312569151607a1b604482015290519081900360640190fd5b6001600160a01b0384166000908152600a602052604090205460ff1661288e576040805162461bcd60e51b815260206004820152600d60248201526c11549497d393d517d093d55391609a1b604482015290519081900360640190fd5b6001600160a01b0384166000908152600a60205260409020600301546128c0906002670de0b6b3a76400005b04614e48565b831115612914576040805162461bcd60e51b815260206004820152601060248201527f4552525f4d41585f494e5f524154494f00000000000000000000000000000000604482015290519081900360640190fd5b6001600160a01b0384166000908152600a6020526040902060038101546002808301549054600b5460075461294e949392919089906138d7565b915082821015612995576040805162461bcd60e51b815260206004820152600d60248201526c11549497d31253525517d3d555609a1b604482015290519081900360640190fd5b6129a38160030154856151c8565b60038201556040805185815290516001600160a01b0387169133917f63982df10efd8dfaaaa0fcc7f50b2d93b7cba26ccc48adee2873220d485dc39a9181900360200190a36129f182615294565b6129fb3383614fb3565b612a06853386615222565b506005805461ff00191690559392505050565b3360009081526001602090815260408083206001600160a01b038616845290915281205480831115612a6e573360009081526001602090815260408083206001600160a01b0388168452909152812055612a9d565b612a788184614f2b565b3360009081526001602090815260408083206001600160a01b03891684529091529020555b3360008181526001602090815260408083206001600160a01b0389168085529083529281902054815190815290519293927f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925929181900390910190a35060019392505050565b6000336001600160a01b03166000356001600160e01b0319166001600160e01b03191660003660405180806020018281038252848482818152602001925080828437600083820152604051601f909101601f19169092018290039550909350505050a2600554610100900460ff1615612bb1576040805162461bcd60e51b815260206004820152600b60248201526a4552525f5245454e54525960a81b604482015290519081900360640190fd5b6005805461ff00191661010017905560085460ff16612c0b576040805162461bcd60e51b815260206004820152601160248201527011549497d393d517d19253905312569151607a1b604482015290519081900360640190fd5b6001600160a01b0384166000908152600a602052604090205460ff16612c68576040805162461bcd60e51b815260206004820152600d60248201526c11549497d393d517d093d55391609a1b604482015290519081900360640190fd5b6001600160a01b0384166000908152600a6020526040902060038101546002808301549054600b54600754612ca294939291908990612671565b915081612ce8576040805162461bcd60e51b815260206004820152600f60248201526e08aa4a4be9a82a890be82a0a0a49eb608b1b604482015290519081900360640190fd5b82821115612d2c576040805162461bcd60e51b815260206004820152600c60248201526b22a9292fa624a6a4aa2fa4a760a11b604482015290519081900360640190fd5b6001600160a01b0385166000908152600a6020526040902060030154612d5c906002670de0b6b3a76400006128ba565b821115612db0576040805162461bcd60e51b815260206004820152601060248201527f4552525f4d41585f494e5f524154494f00000000000000000000000000000000604482015290519081900360640190fd5b612dbe8160030154836151c8565b60038201556040805183815290516001600160a01b0387169133917f63982df10efd8dfaaaa0fcc7f50b2d93b7cba26ccc48adee2873220d485dc39a9181900360200190a3612e0c84615294565b612e163385614fb3565b612a06853384615222565b6001600160a01b031660009081526020819052604090205490565b620f4240670de0b6b3a7640000611442565b60408051602080825236908201819052600092839233926001600160e01b03198535169285929081908101848480828437600083820152604051601f909101601f19169092018290039550909350505050a2600554610100900460ff1615612eeb576040805162461bcd60e51b815260206004820152600b60248201526a4552525f5245454e54525960a81b604482015290519081900360640190fd5b6005805461ff0019166101001790556001600160a01b0387166000908152600a602052604090205460ff16612f57576040805162461bcd60e51b815260206004820152600d60248201526c11549497d393d517d093d55391609a1b604482015290519081900360640190fd5b6001600160a01b0385166000908152600a602052604090205460ff16612fb4576040805162461bcd60e51b815260206004820152600d60248201526c11549497d393d517d093d55391609a1b604482015290519081900360640190fd5b600654600160a01b900460ff16613012576040805162461bcd60e51b815260206004820152601360248201527f4552525f535741505f4e4f545f5055424c494300000000000000000000000000604482015290519081900360640190fd5b6001600160a01b038088166000908152600a60205260408082209288168252902060038082015461304b91670de0b6b3a7640000610ea6565b86111561309f576040805162461bcd60e51b815260206004820152601160248201527f4552525f4d41585f4f55545f524154494f000000000000000000000000000000604482015290519081900360640190fd5b60006130c08360030154846002015484600301548560020154600754613f1a565b905085811115613117576040805162461bcd60e51b815260206004820152601360248201527f4552525f4241445f4c494d49545f505249434500000000000000000000000000604482015290519081900360640190fd5b61313783600301548460020154846003015485600201548b600754614db5565b94508885111561317d576040805162461bcd60e51b815260206004820152600c60248201526b22a9292fa624a6a4aa2fa4a760a11b604482015290519081900360640190fd5b61318b8360030154866151c8565b83600301819055506131a1826003015488614f2b565b6003808401829055840154600280860154908501546007546131c4949190613f1a565b93508084101561320d576040805162461bcd60e51b815260206004820152600f60248201526e08aa4a4be9a82a890be82a0a0a49eb608b1b604482015290519081900360640190fd5b85841115613262576040805162461bcd60e51b815260206004820152600f60248201527f4552525f4c494d49545f50524943450000000000000000000000000000000000604482015290519081900360640190fd5b61326c858861529d565b8111156132b2576040805162461bcd60e51b815260206004820152600f60248201526e08aa4a4be9a82a890be82a0a0a49eb608b1b604482015290519081900360640190fd5b876001600160a01b03168a6001600160a01b0316336001600160a01b03167f908fb5ee8f16c6bc9bc3690973819f32a4d4b10188134543c88706e0e1d43378888b604051808381526020018281526020019250505060405180910390a461331a8a3387615222565b613325883389614fbd565b5050506005805461ff001916905590969095509350505050565b60408051602080825236908201819052600092839233926001600160e01b03198535169285929081908101848480828437600083820152604051601f909101601f19169092018290039550909350505050a2600554610100900460ff16156133dc576040805162461bcd60e51b815260206004820152600b60248201526a4552525f5245454e54525960a81b604482015290519081900360640190fd5b6005805461ff0019166101001790556001600160a01b0387166000908152600a602052604090205460ff16613448576040805162461bcd60e51b815260206004820152600d60248201526c11549497d393d517d093d55391609a1b604482015290519081900360640190fd5b6001600160a01b0385166000908152600a602052604090205460ff166134a5576040805162461bcd60e51b815260206004820152600d60248201526c11549497d393d517d093d55391609a1b604482015290519081900360640190fd5b600654600160a01b900460ff16613503576040805162461bcd60e51b815260206004820152601360248201527f4552525f535741505f4e4f545f5055424c494300000000000000000000000000604482015290519081900360640190fd5b6001600160a01b038088166000908152600a602052604080822092881682529020600382015461353d906002670de0b6b3a76400006128ba565b881115613591576040805162461bcd60e51b815260206004820152601060248201527f4552525f4d41585f494e5f524154494f00000000000000000000000000000000604482015290519081900360640190fd5b60006135b28360030154846002015484600301548560020154600754613f1a565b905085811115613609576040805162461bcd60e51b815260206004820152601360248201527f4552525f4241445f4c494d49545f505249434500000000000000000000000000604482015290519081900360640190fd5b61362983600301548460020154846003015485600201548d6007546142eb565b945086851015613670576040805162461bcd60e51b815260206004820152600d60248201526c11549497d31253525517d3d555609a1b604482015290519081900360640190fd5b61367e83600301548a6151c8565b8360030181905550613694826003015486614f2b565b6003808401829055840154600280860154908501546007546136b7949190613f1a565b935080841015613700576040805162461bcd60e51b815260206004820152600f60248201526e08aa4a4be9a82a890be82a0a0a49eb608b1b604482015290519081900360640190fd5b85841115613755576040805162461bcd60e51b815260206004820152600f60248201527f4552525f4c494d49545f50524943450000000000000000000000000000000000604482015290519081900360640190fd5b61375f898661529d565b8111156137a5576040805162461bcd60e51b815260206004820152600f60248201526e08aa4a4be9a82a890be82a0a0a49eb608b1b604482015290519081900360640190fd5b876001600160a01b03168a6001600160a01b0316336001600160a01b03167f908fb5ee8f16c6bc9bc3690973819f32a4d4b10188134543c88706e0e1d433788c89604051808381526020018281526020019250505060405180910390a461380d8a338b615222565b613325883387614fbd565b600080613825878661529d565b9050600061383b670de0b6b3a764000083614f2b565b905060006138498286614e48565b9050600061386387612711670de0b6b3a764000085614f2b565b905060006138718c83614f2b565b9050600061387f828e61529d565b9050600061388d82886153d0565b9050600061389b828e614e48565b905060006138a98e83614f2b565b90506138c281612711670de0b6b3a76400006000614f2b565b99505050505050505050509695505050505050565b6000806138e4878661529d565b905060006139036138fd670de0b6b3a764000084614f2b565b85614e48565b905060006139228661391d670de0b6b3a764000085614f2b565b614e48565b905060006139308b836151c8565b9050600061393e828d61529d565b9050600061394c82876153d0565b9050600061395a828d614e48565b9050613966818d614f2b565b9e9d5050505050505050505050505050565b64e8d4a51000670de0b6b3a7640000611442565b600080613999878661529d565b905060006139b48561391d670de0b6b3a76400006000614f2b565b905060006139c28883614f2b565b905060006139d0828a61529d565b905060006139ef826139ea670de0b6b3a76400008861529d565b6153d0565b905060006139fd828e614e48565b90506000613a0b8e83614f2b565b90506000613a246126f3670de0b6b3a76400008a614f2b565b90506127168261391d670de0b6b3a764000084614f2b565b336001600160a01b03166000356001600160e01b0319166001600160e01b03191660003660405180806020018281038252848482818152602001925080828437600083820152604051601f909101601f19169092018290039550909350505050a2600554610100900460ff1615613ae8576040805162461bcd60e51b815260206004820152600b60248201526a4552525f5245454e54525960a81b604482015290519081900360640190fd5b6005805461ff0019166101001790556001600160a01b0381166000908152600a602052604090205460ff16613b54576040805162461bcd60e51b815260206004820152600d60248201526c11549497d393d517d093d55391609a1b604482015290519081900360640190fd5b604080517f70a0823100000000000000000000000000000000000000000000000000000000815230600482015290516001600160a01b038316916370a08231916024808301926020929190829003018186803b158015613bb357600080fd5b505afa158015613bc7573d6000803e3d6000fd5b505050506040513d6020811015613bdd57600080fd5b50516001600160a01b039091166000908152600a60205260409020600301556005805461ff0019169055565b60085460ff1690565b336001600160a01b03166000356001600160e01b0319166001600160e01b03191660003660405180806020018281038252848482818152602001925080828437600083820152604051601f909101601f19169092018290039550909350505050a2600554610100900460ff1615613cbe576040805162461bcd60e51b815260206004820152600b60248201526a4552525f5245454e54525960a81b604482015290519081900360640190fd5b6005805461ff001916610100179055600654336001600160a01b0390911614613d23576040805162461bcd60e51b815260206004820152601260248201527122a9292fa727aa2fa1a7a72a2927a62622a960711b604482015290519081900360640190fd5b6006805473ffffffffffffffffffffffffffffffffffffffff19166001600160a01b03929092169190911790556005805461ff0019169055565b600554600090610100900460ff1615613dab576040805162461bcd60e51b815260206004820152600b60248201526a4552525f5245454e54525960a81b604482015290519081900360640190fd5b50600b5490565b68056bc75e2d6310000081565b600554600090610100900460ff1615613e0d576040805162461bcd60e51b815260206004820152600b60248201526a4552525f5245454e54525960a81b604482015290519081900360640190fd5b6001600160a01b0382166000908152600a602052604090205460ff16613e6a576040805162461bcd60e51b815260206004820152600d60248201526c11549497d393d517d093d55391609a1b604482015290519081900360640190fd5b506001600160a01b03166000908152600a602052604090206002015490565b60048054604080516020601f600260001961010060018816150201909516949094049384018190048102820181019092528281526060939092909183018282801561110d5780601f106110e25761010080835404028352916020019161110d565b6704a03ce68d21555681565b7f42524f4e5a45000000000000000000000000000000000000000000000000000090565b600080613f27878761529d565b90506000613f35868661529d565b90506000613f43838361529d565b90506000613f65670de0b6b3a7640000612711670de0b6b3a764000089614f2b565b9050613f718282614e48565b9a9950505050505050505050565b6000613f8c3384846150af565b50600192915050565b336001600160a01b03166000356001600160e01b0319166001600160e01b03191660003660405180806020018281038252848482818152602001925080828437600083820152604051601f909101601f19169092018290039550909350505050a2600554610100900460ff1615614041576040805162461bcd60e51b815260206004820152600b60248201526a4552525f5245454e54525960a81b604482015290519081900360640190fd5b6005805461ff00191661010017905560085460ff1661409b576040805162461bcd60e51b815260206004820152601160248201527011549497d393d517d19253905312569151607a1b604482015290519081900360640190fd5b60006140a561142c565b905060006140b4856000614e48565b905060006140c28683614f2b565b905060006140d0828561529d565b905080614116576040805162461bcd60e51b815260206004820152600f60248201526e08aa4a4be9a82a890be82a0a0a49eb608b1b604482015290519081900360640190fd5b6141203388614f99565b60055461413c906201000090046001600160a01b031684614fb3565b61414582614fa7565b60005b6009548110156142c75760006009828154811061416157fe5b60009182526020808320909101546001600160a01b0316808352600a9091526040822060030154909250906141968583614e48565b9050806141dc576040805162461bcd60e51b815260206004820152600f60248201526e08aa4a4be9a82a890be82a0a0a49eb608b1b604482015290519081900360640190fd5b8989858181106141e857fe5b90506020020135811015614233576040805162461bcd60e51b815260206004820152600d60248201526c11549497d31253525517d3d555609a1b604482015290519081900360640190fd5b6001600160a01b0383166000908152600a60205260409020600301546142599082614f2b565b6001600160a01b0384166000818152600a60209081526040918290206003019390935580518481529051919233927fe74c91552b64c2e2e7bd255639e004e693bd3e1d01cc33e65610b86afcc1ffed9281900390910190a36142bc833383614fbd565b505050600101614148565b50506005805461ff0019169055505050505050565b600881565b600281565b600181565b6000806142f8878661529d565b9050600061430e670de0b6b3a764000085614f2b565b905061431a8582614e48565b9050600061432c8a6127118c856151c8565b9050600061433a82856153d0565b90506000614350670de0b6b3a764000083614f2b565b905061435c8a82614e48565b9c9b505050505050505050505050565b600a670de0b6b3a7640000611442565b671bc16d674ec7ffff81565b600554606090610100900460ff16156143d6576040805162461bcd60e51b815260206004820152600b60248201526a4552525f5245454e54525960a81b604482015290519081900360640190fd5b60085460ff16614421576040805162461bcd60e51b815260206004820152601160248201527011549497d393d517d19253905312569151607a1b604482015290519081900360640190fd5b600980548060200260200160405190810160405280929190818152602001828054801561110d57602002820191906000526020600020905b81546001600160a01b03168152600190910190602001808311614459575050505050905090565b600081565b600554606090610100900460ff1615614421576040805162461bcd60e51b815260206004820152600b60248201526a4552525f5245454e54525960a81b604482015290519081900360640190fd5b60095490565b336001600160a01b03166000356001600160e01b0319166001600160e01b03191660003660405180806020018281038252848482818152602001925080828437600083820152604051601f909101601f19169092018290039550909350505050a2600554610100900460ff1615614585576040805162461bcd60e51b815260206004820152600b60248201526a4552525f5245454e54525960a81b604482015290519081900360640190fd5b6005805461ff001916610100179055600654336001600160a01b03909116146145ea576040805162461bcd60e51b815260206004820152601260248201527122a9292fa727aa2fa1a7a72a2927a62622a960711b604482015290519081900360640190fd5b6001600160a01b0381166000908152600a602052604090205460ff16614647576040805162461bcd60e51b815260206004820152600d60248201526c11549497d393d517d093d55391609a1b604482015290519081900360640190fd5b60085460ff1615614692576040805162461bcd60e51b815260206004820152601060248201526f11549497d254d7d1925390531256915160821b604482015290519081900360640190fd5b6001600160a01b0381166000908152600a6020526040812060030154906146b98282614e48565b600b546001600160a01b0385166000908152600a60205260409020600201549192506146e491614f2b565b600b556001600160a01b0383166000908152600a602052604090206001015460098054600019810191908290811061471857fe5b600091825260209091200154600980546001600160a01b03909216918490811061473e57fe5b9060005260206000200160006101000a8154816001600160a01b0302191690836001600160a01b0316021790555081600a60006009858154811061477e57fe5b60009182526020808320909101546001600160a01b0316835282019290925260400190206001015560098054806147b157fe5b600082815260208082206000199084018101805473ffffffffffffffffffffffffffffffffffffffff1916905590920190925560408051608081018252838152808301848152818301858152606083018681526001600160a01b038c168752600a909552929094209051815460ff1916901515178155925160018401555160028301555160039091015561484a8533611c768787614f2b565b600554611c9c9086906201000090046001600160a01b031685614fbd565b600554600090610100900460ff16156148b6576040805162461bcd60e51b815260206004820152600b60248201526a4552525f5245454e54525960a81b604482015290519081900360640190fd5b5060075490565b3360009081526001602090815260408083206001600160a01b03861684529091528120546148eb90836151c8565b3360008181526001602090815260408083206001600160a01b0389168085529083529281902085905580519485525191937f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925929081900390910190a350600192915050565b6001600160a01b03918216600090815260016020908152604080832093909416825291909152205490565b336001600160a01b03166000356001600160e01b0319166001600160e01b03191660003660405180806020018281038252848482818152602001925080828437600083820152604051601f909101601f19169092018290039550909350505050a26006546001600160a01b03163314614a30576040805162461bcd60e51b815260206004820152601260248201527122a9292fa727aa2fa1a7a72a2927a62622a960711b604482015290519081900360640190fd5b6001600160a01b0383166000908152600a602052604090205460ff1615614a9e576040805162461bcd60e51b815260206004820152600c60248201527f4552525f49535f424f554e440000000000000000000000000000000000000000604482015290519081900360640190fd5b60085460ff1615614ae9576040805162461bcd60e51b815260206004820152601060248201526f11549497d254d7d1925390531256915160821b604482015290519081900360640190fd5b600954600811614b40576040805162461bcd60e51b815260206004820152600e60248201527f4552525f4d41585f544f4b454e53000000000000000000000000000000000000604482015290519081900360640190fd5b6040805160808101825260018082526009805460208085019182526000858701818152606087018281526001600160a01b038c16808452600a9094529782209651875460ff1916901515178755925186860155915160028601559451600390940193909355805491820181559091527f6e1540171b6c0c960b71a7020d9f60077f6af931a8bbf590da0223dacf75c7af01805473ffffffffffffffffffffffffffffffffffffffff19169091179055614bfa83838361186c565b505050565b6002670de0b6b3a7640000611442565b600554600090610100900460ff1615614c5d576040805162461bcd60e51b815260206004820152600b60248201526a4552525f5245454e54525960a81b604482015290519081900360640190fd5b6001600160a01b0382166000908152600a602052604090205460ff16614cba576040805162461bcd60e51b815260206004820152600d60248201526c11549497d393d517d093d55391609a1b604482015290519081900360640190fd5b6001600160a01b0382166000908152600a6020526040902060020154600b54614ce490829061529d565b9392505050565b600554600090610100900460ff1615614d39576040805162461bcd60e51b815260206004820152600b60248201526a4552525f5245454e54525960a81b604482015290519081900360640190fd5b6001600160a01b0382166000908152600a602052604090205460ff16614d96576040805162461bcd60e51b815260206004820152600d60248201526c11549497d393d517d093d55391609a1b604482015290519081900360640190fd5b506001600160a01b03166000908152600a602052604090206003015490565b600080614dc2858861529d565b90506000614dd08786614f2b565b90506000614dde888361529d565b90506000614dec82856153d0565b9050614e0081670de0b6b3a7640000614f2b565b9050614e14670de0b6b3a764000087614f2b565b9450614e29614e238c83614e48565b8661529d565b9b9a5050505050505050505050565b600654600160a01b900460ff1690565b6000828202831580614e62575082848281614e5f57fe5b04145b614eb3576040805162461bcd60e51b815260206004820152601060248201527f4552525f4d554c5f4f564552464c4f5700000000000000000000000000000000604482015290519081900360640190fd5b6706f05b59d3b20000810181811015614f13576040805162461bcd60e51b815260206004820152601060248201527f4552525f4d554c5f4f564552464c4f5700000000000000000000000000000000604482015290519081900360640190fd5b6000670de0b6b3a7640000825b049695505050505050565b6000806000614f3a85856154ed565b915091508015614f91576040805162461bcd60e51b815260206004820152601160248201527f4552525f5355425f554e444552464c4f57000000000000000000000000000000604482015290519081900360640190fd5b509392505050565b614fa38282615512565b5050565b614fb08161551d565b50565b614fa382826155f6565b604080517fa9059cbb0000000000000000000000000000000000000000000000000000000081526001600160a01b03848116600483015260248201849052915160009286169163a9059cbb91604480830192602092919082900301818787803b15801561502957600080fd5b505af115801561503d573d6000803e3d6000fd5b505050506040513d602081101561505357600080fd5b50519050806150a9576040805162461bcd60e51b815260206004820152600f60248201527f4552525f45524332305f46414c53450000000000000000000000000000000000604482015290519081900360640190fd5b50505050565b6001600160a01b03831660009081526020819052604090205481111561511c576040805162461bcd60e51b815260206004820152601460248201527f4552525f494e53554646494349454e545f42414c000000000000000000000000604482015290519081900360640190fd5b6001600160a01b03831660009081526020819052604090205461513f9082614f2b565b6001600160a01b03808516600090815260208190526040808220939093559084168152205461516e90826151c8565b6001600160a01b038084166000818152602081815260409182902094909455805185815290519193928716927fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef92918290030190a3505050565b600082820183811015614ce4576040805162461bcd60e51b815260206004820152601060248201527f4552525f4144445f4f564552464c4f5700000000000000000000000000000000604482015290519081900360640190fd5b604080517f23b872dd0000000000000000000000000000000000000000000000000000000081526001600160a01b0384811660048301523060248301526044820184905291516000928616916323b872dd91606480830192602092919082900301818787803b15801561502957600080fd5b614fb081615601565b6000816152f1576040805162461bcd60e51b815260206004820152600c60248201527f4552525f4449565f5a45524f0000000000000000000000000000000000000000604482015290519081900360640190fd5b670de0b6b3a764000083028315806153195750670de0b6b3a764000084828161531657fe5b04145b61536a576040805162461bcd60e51b815260206004820152601060248201527f4552525f4449565f494e5445524e414c00000000000000000000000000000000604482015290519081900360640190fd5b600283048101818110156153c5576040805162461bcd60e51b815260206004820152601060248201527f4552525f4449565f494e5445524e414c00000000000000000000000000000000604482015290519081900360640190fd5b6000848281614f2057fe5b60006001831015615428576040805162461bcd60e51b815260206004820152601560248201527f4552525f42504f575f424153455f544f4f5f4c4f570000000000000000000000604482015290519081900360640190fd5b671bc16d674ec7ffff831115615485576040805162461bcd60e51b815260206004820152601660248201527f4552525f42504f575f424153455f544f4f5f4849474800000000000000000000604482015290519081900360640190fd5b600061549083615676565b9050600061549e8483614f2b565b905060006154b4866154af85615691565b61569f565b9050816154c5579250611178915050565b60006154d687846305f5e1006156f6565b90506154e28282614e48565b979650505050505050565b600080828410615503575050808203600061550b565b505081810360015b9250929050565b614fa38230836150af565b30600090815260208190526040902054811115615581576040805162461bcd60e51b815260206004820152601460248201527f4552525f494e53554646494349454e545f42414c000000000000000000000000604482015290519081900360640190fd5b3060009081526020819052604090205461559b9082614f2b565b306000908152602081905260409020556002546155b89082614f2b565b60025560408051828152905160009130917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9181900360200190a350565b614fa33083836150af565b3060009081526020819052604090205461561b90826151c8565b3060009081526020819052604090205560025461563890826151c8565b60025560408051828152905130916000917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9181900360200190a350565b6000670de0b6b3a764000061568a83615691565b0292915050565b670de0b6b3a7640000900490565b600080600283066156b857670de0b6b3a76400006156ba565b835b90506002830492505b8215614ce4576156d38485614e48565b935060028306156156eb576156e88185614e48565b90505b6002830492506156c3565b600082818061570d87670de0b6b3a76400006154ed565b9092509050670de0b6b3a764000080600060015b8884106157c5576000670de0b6b3a7640000820290506000806157558a61575085670de0b6b3a7640000614f2b565b6154ed565b915091506157678761391d848c614e48565b9650615773878461529d565b965086615782575050506157c5565b871561578c579315935b8015615796579315935b84156157ad576157a68688614f2b565b95506157ba565b6157b786886151c8565b95505b505050600101615721565b5090999850505050505050505056fea265627a7a7231582008be3d1ae8df326becfb0d7fa15f3da56c3488a4813f666aa4154f7433e2a31e64736f6c634300050c0032
Deployed Bytecode
0x608060405234801561001057600080fd5b50600436106103eb5760003560e01c80638d4e40831161021a578063bc694ea211610135578063d73dd623116100c8578063ec09302111610097578063f8b2cb4f1161007c578063f8b2cb4f14610cac578063f8d6aed414610cd2578063fde924f714610d0d576103eb565b8063ec09302114610c7e578063f1b8a9b714610c86576103eb565b8063d73dd62314610bf2578063dd62ed3e14610c1e578063e4a28a52146104f1578063e4e1e53814610c4c576103eb565b8063cc77828d11610104578063cc77828d14610bb4578063cd2ed8fb14610bbc578063cf5e7bd314610bc4578063d4cadf6814610bea576103eb565b8063bc694ea214610b4c578063be3bbd2e14610b54578063c36596a614610565578063c6580d1214610bac576103eb565b8063a221ee49116101ad578063b7b800a41161017c578063b7b800a414610af9578063ba019dab14610b01578063ba9530a614610b09578063bc063e1a14610b44576103eb565b8063a221ee4914610a19578063a9059cbb14610a4e578063b02f0b7314610a7a578063b0e0d13614610af1576103eb565b8063948d8ce6116101e9578063948d8ce6146109db57806395d89b4114610a01578063992e2a9214610a095780639a86139b14610a11576103eb565b80638d4e40831461099d57806392eefe9b146109a5578063936c3477146109cb5780639381cd2b146109d3576103eb565b806349b595521161030a57806376c7a3c71161029d5780638656b6531161026c5780638656b653146108f9578063867378c514610934578063892980121461093c5780638c28cbe814610977576103eb565b806376c7a3c71461081d5780637c5e9ea4146108255780638201aa3f1461087e57806382f652ad146108be576103eb565b80635db34277116102d95780635db342771461076757806366188463146107995780636d06dfa0146107c557806370a08231146107f7576103eb565b806349b595521461068e5780634bb278f3146106ad5780634f69c0d4146106b55780635c1bbaf71461072c576103eb565b8063218b538211610382578063313ce56711610351578063313ce567146105ed57806334e199071461060b5780633fdddaa21461062a57806346ab38f11461065c576103eb565b8063218b53821461056557806323b872dd1461056d5780632f37b624146105a35780633018205f146105c9576103eb565b80631446a7ff116103be5780631446a7ff146104f957806315e84af91461052757806318160ddd14610555578063189d00ca1461055d576103eb565b806302c96748146103f057806306fdde0314610434578063095ea7b3146104b157806309a3bbe4146104f1575b600080fd5b6104226004803603606081101561040657600080fd5b506001600160a01b038135169060208101359060400135610d15565b60408051918252519081900360200190f35b61043c611081565b6040805160208082528351818301528351919283929083019185019080838360005b8381101561047657818101518382015260200161045e565b50505050905090810190601f1680156104a35780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b6104dd600480360360408110156104c757600080fd5b506001600160a01b038135169060200135611117565b604080519115158252519081900360200190f35b61042261117e565b6104226004803603604081101561050f57600080fd5b506001600160a01b038135811691602001351661118b565b6104226004803603604081101561053d57600080fd5b506001600160a01b03813581169160200135166112e0565b61042261142c565b610422611432565b610422611446565b6104dd6004803603606081101561058357600080fd5b506001600160a01b03813581169160208101359091169060400135611452565b6104dd600480360360208110156105b957600080fd5b50356001600160a01b03166115c6565b6105d16115e4565b604080516001600160a01b039092168252519081900360200190f35b6105f5611642565b6040805160ff9092168252519081900360200190f35b6106286004803603602081101561062157600080fd5b503561164b565b005b6106286004803603606081101561064057600080fd5b506001600160a01b03813516906020810135906040013561186c565b6104226004803603606081101561067257600080fd5b506001600160a01b038135169060208101359060400135611cae565b610628600480360360208110156106a457600080fd5b50351515611fb9565b610628612157565b610628600480360360408110156106cb57600080fd5b813591908101906040810160208201356401000000008111156106ed57600080fd5b8201836020820111156106ff57600080fd5b8035906020019184602083028401116401000000008311171561072157600080fd5b509092509050612378565b610422600480360360c081101561074257600080fd5b5080359060208101359060408101359060608101359060808101359060a00135612671565b6104226004803603606081101561077d57600080fd5b506001600160a01b038135169060208101359060400135612729565b6104dd600480360360408110156107af57600080fd5b506001600160a01b038135169060200135612a19565b610422600480360360608110156107db57600080fd5b506001600160a01b038135169060208101359060400135612b03565b6104226004803603602081101561080d57600080fd5b50356001600160a01b0316612e21565b610422612e3c565b610865600480360360a081101561083b57600080fd5b506001600160a01b0381358116916020810135916040820135169060608101359060800135612e4e565b6040805192835260208301919091528051918290030190f35b610865600480360360a081101561089457600080fd5b506001600160a01b038135811691602081013591604082013516906060810135906080013561333f565b610422600480360360c08110156108d457600080fd5b5080359060208101359060408101359060608101359060808101359060a00135613818565b610422600480360360c081101561090f57600080fd5b5080359060208101359060408101359060608101359060808101359060a001356138d7565b610422613978565b610422600480360360c081101561095257600080fd5b5080359060208101359060408101359060608101359060808101359060a0013561398c565b6106286004803603602081101561098d57600080fd5b50356001600160a01b0316613a3c565b6104dd613c09565b610628600480360360208110156109bb57600080fd5b50356001600160a01b0316613c12565b610422613d5d565b610422613db2565b610422600480360360208110156109f157600080fd5b50356001600160a01b0316613dbf565b61043c613e89565b610422613eea565b610422613ef6565b610422600480360360a0811015610a2f57600080fd5b5080359060208101359060408101359060608101359060800135613f1a565b6104dd60048036036040811015610a6457600080fd5b506001600160a01b038135169060200135613f7f565b61062860048036036040811015610a9057600080fd5b81359190810190604081016020820135640100000000811115610ab257600080fd5b820183602082011115610ac457600080fd5b80359060200191846020830284011164010000000083111715610ae657600080fd5b509092509050613f95565b6104226142dc565b6104226142e1565b6104226142e6565b610422600480360360c0811015610b1f57600080fd5b5080359060208101359060408101359060608101359060808101359060a001356142eb565b61042261436c565b61042261437c565b610b5c614388565b60408051602080825283518183015283519192839290830191858101910280838360005b83811015610b98578181015183820152602001610b80565b505050509050019250505060405180910390f35b610422614480565b610b5c614485565b6104226144d3565b61062860048036036020811015610bda57600080fd5b50356001600160a01b03166144d9565b610422614868565b6104dd60048036036040811015610c0857600080fd5b506001600160a01b0381351690602001356148bd565b61042260048036036040811015610c3457600080fd5b506001600160a01b0381358116916020013516614950565b61062860048036036060811015610c6257600080fd5b506001600160a01b03813516906020810135906040013561497b565b610422614bff565b61042260048036036020811015610c9c57600080fd5b50356001600160a01b0316614c0f565b61042260048036036020811015610cc257600080fd5b50356001600160a01b0316614ceb565b610422600480360360c0811015610ce857600080fd5b5080359060208101359060408101359060608101359060808101359060a00135614db5565b6104dd614e38565b6000336001600160a01b03166000356001600160e01b0319166001600160e01b03191660003660405180806020018281038252848482818152602001925080828437600083820152604051601f909101601f19169092018290039550909350505050a2600554610100900460ff1615610dc3576040805162461bcd60e51b815260206004820152600b60248201526a4552525f5245454e54525960a81b604482015290519081900360640190fd5b6005805461ff00191661010017905560085460ff16610e1d576040805162461bcd60e51b815260206004820152601160248201527011549497d393d517d19253905312569151607a1b604482015290519081900360640190fd5b6001600160a01b0384166000908152600a602052604090205460ff16610e7a576040805162461bcd60e51b815260206004820152600d60248201526c11549497d393d517d093d55391609a1b604482015290519081900360640190fd5b6001600160a01b0384166000908152600a60205260409020600390810154610eaf91670de0b6b3a76400005b04600101614e48565b831115610f03576040805162461bcd60e51b815260206004820152601160248201527f4552525f4d41585f4f55545f524154494f000000000000000000000000000000604482015290519081900360640190fd5b6001600160a01b0384166000908152600a6020526040902060038101546002808301549054600b54600754610f3d94939291908990613818565b915081610f83576040805162461bcd60e51b815260206004820152600f60248201526e08aa4a4be9a82a890be82a0a0a49eb608b1b604482015290519081900360640190fd5b82821115610fc7576040805162461bcd60e51b815260206004820152600c60248201526b22a9292fa624a6a4aa2fa4a760a11b604482015290519081900360640190fd5b610fd5816003015485614f2b565b60038201556000610fe68382614e48565b6040805187815290519192506001600160a01b0388169133917fe74c91552b64c2e2e7bd255639e004e693bd3e1d01cc33e65610b86afcc1ffed919081900360200190a36110343384614f99565b6110466110418483614f2b565b614fa7565b600554611062906201000090046001600160a01b031682614fb3565b61106d863387614fbd565b50506005805461ff00191690559392505050565b60038054604080516020601f600260001961010060018816150201909516949094049384018190048102820181019092528281526060939092909183018282801561110d5780601f106110e25761010080835404028352916020019161110d565b820191906000526020600020905b8154815290600101906020018083116110f057829003601f168201915b5050505050905090565b3360008181526001602090815260408083206001600160a01b038716808552908352818420869055815186815291519394909390927f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925928290030190a35060015b92915050565b6802b5e3af16b188000081565b600554600090610100900460ff16156111d9576040805162461bcd60e51b815260206004820152600b60248201526a4552525f5245454e54525960a81b604482015290519081900360640190fd5b6001600160a01b0383166000908152600a602052604090205460ff16611236576040805162461bcd60e51b815260206004820152600d60248201526c11549497d393d517d093d55391609a1b604482015290519081900360640190fd5b6001600160a01b0382166000908152600a602052604090205460ff16611293576040805162461bcd60e51b815260206004820152600d60248201526c11549497d393d517d093d55391609a1b604482015290519081900360640190fd5b6001600160a01b038084166000908152600a602052604080822092851682528120600380840154600280860154928401549084015493946112d79492939290613f1a565b95945050505050565b600554600090610100900460ff161561132e576040805162461bcd60e51b815260206004820152600b60248201526a4552525f5245454e54525960a81b604482015290519081900360640190fd5b6001600160a01b0383166000908152600a602052604090205460ff1661138b576040805162461bcd60e51b815260206004820152600d60248201526c11549497d393d517d093d55391609a1b604482015290519081900360640190fd5b6001600160a01b0382166000908152600a602052604090205460ff166113e8576040805162461bcd60e51b815260206004820152600d60248201526c11549497d393d517d093d55391609a1b604482015290519081900360640190fd5b6001600160a01b038084166000908152600a60205260408082209285168252902060038083015460028085015492840154908401546007546112d794929190613f1a565b60025490565b6402540be400670de0b6b3a76400005b0481565b670de0b6b3a764000081565b6000336001600160a01b038516148061148e57506001600160a01b03841660009081526001602090815260408083203384529091529020548211155b6114df576040805162461bcd60e51b815260206004820152601560248201527f4552525f42544f4b454e5f4241445f43414c4c45520000000000000000000000604482015290519081900360640190fd5b6114ea8484846150af565b336001600160a01b0385161480159061152857506001600160a01b038416600090815260016020908152604080832033845290915290205460001914155b156115bc576001600160a01b038416600090815260016020908152604080832033845290915290205461155b9083614f2b565b6001600160a01b03858116600090815260016020908152604080832033808552908352928190208590558051948552519287169391927f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b9259281900390910190a35b5060019392505050565b6001600160a01b03166000908152600a602052604090205460ff1690565b600554600090610100900460ff1615611632576040805162461bcd60e51b815260206004820152600b60248201526a4552525f5245454e54525960a81b604482015290519081900360640190fd5b506006546001600160a01b031690565b60055460ff1690565b336001600160a01b03166000356001600160e01b0319166001600160e01b03191660003660405180806020018281038252848482818152602001925080828437600083820152604051601f909101601f19169092018290039550909350505050a2600554610100900460ff16156116f7576040805162461bcd60e51b815260206004820152600b60248201526a4552525f5245454e54525960a81b604482015290519081900360640190fd5b6005805461ff00191661010017905560085460ff1615611751576040805162461bcd60e51b815260206004820152601060248201526f11549497d254d7d1925390531256915160821b604482015290519081900360640190fd5b6006546001600160a01b031633146117a5576040805162461bcd60e51b815260206004820152601260248201527122a9292fa727aa2fa1a7a72a2927a62622a960711b604482015290519081900360640190fd5b64e8d4a510008110156117ff576040805162461bcd60e51b815260206004820152600b60248201527f4552525f4d494e5f464545000000000000000000000000000000000000000000604482015290519081900360640190fd5b67016345785d8a000081111561185c576040805162461bcd60e51b815260206004820152600b60248201527f4552525f4d41585f464545000000000000000000000000000000000000000000604482015290519081900360640190fd5b6007556005805461ff0019169055565b336001600160a01b03166000356001600160e01b0319166001600160e01b03191660003660405180806020018281038252848482818152602001925080828437600083820152604051601f909101601f19169092018290039550909350505050a2600554610100900460ff1615611918576040805162461bcd60e51b815260206004820152600b60248201526a4552525f5245454e54525960a81b604482015290519081900360640190fd5b6005805461ff001916610100179055600654336001600160a01b039091161461197d576040805162461bcd60e51b815260206004820152601260248201527122a9292fa727aa2fa1a7a72a2927a62622a960711b604482015290519081900360640190fd5b6001600160a01b0383166000908152600a602052604090205460ff166119da576040805162461bcd60e51b815260206004820152600d60248201526c11549497d393d517d093d55391609a1b604482015290519081900360640190fd5b60085460ff1615611a25576040805162461bcd60e51b815260206004820152601060248201526f11549497d254d7d1925390531256915160821b604482015290519081900360640190fd5b670de0b6b3a7640000811015611a82576040805162461bcd60e51b815260206004820152600e60248201527f4552525f4d494e5f574549474854000000000000000000000000000000000000604482015290519081900360640190fd5b6802b5e3af16b1880000811115611ae0576040805162461bcd60e51b815260206004820152600e60248201527f4552525f4d41585f574549474854000000000000000000000000000000000000604482015290519081900360640190fd5b620f4240821015611b38576040805162461bcd60e51b815260206004820152600f60248201527f4552525f4d494e5f42414c414e43450000000000000000000000000000000000604482015290519081900360640190fd5b6001600160a01b0383166000908152600a602052604090206002015480821115611bd857611b71600b54611b6c8484614f2b565b6151c8565b600b8190556802b5e3af16b18800001015611bd3576040805162461bcd60e51b815260206004820152601460248201527f4552525f4d41585f544f54414c5f574549474854000000000000000000000000604482015290519081900360640190fd5b611bf9565b80821015611bf957611bf5600b54611bf08385614f2b565b614f2b565b600b555b6001600160a01b0384166000908152600a602052604090206002810183905560030180549084905580841115611c4257611c3d8533611c388785614f2b565b615222565b611c9c565b80841015611c9c576000611c568286614f2b565b90506000611c65826000614e48565b9050611c7b8733611c768585614f2b565b614fbd565b600554611c999088906201000090046001600160a01b031683614fbd565b50505b50506005805461ff0019169055505050565b6000336001600160a01b03166000356001600160e01b0319166001600160e01b03191660003660405180806020018281038252848482818152602001925080828437600083820152604051601f909101601f19169092018290039550909350505050a2600554610100900460ff1615611d5c576040805162461bcd60e51b815260206004820152600b60248201526a4552525f5245454e54525960a81b604482015290519081900360640190fd5b6005805461ff00191661010017905560085460ff16611db6576040805162461bcd60e51b815260206004820152601160248201527011549497d393d517d19253905312569151607a1b604482015290519081900360640190fd5b6001600160a01b0384166000908152600a602052604090205460ff16611e13576040805162461bcd60e51b815260206004820152600d60248201526c11549497d393d517d093d55391609a1b604482015290519081900360640190fd5b6001600160a01b0384166000908152600a6020526040902060038101546002808301549054600b54600754611e4d9493929190899061398c565b915082821015611e94576040805162461bcd60e51b815260206004820152600d60248201526c11549497d31253525517d3d555609a1b604482015290519081900360640190fd5b6001600160a01b0385166000908152600a60205260409020600390810154611ec491670de0b6b3a7640000610ea6565b821115611f18576040805162461bcd60e51b815260206004820152601160248201527f4552525f4d41585f4f55545f524154494f000000000000000000000000000000604482015290519081900360640190fd5b611f26816003015483614f2b565b60038201556000611f378582614e48565b6040805185815290519192506001600160a01b0388169133917fe74c91552b64c2e2e7bd255639e004e693bd3e1d01cc33e65610b86afcc1ffed919081900360200190a3611f853386614f99565b611f926110418683614f2b565b600554611fae906201000090046001600160a01b031682614fb3565b61106d863385614fbd565b336001600160a01b03166000356001600160e01b0319166001600160e01b03191660003660405180806020018281038252848482818152602001925080828437600083820152604051601f909101601f19169092018290039550909350505050a2600554610100900460ff1615612065576040805162461bcd60e51b815260206004820152600b60248201526a4552525f5245454e54525960a81b604482015290519081900360640190fd5b6005805461ff00191661010017905560085460ff16156120bf576040805162461bcd60e51b815260206004820152601060248201526f11549497d254d7d1925390531256915160821b604482015290519081900360640190fd5b6006546001600160a01b03163314612113576040805162461bcd60e51b815260206004820152601260248201527122a9292fa727aa2fa1a7a72a2927a62622a960711b604482015290519081900360640190fd5b60068054911515600160a01b027fffffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffff9092169190911790556005805461ff0019169055565b336001600160a01b03166000356001600160e01b0319166001600160e01b03191660003660405180806020018281038252848482818152602001925080828437600083820152604051601f909101601f19169092018290039550909350505050a2600554610100900460ff1615612203576040805162461bcd60e51b815260206004820152600b60248201526a4552525f5245454e54525960a81b604482015290519081900360640190fd5b6005805461ff001916610100179055600654336001600160a01b0390911614612268576040805162461bcd60e51b815260206004820152601260248201527122a9292fa727aa2fa1a7a72a2927a62622a960711b604482015290519081900360640190fd5b60085460ff16156122b3576040805162461bcd60e51b815260206004820152601060248201526f11549497d254d7d1925390531256915160821b604482015290519081900360640190fd5b6009546002111561230b576040805162461bcd60e51b815260206004820152600e60248201527f4552525f4d494e5f544f4b454e53000000000000000000000000000000000000604482015290519081900360640190fd5b6008805460ff19166001179055600680547fffffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffff16600160a01b17905561235868056bc75e2d63100000615294565b61236b3368056bc75e2d63100000614fb3565b6005805461ff0019169055565b336001600160a01b03166000356001600160e01b0319166001600160e01b03191660003660405180806020018281038252848482818152602001925080828437600083820152604051601f909101601f19169092018290039550909350505050a2600554610100900460ff1615612424576040805162461bcd60e51b815260206004820152600b60248201526a4552525f5245454e54525960a81b604482015290519081900360640190fd5b6005805461ff00191661010017905560085460ff1661247e576040805162461bcd60e51b815260206004820152601160248201527011549497d393d517d19253905312569151607a1b604482015290519081900360640190fd5b600061248861142c565b90506000612496858361529d565b9050806124dc576040805162461bcd60e51b815260206004820152600f60248201526e08aa4a4be9a82a890be82a0a0a49eb608b1b604482015290519081900360640190fd5b60005b60095481101561265d576000600982815481106124f857fe5b60009182526020808320909101546001600160a01b0316808352600a90915260408220600301549092509061252d8583614e48565b905080612573576040805162461bcd60e51b815260206004820152600f60248201526e08aa4a4be9a82a890be82a0a0a49eb608b1b604482015290519081900360640190fd5b87878581811061257f57fe5b905060200201358111156125c9576040805162461bcd60e51b815260206004820152600c60248201526b22a9292fa624a6a4aa2fa4a760a11b604482015290519081900360640190fd5b6001600160a01b0383166000908152600a60205260409020600301546125ef90826151c8565b6001600160a01b0384166000818152600a60209081526040918290206003019390935580518481529051919233927f63982df10efd8dfaaaa0fcc7f50b2d93b7cba26ccc48adee2873220d485dc39a9281900390910190a3612652833383615222565b5050506001016124df565b5061266785615294565b611c9c3386614fb3565b60008061267e878661529d565b9050600061268c87866151c8565b9050600061269a828961529d565b905060006126b0670de0b6b3a76400008561529d565b905060006126be83836153d0565b905060006126cc828e614e48565b905060006126da828f614f2b565b905060006126f96126f3670de0b6b3a76400008a614f2b565b8b614e48565b905061271682612711670de0b6b3a764000084614f2b565b61529d565b9f9e505050505050505050505050505050565b6000336001600160a01b03166000356001600160e01b0319166001600160e01b03191660003660405180806020018281038252848482818152602001925080828437600083820152604051601f909101601f19169092018290039550909350505050a2600554610100900460ff16156127d7576040805162461bcd60e51b815260206004820152600b60248201526a4552525f5245454e54525960a81b604482015290519081900360640190fd5b6005805461ff00191661010017905560085460ff16612831576040805162461bcd60e51b815260206004820152601160248201527011549497d393d517d19253905312569151607a1b604482015290519081900360640190fd5b6001600160a01b0384166000908152600a602052604090205460ff1661288e576040805162461bcd60e51b815260206004820152600d60248201526c11549497d393d517d093d55391609a1b604482015290519081900360640190fd5b6001600160a01b0384166000908152600a60205260409020600301546128c0906002670de0b6b3a76400005b04614e48565b831115612914576040805162461bcd60e51b815260206004820152601060248201527f4552525f4d41585f494e5f524154494f00000000000000000000000000000000604482015290519081900360640190fd5b6001600160a01b0384166000908152600a6020526040902060038101546002808301549054600b5460075461294e949392919089906138d7565b915082821015612995576040805162461bcd60e51b815260206004820152600d60248201526c11549497d31253525517d3d555609a1b604482015290519081900360640190fd5b6129a38160030154856151c8565b60038201556040805185815290516001600160a01b0387169133917f63982df10efd8dfaaaa0fcc7f50b2d93b7cba26ccc48adee2873220d485dc39a9181900360200190a36129f182615294565b6129fb3383614fb3565b612a06853386615222565b506005805461ff00191690559392505050565b3360009081526001602090815260408083206001600160a01b038616845290915281205480831115612a6e573360009081526001602090815260408083206001600160a01b0388168452909152812055612a9d565b612a788184614f2b565b3360009081526001602090815260408083206001600160a01b03891684529091529020555b3360008181526001602090815260408083206001600160a01b0389168085529083529281902054815190815290519293927f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925929181900390910190a35060019392505050565b6000336001600160a01b03166000356001600160e01b0319166001600160e01b03191660003660405180806020018281038252848482818152602001925080828437600083820152604051601f909101601f19169092018290039550909350505050a2600554610100900460ff1615612bb1576040805162461bcd60e51b815260206004820152600b60248201526a4552525f5245454e54525960a81b604482015290519081900360640190fd5b6005805461ff00191661010017905560085460ff16612c0b576040805162461bcd60e51b815260206004820152601160248201527011549497d393d517d19253905312569151607a1b604482015290519081900360640190fd5b6001600160a01b0384166000908152600a602052604090205460ff16612c68576040805162461bcd60e51b815260206004820152600d60248201526c11549497d393d517d093d55391609a1b604482015290519081900360640190fd5b6001600160a01b0384166000908152600a6020526040902060038101546002808301549054600b54600754612ca294939291908990612671565b915081612ce8576040805162461bcd60e51b815260206004820152600f60248201526e08aa4a4be9a82a890be82a0a0a49eb608b1b604482015290519081900360640190fd5b82821115612d2c576040805162461bcd60e51b815260206004820152600c60248201526b22a9292fa624a6a4aa2fa4a760a11b604482015290519081900360640190fd5b6001600160a01b0385166000908152600a6020526040902060030154612d5c906002670de0b6b3a76400006128ba565b821115612db0576040805162461bcd60e51b815260206004820152601060248201527f4552525f4d41585f494e5f524154494f00000000000000000000000000000000604482015290519081900360640190fd5b612dbe8160030154836151c8565b60038201556040805183815290516001600160a01b0387169133917f63982df10efd8dfaaaa0fcc7f50b2d93b7cba26ccc48adee2873220d485dc39a9181900360200190a3612e0c84615294565b612e163385614fb3565b612a06853384615222565b6001600160a01b031660009081526020819052604090205490565b620f4240670de0b6b3a7640000611442565b60408051602080825236908201819052600092839233926001600160e01b03198535169285929081908101848480828437600083820152604051601f909101601f19169092018290039550909350505050a2600554610100900460ff1615612eeb576040805162461bcd60e51b815260206004820152600b60248201526a4552525f5245454e54525960a81b604482015290519081900360640190fd5b6005805461ff0019166101001790556001600160a01b0387166000908152600a602052604090205460ff16612f57576040805162461bcd60e51b815260206004820152600d60248201526c11549497d393d517d093d55391609a1b604482015290519081900360640190fd5b6001600160a01b0385166000908152600a602052604090205460ff16612fb4576040805162461bcd60e51b815260206004820152600d60248201526c11549497d393d517d093d55391609a1b604482015290519081900360640190fd5b600654600160a01b900460ff16613012576040805162461bcd60e51b815260206004820152601360248201527f4552525f535741505f4e4f545f5055424c494300000000000000000000000000604482015290519081900360640190fd5b6001600160a01b038088166000908152600a60205260408082209288168252902060038082015461304b91670de0b6b3a7640000610ea6565b86111561309f576040805162461bcd60e51b815260206004820152601160248201527f4552525f4d41585f4f55545f524154494f000000000000000000000000000000604482015290519081900360640190fd5b60006130c08360030154846002015484600301548560020154600754613f1a565b905085811115613117576040805162461bcd60e51b815260206004820152601360248201527f4552525f4241445f4c494d49545f505249434500000000000000000000000000604482015290519081900360640190fd5b61313783600301548460020154846003015485600201548b600754614db5565b94508885111561317d576040805162461bcd60e51b815260206004820152600c60248201526b22a9292fa624a6a4aa2fa4a760a11b604482015290519081900360640190fd5b61318b8360030154866151c8565b83600301819055506131a1826003015488614f2b565b6003808401829055840154600280860154908501546007546131c4949190613f1a565b93508084101561320d576040805162461bcd60e51b815260206004820152600f60248201526e08aa4a4be9a82a890be82a0a0a49eb608b1b604482015290519081900360640190fd5b85841115613262576040805162461bcd60e51b815260206004820152600f60248201527f4552525f4c494d49545f50524943450000000000000000000000000000000000604482015290519081900360640190fd5b61326c858861529d565b8111156132b2576040805162461bcd60e51b815260206004820152600f60248201526e08aa4a4be9a82a890be82a0a0a49eb608b1b604482015290519081900360640190fd5b876001600160a01b03168a6001600160a01b0316336001600160a01b03167f908fb5ee8f16c6bc9bc3690973819f32a4d4b10188134543c88706e0e1d43378888b604051808381526020018281526020019250505060405180910390a461331a8a3387615222565b613325883389614fbd565b5050506005805461ff001916905590969095509350505050565b60408051602080825236908201819052600092839233926001600160e01b03198535169285929081908101848480828437600083820152604051601f909101601f19169092018290039550909350505050a2600554610100900460ff16156133dc576040805162461bcd60e51b815260206004820152600b60248201526a4552525f5245454e54525960a81b604482015290519081900360640190fd5b6005805461ff0019166101001790556001600160a01b0387166000908152600a602052604090205460ff16613448576040805162461bcd60e51b815260206004820152600d60248201526c11549497d393d517d093d55391609a1b604482015290519081900360640190fd5b6001600160a01b0385166000908152600a602052604090205460ff166134a5576040805162461bcd60e51b815260206004820152600d60248201526c11549497d393d517d093d55391609a1b604482015290519081900360640190fd5b600654600160a01b900460ff16613503576040805162461bcd60e51b815260206004820152601360248201527f4552525f535741505f4e4f545f5055424c494300000000000000000000000000604482015290519081900360640190fd5b6001600160a01b038088166000908152600a602052604080822092881682529020600382015461353d906002670de0b6b3a76400006128ba565b881115613591576040805162461bcd60e51b815260206004820152601060248201527f4552525f4d41585f494e5f524154494f00000000000000000000000000000000604482015290519081900360640190fd5b60006135b28360030154846002015484600301548560020154600754613f1a565b905085811115613609576040805162461bcd60e51b815260206004820152601360248201527f4552525f4241445f4c494d49545f505249434500000000000000000000000000604482015290519081900360640190fd5b61362983600301548460020154846003015485600201548d6007546142eb565b945086851015613670576040805162461bcd60e51b815260206004820152600d60248201526c11549497d31253525517d3d555609a1b604482015290519081900360640190fd5b61367e83600301548a6151c8565b8360030181905550613694826003015486614f2b565b6003808401829055840154600280860154908501546007546136b7949190613f1a565b935080841015613700576040805162461bcd60e51b815260206004820152600f60248201526e08aa4a4be9a82a890be82a0a0a49eb608b1b604482015290519081900360640190fd5b85841115613755576040805162461bcd60e51b815260206004820152600f60248201527f4552525f4c494d49545f50524943450000000000000000000000000000000000604482015290519081900360640190fd5b61375f898661529d565b8111156137a5576040805162461bcd60e51b815260206004820152600f60248201526e08aa4a4be9a82a890be82a0a0a49eb608b1b604482015290519081900360640190fd5b876001600160a01b03168a6001600160a01b0316336001600160a01b03167f908fb5ee8f16c6bc9bc3690973819f32a4d4b10188134543c88706e0e1d433788c89604051808381526020018281526020019250505060405180910390a461380d8a338b615222565b613325883387614fbd565b600080613825878661529d565b9050600061383b670de0b6b3a764000083614f2b565b905060006138498286614e48565b9050600061386387612711670de0b6b3a764000085614f2b565b905060006138718c83614f2b565b9050600061387f828e61529d565b9050600061388d82886153d0565b9050600061389b828e614e48565b905060006138a98e83614f2b565b90506138c281612711670de0b6b3a76400006000614f2b565b99505050505050505050509695505050505050565b6000806138e4878661529d565b905060006139036138fd670de0b6b3a764000084614f2b565b85614e48565b905060006139228661391d670de0b6b3a764000085614f2b565b614e48565b905060006139308b836151c8565b9050600061393e828d61529d565b9050600061394c82876153d0565b9050600061395a828d614e48565b9050613966818d614f2b565b9e9d5050505050505050505050505050565b64e8d4a51000670de0b6b3a7640000611442565b600080613999878661529d565b905060006139b48561391d670de0b6b3a76400006000614f2b565b905060006139c28883614f2b565b905060006139d0828a61529d565b905060006139ef826139ea670de0b6b3a76400008861529d565b6153d0565b905060006139fd828e614e48565b90506000613a0b8e83614f2b565b90506000613a246126f3670de0b6b3a76400008a614f2b565b90506127168261391d670de0b6b3a764000084614f2b565b336001600160a01b03166000356001600160e01b0319166001600160e01b03191660003660405180806020018281038252848482818152602001925080828437600083820152604051601f909101601f19169092018290039550909350505050a2600554610100900460ff1615613ae8576040805162461bcd60e51b815260206004820152600b60248201526a4552525f5245454e54525960a81b604482015290519081900360640190fd5b6005805461ff0019166101001790556001600160a01b0381166000908152600a602052604090205460ff16613b54576040805162461bcd60e51b815260206004820152600d60248201526c11549497d393d517d093d55391609a1b604482015290519081900360640190fd5b604080517f70a0823100000000000000000000000000000000000000000000000000000000815230600482015290516001600160a01b038316916370a08231916024808301926020929190829003018186803b158015613bb357600080fd5b505afa158015613bc7573d6000803e3d6000fd5b505050506040513d6020811015613bdd57600080fd5b50516001600160a01b039091166000908152600a60205260409020600301556005805461ff0019169055565b60085460ff1690565b336001600160a01b03166000356001600160e01b0319166001600160e01b03191660003660405180806020018281038252848482818152602001925080828437600083820152604051601f909101601f19169092018290039550909350505050a2600554610100900460ff1615613cbe576040805162461bcd60e51b815260206004820152600b60248201526a4552525f5245454e54525960a81b604482015290519081900360640190fd5b6005805461ff001916610100179055600654336001600160a01b0390911614613d23576040805162461bcd60e51b815260206004820152601260248201527122a9292fa727aa2fa1a7a72a2927a62622a960711b604482015290519081900360640190fd5b6006805473ffffffffffffffffffffffffffffffffffffffff19166001600160a01b03929092169190911790556005805461ff0019169055565b600554600090610100900460ff1615613dab576040805162461bcd60e51b815260206004820152600b60248201526a4552525f5245454e54525960a81b604482015290519081900360640190fd5b50600b5490565b68056bc75e2d6310000081565b600554600090610100900460ff1615613e0d576040805162461bcd60e51b815260206004820152600b60248201526a4552525f5245454e54525960a81b604482015290519081900360640190fd5b6001600160a01b0382166000908152600a602052604090205460ff16613e6a576040805162461bcd60e51b815260206004820152600d60248201526c11549497d393d517d093d55391609a1b604482015290519081900360640190fd5b506001600160a01b03166000908152600a602052604090206002015490565b60048054604080516020601f600260001961010060018816150201909516949094049384018190048102820181019092528281526060939092909183018282801561110d5780601f106110e25761010080835404028352916020019161110d565b6704a03ce68d21555681565b7f42524f4e5a45000000000000000000000000000000000000000000000000000090565b600080613f27878761529d565b90506000613f35868661529d565b90506000613f43838361529d565b90506000613f65670de0b6b3a7640000612711670de0b6b3a764000089614f2b565b9050613f718282614e48565b9a9950505050505050505050565b6000613f8c3384846150af565b50600192915050565b336001600160a01b03166000356001600160e01b0319166001600160e01b03191660003660405180806020018281038252848482818152602001925080828437600083820152604051601f909101601f19169092018290039550909350505050a2600554610100900460ff1615614041576040805162461bcd60e51b815260206004820152600b60248201526a4552525f5245454e54525960a81b604482015290519081900360640190fd5b6005805461ff00191661010017905560085460ff1661409b576040805162461bcd60e51b815260206004820152601160248201527011549497d393d517d19253905312569151607a1b604482015290519081900360640190fd5b60006140a561142c565b905060006140b4856000614e48565b905060006140c28683614f2b565b905060006140d0828561529d565b905080614116576040805162461bcd60e51b815260206004820152600f60248201526e08aa4a4be9a82a890be82a0a0a49eb608b1b604482015290519081900360640190fd5b6141203388614f99565b60055461413c906201000090046001600160a01b031684614fb3565b61414582614fa7565b60005b6009548110156142c75760006009828154811061416157fe5b60009182526020808320909101546001600160a01b0316808352600a9091526040822060030154909250906141968583614e48565b9050806141dc576040805162461bcd60e51b815260206004820152600f60248201526e08aa4a4be9a82a890be82a0a0a49eb608b1b604482015290519081900360640190fd5b8989858181106141e857fe5b90506020020135811015614233576040805162461bcd60e51b815260206004820152600d60248201526c11549497d31253525517d3d555609a1b604482015290519081900360640190fd5b6001600160a01b0383166000908152600a60205260409020600301546142599082614f2b565b6001600160a01b0384166000818152600a60209081526040918290206003019390935580518481529051919233927fe74c91552b64c2e2e7bd255639e004e693bd3e1d01cc33e65610b86afcc1ffed9281900390910190a36142bc833383614fbd565b505050600101614148565b50506005805461ff0019169055505050505050565b600881565b600281565b600181565b6000806142f8878661529d565b9050600061430e670de0b6b3a764000085614f2b565b905061431a8582614e48565b9050600061432c8a6127118c856151c8565b9050600061433a82856153d0565b90506000614350670de0b6b3a764000083614f2b565b905061435c8a82614e48565b9c9b505050505050505050505050565b600a670de0b6b3a7640000611442565b671bc16d674ec7ffff81565b600554606090610100900460ff16156143d6576040805162461bcd60e51b815260206004820152600b60248201526a4552525f5245454e54525960a81b604482015290519081900360640190fd5b60085460ff16614421576040805162461bcd60e51b815260206004820152601160248201527011549497d393d517d19253905312569151607a1b604482015290519081900360640190fd5b600980548060200260200160405190810160405280929190818152602001828054801561110d57602002820191906000526020600020905b81546001600160a01b03168152600190910190602001808311614459575050505050905090565b600081565b600554606090610100900460ff1615614421576040805162461bcd60e51b815260206004820152600b60248201526a4552525f5245454e54525960a81b604482015290519081900360640190fd5b60095490565b336001600160a01b03166000356001600160e01b0319166001600160e01b03191660003660405180806020018281038252848482818152602001925080828437600083820152604051601f909101601f19169092018290039550909350505050a2600554610100900460ff1615614585576040805162461bcd60e51b815260206004820152600b60248201526a4552525f5245454e54525960a81b604482015290519081900360640190fd5b6005805461ff001916610100179055600654336001600160a01b03909116146145ea576040805162461bcd60e51b815260206004820152601260248201527122a9292fa727aa2fa1a7a72a2927a62622a960711b604482015290519081900360640190fd5b6001600160a01b0381166000908152600a602052604090205460ff16614647576040805162461bcd60e51b815260206004820152600d60248201526c11549497d393d517d093d55391609a1b604482015290519081900360640190fd5b60085460ff1615614692576040805162461bcd60e51b815260206004820152601060248201526f11549497d254d7d1925390531256915160821b604482015290519081900360640190fd5b6001600160a01b0381166000908152600a6020526040812060030154906146b98282614e48565b600b546001600160a01b0385166000908152600a60205260409020600201549192506146e491614f2b565b600b556001600160a01b0383166000908152600a602052604090206001015460098054600019810191908290811061471857fe5b600091825260209091200154600980546001600160a01b03909216918490811061473e57fe5b9060005260206000200160006101000a8154816001600160a01b0302191690836001600160a01b0316021790555081600a60006009858154811061477e57fe5b60009182526020808320909101546001600160a01b0316835282019290925260400190206001015560098054806147b157fe5b600082815260208082206000199084018101805473ffffffffffffffffffffffffffffffffffffffff1916905590920190925560408051608081018252838152808301848152818301858152606083018681526001600160a01b038c168752600a909552929094209051815460ff1916901515178155925160018401555160028301555160039091015561484a8533611c768787614f2b565b600554611c9c9086906201000090046001600160a01b031685614fbd565b600554600090610100900460ff16156148b6576040805162461bcd60e51b815260206004820152600b60248201526a4552525f5245454e54525960a81b604482015290519081900360640190fd5b5060075490565b3360009081526001602090815260408083206001600160a01b03861684529091528120546148eb90836151c8565b3360008181526001602090815260408083206001600160a01b0389168085529083529281902085905580519485525191937f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925929081900390910190a350600192915050565b6001600160a01b03918216600090815260016020908152604080832093909416825291909152205490565b336001600160a01b03166000356001600160e01b0319166001600160e01b03191660003660405180806020018281038252848482818152602001925080828437600083820152604051601f909101601f19169092018290039550909350505050a26006546001600160a01b03163314614a30576040805162461bcd60e51b815260206004820152601260248201527122a9292fa727aa2fa1a7a72a2927a62622a960711b604482015290519081900360640190fd5b6001600160a01b0383166000908152600a602052604090205460ff1615614a9e576040805162461bcd60e51b815260206004820152600c60248201527f4552525f49535f424f554e440000000000000000000000000000000000000000604482015290519081900360640190fd5b60085460ff1615614ae9576040805162461bcd60e51b815260206004820152601060248201526f11549497d254d7d1925390531256915160821b604482015290519081900360640190fd5b600954600811614b40576040805162461bcd60e51b815260206004820152600e60248201527f4552525f4d41585f544f4b454e53000000000000000000000000000000000000604482015290519081900360640190fd5b6040805160808101825260018082526009805460208085019182526000858701818152606087018281526001600160a01b038c16808452600a9094529782209651875460ff1916901515178755925186860155915160028601559451600390940193909355805491820181559091527f6e1540171b6c0c960b71a7020d9f60077f6af931a8bbf590da0223dacf75c7af01805473ffffffffffffffffffffffffffffffffffffffff19169091179055614bfa83838361186c565b505050565b6002670de0b6b3a7640000611442565b600554600090610100900460ff1615614c5d576040805162461bcd60e51b815260206004820152600b60248201526a4552525f5245454e54525960a81b604482015290519081900360640190fd5b6001600160a01b0382166000908152600a602052604090205460ff16614cba576040805162461bcd60e51b815260206004820152600d60248201526c11549497d393d517d093d55391609a1b604482015290519081900360640190fd5b6001600160a01b0382166000908152600a6020526040902060020154600b54614ce490829061529d565b9392505050565b600554600090610100900460ff1615614d39576040805162461bcd60e51b815260206004820152600b60248201526a4552525f5245454e54525960a81b604482015290519081900360640190fd5b6001600160a01b0382166000908152600a602052604090205460ff16614d96576040805162461bcd60e51b815260206004820152600d60248201526c11549497d393d517d093d55391609a1b604482015290519081900360640190fd5b506001600160a01b03166000908152600a602052604090206003015490565b600080614dc2858861529d565b90506000614dd08786614f2b565b90506000614dde888361529d565b90506000614dec82856153d0565b9050614e0081670de0b6b3a7640000614f2b565b9050614e14670de0b6b3a764000087614f2b565b9450614e29614e238c83614e48565b8661529d565b9b9a5050505050505050505050565b600654600160a01b900460ff1690565b6000828202831580614e62575082848281614e5f57fe5b04145b614eb3576040805162461bcd60e51b815260206004820152601060248201527f4552525f4d554c5f4f564552464c4f5700000000000000000000000000000000604482015290519081900360640190fd5b6706f05b59d3b20000810181811015614f13576040805162461bcd60e51b815260206004820152601060248201527f4552525f4d554c5f4f564552464c4f5700000000000000000000000000000000604482015290519081900360640190fd5b6000670de0b6b3a7640000825b049695505050505050565b6000806000614f3a85856154ed565b915091508015614f91576040805162461bcd60e51b815260206004820152601160248201527f4552525f5355425f554e444552464c4f57000000000000000000000000000000604482015290519081900360640190fd5b509392505050565b614fa38282615512565b5050565b614fb08161551d565b50565b614fa382826155f6565b604080517fa9059cbb0000000000000000000000000000000000000000000000000000000081526001600160a01b03848116600483015260248201849052915160009286169163a9059cbb91604480830192602092919082900301818787803b15801561502957600080fd5b505af115801561503d573d6000803e3d6000fd5b505050506040513d602081101561505357600080fd5b50519050806150a9576040805162461bcd60e51b815260206004820152600f60248201527f4552525f45524332305f46414c53450000000000000000000000000000000000604482015290519081900360640190fd5b50505050565b6001600160a01b03831660009081526020819052604090205481111561511c576040805162461bcd60e51b815260206004820152601460248201527f4552525f494e53554646494349454e545f42414c000000000000000000000000604482015290519081900360640190fd5b6001600160a01b03831660009081526020819052604090205461513f9082614f2b565b6001600160a01b03808516600090815260208190526040808220939093559084168152205461516e90826151c8565b6001600160a01b038084166000818152602081815260409182902094909455805185815290519193928716927fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef92918290030190a3505050565b600082820183811015614ce4576040805162461bcd60e51b815260206004820152601060248201527f4552525f4144445f4f564552464c4f5700000000000000000000000000000000604482015290519081900360640190fd5b604080517f23b872dd0000000000000000000000000000000000000000000000000000000081526001600160a01b0384811660048301523060248301526044820184905291516000928616916323b872dd91606480830192602092919082900301818787803b15801561502957600080fd5b614fb081615601565b6000816152f1576040805162461bcd60e51b815260206004820152600c60248201527f4552525f4449565f5a45524f0000000000000000000000000000000000000000604482015290519081900360640190fd5b670de0b6b3a764000083028315806153195750670de0b6b3a764000084828161531657fe5b04145b61536a576040805162461bcd60e51b815260206004820152601060248201527f4552525f4449565f494e5445524e414c00000000000000000000000000000000604482015290519081900360640190fd5b600283048101818110156153c5576040805162461bcd60e51b815260206004820152601060248201527f4552525f4449565f494e5445524e414c00000000000000000000000000000000604482015290519081900360640190fd5b6000848281614f2057fe5b60006001831015615428576040805162461bcd60e51b815260206004820152601560248201527f4552525f42504f575f424153455f544f4f5f4c4f570000000000000000000000604482015290519081900360640190fd5b671bc16d674ec7ffff831115615485576040805162461bcd60e51b815260206004820152601660248201527f4552525f42504f575f424153455f544f4f5f4849474800000000000000000000604482015290519081900360640190fd5b600061549083615676565b9050600061549e8483614f2b565b905060006154b4866154af85615691565b61569f565b9050816154c5579250611178915050565b60006154d687846305f5e1006156f6565b90506154e28282614e48565b979650505050505050565b600080828410615503575050808203600061550b565b505081810360015b9250929050565b614fa38230836150af565b30600090815260208190526040902054811115615581576040805162461bcd60e51b815260206004820152601460248201527f4552525f494e53554646494349454e545f42414c000000000000000000000000604482015290519081900360640190fd5b3060009081526020819052604090205461559b9082614f2b565b306000908152602081905260409020556002546155b89082614f2b565b60025560408051828152905160009130917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9181900360200190a350565b614fa33083836150af565b3060009081526020819052604090205461561b90826151c8565b3060009081526020819052604090205560025461563890826151c8565b60025560408051828152905130916000917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9181900360200190a350565b6000670de0b6b3a764000061568a83615691565b0292915050565b670de0b6b3a7640000900490565b600080600283066156b857670de0b6b3a76400006156ba565b835b90506002830492505b8215614ce4576156d38485614e48565b935060028306156156eb576156e88185614e48565b90505b6002830492506156c3565b600082818061570d87670de0b6b3a76400006154ed565b9092509050670de0b6b3a764000080600060015b8884106157c5576000670de0b6b3a7640000820290506000806157558a61575085670de0b6b3a7640000614f2b565b6154ed565b915091506157678761391d848c614e48565b9650615773878461529d565b965086615782575050506157c5565b871561578c579315935b8015615796579315935b84156157ad576157a68688614f2b565b95506157ba565b6157b786886151c8565b95505b505050600101615721565b5090999850505050505050505056fea265627a7a7231582008be3d1ae8df326becfb0d7fa15f3da56c3488a4813f666aa4154f7433e2a31e64736f6c634300050c0032
Deployed Bytecode Sourcemap
714:22532:4:-;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;714:22532:4;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;20904:1350;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;;;;;;20904:1350:4;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;2853:81:5;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8:100:-1;33:3;30:1;27:10;8:100;;;90:11;;;84:18;71:11;;;64:39;52:2;45:10;8:100;;;12:14;2853:81:5;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;3439:180;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;;;;;;3439:180:5;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;1147:50:1;;;:::i;9827:481:4:-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;;;;;;9827:481:4;;;;;;;;;;:::i;9340:::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;;;;;;9340:481:4;;;;;;;;;;:::i;3347:86:5:-;;;:::i;1439:54:1:-;;;:::i;1040:45::-;;;:::i;4409:483:5:-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;;;;;;4409:483:5;;;;;;;;;;;;;;;;;:::i;2766:118:4:-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;2766:118:4;-1:-1:-1;;;;;2766:118:4;;:::i;4338:131::-;;;:::i;:::-;;;;-1:-1:-1;;;;;4338:131:4;;;;;;;;;;;;;;3031:80:5;;;:::i;:::-;;;;;;;;;;;;;;;;;;;4475:341:4;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;4475:341:4;;:::i;:::-;;6415:1603;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;;;;;;6415:1603:4;;;;;;;;;;;;;:::i;19606:1292::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;;;;;;19606:1292:4;;;;;;;;;;;;;:::i;5023:242::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;5023:242:4;;;;:::i;5271:418::-;;;:::i;10314:925::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;10314:925:4;;;;;;;;;;;;;;21:11:-1;5:28;;2:2;;;46:1;43;36:12;2:2;10314:925:4;;35:9:-1;28:4;12:14;8:25;5:40;2:2;;;58:1;55;48:12;2:2;10314:925:4;;;;;;101:9:-1;95:2;81:12;77:21;67:8;63:36;60:51;39:11;25:12;22:29;11:108;8:2;;;132:1;129;122:12;8:2;-1:-1;10314:925:4;;-1:-1:-1;10314:925:4;-1:-1:-1;10314:925:4;:::i;8611:1167:2:-;;;;;;13:3:-1;8;5:12;2:2;;;30:1;27;20:12;2:2;-1:-1;8611:1167:2;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;17204:1173:4:-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;;;;;;17204:1173:4;;;;;;;;;;;;;:::i;3879:388:5:-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;;;;;;3879:388:5;;;;;;;;:::i;18383:1217:4:-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;;;;;;18383:1217:4;;;;;;;;;;;;;:::i;3241:100:5:-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;3241:100:5;-1:-1:-1;;;;;3241:100:5;;:::i;876:53:1:-;;;:::i;14777:2420:4:-;;;;;;13:3:-1;8;5:12;2:2;;;30:1;27;20:12;2:2;-1:-1;;;;;;14777:2420:4;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;12346:2425;;;;;;13:3:-1;8;5:12;2:2;;;30:1;27;20:12;2:2;-1:-1;;;;;;12346:2425:4;;;;;;;;;;;;;;;;;;;;;;;;;:::i;13224:1254:2:-;;;;;;13:3:-1;8;5:12;2:2;;;30:1;27;20:12;2:2;-1:-1;13224:1254:2;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;6465:1140::-;;;;;;13:3:-1;8;5:12;2:2;;;30:1;27;20:12;2:2;-1:-1;6465:1140:2;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;1203:54:1:-;;;:::i;10884:1234:2:-;;;;;;13:3:-1;8;5:12;2:2;;;30:1;27;20:12;2:2;-1:-1;10884:1234:2;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;9116:218:4:-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;9116:218:4;-1:-1:-1;;;;;9116:218:4;;:::i;2654:106::-;;;:::i;4822:195::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;4822:195:4;-1:-1:-1;;;;;4822:195:4;;:::i;3576:142::-;;;:::i;1264:51:1:-;;;:::i;3352:218:4:-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;3352:218:4;-1:-1:-1;;;;;3352:218:4;;:::i;2940:85:5:-;;;:::i;1555:59:1:-;;;:::i;795:117:0:-;;;:::i;1636:494:2:-;;;;;;13:3:-1;8;5:12;2:2;;;30:1;27;20:12;2:2;-1:-1;1636:494:2;;;;;;;;;;;;;;;;;;;;;;:::i;4273:130:5:-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;;;;;;4273:130:5;;;;;;;;:::i;11245:1094:4:-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;11245:1094:4;;;;;;;;;;;;;;21:11:-1;5:28;;2:2;;;46:1;43;36:12;2:2;11245:1094:4;;35:9:-1;28:4;12:14;8:25;5:40;2:2;;;58:1;55;48:12;2:2;11245:1094:4;;;;;;101:9:-1;95:2;81:12;77:21;67:8;63:36;60:51;39:11;25:12;22:29;11:108;8:2;;;132:1;129;122:12;8:2;-1:-1;11245:1094:4;;-1:-1:-1;11245:1094:4;-1:-1:-1;11245:1094:4;:::i;827:42:1:-;;;:::i;779:::-;;;:::i;1322:46::-;;;:::i;3136:664:2:-;;;;;;13:3:-1;8;5:12;2:2;;;30:1;27;20:12;2:2;-1:-1;3136:664:2;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;935:50:1:-;;;:::i;1374:59::-;;;:::i;3152:194:4:-;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8:100:-1;33:3;30:1;27:10;8:100;;;90:11;;;84:18;71:11;;;64:39;52:2;45:10;8:100;;;12:14;3152:194:4;;;;;;;;;;;;;;;;;991:42:1;;;:::i;3008:138:4:-;;;:::i;2890:112::-;;;:::i;8024:1010::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;8024:1010:4;-1:-1:-1;;;;;8024:1010:4;;:::i;4210:122::-;;;:::i;3625:248:5:-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;;;;;;3625:248:5;;;;;;;;:::i;3117:118::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;;;;;;3117:118:5;;;;;;;;;;:::i;5696:713:4:-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;;;;;;5696:713:4;;;;;;;;;;;;;:::i;1500:49:1:-;;;:::i;3724:266:4:-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;3724:266:4;-1:-1:-1;;;;;3724:266:4;;:::i;3996:208::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;3996:208:4;-1:-1:-1;;;;;3996:208:4;;:::i;4806:653:2:-;;;;;;13:3:-1;8;5:12;2:2;;;30:1;27;20:12;2:2;-1:-1;4806:653:2;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;2540:108:4:-;;;:::i;20904:1350::-;21062:17;1585:10;-1:-1:-1;;;;;1567:39:4;1576:7;;-1:-1:-1;;;;;;1576:7:4;-1:-1:-1;;;;;1567:39:4;;1597:8;;1567:39;;;;;;;;;;;;;;;;;;;;;30:3:-1;22:6;14;1:33;99:1;81:16;;;74:27;1567:39:4;;137:4:-1;117:14;;;-1:-1;;113:30;157:16;;;1567:39:4;;;;-1:-1:-1;1567:39:4;;-1:-1:-1;;;;1567:39:4;1667:6;;;;;;;1666:7;1658:31;;;;;-1:-1:-1;;;1658:31:4;;;;;;;;;;;;-1:-1:-1;;;1658:31:4;;;;;;;;;;;;;;;1699:6;:13;;-1:-1:-1;;1699:13:4;;;;;21103:10;;1699:13;21103:10;21095:40;;;;;-1:-1:-1;;;21095:40:4;;;;;;;;;;;;-1:-1:-1;;;21095:40:4;;;;;;;;;;;;;;;-1:-1:-1;;;;;21153:18:4;;;;;;:8;:18;;;;;:24;;;21145:50;;;;;-1:-1:-1;;;21145:50:4;;;;;;;;;;;;-1:-1:-1;;;21145:50:4;;;;;;;;;;;;;;;-1:-1:-1;;;;;21236:18:4;;;;;;:8;:18;;;;;:26;;;;;21231:47;;766:6:1;1597:8;;1609:5;1596:18;21231:4:4;:47::i;:::-;21213:14;:65;;21205:95;;;;;-1:-1:-1;;;21205:95:4;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;21338:18:4;;21311:24;21338:18;;;:8;:18;;;;;21436:17;;;;21483:16;;;;;21529:12;;21571;;21657:8;;21382:309;;21436:17;21483:16;21529:12;21571;21613:14;;21382:24;:309::i;:::-;21367:324;-1:-1:-1;21710:17:4;21702:45;;;;;-1:-1:-1;;;21702:45:4;;;;;;;;;;;;-1:-1:-1;;;21702:45:4;;;;;;;;;;;;;;;21781:15;21765:12;:31;;21757:56;;;;;-1:-1:-1;;;21757:56:4;;;;;;;;;;;;-1:-1:-1;;;21757:56:4;;;;;;;;;;;;;;;21844:39;21849:9;:17;;;21868:14;21844:4;:39::i;:::-;21824:17;;;:59;21894:12;21909:28;21914:12;21894;21909:4;:28::i;:::-;21953:46;;;;;;;;21894:43;;-1:-1:-1;;;;;;21953:46:4;;;21962:10;;21953:46;;;;;;;;;;22010:40;22025:10;22037:12;22010:14;:40::i;:::-;22060:43;22075:27;22080:12;22094:7;22075:4;:27::i;:::-;22060:14;:43::i;:::-;22128:8;;22113:33;;22128:8;;;-1:-1:-1;;;;;22128:8:4;22138:7;22113:14;:33::i;:::-;22156:53;22172:8;22182:10;22194:14;22156:15;:53::i;:::-;-1:-1:-1;;1733:6:4;:14;;-1:-1:-1;;1733:14:4;;;20904:1350;;-1:-1:-1;;;20904:1350:4:o;2853:81:5:-;2922:5;2915:12;;;;;;;;-1:-1:-1;;2915:12:5;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2890:13;;2915:12;;2922:5;;2915:12;;2922:5;2915:12;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2853:81;:::o;3439:180::-;3524:10;3497:4;3513:22;;;:10;:22;;;;;;;;-1:-1:-1;;;;;3513:27:5;;;;;;;;;;;:33;;;3561:30;;;;;;;3497:4;;3513:27;;3524:10;;3561:30;;;;;;;;-1:-1:-1;3608:4:5;3439:180;;;;;:::o;1147:50:1:-;1188:9;1147:50;:::o;9827:481:4:-;1801:6;;9949:14;;1801:6;;;;;1800:7;1792:31;;;;;-1:-1:-1;;;1792:31:4;;;;;;;;;;;;-1:-1:-1;;;1792:31:4;;;;;;;;;;;;;;;-1:-1:-1;;;;;9987:17:4;;;;;;:8;:17;;;;;:23;;;9979:49;;;;;-1:-1:-1;;;9979:49:4;;;;;;;;;;;;-1:-1:-1;;;9979:49:4;;;;;;;;;;;;;;;-1:-1:-1;;;;;10046:18:4;;;;;;:8;:18;;;;;:24;;;10038:50;;;;;-1:-1:-1;;;10038:50:4;;;;;;;;;;;;-1:-1:-1;;;10038:50:4;;;;;;;;;;;;;;;-1:-1:-1;;;;;10124:17:4;;;10098:23;10124:17;;;:8;:17;;;;;;10178:18;;;;;;;10227:16;;;;;10245:15;;;;;10262:17;;;;10281:16;;;;10178:18;;10213:88;;10227:16;;10245:15;10281:16;10213:13;:88::i;:::-;10206:95;9827:481;-1:-1:-1;;;;;9827:481:4:o;9340:::-;1801:6;;9455:14;;1801:6;;;;;1800:7;1792:31;;;;;-1:-1:-1;;;1792:31:4;;;;;;;;;;;;-1:-1:-1;;;1792:31:4;;;;;;;;;;;;;;;-1:-1:-1;;;;;9493:17:4;;;;;;:8;:17;;;;;:23;;;9485:49;;;;;-1:-1:-1;;;9485:49:4;;;;;;;;;;;;-1:-1:-1;;;9485:49:4;;;;;;;;;;;;;;;-1:-1:-1;;;;;9552:18:4;;;;;;:8;:18;;;;;:24;;;9544:50;;;;;-1:-1:-1;;;9544:50:4;;;;;;;;;;;;-1:-1:-1;;;9544:50:4;;;;;;;;;;;;;;;-1:-1:-1;;;;;9630:17:4;;;9604:23;9630:17;;;:8;:17;;;;;;9684:18;;;;;;;9733:16;;;;;9751:15;;;;;9768:17;;;;9787:16;;;;9805:8;;9719:95;;9751:15;9768:17;9787:16;9719:13;:95::i;3347:86:5:-;3414:12;;3347:86;:::o;1439:54:1:-;1487:6;766;1480:13;;1439:54;:::o;1040:45::-;766:6;1040:45;:::o;4409:483:5:-;4485:4;4509:10;-1:-1:-1;;;;;4509:17:5;;;;:55;;-1:-1:-1;;;;;;4537:15:5;;;;;;:10;:15;;;;;;;;4553:10;4537:27;;;;;;;;4530:34;;;4509:55;4501:89;;;;;-1:-1:-1;;;4501:89:5;;;;;;;;;;;;;;;;;;;;;;;;;;;;4600:20;4606:3;4611;4616;4600:5;:20::i;:::-;4634:10;-1:-1:-1;;;;;4634:17:5;;;;;;:63;;-1:-1:-1;;;;;;4655:15:5;;;;;;:10;:15;;;;;;;;4671:10;4655:27;;;;;;;;-1:-1:-1;;4655:42:5;;4634:63;4630:235;;;-1:-1:-1;;;;;4748:15:5;;;;;;:10;:15;;;;;;;;4764:10;4748:27;;;;;;;;4743:38;;4777:3;4743:4;:38::i;:::-;-1:-1:-1;;;;;4713:15:5;;;;;;;:10;:15;;;;;;;;4729:10;4713:27;;;;;;;;;;:68;;;4800:54;;;;;;;;;;4729:10;;4800:54;;;;;;;;;;4630:235;-1:-1:-1;4881:4:5;4409:483;;;;;:::o;2766:118:4:-;-1:-1:-1;;;;;2860:11:4;2833:4;2860:11;;;:8;:11;;;;;:17;;;;2766:118::o;4338:131::-;1801:6;;4421:7;;1801:6;;;;;1800:7;1792:31;;;;;-1:-1:-1;;;1792:31:4;;;;;;;;;;;;-1:-1:-1;;;1792:31:4;;;;;;;;;;;;;;;-1:-1:-1;4451:11:4;;-1:-1:-1;;;;;4451:11:4;4338:131;:::o;3031:80:5:-;3095:9;;;;3031:80;:::o;4475:341:4:-;1585:10;-1:-1:-1;;;;;1567:39:4;1576:7;;-1:-1:-1;;;;;;1576:7:4;-1:-1:-1;;;;;1567:39:4;;1597:8;;1567:39;;;;;;;;;;;;;;;;;;;;;30:3:-1;22:6;14;1:33;99:1;81:16;;;74:27;1567:39:4;;137:4:-1;117:14;;;-1:-1;;113:30;157:16;;;1567:39:4;;;;-1:-1:-1;1567:39:4;;-1:-1:-1;;;;1567:39:4;1667:6;;;;;;;1666:7;1658:31;;;;;-1:-1:-1;;;1658:31:4;;;;;;;;;;;;-1:-1:-1;;;1658:31:4;;;;;;;;;;;;;;;1699:6;:13;;-1:-1:-1;;1699:13:4;;;;;4580:10;;1699:13;4580:10;4579:11;4571:40;;;;;-1:-1:-1;;;4571:40:4;;;;;;;;;;;;-1:-1:-1;;;4571:40:4;;;;;;;;;;;;;;;4643:11;;-1:-1:-1;;;;;4643:11:4;4629:10;:25;4621:56;;;;;-1:-1:-1;;;4621:56:4;;;;;;;;;;;;-1:-1:-1;;;4621:56:4;;;;;;;;;;;;;;;917:12:1;4695:18:4;;;4687:42;;;;;-1:-1:-1;;;4687:42:4;;;;;;;;;;;;;;;;;;;;;;;;;;;;976:9:1;4747:18:4;;;4739:42;;;;;-1:-1:-1;;;4739:42:4;;;;;;;;;;;;;;;;;;;;;;;;;;;;4791:8;:18;1733:6;:14;;-1:-1:-1;;1733:14:4;;;4475:341::o;6415:1603::-;1585:10;-1:-1:-1;;;;;1567:39:4;1576:7;;-1:-1:-1;;;;;;1576:7:4;-1:-1:-1;;;;;1567:39:4;;1597:8;;1567:39;;;;;;;;;;;;;;;;;;;;;30:3:-1;22:6;14;1:33;99:1;81:16;;;74:27;1567:39:4;;137:4:-1;117:14;;;-1:-1;;113:30;157:16;;;1567:39:4;;;;-1:-1:-1;1567:39:4;;-1:-1:-1;;;;1567:39:4;1667:6;;;;;;;1666:7;1658:31;;;;;-1:-1:-1;;;1658:31:4;;;;;;;;;;;;-1:-1:-1;;;1658:31:4;;;;;;;;;;;;;;;1699:6;:13;;-1:-1:-1;;1699:13:4;;;;;6555:11;;6541:10;-1:-1:-1;;;;;6555:11:4;;;6541:25;6533:56;;;;;-1:-1:-1;;;6533:56:4;;;;;;;;;;;;-1:-1:-1;;;6533:56:4;;;;;;;;;;;;;;;-1:-1:-1;;;;;6607:15:4;;;;;;:8;:15;;;;;:21;;;6599:47;;;;;-1:-1:-1;;;6599:47:4;;;;;;;;;;;;-1:-1:-1;;;6599:47:4;;;;;;;;;;;;;;;6665:10;;;;6664:11;6656:40;;;;;-1:-1:-1;;;6656:40:4;;;;;;;;;;;;-1:-1:-1;;;6656:40:4;;;;;;;;;;;;;;;766:6:1;6715::4;:20;;6707:47;;;;;-1:-1:-1;;;6707:47:4;;;;;;;;;;;;;;;;;;;;;;;;;;;;1132:9:1;6772:20:4;;;6764:47;;;;;-1:-1:-1;;;6764:47:4;;;;;;;;;;;;;;;;;;;;;;;;;;;;1244:13:1;6829:22:4;;;6821:50;;;;;-1:-1:-1;;;6821:50:4;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;6944:15:4;;6927:14;6944:15;;;:8;:15;;;;;:22;;;6980:18;;;6976:299;;;7029:43;7034:12;;7048:23;7053:6;7061:9;7048:4;:23::i;:::-;7029:4;:43::i;:::-;7014:12;:58;;;1188:9:1;-1:-1:-1;7094:32:4;7086:65;;;;;-1:-1:-1;;;7086:65:4;;;;;;;;;;;;;;;;;;;;;;;;;;;;6976:299;;;7181:9;7172:6;:18;7168:107;;;7221:43;7226:12;;7240:23;7245:9;7256:6;7240:4;:23::i;:::-;7221:4;:43::i;:::-;7206:12;:58;7168:107;-1:-1:-1;;;;;7292:15:4;;;;;;:8;:15;;;;;:22;;;:31;;;7414:23;;;;7447:33;;;;7494:20;;;7490:522;;;7530:61;7546:5;7553:10;7565:25;7570:7;7579:10;7565:4;:25::i;:::-;7530:15;:61::i;:::-;7490:522;;;7622:10;7612:7;:20;7608:404;;;7725:26;7754:25;7759:10;7771:7;7754:4;:25::i;:::-;7725:54;;7793:17;7813:37;7818:21;1032:1:1;7813:4:4;:37::i;:::-;7793:57;;7864:77;7880:5;7887:10;7899:41;7904:21;7927:12;7899:4;:41::i;:::-;7864:15;:77::i;:::-;7978:8;;7955:46;;7971:5;;7978:8;;;-1:-1:-1;;;;;7978:8:4;7988:12;7955:15;:46::i;:::-;7608:404;;;-1:-1:-1;;1733:6:4;:14;;-1:-1:-1;;1733:14:4;;;-1:-1:-1;;;6415:1603:4:o;19606:1292::-;19756:19;1585:10;-1:-1:-1;;;;;1567:39:4;1576:7;;-1:-1:-1;;;;;;1576:7:4;-1:-1:-1;;;;;1567:39:4;;1597:8;;1567:39;;;;;;;;;;;;;;;;;;;;;30:3:-1;22:6;14;1:33;99:1;81:16;;;74:27;1567:39:4;;137:4:-1;117:14;;;-1:-1;;113:30;157:16;;;1567:39:4;;;;-1:-1:-1;1567:39:4;;-1:-1:-1;;;;1567:39:4;1667:6;;;;;;;1666:7;1658:31;;;;;-1:-1:-1;;;1658:31:4;;;;;;;;;;;;-1:-1:-1;;;1658:31:4;;;;;;;;;;;;;;;1699:6;:13;;-1:-1:-1;;1699:13:4;;;;;19799:10;;1699:13;19799:10;19791:40;;;;;-1:-1:-1;;;19791:40:4;;;;;;;;;;;;-1:-1:-1;;;19791:40:4;;;;;;;;;;;;;;;-1:-1:-1;;;;;19849:18:4;;;;;;:8;:18;;;;;:24;;;19841:50;;;;;-1:-1:-1;;;19841:50:4;;;;;;;;;;;;-1:-1:-1;;;19841:50:4;;;;;;;;;;;;;;;-1:-1:-1;;;;;19929:18:4;;19902:24;19929:18;;;:8;:18;;;;;20029:17;;;;20076:16;;;;;20122:12;;20164;;20248:8;;19975:307;;20029:17;20076:16;20122:12;20164;20206;;19975:24;:307::i;:::-;19958:324;;20319:12;20301:14;:30;;20293:56;;;;;-1:-1:-1;;;20293:56:4;;;;;;;;;;;;-1:-1:-1;;;20293:56:4;;;;;;;;;;;;;;;-1:-1:-1;;;;;20399:18:4;;;;;;:8;:18;;;;;:26;;;;;20394:47;;766:6:1;1597:8;;20394:47:4;20376:14;:65;;20368:95;;;;;-1:-1:-1;;;20368:95:4;;;;;;;;;;;;;;;;;;;;;;;;;;;;20494:39;20499:9;:17;;;20518:14;20494:4;:39::i;:::-;20474:17;;;:59;20544:12;20559:28;20564:12;20544;20559:4;:28::i;:::-;20603:46;;;;;;;;20544:43;;-1:-1:-1;;;;;;20603:46:4;;;20612:10;;20603:46;;;;;;;;;;20660:40;20675:10;20687:12;20660:14;:40::i;:::-;20710:43;20725:27;20730:12;20744:7;20725:4;:27::i;20710:43::-;20778:8;;20763:33;;20778:8;;;-1:-1:-1;;;;;20778:8:4;20788:7;20763:14;:33::i;:::-;20806:53;20822:8;20832:10;20844:14;20806:15;:53::i;5023:242::-;1585:10;-1:-1:-1;;;;;1567:39:4;1576:7;;-1:-1:-1;;;;;;1576:7:4;-1:-1:-1;;;;;1567:39:4;;1597:8;;1567:39;;;;;;;;;;;;;;;;;;;;;30:3:-1;22:6;14;1:33;99:1;81:16;;;74:27;1567:39:4;;137:4:-1;117:14;;;-1:-1;;113:30;157:16;;;1567:39:4;;;;-1:-1:-1;1567:39:4;;-1:-1:-1;;;;1567:39:4;1667:6;;;;;;;1666:7;1658:31;;;;;-1:-1:-1;;;1658:31:4;;;;;;;;;;;;-1:-1:-1;;;1658:31:4;;;;;;;;;;;;;;;1699:6;:13;;-1:-1:-1;;1699:13:4;;;;;5130:10;;1699:13;5130:10;5129:11;5121:40;;;;;-1:-1:-1;;;5121:40:4;;;;;;;;;;;;-1:-1:-1;;;5121:40:4;;;;;;;;;;;;;;;5193:11;;-1:-1:-1;;;;;5193:11:4;5179:10;:25;5171:56;;;;;-1:-1:-1;;;5171:56:4;;;;;;;;;;;;-1:-1:-1;;;5171:56:4;;;;;;;;;;;;;;;5237:11;:21;;;;;-1:-1:-1;;;5237:21:4;;;;;;;;;;;1733:6;:14;;-1:-1:-1;;1733:14:4;;;5023:242::o;5271:418::-;1585:10;-1:-1:-1;;;;;1567:39:4;1576:7;;-1:-1:-1;;;;;;1576:7:4;-1:-1:-1;;;;;1567:39:4;;1597:8;;1567:39;;;;;;;;;;;;;;;;;;;;;30:3:-1;22:6;14;1:33;99:1;81:16;;;74:27;1567:39:4;;137:4:-1;117:14;;;-1:-1;;113:30;157:16;;;1567:39:4;;;;-1:-1:-1;1567:39:4;;-1:-1:-1;;;;1567:39:4;1667:6;;;;;;;1666:7;1658:31;;;;;-1:-1:-1;;;1658:31:4;;;;;;;;;;;;-1:-1:-1;;;1658:31:4;;;;;;;;;;;;;;;1699:6;:13;;-1:-1:-1;;1699:13:4;;;;;5374:11;;5360:10;-1:-1:-1;;;;;5374:11:4;;;5360:25;5352:56;;;;;-1:-1:-1;;;5352:56:4;;;;;;;;;;;;-1:-1:-1;;;5352:56:4;;;;;;;;;;;;;;;5427:10;;;;5426:11;5418:40;;;;;-1:-1:-1;;;5418:40:4;;;;;;;;;;;;-1:-1:-1;;;5418:40:4;;;;;;;;;;;;;;;5476:7;:14;820:1:1;-1:-1:-1;5476:34:4;5468:61;;;;;-1:-1:-1;;;5468:61:4;;;;;;;;;;;;;;;;;;;;;;;;;;;;5540:10;:17;;-1:-1:-1;;5540:17:4;5553:4;5540:17;;;5567:11;:18;;;;-1:-1:-1;;;5567:18:4;;;5596:32;1305:10:1;5596:14:4;:32::i;:::-;5638:44;5653:10;1305::1;5638:14:4;:44::i;:::-;1733:6;:14;;-1:-1:-1;;1733:14:4;;;5271:418::o;10314:925::-;1585:10;-1:-1:-1;;;;;1567:39:4;1576:7;;-1:-1:-1;;;;;;1576:7:4;-1:-1:-1;;;;;1567:39:4;;1597:8;;1567:39;;;;;;;;;;;;;;;;;;;;;30:3:-1;22:6;14;1:33;99:1;81:16;;;74:27;1567:39:4;;137:4:-1;117:14;;;-1:-1;;113:30;157:16;;;1567:39:4;;;;-1:-1:-1;1567:39:4;;-1:-1:-1;;;;1567:39:4;1667:6;;;;;;;1666:7;1658:31;;;;;-1:-1:-1;;;1658:31:4;;;;;;;;;;;;-1:-1:-1;;;1658:31:4;;;;;;;;;;;;;;;1699:6;:13;;-1:-1:-1;;1699:13:4;;;;;10451:10;;1699:13;10451:10;10443:40;;;;;-1:-1:-1;;;10443:40:4;;;;;;;;;;;;-1:-1:-1;;;10443:40:4;;;;;;;;;;;;;;;10494:14;10511:13;:11;:13::i;:::-;10494:30;;10534:10;10547:30;10552:13;10567:9;10547:4;:30::i;:::-;10534:43;-1:-1:-1;10595:10:4;10587:38;;;;;-1:-1:-1;;;10587:38:4;;;;;;;;;;;;-1:-1:-1;;;10587:38:4;;;;;;;;;;;;;;;10641:6;10636:507;10657:7;:14;10653:18;;10636:507;;;10692:9;10704:7;10712:1;10704:10;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;10704:10:4;10739:11;;;:8;:11;;;;;;:19;;;10704:10;;-1:-1:-1;10739:19:4;10793:16;10798:5;10739:19;10793:4;:16::i;:::-;10772:37;-1:-1:-1;10831:18:4;10823:46;;;;;-1:-1:-1;;;10823:46:4;;;;;;;;;;;;-1:-1:-1;;;10823:46:4;;;;;;;;;;;;;;;10908:12;;10921:1;10908:15;;;;;;;;;;;;;10891:13;:32;;10883:57;;;;;-1:-1:-1;;;10883:57:4;;;;;;;;;;;;-1:-1:-1;;;10883:57:4;;;;;;;;;;;;;;;-1:-1:-1;;;;;10981:11:4;;;;;;:8;:11;;;;;:19;;;10976:40;;11002:13;10976:4;:40::i;:::-;-1:-1:-1;;;;;10954:11:4;;;;;;:8;:11;;;;;;;;;:19;;:62;;;;11035:38;;;;;;;10954:11;;11044:10;;11035:38;;;;;;;;;;11087:45;11103:1;11106:10;11118:13;11087:15;:45::i;:::-;-1:-1:-1;;;10673:3:4;;10636:507;;;;11152:29;11167:13;11152:14;:29::i;:::-;11191:41;11206:10;11218:13;11191:14;:41::i;8611:1167:2:-;8846:18;8880:21;8904:32;8909:13;8924:11;8904:4;:32::i;:::-;8880:56;;8946:18;8967:31;8972:10;8984:13;8967:4;:31::i;:::-;8946:52;;9008:14;9025:31;9030:13;9045:10;9025:4;:31::i;:::-;9008:48;;9131:8;9142:28;766:6:1;9153:16:2;9142:4;:28::i;:::-;9131:39;;9181:17;9201:20;9206:9;9217:3;9201:4;:20::i;:::-;9181:40;;9231:22;9256:34;9261:12;9275:14;9256:4;:34::i;:::-;9231:59;;9300:26;9329:39;9334:17;9353:14;9329:4;:39::i;:::-;9300:68;;9617:8;9628:43;9633:28;766:6:1;9644:16:2;9633:4;:28::i;:::-;9663:7;9628:4;:43::i;:::-;9617:54;;9697:44;9702:21;9725:15;766:6:1;9736:3:2;9725:4;:15::i;:::-;9697:4;:44::i;:::-;9681:60;8611:1167;-1:-1:-1;;;;;;;;;;;;;;;8611:1167:2:o;17204:1173:4:-;17360:18;1585:10;-1:-1:-1;;;;;1567:39:4;1576:7;;-1:-1:-1;;;;;;1576:7:4;-1:-1:-1;;;;;1567:39:4;;1597:8;;1567:39;;;;;;;;;;;;;;;;;;;;;30:3:-1;22:6;14;1:33;99:1;81:16;;;74:27;1567:39:4;;137:4:-1;117:14;;;-1:-1;;113:30;157:16;;;1567:39:4;;;;-1:-1:-1;1567:39:4;;-1:-1:-1;;;;1567:39:4;1667:6;;;;;;;1666:7;1658:31;;;;;-1:-1:-1;;;1658:31:4;;;;;;;;;;;;-1:-1:-1;;;1658:31:4;;;;;;;;;;;;;;;1699:6;:13;;-1:-1:-1;;1699:13:4;;;;;17411:10;;1699:13;17411:10;17403:40;;;;;-1:-1:-1;;;17403:40:4;;;;;;;;;;;;-1:-1:-1;;;17403:40:4;;;;;;;;;;;;;;;-1:-1:-1;;;;;17461:17:4;;;;;;:8;:17;;;;;:23;;;17453:49;;;;;-1:-1:-1;;;17453:49:4;;;;;;;;;;;;-1:-1:-1;;;17453:49:4;;;;;;;;;;;;;;;-1:-1:-1;;;;;17542:17:4;;;;;;:8;:17;;;;;:25;;;17537:45;;1548:1:1;766:6;1541:8;;17537:4:4;:45::i;:::-;17520:13;:62;;17512:91;;;;;-1:-1:-1;;;17512:91:4;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;17640:17:4;;17614:23;17640:17;;;:8;:17;;;;;17738:16;;;;17784:15;;;;;17829:12;;17871;;17956:8;;17684:306;;17738:16;17784:15;17829:12;17871;17913:13;;17684:24;:306::i;:::-;17668:322;;18026:16;18009:13;:33;;18001:59;;;;;-1:-1:-1;;;18001:59:4;;;;;;;;;;;;-1:-1:-1;;;18001:59:4;;;;;;;;;;;;;;;18090:37;18095:8;:16;;;18113:13;18090:4;:37::i;:::-;18071:16;;;:56;18143:44;;;;;;;;-1:-1:-1;;;;;18143:44:4;;;18152:10;;18143:44;;;;;;;;;18198:29;18213:13;18198:14;:29::i;:::-;18237:41;18252:10;18264:13;18237:14;:41::i;:::-;18288:51;18304:7;18313:10;18325:13;18288:15;:51::i;:::-;-1:-1:-1;1733:6:4;:14;;-1:-1:-1;;1733:14:4;;;17204:1173;;-1:-1:-1;;;17204:1173:4:o;3879:388:5:-;3989:10;3946:4;3978:22;;;:10;:22;;;;;;;;-1:-1:-1;;;;;3978:27:5;;;;;;;;;;4019:14;;;4015:156;;;4060:10;4079:1;4049:22;;;:10;:22;;;;;;;;-1:-1:-1;;;;;4049:27:5;;;;;;;;;:31;4015:156;;;4141:19;4146:8;4156:3;4141:4;:19::i;:::-;4122:10;4111:22;;;;:10;:22;;;;;;;;-1:-1:-1;;;;;4111:27:5;;;;;;;;;:49;4015:156;4194:10;4211:22;;;;:10;:22;;;;;;;;-1:-1:-1;;;;;4185:54:5;;4211:27;;;;;;;;;;;4185:54;;;;;;;;;4194:10;4185:54;;;;;;;;;;;-1:-1:-1;4256:4:5;;3879:388;-1:-1:-1;;;3879:388:5:o;18383:1217:4:-;18533:18;1585:10;-1:-1:-1;;;;;1567:39:4;1576:7;;-1:-1:-1;;;;;;1576:7:4;-1:-1:-1;;;;;1567:39:4;;1597:8;;1567:39;;;;;;;;;;;;;;;;;;;;;30:3:-1;22:6;14;1:33;99:1;81:16;;;74:27;1567:39:4;;137:4:-1;117:14;;;-1:-1;;113:30;157:16;;;1567:39:4;;;;-1:-1:-1;1567:39:4;;-1:-1:-1;;;;1567:39:4;1667:6;;;;;;;1666:7;1658:31;;;;;-1:-1:-1;;;1658:31:4;;;;;;;;;;;;-1:-1:-1;;;1658:31:4;;;;;;;;;;;;;;;1699:6;:13;;-1:-1:-1;;1699:13:4;;;;;18575:10;;1699:13;18575:10;18567:40;;;;;-1:-1:-1;;;18567:40:4;;;;;;;;;;;;-1:-1:-1;;;18567:40:4;;;;;;;;;;;;;;;-1:-1:-1;;;;;18625:17:4;;;;;;:8;:17;;;;;:23;;;18617:49;;;;;-1:-1:-1;;;18617:49:4;;;;;;;;;;;;-1:-1:-1;;;18617:49:4;;;;;;;;;;;;;;;-1:-1:-1;;;;;18703:17:4;;18677:23;18703:17;;;:8;:17;;;;;18801:16;;;;18847:15;;;;;18892:12;;18934;;19019:8;;18747:306;;18801:16;18847:15;18892:12;18934;18976:13;;18747:24;:306::i;:::-;18731:322;-1:-1:-1;19072:18:4;19064:46;;;;;-1:-1:-1;;;19064:46:4;;;;;;;;;;;;-1:-1:-1;;;19064:46:4;;;;;;;;;;;;;;;19145:11;19128:13;:28;;19120:53;;;;;-1:-1:-1;;;19120:53:4;;;;;;;;;;;;-1:-1:-1;;;19120:53:4;;;;;;;;;;;;;;;-1:-1:-1;;;;;19222:17:4;;;;;;:8;:17;;;;;:25;;;19217:45;;1548:1:1;766:6;1541:8;;19217:45:4;19200:13;:62;;19192:91;;;;;-1:-1:-1;;;19192:91:4;;;;;;;;;;;;;;;;;;;;;;;;;;;;19313:37;19318:8;:16;;;19336:13;19313:4;:37::i;:::-;19294:16;;;:56;19366:44;;;;;;;;-1:-1:-1;;;;;19366:44:4;;;19375:10;;19366:44;;;;;;;;;19421:29;19436:13;19421:14;:29::i;:::-;19460:41;19475:10;19487:13;19460:14;:41::i;:::-;19511:51;19527:7;19536:10;19548:13;19511:15;:51::i;3241:100:5:-;-1:-1:-1;;;;;3320:14:5;3297:4;3320:14;;;;;;;;;;;;3241:100::o;876:53:1:-;924:5;766:6;917:12;;14777:2420:4;1567:39;;;;;;;1597:8;1567:39;;;;;;15005:18;;;;1585:10;;-1:-1:-1;;;;;;1576:7:4;;;;15005:18;;1567:39;;;;;15005:18;1597:8;;15005:18;1567:39;1:33:-1;99:1;81:16;;;74:27;1567:39:4;;137:4:-1;117:14;;;-1:-1;;113:30;157:16;;;1567:39:4;;;;-1:-1:-1;1567:39:4;;-1:-1:-1;;;;1567:39:4;1667:6;;;;;;;1666:7;1658:31;;;;;-1:-1:-1;;;1658:31:4;;;;;;;;;;;;-1:-1:-1;;;1658:31:4;;;;;;;;;;;;;;;1699:6;:13;;-1:-1:-1;;1699:13:4;;;;;-1:-1:-1;;;;;15068:17:4;;1699:13;15068:17;;;:8;:17;;;;;:23;1699:13;15068:23;15060:49;;;;;-1:-1:-1;;;15060:49:4;;;;;;;;;;;;-1:-1:-1;;;15060:49:4;;;;;;;;;;;;;;;-1:-1:-1;;;;;15127:18:4;;;;;;:8;:18;;;;;:24;;;15119:50;;;;;-1:-1:-1;;;15119:50:4;;;;;;;;;;;;-1:-1:-1;;;15119:50:4;;;;;;;;;;;;;;;15187:11;;-1:-1:-1;;;15187:11:4;;;;15179:43;;;;;-1:-1:-1;;;15179:43:4;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;15259:26:4;;;15233:23;15259:26;;;:8;:26;;;;;;15322:27;;;;;;;15391:17;;;;;15386:38;;766:6:1;1597:8;;15386:38:4;15368:14;:56;;15360:86;;;;;-1:-1:-1;;;15360:86:4;;;;;;;;;;;;;;;;;;;;;;;;;;;;15457:20;15480:309;15531:8;:16;;;15585:8;:15;;;15638:9;:17;;;15693:9;:16;;;15747:8;;15480:13;:309::i;:::-;15457:332;;15826:8;15807:15;:27;;15799:59;;;;;-1:-1:-1;;;15799:59:4;;;;;;;;;;;;;;;;;;;;;;;;;;;;15885:306;15929:8;:16;;;15975:8;:15;;;16020:9;:17;;;16067:9;:16;;;16113:14;16157:8;;15885:14;:306::i;:::-;15869:322;;16226:11;16209:13;:28;;16201:53;;;;;-1:-1:-1;;;16201:53:4;;;;;;;;;;;;-1:-1:-1;;;16201:53:4;;;;;;;;;;;;;;;16284:37;16289:8;:16;;;16307:13;16284:4;:37::i;:::-;16265:8;:16;;:56;;;;16351:39;16356:9;:17;;;16375:14;16351:4;:39::i;:::-;16331:17;;;;:59;;;16465:16;;;16515:15;;;;;16615:16;;;;16665:8;;16418:285;;16331:59;16615:16;16418:13;:285::i;:::-;16401:302;;16739:15;16721:14;:33;;16713:61;;;;;-1:-1:-1;;;16713:61:4;;;;;;;;;;;;-1:-1:-1;;;16713:61:4;;;;;;;;;;;;;;;16810:8;16792:14;:26;;16784:54;;;;;-1:-1:-1;;;16784:54:4;;;;;;;;;;;;;;;;;;;;;;;;;;;;16875:35;16880:13;16895:14;16875:4;:35::i;:::-;16856:15;:54;;16848:82;;;;;-1:-1:-1;;;16848:82:4;;;;;;;;;;;;-1:-1:-1;;;16848:82:4;;;;;;;;;;;;;;;16976:8;-1:-1:-1;;;;;16946:70:4;16967:7;-1:-1:-1;;;;;16946:70:4;16955:10;-1:-1:-1;;;;;16946:70:4;;16986:13;17001:14;16946:70;;;;;;;;;;;;;;;;;;;;;;;;17027:51;17043:7;17052:10;17064:13;17027:15;:51::i;:::-;17088:53;17104:8;17114:10;17126:14;17088:15;:53::i;:::-;-1:-1:-1;;;1733:6:4;:14;;-1:-1:-1;;1733:14:4;;;14777:2420;;;;-1:-1:-1;14777:2420:4;-1:-1:-1;;;;14777:2420:4:o;12346:2425::-;1567:39;;;;;;;1597:8;1567:39;;;;;;12572:19;;;;1585:10;;-1:-1:-1;;;;;;1576:7:4;;;;12572:19;;1567:39;;;;;12572:19;1597:8;;12572:19;1567:39;1:33:-1;99:1;81:16;;;74:27;1567:39:4;;137:4:-1;117:14;;;-1:-1;;113:30;157:16;;;1567:39:4;;;;-1:-1:-1;1567:39:4;;-1:-1:-1;;;;1567:39:4;1667:6;;;;;;;1666:7;1658:31;;;;;-1:-1:-1;;;1658:31:4;;;;;;;;;;;;-1:-1:-1;;;1658:31:4;;;;;;;;;;;;;;;1699:6;:13;;-1:-1:-1;;1699:13:4;;;;;-1:-1:-1;;;;;12637:17:4;;1699:13;12637:17;;;:8;:17;;;;;:23;1699:13;12637:23;12629:49;;;;;-1:-1:-1;;;12629:49:4;;;;;;;;;;;;-1:-1:-1;;;12629:49:4;;;;;;;;;;;;;;;-1:-1:-1;;;;;12696:18:4;;;;;;:8;:18;;;;;:24;;;12688:50;;;;;-1:-1:-1;;;12688:50:4;;;;;;;;;;;;-1:-1:-1;;;12688:50:4;;;;;;;;;;;;;;;12756:11;;-1:-1:-1;;;12756:11:4;;;;12748:43;;;;;-1:-1:-1;;;12748:43:4;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;12828:26:4;;;12802:23;12828:26;;;:8;:26;;;;;;12891:27;;;;;;;12959:16;;;;12954:36;;1548:1:1;766:6;1541:8;;12954:36:4;12937:13;:53;;12929:82;;;;;-1:-1:-1;;;12929:82:4;;;;;;;;;;;;;;;;;;;;;;;;;;;;13022:20;13045:309;13096:8;:16;;;13150:8;:15;;;13203:9;:17;;;13258:9;:16;;;13312:8;;13045:13;:309::i;:::-;13022:332;;13391:8;13372:15;:27;;13364:59;;;;;-1:-1:-1;;;13364:59:4;;;;;;;;;;;;;;;;;;;;;;;;;;;;13451:305;13495:8;:16;;;13541:8;:15;;;13586:9;:17;;;13633:9;:16;;;13679:13;13722:8;;13451:14;:305::i;:::-;13434:322;;13792:12;13774:14;:30;;13766:56;;;;;-1:-1:-1;;;13766:56:4;;;;;;;;;;;;-1:-1:-1;;;13766:56:4;;;;;;;;;;;;;;;13852:37;13857:8;:16;;;13875:13;13852:4;:37::i;:::-;13833:8;:16;;:56;;;;13919:39;13924:9;:17;;;13943:14;13919:4;:39::i;:::-;13899:17;;;;:59;;;14033:16;;;14083:15;;;;;14183:16;;;;14233:8;;13986:285;;13899:59;14183:16;13986:13;:285::i;:::-;13969:302;;14307:15;14289:14;:33;;14281:61;;;;;-1:-1:-1;;;14281:61:4;;;;;;;;;;;;-1:-1:-1;;;14281:61:4;;;;;;;;;;;;;;;14383:8;14365:14;:26;;14357:54;;;;;-1:-1:-1;;;14357:54:4;;;;;;;;;;;;;;;;;;;;;;;;;;;;14448:35;14453:13;14468:14;14448:4;:35::i;:::-;14429:15;:54;;14421:82;;;;;-1:-1:-1;;;14421:82:4;;;;;;;;;;;;-1:-1:-1;;;14421:82:4;;;;;;;;;;;;;;;14549:8;-1:-1:-1;;;;;14519:70:4;14540:7;-1:-1:-1;;;;;14519:70:4;14528:10;-1:-1:-1;;;;;14519:70:4;;14559:13;14574:14;14519:70;;;;;;;;;;;;;;;;;;;;;;;;14600:51;14616:7;14625:10;14637:13;14600:15;:51::i;:::-;14661:53;14677:8;14687:10;14699:14;14661:15;:53::i;13224:1254:2:-;13462:17;13549:21;13573:33;13578:14;13594:11;13573:4;:33::i;:::-;13549:57;;13687:8;13698:28;766:6:1;13709:16:2;13698:4;:28::i;:::-;13687:39;;13736:8;13747:18;13752:3;13757:7;13747:4;:18::i;:::-;13736:29;;13776:32;13811:37;13816:14;13832:15;766:6:1;13843:3:2;13832:4;:15::i;13811:37::-;13776:72;;13859:23;13885:50;13890:15;13907:27;13885:4;:50::i;:::-;13859:76;;13945:18;13966:41;13971:18;13991:15;13966:4;:41::i;:::-;13945:62;;14084:14;14101:37;14106:13;14121:16;14101:4;:37::i;:::-;14084:54;;14148:18;14169:27;14174:9;14185:10;14169:4;:27::i;:::-;14148:48;;14206:29;14238:31;14243:10;14255:13;14238:4;:31::i;:::-;14206:63;;14390:52;14395:24;14421:20;766:6:1;1032:1;14421:4:2;:20::i;14390:52::-;14375:67;-1:-1:-1;;;;;;;;;;13224:1254:2;;;;;;;;:::o;6465:1140::-;6700:18;6978:21;7002:32;7007:13;7022:11;7002:4;:32::i;:::-;6978:56;;7044:8;7055:43;7060:28;766:6:1;7071:16:2;7060:4;:28::i;:::-;7090:7;7055:4;:43::i;:::-;7044:54;;7109:26;7138:36;7143:13;7158:15;766:6:1;7169:3:2;7158:4;:15::i;:::-;7138:4;:36::i;:::-;7109:65;;7185:22;7210:43;7215:14;7231:21;7210:4;:43::i;:::-;7185:68;;7263:17;7283:39;7288:17;7307:14;7283:4;:39::i;:::-;7263:59;;7400:14;7417:36;7422:12;7436:16;7417:4;:36::i;:::-;7400:53;;7463:18;7484:27;7489:9;7500:10;7484:4;:27::i;:::-;7463:48;;7537:31;7542:13;7557:10;7537:4;:31::i;:::-;7521:47;6465:1140;-1:-1:-1;;;;;;;;;;;;;;6465:1140:2:o;1203:54:1:-;1251:6;766;1244:13;;10884:1234:2;11120:19;11155:21;11179:33;11184:14;11200:11;11179:4;:33::i;:::-;11155:57;;11317:29;11349:40;11354:12;11368:20;766:6:1;1032:1;11368:4:2;:20::i;11349:40::-;11317:72;;11399:18;11420:42;11425:10;11437:24;11420:4;:42::i;:::-;11399:63;;11472:14;11489:31;11494:13;11509:10;11489:4;:31::i;:::-;11472:48;;11590:18;11611:45;11616:9;11627:28;766:6:1;11638:16:2;11627:4;:28::i;:::-;11611:4;:45::i;:::-;11590:66;;11666:23;11692:36;11697:13;11712:15;11692:4;:36::i;:::-;11666:62;;11739:32;11774:41;11779:15;11796:18;11774:4;:41::i;:::-;11739:76;;11948:8;11959:43;11964:28;766:6:1;11975:16:2;11964:4;:28::i;11959:43::-;11948:54;;12030:50;12035:27;12064:15;766:6:1;12075:3:2;12064:4;:15::i;9116:218:4:-;1585:10;-1:-1:-1;;;;;1567:39:4;1576:7;;-1:-1:-1;;;;;;1576:7:4;-1:-1:-1;;;;;1567:39:4;;1597:8;;1567:39;;;;;;;;;;;;;;;;;;;;;30:3:-1;22:6;14;1:33;99:1;81:16;;;74:27;1567:39:4;;137:4:-1;117:14;;;-1:-1;;113:30;157:16;;;1567:39:4;;;;-1:-1:-1;1567:39:4;;-1:-1:-1;;;;1567:39:4;1667:6;;;;;;;1666:7;1658:31;;;;;-1:-1:-1;;;1658:31:4;;;;;;;;;;;;-1:-1:-1;;;1658:31:4;;;;;;;;;;;;;;;1699:6;:13;;-1:-1:-1;;1699:13:4;;;;;-1:-1:-1;;;;;9214:15:4;;1699:13;9214:15;;;:8;:15;;;;;:21;1699:13;9214:21;9206:47;;;;;-1:-1:-1;;;9206:47:4;;;;;;;;;;;;-1:-1:-1;;;9206:47:4;;;;;;;;;;;;;;;9289:38;;;;;;9321:4;9289:38;;;;;;-1:-1:-1;;;;;9289:23:4;;;;;:38;;;;;;;;;;;;;;:23;:38;;;5:2:-1;;;;30:1;27;20:12;5:2;9289:38:4;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;9289:38:4;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;9289:38:4;-1:-1:-1;;;;;9263:15:4;;;;;;;:8;9289:38;9263:15;;;;:23;;:64;1733:6;:14;;-1:-1:-1;;1733:14:4;;;9116:218::o;2654:106::-;2743:10;;;;2654:106;:::o;4822:195::-;1585:10;-1:-1:-1;;;;;1567:39:4;1576:7;;-1:-1:-1;;;;;;1576:7:4;-1:-1:-1;;;;;1567:39:4;;1597:8;;1567:39;;;;;;;;;;;;;;;;;;;;;30:3:-1;22:6;14;1:33;99:1;81:16;;;74:27;1567:39:4;;137:4:-1;117:14;;;-1:-1;;113:30;157:16;;;1567:39:4;;;;-1:-1:-1;1567:39:4;;-1:-1:-1;;;;1567:39:4;1667:6;;;;;;;1666:7;1658:31;;;;;-1:-1:-1;;;1658:31:4;;;;;;;;;;;;-1:-1:-1;;;1658:31:4;;;;;;;;;;;;;;;1699:6;:13;;-1:-1:-1;;1699:13:4;;;;;4945:11;;4931:10;-1:-1:-1;;;;;4945:11:4;;;4931:25;4923:56;;;;;-1:-1:-1;;;4923:56:4;;;;;;;;;;;;-1:-1:-1;;;4923:56:4;;;;;;;;;;;;;;;4989:11;:21;;-1:-1:-1;;4989:21:4;-1:-1:-1;;;;;4989:21:4;;;;;;;;;;1733:6;:14;;-1:-1:-1;;1733:14:4;;;4822:195::o;3576:142::-;1801:6;;3672:4;;1801:6;;;;;1800:7;1792:31;;;;;-1:-1:-1;;;1792:31:4;;;;;;;;;;;;-1:-1:-1;;;1792:31:4;;;;;;;;;;;;;;;-1:-1:-1;3699:12:4;;3576:142;:::o;1264:51:1:-;1305:10;1264:51;:::o;3352:218:4:-;1801:6;;3456:4;;1801:6;;;;;1800:7;1792:31;;;;;-1:-1:-1;;;1792:31:4;;;;;;;;;;;;-1:-1:-1;;;1792:31:4;;;;;;;;;;;;;;;-1:-1:-1;;;;;3485:15:4;;;;;;:8;:15;;;;;:21;;;3477:47;;;;;-1:-1:-1;;;3477:47:4;;;;;;;;;;;;-1:-1:-1;;;3477:47:4;;;;;;;;;;;;;;;-1:-1:-1;;;;;;3541:15:4;;;;;:8;:15;;;;;:22;;;;3352:218::o;2940:85:5:-;3011:7;3004:14;;;;;;;;-1:-1:-1;;3004:14:5;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2979:13;;3004:14;;3011:7;;3004:14;;3011:7;3004:14;;;;;;;;;;;;;;;;;;;;;;;;1555:59:1;1596:18;1555:59;:::o;795:117:0:-;884:17;795:117;:::o;1636:494:2:-;1840:14;1870:10;1883:35;1888:14;1904:13;1883:4;:35::i;:::-;1870:48;;1928:10;1941:37;1946:15;1963:14;1941:4;:37::i;:::-;1928:50;;1988:10;2001:18;2006:5;2013;2001:4;:18::i;:::-;1988:31;;2029:10;2042:31;766:6:1;2053:19:2;766:6:1;2064:7:2;2053:4;:19::i;2042:31::-;2029:44;;2104:18;2109:5;2116;2104:4;:18::i;:::-;2092:30;1636:494;-1:-1:-1;;;;;;;;;;1636:494:2:o;4273:130:5:-;4332:4;4348:27;4354:10;4366:3;4371;4348:5;:27::i;:::-;-1:-1:-1;4392:4:5;4273:130;;;;:::o;11245:1094:4:-;1585:10;-1:-1:-1;;;;;1567:39:4;1576:7;;-1:-1:-1;;;;;;1576:7:4;-1:-1:-1;;;;;1567:39:4;;1597:8;;1567:39;;;;;;;;;;;;;;;;;;;;;30:3:-1;22:6;14;1:33;99:1;81:16;;;74:27;1567:39:4;;137:4:-1;117:14;;;-1:-1;;113:30;157:16;;;1567:39:4;;;;-1:-1:-1;1567:39:4;;-1:-1:-1;;;;1567:39:4;1667:6;;;;;;;1666:7;1658:31;;;;;-1:-1:-1;;;1658:31:4;;;;;;;;;;;;-1:-1:-1;;;1658:31:4;;;;;;;;;;;;;;;1699:6;:13;;-1:-1:-1;;1699:13:4;;;;;11382:10;;1699:13;11382:10;11374:40;;;;;-1:-1:-1;;;11374:40:4;;;;;;;;;;;;-1:-1:-1;;;11374:40:4;;;;;;;;;;;;;;;11425:14;11442:13;:11;:13::i;:::-;11425:30;;11465:12;11480:28;11485:12;1032:1:1;11480:4:4;:28::i;:::-;11465:43;;11518:20;11541:27;11546:12;11560:7;11541:4;:27::i;:::-;11518:50;;11578:10;11591:32;11596:15;11613:9;11591:4;:32::i;:::-;11578:45;-1:-1:-1;11641:10:4;11633:38;;;;;-1:-1:-1;;;11633:38:4;;;;;;;;;;;;-1:-1:-1;;;11633:38:4;;;;;;;;;;;;;;;11682:40;11697:10;11709:12;11682:14;:40::i;:::-;11747:8;;11732:33;;11747:8;;;-1:-1:-1;;;;;11747:8:4;11757:7;11732:14;:33::i;:::-;11775:31;11790:15;11775:14;:31::i;:::-;11822:6;11817:515;11838:7;:14;11834:18;;11817:515;;;11873:9;11885:7;11893:1;11885:10;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;11885:10:4;11920:11;;;:8;:11;;;;;;:19;;;11885:10;;-1:-1:-1;11920:19:4;11975:16;11980:5;11920:19;11975:4;:16::i;:::-;11953:38;-1:-1:-1;12013:19:4;12005:47;;;;;-1:-1:-1;;;12005:47:4;;;;;;;;;;;;-1:-1:-1;;;12005:47:4;;;;;;;;;;;;;;;12092:13;;12106:1;12092:16;;;;;;;;;;;;;12074:14;:34;;12066:60;;;;;-1:-1:-1;;;12066:60:4;;;;;;;;;;;;-1:-1:-1;;;12066:60:4;;;;;;;;;;;;;;;-1:-1:-1;;;;;12167:11:4;;;;;;:8;:11;;;;;:19;;;12162:41;;12188:14;12162:4;:41::i;:::-;-1:-1:-1;;;;;12140:11:4;;;;;;:8;:11;;;;;;;;;:19;;:63;;;;12222:39;;;;;;;12140:11;;12231:10;;12222:39;;;;;;;;;;12275:46;12291:1;12294:10;12306:14;12275:15;:46::i;:::-;-1:-1:-1;;;11854:3:4;;11817:515;;;-1:-1:-1;;1733:6:4;:14;;-1:-1:-1;;1733:14:4;;;-1:-1:-1;;;;;;11245:1094:4:o;827:42:1:-;868:1;827:42;:::o;779:::-;820:1;779:42;:::o;1322:46::-;1363:5;1322:46;:::o;3136:664:2:-;3369:19;3404:16;3423:35;3428:13;3443:14;3423:4;:35::i;:::-;3404:54;;3468:15;3486:19;766:6:1;3497:7:2;3486:4;:19::i;:::-;3468:37;;3528:31;3533:13;3548:10;3528:4;:31::i;:::-;3515:44;;3569:6;3578:54;3583:14;3599:32;3604:14;3620:10;3599:4;:32::i;3578:54::-;3569:63;;3642:8;3653:20;3658:1;3661:11;3653:4;:20::i;:::-;3642:31;;3683:8;3694:15;766:6:1;3705:3:2;3694:4;:15::i;:::-;3683:26;;3736;3741:15;3758:3;3736:4;:26::i;:::-;3719:43;3136:664;-1:-1:-1;;;;;;;;;;;;3136:664:2:o;935:50:1:-;983:2;766:6;976:9;;1374:59;1415:18;1374:59;:::o;3152:194:4:-;1801:6;;3236:23;;1801:6;;;;;1800:7;1792:31;;;;;-1:-1:-1;;;1792:31:4;;;;;;;;;;;;-1:-1:-1;;;1792:31:4;;;;;;;;;;;;;;;3283:10;;;;3275:40;;;;;-1:-1:-1;;;3275:40:4;;;;;;;;;;;;-1:-1:-1;;;3275:40:4;;;;;;;;;;;;;;;3332:7;3325:14;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;3325:14:4;;;;;;;;;;;;;;;;;;;;;;3152:194;:::o;991:42:1:-;1032:1;991:42;:::o;3008:138:4:-;1801:6;;3086:23;;1801:6;;;;;1800:7;1792:31;;;;;-1:-1:-1;;;1792:31:4;;;;;;;;;;;;-1:-1:-1;;;1792:31:4;;;;;;;;;;;;;;2890:112;2981:7;:14;2890:112;:::o;8024:1010::-;1585:10;-1:-1:-1;;;;;1567:39:4;1576:7;;-1:-1:-1;;;;;;1576:7:4;-1:-1:-1;;;;;1567:39:4;;1597:8;;1567:39;;;;;;;;;;;;;;;;;;;;;30:3:-1;22:6;14;1:33;99:1;81:16;;;74:27;1567:39:4;;137:4:-1;117:14;;;-1:-1;;113:30;157:16;;;1567:39:4;;;;-1:-1:-1;1567:39:4;;-1:-1:-1;;;;1567:39:4;1667:6;;;;;;;1666:7;1658:31;;;;;-1:-1:-1;;;1658:31:4;;;;;;;;;;;;-1:-1:-1;;;1658:31:4;;;;;;;;;;;;;;;1699:6;:13;;-1:-1:-1;;1699:13:4;;;;;8139:11;;8125:10;-1:-1:-1;;;;;8139:11:4;;;8125:25;8117:56;;;;;-1:-1:-1;;;8117:56:4;;;;;;;;;;;;-1:-1:-1;;;8117:56:4;;;;;;;;;;;;;;;-1:-1:-1;;;;;8191:15:4;;;;;;:8;:15;;;;;:21;;;8183:47;;;;;-1:-1:-1;;;8183:47:4;;;;;;;;;;;;-1:-1:-1;;;8183:47:4;;;;;;;;;;;;;;;8249:10;;;;8248:11;8240:40;;;;;-1:-1:-1;;;8240:40:4;;;;;;;;;;;;-1:-1:-1;;;8240:40:4;;;;;;;;;;;;;;;-1:-1:-1;;;;;8311:15:4;;8291:17;8311:15;;;:8;:15;;;;;:23;;;;8364:28;8311:23;8291:17;8364:4;:28::i;:::-;8423:12;;-1:-1:-1;;;;;8437:15:4;;;;;;:8;:15;;;;;:22;;;8344:48;;-1:-1:-1;8418:42:4;;:4;:42::i;:::-;8403:12;:57;-1:-1:-1;;;;;8579:15:4;;8566:10;8579:15;;;:8;:15;;;;;:21;;;8622:7;:14;;-1:-1:-1;;8622:18:4;;;:7;:18;;8667:13;;;;;;;;;;;;;;;;8650:7;:14;;-1:-1:-1;;;;;8667:13:4;;;;8658:5;;8650:14;;;;;;;;;;;;;;:30;;;;;-1:-1:-1;;;;;8650:30:4;;;;;-1:-1:-1;;;;;8650:30:4;;;;;;8723:5;8690:8;:24;8699:7;8707:5;8699:14;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;8699:14:4;8690:24;;;;;;;;;;;;8699:14;8690:30;:38;8738:7;:13;;;;;;;;;;;;;;;-1:-1:-1;;8738:13:4;;;;;;;-1:-1:-1;;8738:13:4;;;;;;;;;8779:113;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;8761:15:4;;;;:8;:15;;;;;;;:131;;;;-1:-1:-1;;8761:131:4;;;;;;;;;-1:-1:-1;8761:131:4;;;;;;;;;;;;;;8903:68;8761:15;8926:10;8938:32;8943:12;8957;8938:4;:32::i;8903:68::-;9004:8;;8981:46;;8997:5;;9004:8;;;-1:-1:-1;;;;;9004:8:4;9014:12;8981:15;:46::i;4210:122::-;1801:6;;4290:4;;1801:6;;;;;1800:7;1792:31;;;;;-1:-1:-1;;;1792:31:4;;;;;;;;;;;;-1:-1:-1;;;1792:31:4;;;;;;;;;;;;;;;-1:-1:-1;4317:8:4;;4210:122;:::o;3625:248:5:-;3754:10;3692:4;3743:22;;;:10;:22;;;;;;;;-1:-1:-1;;;;;3743:27:5;;;;;;;;;;3738:38;;3772:3;3738:4;:38::i;:::-;3719:10;3708:22;;;;:10;:22;;;;;;;;-1:-1:-1;;;;;3708:27:5;;;;;;;;;;;;:68;;;3791:54;;;;;;3708:27;;3791:54;;;;;;;;;;;-1:-1:-1;3862:4:5;3625:248;;;;:::o;3117:118::-;-1:-1:-1;;;;;3208:15:5;;;3185:4;3208:15;;;:10;:15;;;;;;;;:20;;;;;;;;;;;;;3117:118::o;5696:713:4:-;1585:10;-1:-1:-1;;;;;1567:39:4;1576:7;;-1:-1:-1;;;;;;1576:7:4;-1:-1:-1;;;;;1567:39:4;;1597:8;;1567:39;;;;;;;;;;;;;;;;;;;;;30:3:-1;22:6;14;1:33;99:1;81:16;;;74:27;1567:39:4;;137:4:-1;117:14;;;-1:-1;;113:30;157:16;;;1567:39:4;;;;-1:-1:-1;1567:39:4;;-1:-1:-1;;;;1567:39:4;5899:11;;-1:-1:-1;;;;;5899:11:4;5885:10;:25;5877:56;;;;;-1:-1:-1;;;5877:56:4;;;;;;;;;;;;-1:-1:-1;;;5877:56:4;;;;;;;;;;;;;;;-1:-1:-1;;;;;5952:15:4;;;;;;:8;:15;;;;;:21;;;5951:22;5943:47;;;;;-1:-1:-1;;;5943:47:4;;;;;;;;;;;;;;;;;;;;;;;;;;;;6009:10;;;;6008:11;6000:40;;;;;-1:-1:-1;;;6000:40:4;;;;;;;;;;;;-1:-1:-1;;;6000:40:4;;;;;;;;;;;;;;;6059:7;:14;868:1:1;-1:-1:-1;6051:60:4;;;;;-1:-1:-1;;;6051:60:4;;;;;;;;;;;;;;;;;;;;;;;;;;;;6140:193;;;;;;;;6168:4;6140:193;;;6193:7;:14;;6140:193;;;;;;;-1:-1:-1;6140:193:4;;;;;;;;;;;;-1:-1:-1;;;;;6122:15:4;;;;;:8;:15;;;;;;:211;;;;-1:-1:-1;;6122:211:4;;;;;;;;;;;;;;;;;;;;;;;;;;;;;27:10:-1;;23:18;;;45:23;;6343:19:4;;;;;;;-1:-1:-1;;6343:19:4;;;;;;6372:30;6122:15;6386:7;6395:6;6372;:30::i;:::-;5696:713;;;:::o;1500:49:1:-;1548:1;766:6;1541:8;;3724:266:4;1801:6;;3826:4;;1801:6;;;;;1800:7;1792:31;;;;;-1:-1:-1;;;1792:31:4;;;;;;;;;;;;-1:-1:-1;;;1792:31:4;;;;;;;;;;;;;;;-1:-1:-1;;;;;3855:15:4;;;;;;:8;:15;;;;;:21;;;3847:47;;;;;-1:-1:-1;;;3847:47:4;;;;;;;;;;;;-1:-1:-1;;;3847:47:4;;;;;;;;;;;;;;;-1:-1:-1;;;;;3918:15:4;;3904:11;3918:15;;;:8;:15;;;;;:22;;;3970:12;;3957:26;;3918:22;;3957:4;:26::i;:::-;3950:33;3724:266;-1:-1:-1;;;3724:266:4:o;3996:208::-;1801:6;;4089:4;;1801:6;;;;;1800:7;1792:31;;;;;-1:-1:-1;;;1792:31:4;;;;;;;;;;;;-1:-1:-1;;;1792:31:4;;;;;;;;;;;;;;;-1:-1:-1;;;;;4118:15:4;;;;;;:8;:15;;;;;:21;;;4110:47;;;;;-1:-1:-1;;;4110:47:4;;;;;;;;;;;;-1:-1:-1;;;4110:47:4;;;;;;;;;;;;;;;-1:-1:-1;;;;;;4174:15:4;;;;;:8;:15;;;;;:23;;;;3996:208::o;4806:653:2:-;5040:18;5074:16;5093:35;5098:14;5114:13;5093:4;:35::i;:::-;5074:54;;5138:9;5150:37;5155:15;5172:14;5150:4;:37::i;:::-;5138:49;;5197:6;5206:27;5211:15;5228:4;5206;:27::i;:::-;5197:36;;5243:8;5254:20;5259:1;5262:11;5254:4;:20::i;:::-;5243:31;;5290:15;5295:3;766:6:1;5290:4:2;:15::i;:::-;5284:21;;5331:19;766:6:1;5342:7:2;5331:4;:19::i;:::-;5315:35;;5376:46;5381:25;5386:14;5402:3;5381:4;:25::i;:::-;5408:13;5376:4;:46::i;:::-;5360:62;4806:653;-1:-1:-1;;;;;;;;;;;4806:653:2:o;2540:108:4:-;2630:11;;-1:-1:-1;;;2630:11:4;;;;;2540:108::o;1550:301:3:-;1619:4;1649:5;;;1672:6;;;:21;;;1692:1;1687;1682:2;:6;;;;;;:11;1672:21;1664:50;;;;;-1:-1:-1;;;1664:50:3;;;;;;;;;;;;;;;;;;;;;;;;;;;;1740:8;1734:15;;1767:8;;;;1759:37;;;;;-1:-1:-1;;;1759:37:3;;;;;;;;;;;;;;;;;;;;;;;;;;;;1806:7;766:6:1;1816:2:3;:9;;;1550:301;-1:-1:-1;;;;;;1550:301:3:o;1129:195::-;1198:4;1219:6;1227:9;1240:14;1249:1;1252;1240:8;:14::i;:::-;1218:36;;;;1273:4;1272:5;1264:35;;;;;-1:-1:-1;;;1264:35:3;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;1316:1:3;1129:195;-1:-1:-1;;;1129:195:3:o;22837:108:4:-;22919:19;22925:4;22931:6;22919:5;:19::i;:::-;22837:108;;:::o;23155:88::-;23223:13;23229:6;23223:5;:13::i;:::-;23155:88;:::o;22951:104::-;23031:17;23037:2;23041:6;23031:5;:17::i;22640:191::-;22748:34;;;;;;-1:-1:-1;;;;;22748:34:4;;;;;;;;;;;;;;;22736:9;;22748:22;;;;;:34;;;;;;;;;;;;;;22736:9;22748:22;:34;;;5:2:-1;;;;30:1;27;20:12;5:2;22748:34:4;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;22748:34:4;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;22748:34:4;;-1:-1:-1;22748:34:4;22792:32;;;;;-1:-1:-1;;;22792:32:4;;;;;;;;;;;;;;;;;;;;;;;;;;;;22640:191;;;;:::o;2205:268:5:-;-1:-1:-1;;;;;2283:13:5;;:8;:13;;;;;;;;;;;:20;-1:-1:-1;2283:20:5;2275:53;;;;;-1:-1:-1;;;2275:53:5;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;2359:13:5;;:8;:13;;;;;;;;;;;2354:24;;2374:3;2354:4;:24::i;:::-;-1:-1:-1;;;;;2338:13:5;;;:8;:13;;;;;;;;;;;:40;;;;2409:13;;;;;;;2404:24;;2424:3;2404:4;:24::i;:::-;-1:-1:-1;;;;;2388:13:5;;;:8;:13;;;;;;;;;;;;:40;;;;2443:23;;;;;;;2388:13;;2443:23;;;;;;;;;;;;;2205:268;;;:::o;950:173:3:-;1019:4;1048:5;;;1071:6;;;;1063:35;;;;;-1:-1:-1;;;1063:35:3;;;;;;;;;;;;;;;;;;;;;;;;;;;22420:214:4;22530:55;;;;;;-1:-1:-1;;;;;22530:55:4;;;;;;;22571:4;22530:55;;;;;;;;;;;;22518:9;;22530:26;;;;;:55;;;;;;;;;;;;;;22518:9;22530:26;:55;;;5:2:-1;;;;30:1;27;20:12;23061:88:4;23129:13;23135:6;23129:5;:13::i;1857:376:3:-;1926:4;1954:6;1946:31;;;;;-1:-1:-1;;;1946:31:3;;;;;;;;;;;;;;;;;;;;;;;;;;;;766:6:1;1997:8:3;;2023:6;;;:24;;;766:6:1;2038:1:3;2033:2;:6;;;;;;:14;2023:24;2015:53;;;;;-1:-1:-1;;;2015:53:3;;;;;;;;;;;;;;;;;;;;;;;;;;;;2115:1;2111:5;;2105:12;;2135:8;;;;2127:37;;;;;-1:-1:-1;;;2127:37:3;;;;;;;;;;;;;;;;;;;;;;;;;;;;2191:7;2206:1;2201:2;:6;;;;2714:537;2788:4;1363:5:1;2816:4:3;:21;;2808:55;;;;;-1:-1:-1;;;2808:55:3;;;;;;;;;;;;;;;;;;;;;;;;;;;;1415:18:1;2881:21:3;;;2873:56;;;;;-1:-1:-1;;;2873:56:3;;;;;;;;;;;;;;;;;;;;;;;;;;;;2940:10;2954:11;2961:3;2954:6;:11::i;:::-;2940:25;;2978:11;2992:16;2997:3;3002:5;2992:4;:16::i;:::-;2978:30;;3019:13;3035:24;3041:4;3047:11;3052:5;3047:4;:11::i;:::-;3035:5;:24::i;:::-;3019:40;-1:-1:-1;3074:11:3;3070:57;;3108:8;-1:-1:-1;3101:15:3;;-1:-1:-1;;3101:15:3;3070:57;3137:18;3158:40;3169:4;3175:6;1480:13:1;3158:10:3;:40::i;:::-;3137:61;;3215:29;3220:8;3230:13;3215:4;:29::i;:::-;3208:36;2714:537;-1:-1:-1;;;;;;;2714:537:3:o;1330:214::-;1403:4;1409;1438:1;1433;:6;1429:109;;-1:-1:-1;;1463:5:3;;;1470;1455:21;;1429:109;-1:-1:-1;;1515:5:3;;;1522:4;1429:109;1330:214;;;;;:::o;2577:96:5:-;2635:31;2641:4;2655;2662:3;2635:5;:31::i;1912:287::-;1981:4;1964:8;:23;;;;;;;;;;;:30;-1:-1:-1;1964:30:5;1956:63;;;;;-1:-1:-1;;;1956:63:5;;;;;;;;;;;;;;;;;;;;;;;;;;;;2077:4;2060:8;:23;;;;;;;;;;;2055:34;;2085:3;2055:4;:34::i;:::-;2046:4;2029:8;:23;;;;;;;;;;:60;2119:12;;2114:23;;2133:3;2114:4;:23::i;:::-;2099:12;:38;2152:40;;;;;;;;2184:1;;2169:4;;2152:40;;;;;;;;;1912:287;:::o;2479:92::-;2535:29;2549:4;2556:2;2560:3;2535:5;:29::i;1692:214::-;1784:4;1767:8;:23;;;;;;;;;;;1762:34;;1792:3;1762:4;:34::i;:::-;1753:4;1736:8;:23;;;;;;;;;;:60;1826:12;;1821:23;;1840:3;1821:4;:23::i;:::-;1806:12;:38;1859:40;;;;;;;;1888:4;;1876:1;;1859:40;;;;;;;;;1692:214;:::o;833:111:3:-;896:4;766:6:1;923:7:3;928:1;923:4;:7::i;:::-;:14;;833:111;-1:-1:-1;;833:111:3:o;723:104::-;766:6:1;812:8:3;;;723:104::o;2258:300::-;2328:4;;2361:1;2357;:5;:21;;766:6:1;2357:21:3;;;2370:1;2357:21;2348:30;-1:-1:-1;2399:1:3;2394:6;;;;2389:145;2402:6;;2389:145;;2436:10;2441:1;2444;2436:4;:10::i;:::-;2432:14;-1:-1:-1;2469:1:3;2465;:5;:10;2461:63;;2499:10;2504:1;2507;2499:4;:10::i;:::-;2495:14;;2461:63;2415:1;2410:6;;;;2389:145;;3257:1047;3353:4;3405:3;3353:4;;3441:20;3450:4;766:6:1;3441:8:3;:20::i;:::-;3418:43;;-1:-1:-1;3418:43:3;-1:-1:-1;766:6:1;;3471:9:3;3796:1;3782:495;3807:9;3799:4;:17;3782:495;;3837:9;766:6:1;3849:1:3;:8;3837:20;;3872:6;3880:9;3893:29;3902:1;3905:16;3910:4;766:6:1;3905:4:3;:16::i;:::-;3893:8;:29::i;:::-;3871:51;;;;3943:22;3948:4;3954:10;3959:1;3962;3954:4;:10::i;3943:22::-;3936:29;;3986:16;3991:4;3997;3986;:16::i;:::-;3979:23;-1:-1:-1;4020:9:3;4016:20;;4031:5;;;;;4016:20;4055:4;4051:30;;;4072:9;;;4051:30;4099:4;4095:30;;;4116:9;;;4095:30;4143:8;4139:128;;;4177:15;4182:3;4187:4;4177;:15::i;:::-;4171:21;;4139:128;;;4237:15;4242:3;4247:4;4237;:15::i;:::-;4231:21;;4139:128;-1:-1:-1;;;3818:3:3;;3782:495;;;-1:-1:-1;4294:3:3;;3257:1047;-1:-1:-1;;;;;;;;;3257:1047:3:o
Swarm Source
bzzr://08be3d1ae8df326becfb0d7fa15f3da56c3488a4813f666aa4154f7433e2a31e
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.