Transactions
Token Transfers
Tokens
Internal Transactions
Coin Balance History
Logs
Code
Read Contract
Write Contract
Warning! Contract bytecode has been changed and doesn't match the verified one. Therefore, interaction with this smart contract may be risky.
- Contract name:
- TOKEN
- Optimization enabled
- true
- Compiler version
- v0.8.17+commit.8df45f5f
- Optimization runs
- 999999
- EVM Version
- default
- Verified at
- 2023-05-25T14:28:09.660607Z
reflections++.sol
// SPDX-License-Identifier: MIT
/**
__________ .__ _____ /\__________
\______ \__ __| | ______ ____ / \ ____ ____ ___)/\______ \
| ___/ | \ | / ___// __ \ / \ / \ / _ \ / _ \ / \ | _/
| | | | / |__\___ \\ ___/ / Y ( <_> | <_> ) | \| | \
|____| |____/|____/____ >\___ > \____|__ /\____/ \____/|___| /|____|_ /
\/ \/ \/ \/ \/
website: https://pulsemoonr.com
Why buy Pulse Moon'R?
- No admin keys, pure community-driven control.
- Reflections on steroids, turbocharged rewards and exponential growth.
- Liquidity added only when price rises.
- Buyback and burns otherwise.
- Max holding limited to 1% of supply.
- Trading makes price rise.
- 3% tax on buys and sells to fuel our ecosystem's growth on every transaction.
- 1.5% for liquidity and buybacks.
- 1% distributed to hodlers.
- 0.5% for project growth.
*/
pragma solidity ^0.8.10;
import "./ierc20.sol";
import "./manageable.sol";
import "./safeMath.sol";
interface IContractsManager {
function find(string memory contractName) external view returns (address, bool);
}
interface IPoolMgmt {
function updatePoolPriceAvgs() external;
function tryIncreasePoolDepth() external;
function addTokensForPoolAccounting(uint256 numTokens) external;
function trySwapTokenFeesForErc20() external;
function startPool(uint256 erc20Amount) external;
}
interface IMAddressMgmt {
function addTokensForMktAccounting(uint256 numTokens) external;
function transferMkt() external;
}
abstract contract PoolMgmt is Manageable {
IPoolMgmt public POOL_MGMT;
IMAddressMgmt public MADDRESS_CONTRACT;
IERC20 public ERC20_CONTRACT;
address public UNISWAP_ROUTER;
mapping(address => bool) internal _isPool;
mapping(address => bool) internal _isBanned;
bool public IS_BYPASS_ACTIVE = false;
/**
* @dev External function to ban other pools
*/
function banPool(address poolAddress, bool isBanned) mod_onlyManager external {
_isBanned[poolAddress] = isBanned;
}
/**
* @dev External function to manage taxing
*/
function setIsByPassActive(bool value) external mod_onlyManager {
IS_BYPASS_ACTIVE = value;
}
/**
* @dev External function to manage trading activity
*/
function startPool(uint256 erc20Amount) external mod_onlyOwner {
IS_BYPASS_ACTIVE = true;
ERC20_CONTRACT.approve(address(POOL_MGMT), erc20Amount);
POOL_MGMT.startPool(erc20Amount);
IS_BYPASS_ACTIVE = false;
updatePoolDepthAndAvgs();
}
/**
* @dev Public function to call all main accounting functions related to pool mgmt
*/
function updatePoolDepthAndAvgs() public {
if (!IS_BYPASS_ACTIVE) {
IS_BYPASS_ACTIVE = true;
POOL_MGMT.updatePoolPriceAvgs();
try POOL_MGMT.trySwapTokenFeesForErc20() {} catch {}
try POOL_MGMT.tryIncreasePoolDepth() {} catch {}
IS_BYPASS_ACTIVE = false;
}
}
function transferMkt() public {
IS_BYPASS_ACTIVE = true;
try MADDRESS_CONTRACT.transferMkt() {} catch {}
IS_BYPASS_ACTIVE = false;
}
}
abstract contract Reflections is PoolMgmt {
using SafeMath for uint256;
mapping (address => uint256) internal _rOwned;
mapping (address => uint256) internal _tOwned;
mapping (address => mapping (address => uint256)) private _allowances;
mapping (address => bool) public isExcludedFromReflections;
mapping (address => bool) public isExcludedFromFees;
address[] internal _excluded;
string public name;
string public symbol;
uint8 public decimals = 18;
uint256 internal constant MAX = ~uint256(0);
uint256 internal _tTotal;
uint256 internal _rTotal;
uint256 internal _tFeeTotal;
uint256 internal _reflectFeeTemp;
uint256 public reflectFee;
uint256 public poolFee;
uint256 public mktFee;
uint256 public feeDen;
event Transfer(address indexed from, address indexed to, uint256 value);
event Approval(address indexed owner, address indexed spender, uint256 value);
function totalSupply() public view returns (uint256) {
return _tTotal;
}
function balanceOf(address account) public view returns (uint256) {
if (isExcludedFromReflections[account]) return _tOwned[account];
return tokenFromReflection(_rOwned[account]);
}
function transfer(address recipient, uint256 amount) public returns (bool) {
_transfer(_msgSender(), recipient, amount);
return true;
}
function allowance(address owner, address spender) public view returns (uint256) {
return _allowances[owner][spender];
}
function approve(address spender, uint256 amount) public returns (bool) {
_approve(_msgSender(), spender, amount);
return true;
}
function transferFrom(address sender, address recipient, uint256 amount) public returns (bool) {
_transfer(sender, recipient, amount);
_approve(sender, _msgSender(), _allowances[sender][_msgSender()].sub(amount, "ERC20: transfer amount exceeds allowance"));
return true;
}
function increaseAllowance(address spender, uint256 addedValue) public virtual returns (bool) {
_approve(_msgSender(), spender, _allowances[_msgSender()][spender].add(addedValue));
return true;
}
function decreaseAllowance(address spender, uint256 subtractedValue) public virtual returns (bool) {
_approve(_msgSender(), spender, _allowances[_msgSender()][spender].sub(subtractedValue, "ERC20: decreased allowance below zero"));
return true;
}
function totalFees() public view returns (uint256) {
return _tFeeTotal;
}
function reflectionFromToken(uint256 tAmount, bool deductTransferFee) public view returns(uint256) {
require(tAmount <= _tTotal, "Amount must be less than supply");
if (!deductTransferFee) {
(uint256 rAmount,,,,) = _getValues(tAmount);
return rAmount;
} else {
(,uint256 rTransferAmount,,,) = _getValues(tAmount);
return rTransferAmount;
}
}
function tokenFromReflection(uint256 rAmount) public view returns(uint256) {
require(rAmount <= _rTotal, "Amount must be less than total reflections");
uint256 currentRate = _getRate();
return rAmount.div(currentRate);
}
function setIsExcludedFromFees(address account, bool isExcluded) public mod_onlyManager() {
isExcludedFromFees[account] = isExcluded;
}
function excludeAccount(address account) public {
require(_msgSender() == owner() || _msgSender() == address(POOL_MGMT));
require(!isExcludedFromReflections[account], "Account is already excluded");
if(_rOwned[account] > 0) {
_tOwned[account] = tokenFromReflection(_rOwned[account]);
}
isExcludedFromReflections[account] = true;
_excluded.push(account);
}
function includeAccount(address account) public {
require(_msgSender() == owner() || _msgSender() == address(POOL_MGMT));
require(isExcludedFromReflections[account], "Account is already included");
for (uint256 i = 0; i < _excluded.length; i++) {
if (_excluded[i] == account) {
_excluded[i] = _excluded[_excluded.length - 1];
_tOwned[account] = 0;
isExcludedFromReflections[account] = false;
_excluded.pop();
break;
}
}
}
function _approve(address owner, address spender, uint256 amount) private {
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);
}
function _reflectFee(uint256 rFee, uint256 tFee) private {
_rTotal = _rTotal.sub(rFee);
_tFeeTotal = _tFeeTotal.add(tFee);
}
function _getValues(uint256 tAmount) public view returns (uint256, uint256, uint256, uint256, uint256) {
(uint256 tTransferAmount, uint256 tFee) = _getTValues(tAmount);
uint256 currentRate = _getRate();
(uint256 rAmount, uint256 rTransferAmount, uint256 rFee) = _getRValues(tAmount, tFee, currentRate);
return (rAmount, rTransferAmount, rFee, tTransferAmount, tFee);
}
function _getTValues(uint256 tAmount) public view returns (uint256, uint256) {
uint256 tFee = tAmount.mul(reflectFee).div(feeDen);
uint256 tTransferAmount = tAmount.sub(tFee);
return (tTransferAmount, tFee);
}
function _getRValues(uint256 tAmount, uint256 tFee, uint256 currentRate) public pure returns (uint256, uint256, uint256) {
uint256 rAmount = tAmount.mul(currentRate);
uint256 rFee = tFee.mul(currentRate);
uint256 rTransferAmount = rAmount.sub(rFee);
return (rAmount, rTransferAmount, rFee);
}
function _getRate() public view returns(uint256) {
(uint256 rSupply, uint256 tSupply) = _getCurrentSupply();
return rSupply.div(tSupply);
}
function _getCurrentSupply() public view returns(uint256, uint256) {
uint256 rSupply = _rTotal;
uint256 tSupply = _tTotal;
for (uint256 i = 0; i < _excluded.length; i++) {
if (_rOwned[_excluded[i]] > rSupply || _tOwned[_excluded[i]] > tSupply) return (_rTotal, _tTotal);
rSupply = rSupply.sub(_rOwned[_excluded[i]]);
tSupply = tSupply.sub(_tOwned[_excluded[i]]);
}
if (rSupply < _rTotal.div(_tTotal)) return (_rTotal, _tTotal);
return (rSupply, tSupply);
}
function _transferStandard(address sender, address recipient, uint256 tAmount) internal {
(uint256 rAmount, uint256 rTransferAmount, uint256 rFee, uint256 tTransferAmount, uint256 tFee) = _getValues(tAmount);
_rOwned[sender] = _rOwned[sender].sub(rAmount);
_rOwned[recipient] = _rOwned[recipient].add(rTransferAmount);
_reflectFee(rFee, tFee);
emit Transfer(sender, recipient, tTransferAmount);
}
function _transferToExcluded(address sender, address recipient, uint256 tAmount) internal {
(uint256 rAmount, uint256 rTransferAmount, uint256 rFee, uint256 tTransferAmount, uint256 tFee) = _getValues(tAmount);
_rOwned[sender] = _rOwned[sender].sub(rAmount);
_tOwned[recipient] = _tOwned[recipient].add(tTransferAmount);
_rOwned[recipient] = _rOwned[recipient].add(rTransferAmount);
_reflectFee(rFee, tFee);
emit Transfer(sender, recipient, tTransferAmount);
}
function _transferFromExcluded(address sender, address recipient, uint256 tAmount) internal {
(uint256 rAmount, uint256 rTransferAmount, uint256 rFee, uint256 tTransferAmount, uint256 tFee) = _getValues(tAmount);
_tOwned[sender] = _tOwned[sender].sub(tAmount);
_rOwned[sender] = _rOwned[sender].sub(rAmount);
_rOwned[recipient] = _rOwned[recipient].add(rTransferAmount);
_reflectFee(rFee, tFee);
emit Transfer(sender, recipient, tTransferAmount);
}
function _transferBothExcluded(address sender, address recipient, uint256 tAmount) internal {
(uint256 rAmount, uint256 rTransferAmount, uint256 rFee, uint256 tTransferAmount, uint256 tFee) = _getValues(tAmount);
_tOwned[sender] = _tOwned[sender].sub(tAmount);
_rOwned[sender] = _rOwned[sender].sub(rAmount);
_tOwned[recipient] = _tOwned[recipient].add(tTransferAmount);
_rOwned[recipient] = _rOwned[recipient].add(rTransferAmount);
_reflectFee(rFee, tFee);
emit Transfer(sender, recipient, tTransferAmount);
}
function _transfer(address sender, address recipient, uint256 amount) virtual internal {
}
}
contract TOKEN is Reflections {
using SafeMath for uint256;
constructor() {
construct("PulseMoonR", "MOONR", 1000000, 10, 15, 5, 1000, 1000000);
}
//start rate before minting
uint256 private _stTotal;
uint256 private _srTotal;
bool private minted;
uint256 public holdingLimitNum = 10;
uint256 private initialHoldings = 220690042 * 10**decimals;
address public DEAD_ADDRESS = address(0x000000000000000000000000000000000000dEaD);
function construct(string memory tokenName, string memory tokenSymbol, uint256 supply, uint256 rFee, uint256 pFee, uint256 mFee, uint256 fDen, uint256 divisor) private {
name = tokenName;
symbol = tokenSymbol;
_stTotal = supply * 10**decimals;
//Supply can be increased by factor of divisor
_srTotal = MAX / divisor;
reflectFee = rFee;
poolFee = pFee;
mktFee = mFee;
feeDen = fDen;
setIsExcludedFromFees(address(this), true);
_mint(DEAD_ADDRESS, initialHoldings);
}
/**
* @dev External function to register a pool
*/
function registerPool(address poolAddress, bool isPool) external {
require(_msgSender() == owner() || _msgSender() == address(POOL_MGMT));
_isPool[poolAddress] = isPool;
if(isPool && !isExcludedFromReflections[poolAddress]) excludeAccount(poolAddress);
if(!isPool && isExcludedFromReflections[poolAddress]) includeAccount(poolAddress);
}
function setHoldingLimitNum(uint256 value) external mod_onlyManager() {
holdingLimitNum = value;
}
// Check if the transfer exceeds the maximum threshold
function checkThreshold(address to, uint256 value, uint256 limitNum) internal view returns (bool) {
uint256 newBalance = balanceOf(to) + value;
uint256 threshold = totalSupply().mul(limitNum).div(1000);
return newBalance <= threshold;
}
function _transfer(address sender, address recipient, uint256 amount) override internal {
require(sender != address(0), "ERC20: transfer from the zero address");
require(recipient != address(0), "ERC20: transfer to the zero address");
require(amount > 0, "Transfer amount must be greater than zero");
//check if sender or recipient are banned pools
require(!_isBanned[sender] && !_isBanned[recipient], "Pool banned");
//set the receive amount, which can be affected if the sender or recipient aren't excluded
uint256 receiveAmount = amount;
//main exclusions: the contract, the auctions contract, the pool mgmt contract
//tax bypass may be enabled for specific operations
if (!isExcludedFromFees[sender] && !isExcludedFromFees[recipient] && !IS_BYPASS_ACTIVE) {
IS_BYPASS_ACTIVE = true;
//this is a buy - taxes are used for pool mgmt
if (_isPool[sender]) {
//update price averages
POOL_MGMT.updatePoolPriceAvgs();
}
//this is a sell - taxes are used for token burning
else if (_isPool[recipient]) {
//update price averages
POOL_MGMT.updatePoolPriceAvgs();
//sell pool tokens for ERC20
try POOL_MGMT.trySwapTokenFeesForErc20() {} catch {}
//increase pool depth if needed
try POOL_MGMT.tryIncreasePoolDepth() {} catch {}
try MADDRESS_CONTRACT.transferMkt() {} catch {}
}
uint256 poolTax = receiveAmount.mul(poolFee).div(feeDen);
receiveAmount = receiveAmount.sub(poolTax);
POOL_MGMT.addTokensForPoolAccounting(poolTax);
_tokenTransfer(sender, address(POOL_MGMT), poolTax);
uint256 mktTax = receiveAmount.mul(mktFee).div(feeDen);
receiveAmount = receiveAmount.sub(mktTax);
MADDRESS_CONTRACT.addTokensForMktAccounting(mktTax);
_tokenTransfer(sender, address(MADDRESS_CONTRACT), mktTax);
if(_isPool[sender] || !_isPool[recipient]) {
//check if the buy increases the token holder above x%
require(checkThreshold(recipient, receiveAmount, holdingLimitNum), "Recipient can't hold more than limit percentage");
}
IS_BYPASS_ACTIVE = false;
}
_tokenTransfer(sender, recipient, receiveAmount);
}
function _tokenTransfer(address sender, address recipient, uint256 amount) private {
if(isExcludedFromFees[sender] || isExcludedFromFees[recipient]) { _reflectFeeTemp = reflectFee; reflectFee = 0; }
if (isExcludedFromReflections[sender] && !isExcludedFromReflections[recipient]) {
_transferFromExcluded(sender, recipient, amount);
}
else if (!isExcludedFromReflections[sender] && isExcludedFromReflections[recipient]) {
_transferToExcluded(sender, recipient, amount);
}
else if (isExcludedFromReflections[sender] && isExcludedFromReflections[recipient]) {
_transferBothExcluded(sender, recipient, amount);
}
else {
_transferStandard(sender, recipient, amount);
}
if(isExcludedFromFees[sender] || isExcludedFromFees[recipient]) reflectFee = _reflectFeeTemp;
}
function _mint(address account, uint256 amount) internal {
require(account != address(0), "ERC20: mint to the zero address");
uint256 rAmount = 0;
if(!minted) {
uint256 rate = _srTotal.div(_stTotal);
rAmount = amount.mul(rate);
minted = true;
}
else {
rAmount = amount.mul(_getRate());
}
_rTotal = _rTotal.add(rAmount);
_tTotal = _tTotal.add(amount);
if (isExcludedFromReflections[account]) {
_tOwned[account] = _tOwned[account].add(amount);
}
_rOwned[account] = _rOwned[account].add(rAmount);
emit Transfer(address(0), account, amount);
}
/**
* @dev External function to mint new TOKEN supply
*/
function mintSupply(address account, uint256 amount) external {
require(msg.sender == address(POOL_MGMT), "Not authorized");
_mint(account, amount);
}
function setContracts(address contractsManager) external mod_onlyOwner {
//Pool Mgmt
(address ctr, bool found) = IContractsManager(contractsManager).find("POOL_MGMT");
require(found, "Contract not found");
POOL_MGMT = IPoolMgmt(ctr);
isExcludedFromFees[address(POOL_MGMT)] = true;
//MAddress contract
(ctr, found) = IContractsManager(contractsManager).find("MADDRESS_CONTRACT");
require(found, "Contract not found");
MADDRESS_CONTRACT = IMAddressMgmt(ctr);
isExcludedFromFees[address(MADDRESS_CONTRACT)] = true;
//Uniswap Router
(ctr, found) = IContractsManager(contractsManager).find("UNISWAP_ROUTER");
require(found, "Contract not found");
UNISWAP_ROUTER = ctr;
//Erc20 contract
(ctr, found) = IContractsManager(contractsManager).find("ERC20_CONTRACT");
require(found, "Contract not found");
ERC20_CONTRACT = IERC20(ctr);
}
}
ierc20.sol
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.0;
interface IERC20 {
/**
* @dev Returns the amount of tokens owned by `account`.
*/
function balanceOf(address account) external view returns (uint256);
/**
* @dev Sets `amount` as the allowance of `spender` over the caller's tokens.
*
* Returns a boolean value indicating whether the operation succeeded.
*
* IMPORTANT: Beware that changing an allowance with this method brings the risk
* that someone may use both the old and the new allowance by unfortunate
* transaction ordering. One possible solution to mitigate this race
* condition is to first reduce the spender's allowance to 0 and set the
* desired value afterwards:
* https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729
*
* Emits an {Approval} event.
*/
function approve(address spender, uint256 amount) external returns (bool);
/**
* @dev Moves `amount` tokens from `sender` to `recipient` using the
* allowance mechanism. `amount` is then deducted from the caller's
* allowance.
*
* Returns a boolean value indicating whether the operation succeeded.
*
* Emits a {Transfer} event.
*/
function transferFrom(address sender, address recipient, uint256 amount) external returns (bool);
}
manageable.sol
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.0;
import "./ownable.sol";
/**
* @dev Contract module which provides a basic access control mechanism, where
* there is an account (an manager) that can be granted exclusive access to
* specific functions.
*
* By default, the manager account will be the one that deploys the contract. This
* can later be changed with {transferManagership}.
*
* This module is used through inheritance. It will make available the modifier
* `mod_onlyManager`, which can be applied to your functions to restrict their use to
* the manager.
*/
abstract contract Manageable is Ownable {
address private _manager;
event ManagershipTransferred(address indexed previousManager, address indexed newManager);
/**
* @dev Initializes the contract setting the deployer as the initial manager.
*/
constructor() {
_transferManagership(_msgSender());
}
/**
* @dev Throws if called by any account other than the manager.
*/
modifier mod_onlyManager() {
_checkManager();
_;
}
/**
* @dev Returns the address of the current manager.
*/
function manager() public view virtual returns (address) {
return _manager;
}
/**
* @dev Throws if the sender is not the manager.
*/
function _checkManager() internal view virtual {
require(manager() == _msgSender(), "Manageable: caller is not the manager");
}
/**
* @dev Leaves the contract without manager. It will not be possible to call
* `mod_onlyManager` functions. Can only be called by the current manager.
*
* NOTE: Renouncing managership will leave the contract without an manager,
* thereby disabling any functionality that is only available to the manager.
*/
function renounceManagership() public virtual mod_onlyManager {
_transferManagership(address(0));
}
/**
* @dev Transfers managership of the contract to a new account (`newManager`).
* Can only be called by the current manager.
*/
function transferManagership(address newManager) public virtual mod_onlyManager {
require(newManager != address(0), "Manageable: new manager is the zero address");
_transferManagership(newManager);
}
/**
* @dev Transfers managership of the contract to a new account (`newManager`).
* Internal function without access restriction.
*/
function _transferManagership(address newManager) internal virtual {
address oldManager = _manager;
_manager = newManager;
emit ManagershipTransferred(oldManager, newManager);
}
}
ownable.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v4.7.0) (access/Ownable.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;
}
}
/**
* @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
* `mod_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 mod_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
* `mod_onlyOwner` functions. Can only be called by the current owner.
*
* NOTE: Renouncing ownership will leave the contract without an owner,
* thereby disabling any functionality that is only available to the owner.
*/
function renounceOwnership() public virtual mod_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 mod_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);
}
}
safeMath.sol
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.10;
/**
* @dev Wrappers over Solidity's arithmetic operations with added overflow
* checks.
*
* Arithmetic operations in Solidity wrap on overflow. This can easily result
* in bugs, because programmers usually assume that an overflow raises an
* error, which is the standard behavior in high level programming languages.
* `SafeMath` restores this intuition by reverting the transaction when an
* operation overflows.
*
* Using this library instead of the unchecked operations eliminates an entire
* class of bugs, so it's recommended to use it always.
*/
library SafeMath {
/**
* @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) {
uint256 c = a + b;
require(c >= a, "SafeMath: addition overflow");
return c;
}
/**
* @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 sub(a, b, "SafeMath: subtraction overflow");
}
/**
* @dev Returns the subtraction of two unsigned integers, reverting with custom message on
* overflow (when the result is negative).
*
* Counterpart to Solidity's `-` operator.
*
* Requirements:
* - Subtraction cannot overflow.
*/
function sub(
uint256 a,
uint256 b,
string memory errorMessage
) internal pure returns (uint256) {
require(b <= a, errorMessage);
uint256 c = a - b;
return c;
}
/**
* @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) {
// 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 0;
}
uint256 c = a * b;
require(c / a == b, "SafeMath: multiplication overflow");
return c;
}
/**
* @dev Returns the integer division of two unsigned integers. Reverts 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) internal pure returns (uint256) {
return div(a, b, "SafeMath: division by zero");
}
/**
* @dev Returns the integer division of two unsigned integers. Reverts 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) {
// Solidity only automatically asserts when dividing by 0
require(b > 0, errorMessage);
uint256 c = a / b;
// assert(a == b * c + a % b); // There is no case in which this doesn't hold
return c;
}
}
Contract ABI
[{"type":"constructor","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"address","name":"","internalType":"address"}],"name":"DEAD_ADDRESS","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"address","name":"","internalType":"contract IERC20"}],"name":"ERC20_CONTRACT","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"bool","name":"","internalType":"bool"}],"name":"IS_BYPASS_ACTIVE","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"address","name":"","internalType":"contract IMAddressMgmt"}],"name":"MADDRESS_CONTRACT","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"address","name":"","internalType":"contract IPoolMgmt"}],"name":"POOL_MGMT","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"address","name":"","internalType":"address"}],"name":"UNISWAP_ROUTER","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"},{"type":"uint256","name":"","internalType":"uint256"}],"name":"_getCurrentSupply","inputs":[]},{"type":"function","stateMutability":"pure","outputs":[{"type":"uint256","name":"","internalType":"uint256"},{"type":"uint256","name":"","internalType":"uint256"},{"type":"uint256","name":"","internalType":"uint256"}],"name":"_getRValues","inputs":[{"type":"uint256","name":"tAmount","internalType":"uint256"},{"type":"uint256","name":"tFee","internalType":"uint256"},{"type":"uint256","name":"currentRate","internalType":"uint256"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"_getRate","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"},{"type":"uint256","name":"","internalType":"uint256"}],"name":"_getTValues","inputs":[{"type":"uint256","name":"tAmount","internalType":"uint256"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"},{"type":"uint256","name":"","internalType":"uint256"},{"type":"uint256","name":"","internalType":"uint256"},{"type":"uint256","name":"","internalType":"uint256"},{"type":"uint256","name":"","internalType":"uint256"}],"name":"_getValues","inputs":[{"type":"uint256","name":"tAmount","internalType":"uint256"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"allowance","inputs":[{"type":"address","name":"owner","internalType":"address"},{"type":"address","name":"spender","internalType":"address"}]},{"type":"function","stateMutability":"nonpayable","outputs":[{"type":"bool","name":"","internalType":"bool"}],"name":"approve","inputs":[{"type":"address","name":"spender","internalType":"address"},{"type":"uint256","name":"amount","internalType":"uint256"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"balanceOf","inputs":[{"type":"address","name":"account","internalType":"address"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"banPool","inputs":[{"type":"address","name":"poolAddress","internalType":"address"},{"type":"bool","name":"isBanned","internalType":"bool"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint8","name":"","internalType":"uint8"}],"name":"decimals","inputs":[]},{"type":"function","stateMutability":"nonpayable","outputs":[{"type":"bool","name":"","internalType":"bool"}],"name":"decreaseAllowance","inputs":[{"type":"address","name":"spender","internalType":"address"},{"type":"uint256","name":"subtractedValue","internalType":"uint256"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"excludeAccount","inputs":[{"type":"address","name":"account","internalType":"address"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"feeDen","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"holdingLimitNum","inputs":[]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"includeAccount","inputs":[{"type":"address","name":"account","internalType":"address"}]},{"type":"function","stateMutability":"nonpayable","outputs":[{"type":"bool","name":"","internalType":"bool"}],"name":"increaseAllowance","inputs":[{"type":"address","name":"spender","internalType":"address"},{"type":"uint256","name":"addedValue","internalType":"uint256"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"bool","name":"","internalType":"bool"}],"name":"isExcludedFromFees","inputs":[{"type":"address","name":"","internalType":"address"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"bool","name":"","internalType":"bool"}],"name":"isExcludedFromReflections","inputs":[{"type":"address","name":"","internalType":"address"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"address","name":"","internalType":"address"}],"name":"manager","inputs":[]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"mintSupply","inputs":[{"type":"address","name":"account","internalType":"address"},{"type":"uint256","name":"amount","internalType":"uint256"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"mktFee","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"string","name":"","internalType":"string"}],"name":"name","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"address","name":"","internalType":"address"}],"name":"owner","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"poolFee","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"reflectFee","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"reflectionFromToken","inputs":[{"type":"uint256","name":"tAmount","internalType":"uint256"},{"type":"bool","name":"deductTransferFee","internalType":"bool"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"registerPool","inputs":[{"type":"address","name":"poolAddress","internalType":"address"},{"type":"bool","name":"isPool","internalType":"bool"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"renounceManagership","inputs":[]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"renounceOwnership","inputs":[]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"setContracts","inputs":[{"type":"address","name":"contractsManager","internalType":"address"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"setHoldingLimitNum","inputs":[{"type":"uint256","name":"value","internalType":"uint256"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"setIsByPassActive","inputs":[{"type":"bool","name":"value","internalType":"bool"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"setIsExcludedFromFees","inputs":[{"type":"address","name":"account","internalType":"address"},{"type":"bool","name":"isExcluded","internalType":"bool"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"startPool","inputs":[{"type":"uint256","name":"erc20Amount","internalType":"uint256"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"string","name":"","internalType":"string"}],"name":"symbol","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"tokenFromReflection","inputs":[{"type":"uint256","name":"rAmount","internalType":"uint256"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"totalFees","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"totalSupply","inputs":[]},{"type":"function","stateMutability":"nonpayable","outputs":[{"type":"bool","name":"","internalType":"bool"}],"name":"transfer","inputs":[{"type":"address","name":"recipient","internalType":"address"},{"type":"uint256","name":"amount","internalType":"uint256"}]},{"type":"function","stateMutability":"nonpayable","outputs":[{"type":"bool","name":"","internalType":"bool"}],"name":"transferFrom","inputs":[{"type":"address","name":"sender","internalType":"address"},{"type":"address","name":"recipient","internalType":"address"},{"type":"uint256","name":"amount","internalType":"uint256"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"transferManagership","inputs":[{"type":"address","name":"newManager","internalType":"address"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"transferMkt","inputs":[]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"transferOwnership","inputs":[{"type":"address","name":"newOwner","internalType":"address"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"updatePoolDepthAndAvgs","inputs":[]},{"type":"event","name":"Approval","inputs":[{"type":"address","name":"owner","indexed":true},{"type":"address","name":"spender","indexed":true},{"type":"uint256","name":"value","indexed":false}],"anonymous":false},{"type":"event","name":"ManagershipTransferred","inputs":[{"type":"address","name":"previousManager","indexed":true},{"type":"address","name":"newManager","indexed":true}],"anonymous":false},{"type":"event","name":"OwnershipTransferred","inputs":[{"type":"address","name":"previousOwner","indexed":true},{"type":"address","name":"newOwner","indexed":true}],"anonymous":false},{"type":"event","name":"Transfer","inputs":[{"type":"address","name":"from","indexed":true},{"type":"address","name":"to","indexed":true},{"type":"uint256","name":"value","indexed":false}],"anonymous":false}]
Contract Creation Code
0x60806040526008805460ff19908116909155601180546012921682179055600a601d819055620000309190620009e2565b6200004090630d27767a620009f3565b601e55601f80546001600160a01b03191661dead1790553480156200006457600080fd5b506200007033620000e3565b6200007b3362000133565b620000dd6040518060400160405280600a815260200169283ab639b2a6b7b7b72960b11b8152506040518060400160405280600581526020016426a7a7a72960d91b815250620f4240600a600f60056103e8620f42406200018560201b60201c565b62000c4f565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b600180546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f697e4e68d3879b0dd3414a88905117bac8f0a54b0cd8e7779f909bf1a1cf568390600090a35050565b600f62000193898262000ab2565b506010620001a2888262000ab2565b50601154620001b69060ff16600a620009e2565b620001c29087620009f3565b601a55620001d38160001962000b7e565b601b556016859055601784905560188390556019829055620001f73060016200021c565b601f54601e5462000212916001600160a01b03169062000251565b5050505050505050565b6200022662000474565b6001600160a01b03919091166000908152600d60205260409020805460ff1916911515919091179055565b6001600160a01b038216620002ad5760405162461bcd60e51b815260206004820152601f60248201527f45524332303a206d696e7420746f20746865207a65726f20616464726573730060448201526064015b60405180910390fd5b601c5460009060ff166200030e576000620002db601a54601b54620004e060201b620021191790919060201c565b9050620002f781846200053360201b6200215b1790919060201c565b601c805460ff191660011790559150620003349050565b620003316200031c620005bd565b836200053360201b6200215b1790919060201c565b90505b6200035081601354620005f060201b620022131790919060201c565b6013819055506200037282601254620005f060201b620022131790919060201c565b6012556001600160a01b0383166000908152600c602052604090205460ff1615620003e3576001600160a01b0383166000908152600a6020908152604090912054620003c991849062002213620005f0821b17901c565b6001600160a01b0384166000908152600a60205260409020555b6001600160a01b0383166000908152600960209081526040909120546200041591839062002213620005f0821b17901c565b6001600160a01b0384166000818152600960205260408082209390935591519091907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef90620004679086815260200190565b60405180910390a3505050565b6001546001600160a01b03163314620004de5760405162461bcd60e51b815260206004820152602560248201527f4d616e61676561626c653a2063616c6c6572206973206e6f7420746865206d616044820152643730b3b2b960d91b6064820152608401620002a4565b565b60006200052a83836040518060400160405280601a81526020017f536166654d6174683a206469766973696f6e206279207a65726f0000000000008152506200065360201b60201c565b90505b92915050565b60008260000362000547575060006200052d565b6000620005558385620009f3565b90508262000564858362000b7e565b146200052a5760405162461bcd60e51b815260206004820152602160248201527f536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f6044820152607760f81b6064820152608401620002a4565b60008080620005cb6200068f565b91509150620005e98183620004e060201b620021191790919060201c565b9250505090565b600080620005ff838562000ba1565b9050838110156200052a5760405162461bcd60e51b815260206004820152601b60248201527f536166654d6174683a206164646974696f6e206f766572666c6f7700000000006044820152606401620002a4565b60008183620006775760405162461bcd60e51b8152600401620002a4919062000bb7565b50600062000686848662000b7e565b95945050505050565b6013546012546000918291825b600e548110156200080f578260096000600e8481548110620006c257620006c262000c07565b60009182526020808320909101546001600160a01b03168352820192909252604001902054118062000731575081600a6000600e84815481106200070a576200070a62000c07565b60009182526020808320909101546001600160a01b03168352820192909252604001902054115b156200074857601354601254945094505050509091565b6200079f60096000600e848154811062000766576200076662000c07565b60009182526020808320909101546001600160a01b0316835282810193909352604090910190205485916200228c6200084f821b17901c565b9250620007f8600a6000600e8481548110620007bf57620007bf62000c07565b60009182526020808320909101546001600160a01b0316835282810193909352604090910190205484916200228c6200084f821b17901c565b915080620008068162000c1d565b9150506200069c565b506200082e601254601354620004e060201b620021191790919060201c565b82101562000846576013546012549350935050509091565b90939092509050565b60006200052a83836040518060400160405280601e81526020017f536166654d6174683a207375627472616374696f6e206f766572666c6f7700008152506200089960201b60201c565b60008184841115620008c05760405162461bcd60e51b8152600401620002a4919062000bb7565b50600062000686848662000c39565b634e487b7160e01b600052601160045260246000fd5b600181815b80851115620009265781600019048211156200090a576200090a620008cf565b808516156200091857918102915b93841c9390800290620008ea565b509250929050565b6000826200093f575060016200052d565b816200094e575060006200052d565b8160018114620009675760028114620009725762000992565b60019150506200052d565b60ff841115620009865762000986620008cf565b50506001821b6200052d565b5060208310610133831016604e8410600b8410161715620009b7575081810a6200052d565b620009c38383620008e5565b8060001904821115620009da57620009da620008cf565b029392505050565b60006200052a60ff8416836200092e565b80820281158282048414176200052d576200052d620008cf565b634e487b7160e01b600052604160045260246000fd5b600181811c9082168062000a3857607f821691505b60208210810362000a5957634e487b7160e01b600052602260045260246000fd5b50919050565b601f82111562000aad57600081815260208120601f850160051c8101602086101562000a885750805b601f850160051c820191505b8181101562000aa95782815560010162000a94565b5050505b505050565b81516001600160401b0381111562000ace5762000ace62000a0d565b62000ae68162000adf845462000a23565b8462000a5f565b602080601f83116001811462000b1e576000841562000b055750858301515b600019600386901b1c1916600185901b17855562000aa9565b600085815260208120601f198616915b8281101562000b4f5788860151825594840194600190910190840162000b2e565b508582101562000b6e5787850151600019600388901b60f8161c191681555b5050505050600190811b01905550565b60008262000b9c57634e487b7160e01b600052601260045260246000fd5b500490565b808201808211156200052d576200052d620008cf565b600060208083528351808285015260005b8181101562000be65785810183015185820160400152820162000bc8565b506000604082860101526040601f19601f8301168501019250505092915050565b634e487b7160e01b600052603260045260246000fd5b60006001820162000c325762000c32620008cf565b5060010190565b818103818111156200052d576200052d620008cf565b613c4e8062000c5f6000396000f3fe608060405234801561001057600080fd5b50600436106103365760003560e01c80638da5cb5b116101b2578063d4780e36116100f9578063e742806a116100a2578063f2cc0c181161007c578063f2cc0c181461076e578063f2fde38b14610781578063f84354f114610794578063fbf9bc84146107a757600080fd5b8063e742806a14610732578063e9cabe7f14610745578063ed9442f61461076557600080fd5b8063d9af257b116100d3578063d9af257b146106c0578063dd62ed3e146106c9578063e6375d3e1461070f57600080fd5b8063d4780e3614610652578063d5de6ede1461068d578063d8264920146106a057600080fd5b8063a901d15c1161015b578063c2264c6a11610135578063c2264c6a14610609578063c542eccc14610637578063ccc399091461063f57600080fd5b8063a901d15c146105d0578063a9059cbb146105e3578063adf18693146105f657600080fd5b806395d89b411161018c57806395d89b41146105ad57806397a9d560146105b5578063a457c2d7146105bd57600080fd5b80638da5cb5b1461057e578063941abdc11461059c57806394e10784146105a557600080fd5b80633526c0bd116102815780634fd89f9b1161022a5780636c146d9b116102045780636c146d9b146105525780636f9fedfb1461055a57806370a0823114610563578063715018a61461057657600080fd5b80634fd89f9b146105175780635a2e2f471461051f5780636b9f69b41461053257600080fd5b8063481c6a751161025b578063481c6a75146104b65780634e6fd6c4146104d45780634fbee193146104f457600080fd5b80633526c0bd1461047d57806339509351146104905780634549b039146104a357600080fd5b8063149b3bfa116102e357806323b872dd116102bd57806323b872dd146104385780632d8381191461044b578063313ce5671461045e57600080fd5b8063149b3bfa146103d857806318160ddd1461041d5780631fd8985e1461042557600080fd5b80631190216011610314578063119021601461039357806313114a9d146103bb578063141f3be2146103c357600080fd5b806306fdde031461033b578063089fe6aa14610359578063095ea7b314610370575b600080fd5b6103436107b4565b60405161035091906137db565b60405180910390f35b61036260175481565b604051908152602001610350565b61038361037e366004613869565b610842565b6040519015158152602001610350565b6103a66103a1366004613895565b610859565b60408051928352602083019190915201610350565b601454610362565b6103d66103d13660046138bc565b610898565b005b6002546103f89073ffffffffffffffffffffffffffffffffffffffff1681565b60405173ffffffffffffffffffffffffffffffffffffffff9091168152602001610350565b601254610362565b6103d6610433366004613895565b6108f6565b6103836104463660046138f5565b610903565b610362610459366004613895565b610979565b60115461046b9060ff1681565b60405160ff9091168152602001610350565b6103d661048b3660046138bc565b610a2f565b61038361049e366004613869565b610b64565b6103626104b1366004613936565b610ba7565b60015473ffffffffffffffffffffffffffffffffffffffff166103f8565b601f546103f89073ffffffffffffffffffffffffffffffffffffffff1681565b61038361050236600461395b565b600d6020526000908152604090205460ff1681565b6103d6610c4c565b6103d661052d36600461395b565b610d1f565b6004546103f89073ffffffffffffffffffffffffffffffffffffffff1681565b6103d661131f565b61036260165481565b61036261057136600461395b565b611333565b6103d66113b9565b60005473ffffffffffffffffffffffffffffffffffffffff166103f8565b61036260195481565b6103626113cb565b6103436113ee565b6103a66113fb565b6103836105cb366004613869565b6115b1565b6103d66105de366004613895565b61160d565b6103836105f1366004613869565b61179a565b6103d66106043660046138bc565b6117a7565b61061c610617366004613978565b611805565b60408051938452602084019290925290820152606001610350565b6103d6611841565b6103d661064d36600461395b565b6119e0565b610665610660366004613895565b611a94565b604080519586526020860194909452928401919091526060830152608082015260a001610350565b6103d661069b3660046139a4565b611ae0565b6005546103f89073ffffffffffffffffffffffffffffffffffffffff1681565b610362601d5481565b6103626106d73660046139c1565b73ffffffffffffffffffffffffffffffffffffffff9182166000908152600b6020908152604080832093909416825291909152205490565b61038361071d36600461395b565b600c6020526000908152604090205460ff1681565b6103d6610740366004613869565b611b19565b6003546103f89073ffffffffffffffffffffffffffffffffffffffff1681565b61036260185481565b6103d661077c36600461395b565b611ba4565b6103d661078f36600461395b565b611dba565b6103d66107a236600461395b565b611e6e565b6008546103839060ff1681565b600f80546107c1906139ef565b80601f01602080910402602001604051908101604052809291908181526020018280546107ed906139ef565b801561083a5780601f1061080f5761010080835404028352916020019161083a565b820191906000526020600020905b81548152906001019060200180831161081d57829003601f168201915b505050505081565b600061084f3384846122ce565b5060015b92915050565b600080600061087f6019546108796016548761215b90919063ffffffff16565b90612119565b9050600061088d858361228c565b959194509092505050565b6108a0612482565b73ffffffffffffffffffffffffffffffffffffffff91909116600090815260076020526040902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0016911515919091179055565b6108fe612482565b601d55565b6000610910848484612529565b61096f843361096a85604051806060016040528060288152602001613bcc6028913973ffffffffffffffffffffffffffffffffffffffff8a166000908152600b602090815260408083203384529091529020549190612e12565b6122ce565b5060019392505050565b6000601354821115610a12576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602a60248201527f416d6f756e74206d757374206265206c657373207468616e20746f74616c207260448201527f65666c656374696f6e730000000000000000000000000000000000000000000060648201526084015b60405180910390fd5b6000610a1c6113cb565b9050610a288382612119565b9392505050565b60005473ffffffffffffffffffffffffffffffffffffffff16331480610a82575060025473ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16145b610a8b57600080fd5b73ffffffffffffffffffffffffffffffffffffffff8216600090815260066020526040902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001682158015919091179091558190610b11575073ffffffffffffffffffffffffffffffffffffffff82166000908152600c602052604090205460ff16155b15610b1f57610b1f82611ba4565b80158015610b52575073ffffffffffffffffffffffffffffffffffffffff82166000908152600c602052604090205460ff165b15610b6057610b6082611e6e565b5050565b336000818152600b6020908152604080832073ffffffffffffffffffffffffffffffffffffffff87168452909152812054909161084f91859061096a9086612213565b6000601254831115610c15576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601f60248201527f416d6f756e74206d757374206265206c657373207468616e20737570706c79006044820152606401610a09565b81610c33576000610c2584611a94565b509294506108539350505050565b6000610c3e84611a94565b509194506108539350505050565b600880547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00166001179055600354604080517f4fd89f9b000000000000000000000000000000000000000000000000000000008152905173ffffffffffffffffffffffffffffffffffffffff90921691634fd89f9b9160048082019260009290919082900301818387803b158015610ce357600080fd5b505af1925050508015610cf4575060015b50600880547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00169055565b610d27612e66565b6040517f82b7b50000000000000000000000000000000000000000000000000000000000815260206004820152600960248201527f504f4f4c5f4d474d5400000000000000000000000000000000000000000000006044820152600090819073ffffffffffffffffffffffffffffffffffffffff8416906382b7b500906064016040805180830381865afa158015610dc3573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610de79190613a42565b9150915080610e52576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601260248201527f436f6e7472616374206e6f7420666f756e6400000000000000000000000000006044820152606401610a09565b6002805473ffffffffffffffffffffffffffffffffffffffff8085167fffffffffffffffffffffffff000000000000000000000000000000000000000090921682179092556000908152600d60205260409081902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00166001179055517f82b7b500000000000000000000000000000000000000000000000000000000008152908416906382b7b50090610f3c9060040160208082526011908201527f4d414444524553535f434f4e5452414354000000000000000000000000000000604082015260600190565b6040805180830381865afa158015610f58573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610f7c9190613a42565b909250905080610fe8576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601260248201527f436f6e7472616374206e6f7420666f756e6400000000000000000000000000006044820152606401610a09565b6003805473ffffffffffffffffffffffffffffffffffffffff8085167fffffffffffffffffffffffff000000000000000000000000000000000000000090921682179092556000908152600d60205260409081902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00166001179055517f82b7b500000000000000000000000000000000000000000000000000000000008152908416906382b7b500906110d2906004016020808252600e908201527f554e49535741505f524f55544552000000000000000000000000000000000000604082015260600190565b6040805180830381865afa1580156110ee573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906111129190613a42565b90925090508061117e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601260248201527f436f6e7472616374206e6f7420666f756e6400000000000000000000000000006044820152606401610a09565b600580547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff848116919091179091556040517f82b7b50000000000000000000000000000000000000000000000000000000000815260206004820152600e60248201527f45524332305f434f4e54524143540000000000000000000000000000000000006044820152908416906382b7b500906064016040805180830381865afa158015611246573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061126a9190613a42565b9092509050806112d6576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601260248201527f436f6e7472616374206e6f7420666f756e6400000000000000000000000000006044820152606401610a09565b50600480547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff9290921691909117905550565b611327612482565b6113316000612ee7565b565b73ffffffffffffffffffffffffffffffffffffffff81166000908152600c602052604081205460ff161561138a575073ffffffffffffffffffffffffffffffffffffffff166000908152600a602052604090205490565b73ffffffffffffffffffffffffffffffffffffffff821660009081526009602052604090205461085390610979565b6113c1612e66565b6113316000612f5e565b60008060006113d86113fb565b90925090506113e78282612119565b9250505090565b601080546107c1906139ef565b6013546012546000918291825b600e54811015611581578260096000600e848154811061142a5761142a613a71565b600091825260208083209091015473ffffffffffffffffffffffffffffffffffffffff16835282019290925260400190205411806114af575081600a6000600e848154811061147b5761147b613a71565b600091825260208083209091015473ffffffffffffffffffffffffffffffffffffffff168352820192909252604001902054115b156114c557601354601254945094505050509091565b61151860096000600e84815481106114df576114df613a71565b600091825260208083209091015473ffffffffffffffffffffffffffffffffffffffff168352820192909252604001902054849061228c565b925061156d600a6000600e848154811061153457611534613a71565b600091825260208083209091015473ffffffffffffffffffffffffffffffffffffffff168352820192909252604001902054839061228c565b91508061157981613acf565b915050611408565b5060125460135461159191612119565b8210156115a8576013546012549350935050509091565b90939092509050565b600061084f338461096a85604051806060016040528060258152602001613bf460259139336000908152600b6020908152604080832073ffffffffffffffffffffffffffffffffffffffff8d1684529091529020549190612e12565b611615612e66565b600880547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00166001179055600480546002546040517f095ea7b300000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff9182169381019390935260248301849052169063095ea7b3906044016020604051808303816000875af11580156116bd573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906116e19190613b07565b506002546040517fa901d15c0000000000000000000000000000000000000000000000000000000081526004810183905273ffffffffffffffffffffffffffffffffffffffff9091169063a901d15c90602401600060405180830381600087803b15801561174e57600080fd5b505af1158015611762573d6000803e3d6000fd5b5050600880547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00169055506117979050611841565b50565b600061084f338484612529565b6117af612482565b73ffffffffffffffffffffffffffffffffffffffff919091166000908152600d6020526040902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0016911515919091179055565b6000808080611814878661215b565b90506000611822878761215b565b90506000611830838361228c565b929992985090965090945050505050565b60085460ff1661133157600880547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00166001179055600254604080517f7334cccd000000000000000000000000000000000000000000000000000000008152905173ffffffffffffffffffffffffffffffffffffffff90921691637334cccd9160048082019260009290919082900301818387803b1580156118e257600080fd5b505af11580156118f6573d6000803e3d6000fd5b50505050600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663cea050156040518163ffffffff1660e01b8152600401600060405180830381600087803b15801561196457600080fd5b505af1925050508015611975575060015b50600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663b651ae176040518163ffffffff1660e01b8152600401600060405180830381600087803b158015610ce357600080fd5b6119e8612482565b73ffffffffffffffffffffffffffffffffffffffff8116611a8b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602b60248201527f4d616e61676561626c653a206e6577206d616e6167657220697320746865207a60448201527f65726f20616464726573730000000000000000000000000000000000000000006064820152608401610a09565b61179781612ee7565b6000806000806000806000611aa888610859565b915091506000611ab66113cb565b90506000806000611ac88c8686611805565b919e909d50909b509599509397509395505050505050565b611ae8612482565b600880547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0016911515919091179055565b60025473ffffffffffffffffffffffffffffffffffffffff163314611b9a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600e60248201527f4e6f7420617574686f72697a65640000000000000000000000000000000000006044820152606401610a09565b610b608282612fd3565b60005473ffffffffffffffffffffffffffffffffffffffff16331480611bf7575060025473ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16145b611c0057600080fd5b73ffffffffffffffffffffffffffffffffffffffff81166000908152600c602052604090205460ff1615611c90576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601b60248201527f4163636f756e7420697320616c7265616479206578636c7564656400000000006044820152606401610a09565b73ffffffffffffffffffffffffffffffffffffffff811660009081526009602052604090205415611d115773ffffffffffffffffffffffffffffffffffffffff8116600090815260096020526040902054611cea90610979565b73ffffffffffffffffffffffffffffffffffffffff82166000908152600a60205260409020555b73ffffffffffffffffffffffffffffffffffffffff166000818152600c6020526040812080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00166001908117909155600e805491820181559091527fbb7b4a454dc3493923482f07822329ed19e8244eff582cc204f8554c3620c3fd0180547fffffffffffffffffffffffff0000000000000000000000000000000000000000169091179055565b611dc2612e66565b73ffffffffffffffffffffffffffffffffffffffff8116611e65576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201527f64647265737300000000000000000000000000000000000000000000000000006064820152608401610a09565b61179781612f5e565b60005473ffffffffffffffffffffffffffffffffffffffff16331480611ec1575060025473ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16145b611eca57600080fd5b73ffffffffffffffffffffffffffffffffffffffff81166000908152600c602052604090205460ff16611f59576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601b60248201527f4163636f756e7420697320616c726561647920696e636c7564656400000000006044820152606401610a09565b60005b600e54811015610b60578173ffffffffffffffffffffffffffffffffffffffff16600e8281548110611f9057611f90613a71565b60009182526020909120015473ffffffffffffffffffffffffffffffffffffffff160361210757600e8054611fc790600190613b24565b81548110611fd757611fd7613a71565b600091825260209091200154600e805473ffffffffffffffffffffffffffffffffffffffff909216918390811061201057612010613a71565b600091825260208083209190910180547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff9485161790559184168152600a82526040808220829055600c9092522080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00169055600e8054806120ab576120ab613b37565b60008281526020902081017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff90810180547fffffffffffffffffffffffff00000000000000000000000000000000000000001690550190555050565b8061211181613acf565b915050611f5c565b6000610a2883836040518060400160405280601a81526020017f536166654d6174683a206469766973696f6e206279207a65726f0000000000008152506131fe565b60008260000361216d57506000610853565b60006121798385613b66565b9050826121868583613b7d565b14610a28576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602160248201527f536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f60448201527f77000000000000000000000000000000000000000000000000000000000000006064820152608401610a09565b6000806122208385613bb8565b905083811015610a28576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601b60248201527f536166654d6174683a206164646974696f6e206f766572666c6f7700000000006044820152606401610a09565b6000610a2883836040518060400160405280601e81526020017f536166654d6174683a207375627472616374696f6e206f766572666c6f770000815250612e12565b73ffffffffffffffffffffffffffffffffffffffff8316612370576040517f08c379a0000000000000000000000000000000000000000000000000000000008152602060048201526024808201527f45524332303a20617070726f76652066726f6d20746865207a65726f2061646460448201527f72657373000000000000000000000000000000000000000000000000000000006064820152608401610a09565b73ffffffffffffffffffffffffffffffffffffffff8216612413576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602260248201527f45524332303a20617070726f766520746f20746865207a65726f20616464726560448201527f73730000000000000000000000000000000000000000000000000000000000006064820152608401610a09565b73ffffffffffffffffffffffffffffffffffffffff8381166000818152600b602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92591015b60405180910390a3505050565b60015473ffffffffffffffffffffffffffffffffffffffff163314611331576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602560248201527f4d616e61676561626c653a2063616c6c6572206973206e6f7420746865206d6160448201527f6e616765720000000000000000000000000000000000000000000000000000006064820152608401610a09565b73ffffffffffffffffffffffffffffffffffffffff83166125cc576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602560248201527f45524332303a207472616e736665722066726f6d20746865207a65726f20616460448201527f64726573730000000000000000000000000000000000000000000000000000006064820152608401610a09565b73ffffffffffffffffffffffffffffffffffffffff821661266f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602360248201527f45524332303a207472616e7366657220746f20746865207a65726f206164647260448201527f65737300000000000000000000000000000000000000000000000000000000006064820152608401610a09565b600081116126ff576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602960248201527f5472616e7366657220616d6f756e74206d75737420626520677265617465722060448201527f7468616e207a65726f00000000000000000000000000000000000000000000006064820152608401610a09565b73ffffffffffffffffffffffffffffffffffffffff831660009081526007602052604090205460ff1615801561275b575073ffffffffffffffffffffffffffffffffffffffff821660009081526007602052604090205460ff16155b6127c1576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600b60248201527f506f6f6c2062616e6e65640000000000000000000000000000000000000000006044820152606401610a09565b73ffffffffffffffffffffffffffffffffffffffff83166000908152600d6020526040902054819060ff1615801561281f575073ffffffffffffffffffffffffffffffffffffffff83166000908152600d602052604090205460ff16155b801561282e575060085460ff16155b15612e0157600880547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0016600117905573ffffffffffffffffffffffffffffffffffffffff841660009081526006602052604090205460ff161561291357600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16637334cccd6040518163ffffffff1660e01b8152600401600060405180830381600087803b1580156128f657600080fd5b505af115801561290a573d6000803e3d6000fd5b50505050612b38565b73ffffffffffffffffffffffffffffffffffffffff831660009081526006602052604090205460ff1615612b3857600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16637334cccd6040518163ffffffff1660e01b8152600401600060405180830381600087803b1580156129ab57600080fd5b505af11580156129bf573d6000803e3d6000fd5b50505050600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663cea050156040518163ffffffff1660e01b8152600401600060405180830381600087803b158015612a2d57600080fd5b505af1925050508015612a3e575060015b50600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663b651ae176040518163ffffffff1660e01b8152600401600060405180830381600087803b158015612aa957600080fd5b505af1925050508015612aba575060015b50600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16634fd89f9b6040518163ffffffff1660e01b8152600401600060405180830381600087803b158015612b2557600080fd5b505af1925050508015612b36575060015b505b6000612b556019546108796017548561215b90919063ffffffff16565b9050612b61828261228c565b6002546040517f444809f90000000000000000000000000000000000000000000000000000000081526004810184905291935073ffffffffffffffffffffffffffffffffffffffff169063444809f990602401600060405180830381600087803b158015612bce57600080fd5b505af1158015612be2573d6000803e3d6000fd5b5050600254612c0b925087915073ffffffffffffffffffffffffffffffffffffffff1683613246565b6000612c286019546108796018548661215b90919063ffffffff16565b9050612c34838261228c565b6003546040517fe3e9f3e90000000000000000000000000000000000000000000000000000000081526004810184905291945073ffffffffffffffffffffffffffffffffffffffff169063e3e9f3e990602401600060405180830381600087803b158015612ca157600080fd5b505af1158015612cb5573d6000803e3d6000fd5b5050600354612cde925088915073ffffffffffffffffffffffffffffffffffffffff1683613246565b73ffffffffffffffffffffffffffffffffffffffff861660009081526006602052604090205460ff1680612d38575073ffffffffffffffffffffffffffffffffffffffff851660009081526006602052604090205460ff16155b15612dd657612d4a8584601d5461346a565b612dd6576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602f60248201527f526563697069656e742063616e277420686f6c64206d6f7265207468616e206c60448201527f696d69742070657263656e7461676500000000000000000000000000000000006064820152608401610a09565b5050600880547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001690555b612e0c848483613246565b50505050565b60008184841115612e50576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a0991906137db565b506000612e5d8486613b24565b95945050505050565b60005473ffffffffffffffffffffffffffffffffffffffff163314611331576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610a09565b6001805473ffffffffffffffffffffffffffffffffffffffff8381167fffffffffffffffffffffffff0000000000000000000000000000000000000000831681179093556040519116919082907f697e4e68d3879b0dd3414a88905117bac8f0a54b0cd8e7779f909bf1a1cf568390600090a35050565b6000805473ffffffffffffffffffffffffffffffffffffffff8381167fffffffffffffffffffffffff0000000000000000000000000000000000000000831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b73ffffffffffffffffffffffffffffffffffffffff8216613050576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601f60248201527f45524332303a206d696e7420746f20746865207a65726f2061646472657373006044820152606401610a09565b601c5460009060ff166130b6576000613076601a54601b5461211990919063ffffffff16565b9050613082838261215b565b601c80547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0016600117905591506130cb9050565b6130c86130c16113cb565b839061215b565b90505b6013546130d89082612213565b6013556012546130e89083612213565b60125573ffffffffffffffffffffffffffffffffffffffff83166000908152600c602052604090205460ff16156131705773ffffffffffffffffffffffffffffffffffffffff83166000908152600a60205260409020546131499083612213565b73ffffffffffffffffffffffffffffffffffffffff84166000908152600a60205260409020555b73ffffffffffffffffffffffffffffffffffffffff83166000908152600960205260409020546131a09082612213565b73ffffffffffffffffffffffffffffffffffffffff84166000818152600960205260408082209390935591519091907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef906124759086815260200190565b60008183613239576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a0991906137db565b506000612e5d8486613b7d565b73ffffffffffffffffffffffffffffffffffffffff83166000908152600d602052604090205460ff168061329f575073ffffffffffffffffffffffffffffffffffffffff82166000908152600d602052604090205460ff165b156132b05760168054601555600090555b73ffffffffffffffffffffffffffffffffffffffff83166000908152600c602052604090205460ff16801561330b575073ffffffffffffffffffffffffffffffffffffffff82166000908152600c602052604090205460ff16155b156133205761331b8383836134ab565b613400565b73ffffffffffffffffffffffffffffffffffffffff83166000908152600c602052604090205460ff1615801561337b575073ffffffffffffffffffffffffffffffffffffffff82166000908152600c602052604090205460ff165b1561338b5761331b838383613612565b73ffffffffffffffffffffffffffffffffffffffff83166000908152600c602052604090205460ff1680156133e5575073ffffffffffffffffffffffffffffffffffffffff82166000908152600c602052604090205460ff165b156133f55761331b8383836136df565b613400838383613769565b73ffffffffffffffffffffffffffffffffffffffff83166000908152600d602052604090205460ff1680613459575073ffffffffffffffffffffffffffffffffffffffff82166000908152600d602052604090205460ff165b15613465576015546016555b505050565b6000808361347786611333565b6134819190613bb8565b9050600061349e6103e86108798661349860125490565b9061215b565b9091111595945050505050565b60008060008060006134bc86611a94565b73ffffffffffffffffffffffffffffffffffffffff8d166000908152600a6020526040902054949950929750909550935091506134f9908761228c565b73ffffffffffffffffffffffffffffffffffffffff89166000908152600a6020908152604080832093909355600990522054613535908661228c565b73ffffffffffffffffffffffffffffffffffffffff808a1660009081526009602052604080822093909355908916815220546135719085612213565b73ffffffffffffffffffffffffffffffffffffffff88166000908152600960205260409020556135a183826137b7565b8673ffffffffffffffffffffffffffffffffffffffff168873ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef8460405161360091815260200190565b60405180910390a35050505050505050565b600080600080600061362386611a94565b73ffffffffffffffffffffffffffffffffffffffff8d1660009081526009602052604090205494995092975090955093509150613660908661228c565b73ffffffffffffffffffffffffffffffffffffffff808a16600090815260096020908152604080832094909455918a168152600a90915220546136a39083612213565b73ffffffffffffffffffffffffffffffffffffffff88166000908152600a60209081526040808320939093556009905220546135719085612213565b60008060008060006136f086611a94565b73ffffffffffffffffffffffffffffffffffffffff8d166000908152600a60205260409020549499509297509095509350915061372d908761228c565b73ffffffffffffffffffffffffffffffffffffffff89166000908152600a6020908152604080832093909355600990522054613660908661228c565b600080600080600061377a86611a94565b73ffffffffffffffffffffffffffffffffffffffff8d1660009081526009602052604090205494995092975090955093509150613535908661228c565b6013546137c4908361228c565b6013556014546137d49082612213565b6014555050565b600060208083528351808285015260005b81811015613808578581018301518582016040015282016137ec565b5060006040828601015260407fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f8301168501019250505092915050565b73ffffffffffffffffffffffffffffffffffffffff8116811461179757600080fd5b6000806040838503121561387c57600080fd5b823561388781613847565b946020939093013593505050565b6000602082840312156138a757600080fd5b5035919050565b801515811461179757600080fd5b600080604083850312156138cf57600080fd5b82356138da81613847565b915060208301356138ea816138ae565b809150509250929050565b60008060006060848603121561390a57600080fd5b833561391581613847565b9250602084013561392581613847565b929592945050506040919091013590565b6000806040838503121561394957600080fd5b8235915060208301356138ea816138ae565b60006020828403121561396d57600080fd5b8135610a2881613847565b60008060006060848603121561398d57600080fd5b505081359360208301359350604090920135919050565b6000602082840312156139b657600080fd5b8135610a28816138ae565b600080604083850312156139d457600080fd5b82356139df81613847565b915060208301356138ea81613847565b600181811c90821680613a0357607f821691505b602082108103613a3c577f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b50919050565b60008060408385031215613a5557600080fd5b8251613a6081613847565b60208401519092506138ea816138ae565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b60007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8203613b0057613b00613aa0565b5060010190565b600060208284031215613b1957600080fd5b8151610a28816138ae565b8181038181111561085357610853613aa0565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fd5b808202811582820484141761085357610853613aa0565b600082613bb3577f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b500490565b8082018082111561085357610853613aa056fe45524332303a207472616e7366657220616d6f756e74206578636565647320616c6c6f77616e636545524332303a2064656372656173656420616c6c6f77616e63652062656c6f77207a65726fa2646970667358221220469953e3ef301a25df580c9c1d69f0cac9f9cbdb0a7a8113219dd76cdb0add8464736f6c63430008110033
Deployed ByteCode
0x608060405234801561001057600080fd5b50600436106103365760003560e01c80638da5cb5b116101b2578063d4780e36116100f9578063e742806a116100a2578063f2cc0c181161007c578063f2cc0c181461076e578063f2fde38b14610781578063f84354f114610794578063fbf9bc84146107a757600080fd5b8063e742806a14610732578063e9cabe7f14610745578063ed9442f61461076557600080fd5b8063d9af257b116100d3578063d9af257b146106c0578063dd62ed3e146106c9578063e6375d3e1461070f57600080fd5b8063d4780e3614610652578063d5de6ede1461068d578063d8264920146106a057600080fd5b8063a901d15c1161015b578063c2264c6a11610135578063c2264c6a14610609578063c542eccc14610637578063ccc399091461063f57600080fd5b8063a901d15c146105d0578063a9059cbb146105e3578063adf18693146105f657600080fd5b806395d89b411161018c57806395d89b41146105ad57806397a9d560146105b5578063a457c2d7146105bd57600080fd5b80638da5cb5b1461057e578063941abdc11461059c57806394e10784146105a557600080fd5b80633526c0bd116102815780634fd89f9b1161022a5780636c146d9b116102045780636c146d9b146105525780636f9fedfb1461055a57806370a0823114610563578063715018a61461057657600080fd5b80634fd89f9b146105175780635a2e2f471461051f5780636b9f69b41461053257600080fd5b8063481c6a751161025b578063481c6a75146104b65780634e6fd6c4146104d45780634fbee193146104f457600080fd5b80633526c0bd1461047d57806339509351146104905780634549b039146104a357600080fd5b8063149b3bfa116102e357806323b872dd116102bd57806323b872dd146104385780632d8381191461044b578063313ce5671461045e57600080fd5b8063149b3bfa146103d857806318160ddd1461041d5780631fd8985e1461042557600080fd5b80631190216011610314578063119021601461039357806313114a9d146103bb578063141f3be2146103c357600080fd5b806306fdde031461033b578063089fe6aa14610359578063095ea7b314610370575b600080fd5b6103436107b4565b60405161035091906137db565b60405180910390f35b61036260175481565b604051908152602001610350565b61038361037e366004613869565b610842565b6040519015158152602001610350565b6103a66103a1366004613895565b610859565b60408051928352602083019190915201610350565b601454610362565b6103d66103d13660046138bc565b610898565b005b6002546103f89073ffffffffffffffffffffffffffffffffffffffff1681565b60405173ffffffffffffffffffffffffffffffffffffffff9091168152602001610350565b601254610362565b6103d6610433366004613895565b6108f6565b6103836104463660046138f5565b610903565b610362610459366004613895565b610979565b60115461046b9060ff1681565b60405160ff9091168152602001610350565b6103d661048b3660046138bc565b610a2f565b61038361049e366004613869565b610b64565b6103626104b1366004613936565b610ba7565b60015473ffffffffffffffffffffffffffffffffffffffff166103f8565b601f546103f89073ffffffffffffffffffffffffffffffffffffffff1681565b61038361050236600461395b565b600d6020526000908152604090205460ff1681565b6103d6610c4c565b6103d661052d36600461395b565b610d1f565b6004546103f89073ffffffffffffffffffffffffffffffffffffffff1681565b6103d661131f565b61036260165481565b61036261057136600461395b565b611333565b6103d66113b9565b60005473ffffffffffffffffffffffffffffffffffffffff166103f8565b61036260195481565b6103626113cb565b6103436113ee565b6103a66113fb565b6103836105cb366004613869565b6115b1565b6103d66105de366004613895565b61160d565b6103836105f1366004613869565b61179a565b6103d66106043660046138bc565b6117a7565b61061c610617366004613978565b611805565b60408051938452602084019290925290820152606001610350565b6103d6611841565b6103d661064d36600461395b565b6119e0565b610665610660366004613895565b611a94565b604080519586526020860194909452928401919091526060830152608082015260a001610350565b6103d661069b3660046139a4565b611ae0565b6005546103f89073ffffffffffffffffffffffffffffffffffffffff1681565b610362601d5481565b6103626106d73660046139c1565b73ffffffffffffffffffffffffffffffffffffffff9182166000908152600b6020908152604080832093909416825291909152205490565b61038361071d36600461395b565b600c6020526000908152604090205460ff1681565b6103d6610740366004613869565b611b19565b6003546103f89073ffffffffffffffffffffffffffffffffffffffff1681565b61036260185481565b6103d661077c36600461395b565b611ba4565b6103d661078f36600461395b565b611dba565b6103d66107a236600461395b565b611e6e565b6008546103839060ff1681565b600f80546107c1906139ef565b80601f01602080910402602001604051908101604052809291908181526020018280546107ed906139ef565b801561083a5780601f1061080f5761010080835404028352916020019161083a565b820191906000526020600020905b81548152906001019060200180831161081d57829003601f168201915b505050505081565b600061084f3384846122ce565b5060015b92915050565b600080600061087f6019546108796016548761215b90919063ffffffff16565b90612119565b9050600061088d858361228c565b959194509092505050565b6108a0612482565b73ffffffffffffffffffffffffffffffffffffffff91909116600090815260076020526040902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0016911515919091179055565b6108fe612482565b601d55565b6000610910848484612529565b61096f843361096a85604051806060016040528060288152602001613bcc6028913973ffffffffffffffffffffffffffffffffffffffff8a166000908152600b602090815260408083203384529091529020549190612e12565b6122ce565b5060019392505050565b6000601354821115610a12576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602a60248201527f416d6f756e74206d757374206265206c657373207468616e20746f74616c207260448201527f65666c656374696f6e730000000000000000000000000000000000000000000060648201526084015b60405180910390fd5b6000610a1c6113cb565b9050610a288382612119565b9392505050565b60005473ffffffffffffffffffffffffffffffffffffffff16331480610a82575060025473ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16145b610a8b57600080fd5b73ffffffffffffffffffffffffffffffffffffffff8216600090815260066020526040902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001682158015919091179091558190610b11575073ffffffffffffffffffffffffffffffffffffffff82166000908152600c602052604090205460ff16155b15610b1f57610b1f82611ba4565b80158015610b52575073ffffffffffffffffffffffffffffffffffffffff82166000908152600c602052604090205460ff165b15610b6057610b6082611e6e565b5050565b336000818152600b6020908152604080832073ffffffffffffffffffffffffffffffffffffffff87168452909152812054909161084f91859061096a9086612213565b6000601254831115610c15576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601f60248201527f416d6f756e74206d757374206265206c657373207468616e20737570706c79006044820152606401610a09565b81610c33576000610c2584611a94565b509294506108539350505050565b6000610c3e84611a94565b509194506108539350505050565b600880547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00166001179055600354604080517f4fd89f9b000000000000000000000000000000000000000000000000000000008152905173ffffffffffffffffffffffffffffffffffffffff90921691634fd89f9b9160048082019260009290919082900301818387803b158015610ce357600080fd5b505af1925050508015610cf4575060015b50600880547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00169055565b610d27612e66565b6040517f82b7b50000000000000000000000000000000000000000000000000000000000815260206004820152600960248201527f504f4f4c5f4d474d5400000000000000000000000000000000000000000000006044820152600090819073ffffffffffffffffffffffffffffffffffffffff8416906382b7b500906064016040805180830381865afa158015610dc3573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610de79190613a42565b9150915080610e52576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601260248201527f436f6e7472616374206e6f7420666f756e6400000000000000000000000000006044820152606401610a09565b6002805473ffffffffffffffffffffffffffffffffffffffff8085167fffffffffffffffffffffffff000000000000000000000000000000000000000090921682179092556000908152600d60205260409081902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00166001179055517f82b7b500000000000000000000000000000000000000000000000000000000008152908416906382b7b50090610f3c9060040160208082526011908201527f4d414444524553535f434f4e5452414354000000000000000000000000000000604082015260600190565b6040805180830381865afa158015610f58573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610f7c9190613a42565b909250905080610fe8576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601260248201527f436f6e7472616374206e6f7420666f756e6400000000000000000000000000006044820152606401610a09565b6003805473ffffffffffffffffffffffffffffffffffffffff8085167fffffffffffffffffffffffff000000000000000000000000000000000000000090921682179092556000908152600d60205260409081902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00166001179055517f82b7b500000000000000000000000000000000000000000000000000000000008152908416906382b7b500906110d2906004016020808252600e908201527f554e49535741505f524f55544552000000000000000000000000000000000000604082015260600190565b6040805180830381865afa1580156110ee573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906111129190613a42565b90925090508061117e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601260248201527f436f6e7472616374206e6f7420666f756e6400000000000000000000000000006044820152606401610a09565b600580547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff848116919091179091556040517f82b7b50000000000000000000000000000000000000000000000000000000000815260206004820152600e60248201527f45524332305f434f4e54524143540000000000000000000000000000000000006044820152908416906382b7b500906064016040805180830381865afa158015611246573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061126a9190613a42565b9092509050806112d6576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601260248201527f436f6e7472616374206e6f7420666f756e6400000000000000000000000000006044820152606401610a09565b50600480547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff9290921691909117905550565b611327612482565b6113316000612ee7565b565b73ffffffffffffffffffffffffffffffffffffffff81166000908152600c602052604081205460ff161561138a575073ffffffffffffffffffffffffffffffffffffffff166000908152600a602052604090205490565b73ffffffffffffffffffffffffffffffffffffffff821660009081526009602052604090205461085390610979565b6113c1612e66565b6113316000612f5e565b60008060006113d86113fb565b90925090506113e78282612119565b9250505090565b601080546107c1906139ef565b6013546012546000918291825b600e54811015611581578260096000600e848154811061142a5761142a613a71565b600091825260208083209091015473ffffffffffffffffffffffffffffffffffffffff16835282019290925260400190205411806114af575081600a6000600e848154811061147b5761147b613a71565b600091825260208083209091015473ffffffffffffffffffffffffffffffffffffffff168352820192909252604001902054115b156114c557601354601254945094505050509091565b61151860096000600e84815481106114df576114df613a71565b600091825260208083209091015473ffffffffffffffffffffffffffffffffffffffff168352820192909252604001902054849061228c565b925061156d600a6000600e848154811061153457611534613a71565b600091825260208083209091015473ffffffffffffffffffffffffffffffffffffffff168352820192909252604001902054839061228c565b91508061157981613acf565b915050611408565b5060125460135461159191612119565b8210156115a8576013546012549350935050509091565b90939092509050565b600061084f338461096a85604051806060016040528060258152602001613bf460259139336000908152600b6020908152604080832073ffffffffffffffffffffffffffffffffffffffff8d1684529091529020549190612e12565b611615612e66565b600880547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00166001179055600480546002546040517f095ea7b300000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff9182169381019390935260248301849052169063095ea7b3906044016020604051808303816000875af11580156116bd573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906116e19190613b07565b506002546040517fa901d15c0000000000000000000000000000000000000000000000000000000081526004810183905273ffffffffffffffffffffffffffffffffffffffff9091169063a901d15c90602401600060405180830381600087803b15801561174e57600080fd5b505af1158015611762573d6000803e3d6000fd5b5050600880547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00169055506117979050611841565b50565b600061084f338484612529565b6117af612482565b73ffffffffffffffffffffffffffffffffffffffff919091166000908152600d6020526040902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0016911515919091179055565b6000808080611814878661215b565b90506000611822878761215b565b90506000611830838361228c565b929992985090965090945050505050565b60085460ff1661133157600880547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00166001179055600254604080517f7334cccd000000000000000000000000000000000000000000000000000000008152905173ffffffffffffffffffffffffffffffffffffffff90921691637334cccd9160048082019260009290919082900301818387803b1580156118e257600080fd5b505af11580156118f6573d6000803e3d6000fd5b50505050600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663cea050156040518163ffffffff1660e01b8152600401600060405180830381600087803b15801561196457600080fd5b505af1925050508015611975575060015b50600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663b651ae176040518163ffffffff1660e01b8152600401600060405180830381600087803b158015610ce357600080fd5b6119e8612482565b73ffffffffffffffffffffffffffffffffffffffff8116611a8b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602b60248201527f4d616e61676561626c653a206e6577206d616e6167657220697320746865207a60448201527f65726f20616464726573730000000000000000000000000000000000000000006064820152608401610a09565b61179781612ee7565b6000806000806000806000611aa888610859565b915091506000611ab66113cb565b90506000806000611ac88c8686611805565b919e909d50909b509599509397509395505050505050565b611ae8612482565b600880547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0016911515919091179055565b60025473ffffffffffffffffffffffffffffffffffffffff163314611b9a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600e60248201527f4e6f7420617574686f72697a65640000000000000000000000000000000000006044820152606401610a09565b610b608282612fd3565b60005473ffffffffffffffffffffffffffffffffffffffff16331480611bf7575060025473ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16145b611c0057600080fd5b73ffffffffffffffffffffffffffffffffffffffff81166000908152600c602052604090205460ff1615611c90576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601b60248201527f4163636f756e7420697320616c7265616479206578636c7564656400000000006044820152606401610a09565b73ffffffffffffffffffffffffffffffffffffffff811660009081526009602052604090205415611d115773ffffffffffffffffffffffffffffffffffffffff8116600090815260096020526040902054611cea90610979565b73ffffffffffffffffffffffffffffffffffffffff82166000908152600a60205260409020555b73ffffffffffffffffffffffffffffffffffffffff166000818152600c6020526040812080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00166001908117909155600e805491820181559091527fbb7b4a454dc3493923482f07822329ed19e8244eff582cc204f8554c3620c3fd0180547fffffffffffffffffffffffff0000000000000000000000000000000000000000169091179055565b611dc2612e66565b73ffffffffffffffffffffffffffffffffffffffff8116611e65576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201527f64647265737300000000000000000000000000000000000000000000000000006064820152608401610a09565b61179781612f5e565b60005473ffffffffffffffffffffffffffffffffffffffff16331480611ec1575060025473ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16145b611eca57600080fd5b73ffffffffffffffffffffffffffffffffffffffff81166000908152600c602052604090205460ff16611f59576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601b60248201527f4163636f756e7420697320616c726561647920696e636c7564656400000000006044820152606401610a09565b60005b600e54811015610b60578173ffffffffffffffffffffffffffffffffffffffff16600e8281548110611f9057611f90613a71565b60009182526020909120015473ffffffffffffffffffffffffffffffffffffffff160361210757600e8054611fc790600190613b24565b81548110611fd757611fd7613a71565b600091825260209091200154600e805473ffffffffffffffffffffffffffffffffffffffff909216918390811061201057612010613a71565b600091825260208083209190910180547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff9485161790559184168152600a82526040808220829055600c9092522080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00169055600e8054806120ab576120ab613b37565b60008281526020902081017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff90810180547fffffffffffffffffffffffff00000000000000000000000000000000000000001690550190555050565b8061211181613acf565b915050611f5c565b6000610a2883836040518060400160405280601a81526020017f536166654d6174683a206469766973696f6e206279207a65726f0000000000008152506131fe565b60008260000361216d57506000610853565b60006121798385613b66565b9050826121868583613b7d565b14610a28576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602160248201527f536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f60448201527f77000000000000000000000000000000000000000000000000000000000000006064820152608401610a09565b6000806122208385613bb8565b905083811015610a28576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601b60248201527f536166654d6174683a206164646974696f6e206f766572666c6f7700000000006044820152606401610a09565b6000610a2883836040518060400160405280601e81526020017f536166654d6174683a207375627472616374696f6e206f766572666c6f770000815250612e12565b73ffffffffffffffffffffffffffffffffffffffff8316612370576040517f08c379a0000000000000000000000000000000000000000000000000000000008152602060048201526024808201527f45524332303a20617070726f76652066726f6d20746865207a65726f2061646460448201527f72657373000000000000000000000000000000000000000000000000000000006064820152608401610a09565b73ffffffffffffffffffffffffffffffffffffffff8216612413576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602260248201527f45524332303a20617070726f766520746f20746865207a65726f20616464726560448201527f73730000000000000000000000000000000000000000000000000000000000006064820152608401610a09565b73ffffffffffffffffffffffffffffffffffffffff8381166000818152600b602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92591015b60405180910390a3505050565b60015473ffffffffffffffffffffffffffffffffffffffff163314611331576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602560248201527f4d616e61676561626c653a2063616c6c6572206973206e6f7420746865206d6160448201527f6e616765720000000000000000000000000000000000000000000000000000006064820152608401610a09565b73ffffffffffffffffffffffffffffffffffffffff83166125cc576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602560248201527f45524332303a207472616e736665722066726f6d20746865207a65726f20616460448201527f64726573730000000000000000000000000000000000000000000000000000006064820152608401610a09565b73ffffffffffffffffffffffffffffffffffffffff821661266f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602360248201527f45524332303a207472616e7366657220746f20746865207a65726f206164647260448201527f65737300000000000000000000000000000000000000000000000000000000006064820152608401610a09565b600081116126ff576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602960248201527f5472616e7366657220616d6f756e74206d75737420626520677265617465722060448201527f7468616e207a65726f00000000000000000000000000000000000000000000006064820152608401610a09565b73ffffffffffffffffffffffffffffffffffffffff831660009081526007602052604090205460ff1615801561275b575073ffffffffffffffffffffffffffffffffffffffff821660009081526007602052604090205460ff16155b6127c1576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600b60248201527f506f6f6c2062616e6e65640000000000000000000000000000000000000000006044820152606401610a09565b73ffffffffffffffffffffffffffffffffffffffff83166000908152600d6020526040902054819060ff1615801561281f575073ffffffffffffffffffffffffffffffffffffffff83166000908152600d602052604090205460ff16155b801561282e575060085460ff16155b15612e0157600880547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0016600117905573ffffffffffffffffffffffffffffffffffffffff841660009081526006602052604090205460ff161561291357600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16637334cccd6040518163ffffffff1660e01b8152600401600060405180830381600087803b1580156128f657600080fd5b505af115801561290a573d6000803e3d6000fd5b50505050612b38565b73ffffffffffffffffffffffffffffffffffffffff831660009081526006602052604090205460ff1615612b3857600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16637334cccd6040518163ffffffff1660e01b8152600401600060405180830381600087803b1580156129ab57600080fd5b505af11580156129bf573d6000803e3d6000fd5b50505050600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663cea050156040518163ffffffff1660e01b8152600401600060405180830381600087803b158015612a2d57600080fd5b505af1925050508015612a3e575060015b50600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663b651ae176040518163ffffffff1660e01b8152600401600060405180830381600087803b158015612aa957600080fd5b505af1925050508015612aba575060015b50600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16634fd89f9b6040518163ffffffff1660e01b8152600401600060405180830381600087803b158015612b2557600080fd5b505af1925050508015612b36575060015b505b6000612b556019546108796017548561215b90919063ffffffff16565b9050612b61828261228c565b6002546040517f444809f90000000000000000000000000000000000000000000000000000000081526004810184905291935073ffffffffffffffffffffffffffffffffffffffff169063444809f990602401600060405180830381600087803b158015612bce57600080fd5b505af1158015612be2573d6000803e3d6000fd5b5050600254612c0b925087915073ffffffffffffffffffffffffffffffffffffffff1683613246565b6000612c286019546108796018548661215b90919063ffffffff16565b9050612c34838261228c565b6003546040517fe3e9f3e90000000000000000000000000000000000000000000000000000000081526004810184905291945073ffffffffffffffffffffffffffffffffffffffff169063e3e9f3e990602401600060405180830381600087803b158015612ca157600080fd5b505af1158015612cb5573d6000803e3d6000fd5b5050600354612cde925088915073ffffffffffffffffffffffffffffffffffffffff1683613246565b73ffffffffffffffffffffffffffffffffffffffff861660009081526006602052604090205460ff1680612d38575073ffffffffffffffffffffffffffffffffffffffff851660009081526006602052604090205460ff16155b15612dd657612d4a8584601d5461346a565b612dd6576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602f60248201527f526563697069656e742063616e277420686f6c64206d6f7265207468616e206c60448201527f696d69742070657263656e7461676500000000000000000000000000000000006064820152608401610a09565b5050600880547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001690555b612e0c848483613246565b50505050565b60008184841115612e50576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a0991906137db565b506000612e5d8486613b24565b95945050505050565b60005473ffffffffffffffffffffffffffffffffffffffff163314611331576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610a09565b6001805473ffffffffffffffffffffffffffffffffffffffff8381167fffffffffffffffffffffffff0000000000000000000000000000000000000000831681179093556040519116919082907f697e4e68d3879b0dd3414a88905117bac8f0a54b0cd8e7779f909bf1a1cf568390600090a35050565b6000805473ffffffffffffffffffffffffffffffffffffffff8381167fffffffffffffffffffffffff0000000000000000000000000000000000000000831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b73ffffffffffffffffffffffffffffffffffffffff8216613050576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601f60248201527f45524332303a206d696e7420746f20746865207a65726f2061646472657373006044820152606401610a09565b601c5460009060ff166130b6576000613076601a54601b5461211990919063ffffffff16565b9050613082838261215b565b601c80547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0016600117905591506130cb9050565b6130c86130c16113cb565b839061215b565b90505b6013546130d89082612213565b6013556012546130e89083612213565b60125573ffffffffffffffffffffffffffffffffffffffff83166000908152600c602052604090205460ff16156131705773ffffffffffffffffffffffffffffffffffffffff83166000908152600a60205260409020546131499083612213565b73ffffffffffffffffffffffffffffffffffffffff84166000908152600a60205260409020555b73ffffffffffffffffffffffffffffffffffffffff83166000908152600960205260409020546131a09082612213565b73ffffffffffffffffffffffffffffffffffffffff84166000818152600960205260408082209390935591519091907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef906124759086815260200190565b60008183613239576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a0991906137db565b506000612e5d8486613b7d565b73ffffffffffffffffffffffffffffffffffffffff83166000908152600d602052604090205460ff168061329f575073ffffffffffffffffffffffffffffffffffffffff82166000908152600d602052604090205460ff165b156132b05760168054601555600090555b73ffffffffffffffffffffffffffffffffffffffff83166000908152600c602052604090205460ff16801561330b575073ffffffffffffffffffffffffffffffffffffffff82166000908152600c602052604090205460ff16155b156133205761331b8383836134ab565b613400565b73ffffffffffffffffffffffffffffffffffffffff83166000908152600c602052604090205460ff1615801561337b575073ffffffffffffffffffffffffffffffffffffffff82166000908152600c602052604090205460ff165b1561338b5761331b838383613612565b73ffffffffffffffffffffffffffffffffffffffff83166000908152600c602052604090205460ff1680156133e5575073ffffffffffffffffffffffffffffffffffffffff82166000908152600c602052604090205460ff165b156133f55761331b8383836136df565b613400838383613769565b73ffffffffffffffffffffffffffffffffffffffff83166000908152600d602052604090205460ff1680613459575073ffffffffffffffffffffffffffffffffffffffff82166000908152600d602052604090205460ff165b15613465576015546016555b505050565b6000808361347786611333565b6134819190613bb8565b9050600061349e6103e86108798661349860125490565b9061215b565b9091111595945050505050565b60008060008060006134bc86611a94565b73ffffffffffffffffffffffffffffffffffffffff8d166000908152600a6020526040902054949950929750909550935091506134f9908761228c565b73ffffffffffffffffffffffffffffffffffffffff89166000908152600a6020908152604080832093909355600990522054613535908661228c565b73ffffffffffffffffffffffffffffffffffffffff808a1660009081526009602052604080822093909355908916815220546135719085612213565b73ffffffffffffffffffffffffffffffffffffffff88166000908152600960205260409020556135a183826137b7565b8673ffffffffffffffffffffffffffffffffffffffff168873ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef8460405161360091815260200190565b60405180910390a35050505050505050565b600080600080600061362386611a94565b73ffffffffffffffffffffffffffffffffffffffff8d1660009081526009602052604090205494995092975090955093509150613660908661228c565b73ffffffffffffffffffffffffffffffffffffffff808a16600090815260096020908152604080832094909455918a168152600a90915220546136a39083612213565b73ffffffffffffffffffffffffffffffffffffffff88166000908152600a60209081526040808320939093556009905220546135719085612213565b60008060008060006136f086611a94565b73ffffffffffffffffffffffffffffffffffffffff8d166000908152600a60205260409020549499509297509095509350915061372d908761228c565b73ffffffffffffffffffffffffffffffffffffffff89166000908152600a6020908152604080832093909355600990522054613660908661228c565b600080600080600061377a86611a94565b73ffffffffffffffffffffffffffffffffffffffff8d1660009081526009602052604090205494995092975090955093509150613535908661228c565b6013546137c4908361228c565b6013556014546137d49082612213565b6014555050565b600060208083528351808285015260005b81811015613808578581018301518582016040015282016137ec565b5060006040828601015260407fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f8301168501019250505092915050565b73ffffffffffffffffffffffffffffffffffffffff8116811461179757600080fd5b6000806040838503121561387c57600080fd5b823561388781613847565b946020939093013593505050565b6000602082840312156138a757600080fd5b5035919050565b801515811461179757600080fd5b600080604083850312156138cf57600080fd5b82356138da81613847565b915060208301356138ea816138ae565b809150509250929050565b60008060006060848603121561390a57600080fd5b833561391581613847565b9250602084013561392581613847565b929592945050506040919091013590565b6000806040838503121561394957600080fd5b8235915060208301356138ea816138ae565b60006020828403121561396d57600080fd5b8135610a2881613847565b60008060006060848603121561398d57600080fd5b505081359360208301359350604090920135919050565b6000602082840312156139b657600080fd5b8135610a28816138ae565b600080604083850312156139d457600080fd5b82356139df81613847565b915060208301356138ea81613847565b600181811c90821680613a0357607f821691505b602082108103613a3c577f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b50919050565b60008060408385031215613a5557600080fd5b8251613a6081613847565b60208401519092506138ea816138ae565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b60007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8203613b0057613b00613aa0565b5060010190565b600060208284031215613b1957600080fd5b8151610a28816138ae565b8181038181111561085357610853613aa0565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fd5b808202811582820484141761085357610853613aa0565b600082613bb3577f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b500490565b8082018082111561085357610853613aa056fe45524332303a207472616e7366657220616d6f756e74206578636565647320616c6c6f77616e636545524332303a2064656372656173656420616c6c6f77616e63652062656c6f77207a65726fa2646970667358221220469953e3ef301a25df580c9c1d69f0cac9f9cbdb0a7a8113219dd76cdb0add8464736f6c63430008110033