Overview
S Balance
0 S
S Value
$0.00More Info
Private Name Tags
ContractCreator
Latest 1 from a total of 1 transactions
Transaction Hash |
Method
|
Block
|
From
|
To
|
|||||
---|---|---|---|---|---|---|---|---|---|
Transfer Ownersh... | 2064182 | 17 days ago | IN | 0 S | 0.00003172 |
Latest 1 internal transaction
Parent Transaction Hash | Block | From | To | |||
---|---|---|---|---|---|---|
2106184 | 16 days ago | Contract Creation | 0 S |
Loading...
Loading
Contract Name:
PresaleDapp
Compiler Version
v0.8.17+commit.8df45f5f
Contract Source Code (Solidity Standard Json-Input format)
// SPDX-License-Identifier: MIT pragma solidity ^0.8.17; //pragma experimental ABIEncoderV2; //import "https://github.com/Uniswap/uniswap-v2-periphery/blob/master/contracts/interfaces/IUniswapV2Router02.sol"; /** * @dev Interface of the ERC20 standard as defined in the EIP. */ interface IERC20 { function decimals() external view returns(uint8); /** * @dev Returns the amount of tokens in existence. */ function totalSupply() external view returns(uint256); /** * @dev Returns the amount of tokens owned by `account`. */ function balanceOf(address account) external view returns(uint256); /** * @dev Moves `amount` tokens from the caller's account to `recipient`. * * Returns a boolean value indicating whether the operation succeeded. * * Emits a {Transfer} event. */ function transfer(address recipient, uint256 amount) external returns(bool); /** * @dev Returns the remaining number of tokens that `spender` will be * allowed to spend on behalf of `owner` through {transferFrom}. This is * zero by default. * * This value changes when {approve} or {transferFrom} are called. */ function allowance(address owner, address spender) external view returns(uint256); /** * @dev Sets `amount` as the allowance of `spender` over the caller's tokens. * * Returns a boolean value indicating whether the operation succeeded. * * IMPORTANT: Beware that changing an allowance with this method brings the risk * that someone may use both the old and the new allowance by unfortunate * transaction ordering. One possible solution to mitigate this race * condition is to first reduce the spender's allowance to 0 and set the * desired value afterwards: * https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729 * * Emits an {Approval} event. */ function approve(address spender, uint256 amount) external returns(bool); /** * @dev Moves `amount` tokens from `sender` to `recipient` using the * allowance mechanism. `amount` is then deducted from the caller's * allowance. * * Returns a boolean value indicating whether the operation succeeded. * * Emits a {Transfer} event. */ function transferFrom(address sender, address recipient, uint256 amount) external returns(bool); /** * @dev Emitted when `value` tokens are moved from one account (`from`) to * another (`to`). * * Note that `value` may be zero. */ event Transfer(address indexed from, address indexed to, uint256 value); /** * @dev Emitted when the allowance of a `spender` for an `owner` is set by * a call to {approve}. `value` is the new allowance. */ event Approval(address indexed owner, address indexed spender, uint256 value); } interface ERC20 { function name() external pure returns(string memory); function symbol() external pure returns(string memory); function transfer(address to, uint256 value) external returns(bool); function approve(address spender, uint256 value) external returns(bool); function transferFrom(address from, address to, uint256 value) external returns(bool); function totalSupply() external view returns(uint256); function balanceOf(address who) external view returns(uint256); function allowance(address owner, address spender) external view returns(uint256); event Transfer(address indexed from, address indexed to, uint256 value); event Approval(address indexed owner, address indexed spender, uint256 value); } /** * @title Ownable * @dev The Ownable contract has an owner address, and provides basic authorization control * functions, this simplifies the implementation of "user permissions". */ contract Ownable { address public owner; //address public voter; event OwnershipRenounced(address indexed previousOwner); event OwnershipTransferred( address indexed previousOwner, address indexed newOwner ); /** * @dev The Ownable constructor sets the original `owner` of the contract to the sender * account. */ constructor() { owner = msg.sender; } /** * @dev Throws if called by any account other than the owner. */ modifier onlyOwner() { require(msg.sender == owner); _; } /* modifier onlyVoter() { require(msg.sender == voter); _; } */ /** * @dev Allows the current owner to relinquish control of the contract. */ function renounceOwnership() public onlyOwner { emit OwnershipRenounced(owner); owner = address(0); } /** * @dev Allows the current owner to transfer control of the contract to a newOwner. * @param _newOwner The address to transfer ownership to. */ function transferOwnership(address _newOwner) public onlyOwner { _transferOwnership(_newOwner); } /** * @dev Transfers control of the contract to a newOwner. * @param _newOwner The address to transfer ownership to. */ function _transferOwnership(address _newOwner) internal { require(_newOwner != address(0)); emit OwnershipTransferred(owner, _newOwner); owner = _newOwner; } } interface LPToken { function sync() external; } // pragma solidity >=0.5.0; interface UniswapFactory { event PairCreated(address indexed token0, address indexed token1, address pair, uint); function getPair(address tokenA, address tokenB) external view returns(address pair); function createPair(address tokenA, address tokenB) external returns(address pair); } // pragma solidity >=0.5.0; interface IUniswapV2Pair { event Approval(address indexed owner, address indexed spender, uint value); event Transfer(address indexed from, address indexed to, uint value); function name() external pure returns(string memory); function symbol() external pure returns(string memory); function decimals() external pure returns(uint8); function totalSupply() external view returns(uint); function balanceOf(address owner) external view returns(uint); function allowance(address owner, address spender) external view returns(uint); function approve(address spender, uint value) external returns(bool); function transfer(address to, uint value) external returns(bool); function transferFrom(address from, address to, uint value) external returns(bool); } // pragma solidity >=0.6.2; interface UniswapRouter02 { function factory() external pure returns(address); function WETH() external pure returns(address); function WBNB() external pure returns(address); function addLiquidity( address tokenA, address tokenB, uint amountADesired, uint amountBDesired, uint amountAMin, uint amountBMin, address to, uint deadline ) external returns(uint amountA, uint amountB, uint liquidity); function addLiquidityETH( address token, uint amountTokenDesired, uint amountTokenMin, uint amountETHMin, address to, uint deadline ) external payable returns(uint amountToken, uint amountETH, uint liquidity); function addLiquidityBNB( address token, uint amountTokenDesired, uint amountTokenMin, uint amountETHMin, address to, uint deadline ) external payable returns(uint amountToken, uint amountETH, uint liquidity); function swapExactETHForTokens(uint amountOutMin, address[] calldata path, address to, uint deadline) external payable returns(uint[] memory amounts); function swapExactBNBForTokens(uint amountOutMin, address[] calldata path, address to, uint deadline) external payable returns(uint[] memory amounts); // function getAmountOut(uint amountIn, uint reserveIn, uint reserveOut) external pure returns(uint amountOut); // function getAmountIn(uint amountOut, uint reserveIn, uint reserveOut) external pure returns(uint amountIn); function getAmountsOut(uint amountIn, address[] calldata path) external view returns(uint[] memory amounts); function getAmountsIn(uint amountOut, address[] calldata path) external view returns(uint[] memory amounts); } interface lpLockDeployerInterface { function createLPLocker(address _lockingToken, uint256 _lockerEndTimeStamp, string memory _logo, uint256 _lockingAmount) external payable returns (address); } contract Consts { // uint constant TOKEN_DECIMALS = 18; // uint8 constant TOKEN_DECIMALS_UINT8 = 18; // uint constant TOKEN_DECIMAL_MULTIPLIER = 10 ** TOKEN_DECIMALS; // bool constant CONTINUE_MINTING = false; // uint256 constant minPlatTokenReq = 1000 * TOKEN_DECIMAL_MULTIPLIER; // uint256 constant airdropTokenPercentage = 2; } contract DefiCrowdsale is Consts, Ownable { event TokenPurchase( address indexed purchaser, address indexed beneficiary, uint256 value, uint256 amount ); event Closed(); event RefundsEnabled(); event Refunded(address indexed beneficiary, uint256 weiAmount); event claimedBack(address indexed beneficiary, uint256 weiAmount); event Finalized(); event Initialized(); event TimesChanged(uint startTime, uint endTime, uint oldStartTime, uint oldEndTime); string public presaleType = "IDO"; mapping(address => uint256) public contributors; mapping(address => uint256) public contributorsTracker; mapping(address => uint256) public contributorsClaim; mapping(address => uint256) public contributorsRefundAnytime; mapping(address => uint256) public contributorsPayoutNumber; mapping(uint256 => address) public contributorsAddressTracker; mapping(address => bool) public contributed; mapping(address => bool) public anytimeRefunded; mapping(address => bool) public whitelist; mapping(uint256 => address) public AddWhitelistTracker; //mapping(uint256 => address) public RemoveWhitelistTracker; uint256 public contributorCount; uint256 public AddWhitelistNumber; uint256 public RemoveWhitelistNumber; uint256 public presaleGoalReachedTime = 0; uint256 public buyRate; uint256[2] __min_max_eth; uint256 public soft_cap; uint256 public hard_cap; uint256 public startTime; uint256 public endTime; uint256 public weiRaised; uint256 public whitelistCoolOff = 600; uint256 public finalizeTimeout = 600; //604800; //time for presale owner to finalize uint256 public disabledWhitelistTime; uint public teamFeePer = 2; // team fees percentage bool public initialized = false; bool public Preaslefinalized = false; bool public whitelistEnabled; bool public whitelistDisabledInitiated; bool public isFinalized; bool public finalizeValid; bool public vestingEnabled; bool public refundEnabled; bool public alternateFee; uint256 public MaxAllowedContribution; uint256 public numberOfVest; uint256 public finalizedTime; uint256 public vestingPeriod; uint256 public uniswapPercentage; uint256 public uniswapRate; uint256 public extraAmountPerVal; uint256 public nativeMultiplier = 20; uint256 public burnLockPeriod = 1209600; uint256 public totalTokenRequired; // address[] public AddWhitelistTrackerArray; // address[] public RemoveWhitelistTrackerArray; address public token; address public presaleCreator; address public feeContract; address public referrerAddr; address[3] public altAssets; // address public uniswapDapAddress; // address[] teamAddresses; // uint256[] teamAmounts; // uint256[] teamFreezeTimes; //uint256 totalTeamTokensMinted; constructor(address _token, uint256 _rate, uint256[2] memory start_end_time, address[2] memory targetWallets, uint256[2] memory soft_hard_cap, uint256[2] memory _min_max_eth, uint256[2] memory _UniRatePercentage, uint _teamFeePer, uint256[2] memory _extraAmountPer_lockTime, uint256 _nativeMul, address[5] memory _lpLockDepAndRouter_AltAssets) //Crowdsale(_rate, targetWallets[0], ERC20(token), _min_max_eth[1]) //TimedCrowdsale(start_end_time[0] > now ? start_end_time[0] : now, start_end_time[1]) //CappedCrowdsale(soft_hard_cap[1] * TOKEN_DECIMAL_MULTIPLIER) //RefundableCrowdsale(soft_hard_cap[0] * TOKEN_DECIMAL_MULTIPLIER, teamFees, _UniPercentage, targetWallets[1]) { // require((_govUniPercentage[0] >= 0) && (_govUniPercentage[0] <= 100), "Governance amount is outside of governance limits"); __min_max_eth = _min_max_eth; soft_cap = soft_hard_cap[0]; hard_cap = soft_hard_cap[1]; startTime = start_end_time[0]; endTime = start_end_time[1]; token = _token; MaxAllowedContribution = _min_max_eth[1]; presaleCreator = targetWallets[0]; feeContract = targetWallets[1]; teamFeePer = _teamFeePer; uniswapPercentage = _UniRatePercentage[1]; //uniswapRate = _UniRatePercentage[0] * 10**IERC20(token).decimals(); uniswapRate = _UniRatePercentage[0]; //buyRate = _rate * 10**IERC20(token).decimals(); buyRate = _rate; extraAmountPerVal = _extraAmountPer_lockTime[0] + 100; nativeMultiplier = _nativeMul; lpLockDeployer = _lpLockDepAndRouter_AltAssets[0]; ROUTER_ADDRESS = _lpLockDepAndRouter_AltAssets[1]; locktime = _extraAmountPer_lockTime[1]; totalTokenRequired = ((buyRate*hard_cap + uniswapRate*((hard_cap*uniswapPercentage)/100))/(10 ** 18)) * (teamFeePer+100) / 100; altAssets[0] = _lpLockDepAndRouter_AltAssets[2]; altAssets[1] = _lpLockDepAndRouter_AltAssets[3]; altAssets[2] = _lpLockDepAndRouter_AltAssets[4]; validPairPartner[altAssets[0]] = true; validPairPartner[altAssets[1]] = true; validPairPartner[altAssets[2]] = true; } function checkContributorValidity(address contributor_addr) public view returns(uint256) { return contributors[contributor_addr]; } function checkRate() public view returns(uint256) { return buyRate; } function minEthContribution() public view returns(uint256) { return __min_max_eth[0]; } function maxEthContribution() public view returns(uint256) { return __min_max_eth[1]; } function presaleStartTime() public view returns(uint256) { return startTime; } function presaleEndTime() public view returns(uint256) { return endTime; } function mintForPlatform(address _platform, address _referrer, uint256 _refPer, bool tokenFeeToRef) public onlyOwner returns(bool) { if(!alternateFee){ require(_platform != address(0), "platform addr cant be zero"); uint256 platFee = (weiRaised*buyRate*teamFeePer)/(100 ether); uint256 refFee; if(tokenFeeToRef){ refFee = platFee*_refPer/100; ERC20(token).transfer(_platform, platFee - (refFee)); ERC20(token).transfer(_referrer, refFee); } else{ ERC20(token).transfer(_platform, platFee); } } return true; } /* function mintForUniswap(address uniswapDep) public onlyOwner { uint256 tokenFee = (weiRaised*uniswapRate*uniswapPercentage*extraAmountPerVal)/(10000 ether); require(uniswapDep != address(0x0),"uniswapDep addr cannot be zero"); require(ERC20(token).transfer(uniswapDep, tokenFee),"unable to mint for uniDep from presale"); } */ // function resetUserEthAmount(address contributor_addr) onlyOwner public { // contributors[contributor_addr] = 0; //} /** * @dev override hasClosed to add minimal value logic * @return true if remained to achieve less than minimal */ function hasClosed() public view returns(bool) { bool remainValue = (hard_cap - weiRaised) < __min_max_eth[0]; return (block.timestamp > endTime) || remainValue; } function CheckSoftCap() public view returns(uint256) { return soft_cap; } function CheckHardCap() public view returns(uint256) { return hard_cap; } function CheckTotalEthRaised() public view returns(uint256) { return weiRaised; } /* * @dev override purchase validation to add extra value logic. * @return true if sended more than minimal value */ function _preValidatePurchase( address _beneficiary, uint256 _weiAmount ) internal { require(msg.value >= __min_max_eth[0]); // require(msg.value >= 0); require(msg.value <= (__min_max_eth[1])); // it should be 10% in mainnet launch *********************** // require(msg.value <= 1000000000000000000); require((weiRaised + _weiAmount) <= hard_cap,"contribution reaching over hcap"); require(_beneficiary != address(0)); require(_weiAmount != 0); } function addToWhitelist(address WhitelistAddress) public onlyOwner { // require(!whitelist[WhitelistAddress], "already whitelisted"); whitelist[WhitelistAddress] = true; AddWhitelistTracker[AddWhitelistNumber] = WhitelistAddress; AddWhitelistNumber++; } function removeFromWhitelist(address WhitelistAddress) public onlyOwner { require(whitelist[WhitelistAddress], "not in whitelist!"); whitelist[WhitelistAddress] = false; //RemoveWhitelistTracker[RemoveWhitelistNumber] = WhitelistAddress; //RemoveWhitelistNumber++; } function enableWhitelist() public onlyOwner { require(!whitelistEnabled, "whitelist already enabled"); whitelistEnabled = true; } function disableWhitelist() public onlyOwner { require(whitelistEnabled, "whitelist already disabled"); whitelistEnabled = false; disabledWhitelistTime = block.timestamp + whitelistCoolOff; whitelistDisabledInitiated = true; } function getAddlist() public view returns(address[] memory){ address[] memory AddList = new address[](AddWhitelistNumber); for (uint256 i = 0; i < AddWhitelistNumber; i++) { if(whitelist[AddWhitelistTracker[i]]){ AddList[i] = AddWhitelistTracker[i]; } else { AddList[i] = address(0x0); } } return AddList; } /* function getRemovelist() public view returns(address[] memory) { address[] memory RemoveList = new address[](RemoveWhitelistNumber); for (uint256 i = 0; i < RemoveWhitelistNumber; i++) { RemoveList[i] = RemoveWhitelistTracker[i]; } return RemoveList; } */ /* function getPresaleDataAddr() view returns(address[] memory, uint256[7] memory) { address[] memory PresaleDataAddr = new address[](AddWhitelistNumber); for (uint256 i = 0; i < AddWhitelistNumber; i++) { PresaleDataAddr[i] = AddWhitelistTracker[i]; //******************************************** NEED UPDATE TO ADD CORRECT ADDRESS DATA*************************************************** } return (PresaleDataAddr,getPresaleDataUint()); } */ /** * @dev fallback function ***DO NOT OVERRIDE*** */ receive() external payable { require(block.timestamp > disabledWhitelistTime, "In whitelist disabled cool Off"); require(!anytimeRefunded[msg.sender], "User used anytime refund!"); //checking if user refunded from this presale at anytime if (whitelistEnabled) { require(whitelist[msg.sender], "user not whitelisted"); } require(contributors[msg.sender] <= (MaxAllowedContribution - msg.value),"contribution over max allowed"); buyTokens(msg.sender); contributors[msg.sender] += msg.value; contributorsTracker[msg.sender] += msg.value; if(!contributed[msg.sender]){ contributorsAddressTracker[contributorCount] = msg.sender; contributed[msg.sender] = true; contributorCount++; } } /** * @dev low level token purchase ***DO NOT OVERRIDE*** * @param _beneficiary Address performing the token purchase */ function buyTokens(address _beneficiary) internal { require(msg.sender == tx.origin,"can't contribute via contracts"); require(block.timestamp > disabledWhitelistTime, "In whitelist disabled cool Off internal"); require (block.timestamp >= startTime && block.timestamp < endTime,"IDO not active"); require(!anytimeRefunded[msg.sender], "User used anytime refund!"); //checking if user refunded from this presale at anytime if (whitelistEnabled) { require(whitelist[msg.sender], "user not whitelisted"); } uint256 weiAmount = msg.value; _preValidatePurchase(_beneficiary, weiAmount); // calculate token amount to be created uint256 tokens = _getTokenAmount(weiAmount); // update state weiRaised += weiAmount; //_processPurchase(_beneficiary, tokens); emit TokenPurchase( msg.sender, _beneficiary, weiAmount, tokens ); // _updatePurchasingState(_beneficiary, weiAmount); //_forwardFunds(); //_postValidatePurchase(_beneficiary, weiAmount); } function _getTokenAmount(uint256 _weiAmount) internal view returns(uint256) { return _weiAmount*buyRate/(1 ether); // return _weiAmount.mul(rate); } function claimTokens() public { require(!refundEnabled,"presale was refunded"); require(!vestingEnabled,"please use vesting method to claim"); require(isFinalized, "Not Finalized yet!"); require(finalizeValid, "presale Failed!"); //checking if presale succeeded or not require(!(contributors[msg.sender] == 0), "user has no more tokens to claim!"); uint256 tokenValue = (uint256(contributors[msg.sender]) * (uint256(buyRate))) / (1 ether); // uint256 tokenValueDecimalOptimized = (tokenValue.mul(10 ** uint256(seeDecimals(token)))).div(1 ether); contributors[msg.sender] = 0; ERC20(token).transfer(msg.sender, tokenValue); contributorsClaim[msg.sender] = tokenValue; } function vestToken() public { // require(!tokenDropFlag,"can't vest when token drop enabled!"); require(!refundEnabled,"presale was refunded"); require(vestingEnabled,"vesting not enabled"); require(isFinalized, "Not Finalized yet!"); require(finalizeValid, "presale Failed!"); //checking if presale succeeded or not require(!(contributors[msg.sender] == 0), "user has no more tokens to claim!"); require(contributorsPayoutNumber[msg.sender] < numberOfVest,"all tokens vested"); uint256 CurrentPayoutRounds = (((block.timestamp) - (finalizedTime)) / (vestingPeriod)) + (1); // need to add 1 to allow partial token vest right away after presale if (CurrentPayoutRounds >= numberOfVest){ CurrentPayoutRounds = numberOfVest; } uint256 userPayoutRounds = CurrentPayoutRounds - (contributorsPayoutNumber[msg.sender]); require(userPayoutRounds > 0 && userPayoutRounds <= numberOfVest,"not in user claim window"); contributorsPayoutNumber[msg.sender] = CurrentPayoutRounds; uint256 tokenValue = (((uint256(contributorsTracker[msg.sender]) * (uint256(buyRate))) / (1 ether)) * (userPayoutRounds)) / (numberOfVest); // uint256 tokenValueDecimalOptimized = (tokenValue.mul(10 ** uint256(seeDecimals(token)))).div(1 ether); uint256 totalTokensLeftForUser = (uint256(contributors[msg.sender]) * (uint256(buyRate))) / (1 ether); require(tokenValue <= totalTokensLeftForUser,"can't claim more than allowed"); uint256 contributionsClaiming = contributorsTracker[msg.sender] * (userPayoutRounds) / (numberOfVest); if(contributionsClaiming >= contributors[msg.sender]){ contributors[msg.sender] = 0; } else{ contributors[msg.sender] = contributors[msg.sender] - (contributionsClaiming); } ERC20(token).transfer(msg.sender, tokenValue); contributorsClaim[msg.sender] = contributorsClaim[msg.sender] + (tokenValue); } function enableVesting(uint256 _numOfVest, uint256 _vestingPeriod) public{ require(_numOfVest > 1,"num of vest has to be grtr than 1"); require(_vestingPeriod > 0,"vesting period invalid"); require(block.timestamp < startTime - (600),"can't enable vest after presale start"); require(!vestingEnabled,"vesting already enabled"); //require(!tokenDropFlag, "can't enable vest when airdrop is on"); require(msg.sender == presaleCreator); // checking for presale owner address vestingEnabled = true; numberOfVest = _numOfVest; vestingPeriod = _vestingPeriod; } function disableVesting() public { require(msg.sender == presaleCreator); require(vestingEnabled,"vesting already disabled"); require(!isFinalized,"presale already finalized"); vestingEnabled = false; } function claimRefund() public { require(isFinalized, "not finalized"); require(!(goalReached()) || !finalizeValid, "goal reached or presale succeeded"); refund(msg.sender); } function claimRefundAnytime() public { require(!anytimeRefunded[msg.sender], "already refunded!"); uint256 userContributed = contributors[msg.sender]; require(userContributed > 0, "nothing to claim"); require(!isFinalized, "already finalized!"); require(!finalizeValid, "already succesfully finalized"); require(block.timestamp < endTime - (finalizeTimeout), "withdrawal window expired!"); // require(!goalReached() || !finalizeValid,"goal reached"); contributorsRefundAnytime[msg.sender] = userContributed; // added for V3 -- need to check weiRaised = weiRaised - (userContributed); // Subtract from total eth raised anytimeRefunded[msg.sender] = true; refundAnytime(msg.sender,userContributed); } function refund(address investor) internal { //have to see if onlyOwner works require(refundEnabled,"refund not enabled"); uint256 depositedValue = contributors[investor]; require(depositedValue > 0, "User has no investment to claim"); contributors[investor] = 0; payable(investor).call{value:depositedValue}(""); emit Refunded(investor, depositedValue); } function refundAnytime(address investor, uint256 _contributed) internal { // have to see if onlyOwner works //require(state == State.Refunding); //uint256 depositedValue = contributors[investor]; //require(depositedValue > 0, "User has no investment to claim"); uint256 penalty = _contributed*(20)/(100); uint256 refundValue = _contributed - (penalty); contributors[investor] = 0; // added for V3 -- need to check contributorsTracker[investor] = 0; // added for V3 -- need to check payable(address(feeContract)).call{value:penalty}(""); payable(investor).call{value:refundValue}(""); emit claimedBack(investor, _contributed); } function finalize(address[2] memory __finalizeInfo, uint256 refPer, bool validFinalize) onlyOwner public returns(bool) { require(!isFinalized,"already finalized"); require(hasClosed(),"not closed"); referrerAddr = __finalizeInfo[0]; presaleCreator = __finalizeInfo[1]; // uniswapDapAddress = __finalizeInfo[2]; finalizeValid = validFinalize; if (goalReached() && finalizeValid) { close(presaleCreator, referrerAddr, refPer); } else { enableRefunds(); } finalizedTime = block.timestamp; emit Finalized(); isFinalized = true; /* if(tokenDropFlag && finalizeValid){ tokenDrop(); } */ return true; } function finalizeAnytime(address[2] memory __finalizeInfo, bool validFinalize) onlyOwner public returns(bool) { require(!isFinalized, "presale already finalized"); // require(hasClosed()); referrerAddr = __finalizeInfo[0]; presaleCreator = __finalizeInfo[1]; // uniswapDapAddress = __finalizeInfo[2]; finalizeValid = validFinalize; enableRefunds(); emit Finalized(); isFinalized = true; return true; } function enableRefunds() internal { refundEnabled = true; emit RefundsEnabled(); } function getBackTokens() public { // require(block.timestamp > closingTime.add(burnDeltaTime), "cannot withdraw yet"); require(msg.sender == presaleCreator, "initiator is not presale owner!"); // require(hasClosed(), "presale not closed!"); require(isFinalized, "presale not finalized!"); require(!finalizeValid, "finalize was valid"); require(IERC20(token).transfer(presaleCreator, IERC20(token).balanceOf(address(this))),"cannot transfer token back"); } function burnUnsoldTokens() public { // require(block.timestamp > closingTime.add(burnDeltaTime), "cannot withdraw yet"); require(msg.sender == presaleCreator, "initiator is not presale owner!"); require(block.timestamp > (finalizedTime + burnLockPeriod)); // require(hasClosed(), "presale not closed!"); require(isFinalized, "presale not finalized!"); require(finalizeValid, "finalize was valid"); uint256 tokenUnsold = (((hard_cap-weiRaised)*uniswapRate*uniswapPercentage*extraAmountPerVal)/(10000 ether)) + ((hard_cap-weiRaised)*buyRate); require(IERC20(token).transfer(dead, tokenUnsold),"cannot transfer token to dead"); } function selectNativeOnlyFee() public { require(msg.sender == presaleCreator, "initiator is not presale owner!"); require(!isFinalized, "presale already finalized!"); alternateFee = true; teamFeePer = (teamFeePer * nativeMultiplier)/10; } function close(address __Creator, address _referrerAddr, uint256 _refPer) internal { require(!isFinalized,"presale already finalized"); emit Closed(); uint256 feesAmount = (address(this).balance * teamFeePer) / (100); if(_refPer > 0){ uint256 refAmount = (feesAmount * _refPer) / (100); payable(address(_referrerAddr)).call{value:refAmount}(""); payable(address(feeContract)).call{value:(feesAmount - refAmount)}(""); } else{ payable(address(feeContract)).call{value:feesAmount}(""); } uint256 uniswapAmount = (address(this).balance * uniswapPercentage) / (100); // uint256 GoverningAmount = address(this).balance.mul(gov).div(100); require(address(this).balance >= uniswapAmount, "Not Enough Fund to Transfer"); // require(address(this).balance > GoverningAmount, "Not Enough Fund to Transfer"); //payable(__uniswapDep).transfer(uniswapAmount); AddLiquidity((weiRaised*uniswapRate*uniswapPercentage*extraAmountPerVal)/(10000 ether),uniswapAmount); // __GovContract.transfer(GoverningAmount); if(address(this).balance != 0){ payable(address(__Creator)).call{value:address(this).balance}(""); } } function goalReached() public view returns(bool) { return weiRaised >= soft_cap; } function presaleEnded() public view returns(bool) { return block.timestamp > endTime; } // DATA functions for UI to fetch and read function getPresaleData() public view returns(uint256[10] memory,bool[4] memory, string memory) { uint256[10] memory PresaleDataUint; bool[4] memory presaleDataBool; PresaleDataUint = [soft_cap,hard_cap,__min_max_eth[0],__min_max_eth[1],startTime,endTime,weiRaised,buyRate,uniswapRate,uniswapPercentage]; presaleDataBool = [isFinalized,finalizeValid,vestingEnabled,refundEnabled]; return (PresaleDataUint,presaleDataBool,presaleType); } /* function getContributorData() public view returns(address[] memory,uint256[] memory) { // address[] memory WalletList = new address[](KYCsverifiedNumber); address[] memory contributorAddresses = new address[](contributorCount); uint256[] memory contributedValues = new uint256[](contributorCount); for (uint256 i = 0; i < contributorCount;i++){ contributorAddresses[i] = contributorsAddressTracker[i]; contributedValues[i] = contributors[contributorsAddressTracker[i]]; } return (contributorAddresses,contributedValues); } */ mapping(address => bool) public validPairPartner; //mapping(uint256 => address) public altList; // mapping(address => bool) public swapRouterMap; // mapping(uint256 => string) public altListName; //address public pairPartner; // uint256 public hundred = 100; // uint256 public extraAmountPerVal; // address public tokenAddress; // address public creatorAddress; uint256 public locktime; address public ROUTER_ADDRESS; // address public swapRouter_Address; // address public factoryAddress; address public dead = 0x000000000000000000000000000000000000dEaD; //address[] public altRouter; // string[] public altRouterNames; address public storedLPAddress; address public lockerAddress; // bool public blocked = false; bool public addLiquidityComplete; address public alternativeCurrency; bool public useAlternativeCurrency; uint256 public returnVal; address public lpLockDeployer; string public logo = "default"; function Approve(address _token) internal returns (bool) { uint256 amountIn = 100000000000000000000000000000000000000000000000000000000000000000000000000000; ERC20(_token).approve(ROUTER_ADDRESS, amountIn); return true; } function ApproveLock(address _lp, address _lockDeployer) internal returns (bool) { uint256 amountIn = 100000000000000000000000000000000000000000000000000000000000000000000000000000; ERC20(_lp).approve(_lockDeployer, amountIn); return true; } function getWrapAddr() public view returns (address){ return UniswapRouter02(ROUTER_ADDRESS).WETH(); } /* function getWrapAddrRouterSpecific(address _router) public view returns (address){ return UniswapRouter02(_router).WETH(); } */ function getpair(address _token1, address _token2) internal returns (address) { if (UniswapFactory(UniswapRouter02(ROUTER_ADDRESS).factory()).getPair(_token1, _token2) != address(0)) { return UniswapFactory(UniswapRouter02(ROUTER_ADDRESS).factory()).getPair(_token1, _token2); } else { return UniswapFactory(UniswapRouter02(ROUTER_ADDRESS).factory()).createPair(_token1, _token2); } } function setAlternateCurrency(address _newCurrency) public { require(_newCurrency != address(0),"currency cannot be Zero addr"); // require(swapRouterMap[_swapRouter],"invalid router"); require(validPairPartner[_newCurrency],"invalid asset selected"); require(!addLiquidityComplete,"Liquidity is added already"); require(msg.sender == presaleCreator,"not the presale creator"); // swapRouter_Address = _swapRouter; alternativeCurrency = _newCurrency; useAlternativeCurrency = true; } function revertToNative() public{ require(!addLiquidityComplete,"Liquidity is added already"); require(msg.sender == presaleCreator,"not the presale creator"); useAlternativeCurrency = false; } function getAmountsMinToken(address _tokenAddress, uint256 _ethIN) public view returns(uint256) { // UniswapRouter02 pancakeRouter = UniswapRouter02(_router); // generate the pair path of token -> weth uint256[] memory amountMinArr; uint256 AmountMin; address[] memory path = new address[](2); path[0] = getWrapAddr(); path[1] = address(_tokenAddress); amountMinArr = UniswapRouter02(ROUTER_ADDRESS).getAmountsOut(_ethIN, path); AmountMin = uint256(amountMinArr[1]); return AmountMin; } /* function getAmountsMinETH(address _tokenAddress, uint256 _tokenIN) public view returns(uint256) { // UniswapRouter02 pancakeRouter = UniswapRouter02(_router); // generate the pair path of token -> weth uint256[] memory amountMinArr; uint256 AmountMin; address[] memory path = new address[](2); path[0] = address(_tokenAddress); path[1] = getWrapAddr(); amountMinArr = UniswapRouter02(swapRouter_Address).getAmountsOut(_tokenIN, path); AmountMin = uint256(amountMinArr[1]); return AmountMin; } */ function swapETHForTokens(uint256 _nativeForDex) private { require(useAlternativeCurrency,"alt currency not selected"); address[] memory path = new address[](2); //path[0] = address(this); path[0] = getWrapAddr(); path[1] = alternativeCurrency; Approve(alternativeCurrency); // make the swap UniswapRouter02(ROUTER_ADDRESS).swapExactETHForTokens{value:_nativeForDex}( getAmountsMinToken(alternativeCurrency,_nativeForDex), path, address(this), block.timestamp + (300) ); returnVal = ERC20(alternativeCurrency).balanceOf(address(this)); } function AddLiquidity(uint256 amountTokenDesired, uint256 nativeForDex) internal { // require(validPairPartner[_pairAlternative], "This is not a valid pair partner"); uint256 amountETH = nativeForDex; uint256 amountETHMin = (amountETH * 90)/100; uint256 amountTokenToAddLiq = (amountTokenDesired * 100) / (extraAmountPerVal); uint256 amountTokenMin = (amountTokenToAddLiq * 90)/100; uint256 LP_WBNB_exp_balance; uint256 LP_token_balance; uint256 tokenToSend; if (useAlternativeCurrency) { swapETHForTokens(nativeForDex); storedLPAddress = getpair(token, alternativeCurrency); LP_WBNB_exp_balance = ERC20(alternativeCurrency).balanceOf(storedLPAddress); LP_token_balance = ERC20(token).balanceOf(storedLPAddress); } else{ storedLPAddress = getpair(token, getWrapAddr()); LP_WBNB_exp_balance = ERC20(getWrapAddr()).balanceOf(storedLPAddress); LP_token_balance = ERC20(token).balanceOf(storedLPAddress); } if (storedLPAddress != address(0x0) && (LP_WBNB_exp_balance > 0 && LP_token_balance <= 0)) { tokenToSend = (amountTokenToAddLiq * LP_WBNB_exp_balance) / amountETH; ERC20(token).transfer(storedLPAddress, tokenToSend); LPToken(storedLPAddress).sync(); // sync after adding token } Approve(token); if (useAlternativeCurrency) { UniswapRouter02(ROUTER_ADDRESS).addLiquidity(token, alternativeCurrency,amountTokenDesired,ERC20(alternativeCurrency).balanceOf(address(this)),amountTokenDesired,ERC20(alternativeCurrency).balanceOf(address(this)),address(this), block.timestamp + (300)); } else{ UniswapRouter02(ROUTER_ADDRESS).addLiquidityETH{value:amountETH}(token, amountTokenToAddLiq, amountTokenMin, amountETHMin, address(this), block.timestamp + (300)); } // if (ERC20(token).balanceOf(address(this)) != 0) { // ERC20(token).transfer(dead, ERC20(token).balanceOf(address(this))); //Burn remaining tokens // } /* } else { storedLPAddress = getpair(token, getWrapAddr()); LP_WBNB_exp_balance = ERC20(getWrapAddr()).balanceOf(storedLPAddress); LP_token_balance = ERC20(token).balanceOf(storedLPAddress); if (storedLPAddress != address(0x0) && (LP_WBNB_exp_balance > 0 && LP_token_balance <= 0)) { tokenToSend = amountTokenToAddLiq.mul(LP_WBNB_exp_balance).div(amountETH); ERC20(token).transfer(storedLPAddress, tokenToSend); LPToken(storedLPAddress).sync(); // sync after adding token } Approve(token); UniswapRouter02(ROUTER_ADDRESS).addLiquidityETH{value:address(this).balance}(token, amountTokenToAddLiq, amountTokenMin, amountETHMin, address(this), block.timestamp.add(300)); if (ERC20(token).balanceOf(address(this)) != 0) { ERC20(token).transfer(dead, ERC20(token).balanceOf(address(this))); //Burn remaining tokens } */ addLiquidityComplete = true; ApproveLock(storedLPAddress,lpLockDeployer); lockerAddress = lpLockDeployerInterface(lpLockDeployer).createLPLocker(storedLPAddress,locktime,logo,ERC20(storedLPAddress).balanceOf(address(this))); } /* function getAltAssetData() public view returns(address[] memory){ address[] memory altAssetData = new address[](altAssets.length); // string[] memory altListName = new string[](altAssets.length); // string[] memory altListSym = new string[](altAssets.length); for(uint256 i=0;i<altAssets.length;i++){ altAssetData[i] = altAssets[i]; // altListName[i] = ERC20(altAssets[i]).name(); // altListSym[i] = ERC20(altAssets[i]).symbol(); } return(altAssetData); } */ /* function getAltRouterData() public view returns(address[] memory, string[] memory){ address[] memory altRouterData = new address[](altRouter.length); string[] memory altRouterName = new string[](altRouterNames.length); for(uint256 i=0;i<altRouter.length;i++){ altRouterData[i] = altRouter[i]; altRouterName[i] = altRouterNames[i]; } return(altRouterData,altRouterName); } */ } contract PresaleDapp is Consts, Ownable { // address public lpLockDeployer; // address public feeContract; address[5] public feeContract_lplockDep_altAssets; uint256 public teamFee = 2; uint256 public nativeMultiplier = 20; constructor(address[5] memory _feeContract_lplockDep_altAssets) { feeContract_lplockDep_altAssets = _feeContract_lplockDep_altAssets; } function CreatePresaleRegular(address[4] memory presaleAddressInput_router, uint256[2] memory start_end_time, uint256[5] memory soft_hard_cap_rate_min_max_eth, uint256[2] memory uniRatePercentage, uint256[2] memory extraAmountPer_lockTime) public returns(address) { //require(uniRatePercentage[1] <= 100, "total percentages > 100!"); // This is to make sure that more eth is not requested than available //uint256[2] memory min_max_eth = [soft_hard_cap_rate_min_max_eth_GOV[3], soft_hard_cap_rate_min_max_eth_GOV[4]]; //address _mainDapp = presaleAddressInput[0]; //address creator = presaleAddressInput[1]; //address tokenAddr = presaleAddressInput[2]; //uint256[2] memory _soft_hard_cap = [soft_hard_cap_rate_min_max_eth_GOV[0], soft_hard_cap_rate_min_max_eth_GOV[1]]; //uint256 UniPercentage = uniPercentage; address[2] memory targetWallets = [presaleAddressInput_router[1], feeContract_lplockDep_altAssets[0]]; address router = presaleAddressInput_router[3]; DefiCrowdsale PresaleContract = new DefiCrowdsale(presaleAddressInput_router[2], soft_hard_cap_rate_min_max_eth[2], start_end_time, targetWallets, [soft_hard_cap_rate_min_max_eth[0], soft_hard_cap_rate_min_max_eth[1]], [soft_hard_cap_rate_min_max_eth[3], soft_hard_cap_rate_min_max_eth[4]], uniRatePercentage,teamFee,extraAmountPer_lockTime,nativeMultiplier,[feeContract_lplockDep_altAssets[1],router,feeContract_lplockDep_altAssets[2],feeContract_lplockDep_altAssets[3],feeContract_lplockDep_altAssets[4]]); PresaleContract.transferOwnership(presaleAddressInput_router[0]); return address(PresaleContract); } function updateTeamFee(uint256 _newTeamFee) public onlyOwner { teamFee = _newTeamFee; } function updateNativeMultiplier(uint256 _newMultiplier) public onlyOwner { nativeMultiplier = _newMultiplier; } function updateFeeContract(address _newFeeContract) public onlyOwner { feeContract_lplockDep_altAssets[0] = _newFeeContract; } function updateAltAssets(uint index, address _newAltAssets) public onlyOwner { require(index > 1,"cannot update fee or lpdep contract"); feeContract_lplockDep_altAssets[index] = _newAltAssets; } }
{ "evmVersion": "london", "libraries": {}, "metadata": { "bytecodeHash": "ipfs", "useLiteralContent": true }, "optimizer": { "enabled": true, "runs": 1 }, "remappings": [], "outputSelection": { "*": { "*": [ "evm.bytecode", "evm.deployedBytecode", "devdoc", "userdoc", "metadata", "abi" ] } } }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"inputs":[{"internalType":"address[5]","name":"_feeContract_lplockDep_altAssets","type":"address[5]"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"}],"name":"OwnershipRenounced","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"inputs":[{"internalType":"address[4]","name":"presaleAddressInput_router","type":"address[4]"},{"internalType":"uint256[2]","name":"start_end_time","type":"uint256[2]"},{"internalType":"uint256[5]","name":"soft_hard_cap_rate_min_max_eth","type":"uint256[5]"},{"internalType":"uint256[2]","name":"uniRatePercentage","type":"uint256[2]"},{"internalType":"uint256[2]","name":"extraAmountPer_lockTime","type":"uint256[2]"}],"name":"CreatePresaleRegular","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"feeContract_lplockDep_altAssets","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"nativeMultiplier","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"teamFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"index","type":"uint256"},{"internalType":"address","name":"_newAltAssets","type":"address"}],"name":"updateAltAssets","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_newFeeContract","type":"address"}],"name":"updateFeeContract","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_newMultiplier","type":"uint256"}],"name":"updateNativeMultiplier","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_newTeamFee","type":"uint256"}],"name":"updateTeamFee","outputs":[],"stateMutability":"nonpayable","type":"function"}]
Contract Creation Code
60806040526002600655601460075534801561001a57600080fd5b50604051620060fa380380620060fa83398101604081905261003b916100ea565b600080546001600160a01b0319163317905561005a6001826005610061565b505061017c565b82600581019282156100a9579160200282015b828111156100a957825182546001600160a01b0319166001600160a01b03909116178255602090920191600190910190610074565b506100b59291506100b9565b5090565b5b808211156100b557600081556001016100ba565b80516001600160a01b03811681146100e557600080fd5b919050565b600060a082840312156100fc57600080fd5b82601f83011261010b57600080fd5b60405160a081016001600160401b038111828210171561013b57634e487b7160e01b600052604160045260246000fd5b6040528060a084018581111561015057600080fd5b845b8181101561017157610163816100ce565b835260209283019201610152565b509195945050505050565b615f6e806200018c6000396000f3fe60806040523480156200001157600080fd5b5060043610620000a65760003560e01c80631ab8f86414620000ab57806325cfdf5e14620000c8578063417d4add14620000e1578063715018a614620000f85780637e17465814620001025780638c2f037d14620001285780638da5cb5b146200013f578063acedf07c1462000153578063d7c94efd146200016a578063f2fde38b1462000174578063fc006a8a146200018b575b600080fd5b620000b560075481565b6040519081526020015b60405180910390f35b620000df620000d9366004620005e2565b620001a2565b005b620000df620000f236600462000619565b620001bf565b620000df62000272565b6200011962000113366004620005e2565b620002d2565b604051620000bf919062000648565b620001196200013936600462000760565b620002f3565b60005462000119906001600160a01b031681565b620000df62000164366004620005e2565b620004e8565b620000b560065481565b620000df6200018536600462000820565b62000505565b620000df6200019c36600462000820565b6200052b565b6000546001600160a01b03163314620001ba57600080fd5b600755565b6000546001600160a01b03163314620001d757600080fd5b60018211620002385760405162461bcd60e51b815260206004820152602360248201527f63616e6e6f742075706461746520666565206f72206c7064657020636f6e74726044820152621858dd60ea1b606482015260840160405180910390fd5b80600183600581106200024f576200024f62000845565b0180546001600160a01b0319166001600160a01b03929092169190911790555050565b6000546001600160a01b031633146200028a57600080fd5b600080546040516001600160a01b03909116917ff8df31144d9c2f0f6b59d69b8b98abd5459d07f2742c4df920b25aae33c6482091a2600080546001600160a01b0319169055565b60018160058110620002e357600080fd5b01546001600160a01b0316905081565b60008060405180604001604052808860016004811062000317576200031762000845565b602090810291909101516001600160a01b0390811683526001541691015260608801516040808a01518882015182518084019093529394509192600092918a908690808c87602002015181526020018c6001600581106200037c576200037c62000845565b6020020151905260408051808201909152808d6003602002015181526020018d600460058110620003b157620003b162000845565b60200201518152508b6006548c6007546040518060a0016040528060018060058110620003e257620003e262000845565b01546001600160a01b0390811682528e1660208201526040016001600201546001600160a01b031681526020016001600301546001600160a01b031681526020016001600401546001600160a01b031690526040516200044290620005d4565b620004589b9a99989796959493929190620008b4565b604051809103906000f08015801562000475573d6000803e3d6000fd5b50895160405163f2fde38b60e01b81529192506001600160a01b0383169163f2fde38b91620004a79160040162000648565b600060405180830381600087803b158015620004c257600080fd5b505af1158015620004d7573d6000803e3d6000fd5b50929b9a5050505050505050505050565b6000546001600160a01b031633146200050057600080fd5b600655565b6000546001600160a01b031633146200051d57600080fd5b620005288162000565565b50565b6000546001600160a01b031633146200054357600080fd5b600180546001600160a01b0319166001600160a01b0392909216919091179055565b6001600160a01b0381166200057957600080fd5b600080546040516001600160a01b03808516939216917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e091a3600080546001600160a01b0319166001600160a01b0392909216919091179055565b6155be806200097b83390190565b600060208284031215620005f557600080fd5b5035919050565b80356001600160a01b03811681146200061457600080fd5b919050565b600080604083850312156200062d57600080fd5b823591506200063f60208401620005fc565b90509250929050565b6001600160a01b0391909116815260200190565b634e487b7160e01b600052604160045260246000fd5b604051608081016001600160401b03811182821017156200069757620006976200065c565b60405290565b600082601f830112620006af57600080fd5b604080519081016001600160401b0381118282101715620006d457620006d46200065c565b8060405250806040840185811115620006ec57600080fd5b845b8181101562000708578035835260209283019201620006ee565b509195945050505050565b600082601f8301126200072557600080fd5b60405160a081016001600160401b03811182821017156200074a576200074a6200065c565b6040528060a0840185811115620006ec57600080fd5b60008060008060006101e086880312156200077a57600080fd5b86601f8701126200078a57600080fd5b6200079462000672565b806080880189811115620007a757600080fd5b885b81811015620007cc57620007bd81620005fc565b845260209384019301620007a9565b50819750620007dc8a826200069d565b9650505050620007f08760c0880162000713565b9250620008028761016088016200069d565b915062000814876101a088016200069d565b90509295509295909350565b6000602082840312156200083357600080fd5b6200083e82620005fc565b9392505050565b634e487b7160e01b600052603260045260246000fd5b8060005b6002811015620008805781518452602093840193909101906001016200085f565b50505050565b8060005b6005811015620008805781516001600160a01b03168452602093840193909101906001016200088a565b6001600160a01b038c8116825260208083018d90526102a083019190620008df604085018e6200085b565b608084018c60005b600281101562000908578151851683529183019190830190600101620008e7565b50505050506200091c60c083018a6200085b565b6200092c6101008301896200085b565b6200093c6101408301886200085b565b85610180830152620009536101a08301866200085b565b836101e08301526200096a61020083018462000886565b9c9b50505050505050505050505056fe60c0604052600360809081526249444f60e81b60a052600190620000249082620003de565b506000600f5561025860188190556019556002601b55601c805461ffff19169055601460245562127500602555603180546001600160a01b03191661dead179055604080518082019091526007815266191959985d5b1d60ca1b6020820152603790620000929082620003de565b50348015620000a057600080fd5b50604051620055be380380620055be833981016040819052620000c391620005c5565b600080546001600160a01b03191633179055620000e46011876002620002df565b508651601355602080880151601455895160155589810151601655602780546001600160a01b038e81166001600160a01b03199283161790925588830151601d558a51602880549184169183169190911790558a83015160298054919093169116179055601b859055850151602155845160225560108a905582516200016c906064620006f8565b60235560248290558051603680546001600160a01b03199081166001600160a01b0393841617909155602080840151603080549093169316929092179055830151602f55601b54606490620001c29082620006f8565b670de0b6b3a76400006064602154601454620001df919062000714565b620001eb91906200072e565b602254620001fa919062000714565b6014546010546200020c919062000714565b620002189190620006f8565b6200022491906200072e565b62000230919062000714565b6200023c91906200072e565b602655604081810151602b80546001600160a01b03199081166001600160a01b039384169081179092556060850151602c80548316918516919091178155608090950151602d80549092169084161781556000918252602e602052838220805460ff199081166001908117909255955484168352848320805487168217905590549092168152919091208054909216179055506200075198505050505050505050565b826002810192821562000310579160200282015b8281111562000310578251825591602001919060010190620002f3565b506200031e92915062000322565b5090565b5b808211156200031e576000815560010162000323565b634e487b7160e01b600052604160045260246000fd5b600181811c908216806200036457607f821691505b6020821081036200038557634e487b7160e01b600052602260045260246000fd5b50919050565b601f821115620003d957600081815260208120601f850160051c81016020861015620003b45750805b601f850160051c820191505b81811015620003d557828155600101620003c0565b5050505b505050565b81516001600160401b03811115620003fa57620003fa62000339565b62000412816200040b84546200034f565b846200038b565b602080601f8311600181146200044a5760008415620004315750858301515b600019600386901b1c1916600185901b178555620003d5565b600085815260208120601f198616915b828110156200047b578886015182559484019460019091019084016200045a565b50858210156200049a5787850151600019600388901b60f8161c191681555b5050505050600190811b01905550565b80516001600160a01b0381168114620004c257600080fd5b919050565b604080519081016001600160401b0381118282101715620004ec57620004ec62000339565b60405290565b600082601f8301126200050457600080fd5b6200050e620004c7565b8060408401858111156200052157600080fd5b845b818110156200053d57805184526020938401930162000523565b509095945050505050565b600082601f8301126200055a57600080fd5b60405160a081016001600160401b03811182821017156200057f576200057f62000339565b6040528060a08401858111156200059557600080fd5b845b81811015620005ba57620005ab81620004aa565b83526020928301920162000597565b509195945050505050565b60008060008060008060008060008060006102a08c8e031215620005e857600080fd5b620005f38c620004aa565b9a5060208c015199506200060b8d60408e01620004f2565b98508c609f8d01126200061d57600080fd5b62000627620004c7565b808e60c08f0111156200063957600080fd5b60808e015b60c08f0181101562000664576200065581620004aa565b8352602092830192016200063e565b5098506200067890508d60c08e01620004f2565b96506200068a8d6101008e01620004f2565b95506200069c8d6101408e01620004f2565b94506101808c01519350620006b68d6101a08e01620004f2565b92506101e08c01519150620006d08d6102008e0162000548565b90509295989b509295989b9093969950565b634e487b7160e01b600052601160045260246000fd5b808201808211156200070e576200070e620006e2565b92915050565b80820281158282048414176200070e576200070e620006e2565b6000826200074c57634e487b7160e01b600052601260045260246000fd5b500490565b614e5d80620007616000396000f3fe60806040526004361061044d5760003560e01c806306e29712146106425780630f98c918146106785780631096f46a1461069c57806310ef82c5146106bc5780631265d6e7146106d25780631515bc2b146106f4578063158ef93e146107195780631ab8f864146107335780631bd49653146107495780631c8d67491461075f5780631dfaced41461077f5780631e12353e1461079f5780631edd40ae146107d55780631f4ba804146107ea5780631f6d494214610800578063249b7c191461082d578063252a02eb146108425780632698d7071461087857806329279ce91461088d5780632a592e9f146108a35780632fc9b686146108d05780633197cbb6146109005780633675f29b1461091657806336cf7c871461093657806337ce1647146109565780633bff8ed7146109775780633cb650d0146109a45780634042b66f146109b9578063422099b2146109cf5780634879ef26146109e457806348c54b9d14610a1a5780634c4a386f14610a2f5780634d2a907314610a505780634de64b8114610a705780634e4153bb14610a905780635122907714610aa657806351fb012d14610ac8578063585e1af614610ae85780635a0e779b14610afe5780635f9bae3214610b1f5780636008405914610b3557806361644ca814610b5557806361c533b414610b7957806363c1805814610b8f5780636ac8d0c214610ba45780636e27607a14610bc5578063715018a614610be657806371beb4e114610bfb57806372f256f214610c115780637313ee5a14610c2757806378e2df0e14610c3d57806378e9792514610c535780637d3d652214610c695780637f87bbd614610c835780638190eefd14610ca457806382efbbec14610cc5578063844faace14610cdb5780638ab1d68114610d085780638b6ea1cf14610d285780638d4e408314610d485780638da5cb5b14610d69578063940bb34414610d895780639774748014610d9e578063995c5e9d14610db35780639b19251a14610de35780639b33d9d114610e135780639fe4cb9414610e28578063a7b17c8214610e48578063a82524b214610e5e578063b444e16214610e73578063b5545a3c14610e89578063b7a871c914610e9e578063b89918e014610ece578063b94a6dfe14610ee3578063bab80d1414610f03578063bc2eae0c14610f22578063be11ce2f14610f38578063be5ef81a14610f4d578063bf3f15bf14610f6d578063c3abb76614610f83578063c758e79214610fa3578063cdfb2b4e14610fb8578063d6b0f48414610fcd578063db37ceec14610fe2578063e132db4114610ff7578063e43252d71461100c578063e4c21cf21461102c578063e5658e1a14611041578063e580b2b01461106e578063ecfd892814611085578063ef67a5e21461109b578063f2fde38b146110bb578063f6e99c0d146110db578063fb7f21eb146110fb578063fc0c546a14611110578063fc37987b14611130578063fcb3747314611146578063fe67a1891461115c57600080fd5b3661063d57601a5442116104a85760405162461bcd60e51b815260206004820152601e60248201527f496e2077686974656c6973742064697361626c656420636f6f6c204f6666000060448201526064015b60405180910390fd5b3360009081526009602052604090205460ff16156104d85760405162461bcd60e51b815260040161049f906144f0565b601c5462010000900460ff161561051857336000908152600a602052604090205460ff166105185760405162461bcd60e51b815260040161049f90614523565b34601d546105269190614567565b3360009081526002602052604090205411156105845760405162461bcd60e51b815260206004820152601d60248201527f636f6e747269627574696f6e206f766572206d617820616c6c6f776564000000604482015260640161049f565b61058d33611172565b33600090815260026020526040812080543492906105ac90849061457a565b909155505033600090815260036020526040812080543492906105d090849061457a565b90915550503360009081526008602052604090205460ff1661063b57600c8054600090815260076020908152604080832080546001600160a01b03191633908117909155835260089091528120805460ff19166001179055815491906106358361458d565b91905055505b005b600080fd5b34801561064e57600080fd5b50602954610662906001600160a01b031681565b60405161066f91906145a6565b60405180910390f35b34801561068457600080fd5b5061068e60215481565b60405190815260200161066f565b3480156106a857600080fd5b50603454610662906001600160a01b031681565b3480156106c857600080fd5b5061068e60265481565b3480156106de57600080fd5b506106e761135c565b60405161066f9190614600565b34801561070057600080fd5b506107096113ea565b604051901515815260200161066f565b34801561072557600080fd5b50601c546107099060ff1681565b34801561073f57600080fd5b5061068e60245481565b34801561075557600080fd5b5061068e60355481565b34801561076b57600080fd5b5061070961077a3660046146fb565b611418565b34801561078b57600080fd5b5061066261079a366004614733565b6114e2565b3480156107ab57600080fd5b506106626107ba366004614733565b600b602052600090815260409020546001600160a01b031681565b3480156107e157600080fd5b5061063b611502565b3480156107f657600080fd5b5061068e60235481565b34801561080c57600080fd5b5061068e61081b36600461474c565b60026020526000908152604090205481565b34801561083957600080fd5b5060165461068e565b34801561084e57600080fd5b5061066261085d366004614733565b6007602052600090815260409020546001600160a01b031681565b34801561088457600080fd5b5060175461068e565b34801561089957600080fd5b5061068e60225481565b3480156108af57600080fd5b5061068e6108be36600461474c565b60046020526000908152604090205481565b3480156108dc57600080fd5b506107096108eb36600461474c565b60096020526000908152604090205460ff1681565b34801561090c57600080fd5b5061068e60165481565b34801561092257600080fd5b50603354610662906001600160a01b031681565b34801561094257600080fd5b50603154610662906001600160a01b031681565b34801561096257600080fd5b5060345461070990600160a01b900460ff1681565b34801561098357600080fd5b5061068e61099236600461474c565b60056020526000908152604090205481565b3480156109b057600080fd5b5061063b6116f4565b3480156109c557600080fd5b5061068e60175481565b3480156109db57600080fd5b5061063b611798565b3480156109f057600080fd5b5061068e6109ff36600461474c565b6001600160a01b031660009081526002602052604090205490565b348015610a2657600080fd5b5061063b61184d565b348015610a3b57600080fd5b50601c5461070990600160381b900460ff1681565b348015610a5c57600080fd5b50610709610a6b366004614769565b611a29565b348015610a7c57600080fd5b5061068e610a8b3660046147aa565b611ba0565b348015610a9c57600080fd5b5061068e600f5481565b348015610ab257600080fd5b50610abb611cc6565b60405161066f919061481a565b348015610ad457600080fd5b50601c546107099062010000900460ff1681565b348015610af457600080fd5b5061068e60145481565b348015610b0a57600080fd5b5060335461070990600160a01b900460ff1681565b348015610b2b57600080fd5b5061068e601a5481565b348015610b4157600080fd5b5061063b610b5036600461474c565b611deb565b348015610b6157600080fd5b50610b6a611f1c565b60405161066f9392919061482d565b348015610b8557600080fd5b5061068e602f5481565b348015610b9b57600080fd5b5061063b612096565b348015610bb057600080fd5b50601c5461070990600160281b900460ff1681565b348015610bd157600080fd5b50601c5461070990600160401b900460ff1681565b348015610bf257600080fd5b5061063b61223c565b348015610c0757600080fd5b5061068e601d5481565b348015610c1d57600080fd5b5061068e60255481565b348015610c3357600080fd5b5061068e60205481565b348015610c4957600080fd5b5061068e60135481565b348015610c5f57600080fd5b5061068e60155481565b348015610c7557600080fd5b506013546017541015610709565b348015610c8f57600080fd5b50601c5461070990600160301b900460ff1681565b348015610cb057600080fd5b50601c54610709906301000000900460ff1681565b348015610cd157600080fd5b5061068e600d5481565b348015610ce757600080fd5b5061068e610cf636600461474c565b60066020526000908152604090205481565b348015610d1457600080fd5b5061063b610d2336600461474c565b61229b565b348015610d3457600080fd5b50602a54610662906001600160a01b031681565b348015610d5457600080fd5b50601c5461070990600160201b900460ff1681565b348015610d7557600080fd5b50600054610662906001600160a01b031681565b348015610d9557600080fd5b5061063b61232f565b348015610daa57600080fd5b5061063b612502565b348015610dbf57600080fd5b50610709610dce36600461474c565b60086020526000908152604090205460ff1681565b348015610def57600080fd5b50610709610dfe36600461474c565b600a6020526000908152604090205460ff1681565b348015610e1f57600080fd5b50610662612565565b348015610e3457600080fd5b50603254610662906001600160a01b031681565b348015610e5457600080fd5b5061068e601b5481565b348015610e6a57600080fd5b5060155461068e565b348015610e7f57600080fd5b5061068e60195481565b348015610e9557600080fd5b5061063b6125d8565b348015610eaa57600080fd5b50610709610eb936600461474c565b602e6020526000908152604090205460ff1681565b348015610eda57600080fd5b5061063b61269c565b348015610eef57600080fd5b50603054610662906001600160a01b031681565b348015610f0f57600080fd5b50601c5461070990610100900460ff1681565b348015610f2e57600080fd5b5061068e600e5481565b348015610f4457600080fd5b5061068e612aa2565b348015610f5957600080fd5b5061063b610f683660046148a2565b612aaf565b348015610f7957600080fd5b5061068e601e5481565b348015610f8f57600080fd5b50603654610662906001600160a01b031681565b348015610faf57600080fd5b5060145461068e565b348015610fc457600080fd5b5061063b612c47565b348015610fd957600080fd5b5061063b612cc6565b348015610fee57600080fd5b5061068e612d63565b34801561100357600080fd5b5060105461068e565b34801561101857600080fd5b5061063b61102736600461474c565b612d6e565b34801561103857600080fd5b5060135461068e565b34801561104d57600080fd5b5061068e61105c36600461474c565b60036020526000908152604090205481565b34801561107a57600080fd5b506016544211610709565b34801561109157600080fd5b5061068e600c5481565b3480156110a757600080fd5b50602854610662906001600160a01b031681565b3480156110c757600080fd5b5061063b6110d636600461474c565b612ddf565b3480156110e757600080fd5b506107096110f63660046148c4565b612dff565b34801561110757600080fd5b506106e761304e565b34801561111c57600080fd5b50602754610662906001600160a01b031681565b34801561113c57600080fd5b5061068e60105481565b34801561115257600080fd5b5061068e60185481565b34801561116857600080fd5b5061068e601f5481565b3332146111c15760405162461bcd60e51b815260206004820152601e60248201527f63616e277420636f6e747269627574652076696120636f6e7472616374730000604482015260640161049f565b601a5442116112225760405162461bcd60e51b815260206004820152602760248201527f496e2077686974656c6973742064697361626c656420636f6f6c204f666620696044820152661b9d195c9b985b60ca1b606482015260840161049f565b6015544210158015611235575060165442105b6112725760405162461bcd60e51b815260206004820152600e60248201526d49444f206e6f742061637469766560901b604482015260640161049f565b3360009081526009602052604090205460ff16156112a25760405162461bcd60e51b815260040161049f906144f0565b601c5462010000900460ff16156112e257336000908152600a602052604090205460ff166112e25760405162461bcd60e51b815260040161049f90614523565b346112ed828261305b565b60006112f8826130fc565b9050816017600082825461130c919061457a565b909155505060408051838152602081018390526001600160a01b0385169133917f623b3804fa71d67900d064613da8f94b9617215ee90799290593e1745087ad18910160405180910390a3505050565b6001805461136990614917565b80601f016020809104026020016040519081016040528092919081815260200182805461139590614917565b80156113e25780601f106113b7576101008083540402835291602001916113e2565b820191906000526020600020905b8154815290600101906020018083116113c557829003601f168201915b505050505081565b60008060118101546017546014546114029190614567565b1090506016544211806114125750805b91505090565b600080546001600160a01b0316331461143057600080fd5b601c54600160201b900460ff161561145a5760405162461bcd60e51b815260040161049f90614961565b8251602a80546001600160a01b039283166001600160a01b031991821617909155602085015160288054919093169116179055601c8054831515600160281b0260ff60281b199091161790556114ae61311f565b604051600080516020614e0883398151915290600090a150601c805460ff60201b1916600160201b17905560015b92915050565b602b81600381106114f257600080fd5b01546001600160a01b0316905081565b3360009081526009602052604090205460ff16156115565760405162461bcd60e51b8152602060048201526011602482015270616c726561647920726566756e6465642160781b604482015260640161049f565b33600090815260026020526040902054806115a65760405162461bcd60e51b815260206004820152601060248201526f6e6f7468696e6720746f20636c61696d60801b604482015260640161049f565b601c54600160201b900460ff16156115f55760405162461bcd60e51b8152602060048201526012602482015271616c72656164792066696e616c697a65642160701b604482015260640161049f565b601c54600160281b900460ff161561164f5760405162461bcd60e51b815260206004820152601d60248201527f616c72656164792073756363657366756c6c792066696e616c697a6564000000604482015260640161049f565b60195460165461165f9190614567565b42106116aa5760405162461bcd60e51b815260206004820152601a6024820152797769746864726177616c2077696e646f7720657870697265642160301b604482015260640161049f565b3360009081526005602052604090208190556017546116ca908290614567565b601755336000818152600960205260409020805460ff191660011790556116f1908261315d565b50565b6028546001600160a01b0316331461170b57600080fd5b601c54600160301b900460ff1661175f5760405162461bcd60e51b81526020600482015260186024820152771d995cdd1a5b99c8185b1c9958591e48191a5cd8589b195960421b604482015260640161049f565b601c54600160201b900460ff16156117895760405162461bcd60e51b815260040161049f90614961565b601c805460ff60301b19169055565b6028546001600160a01b031633146117c25760405162461bcd60e51b815260040161049f90614994565b601c54600160201b900460ff16156118195760405162461bcd60e51b815260206004820152601a60248201527970726573616c6520616c72656164792066696e616c697a65642160301b604482015260640161049f565b601c805460ff60401b1916600160401b179055602454601b54600a9161183e916149cb565b61184891906149e2565b601b55565b601c54600160381b900460ff16156118775760405162461bcd60e51b815260040161049f90614a04565b601c54600160301b900460ff16156118dc5760405162461bcd60e51b815260206004820152602260248201527f706c65617365207573652076657374696e67206d6574686f6420746f20636c61604482015261696d60f01b606482015260840161049f565b601c54600160201b900460ff166119055760405162461bcd60e51b815260040161049f90614a32565b601c54600160281b900460ff1661192e5760405162461bcd60e51b815260040161049f90614a5e565b33600090815260026020526040812054900361195c5760405162461bcd60e51b815260040161049f90614a87565b601054336000908152600260205260408120549091670de0b6b3a76400009161198591906149cb565b61198f91906149e2565b3360008181526002602052604080822091909155602754905163a9059cbb60e01b81529293506001600160a01b03169163a9059cbb916119d3918590600401614ac8565b6020604051808303816000875af11580156119f2573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611a169190614ae1565b5033600090815260046020526040902055565b600080546001600160a01b03163314611a4157600080fd5b601c54600160201b900460ff1615611a8f5760405162461bcd60e51b8152602060048201526011602482015270185b1c9958591e48199a5b985b1a5e9959607a1b604482015260640161049f565b611a976113ea565b611ad05760405162461bcd60e51b815260206004820152600a6024820152691b9bdd0818db1bdcd95960b21b604482015260640161049f565b8351602a80546001600160a01b039283166001600160a01b031991821617909155602086015160288054919093169116179055601c8054831515600160281b0260ff60281b1990911617905560135460175410158015611b395750601c54600160281b900460ff165b15611b6057602854602a54611b5b916001600160a01b03908116911685613295565b611b68565b611b6861311f565b42601f55604051600080516020614e0883398151915290600090a150601c805460ff60201b1916600160201b17905560019392505050565b60408051600280825260608083018452600093909284928392602083019080368337019050509050611bd0612565565b81600081518110611be357611be361494b565b60200260200101906001600160a01b031690816001600160a01b0316815250508581600181518110611c1757611c1761494b565b6001600160a01b03928316602091820292909201015260305460405163d06ca61f60e01b815291169063d06ca61f90611c569088908590600401614afe565b600060405180830381865afa158015611c73573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052611c9b9190810190614b1f565b925082600181518110611cb057611cb061494b565b6020026020010151915081935050505092915050565b60606000600d546001600160401b03811115611ce457611ce461461a565b604051908082528060200260200182016040528015611d0d578160200160208202803683370190505b50905060005b600d54811015611de5576000818152600b60209081526040808320546001600160a01b03168352600a90915290205460ff1615611d9e576000818152600b602052604090205482516001600160a01b0390911690839083908110611d7957611d7961494b565b60200260200101906001600160a01b031690816001600160a01b031681525050611dd3565b6000828281518110611db257611db261494b565b60200260200101906001600160a01b031690816001600160a01b0316815250505b80611ddd8161458d565b915050611d13565b50919050565b6001600160a01b038116611e405760405162461bcd60e51b815260206004820152601c60248201527b31bab93932b731bc9031b0b73737ba103132902d32b9379030b2323960211b604482015260640161049f565b6001600160a01b0381166000908152602e602052604090205460ff16611ea15760405162461bcd60e51b81526020600482015260166024820152751a5b9d985b1a5908185cdcd95d081cd95b1958dd195960521b604482015260640161049f565b603354600160a01b900460ff1615611ecb5760405162461bcd60e51b815260040161049f90614bc4565b6028546001600160a01b03163314611ef55760405162461bcd60e51b815260040161049f90614bf8565b603480546001600160a81b0319166001600160a01b0390921691909117600160a01b179055565b611f246144b3565b611f2c6144d2565b6060611f366144b3565b611f3e6144d2565b5050604080516101408101825260135481526014546020808301919091526011548284015260125460608084019190915260155460808085019190915260165460a085015260175460c085015260105460e085015260225461010085015260215461012085015284519081018552601c5460ff600160201b8204811615158352600160281b82048116151594830194909452600160301b81048416151595820195909552600160381b9094049091161515908301526001805491929183918391819061200990614917565b80601f016020809104026020016040519081016040528092919081815260200182805461203590614917565b80156120825780601f1061205757610100808354040283529160200191612082565b820191906000526020600020905b81548152906001019060200180831161206557829003601f168201915b505050505090509450945094505050909192565b6028546001600160a01b031633146120c05760405162461bcd60e51b815260040161049f90614994565b601c54600160201b900460ff166120e95760405162461bcd60e51b815260040161049f90614c29565b601c54600160281b900460ff16156121135760405162461bcd60e51b815260040161049f90614c59565b6027546028546040516370a0823160e01b81526001600160a01b039283169263a9059cbb92169083906370a08231906121509030906004016145a6565b602060405180830381865afa15801561216d573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906121919190614c85565b6040518363ffffffff1660e01b81526004016121ae929190614ac8565b6020604051808303816000875af11580156121cd573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906121f19190614ae1565b61223a5760405162461bcd60e51b815260206004820152601a60248201527963616e6e6f74207472616e7366657220746f6b656e206261636b60301b604482015260640161049f565b565b6000546001600160a01b0316331461225357600080fd5b600080546040516001600160a01b03909116917ff8df31144d9c2f0f6b59d69b8b98abd5459d07f2742c4df920b25aae33c6482091a2600080546001600160a01b0319169055565b6000546001600160a01b031633146122b257600080fd5b6001600160a01b0381166000908152600a602052604090205460ff1661230e5760405162461bcd60e51b81526020600482015260116024820152706e6f7420696e2077686974656c6973742160781b604482015260640161049f565b6001600160a01b03166000908152600a60205260409020805460ff19169055565b6028546001600160a01b031633146123595760405162461bcd60e51b815260040161049f90614994565b602554601f54612369919061457a565b421161237457600080fd5b601c54600160201b900460ff1661239d5760405162461bcd60e51b815260040161049f90614c29565b601c54600160281b900460ff166123c65760405162461bcd60e51b815260040161049f90614c59565b60006010546017546014546123db9190614567565b6123e591906149cb565b69021e19e0c9bab24000006023546021546022546017546014546124099190614567565b61241391906149cb565b61241d91906149cb565b61242791906149cb565b61243191906149e2565b61243b919061457a565b60275460315460405163a9059cbb60e01b81529293506001600160a01b039182169263a9059cbb926124739216908590600401614ac8565b6020604051808303816000875af1158015612492573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906124b69190614ae1565b6116f15760405162461bcd60e51b815260206004820152601d60248201527f63616e6e6f74207472616e7366657220746f6b656e20746f2064656164000000604482015260640161049f565b603354600160a01b900460ff161561252c5760405162461bcd60e51b815260040161049f90614bc4565b6028546001600160a01b031633146125565760405162461bcd60e51b815260040161049f90614bf8565b6034805460ff60a01b19169055565b603054604080516315ab88c960e31b815290516000926001600160a01b03169163ad5c46489160048083019260209291908290030181865afa1580156125af573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906125d39190614c9e565b905090565b601c54600160201b900460ff166126215760405162461bcd60e51b815260206004820152600d60248201526c1b9bdd08199a5b985b1a5e9959609a1b604482015260640161049f565b601354601754108061263d5750601c54600160281b900460ff16155b6126935760405162461bcd60e51b815260206004820152602160248201527f676f616c2072656163686564206f722070726573616c652073756363656564656044820152601960fa1b606482015260840161049f565b61223a33613543565b601c54600160381b900460ff16156126c65760405162461bcd60e51b815260040161049f90614a04565b601c54600160301b900460ff166127155760405162461bcd60e51b81526020600482015260136024820152721d995cdd1a5b99c81b9bdd08195b98589b1959606a1b604482015260640161049f565b601c54600160201b900460ff1661273e5760405162461bcd60e51b815260040161049f90614a32565b601c54600160281b900460ff166127675760405162461bcd60e51b815260040161049f90614a5e565b3360009081526002602052604081205490036127955760405162461bcd60e51b815260040161049f90614a87565b601e5433600090815260066020526040902054106127e95760405162461bcd60e51b8152602060048201526011602482015270185b1b081d1bdad95b9cc81d995cdd1959607a1b604482015260640161049f565b6000602054601f54426127fc9190614567565b61280691906149e2565b61281190600161457a565b9050601e5481106128215750601e545b3360009081526006602052604081205461283b9083614567565b905060008111801561284f5750601e548111155b6128965760405162461bcd60e51b81526020600482015260186024820152776e6f7420696e207573657220636c61696d2077696e646f7760401b604482015260640161049f565b336000908152600660209081526040808320859055601e5460105460039093529083205490918491670de0b6b3a7640000916128d1916149cb565b6128db91906149e2565b6128e591906149cb565b6128ef91906149e2565b6010543360009081526002602052604081205492935091670de0b6b3a764000091612919916149cb565b61292391906149e2565b9050808211156129755760405162461bcd60e51b815260206004820152601d60248201527f63616e277420636c61696d206d6f7265207468616e20616c6c6f776564000000604482015260640161049f565b601e54336000908152600360205260408120549091906129969086906149cb565b6129a091906149e2565b3360009081526002602052604090205490915081106129ce57336000908152600260205260408120556129fa565b336000908152600260205260409020546129e9908290614567565b336000908152600260205260409020555b60275460405163a9059cbb60e01b81526001600160a01b039091169063a9059cbb90612a2c9033908790600401614ac8565b6020604051808303816000875af1158015612a4b573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612a6f9190614ae1565b5033600090815260046020526040902054612a8b90849061457a565b336000908152600460205260409020555050505050565b60006011815b0154905090565b60018211612b095760405162461bcd60e51b815260206004820152602160248201527f6e756d206f6620766573742068617320746f2062652067727472207468616e206044820152603160f81b606482015260840161049f565b60008111612b525760405162461bcd60e51b81526020600482015260166024820152751d995cdd1a5b99c81c195c9a5bd9081a5b9d985b1a5960521b604482015260640161049f565b610258601554612b629190614567565b4210612bbe5760405162461bcd60e51b815260206004820152602560248201527f63616e277420656e61626c6520766573742061667465722070726573616c65206044820152641cdd185c9d60da1b606482015260840161049f565b601c54600160301b900460ff1615612c125760405162461bcd60e51b81526020600482015260176024820152761d995cdd1a5b99c8185b1c9958591e48195b98589b1959604a1b604482015260640161049f565b6028546001600160a01b03163314612c2957600080fd5b601c805460ff60301b1916600160301b179055601e91909155602055565b6000546001600160a01b03163314612c5e57600080fd5b601c5462010000900460ff1615612cb35760405162461bcd60e51b81526020600482015260196024820152781dda1a5d195b1a5cdd08185b1c9958591e48195b98589b1959603a1b604482015260640161049f565b601c805462ff0000191662010000179055565b6000546001600160a01b03163314612cdd57600080fd5b601c5462010000900460ff16612d325760405162461bcd60e51b815260206004820152601a6024820152791dda1a5d195b1a5cdd08185b1c9958591e48191a5cd8589b195960321b604482015260640161049f565b601c805462ff000019169055601854612d4b904261457a565b601a55601c805463ff00000019166301000000179055565b600060116001612aa8565b6000546001600160a01b03163314612d8557600080fd5b6001600160a01b0381166000818152600a60209081526040808320805460ff19166001179055600d80548452600b909252822080546001600160a01b03191690931790925581549190612dd78361458d565b919050555050565b6000546001600160a01b03163314612df657600080fd5b6116f18161369c565b600080546001600160a01b03163314612e1757600080fd5b601c54600160401b900460ff16613043576001600160a01b038516612e7b5760405162461bcd60e51b815260206004820152601a602482015279706c6174666f726d20616464722063616e74206265207a65726f60301b604482015260640161049f565b600068056bc75e2d63100000601b54601054601754612e9a91906149cb565b612ea491906149cb565b612eae91906149e2565b905060008315612fc9576064612ec486846149cb565b612ece91906149e2565b6027549091506001600160a01b031663a9059cbb88612eed8486614567565b6040518363ffffffff1660e01b8152600401612f0a929190614ac8565b6020604051808303816000875af1158015612f29573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612f4d9190614ae1565b5060275460405163a9059cbb60e01b81526001600160a01b039091169063a9059cbb90612f809089908590600401614ac8565b6020604051808303816000875af1158015612f9f573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612fc39190614ae1565b50613040565b60275460405163a9059cbb60e01b81526001600160a01b039091169063a9059cbb90612ffb908a908690600401614ac8565b6020604051808303816000875af115801561301a573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061303e9190614ae1565b505b50505b506001949350505050565b6037805461136990614917565b60115434101561306a57600080fd5b60125434111561307957600080fd5b6014548160175461308a919061457a565b11156130d85760405162461bcd60e51b815260206004820152601f60248201527f636f6e747269627574696f6e207265616368696e67206f766572206863617000604482015260640161049f565b6001600160a01b0382166130eb57600080fd5b806000036130f857600080fd5b5050565b6000670de0b6b3a76400006010548361311591906149cb565b6114dc91906149e2565b601c805460ff60381b1916600160381b1790556040517f599d8e5a83cffb867d051598c4d70e805d59802d8081c1c7d6dffc5b6aca2b8990600090a1565b6000606461316c8360146149cb565b61317691906149e2565b905060006131848284614567565b6001600160a01b0385811660009081526002602090815260408083208390556003909152808220829055602954905193945090911691849181818185875af1925050503d80600081146131f3576040519150601f19603f3d011682016040523d82523d6000602084013e6131f8565b606091505b50506040516001600160a01b03861691508290600081818185875af1925050503d8060008114613244576040519150601f19603f3d011682016040523d82523d6000602084013e613249565b606091505b505050836001600160a01b03167f7e77c11526f6439d832e432cabb72ef2aaa7e1677ca8b9509c14df61fba190d28460405161328791815260200190565b60405180910390a250505050565b601c54600160201b900460ff16156132bf5760405162461bcd60e51b815260040161049f90614961565b6040517f1cdde67b72a90f19919ac732a437ac2f7a10fc128d28c2a6e525d89ce5cd9d3a90600090a160006064601b54476132fa91906149cb565b61330491906149e2565b905081156133da576000606461331a84846149cb565b61332491906149e2565b9050836001600160a01b03168160405160006040518083038185875af1925050503d8060008114613371576040519150601f19603f3d011682016040523d82523d6000602084013e613376565b606091505b50506029546001600160a01b031690506133908284614567565b604051600081818185875af1925050503d80600081146133cc576040519150601f19603f3d011682016040523d82523d6000602084013e6133d1565b606091505b50505050613430565b6029546040516001600160a01b03909116908290600081818185875af1925050503d8060008114613427576040519150601f19603f3d011682016040523d82523d6000602084013e61342c565b606091505b5050505b600060646021544761344291906149cb565b61344c91906149e2565b90508047101561349c5760405162461bcd60e51b815260206004820152601b60248201527a2737ba1022b737bab3b410233ab732103a37902a3930b739b332b960291b604482015260640161049f565b6134e469021e19e0c9bab24000006023546021546022546017546134c091906149cb565b6134ca91906149cb565b6134d491906149cb565b6134de91906149e2565b8261370a565b471561353c576040516001600160a01b038616904790600081818185875af1925050503d8060008114613533576040519150601f19603f3d011682016040523d82523d6000602084013e613538565b606091505b5050505b5050505050565b601c54600160381b900460ff166135915760405162461bcd60e51b81526020600482015260126024820152711c99599d5b99081b9bdd08195b98589b195960721b604482015260640161049f565b6001600160a01b038116600090815260026020526040902054806135f75760405162461bcd60e51b815260206004820152601f60248201527f5573657220686173206e6f20696e766573746d656e7420746f20636c61696d00604482015260640161049f565b6001600160a01b03821660008181526002602052604080822082905551839181818185875af1925050503d806000811461364d576040519150601f19603f3d011682016040523d82523d6000602084013e613652565b606091505b505050816001600160a01b03167fd7dee2702d63ad89917b6a4da9981c90c4d24f8c2bdfd64c604ecae57d8d06518260405161369091815260200190565b60405180910390a25050565b6001600160a01b0381166136af57600080fd5b600080546040516001600160a01b03808516939216917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e091a3600080546001600160a01b0319166001600160a01b0392909216919091179055565b806000606461371a83605a6149cb565b61372491906149e2565b9050600060235485606461373891906149cb565b61374291906149e2565b90506000606461375383605a6149cb565b61375d91906149e2565b90506000806000603460149054906101000a900460ff16156138a15761378288613edd565b60275460345461379e916001600160a01b0390811691166140d5565b603280546001600160a01b0319166001600160a01b039283169081179091556034546040516370a0823160e01b81529216916370a08231916137e2916004016145a6565b602060405180830381865afa1580156137ff573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906138239190614c85565b6027546032546040516370a0823160e01b81529295506001600160a01b03918216926370a08231926138599216906004016145a6565b602060405180830381865afa158015613876573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061389a9190614c85565b91506139d2565b6027546138be906001600160a01b03166138b9612565565b6140d5565b603280546001600160a01b0319166001600160a01b03929092169190911790556138e6612565565b6032546040516370a0823160e01b81526001600160a01b03928316926370a0823192613917929116906004016145a6565b602060405180830381865afa158015613934573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906139589190614c85565b6027546032546040516370a0823160e01b81529295506001600160a01b03918216926370a082319261398e9216906004016145a6565b602060405180830381865afa1580156139ab573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906139cf9190614c85565b91505b6032546001600160a01b0316158015906139f557506000831180156139f5575081155b15613af45786613a0584876149cb565b613a0f91906149e2565b60275460325460405163a9059cbb60e01b81529293506001600160a01b039182169263a9059cbb92613a479216908590600401614ac8565b6020604051808303816000875af1158015613a66573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613a8a9190614ae1565b50603260009054906101000a90046001600160a01b03166001600160a01b031663fff6cae96040518163ffffffff1660e01b8152600401600060405180830381600087803b158015613adb57600080fd5b505af1158015613aef573d6000803e3d6000fd5b505050505b602754613b09906001600160a01b0316614383565b50603454600160a01b900460ff1615613cda576030546027546034546040516370a0823160e01b81526001600160a01b039384169363e8e337009381169216908d9082906370a0823190613b619030906004016145a6565b602060405180830381865afa158015613b7e573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613ba29190614c85565b8e603460009054906101000a90046001600160a01b03166001600160a01b03166370a08231306040518263ffffffff1660e01b8152600401613be491906145a6565b602060405180830381865afa158015613c01573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613c259190614c85565b30613c324261012c61457a565b60405160e08a901b6001600160e01b03191681526001600160a01b039889166004820152968816602488015260448701959095526064860193909352608485019190915260a484015290921660c482015260e4810191909152610104016060604051808303816000875af1158015613cae573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613cd29190614cbb565b505050613d9b565b6030546027546001600160a01b039182169163f305d719918a911688888b30613d054261012c61457a565b60405160e089901b6001600160e01b03191681526001600160a01b039687166004820152602481019590955260448501939093526064840191909152909216608482015260a481019190915260c40160606040518083038185885af1158015613d72573d6000803e3d6000fd5b50505050506040513d601f19601f82011682018060405250810190613d979190614cbb565b5050505b6033805460ff60a01b1916600160a01b179055603254603654613dca916001600160a01b039081169116614423565b50603654603254602f546040516370a0823160e01b81526001600160a01b0393841693638a4e6e569316919060379083906370a0823190613e0f9030906004016145a6565b602060405180830381865afa158015613e2c573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613e509190614c85565b6040518563ffffffff1660e01b8152600401613e6f9493929190614ce9565b6020604051808303816000875af1158015613e8e573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613eb29190614c9e565b603380546001600160a01b0319166001600160a01b0392909216919091179055505050505050505050565b603454600160a01b900460ff16613f325760405162461bcd60e51b8152602060048201526019602482015278185b1d0818dd5c9c995b98de481b9bdd081cd95b1958dd1959603a1b604482015260640161049f565b604080516002808252606082018352600092602083019080368337019050509050613f5b612565565b81600081518110613f6e57613f6e61494b565b6001600160a01b039283166020918202929092010152603454825191169082906001908110613f9f57613f9f61494b565b6001600160a01b039283166020918202929092010152603454613fc29116614383565b506030546034546001600160a01b0391821691637ff36ab5918591613fe8911682611ba0565b8430613ff64261012c61457a565b6040518663ffffffff1660e01b81526004016140159493929190614db8565b60006040518083038185885af1158015614033573d6000803e3d6000fd5b50505050506040513d6000823e601f3d908101601f1916820160405261405c9190810190614b1f565b506034546040516370a0823160e01b81526001600160a01b03909116906370a082319061408d9030906004016145a6565b602060405180830381865afa1580156140aa573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906140ce9190614c85565b6035555050565b6000806001600160a01b0316603060009054906101000a90046001600160a01b03166001600160a01b031663c45a01556040518163ffffffff1660e01b8152600401602060405180830381865afa158015614134573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906141589190614c9e565b6001600160a01b031663e6a4390585856040518363ffffffff1660e01b8152600401614185929190614ded565b602060405180830381865afa1580156141a2573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906141c69190614c9e565b6001600160a01b0316146142c057603060009054906101000a90046001600160a01b03166001600160a01b031663c45a01556040518163ffffffff1660e01b8152600401602060405180830381865afa158015614227573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061424b9190614c9e565b6001600160a01b031663e6a4390584846040518363ffffffff1660e01b8152600401614278929190614ded565b602060405180830381865afa158015614295573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906142b99190614c9e565b90506114dc565b603060009054906101000a90046001600160a01b03166001600160a01b031663c45a01556040518163ffffffff1660e01b8152600401602060405180830381865afa158015614313573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906143379190614c9e565b6001600160a01b031663c9c6539684846040518363ffffffff1660e01b8152600401614364929190614ded565b6020604051808303816000875af1158015614295573d6000803e3d6000fd5b60305460405163095ea7b360e01b81526000917606e8aff4357fd6c8924f7875b89f9cf5f554c3db737e95604d1b916001600160a01b038581169263095ea7b3926143d692909116908590600401614ac8565b6020604051808303816000875af11580156143f5573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906144199190614ae1565b5060019392505050565b60405163095ea7b360e01b81526000907606e8aff4357fd6c8924f7875b89f9cf5f554c3db737e95604d1b906001600160a01b0385169063095ea7b3906144709086908590600401614ac8565b6020604051808303816000875af115801561448f573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906130439190614ae1565b604051806101400160405280600a906020820280368337509192915050565b60405180608001604052806004906020820280368337509192915050565b60208082526019908201527855736572207573656420616e7974696d6520726566756e642160381b604082015260600190565b6020808252601490820152731d5cd95c881b9bdd081dda1a5d195b1a5cdd195960621b604082015260600190565b634e487b7160e01b600052601160045260246000fd5b818103818111156114dc576114dc614551565b808201808211156114dc576114dc614551565b60006001820161459f5761459f614551565b5060010190565b6001600160a01b0391909116815260200190565b6000815180845260005b818110156145e0576020818501810151868301820152016145c4565b506000602082860101526020601f19601f83011685010191505092915050565b60208152600061461360208301846145ba565b9392505050565b634e487b7160e01b600052604160045260246000fd5b604051601f8201601f191681016001600160401b03811182821017156146585761465861461a565b604052919050565b6001600160a01b03811681146116f157600080fd5b600082601f83011261468657600080fd5b604080519081016001600160401b03811182821017156146a8576146a861461a565b80604052508060408401858111156146bf57600080fd5b845b818110156146e25780356146d481614660565b8352602092830192016146c1565b509195945050505050565b80151581146116f157600080fd5b6000806060838503121561470e57600080fd5b6147188484614675565b91506040830135614728816146ed565b809150509250929050565b60006020828403121561474557600080fd5b5035919050565b60006020828403121561475e57600080fd5b813561461381614660565b60008060006080848603121561477e57600080fd5b6147888585614675565b925060408401359150606084013561479f816146ed565b809150509250925092565b600080604083850312156147bd57600080fd5b82356147c881614660565b946020939093013593505050565b600081518084526020808501945080840160005b8381101561480f5781516001600160a01b0316875295820195908201906001016147ea565b509495945050505050565b60208152600061461360208301846147d6565b60006101e08286835b600a811015614855578151835260209283019290910190600101614836565b50505061014083018560005b60048110156148825781511515835260209283019290910190600101614861565b505050806101c0840152614898818401856145ba565b9695505050505050565b600080604083850312156148b557600080fd5b50508035926020909101359150565b600080600080608085870312156148da57600080fd5b84356148e581614660565b935060208501356148f581614660565b925060408501359150606085013561490c816146ed565b939692955090935050565b600181811c9082168061492b57607f821691505b602082108103611de557634e487b7160e01b600052602260045260246000fd5b634e487b7160e01b600052603260045260246000fd5b6020808252601990820152781c1c995cd85b1948185b1c9958591e48199a5b985b1a5e9959603a1b604082015260600190565b6020808252601f908201527f696e69746961746f72206973206e6f742070726573616c65206f776e65722100604082015260600190565b80820281158282048414176114dc576114dc614551565b6000826149ff57634e487b7160e01b600052601260045260246000fd5b500490565b6020808252601490820152731c1c995cd85b19481dd85cc81c99599d5b99195960621b604082015260600190565b6020808252601290820152714e6f742046696e616c697a6564207965742160701b604082015260600190565b6020808252600f908201526e70726573616c65204661696c65642160881b604082015260600190565b60208082526021908201527f7573657220686173206e6f206d6f726520746f6b656e7320746f20636c61696d6040820152602160f81b606082015260800190565b6001600160a01b03929092168252602082015260400190565b600060208284031215614af357600080fd5b8151614613816146ed565b828152604060208201526000614b1760408301846147d6565b949350505050565b60006020808385031215614b3257600080fd5b82516001600160401b0380821115614b4957600080fd5b818501915085601f830112614b5d57600080fd5b815181811115614b6f57614b6f61461a565b8060051b9150614b80848301614630565b8181529183018401918481019088841115614b9a57600080fd5b938501935b83851015614bb857845182529385019390850190614b9f565b98975050505050505050565b6020808252601a90820152794c697175696469747920697320616464656420616c726561647960301b604082015260600190565b6020808252601790820152763737ba103a343290383932b9b0b6329031b932b0ba37b960491b604082015260600190565b60208082526016908201527570726573616c65206e6f742066696e616c697a65642160501b604082015260600190565b602080825260129082015271199a5b985b1a5e99481dd85cc81d985b1a5960721b604082015260600190565b600060208284031215614c9757600080fd5b5051919050565b600060208284031215614cb057600080fd5b815161461381614660565b600080600060608486031215614cd057600080fd5b8351925060208401519150604084015190509250925092565b6001600160a01b03851681526020808201859052608060408301528354600091908290600181811c9082811680614d2157607f831692505b8583108103614d3e57634e487b7160e01b85526022600452602485fd5b6080880183905260a08801818015614d5d5760018114614d7357614d9e565b60ff198616825284151560051b82019650614d9e565b60008c81526020902060005b86811015614d9857815484820152908501908901614d7f565b83019750505b505050505050809250505082606083015295945050505050565b848152608060208201526000614dd160808301866147d6565b6001600160a01b03949094166040830152506060015292915050565b6001600160a01b039283168152911660208201526040019056fe6823b073d48d6e3a7d385eeb601452d680e74bb46afe3255a7d778f3a9b17681a26469706673582212202f9f138143131bea58395a3db980dac951446c43ef745ff4f7e706fe998173e264736f6c63430008110033a2646970667358221220fd793be96e6dc95f7b6f7eddc507ce53a033415bb67b2fa476fe5dfc0a0b731064736f6c634300081100330000000000000000000000000febb541ef3632925cd67daf9e82cdc8ec7a71ef000000000000000000000000a27ea368c4198a288eb552d642b1e5acc29912d400000000000000000000000029219dd400f2bf60e5a23d13be72b486d403889400000000000000000000000029219dd400f2bf60e5a23d13be72b486d403889400000000000000000000000029219dd400f2bf60e5a23d13be72b486d4038894
Deployed Bytecode
0x60806040523480156200001157600080fd5b5060043610620000a65760003560e01c80631ab8f86414620000ab57806325cfdf5e14620000c8578063417d4add14620000e1578063715018a614620000f85780637e17465814620001025780638c2f037d14620001285780638da5cb5b146200013f578063acedf07c1462000153578063d7c94efd146200016a578063f2fde38b1462000174578063fc006a8a146200018b575b600080fd5b620000b560075481565b6040519081526020015b60405180910390f35b620000df620000d9366004620005e2565b620001a2565b005b620000df620000f236600462000619565b620001bf565b620000df62000272565b6200011962000113366004620005e2565b620002d2565b604051620000bf919062000648565b620001196200013936600462000760565b620002f3565b60005462000119906001600160a01b031681565b620000df62000164366004620005e2565b620004e8565b620000b560065481565b620000df6200018536600462000820565b62000505565b620000df6200019c36600462000820565b6200052b565b6000546001600160a01b03163314620001ba57600080fd5b600755565b6000546001600160a01b03163314620001d757600080fd5b60018211620002385760405162461bcd60e51b815260206004820152602360248201527f63616e6e6f742075706461746520666565206f72206c7064657020636f6e74726044820152621858dd60ea1b606482015260840160405180910390fd5b80600183600581106200024f576200024f62000845565b0180546001600160a01b0319166001600160a01b03929092169190911790555050565b6000546001600160a01b031633146200028a57600080fd5b600080546040516001600160a01b03909116917ff8df31144d9c2f0f6b59d69b8b98abd5459d07f2742c4df920b25aae33c6482091a2600080546001600160a01b0319169055565b60018160058110620002e357600080fd5b01546001600160a01b0316905081565b60008060405180604001604052808860016004811062000317576200031762000845565b602090810291909101516001600160a01b0390811683526001541691015260608801516040808a01518882015182518084019093529394509192600092918a908690808c87602002015181526020018c6001600581106200037c576200037c62000845565b6020020151905260408051808201909152808d6003602002015181526020018d600460058110620003b157620003b162000845565b60200201518152508b6006548c6007546040518060a0016040528060018060058110620003e257620003e262000845565b01546001600160a01b0390811682528e1660208201526040016001600201546001600160a01b031681526020016001600301546001600160a01b031681526020016001600401546001600160a01b031690526040516200044290620005d4565b620004589b9a99989796959493929190620008b4565b604051809103906000f08015801562000475573d6000803e3d6000fd5b50895160405163f2fde38b60e01b81529192506001600160a01b0383169163f2fde38b91620004a79160040162000648565b600060405180830381600087803b158015620004c257600080fd5b505af1158015620004d7573d6000803e3d6000fd5b50929b9a5050505050505050505050565b6000546001600160a01b031633146200050057600080fd5b600655565b6000546001600160a01b031633146200051d57600080fd5b620005288162000565565b50565b6000546001600160a01b031633146200054357600080fd5b600180546001600160a01b0319166001600160a01b0392909216919091179055565b6001600160a01b0381166200057957600080fd5b600080546040516001600160a01b03808516939216917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e091a3600080546001600160a01b0319166001600160a01b0392909216919091179055565b6155be806200097b83390190565b600060208284031215620005f557600080fd5b5035919050565b80356001600160a01b03811681146200061457600080fd5b919050565b600080604083850312156200062d57600080fd5b823591506200063f60208401620005fc565b90509250929050565b6001600160a01b0391909116815260200190565b634e487b7160e01b600052604160045260246000fd5b604051608081016001600160401b03811182821017156200069757620006976200065c565b60405290565b600082601f830112620006af57600080fd5b604080519081016001600160401b0381118282101715620006d457620006d46200065c565b8060405250806040840185811115620006ec57600080fd5b845b8181101562000708578035835260209283019201620006ee565b509195945050505050565b600082601f8301126200072557600080fd5b60405160a081016001600160401b03811182821017156200074a576200074a6200065c565b6040528060a0840185811115620006ec57600080fd5b60008060008060006101e086880312156200077a57600080fd5b86601f8701126200078a57600080fd5b6200079462000672565b806080880189811115620007a757600080fd5b885b81811015620007cc57620007bd81620005fc565b845260209384019301620007a9565b50819750620007dc8a826200069d565b9650505050620007f08760c0880162000713565b9250620008028761016088016200069d565b915062000814876101a088016200069d565b90509295509295909350565b6000602082840312156200083357600080fd5b6200083e82620005fc565b9392505050565b634e487b7160e01b600052603260045260246000fd5b8060005b6002811015620008805781518452602093840193909101906001016200085f565b50505050565b8060005b6005811015620008805781516001600160a01b03168452602093840193909101906001016200088a565b6001600160a01b038c8116825260208083018d90526102a083019190620008df604085018e6200085b565b608084018c60005b600281101562000908578151851683529183019190830190600101620008e7565b50505050506200091c60c083018a6200085b565b6200092c6101008301896200085b565b6200093c6101408301886200085b565b85610180830152620009536101a08301866200085b565b836101e08301526200096a61020083018462000886565b9c9b50505050505050505050505056fe60c0604052600360809081526249444f60e81b60a052600190620000249082620003de565b506000600f5561025860188190556019556002601b55601c805461ffff19169055601460245562127500602555603180546001600160a01b03191661dead179055604080518082019091526007815266191959985d5b1d60ca1b6020820152603790620000929082620003de565b50348015620000a057600080fd5b50604051620055be380380620055be833981016040819052620000c391620005c5565b600080546001600160a01b03191633179055620000e46011876002620002df565b508651601355602080880151601455895160155589810151601655602780546001600160a01b038e81166001600160a01b03199283161790925588830151601d558a51602880549184169183169190911790558a83015160298054919093169116179055601b859055850151602155845160225560108a905582516200016c906064620006f8565b60235560248290558051603680546001600160a01b03199081166001600160a01b0393841617909155602080840151603080549093169316929092179055830151602f55601b54606490620001c29082620006f8565b670de0b6b3a76400006064602154601454620001df919062000714565b620001eb91906200072e565b602254620001fa919062000714565b6014546010546200020c919062000714565b620002189190620006f8565b6200022491906200072e565b62000230919062000714565b6200023c91906200072e565b602655604081810151602b80546001600160a01b03199081166001600160a01b039384169081179092556060850151602c80548316918516919091178155608090950151602d80549092169084161781556000918252602e602052838220805460ff199081166001908117909255955484168352848320805487168217905590549092168152919091208054909216179055506200075198505050505050505050565b826002810192821562000310579160200282015b8281111562000310578251825591602001919060010190620002f3565b506200031e92915062000322565b5090565b5b808211156200031e576000815560010162000323565b634e487b7160e01b600052604160045260246000fd5b600181811c908216806200036457607f821691505b6020821081036200038557634e487b7160e01b600052602260045260246000fd5b50919050565b601f821115620003d957600081815260208120601f850160051c81016020861015620003b45750805b601f850160051c820191505b81811015620003d557828155600101620003c0565b5050505b505050565b81516001600160401b03811115620003fa57620003fa62000339565b62000412816200040b84546200034f565b846200038b565b602080601f8311600181146200044a5760008415620004315750858301515b600019600386901b1c1916600185901b178555620003d5565b600085815260208120601f198616915b828110156200047b578886015182559484019460019091019084016200045a565b50858210156200049a5787850151600019600388901b60f8161c191681555b5050505050600190811b01905550565b80516001600160a01b0381168114620004c257600080fd5b919050565b604080519081016001600160401b0381118282101715620004ec57620004ec62000339565b60405290565b600082601f8301126200050457600080fd5b6200050e620004c7565b8060408401858111156200052157600080fd5b845b818110156200053d57805184526020938401930162000523565b509095945050505050565b600082601f8301126200055a57600080fd5b60405160a081016001600160401b03811182821017156200057f576200057f62000339565b6040528060a08401858111156200059557600080fd5b845b81811015620005ba57620005ab81620004aa565b83526020928301920162000597565b509195945050505050565b60008060008060008060008060008060006102a08c8e031215620005e857600080fd5b620005f38c620004aa565b9a5060208c015199506200060b8d60408e01620004f2565b98508c609f8d01126200061d57600080fd5b62000627620004c7565b808e60c08f0111156200063957600080fd5b60808e015b60c08f0181101562000664576200065581620004aa565b8352602092830192016200063e565b5098506200067890508d60c08e01620004f2565b96506200068a8d6101008e01620004f2565b95506200069c8d6101408e01620004f2565b94506101808c01519350620006b68d6101a08e01620004f2565b92506101e08c01519150620006d08d6102008e0162000548565b90509295989b509295989b9093969950565b634e487b7160e01b600052601160045260246000fd5b808201808211156200070e576200070e620006e2565b92915050565b80820281158282048414176200070e576200070e620006e2565b6000826200074c57634e487b7160e01b600052601260045260246000fd5b500490565b614e5d80620007616000396000f3fe60806040526004361061044d5760003560e01c806306e29712146106425780630f98c918146106785780631096f46a1461069c57806310ef82c5146106bc5780631265d6e7146106d25780631515bc2b146106f4578063158ef93e146107195780631ab8f864146107335780631bd49653146107495780631c8d67491461075f5780631dfaced41461077f5780631e12353e1461079f5780631edd40ae146107d55780631f4ba804146107ea5780631f6d494214610800578063249b7c191461082d578063252a02eb146108425780632698d7071461087857806329279ce91461088d5780632a592e9f146108a35780632fc9b686146108d05780633197cbb6146109005780633675f29b1461091657806336cf7c871461093657806337ce1647146109565780633bff8ed7146109775780633cb650d0146109a45780634042b66f146109b9578063422099b2146109cf5780634879ef26146109e457806348c54b9d14610a1a5780634c4a386f14610a2f5780634d2a907314610a505780634de64b8114610a705780634e4153bb14610a905780635122907714610aa657806351fb012d14610ac8578063585e1af614610ae85780635a0e779b14610afe5780635f9bae3214610b1f5780636008405914610b3557806361644ca814610b5557806361c533b414610b7957806363c1805814610b8f5780636ac8d0c214610ba45780636e27607a14610bc5578063715018a614610be657806371beb4e114610bfb57806372f256f214610c115780637313ee5a14610c2757806378e2df0e14610c3d57806378e9792514610c535780637d3d652214610c695780637f87bbd614610c835780638190eefd14610ca457806382efbbec14610cc5578063844faace14610cdb5780638ab1d68114610d085780638b6ea1cf14610d285780638d4e408314610d485780638da5cb5b14610d69578063940bb34414610d895780639774748014610d9e578063995c5e9d14610db35780639b19251a14610de35780639b33d9d114610e135780639fe4cb9414610e28578063a7b17c8214610e48578063a82524b214610e5e578063b444e16214610e73578063b5545a3c14610e89578063b7a871c914610e9e578063b89918e014610ece578063b94a6dfe14610ee3578063bab80d1414610f03578063bc2eae0c14610f22578063be11ce2f14610f38578063be5ef81a14610f4d578063bf3f15bf14610f6d578063c3abb76614610f83578063c758e79214610fa3578063cdfb2b4e14610fb8578063d6b0f48414610fcd578063db37ceec14610fe2578063e132db4114610ff7578063e43252d71461100c578063e4c21cf21461102c578063e5658e1a14611041578063e580b2b01461106e578063ecfd892814611085578063ef67a5e21461109b578063f2fde38b146110bb578063f6e99c0d146110db578063fb7f21eb146110fb578063fc0c546a14611110578063fc37987b14611130578063fcb3747314611146578063fe67a1891461115c57600080fd5b3661063d57601a5442116104a85760405162461bcd60e51b815260206004820152601e60248201527f496e2077686974656c6973742064697361626c656420636f6f6c204f6666000060448201526064015b60405180910390fd5b3360009081526009602052604090205460ff16156104d85760405162461bcd60e51b815260040161049f906144f0565b601c5462010000900460ff161561051857336000908152600a602052604090205460ff166105185760405162461bcd60e51b815260040161049f90614523565b34601d546105269190614567565b3360009081526002602052604090205411156105845760405162461bcd60e51b815260206004820152601d60248201527f636f6e747269627574696f6e206f766572206d617820616c6c6f776564000000604482015260640161049f565b61058d33611172565b33600090815260026020526040812080543492906105ac90849061457a565b909155505033600090815260036020526040812080543492906105d090849061457a565b90915550503360009081526008602052604090205460ff1661063b57600c8054600090815260076020908152604080832080546001600160a01b03191633908117909155835260089091528120805460ff19166001179055815491906106358361458d565b91905055505b005b600080fd5b34801561064e57600080fd5b50602954610662906001600160a01b031681565b60405161066f91906145a6565b60405180910390f35b34801561068457600080fd5b5061068e60215481565b60405190815260200161066f565b3480156106a857600080fd5b50603454610662906001600160a01b031681565b3480156106c857600080fd5b5061068e60265481565b3480156106de57600080fd5b506106e761135c565b60405161066f9190614600565b34801561070057600080fd5b506107096113ea565b604051901515815260200161066f565b34801561072557600080fd5b50601c546107099060ff1681565b34801561073f57600080fd5b5061068e60245481565b34801561075557600080fd5b5061068e60355481565b34801561076b57600080fd5b5061070961077a3660046146fb565b611418565b34801561078b57600080fd5b5061066261079a366004614733565b6114e2565b3480156107ab57600080fd5b506106626107ba366004614733565b600b602052600090815260409020546001600160a01b031681565b3480156107e157600080fd5b5061063b611502565b3480156107f657600080fd5b5061068e60235481565b34801561080c57600080fd5b5061068e61081b36600461474c565b60026020526000908152604090205481565b34801561083957600080fd5b5060165461068e565b34801561084e57600080fd5b5061066261085d366004614733565b6007602052600090815260409020546001600160a01b031681565b34801561088457600080fd5b5060175461068e565b34801561089957600080fd5b5061068e60225481565b3480156108af57600080fd5b5061068e6108be36600461474c565b60046020526000908152604090205481565b3480156108dc57600080fd5b506107096108eb36600461474c565b60096020526000908152604090205460ff1681565b34801561090c57600080fd5b5061068e60165481565b34801561092257600080fd5b50603354610662906001600160a01b031681565b34801561094257600080fd5b50603154610662906001600160a01b031681565b34801561096257600080fd5b5060345461070990600160a01b900460ff1681565b34801561098357600080fd5b5061068e61099236600461474c565b60056020526000908152604090205481565b3480156109b057600080fd5b5061063b6116f4565b3480156109c557600080fd5b5061068e60175481565b3480156109db57600080fd5b5061063b611798565b3480156109f057600080fd5b5061068e6109ff36600461474c565b6001600160a01b031660009081526002602052604090205490565b348015610a2657600080fd5b5061063b61184d565b348015610a3b57600080fd5b50601c5461070990600160381b900460ff1681565b348015610a5c57600080fd5b50610709610a6b366004614769565b611a29565b348015610a7c57600080fd5b5061068e610a8b3660046147aa565b611ba0565b348015610a9c57600080fd5b5061068e600f5481565b348015610ab257600080fd5b50610abb611cc6565b60405161066f919061481a565b348015610ad457600080fd5b50601c546107099062010000900460ff1681565b348015610af457600080fd5b5061068e60145481565b348015610b0a57600080fd5b5060335461070990600160a01b900460ff1681565b348015610b2b57600080fd5b5061068e601a5481565b348015610b4157600080fd5b5061063b610b5036600461474c565b611deb565b348015610b6157600080fd5b50610b6a611f1c565b60405161066f9392919061482d565b348015610b8557600080fd5b5061068e602f5481565b348015610b9b57600080fd5b5061063b612096565b348015610bb057600080fd5b50601c5461070990600160281b900460ff1681565b348015610bd157600080fd5b50601c5461070990600160401b900460ff1681565b348015610bf257600080fd5b5061063b61223c565b348015610c0757600080fd5b5061068e601d5481565b348015610c1d57600080fd5b5061068e60255481565b348015610c3357600080fd5b5061068e60205481565b348015610c4957600080fd5b5061068e60135481565b348015610c5f57600080fd5b5061068e60155481565b348015610c7557600080fd5b506013546017541015610709565b348015610c8f57600080fd5b50601c5461070990600160301b900460ff1681565b348015610cb057600080fd5b50601c54610709906301000000900460ff1681565b348015610cd157600080fd5b5061068e600d5481565b348015610ce757600080fd5b5061068e610cf636600461474c565b60066020526000908152604090205481565b348015610d1457600080fd5b5061063b610d2336600461474c565b61229b565b348015610d3457600080fd5b50602a54610662906001600160a01b031681565b348015610d5457600080fd5b50601c5461070990600160201b900460ff1681565b348015610d7557600080fd5b50600054610662906001600160a01b031681565b348015610d9557600080fd5b5061063b61232f565b348015610daa57600080fd5b5061063b612502565b348015610dbf57600080fd5b50610709610dce36600461474c565b60086020526000908152604090205460ff1681565b348015610def57600080fd5b50610709610dfe36600461474c565b600a6020526000908152604090205460ff1681565b348015610e1f57600080fd5b50610662612565565b348015610e3457600080fd5b50603254610662906001600160a01b031681565b348015610e5457600080fd5b5061068e601b5481565b348015610e6a57600080fd5b5060155461068e565b348015610e7f57600080fd5b5061068e60195481565b348015610e9557600080fd5b5061063b6125d8565b348015610eaa57600080fd5b50610709610eb936600461474c565b602e6020526000908152604090205460ff1681565b348015610eda57600080fd5b5061063b61269c565b348015610eef57600080fd5b50603054610662906001600160a01b031681565b348015610f0f57600080fd5b50601c5461070990610100900460ff1681565b348015610f2e57600080fd5b5061068e600e5481565b348015610f4457600080fd5b5061068e612aa2565b348015610f5957600080fd5b5061063b610f683660046148a2565b612aaf565b348015610f7957600080fd5b5061068e601e5481565b348015610f8f57600080fd5b50603654610662906001600160a01b031681565b348015610faf57600080fd5b5060145461068e565b348015610fc457600080fd5b5061063b612c47565b348015610fd957600080fd5b5061063b612cc6565b348015610fee57600080fd5b5061068e612d63565b34801561100357600080fd5b5060105461068e565b34801561101857600080fd5b5061063b61102736600461474c565b612d6e565b34801561103857600080fd5b5060135461068e565b34801561104d57600080fd5b5061068e61105c36600461474c565b60036020526000908152604090205481565b34801561107a57600080fd5b506016544211610709565b34801561109157600080fd5b5061068e600c5481565b3480156110a757600080fd5b50602854610662906001600160a01b031681565b3480156110c757600080fd5b5061063b6110d636600461474c565b612ddf565b3480156110e757600080fd5b506107096110f63660046148c4565b612dff565b34801561110757600080fd5b506106e761304e565b34801561111c57600080fd5b50602754610662906001600160a01b031681565b34801561113c57600080fd5b5061068e60105481565b34801561115257600080fd5b5061068e60185481565b34801561116857600080fd5b5061068e601f5481565b3332146111c15760405162461bcd60e51b815260206004820152601e60248201527f63616e277420636f6e747269627574652076696120636f6e7472616374730000604482015260640161049f565b601a5442116112225760405162461bcd60e51b815260206004820152602760248201527f496e2077686974656c6973742064697361626c656420636f6f6c204f666620696044820152661b9d195c9b985b60ca1b606482015260840161049f565b6015544210158015611235575060165442105b6112725760405162461bcd60e51b815260206004820152600e60248201526d49444f206e6f742061637469766560901b604482015260640161049f565b3360009081526009602052604090205460ff16156112a25760405162461bcd60e51b815260040161049f906144f0565b601c5462010000900460ff16156112e257336000908152600a602052604090205460ff166112e25760405162461bcd60e51b815260040161049f90614523565b346112ed828261305b565b60006112f8826130fc565b9050816017600082825461130c919061457a565b909155505060408051838152602081018390526001600160a01b0385169133917f623b3804fa71d67900d064613da8f94b9617215ee90799290593e1745087ad18910160405180910390a3505050565b6001805461136990614917565b80601f016020809104026020016040519081016040528092919081815260200182805461139590614917565b80156113e25780601f106113b7576101008083540402835291602001916113e2565b820191906000526020600020905b8154815290600101906020018083116113c557829003601f168201915b505050505081565b60008060118101546017546014546114029190614567565b1090506016544211806114125750805b91505090565b600080546001600160a01b0316331461143057600080fd5b601c54600160201b900460ff161561145a5760405162461bcd60e51b815260040161049f90614961565b8251602a80546001600160a01b039283166001600160a01b031991821617909155602085015160288054919093169116179055601c8054831515600160281b0260ff60281b199091161790556114ae61311f565b604051600080516020614e0883398151915290600090a150601c805460ff60201b1916600160201b17905560015b92915050565b602b81600381106114f257600080fd5b01546001600160a01b0316905081565b3360009081526009602052604090205460ff16156115565760405162461bcd60e51b8152602060048201526011602482015270616c726561647920726566756e6465642160781b604482015260640161049f565b33600090815260026020526040902054806115a65760405162461bcd60e51b815260206004820152601060248201526f6e6f7468696e6720746f20636c61696d60801b604482015260640161049f565b601c54600160201b900460ff16156115f55760405162461bcd60e51b8152602060048201526012602482015271616c72656164792066696e616c697a65642160701b604482015260640161049f565b601c54600160281b900460ff161561164f5760405162461bcd60e51b815260206004820152601d60248201527f616c72656164792073756363657366756c6c792066696e616c697a6564000000604482015260640161049f565b60195460165461165f9190614567565b42106116aa5760405162461bcd60e51b815260206004820152601a6024820152797769746864726177616c2077696e646f7720657870697265642160301b604482015260640161049f565b3360009081526005602052604090208190556017546116ca908290614567565b601755336000818152600960205260409020805460ff191660011790556116f1908261315d565b50565b6028546001600160a01b0316331461170b57600080fd5b601c54600160301b900460ff1661175f5760405162461bcd60e51b81526020600482015260186024820152771d995cdd1a5b99c8185b1c9958591e48191a5cd8589b195960421b604482015260640161049f565b601c54600160201b900460ff16156117895760405162461bcd60e51b815260040161049f90614961565b601c805460ff60301b19169055565b6028546001600160a01b031633146117c25760405162461bcd60e51b815260040161049f90614994565b601c54600160201b900460ff16156118195760405162461bcd60e51b815260206004820152601a60248201527970726573616c6520616c72656164792066696e616c697a65642160301b604482015260640161049f565b601c805460ff60401b1916600160401b179055602454601b54600a9161183e916149cb565b61184891906149e2565b601b55565b601c54600160381b900460ff16156118775760405162461bcd60e51b815260040161049f90614a04565b601c54600160301b900460ff16156118dc5760405162461bcd60e51b815260206004820152602260248201527f706c65617365207573652076657374696e67206d6574686f6420746f20636c61604482015261696d60f01b606482015260840161049f565b601c54600160201b900460ff166119055760405162461bcd60e51b815260040161049f90614a32565b601c54600160281b900460ff1661192e5760405162461bcd60e51b815260040161049f90614a5e565b33600090815260026020526040812054900361195c5760405162461bcd60e51b815260040161049f90614a87565b601054336000908152600260205260408120549091670de0b6b3a76400009161198591906149cb565b61198f91906149e2565b3360008181526002602052604080822091909155602754905163a9059cbb60e01b81529293506001600160a01b03169163a9059cbb916119d3918590600401614ac8565b6020604051808303816000875af11580156119f2573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611a169190614ae1565b5033600090815260046020526040902055565b600080546001600160a01b03163314611a4157600080fd5b601c54600160201b900460ff1615611a8f5760405162461bcd60e51b8152602060048201526011602482015270185b1c9958591e48199a5b985b1a5e9959607a1b604482015260640161049f565b611a976113ea565b611ad05760405162461bcd60e51b815260206004820152600a6024820152691b9bdd0818db1bdcd95960b21b604482015260640161049f565b8351602a80546001600160a01b039283166001600160a01b031991821617909155602086015160288054919093169116179055601c8054831515600160281b0260ff60281b1990911617905560135460175410158015611b395750601c54600160281b900460ff165b15611b6057602854602a54611b5b916001600160a01b03908116911685613295565b611b68565b611b6861311f565b42601f55604051600080516020614e0883398151915290600090a150601c805460ff60201b1916600160201b17905560019392505050565b60408051600280825260608083018452600093909284928392602083019080368337019050509050611bd0612565565b81600081518110611be357611be361494b565b60200260200101906001600160a01b031690816001600160a01b0316815250508581600181518110611c1757611c1761494b565b6001600160a01b03928316602091820292909201015260305460405163d06ca61f60e01b815291169063d06ca61f90611c569088908590600401614afe565b600060405180830381865afa158015611c73573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052611c9b9190810190614b1f565b925082600181518110611cb057611cb061494b565b6020026020010151915081935050505092915050565b60606000600d546001600160401b03811115611ce457611ce461461a565b604051908082528060200260200182016040528015611d0d578160200160208202803683370190505b50905060005b600d54811015611de5576000818152600b60209081526040808320546001600160a01b03168352600a90915290205460ff1615611d9e576000818152600b602052604090205482516001600160a01b0390911690839083908110611d7957611d7961494b565b60200260200101906001600160a01b031690816001600160a01b031681525050611dd3565b6000828281518110611db257611db261494b565b60200260200101906001600160a01b031690816001600160a01b0316815250505b80611ddd8161458d565b915050611d13565b50919050565b6001600160a01b038116611e405760405162461bcd60e51b815260206004820152601c60248201527b31bab93932b731bc9031b0b73737ba103132902d32b9379030b2323960211b604482015260640161049f565b6001600160a01b0381166000908152602e602052604090205460ff16611ea15760405162461bcd60e51b81526020600482015260166024820152751a5b9d985b1a5908185cdcd95d081cd95b1958dd195960521b604482015260640161049f565b603354600160a01b900460ff1615611ecb5760405162461bcd60e51b815260040161049f90614bc4565b6028546001600160a01b03163314611ef55760405162461bcd60e51b815260040161049f90614bf8565b603480546001600160a81b0319166001600160a01b0390921691909117600160a01b179055565b611f246144b3565b611f2c6144d2565b6060611f366144b3565b611f3e6144d2565b5050604080516101408101825260135481526014546020808301919091526011548284015260125460608084019190915260155460808085019190915260165460a085015260175460c085015260105460e085015260225461010085015260215461012085015284519081018552601c5460ff600160201b8204811615158352600160281b82048116151594830194909452600160301b81048416151595820195909552600160381b9094049091161515908301526001805491929183918391819061200990614917565b80601f016020809104026020016040519081016040528092919081815260200182805461203590614917565b80156120825780601f1061205757610100808354040283529160200191612082565b820191906000526020600020905b81548152906001019060200180831161206557829003601f168201915b505050505090509450945094505050909192565b6028546001600160a01b031633146120c05760405162461bcd60e51b815260040161049f90614994565b601c54600160201b900460ff166120e95760405162461bcd60e51b815260040161049f90614c29565b601c54600160281b900460ff16156121135760405162461bcd60e51b815260040161049f90614c59565b6027546028546040516370a0823160e01b81526001600160a01b039283169263a9059cbb92169083906370a08231906121509030906004016145a6565b602060405180830381865afa15801561216d573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906121919190614c85565b6040518363ffffffff1660e01b81526004016121ae929190614ac8565b6020604051808303816000875af11580156121cd573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906121f19190614ae1565b61223a5760405162461bcd60e51b815260206004820152601a60248201527963616e6e6f74207472616e7366657220746f6b656e206261636b60301b604482015260640161049f565b565b6000546001600160a01b0316331461225357600080fd5b600080546040516001600160a01b03909116917ff8df31144d9c2f0f6b59d69b8b98abd5459d07f2742c4df920b25aae33c6482091a2600080546001600160a01b0319169055565b6000546001600160a01b031633146122b257600080fd5b6001600160a01b0381166000908152600a602052604090205460ff1661230e5760405162461bcd60e51b81526020600482015260116024820152706e6f7420696e2077686974656c6973742160781b604482015260640161049f565b6001600160a01b03166000908152600a60205260409020805460ff19169055565b6028546001600160a01b031633146123595760405162461bcd60e51b815260040161049f90614994565b602554601f54612369919061457a565b421161237457600080fd5b601c54600160201b900460ff1661239d5760405162461bcd60e51b815260040161049f90614c29565b601c54600160281b900460ff166123c65760405162461bcd60e51b815260040161049f90614c59565b60006010546017546014546123db9190614567565b6123e591906149cb565b69021e19e0c9bab24000006023546021546022546017546014546124099190614567565b61241391906149cb565b61241d91906149cb565b61242791906149cb565b61243191906149e2565b61243b919061457a565b60275460315460405163a9059cbb60e01b81529293506001600160a01b039182169263a9059cbb926124739216908590600401614ac8565b6020604051808303816000875af1158015612492573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906124b69190614ae1565b6116f15760405162461bcd60e51b815260206004820152601d60248201527f63616e6e6f74207472616e7366657220746f6b656e20746f2064656164000000604482015260640161049f565b603354600160a01b900460ff161561252c5760405162461bcd60e51b815260040161049f90614bc4565b6028546001600160a01b031633146125565760405162461bcd60e51b815260040161049f90614bf8565b6034805460ff60a01b19169055565b603054604080516315ab88c960e31b815290516000926001600160a01b03169163ad5c46489160048083019260209291908290030181865afa1580156125af573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906125d39190614c9e565b905090565b601c54600160201b900460ff166126215760405162461bcd60e51b815260206004820152600d60248201526c1b9bdd08199a5b985b1a5e9959609a1b604482015260640161049f565b601354601754108061263d5750601c54600160281b900460ff16155b6126935760405162461bcd60e51b815260206004820152602160248201527f676f616c2072656163686564206f722070726573616c652073756363656564656044820152601960fa1b606482015260840161049f565b61223a33613543565b601c54600160381b900460ff16156126c65760405162461bcd60e51b815260040161049f90614a04565b601c54600160301b900460ff166127155760405162461bcd60e51b81526020600482015260136024820152721d995cdd1a5b99c81b9bdd08195b98589b1959606a1b604482015260640161049f565b601c54600160201b900460ff1661273e5760405162461bcd60e51b815260040161049f90614a32565b601c54600160281b900460ff166127675760405162461bcd60e51b815260040161049f90614a5e565b3360009081526002602052604081205490036127955760405162461bcd60e51b815260040161049f90614a87565b601e5433600090815260066020526040902054106127e95760405162461bcd60e51b8152602060048201526011602482015270185b1b081d1bdad95b9cc81d995cdd1959607a1b604482015260640161049f565b6000602054601f54426127fc9190614567565b61280691906149e2565b61281190600161457a565b9050601e5481106128215750601e545b3360009081526006602052604081205461283b9083614567565b905060008111801561284f5750601e548111155b6128965760405162461bcd60e51b81526020600482015260186024820152776e6f7420696e207573657220636c61696d2077696e646f7760401b604482015260640161049f565b336000908152600660209081526040808320859055601e5460105460039093529083205490918491670de0b6b3a7640000916128d1916149cb565b6128db91906149e2565b6128e591906149cb565b6128ef91906149e2565b6010543360009081526002602052604081205492935091670de0b6b3a764000091612919916149cb565b61292391906149e2565b9050808211156129755760405162461bcd60e51b815260206004820152601d60248201527f63616e277420636c61696d206d6f7265207468616e20616c6c6f776564000000604482015260640161049f565b601e54336000908152600360205260408120549091906129969086906149cb565b6129a091906149e2565b3360009081526002602052604090205490915081106129ce57336000908152600260205260408120556129fa565b336000908152600260205260409020546129e9908290614567565b336000908152600260205260409020555b60275460405163a9059cbb60e01b81526001600160a01b039091169063a9059cbb90612a2c9033908790600401614ac8565b6020604051808303816000875af1158015612a4b573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612a6f9190614ae1565b5033600090815260046020526040902054612a8b90849061457a565b336000908152600460205260409020555050505050565b60006011815b0154905090565b60018211612b095760405162461bcd60e51b815260206004820152602160248201527f6e756d206f6620766573742068617320746f2062652067727472207468616e206044820152603160f81b606482015260840161049f565b60008111612b525760405162461bcd60e51b81526020600482015260166024820152751d995cdd1a5b99c81c195c9a5bd9081a5b9d985b1a5960521b604482015260640161049f565b610258601554612b629190614567565b4210612bbe5760405162461bcd60e51b815260206004820152602560248201527f63616e277420656e61626c6520766573742061667465722070726573616c65206044820152641cdd185c9d60da1b606482015260840161049f565b601c54600160301b900460ff1615612c125760405162461bcd60e51b81526020600482015260176024820152761d995cdd1a5b99c8185b1c9958591e48195b98589b1959604a1b604482015260640161049f565b6028546001600160a01b03163314612c2957600080fd5b601c805460ff60301b1916600160301b179055601e91909155602055565b6000546001600160a01b03163314612c5e57600080fd5b601c5462010000900460ff1615612cb35760405162461bcd60e51b81526020600482015260196024820152781dda1a5d195b1a5cdd08185b1c9958591e48195b98589b1959603a1b604482015260640161049f565b601c805462ff0000191662010000179055565b6000546001600160a01b03163314612cdd57600080fd5b601c5462010000900460ff16612d325760405162461bcd60e51b815260206004820152601a6024820152791dda1a5d195b1a5cdd08185b1c9958591e48191a5cd8589b195960321b604482015260640161049f565b601c805462ff000019169055601854612d4b904261457a565b601a55601c805463ff00000019166301000000179055565b600060116001612aa8565b6000546001600160a01b03163314612d8557600080fd5b6001600160a01b0381166000818152600a60209081526040808320805460ff19166001179055600d80548452600b909252822080546001600160a01b03191690931790925581549190612dd78361458d565b919050555050565b6000546001600160a01b03163314612df657600080fd5b6116f18161369c565b600080546001600160a01b03163314612e1757600080fd5b601c54600160401b900460ff16613043576001600160a01b038516612e7b5760405162461bcd60e51b815260206004820152601a602482015279706c6174666f726d20616464722063616e74206265207a65726f60301b604482015260640161049f565b600068056bc75e2d63100000601b54601054601754612e9a91906149cb565b612ea491906149cb565b612eae91906149e2565b905060008315612fc9576064612ec486846149cb565b612ece91906149e2565b6027549091506001600160a01b031663a9059cbb88612eed8486614567565b6040518363ffffffff1660e01b8152600401612f0a929190614ac8565b6020604051808303816000875af1158015612f29573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612f4d9190614ae1565b5060275460405163a9059cbb60e01b81526001600160a01b039091169063a9059cbb90612f809089908590600401614ac8565b6020604051808303816000875af1158015612f9f573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612fc39190614ae1565b50613040565b60275460405163a9059cbb60e01b81526001600160a01b039091169063a9059cbb90612ffb908a908690600401614ac8565b6020604051808303816000875af115801561301a573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061303e9190614ae1565b505b50505b506001949350505050565b6037805461136990614917565b60115434101561306a57600080fd5b60125434111561307957600080fd5b6014548160175461308a919061457a565b11156130d85760405162461bcd60e51b815260206004820152601f60248201527f636f6e747269627574696f6e207265616368696e67206f766572206863617000604482015260640161049f565b6001600160a01b0382166130eb57600080fd5b806000036130f857600080fd5b5050565b6000670de0b6b3a76400006010548361311591906149cb565b6114dc91906149e2565b601c805460ff60381b1916600160381b1790556040517f599d8e5a83cffb867d051598c4d70e805d59802d8081c1c7d6dffc5b6aca2b8990600090a1565b6000606461316c8360146149cb565b61317691906149e2565b905060006131848284614567565b6001600160a01b0385811660009081526002602090815260408083208390556003909152808220829055602954905193945090911691849181818185875af1925050503d80600081146131f3576040519150601f19603f3d011682016040523d82523d6000602084013e6131f8565b606091505b50506040516001600160a01b03861691508290600081818185875af1925050503d8060008114613244576040519150601f19603f3d011682016040523d82523d6000602084013e613249565b606091505b505050836001600160a01b03167f7e77c11526f6439d832e432cabb72ef2aaa7e1677ca8b9509c14df61fba190d28460405161328791815260200190565b60405180910390a250505050565b601c54600160201b900460ff16156132bf5760405162461bcd60e51b815260040161049f90614961565b6040517f1cdde67b72a90f19919ac732a437ac2f7a10fc128d28c2a6e525d89ce5cd9d3a90600090a160006064601b54476132fa91906149cb565b61330491906149e2565b905081156133da576000606461331a84846149cb565b61332491906149e2565b9050836001600160a01b03168160405160006040518083038185875af1925050503d8060008114613371576040519150601f19603f3d011682016040523d82523d6000602084013e613376565b606091505b50506029546001600160a01b031690506133908284614567565b604051600081818185875af1925050503d80600081146133cc576040519150601f19603f3d011682016040523d82523d6000602084013e6133d1565b606091505b50505050613430565b6029546040516001600160a01b03909116908290600081818185875af1925050503d8060008114613427576040519150601f19603f3d011682016040523d82523d6000602084013e61342c565b606091505b5050505b600060646021544761344291906149cb565b61344c91906149e2565b90508047101561349c5760405162461bcd60e51b815260206004820152601b60248201527a2737ba1022b737bab3b410233ab732103a37902a3930b739b332b960291b604482015260640161049f565b6134e469021e19e0c9bab24000006023546021546022546017546134c091906149cb565b6134ca91906149cb565b6134d491906149cb565b6134de91906149e2565b8261370a565b471561353c576040516001600160a01b038616904790600081818185875af1925050503d8060008114613533576040519150601f19603f3d011682016040523d82523d6000602084013e613538565b606091505b5050505b5050505050565b601c54600160381b900460ff166135915760405162461bcd60e51b81526020600482015260126024820152711c99599d5b99081b9bdd08195b98589b195960721b604482015260640161049f565b6001600160a01b038116600090815260026020526040902054806135f75760405162461bcd60e51b815260206004820152601f60248201527f5573657220686173206e6f20696e766573746d656e7420746f20636c61696d00604482015260640161049f565b6001600160a01b03821660008181526002602052604080822082905551839181818185875af1925050503d806000811461364d576040519150601f19603f3d011682016040523d82523d6000602084013e613652565b606091505b505050816001600160a01b03167fd7dee2702d63ad89917b6a4da9981c90c4d24f8c2bdfd64c604ecae57d8d06518260405161369091815260200190565b60405180910390a25050565b6001600160a01b0381166136af57600080fd5b600080546040516001600160a01b03808516939216917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e091a3600080546001600160a01b0319166001600160a01b0392909216919091179055565b806000606461371a83605a6149cb565b61372491906149e2565b9050600060235485606461373891906149cb565b61374291906149e2565b90506000606461375383605a6149cb565b61375d91906149e2565b90506000806000603460149054906101000a900460ff16156138a15761378288613edd565b60275460345461379e916001600160a01b0390811691166140d5565b603280546001600160a01b0319166001600160a01b039283169081179091556034546040516370a0823160e01b81529216916370a08231916137e2916004016145a6565b602060405180830381865afa1580156137ff573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906138239190614c85565b6027546032546040516370a0823160e01b81529295506001600160a01b03918216926370a08231926138599216906004016145a6565b602060405180830381865afa158015613876573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061389a9190614c85565b91506139d2565b6027546138be906001600160a01b03166138b9612565565b6140d5565b603280546001600160a01b0319166001600160a01b03929092169190911790556138e6612565565b6032546040516370a0823160e01b81526001600160a01b03928316926370a0823192613917929116906004016145a6565b602060405180830381865afa158015613934573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906139589190614c85565b6027546032546040516370a0823160e01b81529295506001600160a01b03918216926370a082319261398e9216906004016145a6565b602060405180830381865afa1580156139ab573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906139cf9190614c85565b91505b6032546001600160a01b0316158015906139f557506000831180156139f5575081155b15613af45786613a0584876149cb565b613a0f91906149e2565b60275460325460405163a9059cbb60e01b81529293506001600160a01b039182169263a9059cbb92613a479216908590600401614ac8565b6020604051808303816000875af1158015613a66573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613a8a9190614ae1565b50603260009054906101000a90046001600160a01b03166001600160a01b031663fff6cae96040518163ffffffff1660e01b8152600401600060405180830381600087803b158015613adb57600080fd5b505af1158015613aef573d6000803e3d6000fd5b505050505b602754613b09906001600160a01b0316614383565b50603454600160a01b900460ff1615613cda576030546027546034546040516370a0823160e01b81526001600160a01b039384169363e8e337009381169216908d9082906370a0823190613b619030906004016145a6565b602060405180830381865afa158015613b7e573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613ba29190614c85565b8e603460009054906101000a90046001600160a01b03166001600160a01b03166370a08231306040518263ffffffff1660e01b8152600401613be491906145a6565b602060405180830381865afa158015613c01573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613c259190614c85565b30613c324261012c61457a565b60405160e08a901b6001600160e01b03191681526001600160a01b039889166004820152968816602488015260448701959095526064860193909352608485019190915260a484015290921660c482015260e4810191909152610104016060604051808303816000875af1158015613cae573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613cd29190614cbb565b505050613d9b565b6030546027546001600160a01b039182169163f305d719918a911688888b30613d054261012c61457a565b60405160e089901b6001600160e01b03191681526001600160a01b039687166004820152602481019590955260448501939093526064840191909152909216608482015260a481019190915260c40160606040518083038185885af1158015613d72573d6000803e3d6000fd5b50505050506040513d601f19601f82011682018060405250810190613d979190614cbb565b5050505b6033805460ff60a01b1916600160a01b179055603254603654613dca916001600160a01b039081169116614423565b50603654603254602f546040516370a0823160e01b81526001600160a01b0393841693638a4e6e569316919060379083906370a0823190613e0f9030906004016145a6565b602060405180830381865afa158015613e2c573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613e509190614c85565b6040518563ffffffff1660e01b8152600401613e6f9493929190614ce9565b6020604051808303816000875af1158015613e8e573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613eb29190614c9e565b603380546001600160a01b0319166001600160a01b0392909216919091179055505050505050505050565b603454600160a01b900460ff16613f325760405162461bcd60e51b8152602060048201526019602482015278185b1d0818dd5c9c995b98de481b9bdd081cd95b1958dd1959603a1b604482015260640161049f565b604080516002808252606082018352600092602083019080368337019050509050613f5b612565565b81600081518110613f6e57613f6e61494b565b6001600160a01b039283166020918202929092010152603454825191169082906001908110613f9f57613f9f61494b565b6001600160a01b039283166020918202929092010152603454613fc29116614383565b506030546034546001600160a01b0391821691637ff36ab5918591613fe8911682611ba0565b8430613ff64261012c61457a565b6040518663ffffffff1660e01b81526004016140159493929190614db8565b60006040518083038185885af1158015614033573d6000803e3d6000fd5b50505050506040513d6000823e601f3d908101601f1916820160405261405c9190810190614b1f565b506034546040516370a0823160e01b81526001600160a01b03909116906370a082319061408d9030906004016145a6565b602060405180830381865afa1580156140aa573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906140ce9190614c85565b6035555050565b6000806001600160a01b0316603060009054906101000a90046001600160a01b03166001600160a01b031663c45a01556040518163ffffffff1660e01b8152600401602060405180830381865afa158015614134573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906141589190614c9e565b6001600160a01b031663e6a4390585856040518363ffffffff1660e01b8152600401614185929190614ded565b602060405180830381865afa1580156141a2573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906141c69190614c9e565b6001600160a01b0316146142c057603060009054906101000a90046001600160a01b03166001600160a01b031663c45a01556040518163ffffffff1660e01b8152600401602060405180830381865afa158015614227573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061424b9190614c9e565b6001600160a01b031663e6a4390584846040518363ffffffff1660e01b8152600401614278929190614ded565b602060405180830381865afa158015614295573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906142b99190614c9e565b90506114dc565b603060009054906101000a90046001600160a01b03166001600160a01b031663c45a01556040518163ffffffff1660e01b8152600401602060405180830381865afa158015614313573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906143379190614c9e565b6001600160a01b031663c9c6539684846040518363ffffffff1660e01b8152600401614364929190614ded565b6020604051808303816000875af1158015614295573d6000803e3d6000fd5b60305460405163095ea7b360e01b81526000917606e8aff4357fd6c8924f7875b89f9cf5f554c3db737e95604d1b916001600160a01b038581169263095ea7b3926143d692909116908590600401614ac8565b6020604051808303816000875af11580156143f5573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906144199190614ae1565b5060019392505050565b60405163095ea7b360e01b81526000907606e8aff4357fd6c8924f7875b89f9cf5f554c3db737e95604d1b906001600160a01b0385169063095ea7b3906144709086908590600401614ac8565b6020604051808303816000875af115801561448f573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906130439190614ae1565b604051806101400160405280600a906020820280368337509192915050565b60405180608001604052806004906020820280368337509192915050565b60208082526019908201527855736572207573656420616e7974696d6520726566756e642160381b604082015260600190565b6020808252601490820152731d5cd95c881b9bdd081dda1a5d195b1a5cdd195960621b604082015260600190565b634e487b7160e01b600052601160045260246000fd5b818103818111156114dc576114dc614551565b808201808211156114dc576114dc614551565b60006001820161459f5761459f614551565b5060010190565b6001600160a01b0391909116815260200190565b6000815180845260005b818110156145e0576020818501810151868301820152016145c4565b506000602082860101526020601f19601f83011685010191505092915050565b60208152600061461360208301846145ba565b9392505050565b634e487b7160e01b600052604160045260246000fd5b604051601f8201601f191681016001600160401b03811182821017156146585761465861461a565b604052919050565b6001600160a01b03811681146116f157600080fd5b600082601f83011261468657600080fd5b604080519081016001600160401b03811182821017156146a8576146a861461a565b80604052508060408401858111156146bf57600080fd5b845b818110156146e25780356146d481614660565b8352602092830192016146c1565b509195945050505050565b80151581146116f157600080fd5b6000806060838503121561470e57600080fd5b6147188484614675565b91506040830135614728816146ed565b809150509250929050565b60006020828403121561474557600080fd5b5035919050565b60006020828403121561475e57600080fd5b813561461381614660565b60008060006080848603121561477e57600080fd5b6147888585614675565b925060408401359150606084013561479f816146ed565b809150509250925092565b600080604083850312156147bd57600080fd5b82356147c881614660565b946020939093013593505050565b600081518084526020808501945080840160005b8381101561480f5781516001600160a01b0316875295820195908201906001016147ea565b509495945050505050565b60208152600061461360208301846147d6565b60006101e08286835b600a811015614855578151835260209283019290910190600101614836565b50505061014083018560005b60048110156148825781511515835260209283019290910190600101614861565b505050806101c0840152614898818401856145ba565b9695505050505050565b600080604083850312156148b557600080fd5b50508035926020909101359150565b600080600080608085870312156148da57600080fd5b84356148e581614660565b935060208501356148f581614660565b925060408501359150606085013561490c816146ed565b939692955090935050565b600181811c9082168061492b57607f821691505b602082108103611de557634e487b7160e01b600052602260045260246000fd5b634e487b7160e01b600052603260045260246000fd5b6020808252601990820152781c1c995cd85b1948185b1c9958591e48199a5b985b1a5e9959603a1b604082015260600190565b6020808252601f908201527f696e69746961746f72206973206e6f742070726573616c65206f776e65722100604082015260600190565b80820281158282048414176114dc576114dc614551565b6000826149ff57634e487b7160e01b600052601260045260246000fd5b500490565b6020808252601490820152731c1c995cd85b19481dd85cc81c99599d5b99195960621b604082015260600190565b6020808252601290820152714e6f742046696e616c697a6564207965742160701b604082015260600190565b6020808252600f908201526e70726573616c65204661696c65642160881b604082015260600190565b60208082526021908201527f7573657220686173206e6f206d6f726520746f6b656e7320746f20636c61696d6040820152602160f81b606082015260800190565b6001600160a01b03929092168252602082015260400190565b600060208284031215614af357600080fd5b8151614613816146ed565b828152604060208201526000614b1760408301846147d6565b949350505050565b60006020808385031215614b3257600080fd5b82516001600160401b0380821115614b4957600080fd5b818501915085601f830112614b5d57600080fd5b815181811115614b6f57614b6f61461a565b8060051b9150614b80848301614630565b8181529183018401918481019088841115614b9a57600080fd5b938501935b83851015614bb857845182529385019390850190614b9f565b98975050505050505050565b6020808252601a90820152794c697175696469747920697320616464656420616c726561647960301b604082015260600190565b6020808252601790820152763737ba103a343290383932b9b0b6329031b932b0ba37b960491b604082015260600190565b60208082526016908201527570726573616c65206e6f742066696e616c697a65642160501b604082015260600190565b602080825260129082015271199a5b985b1a5e99481dd85cc81d985b1a5960721b604082015260600190565b600060208284031215614c9757600080fd5b5051919050565b600060208284031215614cb057600080fd5b815161461381614660565b600080600060608486031215614cd057600080fd5b8351925060208401519150604084015190509250925092565b6001600160a01b03851681526020808201859052608060408301528354600091908290600181811c9082811680614d2157607f831692505b8583108103614d3e57634e487b7160e01b85526022600452602485fd5b6080880183905260a08801818015614d5d5760018114614d7357614d9e565b60ff198616825284151560051b82019650614d9e565b60008c81526020902060005b86811015614d9857815484820152908501908901614d7f565b83019750505b505050505050809250505082606083015295945050505050565b848152608060208201526000614dd160808301866147d6565b6001600160a01b03949094166040830152506060015292915050565b6001600160a01b039283168152911660208201526040019056fe6823b073d48d6e3a7d385eeb601452d680e74bb46afe3255a7d778f3a9b17681a26469706673582212202f9f138143131bea58395a3db980dac951446c43ef745ff4f7e706fe998173e264736f6c63430008110033a2646970667358221220fd793be96e6dc95f7b6f7eddc507ce53a033415bb67b2fa476fe5dfc0a0b731064736f6c63430008110033
Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)
0000000000000000000000000febb541ef3632925cd67daf9e82cdc8ec7a71ef000000000000000000000000a27ea368c4198a288eb552d642b1e5acc29912d400000000000000000000000029219dd400f2bf60e5a23d13be72b486d403889400000000000000000000000029219dd400f2bf60e5a23d13be72b486d403889400000000000000000000000029219dd400f2bf60e5a23d13be72b486d4038894
-----Decoded View---------------
Arg [0] : _feeContract_lplockDep_altAssets (address[5]): 0x0FEbB541Ef3632925cD67DAf9e82CdC8Ec7a71ef,0xa27eA368c4198a288eb552D642B1E5aCc29912D4,0x29219dd400f2Bf60E5a23d13Be72B486D4038894,0x29219dd400f2Bf60E5a23d13Be72B486D4038894,0x29219dd400f2Bf60E5a23d13Be72B486D4038894
-----Encoded View---------------
5 Constructor Arguments found :
Arg [0] : 0000000000000000000000000febb541ef3632925cd67daf9e82cdc8ec7a71ef
Arg [1] : 000000000000000000000000a27ea368c4198a288eb552d642b1e5acc29912d4
Arg [2] : 00000000000000000000000029219dd400f2bf60e5a23d13be72b486d4038894
Arg [3] : 00000000000000000000000029219dd400f2bf60e5a23d13be72b486d4038894
Arg [4] : 00000000000000000000000029219dd400f2bf60e5a23d13be72b486d4038894
Loading...
Loading
Loading...
Loading
Multichain Portfolio | 30 Chains
Chain | Token | Portfolio % | Price | Amount | Value |
---|
[ Download: CSV Export ]
[ Download: CSV Export ]
A contract address hosts a smart contract, which is a set of code stored on the blockchain that runs when predetermined conditions are met. Learn more about addresses in our Knowledge Base.