ERC-20
Overview
Max Total Supply
100,000,000 PYE
Holders
242
Market
Onchain Market Cap
$0.00
Circulating Supply Market Cap
-
Other Info
Token Contract (WITH 9 Decimals)
Balance
4,796.96827291 PYEValue
$0.00Loading...
Loading
Loading...
Loading
Loading...
Loading
# | Exchange | Pair | Price | 24H Volume | % Volume |
---|
Contract Name:
PYE
Compiler Version
v0.8.16+commit.07a7930e
Contract Source Code (Solidity Standard Json-Input format)
// SPDX-License-Identifier: MIT pragma solidity 0.8.16; import "@openzeppelin/contracts/utils/math/SafeMath.sol"; import "@openzeppelin/contracts/token/ERC20/ERC20.sol"; import "@openzeppelin/contracts/access/Ownable.sol"; import "@openzeppelin/contracts/utils/Context.sol"; import "@openzeppelin/contracts/utils/Address.sol"; import "@openzeppelin/contracts/utils/Arrays.sol"; import "@openzeppelin/contracts/utils/Counters.sol"; import "./interfaces/IPYESwapFactory.sol"; import "./interfaces/IPYESwapRouter.sol"; import "./interfaces/IStakingContract.sol"; contract PYE is Context, ERC20, Ownable { // allows easy determination of actual msg.sender in meta-transactions using Address for address; // declare SafeMath useage so compiler recognizes SafeMath syntax using SafeMath for uint256; //--------------------------------------BEGIN FEE INFO---------| // Fees struct Fees { uint256 reflectionFee; uint256 developmentFee; uint256 buybackFee; address developmentAddress; } // Transaction fee values struct FeeValues { uint256 transferAmount; uint256 reflection; uint256 development; uint256 buyBack; } // instantiating new Fees structs (see struct Fees above) Fees private _defaultFees; Fees public _buyFees; Fees private _previousFees; Fees private _emptyFees; Fees public _sellFees; Fees private _outsideBuyFees; Fees private _outsideSellFees; //--------------------------------------BEGIN MAPPINGS---------| // user mappings for token balances and spending allowances. mapping (address => uint256) _balances; mapping (address => mapping (address => uint256)) private _allowances; // user states governing fee exclusion, blacklist status, Reward exempt (meaning no reflection entitlement) mapping (address => bool) private _isExcludedFromFee; mapping (address => bool) isTxLimitExempt; mapping (address => bool) isRewardExempt; mapping (address => bool) isBlacklisted; // Pair Details mapping (uint256 => address) private pairs; mapping (uint256 => address) private tokens; uint256 private pairsLength; mapping (address => bool) public _isPairAddress; // Outside Swap Pairs mapping (address => bool) private _includeSwapFee; // Staking Contracts mapping (address => bool) public isStakingContract; // Allowed Callers of Snapshot() mapping (address => bool) public isSnapshotter; //--------------------------------------BEGIN TOKEN PARAMS---------| // token details. // tTotal is the total token supply (100 mil with 9 decimals) string constant _name = "PYE"; string constant _symbol = "PYE"; uint8 constant _decimals = 9; uint256 private constant _tTotal = 100000000 * (10 ** _decimals); //--------------------------------------BEGIN TOKEN STAKED INFO---------| struct Staked { uint256 amount; } address[] holders; mapping (address => uint256) holderIndexes; mapping (address => Staked) public staked; uint256 public totalStaked; //--------------------------------------BEGIN ROUTER, WETH, BURN ADDRESS INFO---------| IPYESwapRouter public pyeSwapRouter; address public pyeSwapPair; address public WETH; address public USDC; address public constant _burnAddress = 0x000000000000000000000000000000000000dEaD; uint256 public _maxTxAmount = 5 * 10**8 * 10**9; //--------------------------------------BEGIN BUYBACK VARIABLES---------| // auto set buyback to false. additional buyback params. blockPeriod acts as a time delay in the shouldAutoBuyback(). Last uint represents last block for buyback occurance. bool public autoBuybackEnabled = false; uint256 autoBuybackCap; uint256 autoBuybackAccumulator; uint256 public autoBuybackAmount; uint256 autoBuybackBlockPeriod; uint256 autoBuybackBlockLast; uint256 minimumBuyBackThreshold = _tTotal / 1000000; // 0.0001% //--------------------------------------STAKING CONT. INSTANCES---------| IStakingContract public StakingContract; address public stakingContract; uint256 distributorGas = 500000; //--------------------------------------BEGIN SWAP INFO---------| bool inSwap; // function modifiers handling swap status modifier swapping() { inSwap = true; _; inSwap = false; } modifier onlyExchange() { bool isPair = false; for(uint i = 0; i < pairsLength; i++) { if(pairs[i] == msg.sender) isPair = true; } require( msg.sender == address(pyeSwapRouter) || isPair , "PYE: NOT_ALLOWED" ); _; } //--------------------------------------BEGIN CONSTRUCTOR AND RECEIVE FUNCTION---------| constructor() ERC20("PYE", "PYE") { _balances[_msgSender()] = _tTotal; pyeSwapRouter = IPYESwapRouter(0x3b505Af97031B75e2be39e7F8FA1Fa634857f29D); WETH = pyeSwapRouter.WETH(); USDC = 0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48; pyeSwapPair = IPYESwapFactory(pyeSwapRouter.factory()).createPair(address(this), WETH, true, address(this)); tokens[pairsLength] = WETH; pairs[pairsLength] = pyeSwapPair; pairsLength += 1; _isPairAddress[pyeSwapPair] = true; _isExcludedFromFee[owner()] = true; _isExcludedFromFee[address(this)] = true; _isExcludedFromFee[pyeSwapPair] = true; _isExcludedFromFee[stakingContract] = true; isTxLimitExempt[_msgSender()] = true; isTxLimitExempt[pyeSwapPair] = true; isTxLimitExempt[address(pyeSwapRouter)] = true; isTxLimitExempt[stakingContract] = true; isRewardExempt[_msgSender()] = true; isRewardExempt[pyeSwapPair] = true; isRewardExempt[address(this)] = true; isRewardExempt[_burnAddress] = true; isRewardExempt[stakingContract] = true; isSnapshotter[msg.sender] = true; _defaultFees = Fees( 800, 200, 0, 0x99b4e1F2B2a3a17CA890b992B892ABCCd44E0c9a ); _buyFees = Fees( 800, 200, 0, 0x99b4e1F2B2a3a17CA890b992B892ABCCd44E0c9a ); _sellFees = Fees( 1800, 200, 0, 0x99b4e1F2B2a3a17CA890b992B892ABCCd44E0c9a ); _outsideBuyFees = Fees( 800, 200, 0, 0x99b4e1F2B2a3a17CA890b992B892ABCCd44E0c9a ); _outsideSellFees = Fees( 1800, 200, 0, 0x99b4e1F2B2a3a17CA890b992B892ABCCd44E0c9a ); emit Transfer(address(0), _msgSender(), _tTotal); } //to receive ETH from pyeRouter when swapping receive() external payable {} //--------------------------------------BEGIN BLACKLIST FUNCTIONS---------| // enter an address to blacklist it. This blocks transfers TO that address. Balcklisted members can still sell. function blacklistAddress(address addressToBlacklist) public onlyOwner { require(!isBlacklisted[addressToBlacklist] , "Address is already blacklisted!"); isBlacklisted[addressToBlacklist] = true; } // enter a currently blacklisted address to un-blacklist it. function removeFromBlacklist(address addressToRemove) public onlyOwner { require(isBlacklisted[addressToRemove] , "Address has not been blacklisted! Enter an address that is on the blacklist."); isBlacklisted[addressToRemove] = false; } //--------------------------------------BEGIN TOKEN GETTER FUNCTIONS---------| // decimal return fxn is explicitly stated to override the std. ERC-20 decimals() fxn which is programmed to return uint 18, but // PYE has 9 decimals. function decimals() public pure override returns (uint8) { return _decimals; } // totalSupply return fxn is explicitly stated to override the std. ERC-20 totalSupply() fxn which is programmed to return a uint "totalSupply", but // PYE uses "_tTotal" variable to define total token supply, function totalSupply() public pure override(ERC20) returns (uint256) { return _tTotal; } // balanceOf function displays the tokens in the specified account wallet. function balanceOf(address account) public view override(ERC20) returns (uint256) { return _balances[account]; } // returns the owned amount of tokens, including tokens that are staked in main pool. Balance qualifies for tier privileges. function getOwnedBalance(address account) public view returns (uint256){ return staked[account].amount.add(_balances[account]); } // returns the circulating token supply minus the balance in the burn address (0x00..dEAD) and the balance in address(0) (0x00...00) function getCirculatingSupply() public view returns (uint256) { return _tTotal.sub(balanceOf(_burnAddress)).sub(balanceOf(address(0))); } //--------------------------------------BEGIN TOKEN PAIR FUNCTIONS---------| // returns the index of paired tokens function _getTokenIndex(address _token) internal view returns (uint256) { uint256 index = pairsLength + 1; for(uint256 i = 0; i < pairsLength; i++) { if(tokens[i] == _token) index = i; } return index; } // check if a pair of tokens are paired function _checkPairRegistered(address _pair) internal view returns (bool) { bool isPair = false; for(uint i = 0; i < pairsLength; i++) { if(pairs[i] == _pair) isPair = true; } return isPair; } function addPair(address _pair, address _token) public { address factory = pyeSwapRouter.factory(); require( msg.sender == factory || msg.sender == address(pyeSwapRouter) || msg.sender == address(this) , "PYE: NOT_ALLOWED" ); if(!_checkPairRegistered(_pair)) { _isExcludedFromFee[_pair] = true; _isPairAddress[_pair] = true; isTxLimitExempt[_pair] = true; isRewardExempt[_pair] = true; pairs[pairsLength] = _pair; tokens[pairsLength] = _token; pairsLength += 1; } } function addOutsideSwapPair(address account) public onlyOwner { _includeSwapFee[account] = true; } function removeOutsideSwapPair(address account) public onlyOwner { _includeSwapFee[account] = false; } // set an address as a staking contract function setIsStakingContract(address account, bool set) external onlyOwner { isStakingContract[account] = set; } //--------------------------------------BEGIN RESCUE FUNCTIONS---------| // Rescue eth that is sent here by mistake function rescueETH(uint256 amount, address to) external onlyOwner { payable(to).transfer(amount); } // Rescue tokens that are sent here by mistake function rescueToken(IERC20 token, uint256 amount, address to) external onlyOwner { if( token.balanceOf(address(this)) < amount ) { amount = token.balanceOf(address(this)); } token.transfer(to, amount); } //--------------------------------------BEGIN APPROVAL & ALLOWANCE FUNCTIONS---------| // allowance fxn is identical to ERC-20 allowance fxn. As per tommy's request, function is still explicity declared. function allowance(address owner, address spender) public view override(ERC20) returns (uint256) { return _allowances[owner][spender]; } // approve fxn overrides std. ERC-20 approve() fxn which declares address owner = _msgSender(), whereas PYE approve() fxn does not. function approve(address spender, uint256 amount) public override(ERC20) returns (bool) { _approve(_msgSender(), spender, amount); return true; } // added override tag, see same explanation for approve() function above. function increaseAllowance(address spender, uint256 addedValue) public override virtual returns (bool) { _approve(_msgSender(), spender, _allowances[_msgSender()][spender].add(addedValue)); return true; } // added override tag, see same explanation for approve() function above. function decreaseAllowance(address spender, uint256 subtractedValue) public override virtual returns (bool) { _approve(_msgSender(), spender, _allowances[_msgSender()][spender].sub(subtractedValue, "ERC20: decreased allowance below zero")); return true; } // added override tag for error message clarity (BEP vs ERC), changed visibility from private to internal to avoid compiler errors. function _approve( address owner, address spender, uint256 amount ) internal override { require(owner != address(0), "ERC20: approve from the zero address"); require(spender != address(0), "ERC20: approve to the zero address"); _allowances[owner][spender] = amount; emit Approval(owner, spender, amount); } //--------------------------------------BEGIN FEE FUNCTIONS---------| // get sum of all fees function getTotalFee(address account) public view returns (uint256) { if(_isExcludedFromFee[account]) { return 0; } else { return _defaultFees.reflectionFee .add(_defaultFees.developmentFee) .add(_defaultFees.buybackFee); } } function getFee() public view returns (uint256) { return _defaultFees.reflectionFee .add(_defaultFees.developmentFee) .add(_defaultFees.buybackFee); } // takes fees function _takeFees(FeeValues memory values) private { _takeFee(values.development.add(values.reflection), _defaultFees.developmentAddress); _takeFee(values.buyBack, _burnAddress); } // collects fees function _takeFee(uint256 tAmount, address recipient) private { if(recipient == address(0)) return; if(tAmount == 0) return; _balances[recipient] = _balances[recipient].add(tAmount); } // calculates the fee function calculateFee(uint256 _amount, uint256 _fee) private pure returns (uint256) { if(_fee == 0) return 0; return _amount.mul(_fee).div( 10**4 ); } // restores all fees function restoreAllFee() private { _defaultFees = _previousFees; } // removes all fees function removeAllFee() private { _previousFees = _defaultFees; _defaultFees = _emptyFees; } function setSellFee() private { _defaultFees = _sellFees; } function setOutsideBuyFee() private { _previousFees = _defaultFees; _defaultFees = _outsideBuyFees; } function setOutsideSellFee() private { _previousFees = _defaultFees; _defaultFees = _outsideSellFees; } // shows whether or not an account is excluded from fees function isExcludedFromFee(address account) public view returns(bool) { return _isExcludedFromFee[account]; } // returns whether or not an entered address is entitled to rewards function isExcludedFromReward(address account) public view returns (bool) { return isRewardExempt[account]; } // allows Owner to make an address exempt from fees function excludeFromFee(address account) public onlyOwner { _isExcludedFromFee[account] = true; } // allows Owner to make an address incur fees function includeInFee(address account) public onlyOwner { _isExcludedFromFee[account] = false; } // allows Owner to change max TX percent function setMaxTxPercent(uint256 maxTxPercent) external onlyOwner { _maxTxAmount = _tTotal.mul(maxTxPercent).div( 10**4 ); } // set an address to be tx limit exempt function setIsTxLimitExempt(address holder, bool exempt) external onlyOwner { isTxLimitExempt[holder] = exempt; } // safety check for set tx limit function checkTxLimit(address sender, uint256 amount) internal view { require(amount <= _maxTxAmount || isTxLimitExempt[sender], "TX Limit Exceeded"); } // returns the specified values function _getValues(uint256 tAmount) private view returns (FeeValues memory) { FeeValues memory values = FeeValues( 0, calculateFee(tAmount, _defaultFees.reflectionFee), calculateFee(tAmount, _defaultFees.developmentFee), calculateFee(tAmount, _defaultFees.buybackFee) ); values.transferAmount = tAmount.sub(values.reflection).sub(values.development).sub(values.buyBack); return values; } function handleFee(uint256 amount, address token) public onlyExchange { if(amount == 0) { restoreAllFee(); } else { uint256 tokenIndex = _getTokenIndex(token); if(tokenIndex < pairsLength) { uint256 allowanceT = IERC20(token).allowance(msg.sender, address(this)); if(allowanceT >= amount) { IERC20(token).transferFrom(msg.sender, address(this), amount); if(token == USDC) { uint256 totalFee = getFee(); uint256 developmentFeeAmount = amount.mul(_defaultFees.developmentFee).div(totalFee); uint256 reflectionFeeAmount = amount.mul(_defaultFees.reflectionFee).div(totalFee); uint256 buybackFeeAmount = amount.mul(_defaultFees.buybackFee).div(totalFee); IERC20(token).transfer(stakingContract, reflectionFeeAmount); try StakingContract.depositUSDCToStakingContract(reflectionFeeAmount) {} catch {} uint256 balanceBefore = IERC20(address(WETH)).balanceOf(address(this)); uint256 amountToSwap = developmentFeeAmount.add(buybackFeeAmount); uint256 totalFee2 = _defaultFees.developmentFee.add(_defaultFees.buybackFee); swapToWETH(amountToSwap, token); uint256 fAmount = IERC20(address(WETH)).balanceOf(address(this)).sub(balanceBefore); uint256 developmentFeeAmount2 = fAmount.mul(_defaultFees.developmentFee).div(totalFee2); IERC20(WETH).transfer(_defaultFees.developmentAddress, developmentFeeAmount2); } else if(token == WETH) { // All fees to be declared here in order to be calculated and sent uint256 totalFee = getFee(); uint256 developmentFeeAmount = amount.mul(_defaultFees.developmentFee).div(totalFee); uint256 reflectionFeeAmount = amount.mul(_defaultFees.reflectionFee).div(totalFee); uint256 balanceBefore = IERC20(address(USDC)).balanceOf(address(this)); swapToUSDC(reflectionFeeAmount, token); uint256 reflectionUSDCFeeAmount = IERC20(address(USDC)).balanceOf(address(this)).sub(balanceBefore); IERC20(token).transfer(_defaultFees.developmentAddress, developmentFeeAmount); IERC20(USDC).transfer(stakingContract, reflectionUSDCFeeAmount); try StakingContract.depositUSDCToStakingContract(reflectionUSDCFeeAmount) {} catch {} } else { uint256 balanceBefore = IERC20(address(WETH)).balanceOf(address(this)); swapToWETH(amount, token); uint256 fAmount = IERC20(address(WETH)).balanceOf(address(this)).sub(balanceBefore); // All fees to be declared here in order to be calculated and sent uint256 totalFee = getFee(); uint256 developmentFeeAmount = fAmount.mul(_defaultFees.developmentFee).div(totalFee); uint256 reflectionFeeAmount = fAmount.mul(_defaultFees.reflectionFee).div(totalFee); uint256 balanceUSDCBefore = IERC20(address(USDC)).balanceOf(address(this)); swapToUSDC(reflectionFeeAmount, token); uint256 reflectionUSDCFeeAmount = IERC20(address(USDC)).balanceOf(address(this)).sub(balanceUSDCBefore); IERC20(WETH).transfer(_defaultFees.developmentAddress, developmentFeeAmount); IERC20(USDC).transfer(stakingContract, reflectionUSDCFeeAmount); try StakingContract.depositUSDCToStakingContract(reflectionUSDCFeeAmount) {} catch {} } restoreAllFee(); } } } } function swapToUSDC(uint256 amount, address token) internal { address[] memory path = new address[](2); path[0] = token; path[1] = USDC; IERC20(token).approve(address(pyeSwapRouter), amount); pyeSwapRouter.swapExactTokensForTokensSupportingFeeOnTransferTokens( amount, 0, path, address(this), block.timestamp ); } function swapToWETH(uint256 amount, address token) internal { address[] memory path = new address[](2); path[0] = token; path[1] = WETH; IERC20(token).approve(address(pyeSwapRouter), amount); pyeSwapRouter.swapExactTokensForTokensSupportingFeeOnTransferTokens( amount, 0, path, address(this), block.timestamp ); } // allows user to set an address as Reward exempt function setIsRewardExempt(address holder, bool exempt) external onlyOwner { require(holder != address(this) && holder != pyeSwapPair); isRewardExempt[holder] = exempt; if(exempt){ setStaked(holder, 0); }else{ setStaked(holder, _balances[holder]); } } // set fee values on buys function setBuyFees(uint256 _reflectionFee, uint256 _developmentFee, uint256 _buybackFee) external onlyOwner { _defaultFees.reflectionFee = _reflectionFee; _defaultFees.developmentFee = _developmentFee; _defaultFees.buybackFee = _buybackFee; _buyFees.reflectionFee = _reflectionFee; _buyFees.developmentFee = _developmentFee; _buyFees.buybackFee = _buybackFee; _outsideBuyFees.reflectionFee = _reflectionFee; _outsideBuyFees.developmentFee = _developmentFee; _outsideBuyFees.buybackFee = _buybackFee; } // set fee values on sells function setSellFees(uint256 _reflectionFee, uint256 _developmentFee, uint256 _buybackFee) external onlyOwner { _sellFees.reflectionFee = _reflectionFee; _sellFees.developmentFee = _developmentFee; _sellFees.buybackFee = _buybackFee; _outsideSellFees.reflectionFee = _reflectionFee; _outsideSellFees.developmentFee = _developmentFee; _outsideSellFees.buybackFee = _buybackFee; } //--------------------------------------BEGIN SET ADDRESS FUNCTIONS---------| // manually set development address function setDevelopmentAddress(address _development) external onlyOwner { require(_development != address(0), "PYE: Address Zero is not allowed"); _defaultFees.developmentAddress = _development; _buyFees.developmentAddress = _development; _sellFees.developmentAddress = _development; _outsideBuyFees.developmentAddress = _development; _outsideSellFees.developmentAddress = _development; } function setNewStakingContract(address _newStakingContract) external onlyOwner { stakingContract = (_newStakingContract); StakingContract = IStakingContract(_newStakingContract); isTxLimitExempt[_newStakingContract] = true; isRewardExempt[_newStakingContract] = true; _isExcludedFromFee[_newStakingContract] = true; isStakingContract[_newStakingContract] = true; } //--------------------------------------BEGIN STAKED BALANCE FUNCTIONS---------| function setStaked(address holder, uint256 amount) internal { if(amount > 0 && staked[holder].amount == 0){ addHolder(holder); }else if(amount == 0 && staked[holder].amount > 0){ removeHolder(holder); } totalStaked = totalStaked.sub(staked[holder].amount).add(amount); staked[holder].amount = amount; } function addHolder(address holder) internal { holderIndexes[holder] = holders.length; holders.push(holder); } function removeHolder(address holder) internal { holders[holderIndexes[holder]] = holders[holders.length-1]; holderIndexes[holders[holders.length-1]] = holderIndexes[holder]; holders.pop(); } //--------------------------------------BEGIN BUYBACK FUNCTIONS---------| // runs check to see if autobuyback should trigger function shouldAutoBuyback(uint256 amount) internal view returns (bool) { return msg.sender != pyeSwapPair && !inSwap && autoBuybackEnabled && autoBuybackBlockLast + autoBuybackBlockPeriod <= block.number // After N blocks from last buyback && IERC20(address(WETH)).balanceOf(address(this)) >= autoBuybackAmount && amount >= minimumBuyBackThreshold; } // triggers auto buyback function triggerAutoBuyback() internal { buyTokens(autoBuybackAmount, _burnAddress); autoBuybackBlockLast = block.number; autoBuybackAccumulator = autoBuybackAccumulator.add(autoBuybackAmount); if(autoBuybackAccumulator > autoBuybackCap){ autoBuybackEnabled = false; } } // logic to purchase PYE tokens function buyTokens(uint256 amount, address to) internal swapping { address[] memory path = new address[](2); path[0] = WETH; path[1] = address(this); IERC20(WETH).approve(address(pyeSwapRouter), amount); pyeSwapRouter.swapExactTokensForTokensSupportingFeeOnTransferTokens( amount, 0, path, to, block.timestamp ); } function triggerManualBuyback(uint256 _amount) public onlyOwner { uint256 contractBalance = IERC20(WETH).balanceOf(address(this)); require(_amount <= contractBalance , "Amount exceeds contract balance"); buyTokens(_amount, _burnAddress); } // manually adjust the buyback settings to suit your needs function setAutoBuybackSettings(bool _enabled, uint256 _cap, uint256 _amount, uint256 _period) external onlyOwner { autoBuybackEnabled = _enabled; autoBuybackCap = _cap; autoBuybackAccumulator = 0; autoBuybackAmount = _amount; autoBuybackBlockPeriod = _period; autoBuybackBlockLast = block.number; } // manually adjust minimumBuyBackThreshold Denominator. Threshold will be tTotal divided by Denominator. default 1000000 or .0001% function setBuyBackThreshold(uint256 thresholdDenominator) external onlyOwner { minimumBuyBackThreshold = _tTotal / thresholdDenominator; } //--------------------------------------BEGIN ROUTER FUNCTIONS---------| function updateRouterAndPair(address _router, address _pair) public onlyOwner { _isExcludedFromFee[address(pyeSwapRouter)] = false; _isExcludedFromFee[pyeSwapPair] = false; pyeSwapRouter = IPYESwapRouter(_router); pyeSwapPair = _pair; WETH = pyeSwapRouter.WETH(); _isExcludedFromFee[address(pyeSwapRouter)] = true; _isExcludedFromFee[pyeSwapPair] = true; isRewardExempt[pyeSwapPair] = true; _isPairAddress[pyeSwapPair] = true; isTxLimitExempt[pyeSwapPair] = true; isTxLimitExempt[address(pyeSwapRouter)] = true; pairs[0] = pyeSwapPair; tokens[0] = WETH; } //--------------------------------------BEGIN TRANSFER FUNCTIONS---------| // transfer fxn is explicitly stated to override the std. ERC-20 transfer fxn which uses "to" param, but // PYE uses "recipient" param. function transfer(address recipient, uint256 amount) public override(ERC20) returns (bool) { _transfer(_msgSender(), recipient, amount); return true; } // transferFrom explicitly stated and overrides ERC-20 std becasue of variable name differences. function transferFrom(address sender, address recipient, uint256 amount) public override(ERC20) returns (bool) { _transfer(sender, recipient, amount); _approve(sender, _msgSender(), _allowances[sender][_msgSender()].sub(amount, "ERC20: transfer amount exceeds allowance")); return true; } function _transfer( address from, address to, uint256 amount ) internal override { require(from != address(0), "ERC20: transfer from the zero address"); require(to != address(0), "ERC20: transfer to the zero address"); require(amount > 0, "Transfer amount must be greater than zero"); require(!isBlacklisted[to]); _beforeTokenTransfer(from, to, amount); checkTxLimit(from, amount); if (shouldAutoBuyback(amount)) { triggerAutoBuyback(); } //indicates if fee should be deducted from transfer uint8 takeFee = 0; if(_isPairAddress[to] && from != address(pyeSwapRouter) && !isExcludedFromFee(from)) { takeFee = 1; } else if(_includeSwapFee[from]) { takeFee = 2; } else if(_includeSwapFee[to]) { takeFee = 3; } //transfer amount, it will take tax _tokenTransfer(from, to, amount, takeFee); } function _tokenTransfer(address sender, address recipient, uint256 amount, uint8 takeFee) private { if(takeFee == 0 || takeFee == 1) { removeAllFee(); _balances[sender] = _balances[sender].sub(amount, "Insufficient Balance"); _balances[recipient] = _balances[recipient].add(amount); if(isStakingContract[recipient]) { uint256 newAmountAdd = staked[sender].amount.add(amount); setStaked(sender, newAmountAdd); } if(isStakingContract[sender]) { uint256 newAmountSub = staked[recipient].amount.sub(amount); setStaked(recipient, newAmountSub); } emit Transfer(sender, recipient, amount); if(takeFee == 0) { restoreAllFee(); } else if(takeFee == 1) { setSellFee(); } } else { if(takeFee == 2) { setOutsideBuyFee(); } else if(takeFee == 3) { setOutsideSellFee(); } FeeValues memory _values = _getValues(amount); _balances[sender] = _balances[sender].sub(amount, "Insufficient Balance"); _balances[recipient] = _balances[recipient].add(_values.transferAmount); _takeFees(_values); restoreAllFee(); emit Transfer(sender, recipient, _values.transferAmount); emit Transfer(sender, _defaultFees.developmentAddress, _values.development.add(_values.reflection)); emit Transfer(sender, _burnAddress, _values.buyBack); } } //--------------------BEGIN MODIFIED SNAPSHOT FUNCITONALITY--------------- // @dev a modified implementation of ERC20 Snapshot to keep track of staked balances + balanceOf. // ERC20 Snapshot import/inheritance is avoided in this contract to avoid issues with interface conflicts and to directly control private // functionality // copied from source: https://github.com/OpenZeppelin/openzeppelin-contracts/blob/master/contracts/token/ERC20/extensions/ERC20Snapshot.sol using Arrays for uint256[]; using Counters for Counters.Counter; Counters.Counter private _currentSnapshotId; struct Snapshots { uint256[] ids; uint256[] values; } mapping(address => Snapshots) private _accountBalanceSnapshots; Snapshots private _totalSupplySnapshots; // @dev Emitted by {_snapshot} when a snapshot identified by `id` is created. event Snapshot(uint256 id); // owner grant and revoke Snapshotter role to account. function setIsSnapshotter(address account, bool flag) external onlyOwner { isSnapshotter[account] = flag; } // generate a snapshot, calls internal _snapshot(). function snapshot() public { require(isSnapshotter[msg.sender], "Caller is not allowed to snapshot"); _snapshot(); } function _snapshot() internal returns (uint256) { _currentSnapshotId.increment(); uint256 currentId = _getCurrentSnapshotId(); emit Snapshot(currentId); return currentId; } function _getCurrentSnapshotId() internal view returns (uint256) { return _currentSnapshotId.current(); } function getCurrentSnapshotId() public view returns (uint256) { return _getCurrentSnapshotId(); } // balOf + staked function balanceOfAt(address account, uint256 snapshotId) public view virtual returns (uint256) { (bool snapshotted, uint256 value) = _valueAt(snapshotId, _accountBalanceSnapshots[account]); return snapshotted ? value : (balanceOf(account) + staked[account].amount); } function totalSupplyAt(uint256 snapshotId) public view virtual returns (uint256) { (bool snapshotted, uint256 value) = _valueAt(snapshotId, _totalSupplySnapshots); return snapshotted ? value : totalSupply(); } function _valueAt(uint256 snapshotId, Snapshots storage snapshots) private view returns (bool, uint256) { require(snapshotId > 0, "ERC20Snapshot: id is 0"); require(snapshotId <= _getCurrentSnapshotId(), "ERC20Snapshot: nonexistent id"); uint256 index = snapshots.ids.findUpperBound(snapshotId); if (index == snapshots.ids.length) { return (false, 0); } else { return (true, snapshots.values[index]); } } function _beforeTokenTransfer( address from, address to, uint256 amount ) internal override { super._beforeTokenTransfer(from, to, amount); if (from == address(0)) { // mint _updateAccountSnapshot(to); _updateTotalSupplySnapshot(); } else if (to == address(0)) { // burn _updateAccountSnapshot(from); _updateTotalSupplySnapshot(); } else if (isStakingContract[to]) { // user is staking _updateAccountSnapshot(from); } else if (isStakingContract[from]) { // user is unstaking _updateAccountSnapshot(to); } else { // transfer _updateAccountSnapshot(from); _updateAccountSnapshot(to); } } // tracks staked and owned function _updateAccountSnapshot(address account) private { _updateSnapshot(_accountBalanceSnapshots[account], (balanceOf(account) + staked[account].amount)); } function _updateTotalSupplySnapshot() private { _updateSnapshot(_totalSupplySnapshots, totalSupply()); } function _updateSnapshot(Snapshots storage snapshots, uint256 currentValue) private { uint256 currentId = _getCurrentSnapshotId(); if (_lastSnapshotId(snapshots.ids) < currentId) { snapshots.ids.push(currentId); snapshots.values.push(currentValue); } } function _lastSnapshotId(uint256[] storage ids) private view returns (uint256) { if (ids.length == 0) { return 0; } else { return ids[ids.length - 1]; } } }
// SPDX-License-Identifier: MIT pragma solidity ^0.8.1; interface IStakingContract { function depositUSDCToStakingContract(uint256 _amount) external; }
// SPDX-License-Identifier: MIT pragma solidity >=0.6.2; import './IPYESwapRouter01.sol'; interface IPYESwapRouter is IPYESwapRouter01 { function removeLiquidityETHSupportingFeeOnTransferTokens( address token, uint liquidity, uint amountTokenMin, uint amountETHMin, address to, uint deadline ) external returns (uint amountETH); function removeLiquidityETHWithPermitSupportingFeeOnTransferTokens( address token, uint liquidity, uint amountTokenMin, uint amountETHMin, address to, uint deadline, bool approveMax, uint8 v, bytes32 r, bytes32 s ) external returns (uint amountETH); function swapExactTokensForTokensSupportingFeeOnTransferTokens( uint amountIn, uint amountOutMin, address[] calldata path, address to, uint deadline ) external; function swapExactETHForTokensSupportingFeeOnTransferTokens( uint amountOutMin, address[] calldata path, address to, uint deadline ) external payable; function swapExactTokensForETHSupportingFeeOnTransferTokens( uint amountIn, uint amountOutMin, address[] calldata path, address to, uint deadline ) external; function pairFeeAddress(address pair) external view returns (address); function adminFee() external view returns (uint256); function feeAddressGet() external view returns (address); }
// SPDX-License-Identifier: MIT pragma solidity >=0.5.0; interface IPYESwapFactory { event PairCreated(address indexed token0, address indexed token1, address pair, uint); function feeTo() external view returns (address); function feeToSetter() external view returns (address); function getPair(address tokenA, address tokenB) external view returns (address pair); function allPairs(uint) external view returns (address pair); function allPairsLength() external view returns (uint); function pairExist(address pair) external view returns (bool); function createPair(address tokenA, address tokenB, bool supportsTokenFee, address feeTaker) external returns (address pair); function setFeeTo(address) external; function setFeeToSetter(address) external; function routerInitialize(address) external; function routerAddress() external view returns (address); }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts v4.4.1 (utils/Counters.sol) pragma solidity ^0.8.0; /** * @title Counters * @author Matt Condon (@shrugs) * @dev Provides counters that can only be incremented, decremented or reset. This can be used e.g. to track the number * of elements in a mapping, issuing ERC721 ids, or counting request ids. * * Include with `using Counters for Counters.Counter;` */ library Counters { struct Counter { // This variable should never be directly accessed by users of the library: interactions must be restricted to // the library's function. As of Solidity v0.5.2, this cannot be enforced, though there is a proposal to add // this feature: see https://github.com/ethereum/solidity/issues/4637 uint256 _value; // default: 0 } function current(Counter storage counter) internal view returns (uint256) { return counter._value; } function increment(Counter storage counter) internal { unchecked { counter._value += 1; } } function decrement(Counter storage counter) internal { uint256 value = counter._value; require(value > 0, "Counter: decrement overflow"); unchecked { counter._value = value - 1; } } function reset(Counter storage counter) internal { counter._value = 0; } }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts v4.4.1 (utils/Arrays.sol) pragma solidity ^0.8.0; import "./math/Math.sol"; /** * @dev Collection of functions related to array types. */ library Arrays { /** * @dev Searches a sorted `array` and returns the first index that contains * a value greater or equal to `element`. If no such index exists (i.e. all * values in the array are strictly less than `element`), the array length is * returned. Time complexity O(log n). * * `array` is expected to be sorted in ascending order, and to contain no * repeated elements. */ function findUpperBound(uint256[] storage array, uint256 element) internal view returns (uint256) { if (array.length == 0) { return 0; } uint256 low = 0; uint256 high = array.length; while (low < high) { uint256 mid = Math.average(low, high); // Note that mid will always be strictly less than high (i.e. it will be a valid array index) // because Math.average rounds down (it does integer division with truncation). if (array[mid] > element) { high = mid; } else { low = mid + 1; } } // At this point `low` is the exclusive upper bound. We will return the inclusive upper bound. if (low > 0 && array[low - 1] == element) { return low - 1; } else { return low; } } }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts (last updated v4.7.0) (utils/Address.sol) pragma solidity ^0.8.1; /** * @dev Collection of functions related to the address type */ library Address { /** * @dev Returns true if `account` is a contract. * * [IMPORTANT] * ==== * It is unsafe to assume that an address for which this function returns * false is an externally-owned account (EOA) and not a contract. * * Among others, `isContract` will return false for the following * types of addresses: * * - an externally-owned account * - a contract in construction * - an address where a contract will be created * - an address where a contract lived, but was destroyed * ==== * * [IMPORTANT] * ==== * You shouldn't rely on `isContract` to protect against flash loan attacks! * * Preventing calls from contracts is highly discouraged. It breaks composability, breaks support for smart wallets * like Gnosis Safe, and does not provide security since it can be circumvented by calling from a contract * constructor. * ==== */ function isContract(address account) internal view returns (bool) { // This method relies on extcodesize/address.code.length, which returns 0 // for contracts in construction, since the code is only stored at the end // of the constructor execution. return account.code.length > 0; } /** * @dev Replacement for Solidity's `transfer`: sends `amount` wei to * `recipient`, forwarding all available gas and reverting on errors. * * https://eips.ethereum.org/EIPS/eip-1884[EIP1884] increases the gas cost * of certain opcodes, possibly making contracts go over the 2300 gas limit * imposed by `transfer`, making them unable to receive funds via * `transfer`. {sendValue} removes this limitation. * * https://diligence.consensys.net/posts/2019/09/stop-using-soliditys-transfer-now/[Learn more]. * * IMPORTANT: because control is transferred to `recipient`, care must be * taken to not create reentrancy vulnerabilities. Consider using * {ReentrancyGuard} or the * https://solidity.readthedocs.io/en/v0.5.11/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern]. */ function sendValue(address payable recipient, uint256 amount) internal { require(address(this).balance >= amount, "Address: insufficient balance"); (bool success, ) = recipient.call{value: amount}(""); require(success, "Address: unable to send value, recipient may have reverted"); } /** * @dev Performs a Solidity function call using a low level `call`. A * plain `call` is an unsafe replacement for a function call: use this * function instead. * * If `target` reverts with a revert reason, it is bubbled up by this * function (like regular Solidity function calls). * * Returns the raw returned data. To convert to the expected return value, * use https://solidity.readthedocs.io/en/latest/units-and-global-variables.html?highlight=abi.decode#abi-encoding-and-decoding-functions[`abi.decode`]. * * Requirements: * * - `target` must be a contract. * - calling `target` with `data` must not revert. * * _Available since v3.1._ */ function functionCall(address target, bytes memory data) internal returns (bytes memory) { return functionCall(target, data, "Address: low-level call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], but with * `errorMessage` as a fallback revert reason when `target` reverts. * * _Available since v3.1._ */ function functionCall( address target, bytes memory data, string memory errorMessage ) internal returns (bytes memory) { return functionCallWithValue(target, data, 0, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but also transferring `value` wei to `target`. * * Requirements: * * - the calling contract must have an ETH balance of at least `value`. * - the called Solidity function must be `payable`. * * _Available since v3.1._ */ function functionCallWithValue( address target, bytes memory data, uint256 value ) internal returns (bytes memory) { return functionCallWithValue(target, data, value, "Address: low-level call with value failed"); } /** * @dev Same as {xref-Address-functionCallWithValue-address-bytes-uint256-}[`functionCallWithValue`], but * with `errorMessage` as a fallback revert reason when `target` reverts. * * _Available since v3.1._ */ function functionCallWithValue( address target, bytes memory data, uint256 value, string memory errorMessage ) internal returns (bytes memory) { require(address(this).balance >= value, "Address: insufficient balance for call"); require(isContract(target), "Address: call to non-contract"); (bool success, bytes memory returndata) = target.call{value: value}(data); return verifyCallResult(success, returndata, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but performing a static call. * * _Available since v3.3._ */ function functionStaticCall(address target, bytes memory data) internal view returns (bytes memory) { return functionStaticCall(target, data, "Address: low-level static call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`], * but performing a static call. * * _Available since v3.3._ */ function functionStaticCall( address target, bytes memory data, string memory errorMessage ) internal view returns (bytes memory) { require(isContract(target), "Address: static call to non-contract"); (bool success, bytes memory returndata) = target.staticcall(data); return verifyCallResult(success, returndata, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but performing a delegate call. * * _Available since v3.4._ */ function functionDelegateCall(address target, bytes memory data) internal returns (bytes memory) { return functionDelegateCall(target, data, "Address: low-level delegate call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`], * but performing a delegate call. * * _Available since v3.4._ */ function functionDelegateCall( address target, bytes memory data, string memory errorMessage ) internal returns (bytes memory) { require(isContract(target), "Address: delegate call to non-contract"); (bool success, bytes memory returndata) = target.delegatecall(data); return verifyCallResult(success, returndata, errorMessage); } /** * @dev Tool to verifies that a low level call was successful, and revert if it wasn't, either by bubbling the * revert reason using the provided one. * * _Available since v4.3._ */ function verifyCallResult( bool success, bytes memory returndata, string memory errorMessage ) internal pure returns (bytes memory) { if (success) { return returndata; } else { // Look for revert reason and bubble it up if present if (returndata.length > 0) { // The easiest way to bubble the revert reason is using memory via assembly /// @solidity memory-safe-assembly assembly { let returndata_size := mload(returndata) revert(add(32, returndata), returndata_size) } } else { revert(errorMessage); } } } }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts v4.4.1 (utils/Context.sol) pragma solidity ^0.8.0; /** * @dev Provides information about the current execution context, including the * sender of the transaction and its data. While these are generally available * via msg.sender and msg.data, they should not be accessed in such a direct * manner, since when dealing with meta-transactions the account sending and * paying for execution may not be the actual sender (as far as an application * is concerned). * * This contract is only required for intermediate, library-like contracts. */ abstract contract Context { function _msgSender() internal view virtual returns (address) { return msg.sender; } function _msgData() internal view virtual returns (bytes calldata) { return msg.data; } }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts (last updated v4.7.0) (access/Ownable.sol) pragma solidity ^0.8.0; import "../utils/Context.sol"; /** * @dev Contract module which provides a basic access control mechanism, where * there is an account (an owner) that can be granted exclusive access to * specific functions. * * By default, the owner account will be the one that deploys the contract. This * can later be changed with {transferOwnership}. * * This module is used through inheritance. It will make available the modifier * `onlyOwner`, which can be applied to your functions to restrict their use to * the owner. */ abstract contract Ownable is Context { address private _owner; event OwnershipTransferred(address indexed previousOwner, address indexed newOwner); /** * @dev Initializes the contract setting the deployer as the initial owner. */ constructor() { _transferOwnership(_msgSender()); } /** * @dev Throws if called by any account other than the owner. */ modifier onlyOwner() { _checkOwner(); _; } /** * @dev Returns the address of the current owner. */ function owner() public view virtual returns (address) { return _owner; } /** * @dev Throws if the sender is not the owner. */ function _checkOwner() internal view virtual { require(owner() == _msgSender(), "Ownable: caller is not the owner"); } /** * @dev Leaves the contract without owner. It will not be possible to call * `onlyOwner` functions anymore. Can only be called by the current owner. * * NOTE: Renouncing ownership will leave the contract without an owner, * thereby removing any functionality that is only available to the owner. */ function renounceOwnership() public virtual onlyOwner { _transferOwnership(address(0)); } /** * @dev Transfers ownership of the contract to a new account (`newOwner`). * Can only be called by the current owner. */ function transferOwnership(address newOwner) public virtual onlyOwner { require(newOwner != address(0), "Ownable: new owner is the zero address"); _transferOwnership(newOwner); } /** * @dev Transfers ownership of the contract to a new account (`newOwner`). * Internal function without access restriction. */ function _transferOwnership(address newOwner) internal virtual { address oldOwner = _owner; _owner = newOwner; emit OwnershipTransferred(oldOwner, newOwner); } }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts (last updated v4.7.0) (token/ERC20/ERC20.sol) pragma solidity ^0.8.0; import "./IERC20.sol"; import "./extensions/IERC20Metadata.sol"; import "../../utils/Context.sol"; /** * @dev Implementation of the {IERC20} interface. * * This implementation is agnostic to the way tokens are created. This means * that a supply mechanism has to be added in a derived contract using {_mint}. * For a generic mechanism see {ERC20PresetMinterPauser}. * * TIP: For a detailed writeup see our guide * https://forum.zeppelin.solutions/t/how-to-implement-erc20-supply-mechanisms/226[How * to implement supply mechanisms]. * * We have followed general OpenZeppelin Contracts guidelines: functions revert * instead returning `false` on failure. This behavior is nonetheless * conventional and does not conflict with the expectations of ERC20 * applications. * * Additionally, an {Approval} event is emitted on calls to {transferFrom}. * This allows applications to reconstruct the allowance for all accounts just * by listening to said events. Other implementations of the EIP may not emit * these events, as it isn't required by the specification. * * Finally, the non-standard {decreaseAllowance} and {increaseAllowance} * functions have been added to mitigate the well-known issues around setting * allowances. See {IERC20-approve}. */ contract ERC20 is Context, IERC20, IERC20Metadata { mapping(address => uint256) private _balances; mapping(address => mapping(address => uint256)) private _allowances; uint256 private _totalSupply; string private _name; string private _symbol; /** * @dev Sets the values for {name} and {symbol}. * * The default value of {decimals} is 18. To select a different value for * {decimals} you should overload it. * * All two of these values are immutable: they can only be set once during * construction. */ constructor(string memory name_, string memory symbol_) { _name = name_; _symbol = symbol_; } /** * @dev Returns the name of the token. */ function name() public view virtual override returns (string memory) { return _name; } /** * @dev Returns the symbol of the token, usually a shorter version of the * name. */ function symbol() public view virtual override returns (string memory) { return _symbol; } /** * @dev Returns the number of decimals used to get its user representation. * For example, if `decimals` equals `2`, a balance of `505` tokens should * be displayed to a user as `5.05` (`505 / 10 ** 2`). * * Tokens usually opt for a value of 18, imitating the relationship between * Ether and Wei. This is the value {ERC20} uses, unless this function is * overridden; * * NOTE: This information is only used for _display_ purposes: it in * no way affects any of the arithmetic of the contract, including * {IERC20-balanceOf} and {IERC20-transfer}. */ function decimals() public view virtual override returns (uint8) { return 18; } /** * @dev See {IERC20-totalSupply}. */ function totalSupply() public view virtual override returns (uint256) { return _totalSupply; } /** * @dev See {IERC20-balanceOf}. */ function balanceOf(address account) public view virtual override returns (uint256) { return _balances[account]; } /** * @dev See {IERC20-transfer}. * * Requirements: * * - `to` cannot be the zero address. * - the caller must have a balance of at least `amount`. */ function transfer(address to, uint256 amount) public virtual override returns (bool) { address owner = _msgSender(); _transfer(owner, to, amount); return true; } /** * @dev See {IERC20-allowance}. */ function allowance(address owner, address spender) public view virtual override returns (uint256) { return _allowances[owner][spender]; } /** * @dev See {IERC20-approve}. * * NOTE: If `amount` is the maximum `uint256`, the allowance is not updated on * `transferFrom`. This is semantically equivalent to an infinite approval. * * Requirements: * * - `spender` cannot be the zero address. */ function approve(address spender, uint256 amount) public virtual override returns (bool) { address owner = _msgSender(); _approve(owner, spender, amount); return true; } /** * @dev See {IERC20-transferFrom}. * * Emits an {Approval} event indicating the updated allowance. This is not * required by the EIP. See the note at the beginning of {ERC20}. * * NOTE: Does not update the allowance if the current allowance * is the maximum `uint256`. * * Requirements: * * - `from` and `to` cannot be the zero address. * - `from` must have a balance of at least `amount`. * - the caller must have allowance for ``from``'s tokens of at least * `amount`. */ function transferFrom( address from, address to, uint256 amount ) public virtual override returns (bool) { address spender = _msgSender(); _spendAllowance(from, spender, amount); _transfer(from, to, amount); return true; } /** * @dev Atomically increases the allowance granted to `spender` by the caller. * * This is an alternative to {approve} that can be used as a mitigation for * problems described in {IERC20-approve}. * * Emits an {Approval} event indicating the updated allowance. * * Requirements: * * - `spender` cannot be the zero address. */ function increaseAllowance(address spender, uint256 addedValue) public virtual returns (bool) { address owner = _msgSender(); _approve(owner, spender, allowance(owner, spender) + addedValue); return true; } /** * @dev Atomically decreases the allowance granted to `spender` by the caller. * * This is an alternative to {approve} that can be used as a mitigation for * problems described in {IERC20-approve}. * * Emits an {Approval} event indicating the updated allowance. * * Requirements: * * - `spender` cannot be the zero address. * - `spender` must have allowance for the caller of at least * `subtractedValue`. */ function decreaseAllowance(address spender, uint256 subtractedValue) public virtual returns (bool) { address owner = _msgSender(); uint256 currentAllowance = allowance(owner, spender); require(currentAllowance >= subtractedValue, "ERC20: decreased allowance below zero"); unchecked { _approve(owner, spender, currentAllowance - subtractedValue); } return true; } /** * @dev Moves `amount` of tokens from `from` to `to`. * * This internal function is equivalent to {transfer}, and can be used to * e.g. implement automatic token fees, slashing mechanisms, etc. * * Emits a {Transfer} event. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `from` must have a balance of at least `amount`. */ function _transfer( address from, address to, uint256 amount ) internal virtual { require(from != address(0), "ERC20: transfer from the zero address"); require(to != address(0), "ERC20: transfer to the zero address"); _beforeTokenTransfer(from, to, amount); uint256 fromBalance = _balances[from]; require(fromBalance >= amount, "ERC20: transfer amount exceeds balance"); unchecked { _balances[from] = fromBalance - amount; } _balances[to] += amount; emit Transfer(from, to, amount); _afterTokenTransfer(from, to, amount); } /** @dev Creates `amount` tokens and assigns them to `account`, increasing * the total supply. * * Emits a {Transfer} event with `from` set to the zero address. * * Requirements: * * - `account` cannot be the zero address. */ function _mint(address account, uint256 amount) internal virtual { require(account != address(0), "ERC20: mint to the zero address"); _beforeTokenTransfer(address(0), account, amount); _totalSupply += amount; _balances[account] += amount; emit Transfer(address(0), account, amount); _afterTokenTransfer(address(0), account, amount); } /** * @dev Destroys `amount` tokens from `account`, reducing the * total supply. * * Emits a {Transfer} event with `to` set to the zero address. * * Requirements: * * - `account` cannot be the zero address. * - `account` must have at least `amount` tokens. */ function _burn(address account, uint256 amount) internal virtual { require(account != address(0), "ERC20: burn from the zero address"); _beforeTokenTransfer(account, address(0), amount); uint256 accountBalance = _balances[account]; require(accountBalance >= amount, "ERC20: burn amount exceeds balance"); unchecked { _balances[account] = accountBalance - amount; } _totalSupply -= amount; emit Transfer(account, address(0), amount); _afterTokenTransfer(account, address(0), amount); } /** * @dev Sets `amount` as the allowance of `spender` over the `owner` s tokens. * * This internal function is equivalent to `approve`, and can be used to * e.g. set automatic allowances for certain subsystems, etc. * * Emits an {Approval} event. * * Requirements: * * - `owner` cannot be the zero address. * - `spender` cannot be the zero address. */ function _approve( address owner, address spender, uint256 amount ) internal virtual { require(owner != address(0), "ERC20: approve from the zero address"); require(spender != address(0), "ERC20: approve to the zero address"); _allowances[owner][spender] = amount; emit Approval(owner, spender, amount); } /** * @dev Updates `owner` s allowance for `spender` based on spent `amount`. * * Does not update the allowance amount in case of infinite allowance. * Revert if not enough allowance is available. * * Might emit an {Approval} event. */ function _spendAllowance( address owner, address spender, uint256 amount ) internal virtual { uint256 currentAllowance = allowance(owner, spender); if (currentAllowance != type(uint256).max) { require(currentAllowance >= amount, "ERC20: insufficient allowance"); unchecked { _approve(owner, spender, currentAllowance - amount); } } } /** * @dev Hook that is called before any transfer of tokens. This includes * minting and burning. * * Calling conditions: * * - when `from` and `to` are both non-zero, `amount` of ``from``'s tokens * will be transferred to `to`. * - when `from` is zero, `amount` tokens will be minted for `to`. * - when `to` is zero, `amount` of ``from``'s tokens will be burned. * - `from` and `to` are never both zero. * * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks]. */ function _beforeTokenTransfer( address from, address to, uint256 amount ) internal virtual {} /** * @dev Hook that is called after any transfer of tokens. This includes * minting and burning. * * Calling conditions: * * - when `from` and `to` are both non-zero, `amount` of ``from``'s tokens * has been transferred to `to`. * - when `from` is zero, `amount` tokens have been minted for `to`. * - when `to` is zero, `amount` of ``from``'s tokens have been burned. * - `from` and `to` are never both zero. * * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks]. */ function _afterTokenTransfer( address from, address to, uint256 amount ) internal virtual {} }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts (last updated v4.6.0) (utils/math/SafeMath.sol) pragma solidity ^0.8.0; // CAUTION // This version of SafeMath should only be used with Solidity 0.8 or later, // because it relies on the compiler's built in overflow checks. /** * @dev Wrappers over Solidity's arithmetic operations. * * NOTE: `SafeMath` is generally not needed starting with Solidity 0.8, since the compiler * now has built in overflow checking. */ library SafeMath { /** * @dev Returns the addition of two unsigned integers, with an overflow flag. * * _Available since v3.4._ */ function tryAdd(uint256 a, uint256 b) internal pure returns (bool, uint256) { unchecked { uint256 c = a + b; if (c < a) return (false, 0); return (true, c); } } /** * @dev Returns the subtraction of two unsigned integers, with an overflow flag. * * _Available since v3.4._ */ function trySub(uint256 a, uint256 b) internal pure returns (bool, uint256) { unchecked { if (b > a) return (false, 0); return (true, a - b); } } /** * @dev Returns the multiplication of two unsigned integers, with an overflow flag. * * _Available since v3.4._ */ function tryMul(uint256 a, uint256 b) internal pure returns (bool, uint256) { unchecked { // Gas optimization: this is cheaper than requiring 'a' not being zero, but the // benefit is lost if 'b' is also tested. // See: https://github.com/OpenZeppelin/openzeppelin-contracts/pull/522 if (a == 0) return (true, 0); uint256 c = a * b; if (c / a != b) return (false, 0); return (true, c); } } /** * @dev Returns the division of two unsigned integers, with a division by zero flag. * * _Available since v3.4._ */ function tryDiv(uint256 a, uint256 b) internal pure returns (bool, uint256) { unchecked { if (b == 0) return (false, 0); return (true, a / b); } } /** * @dev Returns the remainder of dividing two unsigned integers, with a division by zero flag. * * _Available since v3.4._ */ function tryMod(uint256 a, uint256 b) internal pure returns (bool, uint256) { unchecked { if (b == 0) return (false, 0); return (true, a % b); } } /** * @dev Returns the addition of two unsigned integers, reverting on * overflow. * * Counterpart to Solidity's `+` operator. * * Requirements: * * - Addition cannot overflow. */ function add(uint256 a, uint256 b) internal pure returns (uint256) { return a + b; } /** * @dev Returns the subtraction of two unsigned integers, reverting on * overflow (when the result is negative). * * Counterpart to Solidity's `-` operator. * * Requirements: * * - Subtraction cannot overflow. */ function sub(uint256 a, uint256 b) internal pure returns (uint256) { return a - b; } /** * @dev Returns the multiplication of two unsigned integers, reverting on * overflow. * * Counterpart to Solidity's `*` operator. * * Requirements: * * - Multiplication cannot overflow. */ function mul(uint256 a, uint256 b) internal pure returns (uint256) { return a * b; } /** * @dev Returns the integer division of two unsigned integers, reverting on * division by zero. The result is rounded towards zero. * * Counterpart to Solidity's `/` operator. * * Requirements: * * - The divisor cannot be zero. */ function div(uint256 a, uint256 b) internal pure returns (uint256) { return a / b; } /** * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo), * reverting when dividing by zero. * * Counterpart to Solidity's `%` operator. This function uses a `revert` * opcode (which leaves remaining gas untouched) while Solidity uses an * invalid opcode to revert (consuming all remaining gas). * * Requirements: * * - The divisor cannot be zero. */ function mod(uint256 a, uint256 b) internal pure returns (uint256) { return a % b; } /** * @dev Returns the subtraction of two unsigned integers, reverting with custom message on * overflow (when the result is negative). * * CAUTION: This function is deprecated because it requires allocating memory for the error * message unnecessarily. For custom revert reasons use {trySub}. * * Counterpart to Solidity's `-` operator. * * Requirements: * * - Subtraction cannot overflow. */ function sub( uint256 a, uint256 b, string memory errorMessage ) internal pure returns (uint256) { unchecked { require(b <= a, errorMessage); return a - b; } } /** * @dev Returns the integer division of two unsigned integers, reverting with custom message on * division by zero. The result is rounded towards zero. * * Counterpart to Solidity's `/` operator. Note: this function uses a * `revert` opcode (which leaves remaining gas untouched) while Solidity * uses an invalid opcode to revert (consuming all remaining gas). * * Requirements: * * - The divisor cannot be zero. */ function div( uint256 a, uint256 b, string memory errorMessage ) internal pure returns (uint256) { unchecked { require(b > 0, errorMessage); return a / b; } } /** * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo), * reverting with custom message when dividing by zero. * * CAUTION: This function is deprecated because it requires allocating memory for the error * message unnecessarily. For custom revert reasons use {tryMod}. * * Counterpart to Solidity's `%` operator. This function uses a `revert` * opcode (which leaves remaining gas untouched) while Solidity uses an * invalid opcode to revert (consuming all remaining gas). * * Requirements: * * - The divisor cannot be zero. */ function mod( uint256 a, uint256 b, string memory errorMessage ) internal pure returns (uint256) { unchecked { require(b > 0, errorMessage); return a % b; } } }
// SPDX-License-Identifier: MIT pragma solidity ^0.8.0; interface IPYESwapRouter01 { function factory() external pure returns (address); function WETH() 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 removeLiquidity( address tokenA, address tokenB, uint liquidity, uint amountAMin, uint amountBMin, address to, uint deadline ) external returns (uint amountA, uint amountB); function removeLiquidityETH( address token, uint liquidity, uint amountTokenMin, uint amountETHMin, address to, uint deadline ) external returns (uint amountToken, uint amountETH); function removeLiquidityWithPermit( address tokenA, address tokenB, uint liquidity, uint amountAMin, uint amountBMin, address to, uint deadline, bool approveMax, uint8 v, bytes32 r, bytes32 s ) external returns (uint amountA, uint amountB); function removeLiquidityETHWithPermit( address token, uint liquidity, uint amountTokenMin, uint amountETHMin, address to, uint deadline, bool approveMax, uint8 v, bytes32 r, bytes32 s ) external returns (uint amountToken, uint amountETH); function swapExactTokensForTokens( uint amountIn, uint amountOutMin, address[] calldata path, address to, uint deadline ) external returns (uint[] memory amounts); function swapTokensForExactTokens( uint amountOut, uint amountInMax, address[] calldata path, address to, uint deadline ) external returns (uint[] memory amounts); function swapExactETHForTokens(uint amountOutMin, address[] calldata path, address to, uint deadline) external payable returns (uint[] memory amounts); function swapTokensForExactETH(uint amountOut, uint amountInMax, address[] calldata path, address to, uint deadline) external returns (uint[] memory amounts); function swapExactTokensForETH(uint amountIn, uint amountOutMin, address[] calldata path, address to, uint deadline) external returns (uint[] memory amounts); function swapETHForExactTokens(uint amountOut, address[] calldata path, address to, uint deadline) external payable returns (uint[] memory amounts); function quote(uint amountA, uint reserveA, uint reserveB) external pure returns (uint amountB); 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); }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts (last updated v4.7.0) (utils/math/Math.sol) pragma solidity ^0.8.0; /** * @dev Standard math utilities missing in the Solidity language. */ library Math { enum Rounding { Down, // Toward negative infinity Up, // Toward infinity Zero // Toward zero } /** * @dev Returns the largest of two numbers. */ function max(uint256 a, uint256 b) internal pure returns (uint256) { return a >= b ? a : b; } /** * @dev Returns the smallest of two numbers. */ function min(uint256 a, uint256 b) internal pure returns (uint256) { return a < b ? a : b; } /** * @dev Returns the average of two numbers. The result is rounded towards * zero. */ function average(uint256 a, uint256 b) internal pure returns (uint256) { // (a + b) / 2 can overflow. return (a & b) + (a ^ b) / 2; } /** * @dev Returns the ceiling of the division of two numbers. * * This differs from standard division with `/` in that it rounds up instead * of rounding down. */ function ceilDiv(uint256 a, uint256 b) internal pure returns (uint256) { // (a + b - 1) / b can overflow on addition, so we distribute. return a == 0 ? 0 : (a - 1) / b + 1; } /** * @notice Calculates floor(x * y / denominator) with full precision. Throws if result overflows a uint256 or denominator == 0 * @dev Original credit to Remco Bloemen under MIT license (https://xn--2-umb.com/21/muldiv) * with further edits by Uniswap Labs also under MIT license. */ function mulDiv( uint256 x, uint256 y, uint256 denominator ) internal pure returns (uint256 result) { unchecked { // 512-bit multiply [prod1 prod0] = x * y. Compute the product mod 2^256 and mod 2^256 - 1, then use // use the Chinese Remainder Theorem to reconstruct the 512 bit result. The result is stored in two 256 // variables such that product = prod1 * 2^256 + prod0. uint256 prod0; // Least significant 256 bits of the product uint256 prod1; // Most significant 256 bits of the product assembly { let mm := mulmod(x, y, not(0)) prod0 := mul(x, y) prod1 := sub(sub(mm, prod0), lt(mm, prod0)) } // Handle non-overflow cases, 256 by 256 division. if (prod1 == 0) { return prod0 / denominator; } // Make sure the result is less than 2^256. Also prevents denominator == 0. require(denominator > prod1); /////////////////////////////////////////////// // 512 by 256 division. /////////////////////////////////////////////// // Make division exact by subtracting the remainder from [prod1 prod0]. uint256 remainder; assembly { // Compute remainder using mulmod. remainder := mulmod(x, y, denominator) // Subtract 256 bit number from 512 bit number. prod1 := sub(prod1, gt(remainder, prod0)) prod0 := sub(prod0, remainder) } // Factor powers of two out of denominator and compute largest power of two divisor of denominator. Always >= 1. // See https://cs.stackexchange.com/q/138556/92363. // Does not overflow because the denominator cannot be zero at this stage in the function. uint256 twos = denominator & (~denominator + 1); assembly { // Divide denominator by twos. denominator := div(denominator, twos) // Divide [prod1 prod0] by twos. prod0 := div(prod0, twos) // Flip twos such that it is 2^256 / twos. If twos is zero, then it becomes one. twos := add(div(sub(0, twos), twos), 1) } // Shift in bits from prod1 into prod0. prod0 |= prod1 * twos; // Invert denominator mod 2^256. Now that denominator is an odd number, it has an inverse modulo 2^256 such // that denominator * inv = 1 mod 2^256. Compute the inverse by starting with a seed that is correct for // four bits. That is, denominator * inv = 1 mod 2^4. uint256 inverse = (3 * denominator) ^ 2; // Use the Newton-Raphson iteration to improve the precision. Thanks to Hensel's lifting lemma, this also works // in modular arithmetic, doubling the correct bits in each step. inverse *= 2 - denominator * inverse; // inverse mod 2^8 inverse *= 2 - denominator * inverse; // inverse mod 2^16 inverse *= 2 - denominator * inverse; // inverse mod 2^32 inverse *= 2 - denominator * inverse; // inverse mod 2^64 inverse *= 2 - denominator * inverse; // inverse mod 2^128 inverse *= 2 - denominator * inverse; // inverse mod 2^256 // Because the division is now exact we can divide by multiplying with the modular inverse of denominator. // This will give us the correct result modulo 2^256. Since the preconditions guarantee that the outcome is // less than 2^256, this is the final result. We don't need to compute the high bits of the result and prod1 // is no longer required. result = prod0 * inverse; return result; } } /** * @notice Calculates x * y / denominator with full precision, following the selected rounding direction. */ function mulDiv( uint256 x, uint256 y, uint256 denominator, Rounding rounding ) internal pure returns (uint256) { uint256 result = mulDiv(x, y, denominator); if (rounding == Rounding.Up && mulmod(x, y, denominator) > 0) { result += 1; } return result; } /** * @dev Returns the square root of a number. It the number is not a perfect square, the value is rounded down. * * Inspired by Henry S. Warren, Jr.'s "Hacker's Delight" (Chapter 11). */ function sqrt(uint256 a) internal pure returns (uint256) { if (a == 0) { return 0; } // For our first guess, we get the biggest power of 2 which is smaller than the square root of the target. // We know that the "msb" (most significant bit) of our target number `a` is a power of 2 such that we have // `msb(a) <= a < 2*msb(a)`. // We also know that `k`, the position of the most significant bit, is such that `msb(a) = 2**k`. // This gives `2**k < a <= 2**(k+1)` → `2**(k/2) <= sqrt(a) < 2 ** (k/2+1)`. // Using an algorithm similar to the msb conmputation, we are able to compute `result = 2**(k/2)` which is a // good first aproximation of `sqrt(a)` with at least 1 correct bit. uint256 result = 1; uint256 x = a; if (x >> 128 > 0) { x >>= 128; result <<= 64; } if (x >> 64 > 0) { x >>= 64; result <<= 32; } if (x >> 32 > 0) { x >>= 32; result <<= 16; } if (x >> 16 > 0) { x >>= 16; result <<= 8; } if (x >> 8 > 0) { x >>= 8; result <<= 4; } if (x >> 4 > 0) { x >>= 4; result <<= 2; } if (x >> 2 > 0) { result <<= 1; } // At this point `result` is an estimation with one bit of precision. We know the true value is a uint128, // since it is the square root of a uint256. Newton's method converges quadratically (precision doubles at // every iteration). We thus need at most 7 iteration to turn our partial result with one bit of precision // into the expected uint128 result. unchecked { result = (result + a / result) >> 1; result = (result + a / result) >> 1; result = (result + a / result) >> 1; result = (result + a / result) >> 1; result = (result + a / result) >> 1; result = (result + a / result) >> 1; result = (result + a / result) >> 1; return min(result, a / result); } } /** * @notice Calculates sqrt(a), following the selected rounding direction. */ function sqrt(uint256 a, Rounding rounding) internal pure returns (uint256) { uint256 result = sqrt(a); if (rounding == Rounding.Up && result * result < a) { result += 1; } return result; } }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts v4.4.1 (token/ERC20/extensions/IERC20Metadata.sol) pragma solidity ^0.8.0; import "../IERC20.sol"; /** * @dev Interface for the optional metadata functions from the ERC20 standard. * * _Available since v4.1._ */ interface IERC20Metadata is IERC20 { /** * @dev Returns the name of the token. */ function name() external view returns (string memory); /** * @dev Returns the symbol of the token. */ function symbol() external view returns (string memory); /** * @dev Returns the decimals places of the token. */ function decimals() external view returns (uint8); }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts (last updated v4.6.0) (token/ERC20/IERC20.sol) pragma solidity ^0.8.0; /** * @dev Interface of the ERC20 standard as defined in the EIP. */ interface IERC20 { /** * @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); /** * @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 `to`. * * Returns a boolean value indicating whether the operation succeeded. * * Emits a {Transfer} event. */ function transfer(address to, 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 `from` to `to` 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 from, address to, uint256 amount ) external returns (bool); }
{ "optimizer": { "enabled": true, "runs": 999999 }, "outputSelection": { "*": { "*": [ "evm.bytecode", "evm.deployedBytecode", "abi" ] } } }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"spender","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Approval","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"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"id","type":"uint256"}],"name":"Snapshot","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[],"name":"StakingContract","outputs":[{"internalType":"contract IStakingContract","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"USDC","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"WETH","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"_burnAddress","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"_buyFees","outputs":[{"internalType":"uint256","name":"reflectionFee","type":"uint256"},{"internalType":"uint256","name":"developmentFee","type":"uint256"},{"internalType":"uint256","name":"buybackFee","type":"uint256"},{"internalType":"address","name":"developmentAddress","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"_isPairAddress","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"_maxTxAmount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"_sellFees","outputs":[{"internalType":"uint256","name":"reflectionFee","type":"uint256"},{"internalType":"uint256","name":"developmentFee","type":"uint256"},{"internalType":"uint256","name":"buybackFee","type":"uint256"},{"internalType":"address","name":"developmentAddress","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"addOutsideSwapPair","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_pair","type":"address"},{"internalType":"address","name":"_token","type":"address"}],"name":"addPair","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"spender","type":"address"}],"name":"allowance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"approve","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"autoBuybackAmount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"autoBuybackEnabled","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"uint256","name":"snapshotId","type":"uint256"}],"name":"balanceOfAt","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"addressToBlacklist","type":"address"}],"name":"blacklistAddress","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"decimals","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"subtractedValue","type":"uint256"}],"name":"decreaseAllowance","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"excludeFromFee","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"getCirculatingSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getCurrentSnapshotId","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"getOwnedBalance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"getTotalFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"address","name":"token","type":"address"}],"name":"handleFee","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"includeInFee","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"addedValue","type":"uint256"}],"name":"increaseAllowance","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"isExcludedFromFee","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"isExcludedFromReward","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"isSnapshotter","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"isStakingContract","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"pyeSwapPair","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"pyeSwapRouter","outputs":[{"internalType":"contract IPYESwapRouter","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"addressToRemove","type":"address"}],"name":"removeFromBlacklist","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"removeOutsideSwapPair","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"address","name":"to","type":"address"}],"name":"rescueETH","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"contract IERC20","name":"token","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"address","name":"to","type":"address"}],"name":"rescueToken","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"_enabled","type":"bool"},{"internalType":"uint256","name":"_cap","type":"uint256"},{"internalType":"uint256","name":"_amount","type":"uint256"},{"internalType":"uint256","name":"_period","type":"uint256"}],"name":"setAutoBuybackSettings","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"thresholdDenominator","type":"uint256"}],"name":"setBuyBackThreshold","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_reflectionFee","type":"uint256"},{"internalType":"uint256","name":"_developmentFee","type":"uint256"},{"internalType":"uint256","name":"_buybackFee","type":"uint256"}],"name":"setBuyFees","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_development","type":"address"}],"name":"setDevelopmentAddress","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"holder","type":"address"},{"internalType":"bool","name":"exempt","type":"bool"}],"name":"setIsRewardExempt","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"bool","name":"flag","type":"bool"}],"name":"setIsSnapshotter","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"bool","name":"set","type":"bool"}],"name":"setIsStakingContract","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"holder","type":"address"},{"internalType":"bool","name":"exempt","type":"bool"}],"name":"setIsTxLimitExempt","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"maxTxPercent","type":"uint256"}],"name":"setMaxTxPercent","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_newStakingContract","type":"address"}],"name":"setNewStakingContract","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_reflectionFee","type":"uint256"},{"internalType":"uint256","name":"_developmentFee","type":"uint256"},{"internalType":"uint256","name":"_buybackFee","type":"uint256"}],"name":"setSellFees","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"snapshot","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"staked","outputs":[{"internalType":"uint256","name":"amount","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"stakingContract","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalStaked","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"uint256","name":"snapshotId","type":"uint256"}],"name":"totalSupplyAt","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"recipient","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transfer","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"sender","type":"address"},{"internalType":"address","name":"recipient","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transferFrom","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"triggerManualBuyback","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_router","type":"address"},{"internalType":"address","name":"_pair","type":"address"}],"name":"updateRouterAndPair","outputs":[],"stateMutability":"nonpayable","type":"function"},{"stateMutability":"payable","type":"receive"}]
Contract Creation Code
60806040526706f05b59d3b200006037556038805460ff19169055620f42406200002c6009600a62000806565b6200003c906305f5e1006200081e565b62000048919062000840565b603e556207a1206041553480156200005f57600080fd5b5060408051808201825260038082526250594560e81b602080840182905284518086019095528285528401529091906200009a838262000908565b506004620000a9828262000908565b505050620000c6620000c06200069b60201b60201c565b6200069f565b620000d46009600a62000806565b620000e4906305f5e1006200081e565b3360009081526022602090815260409182902092909255603380546001600160a01b031916733b505af97031b75e2be39e7f8fa1fa634857f29d90811790915581516315ab88c960e31b81529151909263ad5c464892600480820193918290030181865afa1580156200015b573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620001819190620009d4565b603580546001600160a01b039283166001600160a01b0319918216179091556036805490911673a0b86991c6218b36c1d19d4a2e9eb0ce3606eb481790556033546040805163c45a015560e01b81529051919092169163c45a01559160048083019260209291908290030181865afa15801562000202573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620002289190620009d4565b6035546040516322c4f16760e11b815230600482018190526001600160a01b039283166024830152600160448301526064820152911690634589e2ce906084016020604051808303816000875af115801562000288573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620002ae9190620009d4565b603480546001600160a01b039283166001600160a01b0319918216178255603554602a80546000908152602960209081526040808320805487169589169590951790945594548254825260289095529182208054909316939094169290921790558154600192919062000323908490620009ff565b90915550506034546001600160a01b03166000908152602b60205260408120805460ff1916600190811790915590602490620003676005546001600160a01b031690565b6001600160a01b03908116825260208083019390935260409182016000908120805495151560ff1996871617905530815260249093528183208054851660019081179091556034548216845282842080548616821790558254909116835290822080549093168117909255602590620003dd3390565b6001600160a01b03908116825260208083019390935260409182016000908120805495151560ff199687161790556034548216815260259093528183208054851660019081179091556033548216845282842080548616821790558254909116835290822080549093168117909255602690620004573390565b6001600160a01b03908116825260208083019390935260409182016000908120805495151560ff19968716179055603454821681526026845282812080548616600190811790915530825283822080548716821790557f436f594ac5248b7e44d6a4b4c35ba3e500f642e681dd33b10ee0fd4f06d15f3b8054871682179055835490921681528281208054861683179055338152602e8452828120805490951690911790935580516080808201835261032080835260c88386018190528385018790527399b4e1f2b2a3a17ca890b992b892abccd44e0c9a6060948501819052600683905560078290556008889055600980546001600160a01b03199081168317909155865180860188528481528089018490528088018a90528601829052600a849055600b839055600c899055600d805482168317905586518086018852610708808252818a018590528189018b90529087018390526016819055601784905560188a90556019805483168417905587518087018952858152808a018590528089018b90528701839052601a94909455601b839055601c899055601d80548216831790558651948501875283855284880183905295840188905292909301829052601e55601f91909155929091556021805490911690911790556200063a3390565b6001600160a01b031660007fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef620006746009600a62000806565b62000684906305f5e1006200081e565b60405190815260200160405180910390a362000a15565b3390565b600580546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b634e487b7160e01b600052601160045260246000fd5b600181815b80851115620007485781600019048211156200072c576200072c620006f1565b808516156200073a57918102915b93841c93908002906200070c565b509250929050565b600082620007615750600162000800565b81620007705750600062000800565b81600181146200078957600281146200079457620007b4565b600191505062000800565b60ff841115620007a857620007a8620006f1565b50506001821b62000800565b5060208310610133831016604e8410600b8410161715620007d9575081810a62000800565b620007e5838362000707565b8060001904821115620007fc57620007fc620006f1565b0290505b92915050565b60006200081760ff84168362000750565b9392505050565b60008160001904831182151516156200083b576200083b620006f1565b500290565b6000826200085e57634e487b7160e01b600052601260045260246000fd5b500490565b634e487b7160e01b600052604160045260246000fd5b600181811c908216806200088e57607f821691505b602082108103620008af57634e487b7160e01b600052602260045260246000fd5b50919050565b601f8211156200090357600081815260208120601f850160051c81016020861015620008de5750805b601f850160051c820191505b81811015620008ff57828155600101620008ea565b5050505b505050565b81516001600160401b0381111562000924576200092462000863565b6200093c8162000935845462000879565b84620008b5565b602080601f8311600181146200097457600084156200095b5750858301515b600019600386901b1c1916600185901b178555620008ff565b600085815260208120601f198616915b82811015620009a55788860151825594840194600190910190840162000984565b5085821015620009c45787850151600019600388901b60f8161c191681555b5050505050600190811b01905550565b600060208284031215620009e757600080fd5b81516001600160a01b03811681146200081757600080fd5b80820180821115620008005762000800620006f1565b6154ce8062000a256000396000f3fe6080604052600436106103c75760003560e01c806389a30271116101f2578063ced72f871161010d578063ea497b79116100a0578063f3290d751161006f578063f3290d7514610cc0578063f84ba65d14610ce0578063f8a67a6214610d00578063fd4b715814610d2057600080fd5b8063ea497b7914610c33578063ee99205c14610c53578063efac458514610c80578063f2fde38b14610ca057600080fd5b8063de7cf799116100dc578063de7cf79914610b4b578063e284db3e14610bba578063e4d1a87414610bda578063ea2f0b3714610c1357600080fd5b8063ced72f8714610aa3578063d3a866c714610ab8578063d543dbeb14610ad8578063dd62ed3e14610af857600080fd5b8063a0558c3f11610185578063ad5c464811610154578063ad5c464814610a13578063b6f3e08714610a40578063bd3900c014610a60578063c80bbbeb14610a7657600080fd5b8063a0558c3f14610986578063a457c2d7146109a6578063a9059cbb146109c6578063a9a47654146109e657600080fd5b80639711715a116101c15780639711715a14610904578063981b24d01461091957806398807d84146109395780639a377b821461096657600080fd5b806389a30271146108775780638c232838146108a45780638da5cb5b146108c457806395d89b41146108ef57600080fd5b80633bb8a8d4116102e25780635439ad8611610275578063715018a611610244578063715018a6146107f05780637d1db4a514610805578063817b1cd21461081b57806388f820201461083157600080fd5b80635439ad86146107585780636baa9a571461076d5780636ed52e681461078d57806370a08231146107ad57600080fd5b80634896a632116102b15780634896a632146106bc5780634ee2cd7e146106d25780635342acb4146106f2578063537df3b61461073857600080fd5b80633bb8a8d4146106425780633d8a62d31461065c57806340b28c2f1461067c578063437823ec1461069c57600080fd5b806318160ddd1161035a578063303675541161032957806330367554146105b6578063313ce567146105e657806335ddf3a714610602578063395093511461062257600080fd5b806318160ddd1461053e57806323b872dd1461056157806329b1c15c146105815780632b112e49146105a157600080fd5b8063095ea7b311610396578063095ea7b3146104ae5780630d075d9c146104ce5780630f683e90146104ee57806315c9aca11461050e57600080fd5b806302e8e85f146103d3578063048c7baf1461042a57806306df27191461044c57806306fdde031461048c57600080fd5b366103ce57005b600080fd5b3480156103df57600080fd5b506033546104009073ffffffffffffffffffffffffffffffffffffffff1681565b60405173ffffffffffffffffffffffffffffffffffffffff90911681526020015b60405180910390f35b34801561043657600080fd5b5061044a610445366004614e2a565b610d40565b005b34801561045857600080fd5b5061047c610467366004614e87565b602d6020526000908152604090205460ff1681565b6040519015158152602001610421565b34801561049857600080fd5b506104a1610d8f565b6040516104219190614ea4565b3480156104ba57600080fd5b5061047c6104c9366004614f10565b610e21565b3480156104da57600080fd5b5061044a6104e9366004614f3c565b610e38565b3480156104fa57600080fd5b5061044a610509366004614f3c565b610e6c565b34801561051a57600080fd5b5061047c610529366004614e87565b602e6020526000908152604090205460ff1681565b34801561054a57600080fd5b50610553610e91565b604051908152602001610421565b34801561056d57600080fd5b5061047c61057c366004614f68565b610eb2565b34801561058d57600080fd5b5061044a61059c366004614e87565b610f28565b3480156105ad57600080fd5b50610553611021565b3480156105c257600080fd5b5061047c6105d1366004614e87565b602b6020526000908152604090205460ff1681565b3480156105f257600080fd5b5060405160098152602001610421565b34801561060e57600080fd5b5061044a61061d366004614fa9565b61109c565b34801561062e57600080fd5b5061047c61063d366004614f10565b611186565b34801561064e57600080fd5b5060385461047c9060ff1681565b34801561066857600080fd5b5061044a610677366004614e87565b6111c9565b34801561068857600080fd5b5061044a610697366004614fe2565b611220565b3480156106a857600080fd5b5061044a6106b7366004614e87565b611495565b3480156106c857600080fd5b50610553603b5481565b3480156106de57600080fd5b506105536106ed366004614f10565b6114ec565b3480156106fe57600080fd5b5061047c61070d366004614e87565b73ffffffffffffffffffffffffffffffffffffffff1660009081526024602052604090205460ff1690565b34801561074457600080fd5b5061044a610753366004614e87565b611575565b34801561076457600080fd5b506105536116a4565b34801561077957600080fd5b50610553610788366004614e87565b6116ae565b34801561079957600080fd5b5061044a6107a8366004614fa9565b6116e8565b3480156107b957600080fd5b506105536107c8366004614e87565b73ffffffffffffffffffffffffffffffffffffffff1660009081526022602052604090205490565b3480156107fc57600080fd5b5061044a611746565b34801561081157600080fd5b5061055360375481565b34801561082757600080fd5b5061055360325481565b34801561083d57600080fd5b5061047c61084c366004614e87565b73ffffffffffffffffffffffffffffffffffffffff1660009081526026602052604090205460ff1690565b34801561088357600080fd5b506036546104009073ffffffffffffffffffffffffffffffffffffffff1681565b3480156108b057600080fd5b506105536108bf366004614e87565b61175a565b3480156108d057600080fd5b5060055473ffffffffffffffffffffffffffffffffffffffff16610400565b3480156108fb57600080fd5b506104a16117ae565b34801561091057600080fd5b5061044a6117bd565b34801561092557600080fd5b50610553610934366004615010565b611867565b34801561094557600080fd5b50610553610954366004614e87565b60316020526000908152604090205481565b34801561097257600080fd5b5061044a610981366004614e87565b611897565b34801561099257600080fd5b5061044a6109a1366004615029565b61195d565b3480156109b257600080fd5b5061047c6109c1366004614f10565b6119ad565b3480156109d257600080fd5b5061047c6109e1366004614f10565b611a09565b3480156109f257600080fd5b50603f546104009073ffffffffffffffffffffffffffffffffffffffff1681565b348015610a1f57600080fd5b506035546104009073ffffffffffffffffffffffffffffffffffffffff1681565b348015610a4c57600080fd5b5061044a610a5b366004614fe2565b611a16565b348015610a6c57600080fd5b5061040061dead81565b348015610a8257600080fd5b506034546104009073ffffffffffffffffffffffffffffffffffffffff1681565b348015610aaf57600080fd5b50610553611c52565b348015610ac457600080fd5b5061044a610ad3366004615029565b611c6d565b348015610ae457600080fd5b5061044a610af3366004615010565b612a8e565b348015610b0457600080fd5b50610553610b13366004614fe2565b73ffffffffffffffffffffffffffffffffffffffff918216600090815260236020908152604080832093909416825291909152205490565b348015610b5757600080fd5b50601654601754601854601954610b849392919073ffffffffffffffffffffffffffffffffffffffff1684565b6040805194855260208501939093529183015273ffffffffffffffffffffffffffffffffffffffff166060820152608001610421565b348015610bc657600080fd5b5061044a610bd5366004614e87565b612ac6565b348015610be657600080fd5b50600a54600b54600c54600d54610b849392919073ffffffffffffffffffffffffffffffffffffffff1684565b348015610c1f57600080fd5b5061044a610c2e366004614e87565b612b1a565b348015610c3f57600080fd5b5061044a610c4e366004615010565b612b6e565b348015610c5f57600080fd5b506040546104009073ffffffffffffffffffffffffffffffffffffffff1681565b348015610c8c57600080fd5b5061044a610c9b366004615010565b612c81565b348015610cac57600080fd5b5061044a610cbb366004614e87565b612cb4565b348015610ccc57600080fd5b5061044a610cdb366004614e87565b612d68565b348015610cec57600080fd5b5061044a610cfb366004614fa9565b612e4f565b348015610d0c57600080fd5b5061044a610d1b36600461504e565b612ead565b348015610d2c57600080fd5b5061044a610d3b366004614fa9565b613075565b610d486130d3565b603880547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0016941515949094179093556039919091556000603a55603b55603c5543603d55565b606060038054610d9e90615090565b80601f0160208091040260200160405190810160405280929190818152602001828054610dca90615090565b8015610e175780601f10610dec57610100808354040283529160200191610e17565b820191906000526020600020905b815481529060010190602001808311610dfa57829003601f168201915b5050505050905090565b6000610e2e338484613154565b5060015b92915050565b610e406130d3565b600683905560078290556008819055600a839055600b829055600c819055601a92909255601b55601c55565b610e746130d3565b601683905560178290556018819055601e92909255601f55602055565b6000610e9f6009600a61522a565b610ead906305f5e100615239565b905090565b6000610ebf848484613307565b610f1e8433610f198560405180606001604052806028815260200161544c6028913973ffffffffffffffffffffffffffffffffffffffff8a166000908152602360209081526040808320338452909152902054919061363e565b613154565b5060019392505050565b610f306130d3565b73ffffffffffffffffffffffffffffffffffffffff8116610fb2576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f5059453a2041646472657373205a65726f206973206e6f7420616c6c6f77656460448201526064015b60405180910390fd5b6009805473ffffffffffffffffffffffffffffffffffffffff9092167fffffffffffffffffffffffff00000000000000000000000000000000000000009283168117909155600d805483168217905560198054831682179055601d805483168217905560218054909216179055565b60226020527fb84cf808d0d5b1ad44962c9bfddd3cfce67763c49ab557cfd0e9f6804faade995461dead60009081527fb3dad1d3e53c1132e958712e36d3ff32b0d9b9088698eb172c6b4faa7ff6d22e549091610ead91611096906110886009600a61522a565b611096906305f5e100615239565b90613684565b6110a46130d3565b73ffffffffffffffffffffffffffffffffffffffff821630148015906110e5575060345473ffffffffffffffffffffffffffffffffffffffff838116911614155b6110ee57600080fd5b73ffffffffffffffffffffffffffffffffffffffff8216600090815260266020526040902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0016821580159190911790915561115557611151826000613697565b5050565b73ffffffffffffffffffffffffffffffffffffffff8216600090815260226020526040902054611151908390613697565b33600081815260236020908152604080832073ffffffffffffffffffffffffffffffffffffffff871684529091528120549091610e2e918590610f1990866137f9565b6111d16130d3565b73ffffffffffffffffffffffffffffffffffffffff166000908152602c6020526040902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00166001179055565b6112286130d3565b6033805473ffffffffffffffffffffffffffffffffffffffff908116600090815260246020908152604080832080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff009081169091556034805486168552938290208054909116905584548785167fffffffffffffffffffffffff00000000000000000000000000000000000000009182168117909655835494871694169390931790915581517fad5c4648000000000000000000000000000000000000000000000000000000008152915163ad5c46489260048082019392918290030181865afa15801561131b573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061133f9190615276565b6035805473ffffffffffffffffffffffffffffffffffffffff9283167fffffffffffffffffffffffff0000000000000000000000000000000000000000918216178255603380548416600090815260246020908152604080832080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff009081166001908117909255603480548a168652838620805483168417905580548a16865260268552838620805483168417905580548a168652602b8552838620805483168417905580548a168652602585528386208054831684179055955489168552918420805490921617905591549080527f363f266dc0e266c1e93609619fd0d0d198ad468f99870b4dab43223b5a640e1a80548416918616919091179055915460299092527fbc72c27881d499e9ea29f42d0975d4e269d866b929e1b555435cbfe829a9d2008054909116919092161790555050565b61149d6130d3565b73ffffffffffffffffffffffffffffffffffffffff16600090815260246020526040902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00166001179055565b73ffffffffffffffffffffffffffffffffffffffff8216600090815260446020526040812081908190611520908590613805565b915091508161156a5773ffffffffffffffffffffffffffffffffffffffff85166000908152603160209081526040808320546022909252909120546115659190615293565b61156c565b805b95945050505050565b61157d6130d3565b73ffffffffffffffffffffffffffffffffffffffff811660009081526027602052604090205460ff16611658576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152604c60248201527f4164647265737320686173206e6f74206265656e20626c61636b6c697374656460448201527f2120456e74657220616e20616464726573732074686174206973206f6e20746860648201527f6520626c61636b6c6973742e0000000000000000000000000000000000000000608482015260a401610fa9565b73ffffffffffffffffffffffffffffffffffffffff16600090815260276020526040902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00169055565b6000610ead61393c565b73ffffffffffffffffffffffffffffffffffffffff81166000908152602260209081526040808320546031909252822054610e32916137f9565b6116f06130d3565b73ffffffffffffffffffffffffffffffffffffffff919091166000908152602d6020526040902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0016911515919091179055565b61174e6130d3565b6117586000613947565b565b73ffffffffffffffffffffffffffffffffffffffff811660009081526024602052604081205460ff161561179057506000919050565b600854600754600654610e3292916117a891906137f9565b906137f9565b606060048054610d9e90615090565b336000908152602e602052604090205460ff1661185c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602160248201527f43616c6c6572206973206e6f7420616c6c6f77656420746f20736e617073686f60448201527f74000000000000000000000000000000000000000000000000000000000000006064820152608401610fa9565b6118646139be565b50565b6000806000611877846045613805565b915091508161188d57611888610e91565b61188f565b805b949350505050565b61189f6130d3565b6040805473ffffffffffffffffffffffffffffffffffffffff9092167fffffffffffffffffffffffff000000000000000000000000000000000000000092831681178255603f8054909316811790925560009182526025602090815281832080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff009081166001908117909255602683528385208054821683179055602483528385208054821683179055602d909252919092208054909216179055565b6119656130d3565b60405173ffffffffffffffffffffffffffffffffffffffff82169083156108fc029084906000818181858888f193505050501580156119a8573d6000803e3d6000fd5b505050565b6000610e2e3384610f19856040518060600160405280602581526020016154746025913933600090815260236020908152604080832073ffffffffffffffffffffffffffffffffffffffff8d168452909152902054919061363e565b6000610e2e338484613307565b603354604080517fc45a0155000000000000000000000000000000000000000000000000000000008152905160009273ffffffffffffffffffffffffffffffffffffffff169163c45a01559160048083019260209291908290030181865afa158015611a86573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611aaa9190615276565b90503373ffffffffffffffffffffffffffffffffffffffff82161480611ae7575060335473ffffffffffffffffffffffffffffffffffffffff1633145b80611af157503330145b611b57576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601060248201527f5059453a204e4f545f414c4c4f574544000000000000000000000000000000006044820152606401610fa9565b611b6083613a18565b6119a85773ffffffffffffffffffffffffffffffffffffffff8381166000818152602460209081526040808320805460017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff009182168117909255602b8452828520805482168317905560258452828520805482168317905560268452828520805490911682179055602a805485526028845282852080547fffffffffffffffffffffffff000000000000000000000000000000000000000090811690971790558054855260299093529083208054909416948716949094179092558154611c48908490615293565b9091555050505050565b600854600754600654600092610ead9290916117a8916137f9565b6000805b602a54811015611cbf576000818152602860205260409020543373ffffffffffffffffffffffffffffffffffffffff90911603611cad57600191505b80611cb7816152a6565b915050611c71565b5060335473ffffffffffffffffffffffffffffffffffffffff16331480611ce35750805b611d49576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601060248201527f5059453a204e4f545f414c4c4f574544000000000000000000000000000000006044820152606401610fa9565b82600003611daf576119a8600e54600655600f54600755601054600855601154600980547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff909216919091179055565b6000611dba83613a73565b9050602a54811015612a88576040517fdd62ed3e00000000000000000000000000000000000000000000000000000000815233600482015230602482015260009073ffffffffffffffffffffffffffffffffffffffff85169063dd62ed3e90604401602060405180830381865afa158015611e39573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611e5d91906152de565b9050848110612a86576040517f23b872dd0000000000000000000000000000000000000000000000000000000081523360048201523060248201526044810186905273ffffffffffffffffffffffffffffffffffffffff8516906323b872dd906064016020604051808303816000875af1158015611edf573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611f0391906152f7565b5060365473ffffffffffffffffffffffffffffffffffffffff908116908516036122e1576000611f31611c52565b90506000611f5782611f516006600101548a613ad890919063ffffffff16565b90613ae4565b90506000611f7783611f516006600001548b613ad890919063ffffffff16565b90506000611f9784611f516006600201548c613ad890919063ffffffff16565b6040805490517fa9059cbb00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff91821660048201526024810185905291925089169063a9059cbb906044016020604051808303816000875af1158015612012573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061203691906152f7565b50603f546040517f1fd55d260000000000000000000000000000000000000000000000000000000081526004810184905273ffffffffffffffffffffffffffffffffffffffff90911690631fd55d2690602401600060405180830381600087803b1580156120a357600080fd5b505af19250505080156120b4575060015b506035546040517f70a0823100000000000000000000000000000000000000000000000000000000815230600482015260009173ffffffffffffffffffffffffffffffffffffffff16906370a0823190602401602060405180830381865afa158015612124573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061214891906152de565b9050600061215685846137f9565b60085460075491925060009161216b916137f9565b9050612177828c613af0565b6035546040517f70a0823100000000000000000000000000000000000000000000000000000000815230600482015260009161221191869173ffffffffffffffffffffffffffffffffffffffff16906370a08231906024015b602060405180830381865afa1580156121ed573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061109691906152de565b9050600061223183611f5160066001015485613ad890919063ffffffff16565b6035546009546040517fa9059cbb00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff918216600482015260248101849052929350169063a9059cbb906044016020604051808303816000875af11580156122ae573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906122d291906152f7565b50505050505050505050612a28565b60355473ffffffffffffffffffffffffffffffffffffffff9081169085160361261757600061230e611c52565b9050600061232e82611f516006600101548a613ad890919063ffffffff16565b9050600061234e83611f516006600001548b613ad890919063ffffffff16565b6036546040517f70a0823100000000000000000000000000000000000000000000000000000000815230600482015291925060009173ffffffffffffffffffffffffffffffffffffffff909116906370a0823190602401602060405180830381865afa1580156123c2573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906123e691906152de565b90506123f28289613ca5565b6036546040517f70a0823100000000000000000000000000000000000000000000000000000000815230600482015260009161244f91849173ffffffffffffffffffffffffffffffffffffffff16906370a08231906024016121d0565b6009546040517fa9059cbb00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff9182166004820152602481018790529192508a169063a9059cbb906044016020604051808303816000875af11580156124ca573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906124ee91906152f7565b506036546040805490517fa9059cbb00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff91821660048201526024810184905291169063a9059cbb906044016020604051808303816000875af115801561256a573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061258e91906152f7565b50603f546040517f1fd55d260000000000000000000000000000000000000000000000000000000081526004810183905273ffffffffffffffffffffffffffffffffffffffff90911690631fd55d2690602401600060405180830381600087803b1580156125fb57600080fd5b505af192505050801561260c575060015b505050505050612a28565b6035546040517f70a0823100000000000000000000000000000000000000000000000000000000815230600482015260009173ffffffffffffffffffffffffffffffffffffffff16906370a0823190602401602060405180830381865afa158015612686573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906126aa91906152de565b90506126b68686613af0565b6035546040517f70a0823100000000000000000000000000000000000000000000000000000000815230600482015260009161271391849173ffffffffffffffffffffffffffffffffffffffff16906370a08231906024016121d0565b9050600061271f611c52565b9050600061273f82611f5160066001015486613ad890919063ffffffff16565b9050600061275f83611f5160066000015487613ad890919063ffffffff16565b6036546040517f70a0823100000000000000000000000000000000000000000000000000000000815230600482015291925060009173ffffffffffffffffffffffffffffffffffffffff909116906370a0823190602401602060405180830381865afa1580156127d3573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906127f791906152de565b9050612803828b613ca5565b6036546040517f70a0823100000000000000000000000000000000000000000000000000000000815230600482015260009161286091849173ffffffffffffffffffffffffffffffffffffffff16906370a08231906024016121d0565b6035546009546040517fa9059cbb00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff918216600482015260248101889052929350169063a9059cbb906044016020604051808303816000875af11580156128dd573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061290191906152f7565b506036546040805490517fa9059cbb00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff91821660048201526024810184905291169063a9059cbb906044016020604051808303816000875af115801561297d573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906129a191906152f7565b50603f546040517f1fd55d260000000000000000000000000000000000000000000000000000000081526004810183905273ffffffffffffffffffffffffffffffffffffffff90911690631fd55d2690602401600060405180830381600087803b158015612a0e57600080fd5b505af1925050508015612a1f575060015b50505050505050505b612a86600e54600655600f54600755601054600855601154600980547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff909216919091179055565b505b50505050565b612a966130d3565b612ac0612710611f5183612aac6009600a61522a565b612aba906305f5e100615239565b90613ad8565b60375550565b612ace6130d3565b73ffffffffffffffffffffffffffffffffffffffff166000908152602c6020526040902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00169055565b612b226130d3565b73ffffffffffffffffffffffffffffffffffffffff16600090815260246020526040902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00169055565b612b766130d3565b6035546040517f70a0823100000000000000000000000000000000000000000000000000000000815230600482015260009173ffffffffffffffffffffffffffffffffffffffff16906370a0823190602401602060405180830381865afa158015612be5573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612c0991906152de565b905080821115612c75576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601f60248201527f416d6f756e74206578636565647320636f6e74726163742062616c616e6365006044820152606401610fa9565b6111518261dead613d18565b612c896130d3565b80612c966009600a61522a565b612ca4906305f5e100615239565b612cae9190615314565b603e5550565b612cbc6130d3565b73ffffffffffffffffffffffffffffffffffffffff8116612d5f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201527f64647265737300000000000000000000000000000000000000000000000000006064820152608401610fa9565b61186481613947565b612d706130d3565b73ffffffffffffffffffffffffffffffffffffffff811660009081526027602052604090205460ff1615612e00576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601f60248201527f4164647265737320697320616c726561647920626c61636b6c697374656421006044820152606401610fa9565b73ffffffffffffffffffffffffffffffffffffffff16600090815260276020526040902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00166001179055565b612e576130d3565b73ffffffffffffffffffffffffffffffffffffffff91909116600090815260256020526040902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0016911515919091179055565b612eb56130d3565b6040517f70a08231000000000000000000000000000000000000000000000000000000008152306004820152829073ffffffffffffffffffffffffffffffffffffffff8516906370a0823190602401602060405180830381865afa158015612f21573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612f4591906152de565b1015612fdc576040517f70a0823100000000000000000000000000000000000000000000000000000000815230600482015273ffffffffffffffffffffffffffffffffffffffff8416906370a0823190602401602060405180830381865afa158015612fb5573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612fd991906152de565b91505b6040517fa9059cbb00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff82811660048301526024820184905284169063a9059cbb906044016020604051808303816000875af1158015613051573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612a8891906152f7565b61307d6130d3565b73ffffffffffffffffffffffffffffffffffffffff919091166000908152602e6020526040902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0016911515919091179055565b60055473ffffffffffffffffffffffffffffffffffffffff163314611758576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610fa9565b73ffffffffffffffffffffffffffffffffffffffff83166131f6576040517f08c379a0000000000000000000000000000000000000000000000000000000008152602060048201526024808201527f45524332303a20617070726f76652066726f6d20746865207a65726f2061646460448201527f72657373000000000000000000000000000000000000000000000000000000006064820152608401610fa9565b73ffffffffffffffffffffffffffffffffffffffff8216613299576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602260248201527f45524332303a20617070726f766520746f20746865207a65726f20616464726560448201527f73730000000000000000000000000000000000000000000000000000000000006064820152608401610fa9565b73ffffffffffffffffffffffffffffffffffffffff83811660008181526023602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925910160405180910390a3505050565b73ffffffffffffffffffffffffffffffffffffffff83166133aa576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602560248201527f45524332303a207472616e736665722066726f6d20746865207a65726f20616460448201527f64726573730000000000000000000000000000000000000000000000000000006064820152608401610fa9565b73ffffffffffffffffffffffffffffffffffffffff821661344d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602360248201527f45524332303a207472616e7366657220746f20746865207a65726f206164647260448201527f65737300000000000000000000000000000000000000000000000000000000006064820152608401610fa9565b600081116134dd576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602960248201527f5472616e7366657220616d6f756e74206d75737420626520677265617465722060448201527f7468616e207a65726f00000000000000000000000000000000000000000000006064820152608401610fa9565b73ffffffffffffffffffffffffffffffffffffffff821660009081526027602052604090205460ff161561351057600080fd5b61351b838383613f4b565b613525838261401b565b61352e816140b7565b1561353b5761353b6141bd565b73ffffffffffffffffffffffffffffffffffffffff82166000908152602b602052604081205460ff16801561358b575060335473ffffffffffffffffffffffffffffffffffffffff858116911614155b80156135bd575073ffffffffffffffffffffffffffffffffffffffff841660009081526024602052604090205460ff16155b156135ca57506001613632565b73ffffffffffffffffffffffffffffffffffffffff84166000908152602c602052604090205460ff161561360057506002613632565b73ffffffffffffffffffffffffffffffffffffffff83166000908152602c602052604090205460ff1615613632575060035b612a8884848484614216565b6000818484111561367c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610fa99190614ea4565b505050900390565b6000613690828461534f565b9392505050565b6000811180156136ca575073ffffffffffffffffffffffffffffffffffffffff8216600090815260316020526040902054155b1561375557602f805473ffffffffffffffffffffffffffffffffffffffff84166000818152603060205260408120839055600183018455929092527fa813484aef6fb598f9f753daf162068ff39ccea4075cb95e1a30f86995b5b7ee0180547fffffffffffffffffffffffff0000000000000000000000000000000000000000169091179055613795565b80158015613787575073ffffffffffffffffffffffffffffffffffffffff821660009081526031602052604090205415155b15613795576137958261492e565b73ffffffffffffffffffffffffffffffffffffffff82166000908152603160205260409020546032546137cd9183916117a891613684565b60325573ffffffffffffffffffffffffffffffffffffffff909116600090815260316020526040902055565b60006136908284615293565b60008060008411613872576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601660248201527f4552433230536e617073686f743a2069642069732030000000000000000000006044820152606401610fa9565b61387a61393c565b8411156138e3576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f4552433230536e617073686f743a206e6f6e6578697374656e742069640000006044820152606401610fa9565b60006138ef8486614ab8565b84549091508103613907576000809250925050613935565b600184600101828154811061391e5761391e615362565b90600052602060002001549250925050613935565b505b9250929050565b6000610ead60435490565b6005805473ffffffffffffffffffffffffffffffffffffffff8381167fffffffffffffffffffffffff0000000000000000000000000000000000000000831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b60006139ce604380546001019055565b60006139d861393c565b90507f8030e83b04d87bef53480e26263266d6ca66863aa8506aca6f2559d18aa1cb6781604051613a0b91815260200190565b60405180910390a1919050565b600080805b602a54811015613a6c5760008181526028602052604090205473ffffffffffffffffffffffffffffffffffffffff808616911603613a5a57600191505b80613a64816152a6565b915050613a1d565b5092915050565b600080602a546001613a859190615293565b905060005b602a54811015613a6c5760008181526029602052604090205473ffffffffffffffffffffffffffffffffffffffff808616911603613ac6578091505b80613ad0816152a6565b915050613a8a565b60006136908284615239565b60006136908284615314565b6040805160028082526060820183526000926020830190803683370190505090508181600081518110613b2557613b25615362565b73ffffffffffffffffffffffffffffffffffffffff9283166020918202929092010152603554825191169082906001908110613b6357613b63615362565b73ffffffffffffffffffffffffffffffffffffffff92831660209182029290920101526033546040517f095ea7b30000000000000000000000000000000000000000000000000000000081529082166004820152602481018590529083169063095ea7b3906044016020604051808303816000875af1158015613bea573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613c0e91906152f7565b506033546040517f5c11d79500000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff90911690635c11d79590613c6e908690600090869030904290600401615391565b600060405180830381600087803b158015613c8857600080fd5b505af1158015613c9c573d6000803e3d6000fd5b50505050505050565b6040805160028082526060820183526000926020830190803683370190505090508181600081518110613cda57613cda615362565b73ffffffffffffffffffffffffffffffffffffffff9283166020918202929092010152603654825191169082906001908110613b6357613b63615362565b604280547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001660011790556040805160028082526060820183526000926020830190803683375050603554825192935073ffffffffffffffffffffffffffffffffffffffff1691839150600090613d9157613d91615362565b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff16815250503081600181518110613ddf57613ddf615362565b73ffffffffffffffffffffffffffffffffffffffff92831660209182029290920101526035546033546040517f095ea7b300000000000000000000000000000000000000000000000000000000815290831660048201526024810186905291169063095ea7b3906044016020604051808303816000875af1158015613e68573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613e8c91906152f7565b506033546040517f5c11d79500000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff90911690635c11d79590613eec908690600090869088904290600401615391565b600060405180830381600087803b158015613f0657600080fd5b505af1158015613f1a573d6000803e3d6000fd5b5050604280547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001690555050505050565b73ffffffffffffffffffffffffffffffffffffffff8316613f7757613f6f82614b7d565b6119a8614bc8565b73ffffffffffffffffffffffffffffffffffffffff8216613f9b57613f6f83614b7d565b73ffffffffffffffffffffffffffffffffffffffff82166000908152602d602052604090205460ff1615613fd2576119a883614b7d565b73ffffffffffffffffffffffffffffffffffffffff83166000908152602d602052604090205460ff1615614009576119a882614b7d565b61401283614b7d565b6119a882614b7d565b60375481111580614051575073ffffffffffffffffffffffffffffffffffffffff821660009081526025602052604090205460ff165b611151576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601160248201527f5458204c696d69742045786365656465640000000000000000000000000000006044820152606401610fa9565b60345460009073ffffffffffffffffffffffffffffffffffffffff1633148015906140e5575060425460ff16155b80156140f3575060385460ff165b801561410e575043603c54603d5461410b9190615293565b11155b80156141ad5750603b546035546040517f70a0823100000000000000000000000000000000000000000000000000000000815230600482015273ffffffffffffffffffffffffffffffffffffffff909116906370a0823190602401602060405180830381865afa158015614186573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906141aa91906152de565b10155b8015610e32575050603e54111590565b6141cb603b5461dead613d18565b43603d55603b54603a546141de916137f9565b603a819055603954101561175857603880547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00169055565b60ff8116158061422957508060ff166001145b156145715760068054600e5560078054600f5560088054601055600980546011805473ffffffffffffffffffffffffffffffffffffffff8084167fffffffffffffffffffffffff0000000000000000000000000000000000000000928316179092556012549096556013549094556014549092556015549092169216919091179055604080518082018252601481527f496e73756666696369656e742042616c616e636500000000000000000000000060208083019190915273ffffffffffffffffffffffffffffffffffffffff871660009081526022909152919091205461431391849061363e565b73ffffffffffffffffffffffffffffffffffffffff808616600090815260226020526040808220939093559085168152205461434f90836137f9565b73ffffffffffffffffffffffffffffffffffffffff8416600090815260226020908152604080832093909355602d9052205460ff16156143c75773ffffffffffffffffffffffffffffffffffffffff84166000908152603160205260408120546143b990846137f9565b90506143c58582613697565b505b73ffffffffffffffffffffffffffffffffffffffff84166000908152602d602052604090205460ff16156144335773ffffffffffffffffffffffffffffffffffffffff83166000908152603160205260408120546144259084613684565b90506144318482613697565b505b8273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef8460405161449291815260200190565b60405180910390a38060ff1660000361450857614503600e54600655600f54600755601054600855601154600980547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff909216919091179055565b612a88565b8060ff1660010361450357614503601654600655601754600755601854600855601954600980547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff909216919091179055565b8060ff166002036145fe5760068054600e5560078054600f5560088054601055600980546011805473ffffffffffffffffffffffffffffffffffffffff8084167fffffffffffffffffffffffff000000000000000000000000000000000000000092831617909255601a54909655601b54909455601c54909255601d549092169216919091179055614687565b8060ff166003036146875760068054600e5560078054600f5560088054601055600980546011805473ffffffffffffffffffffffffffffffffffffffff8084167fffffffffffffffffffffffff000000000000000000000000000000000000000092831617909255601e54909655601f5490945560205490925560215490921692169190911790555b600061469283614bd5565b905061471d836040518060400160405280601481526020017f496e73756666696369656e742042616c616e6365000000000000000000000000815250602260008973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205461363e9092919063ffffffff16565b73ffffffffffffffffffffffffffffffffffffffff8087166000908152602260205260408082209390935583519187168152919091205461475d916137f9565b73ffffffffffffffffffffffffffffffffffffffff851660009081526022602052604090205561478c81614c7f565b6147ea600e54600655600f54600755601054600855601154600980547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff909216919091179055565b8373ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef836000015160405161484d91815260200190565b60405180910390a36009546020820151604083015173ffffffffffffffffffffffffffffffffffffffff928316928816917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef916148a9916137f9565b60405190815260200160405180910390a361dead73ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef836060015160405161491f91815260200190565b60405180910390a35050505050565b602f805461493e9060019061534f565b8154811061494e5761494e615362565b600091825260208083209091015473ffffffffffffffffffffffffffffffffffffffff84811684526030909252604090922054602f8054929093169291811061499957614999615362565b600091825260208083209190910180547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff94851617905591831681526030918290526040812054602f805491939291614a0a9060019061534f565b81548110614a1a57614a1a615362565b600091825260208083209091015473ffffffffffffffffffffffffffffffffffffffff168352820192909252604001902055602f805480614a5d57614a5d61541c565b60008281526020902081017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff90810180547fffffffffffffffffffffffff000000000000000000000000000000000000000016905501905550565b81546000908103614acb57506000610e32565b82546000905b80821015614b27576000614ae58383614ccb565b905084868281548110614afa57614afa615362565b90600052602060002001541115614b1357809150614b21565b614b1e816001615293565b92505b50614ad1565b600082118015614b5c57508385614b3f60018561534f565b81548110614b4f57614b4f615362565b9060005260206000200154145b15614b7557614b6c60018361534f565b92505050610e32565b509050610e32565b73ffffffffffffffffffffffffffffffffffffffff81166000908152604460209081526040808320603183528184205460229093529220546118649291614bc391615293565b614ce6565b6117586045614bc3610e91565b614c006040518060800160405280600081526020016000815260200160008152602001600081525090565b6000604051806080016040528060008152602001614c2385600660000154614d30565b8152602001614c3785600660010154614d30565b8152602001614c4b85600660020154614d30565b8152509050614c778160600151611096836040015161109685602001518861368490919063ffffffff16565b815292915050565b614cbb614c9d826020015183604001516137f990919063ffffffff16565b60095473ffffffffffffffffffffffffffffffffffffffff16614d52565b611864816060015161dead614d52565b6000614cda6002848418615314565b61369090848416615293565b6000614cf061393c565b905080614cfc84614dd7565b10156119a8578254600180820185556000858152602080822090930193909355938401805494850181558252902090910155565b600081600003614d4257506000610e32565b613690612710611f518585613ad8565b73ffffffffffffffffffffffffffffffffffffffff8116614d71575050565b81600003614d7d575050565b73ffffffffffffffffffffffffffffffffffffffff8116600090815260226020526040902054614dad90836137f9565b73ffffffffffffffffffffffffffffffffffffffff90911660009081526022602052604090205550565b80546000908103614dea57506000919050565b81548290614dfa9060019061534f565b81548110614e0a57614e0a615362565b90600052602060002001549050919050565b801515811461186457600080fd5b60008060008060808587031215614e4057600080fd5b8435614e4b81614e1c565b966020860135965060408601359560600135945092505050565b73ffffffffffffffffffffffffffffffffffffffff8116811461186457600080fd5b600060208284031215614e9957600080fd5b813561369081614e65565b600060208083528351808285015260005b81811015614ed157858101830151858201604001528201614eb5565b5060006040828601015260407fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f8301168501019250505092915050565b60008060408385031215614f2357600080fd5b8235614f2e81614e65565b946020939093013593505050565b600080600060608486031215614f5157600080fd5b505081359360208301359350604090920135919050565b600080600060608486031215614f7d57600080fd5b8335614f8881614e65565b92506020840135614f9881614e65565b929592945050506040919091013590565b60008060408385031215614fbc57600080fd5b8235614fc781614e65565b91506020830135614fd781614e1c565b809150509250929050565b60008060408385031215614ff557600080fd5b823561500081614e65565b91506020830135614fd781614e65565b60006020828403121561502257600080fd5b5035919050565b6000806040838503121561503c57600080fd5b823591506020830135614fd781614e65565b60008060006060848603121561506357600080fd5b833561506e81614e65565b925060208401359150604084013561508581614e65565b809150509250925092565b600181811c908216806150a457607f821691505b6020821081036150dd577f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b50919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b600181815b8085111561393357817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff04821115615151576151516150e3565b8085161561515e57918102915b93841c9390800290615117565b60008261517a57506001610e32565b8161518757506000610e32565b816001811461519d57600281146151a7576151c3565b6001915050610e32565b60ff8411156151b8576151b86150e3565b50506001821b610e32565b5060208310610133831016604e8410600b84101617156151e6575081810a610e32565b6151f08383615112565b807fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff04821115615222576152226150e3565b029392505050565b600061369060ff84168361516b565b6000817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0483118215151615615271576152716150e3565b500290565b60006020828403121561528857600080fd5b815161369081614e65565b80820180821115610e3257610e326150e3565b60007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82036152d7576152d76150e3565b5060010190565b6000602082840312156152f057600080fd5b5051919050565b60006020828403121561530957600080fd5b815161369081614e1c565b60008261534a577f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b500490565b81810381811115610e3257610e326150e3565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b600060a082018783526020878185015260a0604085015281875180845260c086019150828901935060005b818110156153ee57845173ffffffffffffffffffffffffffffffffffffffff16835293830193918301916001016153bc565b505073ffffffffffffffffffffffffffffffffffffffff969096166060850152505050608001529392505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fdfe45524332303a207472616e7366657220616d6f756e74206578636565647320616c6c6f77616e636545524332303a2064656372656173656420616c6c6f77616e63652062656c6f77207a65726fa26469706673582212200ff6962b1635d38507a8eb61479f89eaa32ca8318f10727426d59f9a9ee2934664736f6c63430008100033
Deployed Bytecode
0x6080604052600436106103c75760003560e01c806389a30271116101f2578063ced72f871161010d578063ea497b79116100a0578063f3290d751161006f578063f3290d7514610cc0578063f84ba65d14610ce0578063f8a67a6214610d00578063fd4b715814610d2057600080fd5b8063ea497b7914610c33578063ee99205c14610c53578063efac458514610c80578063f2fde38b14610ca057600080fd5b8063de7cf799116100dc578063de7cf79914610b4b578063e284db3e14610bba578063e4d1a87414610bda578063ea2f0b3714610c1357600080fd5b8063ced72f8714610aa3578063d3a866c714610ab8578063d543dbeb14610ad8578063dd62ed3e14610af857600080fd5b8063a0558c3f11610185578063ad5c464811610154578063ad5c464814610a13578063b6f3e08714610a40578063bd3900c014610a60578063c80bbbeb14610a7657600080fd5b8063a0558c3f14610986578063a457c2d7146109a6578063a9059cbb146109c6578063a9a47654146109e657600080fd5b80639711715a116101c15780639711715a14610904578063981b24d01461091957806398807d84146109395780639a377b821461096657600080fd5b806389a30271146108775780638c232838146108a45780638da5cb5b146108c457806395d89b41146108ef57600080fd5b80633bb8a8d4116102e25780635439ad8611610275578063715018a611610244578063715018a6146107f05780637d1db4a514610805578063817b1cd21461081b57806388f820201461083157600080fd5b80635439ad86146107585780636baa9a571461076d5780636ed52e681461078d57806370a08231146107ad57600080fd5b80634896a632116102b15780634896a632146106bc5780634ee2cd7e146106d25780635342acb4146106f2578063537df3b61461073857600080fd5b80633bb8a8d4146106425780633d8a62d31461065c57806340b28c2f1461067c578063437823ec1461069c57600080fd5b806318160ddd1161035a578063303675541161032957806330367554146105b6578063313ce567146105e657806335ddf3a714610602578063395093511461062257600080fd5b806318160ddd1461053e57806323b872dd1461056157806329b1c15c146105815780632b112e49146105a157600080fd5b8063095ea7b311610396578063095ea7b3146104ae5780630d075d9c146104ce5780630f683e90146104ee57806315c9aca11461050e57600080fd5b806302e8e85f146103d3578063048c7baf1461042a57806306df27191461044c57806306fdde031461048c57600080fd5b366103ce57005b600080fd5b3480156103df57600080fd5b506033546104009073ffffffffffffffffffffffffffffffffffffffff1681565b60405173ffffffffffffffffffffffffffffffffffffffff90911681526020015b60405180910390f35b34801561043657600080fd5b5061044a610445366004614e2a565b610d40565b005b34801561045857600080fd5b5061047c610467366004614e87565b602d6020526000908152604090205460ff1681565b6040519015158152602001610421565b34801561049857600080fd5b506104a1610d8f565b6040516104219190614ea4565b3480156104ba57600080fd5b5061047c6104c9366004614f10565b610e21565b3480156104da57600080fd5b5061044a6104e9366004614f3c565b610e38565b3480156104fa57600080fd5b5061044a610509366004614f3c565b610e6c565b34801561051a57600080fd5b5061047c610529366004614e87565b602e6020526000908152604090205460ff1681565b34801561054a57600080fd5b50610553610e91565b604051908152602001610421565b34801561056d57600080fd5b5061047c61057c366004614f68565b610eb2565b34801561058d57600080fd5b5061044a61059c366004614e87565b610f28565b3480156105ad57600080fd5b50610553611021565b3480156105c257600080fd5b5061047c6105d1366004614e87565b602b6020526000908152604090205460ff1681565b3480156105f257600080fd5b5060405160098152602001610421565b34801561060e57600080fd5b5061044a61061d366004614fa9565b61109c565b34801561062e57600080fd5b5061047c61063d366004614f10565b611186565b34801561064e57600080fd5b5060385461047c9060ff1681565b34801561066857600080fd5b5061044a610677366004614e87565b6111c9565b34801561068857600080fd5b5061044a610697366004614fe2565b611220565b3480156106a857600080fd5b5061044a6106b7366004614e87565b611495565b3480156106c857600080fd5b50610553603b5481565b3480156106de57600080fd5b506105536106ed366004614f10565b6114ec565b3480156106fe57600080fd5b5061047c61070d366004614e87565b73ffffffffffffffffffffffffffffffffffffffff1660009081526024602052604090205460ff1690565b34801561074457600080fd5b5061044a610753366004614e87565b611575565b34801561076457600080fd5b506105536116a4565b34801561077957600080fd5b50610553610788366004614e87565b6116ae565b34801561079957600080fd5b5061044a6107a8366004614fa9565b6116e8565b3480156107b957600080fd5b506105536107c8366004614e87565b73ffffffffffffffffffffffffffffffffffffffff1660009081526022602052604090205490565b3480156107fc57600080fd5b5061044a611746565b34801561081157600080fd5b5061055360375481565b34801561082757600080fd5b5061055360325481565b34801561083d57600080fd5b5061047c61084c366004614e87565b73ffffffffffffffffffffffffffffffffffffffff1660009081526026602052604090205460ff1690565b34801561088357600080fd5b506036546104009073ffffffffffffffffffffffffffffffffffffffff1681565b3480156108b057600080fd5b506105536108bf366004614e87565b61175a565b3480156108d057600080fd5b5060055473ffffffffffffffffffffffffffffffffffffffff16610400565b3480156108fb57600080fd5b506104a16117ae565b34801561091057600080fd5b5061044a6117bd565b34801561092557600080fd5b50610553610934366004615010565b611867565b34801561094557600080fd5b50610553610954366004614e87565b60316020526000908152604090205481565b34801561097257600080fd5b5061044a610981366004614e87565b611897565b34801561099257600080fd5b5061044a6109a1366004615029565b61195d565b3480156109b257600080fd5b5061047c6109c1366004614f10565b6119ad565b3480156109d257600080fd5b5061047c6109e1366004614f10565b611a09565b3480156109f257600080fd5b50603f546104009073ffffffffffffffffffffffffffffffffffffffff1681565b348015610a1f57600080fd5b506035546104009073ffffffffffffffffffffffffffffffffffffffff1681565b348015610a4c57600080fd5b5061044a610a5b366004614fe2565b611a16565b348015610a6c57600080fd5b5061040061dead81565b348015610a8257600080fd5b506034546104009073ffffffffffffffffffffffffffffffffffffffff1681565b348015610aaf57600080fd5b50610553611c52565b348015610ac457600080fd5b5061044a610ad3366004615029565b611c6d565b348015610ae457600080fd5b5061044a610af3366004615010565b612a8e565b348015610b0457600080fd5b50610553610b13366004614fe2565b73ffffffffffffffffffffffffffffffffffffffff918216600090815260236020908152604080832093909416825291909152205490565b348015610b5757600080fd5b50601654601754601854601954610b849392919073ffffffffffffffffffffffffffffffffffffffff1684565b6040805194855260208501939093529183015273ffffffffffffffffffffffffffffffffffffffff166060820152608001610421565b348015610bc657600080fd5b5061044a610bd5366004614e87565b612ac6565b348015610be657600080fd5b50600a54600b54600c54600d54610b849392919073ffffffffffffffffffffffffffffffffffffffff1684565b348015610c1f57600080fd5b5061044a610c2e366004614e87565b612b1a565b348015610c3f57600080fd5b5061044a610c4e366004615010565b612b6e565b348015610c5f57600080fd5b506040546104009073ffffffffffffffffffffffffffffffffffffffff1681565b348015610c8c57600080fd5b5061044a610c9b366004615010565b612c81565b348015610cac57600080fd5b5061044a610cbb366004614e87565b612cb4565b348015610ccc57600080fd5b5061044a610cdb366004614e87565b612d68565b348015610cec57600080fd5b5061044a610cfb366004614fa9565b612e4f565b348015610d0c57600080fd5b5061044a610d1b36600461504e565b612ead565b348015610d2c57600080fd5b5061044a610d3b366004614fa9565b613075565b610d486130d3565b603880547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0016941515949094179093556039919091556000603a55603b55603c5543603d55565b606060038054610d9e90615090565b80601f0160208091040260200160405190810160405280929190818152602001828054610dca90615090565b8015610e175780601f10610dec57610100808354040283529160200191610e17565b820191906000526020600020905b815481529060010190602001808311610dfa57829003601f168201915b5050505050905090565b6000610e2e338484613154565b5060015b92915050565b610e406130d3565b600683905560078290556008819055600a839055600b829055600c819055601a92909255601b55601c55565b610e746130d3565b601683905560178290556018819055601e92909255601f55602055565b6000610e9f6009600a61522a565b610ead906305f5e100615239565b905090565b6000610ebf848484613307565b610f1e8433610f198560405180606001604052806028815260200161544c6028913973ffffffffffffffffffffffffffffffffffffffff8a166000908152602360209081526040808320338452909152902054919061363e565b613154565b5060019392505050565b610f306130d3565b73ffffffffffffffffffffffffffffffffffffffff8116610fb2576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f5059453a2041646472657373205a65726f206973206e6f7420616c6c6f77656460448201526064015b60405180910390fd5b6009805473ffffffffffffffffffffffffffffffffffffffff9092167fffffffffffffffffffffffff00000000000000000000000000000000000000009283168117909155600d805483168217905560198054831682179055601d805483168217905560218054909216179055565b60226020527fb84cf808d0d5b1ad44962c9bfddd3cfce67763c49ab557cfd0e9f6804faade995461dead60009081527fb3dad1d3e53c1132e958712e36d3ff32b0d9b9088698eb172c6b4faa7ff6d22e549091610ead91611096906110886009600a61522a565b611096906305f5e100615239565b90613684565b6110a46130d3565b73ffffffffffffffffffffffffffffffffffffffff821630148015906110e5575060345473ffffffffffffffffffffffffffffffffffffffff838116911614155b6110ee57600080fd5b73ffffffffffffffffffffffffffffffffffffffff8216600090815260266020526040902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0016821580159190911790915561115557611151826000613697565b5050565b73ffffffffffffffffffffffffffffffffffffffff8216600090815260226020526040902054611151908390613697565b33600081815260236020908152604080832073ffffffffffffffffffffffffffffffffffffffff871684529091528120549091610e2e918590610f1990866137f9565b6111d16130d3565b73ffffffffffffffffffffffffffffffffffffffff166000908152602c6020526040902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00166001179055565b6112286130d3565b6033805473ffffffffffffffffffffffffffffffffffffffff908116600090815260246020908152604080832080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff009081169091556034805486168552938290208054909116905584548785167fffffffffffffffffffffffff00000000000000000000000000000000000000009182168117909655835494871694169390931790915581517fad5c4648000000000000000000000000000000000000000000000000000000008152915163ad5c46489260048082019392918290030181865afa15801561131b573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061133f9190615276565b6035805473ffffffffffffffffffffffffffffffffffffffff9283167fffffffffffffffffffffffff0000000000000000000000000000000000000000918216178255603380548416600090815260246020908152604080832080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff009081166001908117909255603480548a168652838620805483168417905580548a16865260268552838620805483168417905580548a168652602b8552838620805483168417905580548a168652602585528386208054831684179055955489168552918420805490921617905591549080527f363f266dc0e266c1e93609619fd0d0d198ad468f99870b4dab43223b5a640e1a80548416918616919091179055915460299092527fbc72c27881d499e9ea29f42d0975d4e269d866b929e1b555435cbfe829a9d2008054909116919092161790555050565b61149d6130d3565b73ffffffffffffffffffffffffffffffffffffffff16600090815260246020526040902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00166001179055565b73ffffffffffffffffffffffffffffffffffffffff8216600090815260446020526040812081908190611520908590613805565b915091508161156a5773ffffffffffffffffffffffffffffffffffffffff85166000908152603160209081526040808320546022909252909120546115659190615293565b61156c565b805b95945050505050565b61157d6130d3565b73ffffffffffffffffffffffffffffffffffffffff811660009081526027602052604090205460ff16611658576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152604c60248201527f4164647265737320686173206e6f74206265656e20626c61636b6c697374656460448201527f2120456e74657220616e20616464726573732074686174206973206f6e20746860648201527f6520626c61636b6c6973742e0000000000000000000000000000000000000000608482015260a401610fa9565b73ffffffffffffffffffffffffffffffffffffffff16600090815260276020526040902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00169055565b6000610ead61393c565b73ffffffffffffffffffffffffffffffffffffffff81166000908152602260209081526040808320546031909252822054610e32916137f9565b6116f06130d3565b73ffffffffffffffffffffffffffffffffffffffff919091166000908152602d6020526040902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0016911515919091179055565b61174e6130d3565b6117586000613947565b565b73ffffffffffffffffffffffffffffffffffffffff811660009081526024602052604081205460ff161561179057506000919050565b600854600754600654610e3292916117a891906137f9565b906137f9565b606060048054610d9e90615090565b336000908152602e602052604090205460ff1661185c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602160248201527f43616c6c6572206973206e6f7420616c6c6f77656420746f20736e617073686f60448201527f74000000000000000000000000000000000000000000000000000000000000006064820152608401610fa9565b6118646139be565b50565b6000806000611877846045613805565b915091508161188d57611888610e91565b61188f565b805b949350505050565b61189f6130d3565b6040805473ffffffffffffffffffffffffffffffffffffffff9092167fffffffffffffffffffffffff000000000000000000000000000000000000000092831681178255603f8054909316811790925560009182526025602090815281832080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff009081166001908117909255602683528385208054821683179055602483528385208054821683179055602d909252919092208054909216179055565b6119656130d3565b60405173ffffffffffffffffffffffffffffffffffffffff82169083156108fc029084906000818181858888f193505050501580156119a8573d6000803e3d6000fd5b505050565b6000610e2e3384610f19856040518060600160405280602581526020016154746025913933600090815260236020908152604080832073ffffffffffffffffffffffffffffffffffffffff8d168452909152902054919061363e565b6000610e2e338484613307565b603354604080517fc45a0155000000000000000000000000000000000000000000000000000000008152905160009273ffffffffffffffffffffffffffffffffffffffff169163c45a01559160048083019260209291908290030181865afa158015611a86573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611aaa9190615276565b90503373ffffffffffffffffffffffffffffffffffffffff82161480611ae7575060335473ffffffffffffffffffffffffffffffffffffffff1633145b80611af157503330145b611b57576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601060248201527f5059453a204e4f545f414c4c4f574544000000000000000000000000000000006044820152606401610fa9565b611b6083613a18565b6119a85773ffffffffffffffffffffffffffffffffffffffff8381166000818152602460209081526040808320805460017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff009182168117909255602b8452828520805482168317905560258452828520805482168317905560268452828520805490911682179055602a805485526028845282852080547fffffffffffffffffffffffff000000000000000000000000000000000000000090811690971790558054855260299093529083208054909416948716949094179092558154611c48908490615293565b9091555050505050565b600854600754600654600092610ead9290916117a8916137f9565b6000805b602a54811015611cbf576000818152602860205260409020543373ffffffffffffffffffffffffffffffffffffffff90911603611cad57600191505b80611cb7816152a6565b915050611c71565b5060335473ffffffffffffffffffffffffffffffffffffffff16331480611ce35750805b611d49576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601060248201527f5059453a204e4f545f414c4c4f574544000000000000000000000000000000006044820152606401610fa9565b82600003611daf576119a8600e54600655600f54600755601054600855601154600980547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff909216919091179055565b6000611dba83613a73565b9050602a54811015612a88576040517fdd62ed3e00000000000000000000000000000000000000000000000000000000815233600482015230602482015260009073ffffffffffffffffffffffffffffffffffffffff85169063dd62ed3e90604401602060405180830381865afa158015611e39573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611e5d91906152de565b9050848110612a86576040517f23b872dd0000000000000000000000000000000000000000000000000000000081523360048201523060248201526044810186905273ffffffffffffffffffffffffffffffffffffffff8516906323b872dd906064016020604051808303816000875af1158015611edf573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611f0391906152f7565b5060365473ffffffffffffffffffffffffffffffffffffffff908116908516036122e1576000611f31611c52565b90506000611f5782611f516006600101548a613ad890919063ffffffff16565b90613ae4565b90506000611f7783611f516006600001548b613ad890919063ffffffff16565b90506000611f9784611f516006600201548c613ad890919063ffffffff16565b6040805490517fa9059cbb00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff91821660048201526024810185905291925089169063a9059cbb906044016020604051808303816000875af1158015612012573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061203691906152f7565b50603f546040517f1fd55d260000000000000000000000000000000000000000000000000000000081526004810184905273ffffffffffffffffffffffffffffffffffffffff90911690631fd55d2690602401600060405180830381600087803b1580156120a357600080fd5b505af19250505080156120b4575060015b506035546040517f70a0823100000000000000000000000000000000000000000000000000000000815230600482015260009173ffffffffffffffffffffffffffffffffffffffff16906370a0823190602401602060405180830381865afa158015612124573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061214891906152de565b9050600061215685846137f9565b60085460075491925060009161216b916137f9565b9050612177828c613af0565b6035546040517f70a0823100000000000000000000000000000000000000000000000000000000815230600482015260009161221191869173ffffffffffffffffffffffffffffffffffffffff16906370a08231906024015b602060405180830381865afa1580156121ed573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061109691906152de565b9050600061223183611f5160066001015485613ad890919063ffffffff16565b6035546009546040517fa9059cbb00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff918216600482015260248101849052929350169063a9059cbb906044016020604051808303816000875af11580156122ae573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906122d291906152f7565b50505050505050505050612a28565b60355473ffffffffffffffffffffffffffffffffffffffff9081169085160361261757600061230e611c52565b9050600061232e82611f516006600101548a613ad890919063ffffffff16565b9050600061234e83611f516006600001548b613ad890919063ffffffff16565b6036546040517f70a0823100000000000000000000000000000000000000000000000000000000815230600482015291925060009173ffffffffffffffffffffffffffffffffffffffff909116906370a0823190602401602060405180830381865afa1580156123c2573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906123e691906152de565b90506123f28289613ca5565b6036546040517f70a0823100000000000000000000000000000000000000000000000000000000815230600482015260009161244f91849173ffffffffffffffffffffffffffffffffffffffff16906370a08231906024016121d0565b6009546040517fa9059cbb00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff9182166004820152602481018790529192508a169063a9059cbb906044016020604051808303816000875af11580156124ca573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906124ee91906152f7565b506036546040805490517fa9059cbb00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff91821660048201526024810184905291169063a9059cbb906044016020604051808303816000875af115801561256a573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061258e91906152f7565b50603f546040517f1fd55d260000000000000000000000000000000000000000000000000000000081526004810183905273ffffffffffffffffffffffffffffffffffffffff90911690631fd55d2690602401600060405180830381600087803b1580156125fb57600080fd5b505af192505050801561260c575060015b505050505050612a28565b6035546040517f70a0823100000000000000000000000000000000000000000000000000000000815230600482015260009173ffffffffffffffffffffffffffffffffffffffff16906370a0823190602401602060405180830381865afa158015612686573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906126aa91906152de565b90506126b68686613af0565b6035546040517f70a0823100000000000000000000000000000000000000000000000000000000815230600482015260009161271391849173ffffffffffffffffffffffffffffffffffffffff16906370a08231906024016121d0565b9050600061271f611c52565b9050600061273f82611f5160066001015486613ad890919063ffffffff16565b9050600061275f83611f5160066000015487613ad890919063ffffffff16565b6036546040517f70a0823100000000000000000000000000000000000000000000000000000000815230600482015291925060009173ffffffffffffffffffffffffffffffffffffffff909116906370a0823190602401602060405180830381865afa1580156127d3573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906127f791906152de565b9050612803828b613ca5565b6036546040517f70a0823100000000000000000000000000000000000000000000000000000000815230600482015260009161286091849173ffffffffffffffffffffffffffffffffffffffff16906370a08231906024016121d0565b6035546009546040517fa9059cbb00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff918216600482015260248101889052929350169063a9059cbb906044016020604051808303816000875af11580156128dd573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061290191906152f7565b506036546040805490517fa9059cbb00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff91821660048201526024810184905291169063a9059cbb906044016020604051808303816000875af115801561297d573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906129a191906152f7565b50603f546040517f1fd55d260000000000000000000000000000000000000000000000000000000081526004810183905273ffffffffffffffffffffffffffffffffffffffff90911690631fd55d2690602401600060405180830381600087803b158015612a0e57600080fd5b505af1925050508015612a1f575060015b50505050505050505b612a86600e54600655600f54600755601054600855601154600980547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff909216919091179055565b505b50505050565b612a966130d3565b612ac0612710611f5183612aac6009600a61522a565b612aba906305f5e100615239565b90613ad8565b60375550565b612ace6130d3565b73ffffffffffffffffffffffffffffffffffffffff166000908152602c6020526040902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00169055565b612b226130d3565b73ffffffffffffffffffffffffffffffffffffffff16600090815260246020526040902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00169055565b612b766130d3565b6035546040517f70a0823100000000000000000000000000000000000000000000000000000000815230600482015260009173ffffffffffffffffffffffffffffffffffffffff16906370a0823190602401602060405180830381865afa158015612be5573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612c0991906152de565b905080821115612c75576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601f60248201527f416d6f756e74206578636565647320636f6e74726163742062616c616e6365006044820152606401610fa9565b6111518261dead613d18565b612c896130d3565b80612c966009600a61522a565b612ca4906305f5e100615239565b612cae9190615314565b603e5550565b612cbc6130d3565b73ffffffffffffffffffffffffffffffffffffffff8116612d5f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201527f64647265737300000000000000000000000000000000000000000000000000006064820152608401610fa9565b61186481613947565b612d706130d3565b73ffffffffffffffffffffffffffffffffffffffff811660009081526027602052604090205460ff1615612e00576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601f60248201527f4164647265737320697320616c726561647920626c61636b6c697374656421006044820152606401610fa9565b73ffffffffffffffffffffffffffffffffffffffff16600090815260276020526040902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00166001179055565b612e576130d3565b73ffffffffffffffffffffffffffffffffffffffff91909116600090815260256020526040902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0016911515919091179055565b612eb56130d3565b6040517f70a08231000000000000000000000000000000000000000000000000000000008152306004820152829073ffffffffffffffffffffffffffffffffffffffff8516906370a0823190602401602060405180830381865afa158015612f21573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612f4591906152de565b1015612fdc576040517f70a0823100000000000000000000000000000000000000000000000000000000815230600482015273ffffffffffffffffffffffffffffffffffffffff8416906370a0823190602401602060405180830381865afa158015612fb5573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612fd991906152de565b91505b6040517fa9059cbb00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff82811660048301526024820184905284169063a9059cbb906044016020604051808303816000875af1158015613051573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612a8891906152f7565b61307d6130d3565b73ffffffffffffffffffffffffffffffffffffffff919091166000908152602e6020526040902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0016911515919091179055565b60055473ffffffffffffffffffffffffffffffffffffffff163314611758576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610fa9565b73ffffffffffffffffffffffffffffffffffffffff83166131f6576040517f08c379a0000000000000000000000000000000000000000000000000000000008152602060048201526024808201527f45524332303a20617070726f76652066726f6d20746865207a65726f2061646460448201527f72657373000000000000000000000000000000000000000000000000000000006064820152608401610fa9565b73ffffffffffffffffffffffffffffffffffffffff8216613299576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602260248201527f45524332303a20617070726f766520746f20746865207a65726f20616464726560448201527f73730000000000000000000000000000000000000000000000000000000000006064820152608401610fa9565b73ffffffffffffffffffffffffffffffffffffffff83811660008181526023602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925910160405180910390a3505050565b73ffffffffffffffffffffffffffffffffffffffff83166133aa576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602560248201527f45524332303a207472616e736665722066726f6d20746865207a65726f20616460448201527f64726573730000000000000000000000000000000000000000000000000000006064820152608401610fa9565b73ffffffffffffffffffffffffffffffffffffffff821661344d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602360248201527f45524332303a207472616e7366657220746f20746865207a65726f206164647260448201527f65737300000000000000000000000000000000000000000000000000000000006064820152608401610fa9565b600081116134dd576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602960248201527f5472616e7366657220616d6f756e74206d75737420626520677265617465722060448201527f7468616e207a65726f00000000000000000000000000000000000000000000006064820152608401610fa9565b73ffffffffffffffffffffffffffffffffffffffff821660009081526027602052604090205460ff161561351057600080fd5b61351b838383613f4b565b613525838261401b565b61352e816140b7565b1561353b5761353b6141bd565b73ffffffffffffffffffffffffffffffffffffffff82166000908152602b602052604081205460ff16801561358b575060335473ffffffffffffffffffffffffffffffffffffffff858116911614155b80156135bd575073ffffffffffffffffffffffffffffffffffffffff841660009081526024602052604090205460ff16155b156135ca57506001613632565b73ffffffffffffffffffffffffffffffffffffffff84166000908152602c602052604090205460ff161561360057506002613632565b73ffffffffffffffffffffffffffffffffffffffff83166000908152602c602052604090205460ff1615613632575060035b612a8884848484614216565b6000818484111561367c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610fa99190614ea4565b505050900390565b6000613690828461534f565b9392505050565b6000811180156136ca575073ffffffffffffffffffffffffffffffffffffffff8216600090815260316020526040902054155b1561375557602f805473ffffffffffffffffffffffffffffffffffffffff84166000818152603060205260408120839055600183018455929092527fa813484aef6fb598f9f753daf162068ff39ccea4075cb95e1a30f86995b5b7ee0180547fffffffffffffffffffffffff0000000000000000000000000000000000000000169091179055613795565b80158015613787575073ffffffffffffffffffffffffffffffffffffffff821660009081526031602052604090205415155b15613795576137958261492e565b73ffffffffffffffffffffffffffffffffffffffff82166000908152603160205260409020546032546137cd9183916117a891613684565b60325573ffffffffffffffffffffffffffffffffffffffff909116600090815260316020526040902055565b60006136908284615293565b60008060008411613872576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601660248201527f4552433230536e617073686f743a2069642069732030000000000000000000006044820152606401610fa9565b61387a61393c565b8411156138e3576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f4552433230536e617073686f743a206e6f6e6578697374656e742069640000006044820152606401610fa9565b60006138ef8486614ab8565b84549091508103613907576000809250925050613935565b600184600101828154811061391e5761391e615362565b90600052602060002001549250925050613935565b505b9250929050565b6000610ead60435490565b6005805473ffffffffffffffffffffffffffffffffffffffff8381167fffffffffffffffffffffffff0000000000000000000000000000000000000000831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b60006139ce604380546001019055565b60006139d861393c565b90507f8030e83b04d87bef53480e26263266d6ca66863aa8506aca6f2559d18aa1cb6781604051613a0b91815260200190565b60405180910390a1919050565b600080805b602a54811015613a6c5760008181526028602052604090205473ffffffffffffffffffffffffffffffffffffffff808616911603613a5a57600191505b80613a64816152a6565b915050613a1d565b5092915050565b600080602a546001613a859190615293565b905060005b602a54811015613a6c5760008181526029602052604090205473ffffffffffffffffffffffffffffffffffffffff808616911603613ac6578091505b80613ad0816152a6565b915050613a8a565b60006136908284615239565b60006136908284615314565b6040805160028082526060820183526000926020830190803683370190505090508181600081518110613b2557613b25615362565b73ffffffffffffffffffffffffffffffffffffffff9283166020918202929092010152603554825191169082906001908110613b6357613b63615362565b73ffffffffffffffffffffffffffffffffffffffff92831660209182029290920101526033546040517f095ea7b30000000000000000000000000000000000000000000000000000000081529082166004820152602481018590529083169063095ea7b3906044016020604051808303816000875af1158015613bea573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613c0e91906152f7565b506033546040517f5c11d79500000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff90911690635c11d79590613c6e908690600090869030904290600401615391565b600060405180830381600087803b158015613c8857600080fd5b505af1158015613c9c573d6000803e3d6000fd5b50505050505050565b6040805160028082526060820183526000926020830190803683370190505090508181600081518110613cda57613cda615362565b73ffffffffffffffffffffffffffffffffffffffff9283166020918202929092010152603654825191169082906001908110613b6357613b63615362565b604280547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001660011790556040805160028082526060820183526000926020830190803683375050603554825192935073ffffffffffffffffffffffffffffffffffffffff1691839150600090613d9157613d91615362565b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff16815250503081600181518110613ddf57613ddf615362565b73ffffffffffffffffffffffffffffffffffffffff92831660209182029290920101526035546033546040517f095ea7b300000000000000000000000000000000000000000000000000000000815290831660048201526024810186905291169063095ea7b3906044016020604051808303816000875af1158015613e68573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613e8c91906152f7565b506033546040517f5c11d79500000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff90911690635c11d79590613eec908690600090869088904290600401615391565b600060405180830381600087803b158015613f0657600080fd5b505af1158015613f1a573d6000803e3d6000fd5b5050604280547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001690555050505050565b73ffffffffffffffffffffffffffffffffffffffff8316613f7757613f6f82614b7d565b6119a8614bc8565b73ffffffffffffffffffffffffffffffffffffffff8216613f9b57613f6f83614b7d565b73ffffffffffffffffffffffffffffffffffffffff82166000908152602d602052604090205460ff1615613fd2576119a883614b7d565b73ffffffffffffffffffffffffffffffffffffffff83166000908152602d602052604090205460ff1615614009576119a882614b7d565b61401283614b7d565b6119a882614b7d565b60375481111580614051575073ffffffffffffffffffffffffffffffffffffffff821660009081526025602052604090205460ff165b611151576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601160248201527f5458204c696d69742045786365656465640000000000000000000000000000006044820152606401610fa9565b60345460009073ffffffffffffffffffffffffffffffffffffffff1633148015906140e5575060425460ff16155b80156140f3575060385460ff165b801561410e575043603c54603d5461410b9190615293565b11155b80156141ad5750603b546035546040517f70a0823100000000000000000000000000000000000000000000000000000000815230600482015273ffffffffffffffffffffffffffffffffffffffff909116906370a0823190602401602060405180830381865afa158015614186573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906141aa91906152de565b10155b8015610e32575050603e54111590565b6141cb603b5461dead613d18565b43603d55603b54603a546141de916137f9565b603a819055603954101561175857603880547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00169055565b60ff8116158061422957508060ff166001145b156145715760068054600e5560078054600f5560088054601055600980546011805473ffffffffffffffffffffffffffffffffffffffff8084167fffffffffffffffffffffffff0000000000000000000000000000000000000000928316179092556012549096556013549094556014549092556015549092169216919091179055604080518082018252601481527f496e73756666696369656e742042616c616e636500000000000000000000000060208083019190915273ffffffffffffffffffffffffffffffffffffffff871660009081526022909152919091205461431391849061363e565b73ffffffffffffffffffffffffffffffffffffffff808616600090815260226020526040808220939093559085168152205461434f90836137f9565b73ffffffffffffffffffffffffffffffffffffffff8416600090815260226020908152604080832093909355602d9052205460ff16156143c75773ffffffffffffffffffffffffffffffffffffffff84166000908152603160205260408120546143b990846137f9565b90506143c58582613697565b505b73ffffffffffffffffffffffffffffffffffffffff84166000908152602d602052604090205460ff16156144335773ffffffffffffffffffffffffffffffffffffffff83166000908152603160205260408120546144259084613684565b90506144318482613697565b505b8273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef8460405161449291815260200190565b60405180910390a38060ff1660000361450857614503600e54600655600f54600755601054600855601154600980547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff909216919091179055565b612a88565b8060ff1660010361450357614503601654600655601754600755601854600855601954600980547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff909216919091179055565b8060ff166002036145fe5760068054600e5560078054600f5560088054601055600980546011805473ffffffffffffffffffffffffffffffffffffffff8084167fffffffffffffffffffffffff000000000000000000000000000000000000000092831617909255601a54909655601b54909455601c54909255601d549092169216919091179055614687565b8060ff166003036146875760068054600e5560078054600f5560088054601055600980546011805473ffffffffffffffffffffffffffffffffffffffff8084167fffffffffffffffffffffffff000000000000000000000000000000000000000092831617909255601e54909655601f5490945560205490925560215490921692169190911790555b600061469283614bd5565b905061471d836040518060400160405280601481526020017f496e73756666696369656e742042616c616e6365000000000000000000000000815250602260008973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205461363e9092919063ffffffff16565b73ffffffffffffffffffffffffffffffffffffffff8087166000908152602260205260408082209390935583519187168152919091205461475d916137f9565b73ffffffffffffffffffffffffffffffffffffffff851660009081526022602052604090205561478c81614c7f565b6147ea600e54600655600f54600755601054600855601154600980547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff909216919091179055565b8373ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef836000015160405161484d91815260200190565b60405180910390a36009546020820151604083015173ffffffffffffffffffffffffffffffffffffffff928316928816917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef916148a9916137f9565b60405190815260200160405180910390a361dead73ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef836060015160405161491f91815260200190565b60405180910390a35050505050565b602f805461493e9060019061534f565b8154811061494e5761494e615362565b600091825260208083209091015473ffffffffffffffffffffffffffffffffffffffff84811684526030909252604090922054602f8054929093169291811061499957614999615362565b600091825260208083209190910180547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff94851617905591831681526030918290526040812054602f805491939291614a0a9060019061534f565b81548110614a1a57614a1a615362565b600091825260208083209091015473ffffffffffffffffffffffffffffffffffffffff168352820192909252604001902055602f805480614a5d57614a5d61541c565b60008281526020902081017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff90810180547fffffffffffffffffffffffff000000000000000000000000000000000000000016905501905550565b81546000908103614acb57506000610e32565b82546000905b80821015614b27576000614ae58383614ccb565b905084868281548110614afa57614afa615362565b90600052602060002001541115614b1357809150614b21565b614b1e816001615293565b92505b50614ad1565b600082118015614b5c57508385614b3f60018561534f565b81548110614b4f57614b4f615362565b9060005260206000200154145b15614b7557614b6c60018361534f565b92505050610e32565b509050610e32565b73ffffffffffffffffffffffffffffffffffffffff81166000908152604460209081526040808320603183528184205460229093529220546118649291614bc391615293565b614ce6565b6117586045614bc3610e91565b614c006040518060800160405280600081526020016000815260200160008152602001600081525090565b6000604051806080016040528060008152602001614c2385600660000154614d30565b8152602001614c3785600660010154614d30565b8152602001614c4b85600660020154614d30565b8152509050614c778160600151611096836040015161109685602001518861368490919063ffffffff16565b815292915050565b614cbb614c9d826020015183604001516137f990919063ffffffff16565b60095473ffffffffffffffffffffffffffffffffffffffff16614d52565b611864816060015161dead614d52565b6000614cda6002848418615314565b61369090848416615293565b6000614cf061393c565b905080614cfc84614dd7565b10156119a8578254600180820185556000858152602080822090930193909355938401805494850181558252902090910155565b600081600003614d4257506000610e32565b613690612710611f518585613ad8565b73ffffffffffffffffffffffffffffffffffffffff8116614d71575050565b81600003614d7d575050565b73ffffffffffffffffffffffffffffffffffffffff8116600090815260226020526040902054614dad90836137f9565b73ffffffffffffffffffffffffffffffffffffffff90911660009081526022602052604090205550565b80546000908103614dea57506000919050565b81548290614dfa9060019061534f565b81548110614e0a57614e0a615362565b90600052602060002001549050919050565b801515811461186457600080fd5b60008060008060808587031215614e4057600080fd5b8435614e4b81614e1c565b966020860135965060408601359560600135945092505050565b73ffffffffffffffffffffffffffffffffffffffff8116811461186457600080fd5b600060208284031215614e9957600080fd5b813561369081614e65565b600060208083528351808285015260005b81811015614ed157858101830151858201604001528201614eb5565b5060006040828601015260407fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f8301168501019250505092915050565b60008060408385031215614f2357600080fd5b8235614f2e81614e65565b946020939093013593505050565b600080600060608486031215614f5157600080fd5b505081359360208301359350604090920135919050565b600080600060608486031215614f7d57600080fd5b8335614f8881614e65565b92506020840135614f9881614e65565b929592945050506040919091013590565b60008060408385031215614fbc57600080fd5b8235614fc781614e65565b91506020830135614fd781614e1c565b809150509250929050565b60008060408385031215614ff557600080fd5b823561500081614e65565b91506020830135614fd781614e65565b60006020828403121561502257600080fd5b5035919050565b6000806040838503121561503c57600080fd5b823591506020830135614fd781614e65565b60008060006060848603121561506357600080fd5b833561506e81614e65565b925060208401359150604084013561508581614e65565b809150509250925092565b600181811c908216806150a457607f821691505b6020821081036150dd577f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b50919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b600181815b8085111561393357817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff04821115615151576151516150e3565b8085161561515e57918102915b93841c9390800290615117565b60008261517a57506001610e32565b8161518757506000610e32565b816001811461519d57600281146151a7576151c3565b6001915050610e32565b60ff8411156151b8576151b86150e3565b50506001821b610e32565b5060208310610133831016604e8410600b84101617156151e6575081810a610e32565b6151f08383615112565b807fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff04821115615222576152226150e3565b029392505050565b600061369060ff84168361516b565b6000817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0483118215151615615271576152716150e3565b500290565b60006020828403121561528857600080fd5b815161369081614e65565b80820180821115610e3257610e326150e3565b60007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82036152d7576152d76150e3565b5060010190565b6000602082840312156152f057600080fd5b5051919050565b60006020828403121561530957600080fd5b815161369081614e1c565b60008261534a577f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b500490565b81810381811115610e3257610e326150e3565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b600060a082018783526020878185015260a0604085015281875180845260c086019150828901935060005b818110156153ee57845173ffffffffffffffffffffffffffffffffffffffff16835293830193918301916001016153bc565b505073ffffffffffffffffffffffffffffffffffffffff969096166060850152505050608001529392505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fdfe45524332303a207472616e7366657220616d6f756e74206578636565647320616c6c6f77616e636545524332303a2064656372656173656420616c6c6f77616e63652062656c6f77207a65726fa26469706673582212200ff6962b1635d38507a8eb61479f89eaa32ca8318f10727426d59f9a9ee2934664736f6c63430008100033
Deployed Bytecode Sourcemap
564:35706:10:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;3224:35;;;;;;;;;;-1:-1:-1;3224:35:10;;;;;;;;;;;213:42:15;201:55;;;183:74;;171:2;156:18;3224:35:10;;;;;;;;26902:351;;;;;;;;;;-1:-1:-1;26902:351:10;;;;;:::i;:::-;;:::i;:::-;;2376:50;;;;;;;;;;-1:-1:-1;2376:50:10;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;1418:14:15;;1411:22;1393:41;;1381:2;1366:18;2376:50:10;1253:187:15;2156:98:1;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;11868:165:10:-;;;;;;;;;;-1:-1:-1;11868:165:10;;;;;:::i;:::-;;:::i;22352:580::-;;;;;;;;;;-1:-1:-1;22352:580:10;;;;;:::i;:::-;;:::i;22969:433::-;;;;;;;;;;-1:-1:-1;22969:433:10;;;;;:::i;:::-;;:::i;2469:46::-;;;;;;;;;;-1:-1:-1;2469:46:10;;;;;:::i;:::-;;;;;;;;;;;;;;;;8215:100;;;;;;;;;;;;;:::i;:::-;;;2844:25:15;;;2832:2;2817:18;8215:100:10;2698:177:15;28806:316:10;;;;;;;;;;-1:-1:-1;28806:316:10;;;;;:::i;:::-;;:::i;23527:440::-;;;;;;;;;;-1:-1:-1;23527:440:10;;;;;:::i;:::-;;:::i;8943:149::-;;;;;;;;;;;;;:::i;2217:47::-;;;;;;;;;;-1:-1:-1;2217:47:10;;;;;:::i;:::-;;;;;;;;;;;;;;;;7900:90;;;;;;;;;;-1:-1:-1;7900:90:10;;2779:1;3483:36:15;;3471:2;3456:18;7900:90:10;3341:184:15;21997:319:10;;;;;;;;;;-1:-1:-1;21997:319:10;;;;;:::i;:::-;;:::i;12117:224::-;;;;;;;;;;-1:-1:-1;12117:224:10;;;;;:::i;:::-;;:::i;3741:38::-;;;;;;;;;;-1:-1:-1;3741:38:10;;;;;;;;10412:110;;;;;;;;;;-1:-1:-1;10412:110:10;;;;;:::i;:::-;;:::i;27625:677::-;;;;;;;;;;-1:-1:-1;27625:677:10;;;;;:::i;:::-;;:::i;15547:109::-;;;;;;;;;;-1:-1:-1;15547:109:10;;;;;:::i;:::-;;:::i;3849:32::-;;;;;;;;;;;;;;;;33566:289;;;;;;;;;;-1:-1:-1;33566:289:10;;;;;:::i;:::-;;:::i;15160:121::-;;;;;;;;;;-1:-1:-1;15160:121:10;;;;;:::i;:::-;15247:27;;15224:4;15247:27;;;:18;:27;;;;;;;;;15160:121;7398:256;;;;;;;;;;-1:-1:-1;7398:256:10;;;;;:::i;:::-;;:::i;33429:109::-;;;;;;;;;;;;;:::i;8659:141::-;;;;;;;;;;-1:-1:-1;8659:141:10;;;;;:::i;:::-;;:::i;10692:125::-;;;;;;;;;;-1:-1:-1;10692:125:10;;;;;:::i;:::-;;:::i;8400:124::-;;;;;;;;;;-1:-1:-1;8400:124:10;;;;;:::i;:::-;8499:18;;8473:7;8499:18;;;:9;:18;;;;;;;8400:124;1831:101:0;;;;;;;;;;;;;:::i;3434:47:10:-;;;;;;;;;;;;;;;;3102:26;;;;;;;;;;;;;;;;15360:121;;;;;;;;;;-1:-1:-1;15360:121:10;;;;;:::i;:::-;15451:23;;15428:4;15451:23;;;:14;:23;;;;;;;;;15360:121;3322:19;;;;;;;;;;-1:-1:-1;3322:19:10;;;;;;;;13321:309;;;;;;;;;;-1:-1:-1;13321:309:10;;;;;:::i;:::-;;:::i;1201:85:0:-;;;;;;;;;;-1:-1:-1;1273:6:0;;;;1201:85;;2367:102:1;;;;;;;;;;;;;:::i;32949:136:10:-;;;;;;;;;;;;;:::i;33861:230::-;;;;;;;;;;-1:-1:-1;33861:230:10;;;;;:::i;:::-;;:::i;3054:41::-;;;;;;;;;;-1:-1:-1;3054:41:10;;;;;:::i;:::-;;;;;;;;;;;;;;23973:417;;;;;;;;;;-1:-1:-1;23973:417:10;;;;;:::i;:::-;;:::i;10944:113::-;;;;;;;;;;-1:-1:-1;10944:113:10;;;;;:::i;:::-;;:::i;12429:275::-;;;;;;;;;;-1:-1:-1;12429:275:10;;;;;:::i;:::-;;:::i;28528:171::-;;;;;;;;;;-1:-1:-1;28528:171:10;;;;;:::i;:::-;;:::i;4101:39::-;;;;;;;;;;-1:-1:-1;4101:39:10;;;;;;;;3297:19;;;;;;;;;;-1:-1:-1;3297:19:10;;;;;;;;9766:640;;;;;;;;;;-1:-1:-1;9766:640:10;;;;;:::i;:::-;;:::i;3347:81::-;;;;;;;;;;;;3386:42;3347:81;;3265:26;;;;;;;;;;-1:-1:-1;3265:26:10;;;;;;;;13636:186;;;;;;;;;;;;;:::i;16935:4138::-;;;;;;;;;;-1:-1:-1;16935:4138:10;;;;;:::i;:::-;;:::i;15871:156::-;;;;;;;;;;-1:-1:-1;15871:156:10;;;;;:::i;:::-;;:::i;11574:148::-;;;;;;;;;;-1:-1:-1;11574:148:10;;;;;:::i;:::-;11688:18;;;;11662:7;11688:18;;;:11;:18;;;;;;;;:27;;;;;;;;;;;;;11574:148;1405:21;;;;;;;;;;-1:-1:-1;1405:21:10;;;;;;;;;;;;;;;;;;;;;5533:25:15;;;5589:2;5574:18;;5567:34;;;;5617:18;;;5610:34;5692:42;5680:55;5675:2;5660:18;;5653:83;5520:3;5505:19;1405:21:10;5302:440:15;10528:114:10;;;;;;;;;;-1:-1:-1;10528:114:10;;;;;:::i;:::-;;:::i;1318:20::-;;;;;;;;;;-1:-1:-1;1318:20:10;;;;;;;;;;;;;;;;;15712:108;;;;;;;;;;-1:-1:-1;15712:108:10;;;;;:::i;:::-;;:::i;26566:267::-;;;;;;;;;;-1:-1:-1;26566:267:10;;;;;:::i;:::-;;:::i;4146:30::-;;;;;;;;;;-1:-1:-1;4146:30:10;;;;;;;;27394:151;;;;;;;;;;-1:-1:-1;27394:151:10;;;;;:::i;:::-;;:::i;2081:198:0:-;;;;;;;;;;-1:-1:-1;2081:198:0;;;;;:::i;:::-;;:::i;7110:217:10:-;;;;;;;;;;-1:-1:-1;7110:217:10;;;;;:::i;:::-;;:::i;16077:125::-;;;;;;;;;;-1:-1:-1;16077:125:10;;;;;:::i;:::-;;:::i;11114:244::-;;;;;;;;;;-1:-1:-1;11114:244:10;;;;;:::i;:::-;;:::i;32768:119::-;;;;;;;;;;-1:-1:-1;32768:119:10;;;;;:::i;:::-;;:::i;26902:351::-;1094:13:0;:11;:13::i;:::-;27026:18:10::1;:29:::0;;;::::1;::::0;::::1;;::::0;;;::::1;::::0;;;27065:14:::1;:21:::0;;;;-1:-1:-1;27096:22:10::1;:26:::0;27132:17:::1;:27:::0;27169:22:::1;:32:::0;27234:12:::1;27211:20;:35:::0;26902:351::o;2156:98:1:-;2210:13;2242:5;2235:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2156:98;:::o;11868:165:10:-;11950:4;11966:39;719:10:6;11989:7:10;11998:6;11966:8;:39::i;:::-;-1:-1:-1;12022:4:10;11868:165;;;;;:::o;22352:580::-;1094:13:0;:11;:13::i;:::-;22471:12:10::1;:43:::0;;;22524:27;:45;;;22579:23;:37;;;22627:8:::1;:39:::0;;;22676:23;:41;;;22727:19;:33;;;22771:15:::1;:46:::0;;;;22827:30;:48;22885:26;:40;22352:580::o;22969:433::-;1094:13:0;:11;:13::i;:::-;23089:9:10::1;:40:::0;;;23139:24;:42;;;23191:20;:34;;;23236:16:::1;:47:::0;;;;23293:31;:49;23354:27;:41;22969:433::o;8215:100::-;8275:7;2834:15;2779:1;2834:2;:15;:::i;:::-;2821:29;;:9;:29;:::i;:::-;8294:14;;8215:100;:::o;28806:316::-;28911:4;28927:36;28937:6;28945:9;28956:6;28927:9;:36::i;:::-;28973:121;28982:6;719:10:6;29004:89:10;29042:6;29004:89;;;;;;;;;;;;;;;;;:19;;;;;;;:11;:19;;;;;;;;719:10:6;29004:33:10;;;;;;;;;;:37;:89::i;:::-;28973:8;:121::i;:::-;-1:-1:-1;29111:4:10;28806:316;;;;;:::o;23527:440::-;1094:13:0;:11;:13::i;:::-;23617:26:10::1;::::0;::::1;23609:71;;;::::0;::::1;::::0;;8791:2:15;23609:71:10::1;::::0;::::1;8773:21:15::0;;;8810:18;;;8803:30;8869:34;8849:18;;;8842:62;8921:18;;23609:71:10::1;;;;;;;;;23690:31:::0;:46;;::::1;::::0;;::::1;::::0;;;::::1;::::0;::::1;::::0;;;23746:27;:42;;;::::1;::::0;::::1;::::0;;23798:28;:43;;;::::1;::::0;::::1;::::0;;23851:34;:49;;;::::1;::::0;::::1;::::0;;23910:35;:50;;;;::::1;;::::0;;23527:440::o;8943:149::-;8499:9;:18;;;;3386:42;8996:7;8499:18;;;;;8996:7;;9022:63;;:36;;2834:15;2779:1;2834:2;:15;:::i;:::-;2821:29;;:9;:29;:::i;:::-;9022:11;;:36::i;21997:319::-;1094:13:0;:11;:13::i;:::-;22090:23:10::1;::::0;::::1;22108:4;22090:23;::::0;::::1;::::0;:48:::1;;-1:-1:-1::0;22127:11:10::1;::::0;::::1;22117:21:::0;;::::1;22127:11:::0;::::1;22117:21;;22090:48;22082:57;;;::::0;::::1;;22149:22;::::0;::::1;;::::0;;;:14:::1;:22;::::0;;;;:31;;;::::1;::::0;::::1;::::0;::::1;::::0;;;::::1;::::0;;;22190:120:::1;;22214:20;22224:6;22232:1;22214:9;:20::i;:::-;21997:319:::0;;:::o;22190:120::-:1;22281:17;::::0;::::1;;::::0;;;:9:::1;:17;::::0;;;;;22263:36:::1;::::0;22273:6;;22263:9:::1;:36::i;12117:224::-:0;719:10:6;12214:4:10;12262:25;;;:11;:25;;;;;;;;;:34;;;;;;;;;;12214:4;;12230:83;;12253:7;;12262:50;;12301:10;12262:38;:50::i;10412:110::-;1094:13:0;:11;:13::i;:::-;10484:24:10::1;;;::::0;;;:15:::1;:24;::::0;;;;:31;;;::::1;10511:4;10484:31;::::0;;10412:110::o;27625:677::-;1094:13:0;:11;:13::i;:::-;27740::10::1;::::0;;::::1;::::0;;::::1;27758:5;27713:42:::0;;;:18:::1;:42;::::0;;;;;;;:50;;;;;::::1;::::0;;;27792:11:::1;::::0;;;::::1;27773:31:::0;;;;;;:39;;;;::::1;::::0;;27822;;;;::::1;::::0;;;::::1;::::0;::::1;::::0;;;27871:19;;;;::::1;::::0;::::1;::::0;;;::::1;::::0;;;27907:20;;;;;;;:18:::1;::::0;:20:::1;::::0;;::::1;::::0;27713:42;27907:20;;;;;;27822:39;27907:20:::1;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;27900:4;:27:::0;;::::1;::::0;;::::1;::::0;;;::::1;;::::0;;27965:13:::1;::::0;;;::::1;27900:4;27938:42:::0;;;:18:::1;:42;::::0;;;;;;;:49;;;;;::::1;27900:27:::0;27938:49;;::::1;::::0;;;28016:11:::1;::::0;;;::::1;27997:31:::0;;;;;:38;;;::::1;::::0;::::1;::::0;;28061:11;;;::::1;28046:27:::0;;:14:::1;:27:::0;;;;;:34;;;::::1;::::0;::::1;::::0;;28106:11;;;::::1;28091:27:::0;;:14:::1;:27:::0;;;;;:34;;;::::1;::::0;::::1;::::0;;28161:11;;;::::1;28145:28:::0;;:15:::1;:28:::0;;;;;:35;;;::::1;::::0;::::1;::::0;;28214:13;;;::::1;28190:39:::0;;;;;:46;;;;::::1;;::::0;;28258:11;;28247:8;;;;:22;;;::::1;28258:11:::0;;::::1;28247:22:::0;;;::::1;::::0;;28291:4;;28279:6:::1;:9:::0;;;;:16;;;;::::1;28291:4:::0;;;::::1;28279:16;::::0;;-1:-1:-1;;27625:677:10:o;15547:109::-;1094:13:0;:11;:13::i;:::-;15615:27:10::1;;;::::0;;;:18:::1;:27;::::0;;;;:34;;;::::1;15645:4;15615:34;::::0;;15547:109::o;33566:289::-;33729:33;;;33653:7;33729:33;;;:24;:33;;;;;33653:7;;;;33708:55;;33717:10;;33708:8;:55::i;:::-;33672:91;;;;33781:11;:67;;33825:15;;;;;;;:6;:15;;;;;;;;:22;8499:9;:18;;;;;;;33804:43;;;;:::i;:::-;33781:67;;;33795:5;33781:67;33774:74;33566:289;-1:-1:-1;;;;;33566:289:10:o;7398:256::-;1094:13:0;:11;:13::i;:::-;7487:30:10::1;::::0;::::1;;::::0;;;:13:::1;:30;::::0;;;;;::::1;;7479:120;;;::::0;::::1;::::0;;9538:2:15;7479:120:10::1;::::0;::::1;9520:21:15::0;9577:2;9557:18;;;9550:30;9616:34;9596:18;;;9589:62;9687:34;9667:18;;;9660:62;9759:14;9738:19;;;9731:43;9791:19;;7479:120:10::1;9336:480:15::0;7479:120:10::1;7609:30;;7642:5;7609:30:::0;;;:13:::1;:30;::::0;;;;:38;;;::::1;::::0;;7398:256::o;33429:109::-;33482:7;33508:23;:21;:23::i;8659:141::-;8774:18;;;8722:7;8774:18;;;:9;:18;;;;;;;;;8747:6;:15;;;;;:22;:46;;:26;:46::i;10692:125::-;1094:13:0;:11;:13::i;:::-;10778:26:10::1;::::0;;;::::1;;::::0;;;:17:::1;:26;::::0;;;;:32;;;::::1;::::0;::::1;;::::0;;;::::1;::::0;;10692:125::o;1831:101:0:-;1094:13;:11;:13::i;:::-;1895:30:::1;1922:1;1895:18;:30::i;:::-;1831:101::o:0;13321:309:10:-;13402:27;;;13380:7;13402:27;;;:18;:27;;;;;;;;13399:225;;;-1:-1:-1;13452:1:10;;13321:309;-1:-1:-1;13321:309:10:o;13399:225::-;13589:23;;13539:27;;13589:12;13491:26;:122;;13589:23;13491:76;;:26;:47;:76::i;:::-;:97;;:122::i;2367:102:1:-;2423:13;2455:7;2448:14;;;;;:::i;32949:136:10:-;33008:10;32994:25;;;;:13;:25;;;;;;;;32986:71;;;;;;;10023:2:15;32986:71:10;;;10005:21:15;10062:2;10042:18;;;10035:30;10101:34;10081:18;;;10074:62;10172:3;10152:18;;;10145:31;10193:19;;32986:71:10;9821:397:15;32986:71:10;33067:11;:9;:11::i;:::-;;32949:136::o;33861:230::-;33933:7;33953:16;33971:13;33988:43;33997:10;34009:21;33988:8;:43::i;:::-;33952:79;;;;34049:11;:35;;34071:13;:11;:13::i;:::-;34049:35;;;34063:5;34049:35;34042:42;33861:230;-1:-1:-1;;;;33861:230:10:o;23973:417::-;1094:13:0;:11;:13::i;:::-;24062:15:10::1;:39:::0;;::::1;::::0;;::::1;::::0;;;::::1;::::0;::::1;::::0;;24111:15:::1;:55:::0;;;;::::1;::::0;::::1;::::0;;;24062:15:::1;24177:36:::0;;;:15:::1;:36;::::0;;;;;;:43;;;;;::::1;24062:39:::0;24177:43;;::::1;::::0;;;24230:14:::1;:35:::0;;;;;:42;;;::::1;::::0;::::1;::::0;;24282:18:::1;:39:::0;;;;;:46;;;::::1;::::0;::::1;::::0;;24338:17:::1;:38:::0;;;;;;;:45;;;;::::1;;::::0;;23973:417::o;10944:113::-;1094:13:0;:11;:13::i;:::-;11020:28:10::1;::::0;:20:::1;::::0;::::1;::::0;:28;::::1;;;::::0;11041:6;;11020:28:::1;::::0;;;11041:6;11020:20;:28;::::1;;;;;;;;;;;;;::::0;::::1;;;;;;10944:113:::0;;:::o;12429:275::-;12531:4;12547:129;719:10:6;12570:7:10;12579:96;12618:15;12579:96;;;;;;;;;;;;;;;;;719:10:6;12579:25:10;;;;:11;:25;;;;;;;;;:34;;;;;;;;;;;;:38;:96::i;28528:171::-;28613:4;28629:42;719:10:6;28653:9:10;28664:6;28629:9;:42::i;9766:640::-;9849:13;;:23;;;;;;;;9831:15;;9849:13;;;:21;;:23;;;;;;;;;;;;;;:13;:23;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;9831:41;-1:-1:-1;9903:10:10;:21;;;;;:73;;-1:-1:-1;9962:13:10;;;;9940:10;:36;9903:73;:116;;;-1:-1:-1;9992:10:10;10014:4;9992:27;9903:116;9882:176;;;;;;;10425:2:15;9882:176:10;;;10407:21:15;10464:2;10444:18;;;10437:30;10503:18;10483;;;10476:46;10539:18;;9882:176:10;10223:340:15;9882:176:10;10073:27;10094:5;10073:20;:27::i;:::-;10069:331;;10116:25;;;;;;;;:18;:25;;;;;;;;:32;;10144:4;10116:32;;;;;;;;;10162:14;:21;;;;;:28;;;;;;;;10204:15;:22;;;;;:29;;;;;;;;10247:14;:21;;;;;:28;;;;;;;;;10296:11;;;10290:18;;:5;:18;;;;;:26;;;;;;;;;;;10337:11;;10330:19;;:6;:19;;;;;;:28;;;;;;;;;;;;;;;10373:16;;;;10144:4;;10373:16;:::i;:::-;;;;-1:-1:-1;;9821:585:10;9766:640;;:::o;13636:186::-;13791:23;;13745:27;;13791:12;13701:26;13675:7;;13701:114;;13791:23;;13701:72;;:43;:72::i;16935:4138::-;4449:11;4482:6;4478:103;4498:11;;4494:1;:15;4478:103;;;4533:8;;;;:5;:8;;;;;;4545:10;4533:22;:8;;;:22;4530:40;;4566:4;4557:13;;4530:40;4511:3;;;;:::i;:::-;;;;4478:103;;;-1:-1:-1;4633:13:10;;;;4611:10;:36;;:58;;;4663:6;4611:58;4590:122;;;;;;;10425:2:15;4590:122:10;;;10407:21:15;10464:2;10444:18;;;10437:30;10503:18;10483;;;10476:46;10539:18;;4590:122:10;10223:340:15;4590:122:10;17018:6:::1;17028:1;17018:11:::0;17015:4052:::1;;17045:15;14598:13:::0;14583:28;:12;:28;;;;;;;-1:-1:-1;14583:28:10;;;;;;;;;;;;;;;;;;14540:78;17015:4052:::1;17092:18;17113:21;17128:5;17113:14;:21::i;:::-;17092:42;;17164:11;;17151:10;:24;17148:3909;;;17216:50;::::0;;;;17240:10:::1;17216:50;::::0;::::1;11003:34:15::0;17260:4:10::1;11053:18:15::0;;;11046:43;17195:18:10::1;::::0;17216:23:::1;::::0;::::1;::::0;::::1;::::0;10915:18:15;;17216:50:10::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;17195:71;;17301:6;17287:10;:20;17284:3759;;17331:61;::::0;;;;17358:10:::1;17331:61;::::0;::::1;11552:34:15::0;17378:4:10::1;11602:18:15::0;;;11595:43;11654:18;;;11647:34;;;17331:26:10::1;::::0;::::1;::::0;::::1;::::0;11464:18:15;;17331:61:10::1;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1::0;17427:4:10::1;::::0;::::1;::::0;;::::1;17418:13:::0;;::::1;::::0;17415:3571:::1;;17459:16;17478:8;:6;:8::i;:::-;17459:27;;17512:28;17543:53;17587:8;17543:39;17554:12;:27;;;17543:6;:10;;:39;;;;:::i;:::-;:43:::0;::::1;:53::i;:::-;17512:84;;17622:27;17652:52;17695:8;17652:38;17663:12;:26;;;17652:6;:10;;:38;;;;:::i;:52::-;17622:82;;17730:24;17757:49;17797:8;17757:35;17768:12;:23;;;17757:6;:10;;:35;;;;:::i;:49::-;17856:15;::::0;;17833:60;;;;;:22:::1;17856:15:::0;;::::1;17833:60;::::0;::::1;12116:74:15::0;12206:18;;;12199:34;;;17730:76:10;;-1:-1:-1;17833:22:10;::::1;::::0;::::1;::::0;12089:18:15;;17833:60:10::1;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1::0;17923:15:10::1;::::0;:65:::1;::::0;;;;::::1;::::0;::::1;2844:25:15::0;;;17923:15:10::1;::::0;;::::1;::::0;:44:::1;::::0;2817:18:15;;17923:65:10::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;17919:81:::0;18065:4:::1;::::0;18050:46:::1;::::0;;;;18090:4:::1;18050:46;::::0;::::1;183:74:15::0;18026:21:10::1;::::0;18065:4:::1;;::::0;18050:31:::1;::::0;156:18:15;;18050:46:10::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;18026:70:::0;-1:-1:-1;18122:20:10::1;18145:42;:20:::0;18170:16;18145:24:::1;:42::i;:::-;18265:23:::0;;18233:27;;18122:65;;-1:-1:-1;18213:17:10::1;::::0;18233:56:::1;::::0;:31:::1;:56::i;:::-;18213:76;;18315:31;18326:12;18340:5;18315:10;:31::i;:::-;18405:4;::::0;18390:46:::1;::::0;;;;18430:4:::1;18390:46;::::0;::::1;183:74:15::0;18372:15:10::1;::::0;18390:65:::1;::::0;18441:13;;18405:4:::1;;::::0;18390:31:::1;::::0;156:18:15;;18390:46:10::1;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:65::-;18372:83;;18481:29;18513:55;18558:9;18513:40;18525:12;:27;;;18513:7;:11;;:40;;;;:::i;:55::-;18602:4;::::0;18617:31;;18595:77:::1;::::0;;;;18602:4:::1;18617:31:::0;;::::1;18595:77;::::0;::::1;12116:74:15::0;12206:18;;;12199:34;;;18481:87:10;;-1:-1:-1;18602:4:10::1;::::0;18595:21:::1;::::0;12089:18:15;;18595:77:10::1;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;17433:1263;;;;;;;;;17415:3571;;;18714:4;::::0;::::1;::::0;;::::1;18705:13:::0;;::::1;::::0;18702:2284:::1;;18837:16;18856:8;:6;:8::i;:::-;18837:27;;18890:28;18921:53;18965:8;18921:39;18932:12;:27;;;18921:6;:10;;:39;;;;:::i;:53::-;18890:84;;19000:27;19030:52;19073:8;19030:38;19041:12;:26;;;19030:6;:10;;:38;;;;:::i;:52::-;19148:4;::::0;19133:46:::1;::::0;;;;19173:4:::1;19133:46;::::0;::::1;183:74:15::0;19000:82:10;;-1:-1:-1;19109:21:10::1;::::0;19148:4:::1;::::0;;::::1;::::0;19133:31:::1;::::0;156:18:15;;19133:46:10::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;19109:70;;19205:38;19216:19;19237:5;19205:10;:38::i;:::-;19318:4;::::0;19303:46:::1;::::0;;;;19343:4:::1;19303:46;::::0;::::1;183:74:15::0;19269:31:10::1;::::0;19303:65:::1;::::0;19354:13;;19318:4:::1;;::::0;19303:31:::1;::::0;156:18:15;;19303:46:10::1;14:249:15::0;19303:65:10::1;19417:31:::0;;19394:77:::1;::::0;;;;:22:::1;19417:31:::0;;::::1;19394:77;::::0;::::1;12116:74:15::0;12206:18;;;12199:34;;;19269:99:10;;-1:-1:-1;19394:22:10;::::1;::::0;::::1;::::0;12089:18:15;;19394:77:10::1;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1::0;19505:4:10::1;::::0;19520:15:::1;::::0;;19498:63;;;;;19505:4:::1;19520:15:::0;;::::1;19498:63;::::0;::::1;12116:74:15::0;12206:18;;;12199:34;;;19505:4:10;::::1;::::0;19498:21:::1;::::0;12089:18:15;;19498:63:10::1;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1::0;19591:15:10::1;::::0;:69:::1;::::0;;;;::::1;::::0;::::1;2844:25:15::0;;;19591:15:10::1;::::0;;::::1;::::0;:44:::1;::::0;2817:18:15;;19591:69:10::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;19587:85:::0;18720:995:::1;;;;;18702:2284;;;19786:4;::::0;19771:46:::1;::::0;;;;19811:4:::1;19771:46;::::0;::::1;183:74:15::0;19747:21:10::1;::::0;19786:4:::1;;::::0;19771:31:::1;::::0;156:18:15;;19771:46:10::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;19747:70;;19843:25;19854:6;19862:5;19843:10;:25::i;:::-;19927:4;::::0;19912:46:::1;::::0;;;;19952:4:::1;19912:46;::::0;::::1;183:74:15::0;19894:15:10::1;::::0;19912:65:::1;::::0;19963:13;;19927:4:::1;;::::0;19912:31:::1;::::0;156:18:15;;19912:46:10::1;14:249:15::0;19912:65:10::1;19894:83;;20119:16;20138:8;:6;:8::i;:::-;20119:27;;20172:28;20203:54;20248:8;20203:40;20215:12;:27;;;20203:7;:11;;:40;;;;:::i;:54::-;20172:85;;20283:27;20313:53;20357:8;20313:39;20325:12;:26;;;20313:7;:11;;:39;;;;:::i;:53::-;20436:4;::::0;20421:46:::1;::::0;;;;20461:4:::1;20421:46;::::0;::::1;183:74:15::0;20283:83:10;;-1:-1:-1;20393:25:10::1;::::0;20436:4:::1;::::0;;::::1;::::0;20421:31:::1;::::0;156:18:15;;20421:46:10::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;20393:74;;20493:38;20504:19;20525:5;20493:10;:38::i;:::-;20606:4;::::0;20591:46:::1;::::0;;;;20631:4:::1;20591:46;::::0;::::1;183:74:15::0;20557:31:10::1;::::0;20591:69:::1;::::0;20642:17;;20606:4:::1;;::::0;20591:31:::1;::::0;156:18:15;;20591:46:10::1;14:249:15::0;20591:69:10::1;20694:4;::::0;20709:31;;20687:76:::1;::::0;;;;20694:4:::1;20709:31:::0;;::::1;20687:76;::::0;::::1;12116:74:15::0;12206:18;;;12199:34;;;20557:103:10;;-1:-1:-1;20694:4:10::1;::::0;20687:21:::1;::::0;12089:18:15;;20687:76:10::1;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1::0;20797:4:10::1;::::0;20812:15:::1;::::0;;20790:63;;;;;20797:4:::1;20812:15:::0;;::::1;20790:63;::::0;::::1;12116:74:15::0;12206:18;;;12199:34;;;20797:4:10;::::1;::::0;20790:21:::1;::::0;12089:18:15;;20790:63:10::1;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1::0;20883:15:10::1;::::0;:69:::1;::::0;;;;::::1;::::0;::::1;2844:25:15::0;;;20883:15:10::1;::::0;;::::1;::::0;:44:::1;::::0;2817:18:15;;20883:69:10::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;20879:85:::0;19721:1265:::1;;;;;;;18702:2284;21008:15;14598:13:::0;14583:28;:12;:28;;;;;;;-1:-1:-1;14583:28:10;;;;;;;;;;;;;;;;;;14540:78;21008:15:::1;17177:3880;17148:3909;17078:3989;4439:291:::0;16935:4138;;:::o;15871:156::-;1094:13:0;:11;:13::i;:::-;15962:58:10::1;16005:5;15962:25;15974:12:::0;2834:15:::1;2779:1;2834:2;:15;:::i;:::-;2821:29;::::0;:9:::1;:29;:::i;:::-;15962:11:::0;::::1;:25::i;:58::-;15947:12;:73:::0;-1:-1:-1;15871:156:10:o;10528:114::-;1094:13:0;:11;:13::i;:::-;10603:24:10::1;;10630:5;10603:24:::0;;;:15:::1;:24;::::0;;;;:32;;;::::1;::::0;;10528:114::o;15712:108::-;1094:13:0;:11;:13::i;:::-;15778:27:10::1;;15808:5;15778:27:::0;;;:18:::1;:27;::::0;;;;:35;;;::::1;::::0;;15712:108::o;26566:267::-;1094:13:0;:11;:13::i;:::-;26673:4:10::1;::::0;26666:37:::1;::::0;;;;26697:4:::1;26666:37;::::0;::::1;183:74:15::0;26640:23:10::1;::::0;26673:4:::1;;::::0;26666:22:::1;::::0;156:18:15;;26666:37:10::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;26640:63;;26732:15;26721:7;:26;;26713:71;;;::::0;::::1;::::0;;12446:2:15;26713:71:10::1;::::0;::::1;12428:21:15::0;12485:2;12465:18;;;12458:30;12524:33;12504:18;;;12497:61;12575:18;;26713:71:10::1;12244:355:15::0;26713:71:10::1;26794:32;26804:7;3386:42;26794:9;:32::i;27394:151::-:0;1094:13:0;:11;:13::i;:::-;27518:20:10;2834:15:::1;2779:1;2834:2;:15;:::i;:::-;2821:29;::::0;:9:::1;:29;:::i;:::-;27508:30;;;;:::i;:::-;27482:23;:56:::0;-1:-1:-1;27394:151:10:o;2081:198:0:-;1094:13;:11;:13::i;:::-;2169:22:::1;::::0;::::1;2161:73;;;::::0;::::1;::::0;;13085:2:15;2161:73:0::1;::::0;::::1;13067:21:15::0;13124:2;13104:18;;;13097:30;13163:34;13143:18;;;13136:62;13234:8;13214:18;;;13207:36;13260:19;;2161:73:0::1;12883:402:15::0;2161:73:0::1;2244:28;2263:8;2244:18;:28::i;7110:217:10:-:0;1094:13:0;:11;:13::i;:::-;7200:33:10::1;::::0;::::1;;::::0;;;:13:::1;:33;::::0;;;;;::::1;;7199:34;7191:79;;;::::0;::::1;::::0;;13492:2:15;7191:79:10::1;::::0;::::1;13474:21:15::0;13531:2;13511:18;;;13504:30;13570:33;13550:18;;;13543:61;13621:18;;7191:79:10::1;13290:355:15::0;7191:79:10::1;7280:33;;;::::0;;;:13:::1;:33;::::0;;;;:40;;;::::1;7316:4;7280:40;::::0;;7110:217::o;16077:125::-;1094:13:0;:11;:13::i;:::-;16163:23:10::1;::::0;;;::::1;;::::0;;;:15:::1;:23;::::0;;;;:32;;;::::1;::::0;::::1;;::::0;;;::::1;::::0;;16077:125::o;11114:244::-;1094:13:0;:11;:13::i;:::-;11210:30:10::1;::::0;;;;11234:4:::1;11210:30;::::0;::::1;183:74:15::0;11243:6:10;;11210:15:::1;::::0;::::1;::::0;::::1;::::0;156:18:15;;11210:30:10::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:39;11206:110;;;11275:30;::::0;;;;11299:4:::1;11275:30;::::0;::::1;183:74:15::0;11275:15:10::1;::::0;::::1;::::0;::::1;::::0;156:18:15;;11275:30:10::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;11266:39;;11206:110;11325:26;::::0;;;;:14:::1;12134:55:15::0;;;11325:26:10::1;::::0;::::1;12116:74:15::0;12206:18;;;12199:34;;;11325:14:10;::::1;::::0;::::1;::::0;12089:18:15;;11325:26:10::1;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;32768:119::-:0;1094:13:0;:11;:13::i;:::-;32851:22:10::1;::::0;;;::::1;;::::0;;;:13:::1;:22;::::0;;;;:29;;;::::1;::::0;::::1;;::::0;;;::::1;::::0;;32768:119::o;1359:130:0:-;1273:6;;1422:23;1273:6;719:10:6;1422:23:0;1414:68;;;;;;;13852:2:15;1414:68:0;;;13834:21:15;;;13871:18;;;13864:30;13930:34;13910:18;;;13903:62;13982:18;;1414:68:0;13650:356:15;12846:371:10;12978:19;;;12970:68;;;;;;;14213:2:15;12970:68:10;;;14195:21:15;14252:2;14232:18;;;14225:30;14291:34;14271:18;;;14264:62;14362:6;14342:18;;;14335:34;14386:19;;12970:68:10;14011:400:15;12970:68:10;13056:21;;;13048:68;;;;;;;14618:2:15;13048:68:10;;;14600:21:15;14657:2;14637:18;;;14630:30;14696:34;14676:18;;;14669:62;14767:4;14747:18;;;14740:32;14789:19;;13048:68:10;14416:398:15;13048:68:10;13127:18;;;;;;;;:11;:18;;;;;;;;:27;;;;;;;;;;;;;:36;;;13178:32;;2844:25:15;;;13178:32:10;;2817:18:15;13178:32:10;;;;;;;12846:371;;;:::o;29127:1007::-;29254:18;;;29246:68;;;;;;;15021:2:15;29246:68:10;;;15003:21:15;15060:2;15040:18;;;15033:30;15099:34;15079:18;;;15072:62;15170:7;15150:18;;;15143:35;15195:19;;29246:68:10;14819:401:15;29246:68:10;29332:16;;;29324:64;;;;;;;15427:2:15;29324:64:10;;;15409:21:15;15466:2;15446:18;;;15439:30;15505:34;15485:18;;;15478:62;15576:5;15556:18;;;15549:33;15599:19;;29324:64:10;15225:399:15;29324:64:10;29415:1;29406:6;:10;29398:64;;;;;;;15831:2:15;29398:64:10;;;15813:21:15;15870:2;15850:18;;;15843:30;15909:34;15889:18;;;15882:62;15980:11;15960:18;;;15953:39;16009:19;;29398:64:10;15629:405:15;29398:64:10;29481:17;;;;;;;:13;:17;;;;;;;;29480:18;29472:27;;;;;;29509:38;29530:4;29536:2;29540:6;29509:20;:38::i;:::-;29566:26;29579:4;29585:6;29566:12;:26::i;:::-;29607:25;29625:6;29607:17;:25::i;:::-;29603:76;;;29648:20;:18;:20::i;:::-;29780:18;;;29750:13;29780:18;;;:14;:18;;;;;;;;:52;;;;-1:-1:-1;29818:13:10;;;29802:30;;;29818:13;;29802:30;;29780:52;:80;;;;-1:-1:-1;15247:27:10;;;15224:4;15247:27;;;:18;:27;;;;;;;;29836:24;29780:80;29777:255;;;-1:-1:-1;29886:1:10;29777:255;;;29907:21;;;;;;;:15;:21;;;;;;;;29904:128;;;-1:-1:-1;29954:1:10;29904:128;;;29975:19;;;;;;;:15;:19;;;;;;;;29972:60;;;-1:-1:-1;30020:1:10;29972:60;30086:41;30101:4;30107:2;30111:6;30119:7;30086:14;:41::i;4959:231:9:-;5075:7;5134:12;5126:6;;;;5118:29;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;;;5168:5:9;;;4959:231::o;3122:96::-;3180:7;3206:5;3210:1;3206;:5;:::i;:::-;3199:12;3122:96;-1:-1:-1;;;3122:96:9:o;24478:372:10:-;24561:1;24552:6;:10;:40;;;;-1:-1:-1;24566:14:10;;;;;;;:6;:14;;;;;:21;:26;24552:40;24549:180;;;24934:7;:14;;24910:21;;;;;;;:13;:21;;;;;:38;;;24958:20;;;;;;;;;;;;;;;;;;;;24549:180;;;24643:11;;:40;;;;-1:-1:-1;24658:14:10;;;24682:1;24658:14;;;:6;:14;;;;;:21;:25;;24643:40;24640:89;;;24698:20;24711:6;24698:12;:20::i;:::-;24769:14;;;;;;;:6;:14;;;;;:21;24753:11;;:50;;24796:6;;24753:38;;:15;:38::i;:50::-;24739:11;:64;24813:14;;;;;;;;:6;:14;;;;;:30;24478:372::o;2755:96:9:-;2813:7;2839:5;2843:1;2839;:5;:::i;34097:482:10:-;34186:4;34192:7;34232:1;34219:10;:14;34211:49;;;;;;;16374:2:15;34211:49:10;;;16356:21:15;16413:2;16393:18;;;16386:30;16452:24;16432:18;;;16425:52;16494:18;;34211:49:10;16172:346:15;34211:49:10;34292:23;:21;:23::i;:::-;34278:10;:37;;34270:79;;;;;;;16725:2:15;34270:79:10;;;16707:21:15;16764:2;16744:18;;;16737:30;16803:31;16783:18;;;16776:59;16852:18;;34270:79:10;16523:353:15;34270:79:10;34360:13;34376:40;:9;34405:10;34376:28;:40::i;:::-;34440:20;;34360:56;;-1:-1:-1;34431:29:10;;34427:146;;34484:5;34491:1;34476:17;;;;;;;34427:146;34532:4;34538:9;:16;;34555:5;34538:23;;;;;;;;:::i;:::-;;;;;;;;;34524:38;;;;;;;34427:146;34201:378;34097:482;;;;;;:::o;33306:117::-;33362:7;33388:28;:18;918:14:7;;827:112;2433:187:0;2525:6;;;;2541:17;;;;;;;;;;;2573:40;;2525:6;;;2541:17;2525:6;;2573:40;;2506:16;;2573:40;2496:124;2433:187;:::o;33091:209:10:-;33130:7;33149:30;:18;1032:19:7;;1050:1;1032:19;;;945:123;33149:30:10;33190:17;33210:23;:21;:23::i;:::-;33190:43;;33248:19;33257:9;33248:19;;;;2844:25:15;;2832:2;2817:18;;2698:177;33248:19:10;;;;;;;;33284:9;33091:209;-1:-1:-1;33091:209:10:o;9519:241::-;9587:4;;;9632:98;9652:11;;9648:1;:15;9632:98;;;9687:8;;;;:5;:8;;;;;;:17;;;;:8;;:17;9684:35;;9715:4;9706:13;;9684:35;9665:3;;;;:::i;:::-;;;;9632:98;;;-1:-1:-1;9747:6:10;9519:241;-1:-1:-1;;9519:241:10:o;9218:251::-;9281:7;9300:13;9316:11;;9330:1;9316:15;;;;:::i;:::-;9300:31;;9345:9;9341:99;9364:11;;9360:1;:15;9341:99;;;9399:9;;;;:6;:9;;;;;;:19;;;;:9;;:19;9396:33;;9428:1;9420:9;;9396:33;9377:3;;;;:::i;:::-;;;;9341:99;;3465:96:9;3523:7;3549:5;3553:1;3549;:5;:::i;3850:96::-;3908:7;3934:5;3938:1;3934;:5;:::i;21511:426:10:-;21605:16;;;21619:1;21605:16;;;;;;;;21581:21;;21605:16;;;;;;;;;;-1:-1:-1;21605:16:10;21581:40;;21641:5;21631:4;21636:1;21631:7;;;;;;;;:::i;:::-;:15;;;;:7;;;;;;;;;:15;21666:4;;21656:7;;21666:4;;;21656;;21666;;21656:7;;;;;;:::i;:::-;:14;;;;:7;;;;;;;;;:14;21711:13;;21681:53;;;;;21711:13;;;21681:53;;;12116:74:15;12206:18;;;12199:34;;;21681:21:10;;;;;;12089:18:15;;21681:53:10;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;21744:13:10;;:186;;;;;:13;;;;;:67;;:186;;21825:6;;21744:13;;21860:4;;21886;;21905:15;;21744:186;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;21571:366;21511:426;;:::o;21079:::-;21173:16;;;21187:1;21173:16;;;;;;;;21149:21;;21173:16;;;;;;;;;;-1:-1:-1;21173:16:10;21149:40;;21209:5;21199:4;21204:1;21199:7;;;;;;;;:::i;:::-;:15;;;;:7;;;;;;;;;:15;21234:4;;21224:7;;21234:4;;;21224;;21234;;21224:7;;;;;;:::i;26133:427::-;4375:6;:13;;;;4384:4;4375:13;;;26232:16:::1;::::0;;26246:1:::1;26232:16:::0;;;;;::::1;::::0;;-1:-1:-1;;26232:16:10::1;::::0;::::1;::::0;;::::1;::::0;::::1;-1:-1:-1::0;;26268:4:10::1;::::0;26258:7;;;;-1:-1:-1;26268:4:10::1;;::::0;26258:7;;-1:-1:-1;26268:4:10::1;::::0;26258:7:::1;;;;:::i;:::-;;;;;;:14;;;;;;;;;::::0;::::1;26300:4;26282;26287:1;26282:7;;;;;;;;:::i;:::-;:23;::::0;;::::1;:7;::::0;;::::1;::::0;;;;;:23;26323:4:::1;::::0;26345:13:::1;::::0;26316:52:::1;::::0;;;;26345:13;;::::1;26316:52;::::0;::::1;12116:74:15::0;12206:18;;;12199:34;;;26323:4:10;::::1;::::0;26316:20:::1;::::0;12089:18:15;;26316:52:10::1;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1::0;26378:13:10::1;::::0;:175:::1;::::0;;;;:13:::1;::::0;;::::1;::::0;:67:::1;::::0;:175:::1;::::0;26459:6;;26378:13:::1;::::0;26494:4;;26512:2;;26528:15:::1;::::0;26378:175:::1;;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;-1:-1:-1::0;;4393:6:10;:14;;;;;;-1:-1:-1;;;;;26133:427:10:o;34585:831::-;34774:18;;;34770:640;;34828:26;34851:2;34828:22;:26::i;:::-;34868:28;:26;:28::i;34770:640::-;34917:16;;;34913:497;;34969:28;34992:4;34969:22;:28::i;34913:497::-;35060:21;;;;;;;:17;:21;;;;;;;;35056:354;;;35129:28;35152:4;35129:22;:28::i;35056:354::-;35178:23;;;;;;;:17;:23;;;;;;;;35174:236;;;35250:26;35273:2;35250:22;:26::i;35174:236::-;35331:28;35354:4;35331:22;:28::i;:::-;35373:26;35396:2;35373:22;:26::i;16245:164::-;16341:12;;16331:6;:22;;:49;;;-1:-1:-1;16357:23:10;;;;;;;:15;:23;;;;;;;;16331:49;16323:79;;;;;;;18492:2:15;16323:79:10;;;18474:21:15;18531:2;18511:18;;;18504:30;18570:19;18550:18;;;18543:47;18607:18;;16323:79:10;18290:341:15;25346:403:10;25449:11;;25412:4;;25449:11;;25435:10;:25;;;;:44;;-1:-1:-1;25473:6:10;;;;25472:7;25435:44;:74;;;;-1:-1:-1;25491:18:10;;;;25435:74;:147;;;;;25570:12;25544:22;;25521:20;;:45;;;;:::i;:::-;:61;;25435:147;:262;;;;-1:-1:-1;25680:17:10;;25645:4;;25630:46;;;;;25670:4;25630:46;;;183:74:15;25645:4:10;;;;;25630:31;;156:18:15;;25630:46:10;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:67;;25435:262;:307;;;;-1:-1:-1;;25719:23:10;;-1:-1:-1;25709:33:10;;25346:403::o;25785:306::-;25834:42;25844:17;;3386:42;25834:9;:42::i;:::-;25909:12;25886:20;:35;25983:17;;25956:22;;:45;;:26;:45::i;:::-;25931:22;:70;;;26039:14;;-1:-1:-1;26011:74:10;;;26056:18;:26;;;;;;25785:306::o;30140:1638::-;30251:12;;;;;:28;;;30267:7;:12;;30278:1;30267:12;30251:28;30248:1524;;;14706:12;14690:28;;:13;:28;;;;;;;;;;;;;;;;;;;;;;;;;;;;;14743:10;14728:25;;;;;;;;;;;;;;;;;;;;;;;;;;;30344:53;;;;;;;;;;;;;;;;;;;;:17;;;-1:-1:-1;30344:17:10;;;:9;:17;;;;;;;;:53;;30366:6;;30344:21;:53::i;:::-;30324:17;;;;;;;;:9;:17;;;;;;:73;;;;30434:20;;;;;;;:32;;30459:6;30434:24;:32::i;:::-;30411:20;;;;;;;:9;:20;;;;;;;;:55;;;;30484:17;:28;;;;;;30481:172;;;30556:14;;;30533:20;30556:14;;;:6;:14;;;;;:21;:33;;30582:6;30556:25;:33::i;:::-;30533:56;;30607:31;30617:6;30625:12;30607:9;:31::i;:::-;30514:139;30481:172;30670:25;;;;;;;:17;:25;;;;;;;;30667:174;;;30738:17;;;30715:20;30738:17;;;:6;:17;;;;;:24;:36;;30767:6;30738:28;:36::i;:::-;30715:59;;30792:34;30802:9;30813:12;30792:9;:34::i;:::-;30697:144;30667:174;30877:9;30860:35;;30869:6;30860:35;;;30888:6;30860:35;;;;2844:25:15;;2832:2;2817:18;;2698:177;30860:35:10;;;;;;;;30913:7;:12;;30924:1;30913:12;30910:133;;30945:15;14598:13;14583:28;:12;:28;;;;;;;-1:-1:-1;14583:28:10;;;;;;;;;;;;;;;;;;14540:78;30945:15;30248:1524;;30910:133;30984:7;:12;;30995:1;30984:12;30981:62;;31016:12;14821:9;14806:24;:12;:24;;;;;;;;;;;;;;;;;;;;;;;;;;14766:71;30248:1524;31076:7;:12;;31087:1;31076:12;31073:143;;14905:12;14889:28;;:13;:28;;;;;;;;;;;;;;;;;;;;;;;;;;;;;14942:15;14927:30;;;;;;;;;;;;;;;;;;;;;;;;;;;31073:143;;;31150:7;:12;;31161:1;31150:12;31147:69;;15033:12;15017:28;;:13;:28;;;;;;;;;;;;;;;;;;;;;;;;;;;;;15070:16;15055:31;;;;;;;;;;;;;;;;;;;;;;;;;;;31182:19;31230:24;31257:18;31268:6;31257:10;:18::i;:::-;31230:45;;31309:53;31331:6;31309:53;;;;;;;;;;;;;;;;;:9;:17;31319:6;31309:17;;;;;;;;;;;;;;;;:21;;:53;;;;;:::i;:::-;31289:17;;;;;;;;:9;:17;;;;;;:73;;;;31424:22;;31399:20;;;;;;;;;;:48;;:24;:48::i;:::-;31376:20;;;;;;;:9;:20;;;;;:71;31461:18;31471:7;31461:9;:18::i;:::-;31494:15;14598:13;14583:28;:12;:28;;;;;;;-1:-1:-1;14583:28:10;;;;;;;;;;;;;;;;;;14540:78;31494:15;31546:9;31529:51;;31538:6;31529:51;;;31557:7;:22;;;31529:51;;;;2844:25:15;;2832:2;2817:18;;2698:177;31529:51:10;;;;;;;;31616:31;;31673:18;;;;31649:19;;;;31616:31;;;;;31599:94;;;;;31649:43;;:23;:43::i;:::-;31599:94;;2844:25:15;;;2832:2;2817:18;31599:94:10;;;;;;;3386:42;31712:47;;31721:6;31712:47;;;31743:7;:15;;;31712:47;;;;2844:25:15;;2832:2;2817:18;;2698:177;31712:47:10;;;;;;;;31059:713;30140:1638;;;;:::o;24991:219::-;25081:7;25089:14;;:16;;25104:1;;25089:16;:::i;:::-;25081:25;;;;;;;;:::i;:::-;;;;;;;;;;;;;;25056:21;;;;;:13;:21;;;;;;;;25048:7;:30;;25081:25;;;;;25048:7;:30;;;;;;:::i;:::-;;;;;;;;;;;;;:58;;;;;;;;;;;25159:21;;;;;:13;:21;;;;;;;;25130:7;25138:14;;25159:21;;:13;25048:30;25138:16;;-1:-1:-1;;25138:16:10;:::i;:::-;25130:25;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;25116:40;;;;;;;;;;;;:64;25190:7;:13;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;24991:219:10:o;634:892:5:-;746:12;;723:7;;746:17;;742:56;;-1:-1:-1;786:1:5;779:8;;742:56;848:12;;808:11;;871:414;884:4;878:3;:10;871:414;;;904:11;918:23;931:3;936:4;918:12;:23::i;:::-;904:37;;1171:7;1158:5;1164:3;1158:10;;;;;;;;:::i;:::-;;;;;;;;;:20;1154:121;;;1205:3;1198:10;;1154:121;;;1253:7;:3;1259:1;1253:7;:::i;:::-;1247:13;;1154:121;890:395;871:414;;;1408:1;1402:3;:7;:36;;;;-1:-1:-1;1431:7:5;1413:5;1419:7;1425:1;1419:3;:7;:::i;:::-;1413:14;;;;;;;;:::i;:::-;;;;;;;;;:25;1402:36;1398:122;;;1461:7;1467:1;1461:3;:7;:::i;:::-;1454:14;;;;;;1398:122;-1:-1:-1;1506:3:5;-1:-1:-1;1499:10:5;;35453:171:10;35536:33;;;;;;;:24;:33;;;;;;;;35593:6;:15;;;;;:22;8499:9;:18;;;;;;35520:97;;35536:33;35572:43;;;:::i;:::-;35520:15;:97::i;35630:116::-;35686:53;35702:21;35725:13;:11;:13::i;16451:473::-;16510:16;-1:-1:-1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;16510:16:10;16538:23;16564:221;;;;;;;;16587:1;16564:221;;;;16602:49;16615:7;16624:12;:26;;;16602:12;:49::i;:::-;16564:221;;;;16665:50;16678:7;16687:12;:27;;;16665:12;:50::i;:::-;16564:221;;;;16729:46;16742:7;16751:12;:23;;;16729:12;:46::i;:::-;16564:221;;;16538:247;;16820:74;16879:6;:14;;;16820:54;16855:6;:18;;;16820:30;16832:6;:17;;;16820:7;:11;;:30;;;;:::i;:74::-;16796:98;;:6;16451:473;-1:-1:-1;;16451:473:10:o;13846:201::-;13908:84;13917:41;13940:6;:17;;;13917:6;:18;;;:22;;:41;;;;:::i;:::-;13960:31;;;;13908:8;:84::i;:::-;14002:38;14011:6;:14;;;3386:42;14002:8;:38::i;806:153:8:-;868:7;941:11;951:1;942:5;;;941:11;:::i;:::-;931:21;;932:5;;;931:21;:::i;35752:304:10:-;35846:17;35866:23;:21;:23::i;:::-;35846:43;-1:-1:-1;35846:43:10;35903:30;35919:9;35903:15;:30::i;:::-;:42;35899:151;;;35961:29;;;;;;;;-1:-1:-1;35961:29:10;;;;;;;;;;;;;;36004:16;;;:35;;;;;;;;;;;;;;;35752:304::o;14319:190::-;14394:7;14416:4;14424:1;14416:9;14413:22;;-1:-1:-1;14434:1:10;14427:8;;14413:22;14452:50;14487:5;14452:17;:7;14464:4;14452:11;:17::i;14074:213::-;14149:23;;;14146:35;;14074:213;;:::o;14146:35::-;14193:7;14204:1;14193:12;14190:24;;14074:213;;:::o;14190:24::-;14247:20;;;;;;;:9;:20;;;;;;:33;;14272:7;14247:24;:33::i;:::-;14224:20;;;;;;;;:9;:20;;;;;:56;-1:-1:-1;14074:213:10:o;36062:206::-;36155:10;;36132:7;;36155:15;;36151:111;;-1:-1:-1;36193:1:10;;36062:206;-1:-1:-1;36062:206:10:o;36151:111::-;36236:10;;36232:3;;36236:14;;36249:1;;36236:14;:::i;:::-;36232:19;;;;;;;;:::i;:::-;;;;;;;;;36225:26;;36062:206;;;:::o;268:118:15:-;354:5;347:13;340:21;333:5;330:32;320:60;;376:1;373;366:12;391:446;474:6;482;490;498;551:3;539:9;530:7;526:23;522:33;519:53;;;568:1;565;558:12;519:53;607:9;594:23;626:28;648:5;626:28;:::i;:::-;673:5;725:2;710:18;;697:32;;-1:-1:-1;776:2:15;761:18;;748:32;;827:2;812:18;799:32;;-1:-1:-1;391:446:15;-1:-1:-1;;;391:446:15:o;842:154::-;928:42;921:5;917:54;910:5;907:65;897:93;;986:1;983;976:12;1001:247;1060:6;1113:2;1101:9;1092:7;1088:23;1084:32;1081:52;;;1129:1;1126;1119:12;1081:52;1168:9;1155:23;1187:31;1212:5;1187:31;:::i;1445:607::-;1557:4;1586:2;1615;1604:9;1597:21;1647:6;1641:13;1690:6;1685:2;1674:9;1670:18;1663:34;1715:1;1725:140;1739:6;1736:1;1733:13;1725:140;;;1834:14;;;1830:23;;1824:30;1800:17;;;1819:2;1796:26;1789:66;1754:10;;1725:140;;;1729:3;1914:1;1909:2;1900:6;1889:9;1885:22;1881:31;1874:42;2043:2;1973:66;1968:2;1960:6;1956:15;1952:88;1941:9;1937:104;1933:113;1925:121;;;;1445:607;;;;:::o;2057:315::-;2125:6;2133;2186:2;2174:9;2165:7;2161:23;2157:32;2154:52;;;2202:1;2199;2192:12;2154:52;2241:9;2228:23;2260:31;2285:5;2260:31;:::i;:::-;2310:5;2362:2;2347:18;;;;2334:32;;-1:-1:-1;;;2057:315:15:o;2377:316::-;2454:6;2462;2470;2523:2;2511:9;2502:7;2498:23;2494:32;2491:52;;;2539:1;2536;2529:12;2491:52;-1:-1:-1;;2562:23:15;;;2632:2;2617:18;;2604:32;;-1:-1:-1;2683:2:15;2668:18;;;2655:32;;2377:316;-1:-1:-1;2377:316:15:o;2880:456::-;2957:6;2965;2973;3026:2;3014:9;3005:7;3001:23;2997:32;2994:52;;;3042:1;3039;3032:12;2994:52;3081:9;3068:23;3100:31;3125:5;3100:31;:::i;:::-;3150:5;-1:-1:-1;3207:2:15;3192:18;;3179:32;3220:33;3179:32;3220:33;:::i;:::-;2880:456;;3272:7;;-1:-1:-1;;;3326:2:15;3311:18;;;;3298:32;;2880:456::o;3530:382::-;3595:6;3603;3656:2;3644:9;3635:7;3631:23;3627:32;3624:52;;;3672:1;3669;3662:12;3624:52;3711:9;3698:23;3730:31;3755:5;3730:31;:::i;:::-;3780:5;-1:-1:-1;3837:2:15;3822:18;;3809:32;3850:30;3809:32;3850:30;:::i;:::-;3899:7;3889:17;;;3530:382;;;;;:::o;3917:388::-;3985:6;3993;4046:2;4034:9;4025:7;4021:23;4017:32;4014:52;;;4062:1;4059;4052:12;4014:52;4101:9;4088:23;4120:31;4145:5;4120:31;:::i;:::-;4170:5;-1:-1:-1;4227:2:15;4212:18;;4199:32;4240:33;4199:32;4240:33;:::i;4541:180::-;4600:6;4653:2;4641:9;4632:7;4628:23;4624:32;4621:52;;;4669:1;4666;4659:12;4621:52;-1:-1:-1;4692:23:15;;4541:180;-1:-1:-1;4541:180:15:o;4726:315::-;4794:6;4802;4855:2;4843:9;4834:7;4830:23;4826:32;4823:52;;;4871:1;4868;4861:12;4823:52;4907:9;4894:23;4884:33;;4967:2;4956:9;4952:18;4939:32;4980:31;5005:5;4980:31;:::i;5747:470::-;5838:6;5846;5854;5907:2;5895:9;5886:7;5882:23;5878:32;5875:52;;;5923:1;5920;5913:12;5875:52;5962:9;5949:23;5981:31;6006:5;5981:31;:::i;:::-;6031:5;-1:-1:-1;6083:2:15;6068:18;;6055:32;;-1:-1:-1;6139:2:15;6124:18;;6111:32;6152:33;6111:32;6152:33;:::i;:::-;6204:7;6194:17;;;5747:470;;;;;:::o;6222:437::-;6301:1;6297:12;;;;6344;;;6365:61;;6419:4;6411:6;6407:17;6397:27;;6365:61;6472:2;6464:6;6461:14;6441:18;6438:38;6435:218;;6509:77;6506:1;6499:88;6610:4;6607:1;6600:15;6638:4;6635:1;6628:15;6435:218;;6222:437;;;:::o;6664:184::-;6716:77;6713:1;6706:88;6813:4;6810:1;6803:15;6837:4;6834:1;6827:15;6853:482;6942:1;6985:5;6942:1;6999:330;7020:7;7010:8;7007:21;6999:330;;;7139:4;7071:66;7067:77;7061:4;7058:87;7055:113;;;7148:18;;:::i;:::-;7198:7;7188:8;7184:22;7181:55;;;7218:16;;;;7181:55;7297:22;;;;7257:15;;;;6999:330;;7340:866;7389:5;7419:8;7409:80;;-1:-1:-1;7460:1:15;7474:5;;7409:80;7508:4;7498:76;;-1:-1:-1;7545:1:15;7559:5;;7498:76;7590:4;7608:1;7603:59;;;;7676:1;7671:130;;;;7583:218;;7603:59;7633:1;7624:10;;7647:5;;;7671:130;7708:3;7698:8;7695:17;7692:43;;;7715:18;;:::i;:::-;-1:-1:-1;;7771:1:15;7757:16;;7786:5;;7583:218;;7885:2;7875:8;7872:16;7866:3;7860:4;7857:13;7853:36;7847:2;7837:8;7834:16;7829:2;7823:4;7820:12;7816:35;7813:77;7810:159;;;-1:-1:-1;7922:19:15;;;7954:5;;7810:159;8001:34;8026:8;8020:4;8001:34;:::i;:::-;8131:6;8063:66;8059:79;8050:7;8047:92;8044:118;;;8142:18;;:::i;:::-;8180:20;;7340:866;-1:-1:-1;;;7340:866:15:o;8211:140::-;8269:5;8298:47;8339:4;8329:8;8325:19;8319:4;8298:47;:::i;8356:228::-;8396:7;8522:1;8454:66;8450:74;8447:1;8444:81;8439:1;8432:9;8425:17;8421:105;8418:131;;;8529:18;;:::i;:::-;-1:-1:-1;8569:9:15;;8356:228::o;8950:251::-;9020:6;9073:2;9061:9;9052:7;9048:23;9044:32;9041:52;;;9089:1;9086;9079:12;9041:52;9121:9;9115:16;9140:31;9165:5;9140:31;:::i;9206:125::-;9271:9;;;9292:10;;;9289:36;;;9305:18;;:::i;10568:195::-;10607:3;10638:66;10631:5;10628:77;10625:103;;10708:18;;:::i;:::-;-1:-1:-1;10755:1:15;10744:13;;10568:195::o;11100:184::-;11170:6;11223:2;11211:9;11202:7;11198:23;11194:32;11191:52;;;11239:1;11236;11229:12;11191:52;-1:-1:-1;11262:16:15;;11100:184;-1:-1:-1;11100:184:15:o;11692:245::-;11759:6;11812:2;11800:9;11791:7;11787:23;11783:32;11780:52;;;11828:1;11825;11818:12;11780:52;11860:9;11854:16;11879:28;11901:5;11879:28;:::i;12604:274::-;12644:1;12670;12660:189;;12705:77;12702:1;12695:88;12806:4;12803:1;12796:15;12834:4;12831:1;12824:15;12660:189;-1:-1:-1;12863:9:15;;12604:274::o;16039:128::-;16106:9;;;16127:11;;;16124:37;;;16141:18;;:::i;16881:184::-;16933:77;16930:1;16923:88;17030:4;17027:1;17020:15;17054:4;17051:1;17044:15;17259:1026;17521:4;17569:3;17558:9;17554:19;17600:6;17589:9;17582:25;17626:2;17664:6;17659:2;17648:9;17644:18;17637:34;17707:3;17702:2;17691:9;17687:18;17680:31;17731:6;17766;17760:13;17797:6;17789;17782:22;17835:3;17824:9;17820:19;17813:26;;17874:2;17866:6;17862:15;17848:29;;17895:1;17905:218;17919:6;17916:1;17913:13;17905:218;;;17984:13;;17999:42;17980:62;17968:75;;18098:15;;;;18063:12;;;;17941:1;17934:9;17905:218;;;-1:-1:-1;;18191:42:15;18179:55;;;;18174:2;18159:18;;18152:83;-1:-1:-1;;;18266:3:15;18251:19;18244:35;18140:3;17259:1026;-1:-1:-1;;;17259:1026:15:o;18636:184::-;18688:77;18685:1;18678:88;18785:4;18782:1;18775:15;18809:4;18806:1;18799:15
Swarm Source
ipfs://0ff6962b1635d38507a8eb61479f89eaa32ca8318f10727426d59f9a9ee29346
Loading...
Loading
Loading...
Loading
[ Download: CSV Export ]
[ Download: CSV Export ]
A token is a representation of an on-chain or off-chain asset. The token page shows information such as price, total supply, holders, transfers and social links. Learn more about this page in our Knowledge Base.