More Info
Private Name Tags
ContractCreator
TokenTracker
Latest 25 from a total of 221 transactions
Transaction Hash |
Method
|
Block
|
From
|
To
|
|||||
---|---|---|---|---|---|---|---|---|---|
Approve | 18612204 | 449 days ago | IN | 0 ETH | 0.000774 | ||||
Approve | 16962874 | 680 days ago | IN | 0 ETH | 0.0004615 | ||||
Approve | 15857492 | 835 days ago | IN | 0 ETH | 0.00041501 | ||||
Approve | 15814184 | 841 days ago | IN | 0 ETH | 0.00048118 | ||||
Approve | 15743480 | 851 days ago | IN | 0 ETH | 0.00066152 | ||||
Approve | 15725434 | 853 days ago | IN | 0 ETH | 0.00061204 | ||||
Approve | 15693157 | 858 days ago | IN | 0 ETH | 0.00057658 | ||||
Approve | 15693132 | 858 days ago | IN | 0 ETH | 0.00065739 | ||||
Approve | 15678900 | 860 days ago | IN | 0 ETH | 0.00141756 | ||||
Approve | 15667934 | 862 days ago | IN | 0 ETH | 0.00100025 | ||||
Approve | 15667897 | 862 days ago | IN | 0 ETH | 0.00064848 | ||||
Approve | 15663480 | 862 days ago | IN | 0 ETH | 0.0002122 | ||||
Approve | 15649165 | 864 days ago | IN | 0 ETH | 0.00056542 | ||||
Approve | 15648019 | 864 days ago | IN | 0 ETH | 0.00075481 | ||||
Approve | 15646804 | 864 days ago | IN | 0 ETH | 0.00113404 | ||||
Approve | 15646523 | 865 days ago | IN | 0 ETH | 0.0021947 | ||||
Approve | 15646308 | 865 days ago | IN | 0 ETH | 0.0009348 | ||||
Approve | 15645461 | 865 days ago | IN | 0 ETH | 0.00044778 | ||||
Approve | 15644869 | 865 days ago | IN | 0 ETH | 0.00056155 | ||||
Approve | 15644852 | 865 days ago | IN | 0 ETH | 0.00025017 | ||||
Approve | 15644761 | 865 days ago | IN | 0 ETH | 0.00026123 | ||||
Approve | 15644688 | 865 days ago | IN | 0 ETH | 0.0004844 | ||||
Approve | 15644375 | 865 days ago | IN | 0 ETH | 0.00051453 | ||||
Claim | 15644056 | 865 days ago | IN | 0 ETH | 0.00062802 | ||||
Claim | 15644048 | 865 days ago | IN | 0 ETH | 0.00278306 |
Latest 25 internal transactions (View All)
Advanced mode:
Parent Transaction Hash | Block |
From
|
To
|
|||
---|---|---|---|---|---|---|
15702978 | 857 days ago | 0.00343819 ETH | ||||
15702978 | 857 days ago | 0.00515729 ETH | ||||
15702978 | 857 days ago | 0.00859548 ETH | ||||
15678907 | 860 days ago | 0.00331624 ETH | ||||
15678907 | 860 days ago | 0.00497437 ETH | ||||
15678907 | 860 days ago | 0.00829062 ETH | ||||
15662037 | 862 days ago | 0.00395016 ETH | ||||
15662037 | 862 days ago | 0.00592524 ETH | ||||
15662037 | 862 days ago | 0.00987541 ETH | ||||
15648956 | 864 days ago | 0.00388295 ETH | ||||
15648956 | 864 days ago | 0.00582443 ETH | ||||
15648956 | 864 days ago | 0.00970738 ETH | ||||
15646891 | 864 days ago | 0.00663035 ETH | ||||
15646891 | 864 days ago | 0.00994553 ETH | ||||
15646891 | 864 days ago | 0.01657588 ETH | ||||
15644877 | 865 days ago | 0.00523377 ETH | ||||
15644877 | 865 days ago | 0.00785066 ETH | ||||
15644877 | 865 days ago | 0.01308443 ETH | ||||
15644855 | 865 days ago | 0.00653627 ETH | ||||
15644855 | 865 days ago | 0.0098044 ETH | ||||
15644855 | 865 days ago | 0.01634067 ETH | ||||
15644691 | 865 days ago | 0.00775818 ETH | ||||
15644691 | 865 days ago | 0.01163727 ETH | ||||
15644691 | 865 days ago | 0.01939545 ETH | ||||
15644529 | 865 days ago | 0.00737715 ETH |
Loading...
Loading
Contract Source Code Verified (Exact Match)
Contract Name:
SonOfTsuka
Compiler Version
v0.8.4+commit.c7e474f2
Optimization Enabled:
No with 200 runs
Other Settings:
default evmVersion
Contract Source Code (Solidity Standard Json-Input format)
// SPDX-License-Identifier:MIT /* WEB: https://www.sonoftsuka.com TWITTER: https://twitter.com/sonoftsuka TG: https://t.me/sonoftsukerc */ pragma solidity ^0.8.4; abstract contract Context { function _msgSender() internal view virtual returns (address) { return msg.sender; } } interface IERC20 { function totalSupply() external view returns (uint256); function balanceOf(address account) external view returns (uint256); function transfer(address recipient, uint256 amount) external returns (bool); function allowance(address owner, address spender) external view returns (uint256); function approve(address spender, uint256 amount) external returns (bool); function transferFrom(address sender, address recipient, uint256 amount) external returns (bool); event Transfer(address indexed from, address indexed to, uint256 value); event Approval(address indexed owner, address indexed spender, uint256 value); } contract ERC20 is Context, IERC20 { mapping(address => uint256) private _balances; mapping(address => mapping(address => uint256)) private _allowances; uint256 private _totalSupply; string private _name; string private _symbol; /** * @dev Sets the values for {name} and {symbol}. * * The default value of {decimals} is 18. To select a different value for * {decimals} you should overload it. * * All two of these values are immutable: they can only be set once during * construction. */ constructor(string memory name_, string memory symbol_) { _name = name_; _symbol = symbol_; } /** * @dev Returns the name of the token. */ function name() public view virtual returns (string memory) { return _name; } /** * @dev Returns the symbol of the token, usually a shorter version of the * name. */ function symbol() public view virtual returns (string memory) { return _symbol; } /** * @dev Returns the number of decimals used to get its user representation. * For example, if `decimals` equals `2`, a balance of `505` tokens should * be displayed to a user as `5.05` (`505 / 10 ** 2`). * * Tokens usually opt for a value of 18, imitating the relationship between * Ether and Wei. This is the value {ERC20} uses, unless this function is * overridden; * * NOTE: This information is only used for _display_ purposes: it in * no way affects any of the arithmetic of the contract, including * {IERC20-balanceOf} and {IERC20-transfer}. */ function decimals() public view virtual returns (uint8) { return 18; } /** * @dev See {IERC20-totalSupply}. */ function totalSupply() public view virtual override returns (uint256) { return _totalSupply; } /** * @dev See {IERC20-balanceOf}. */ function balanceOf(address account) public view virtual override returns (uint256) { return _balances[account]; } /** * @dev See {IERC20-transfer}. * * Requirements: * * - `to` cannot be the zero address. * - the caller must have a balance of at least `amount`. */ function transfer(address to, uint256 amount) public virtual override returns (bool) { address owner = _msgSender(); _transfer(owner, to, amount); return true; } /** * @dev See {IERC20-allowance}. */ function allowance(address owner, address spender) public view virtual override returns (uint256) { return _allowances[owner][spender]; } /** * @dev See {IERC20-approve}. * * NOTE: If `amount` is the maximum `uint256`, the allowance is not updated on * `transferFrom`. This is semantically equivalent to an infinite approval. * * Requirements: * * - `spender` cannot be the zero address. */ function approve(address spender, uint256 amount) public virtual override returns (bool) { address owner = _msgSender(); _approve(owner, spender, amount); return true; } /** * @dev See {IERC20-transferFrom}. * * Emits an {Approval} event indicating the updated allowance. This is not * required by the EIP. See the note at the beginning of {ERC20}. * * NOTE: Does not update the allowance if the current allowance * is the maximum `uint256`. * * Requirements: * * - `from` and `to` cannot be the zero address. * - `from` must have a balance of at least `amount`. * - the caller must have allowance for ``from``'s tokens of at least * `amount`. */ function transferFrom( address from, address to, uint256 amount ) public virtual override returns (bool) { address spender = _msgSender(); _spendAllowance(from, spender, amount); _transfer(from, to, amount); return true; } /** * @dev Atomically increases the allowance granted to `spender` by the caller. * * This is an alternative to {approve} that can be used as a mitigation for * problems described in {IERC20-approve}. * * Emits an {Approval} event indicating the updated allowance. * * Requirements: * * - `spender` cannot be the zero address. */ function increaseAllowance(address spender, uint256 addedValue) public virtual returns (bool) { address owner = _msgSender(); _approve(owner, spender, allowance(owner, spender) + addedValue); return true; } /** * @dev Atomically decreases the allowance granted to `spender` by the caller. * * This is an alternative to {approve} that can be used as a mitigation for * problems described in {IERC20-approve}. * * Emits an {Approval} event indicating the updated allowance. * * Requirements: * * - `spender` cannot be the zero address. * - `spender` must have allowance for the caller of at least * `subtractedValue`. */ function decreaseAllowance(address spender, uint256 subtractedValue) public virtual returns (bool) { address owner = _msgSender(); uint256 currentAllowance = allowance(owner, spender); require(currentAllowance >= subtractedValue, "decreased allowance below zero"); unchecked { _approve(owner, spender, currentAllowance - subtractedValue); } return true; } /** * @dev Moves `amount` of tokens from `from` to `to`. * * This internal function is equivalent to {transfer}, and can be used to * e.g. implement automatic token fees, slashing mechanisms, etc. * * Emits a {Transfer} event. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `from` must have a balance of at least `amount`. */ function _transfer( address from, address to, uint256 amount ) internal virtual { require(from != address(0), "tansfer from the zero address"); require(to != address(0), "transfer to the zero address"); _beforeTokenTransfer(from, to, amount); uint256 fromBalance = _balances[from]; require(fromBalance >= amount, "transfer amount exceeds balance"); unchecked { _balances[from] = fromBalance - amount; // Overflow not possible: the sum of all balances is capped by totalSupply, and the sum is preserved by // decrementing then incrementing. _balances[to] += amount; } emit Transfer(from, to, amount); _afterTokenTransfer(from, to, amount); } /** @dev Creates `amount` tokens and assigns them to `account`, increasing * the total supply. * * Emits a {Transfer} event with `from` set to the zero address. * * Requirements: * * - `account` cannot be the zero address. */ function _mint(address account, uint256 amount) internal virtual { require(account != address(0), "ERC20: mint to the zero address"); _beforeTokenTransfer(address(0), account, amount); _totalSupply += amount; unchecked { // Overflow not possible: balance + amount is at most totalSupply + amount, which is checked above. _balances[account] += amount; } emit Transfer(address(0), account, amount); _afterTokenTransfer(address(0), account, amount); } /** * @dev Destroys `amount` tokens from `account`, reducing the * total supply. * * Emits a {Transfer} event with `to` set to the zero address. * * Requirements: * * - `account` cannot be the zero address. * - `account` must have at least `amount` tokens. */ function _burn(address account, uint256 amount) internal virtual { require(account != address(0), "ERC20: burn from the zero address"); _beforeTokenTransfer(account, address(0), amount); uint256 accountBalance = _balances[account]; require(accountBalance >= amount, "ERC20: burn amount exceeds balance"); unchecked { _balances[account] = accountBalance - amount; // Overflow not possible: amount <= accountBalance <= totalSupply. _totalSupply -= amount; } emit Transfer(account, address(0), amount); _afterTokenTransfer(account, address(0), amount); } /** * @dev Sets `amount` as the allowance of `spender` over the `owner` s tokens. * * This internal function is equivalent to `approve`, and can be used to * e.g. set automatic allowances for certain subsystems, etc. * * Emits an {Approval} event. * * Requirements: * * - `owner` cannot be the zero address. * - `spender` cannot be the zero address. */ function _approve( address owner, address spender, uint256 amount ) internal virtual { require(owner != address(0), "ERC20: approve from the zero address"); require(spender != address(0), "ERC20: approve to the zero address"); _allowances[owner][spender] = amount; emit Approval(owner, spender, amount); } /** * @dev Updates `owner` s allowance for `spender` based on spent `amount`. * * Does not update the allowance amount in case of infinite allowance. * Revert if not enough allowance is available. * * Might emit an {Approval} event. */ function _spendAllowance( address owner, address spender, uint256 amount ) internal virtual { uint256 currentAllowance = allowance(owner, spender); if (currentAllowance != type(uint256).max) { require(currentAllowance >= amount, "ERC20: insufficient allowance"); unchecked { _approve(owner, spender, currentAllowance - amount); } } } /** * @dev Hook that is called before any transfer of tokens. This includes * minting and burning. * * Calling conditions: * * - when `from` and `to` are both non-zero, `amount` of ``from``'s tokens * will be transferred to `to`. * - when `from` is zero, `amount` tokens will be minted for `to`. * - when `to` is zero, `amount` of ``from``'s tokens will be burned. * - `from` and `to` are never both zero. * * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks]. */ function _beforeTokenTransfer( address from, address to, uint256 amount ) internal virtual {} /** * @dev Hook that is called after any transfer of tokens. This includes * minting and burning. * * Calling conditions: * * - when `from` and `to` are both non-zero, `amount` of ``from``'s tokens * has been transferred to `to`. * - when `from` is zero, `amount` tokens have been minted for `to`. * - when `to` is zero, `amount` of ``from``'s tokens have been burned. * - `from` and `to` are never both zero. * * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks]. */ function _afterTokenTransfer( address from, address to, uint256 amount ) internal virtual {} } library SafeMath { function add(uint256 a, uint256 b) internal pure returns (uint256) { uint256 c = a + b; require(c >= a, "SafeMath: addition overflow"); return c; } function sub(uint256 a, uint256 b) internal pure returns (uint256) { return sub(a, b, "SafeMath: subtraction overflow"); } function sub(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) { require(b <= a, errorMessage); uint256 c = a - b; return c; } function mul(uint256 a, uint256 b) internal pure returns (uint256) { if (a == 0) { return 0; } uint256 c = a * b; require(c / a == b, "SafeMath: multiplication overflow"); return c; } function div(uint256 a, uint256 b) internal pure returns (uint256) { return div(a, b, "SafeMath: division by zero"); } function div(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) { require(b > 0, errorMessage); uint256 c = a / b; return c; } } contract Ownable is Context { address private _owner; address private _previousOwner; event OwnershipTransferred(address indexed previousOwner, address indexed newOwner); constructor () { address msgSender = _msgSender(); _owner = msgSender; emit OwnershipTransferred(address(0), msgSender); } function owner() public view returns (address) { return _owner; } modifier onlyOwner() { require(_owner == _msgSender(), "Ownable: caller is not the owner"); _; } function renounceOwnership() public virtual onlyOwner { emit OwnershipTransferred(_owner, address(0)); _owner = address(0); } function transferOwnership(address newOwner) public virtual onlyOwner { require(newOwner != address(0), "Ownable: new owner is the zero address"); _transferOwnership(newOwner); } function _transferOwnership(address newOwner) internal virtual { address oldOwner = _owner; _owner = newOwner; emit OwnershipTransferred(oldOwner, newOwner); } } interface IUniswapV2Factory { event PairCreated(address indexed token0, address indexed token1, address pair, uint); function feeTo() external view returns (address); function feeToSetter() external view returns (address); function getPair(address tokenA, address tokenB) external view returns (address pair); function allPairs(uint) external view returns (address pair); function allPairsLength() external view returns (uint); function createPair(address tokenA, address tokenB) external returns (address pair); function setFeeTo(address) external; function setFeeToSetter(address) external; } interface IUniswapV2Router02 { function swapExactTokensForETHSupportingFeeOnTransferTokens( uint amountIn, uint amountOutMin, address[] calldata path, address to, uint deadline ) external; function swapExactTokensForTokensSupportingFeeOnTransferTokens( uint amountIn, uint amountOutMin, address[] calldata path, address to, uint deadline ) external; function factory() external pure returns (address); function WETH() external pure returns (address); function addLiquidity( address tokenA, address tokenB, uint amountADesired, uint amountBDesired, uint amountAMin, uint amountBMin, address to, uint deadline ) external returns (uint amountA, uint amountB, uint liquidity); } interface IUniswapV2Pair { event Approval(address indexed owner, address indexed spender, uint value); event Transfer(address indexed from, address indexed to, uint value); function name() external pure returns (string memory); function symbol() external pure returns (string memory); function decimals() external pure returns (uint8); function totalSupply() external view returns (uint); function balanceOf(address owner) external view returns (uint); function allowance(address owner, address spender) external view returns (uint); function approve(address spender, uint value) external returns (bool); function transfer(address to, uint value) external returns (bool); function transferFrom(address from, address to, uint value) external returns (bool); function DOMAIN_SEPARATOR() external view returns (bytes32); function PERMIT_TYPEHASH() external pure returns (bytes32); function nonces(address owner) external view returns (uint); function permit(address owner, address spender, uint value, uint deadline, uint8 v, bytes32 r, bytes32 s) external; event Mint(address indexed sender, uint amount0, uint amount1); event Burn(address indexed sender, uint amount0, uint amount1, address indexed to); event Swap( address indexed sender, uint amount0In, uint amount1In, uint amount0Out, uint amount1Out, address indexed to ); event Sync(uint112 reserve0, uint112 reserve1); function MINIMUM_LIQUIDITY() external pure returns (uint); function factory() external view returns (address); function token0() external view returns (address); function token1() external view returns (address); function getReserves() external view returns (uint112 reserve0, uint112 reserve1, uint32 blockTimestampLast); function price0CumulativeLast() external view returns (uint); function price1CumulativeLast() external view returns (uint); function kLast() external view returns (uint); function mint(address to) external returns (uint liquidity); function burn(address to) external returns (uint amount0, uint amount1); function swap(uint amount0Out, uint amount1Out, address to, bytes calldata data) external; function skim(address to) external; function sync() external; function initialize(address, address) external; } contract SonOfTsuka is Context, ERC20, Ownable { using SafeMath for uint256; mapping (address => bool) private _isExcludedFromFee; mapping (address => bool) private _isExcludedFromSellLock; mapping (address => bool) private bots; mapping (address => uint) private cooldown; mapping (address => uint) private sellLock; uint256 private _swapTokensAt; uint256 private _maxTokensToSwapForFees; address payable private _feeAddrWallet1; address payable private _feeAddrWallet2; IUniswapV2Router02 private uniswapV2Router; address private uniswapV2Pair; IERC20 private rewardToken; IERC20 private stableToken; IUniswapV2Pair rewardTokenPair; uint private tradingOpenTime; bool private inSwap = false; bool private swapEnabled = false; bool private cooldownEnabled = false; uint256 private _maxWalletAmount = SUPPLY; MeditationRewards public meditationRewards; uint256 private dividendsFees = 2; uint256 private marketingFees = 2; uint256 private slippageDiscount = 20; uint256 private SUPPLY = 1e9 * 10**18; struct PairReserves { uint256 stableReservesPrevious; uint256 rewardReservesPrevious; uint256 blockNumberPrevious; uint256 stableReserves; uint256 rewardReserves; uint256 blockNumber; } PairReserves private rewardPairReserves; uint256 private peakPrice; uint256 private dipPercent; uint256 private lastDipPayout; uint256 private constant FACTOR = 1e20; event DipPayout(uint256 amount, uint256 price, uint256 peakPrice, uint256 dipPercent); constructor () ERC20("SonOfTsuka", "$SOT") { _feeAddrWallet1 = payable(0x9549fC2bF891A8BC103e49657A3816C565B74947); _feeAddrWallet2 = payable(0x7cC26593F13085c6CC8cC8981689964eBd5a3E5C); _isExcludedFromFee[owner()] = true; _isExcludedFromFee[address(this)] = true; _isExcludedFromFee[_feeAddrWallet1] = true; _isExcludedFromFee[_feeAddrWallet2] = true; _isExcludedFromSellLock[owner()] = true; _isExcludedFromSellLock[address(this)] = true; uniswapV2Router = IUniswapV2Router02(0x7a250d5630B4cF539739dF2C5dAcb4c659F2488D); rewardToken = IERC20(0xc5fB36dd2fb59d3B98dEfF88425a3F425Ee469eD); stableToken = IERC20(0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48); rewardTokenPair = IUniswapV2Pair(IUniswapV2Factory(uniswapV2Router.factory()).getPair(address(rewardToken), address(stableToken))); updateRewardPairReserves(); meditationRewards = new MeditationRewards(payable(address(this)), rewardToken, stableToken); // exclude from receiving dividends meditationRewards.excludeFromDividends(address(meditationRewards)); meditationRewards.excludeFromDividends(address(this)); meditationRewards.excludeFromDividends(owner()); _mint(owner(), SUPPLY); } function updateMeditationRewards(address newMeditationRewards) external onlyOwner { meditationRewards = MeditationRewards(newMeditationRewards); } function updateSlippageDiscount(uint256 discount) external onlyOwner { require(discount <= 100); slippageDiscount = discount; } function recoverFunds(address tokenAddress, uint256 tokenAmount) external onlyOwner { require(tokenAddress != address(rewardToken)); IERC20(tokenAddress).transfer(owner(), tokenAmount); if(address(this).balance > 0) { (bool success,) = owner().call{value: address(this).balance}(""); require(success); } } function updateRewardPairReserves() private { if(rewardPairReserves.blockNumber == block.number) { return; } rewardPairReserves.blockNumberPrevious = rewardPairReserves.blockNumber; rewardPairReserves.stableReservesPrevious = rewardPairReserves.stableReserves; rewardPairReserves.rewardReservesPrevious = rewardPairReserves.rewardReserves; (uint256 r0, uint256 r1,) = rewardTokenPair.getReserves(); address token0 = rewardTokenPair.token0(); if(token0 == address(stableToken)) { rewardPairReserves.stableReserves = r0; rewardPairReserves.rewardReserves = r1; } else { rewardPairReserves.stableReserves = r1; rewardPairReserves.rewardReserves = r0; } if(rewardPairReserves.blockNumber == 0) { rewardPairReserves.blockNumberPrevious = block.number; rewardPairReserves.stableReservesPrevious = rewardPairReserves.stableReserves; rewardPairReserves.rewardReservesPrevious = rewardPairReserves.rewardReserves; } rewardPairReserves.blockNumber = block.number; } function getCurrentPrice(int256 tokenDelta) private view returns (uint256) { if(uniswapV2Pair == address(0)) { return 0; } (uint256 rStable, uint256 rToken,) = IUniswapV2Pair(uniswapV2Pair).getReserves(); address token0 = IUniswapV2Pair(uniswapV2Pair).token0(); if(token0 != address(stableToken)) { uint256 temp = rStable; rStable = rToken; rToken = temp; } uint256 k = rStable * rToken; rToken = uint256(int256(rToken) + tokenDelta); rStable = k / rToken; return rStable * FACTOR / rToken; } function updatePeakPriceAndDipPercent(int256 tokenDelta) private { uint256 price = getCurrentPrice(tokenDelta); if(price == 0) { return; } if(price > peakPrice) { peakPrice = price; } dipPercent = 100 - price * 100 / peakPrice; if(dipPercent >= 50) { uint256 amount = rewardToken.balanceOf(address(this)) * 50 / 100; emit DipPayout(amount, price, peakPrice, dipPercent); rewardToken.approve(address(meditationRewards), amount); meditationRewards.distributeDividendsFromOwner(amount); peakPrice = price; dipPercent = 0; lastDipPayout = amount; } } function getData(address account) external view returns (uint256[] memory dividendInfo, uint256 dipPoolBalance, uint256 dip, uint256 lastDipPayoutAmount) { dividendInfo = meditationRewards.getDividendInfo(account); dipPoolBalance = rewardToken.balanceOf(address(this)); dip = dipPercent; lastDipPayoutAmount = lastDipPayout; } function claim() external { meditationRewards.claimDividends(msg.sender); } function setSwapTokensAt(uint256 amount) external onlyOwner() { _swapTokensAt = amount; } function setMaxTokensToSwapForFees(uint256 amount) external onlyOwner() { _maxTokensToSwapForFees = amount; } function setCooldownEnabled(bool onoff) external onlyOwner() { cooldownEnabled = onoff; } function excludeFromSellLock(address user) external onlyOwner() { _isExcludedFromSellLock[user] = true; } function _transfer(address from, address to, uint256 amount) internal override { require(from != address(0), "transfer from the zero address"); require(to != address(0), "transfer to the zero address"); if(from == to) { super._transfer(from, to, amount); return; } if (from != owner() && to != owner()) { require(tradingOpenTime > 0 || from == address(this)); require(!bots[from] && !bots[to]); if ( from == uniswapV2Pair && to != address(uniswapV2Router) && !_isExcludedFromFee[to] && cooldownEnabled) { require(balanceOf(to) + amount <= _maxWalletAmount); // Cooldown require(cooldown[to] < block.timestamp); cooldown[to] = block.timestamp + (15 seconds); if(!_isExcludedFromSellLock[to] && sellLock[to] == 0) { uint elapsed = block.timestamp - tradingOpenTime; if(elapsed < 30) { uint256 sellLockDuration = (30 - elapsed) * 120; sellLock[to] = block.timestamp + sellLockDuration; } } } else if(!_isExcludedFromSellLock[from]) { require(sellLock[from] < block.timestamp, "wait"); } uint256 swapAmount = balanceOf(address(this)); if (swapAmount >= _swapTokensAt && !inSwap && from != uniswapV2Pair && swapEnabled) { _swapFees(slippageDiscount); } } if(from != address(uniswapV2Router) && to == uniswapV2Pair) { meditationRewards.claimDividends(from); } uint256 fee = dividendsFees + marketingFees; if(tradingOpenTime == 0 || inSwap) { fee = 0; } if(_isExcludedFromFee[from] || _isExcludedFromFee[to]) { fee = 0; } if(from == address(uniswapV2Router) || to == address(uniswapV2Router)) { fee = 0; } if(fee > 0) { uint256 feeAmount = fee * amount / 100; super._transfer(from, address(this), feeAmount); amount -= feeAmount; } super._transfer(from, to, amount); meditationRewards.setBalance(payable(from), balanceOf(from)); meditationRewards.setBalance(payable(to), balanceOf(to)); updateRewardPairReserves(); int256 tokenDelta = 0; if(from == uniswapV2Pair) { tokenDelta = -int256(amount); } else if(to == uniswapV2Pair) { tokenDelta = int256(amount); } updatePeakPriceAndDipPercent(tokenDelta); } function swapTokensForEth(uint256 tokenAmount) private { address[] memory path = new address[](3); path[0] = address(this); path[1] = address(stableToken); path[2] = uniswapV2Router.WETH(); _approve(address(this), address(uniswapV2Router), tokenAmount); try uniswapV2Router.swapExactTokensForETHSupportingFeeOnTransferTokens( tokenAmount, 0, path, address(this), block.timestamp ) {} catch {} } function sendETHToFee(uint256 amount) private { uint256 to1 = amount.mul(60).div(100); _feeAddrWallet1.transfer(to1); _feeAddrWallet2.transfer(amount - to1); } function openTrading() external onlyOwner() { require(tradingOpenTime == 0, "already open"); _approve(address(this), address(uniswapV2Router), SUPPLY); IERC20(stableToken).approve(address(uniswapV2Router), type(uint).max); uniswapV2Pair = IUniswapV2Factory(uniswapV2Router.factory()).createPair(address(this), address(stableToken)); meditationRewards.excludeFromDividends(address(uniswapV2Router)); meditationRewards.excludeFromDividends(address(uniswapV2Pair)); _isExcludedFromSellLock[address(uniswapV2Router)] = true; _isExcludedFromSellLock[address(uniswapV2Pair)] = true; _isExcludedFromFee[address(uniswapV2Router)]; uniswapV2Router.addLiquidity( address(stableToken), address(this), stableToken.balanceOf(address(this)), balanceOf(address(this)), 0, 0, owner(), block.timestamp ); swapEnabled = true; cooldownEnabled = true; _maxWalletAmount = SUPPLY * 2 / 100; tradingOpenTime = block.timestamp; _swapTokensAt = SUPPLY * 1 / 1000; _maxTokensToSwapForFees = SUPPLY * 2 / 1000; IERC20(uniswapV2Pair).approve(address(uniswapV2Router), type(uint).max); updateRewardPairReserves(); updatePeakPriceAndDipPercent(0); } function setBots(address[] memory bots_) public onlyOwner { for (uint i = 0; i < bots_.length; i++) { bots[bots_[i]] = true; meditationRewards.excludeFromDividends(bots_[i]); } } function delBot(address notbot) public onlyOwner { bots[notbot] = false; } function removeStrictWalletLimit() public onlyOwner { _maxWalletAmount = SUPPLY; } receive() external payable {} function swapFees(uint256 discount) external onlyOwner { _swapFees(discount); } function _swapFees(uint256 discount) private { inSwap = true; uint256 tokenBalance = balanceOf(address(this)); uint256 swapAmount = tokenBalance; if(swapAmount > _maxTokensToSwapForFees) { swapAmount = _maxTokensToSwapForFees; } uint256 amountForMarketing = swapAmount * marketingFees / (marketingFees + dividendsFees); uint256 amountForDividends = swapAmount - amountForMarketing; swapTokensForEth(amountForMarketing); sendETHToFee(address(this).balance); uint256 price = getCurrentPrice(0); uint256 stableOut = amountForDividends * price / FACTOR; uint256 stableReserves = rewardPairReserves.stableReserves; uint256 rewardReserves = rewardPairReserves.rewardReserves; if(block.number == rewardPairReserves.blockNumber) { stableReserves = rewardPairReserves.stableReservesPrevious; rewardReserves = rewardPairReserves.rewardReservesPrevious; } uint256 minimumAmountOut = stableOut * rewardReserves / stableReserves; minimumAmountOut = minimumAmountOut * (100 - discount) / 100; uint256 balanceBefore = rewardToken.balanceOf(address(this)); address[] memory path = new address[](3); path[0] = address(this); path[1] = address(stableToken); path[2] = address(rewardToken); _approve(address(this), address(uniswapV2Router), amountForDividends); try uniswapV2Router.swapExactTokensForTokensSupportingFeeOnTransferTokens( amountForDividends, minimumAmountOut, path, address(this), block.timestamp ) {} catch {} uint256 tokensGained = rewardToken.balanceOf(address(this)) - balanceBefore; if(tokensGained > 0) { uint256 toDivs = tokensGained / 2; rewardToken.approve(address(meditationRewards), toDivs); meditationRewards.distributeDividendsFromOwner(toDivs); } inSwap = false; } } /** * @title SafeMathUint * @dev Math operations with safety checks that revert on error */ library SafeMathUint { function toInt256Safe(uint256 a) internal pure returns (int256) { int256 b = int256(a); require(b >= 0); return b; } } /** * @title SafeMathInt * @dev Math operations for int256 with overflow safety checks. */ library SafeMathInt { int256 private constant MIN_INT256 = int256(1) << 255; int256 private constant MAX_INT256 = ~(int256(1) << 255); /** * @dev Multiplies two int256 variables and fails on overflow. */ function mul(int256 a, int256 b) internal pure returns (int256) { int256 c = a * b; // Detect overflow when multiplying MIN_INT256 with -1 require(c != MIN_INT256 || (a & MIN_INT256) != (b & MIN_INT256)); require((b == 0) || (c / b == a)); return c; } /** * @dev Division of two int256 variables and fails on overflow. */ function div(int256 a, int256 b) internal pure returns (int256) { // Prevent overflow when dividing MIN_INT256 by -1 require(b != -1 || a != MIN_INT256); // Solidity already throws when dividing by 0. return a / b; } /** * @dev Subtracts two int256 variables and fails on overflow. */ function sub(int256 a, int256 b) internal pure returns (int256) { int256 c = a - b; require((b >= 0 && c <= a) || (b < 0 && c > a)); return c; } /** * @dev Adds two int256 variables and fails on overflow. */ function add(int256 a, int256 b) internal pure returns (int256) { int256 c = a + b; require((b >= 0 && c >= a) || (b < 0 && c < a)); return c; } /** * @dev Converts to absolute value, and fails on overflow. */ function abs(int256 a) internal pure returns (int256) { require(a != MIN_INT256); return a < 0 ? -a : a; } function toUint256Safe(int256 a) internal pure returns (uint256) { require(a >= 0); return uint256(a); } } contract DividendPayingToken is ERC20, Ownable { using SafeMath for uint256; using SafeMathUint for uint256; using SafeMathInt for int256; uint256 constant internal magnitude = 2**128; uint256 internal magnifiedDividendPerShare; uint256 internal lastAmount; mapping(address => int256) internal magnifiedDividendCorrections; mapping(address => uint256) internal withdrawnDividends; uint256 public totalDividendsDistributed; event DividendsDistributed( address indexed from, uint256 weiAmount ); event DividendWithdrawn( address indexed to, uint256 weiAmount ); constructor(string memory _name, string memory _symbol) ERC20(_name, _symbol) { } function distributeDividends(uint256 amount) internal { require(totalSupply() > 0); if (amount > 0) { magnifiedDividendPerShare = magnifiedDividendPerShare.add( (amount).mul(magnitude) / totalSupply() ); emit DividendsDistributed(msg.sender, amount); totalDividendsDistributed = totalDividendsDistributed.add(amount); } } function dividendOf(address _owner) public view returns(uint256) { return withdrawableDividendOf(_owner); } function withdrawableDividendOf(address _owner) public view returns(uint256) { return accumulativeDividendOf(_owner).sub(withdrawnDividends[_owner]); } function withdrawnDividendOf(address _owner) public view returns(uint256) { return withdrawnDividends[_owner]; } function accumulativeDividendOf(address _owner) public view returns(uint256) { return magnifiedDividendPerShare.mul(balanceOf(_owner)).toInt256Safe() .add(magnifiedDividendCorrections[_owner]).toUint256Safe() / magnitude; } function _transfer(address from, address to, uint256 value) internal virtual override { require(false); int256 _magCorrection = magnifiedDividendPerShare.mul(value).toInt256Safe(); magnifiedDividendCorrections[from] = magnifiedDividendCorrections[from].add(_magCorrection); magnifiedDividendCorrections[to] = magnifiedDividendCorrections[to].sub(_magCorrection); } function _mint(address account, uint256 value) internal override { super._mint(account, value); magnifiedDividendCorrections[account] = magnifiedDividendCorrections[account] .sub( (magnifiedDividendPerShare.mul(value)).toInt256Safe() ); } function _burn(address account, uint256 value) internal override { super._burn(account, value); magnifiedDividendCorrections[account] = magnifiedDividendCorrections[account] .add( (magnifiedDividendPerShare.mul(value)).toInt256Safe() ); } function _setBalance(address account, uint256 newBalance) internal { uint256 currentBalance = balanceOf(account); if(newBalance > currentBalance) { uint256 mintAmount = newBalance.sub(currentBalance); _mint(account, mintAmount); } else if(newBalance < currentBalance) { uint256 burnAmount = currentBalance.sub(newBalance); _burn(account, burnAmount); } } } contract MeditationRewards is DividendPayingToken { using SafeMath for uint256; using SafeMathInt for int256; SonOfTsuka public immutable token; IERC20 public immutable rewardToken; IERC20 public immutable stableToken; mapping (address => bool) public excludedFromDividends; mapping (address => uint256) public lastClaimTimes; uint256 public vestingDuration; struct AutoClaimInfo { address account; uint256 time; } AutoClaimInfo[] private autoClaims; uint256 private autoClaimIndex; mapping (address => uint256) autoClaimAccountIndex; event ExcludeFromDividends(address indexed account); event Claim(address indexed account, uint256 factor, uint256 amount, uint256 toMarketing, uint256 toDivs); modifier onlyOwnerOfOwner() { require(Ownable(owner()).owner() == _msgSender(), "nope"); _; } constructor(address payable owner, IERC20 _rewardToken, IERC20 _stableToken) DividendPayingToken("MeditatinRewards", "$MEDITATE") { rewardToken = _rewardToken; stableToken = _stableToken; token = SonOfTsuka(owner); vestingDuration = 10 days; transferOwnership(owner); AutoClaimInfo memory autoClaimInfo; autoClaims.push(autoClaimInfo); autoClaimIndex = 1; } bool private silenceWarning; function _transfer(address, address, uint256) internal override { silenceWarning = true; require(false, "nah"); } function excludeFromDividends(address account) external onlyOwner { if(excludedFromDividends[account]) { return; } excludedFromDividends[account] = true; _setBalance(account, 0); emit ExcludeFromDividends(account); } function getDividendInfo(address account) external view returns (uint256[] memory dividendInfo) { uint256 withdrawableDividends = withdrawableDividendOf(account); uint256 totalDividends = accumulativeDividendOf(account); uint256 claimFactor = getAccountClaimFactor(account); uint256 vestingPeriodStart = lastClaimTimes[account]; uint256 vestingPeriodEnd = vestingPeriodStart > 0 ? vestingPeriodStart + vestingDuration : 0; dividendInfo = new uint256[](11); dividendInfo[0] = withdrawableDividends; dividendInfo[1] = totalDividends; dividendInfo[2] = claimFactor; dividendInfo[3] = vestingPeriodStart; dividendInfo[4] = vestingPeriodEnd; dividendInfo[5] = balanceOf(account); if(totalSupply() > 0) { dividendInfo[6] = dividendInfo[5] * 10000 / totalSupply(); } dividendInfo[7] = autoClaimAccountIndex[account]; AutoClaimInfo storage autoClaimInfo = autoClaims[dividendInfo[7]]; dividendInfo[8] = uint256(uint160(autoClaimInfo.account)); dividendInfo[9] = autoClaimInfo.time; dividendInfo[10] = autoClaimIndex; } function setBalance(address account, uint256 newBalance) public onlyOwner { if(excludedFromDividends[account]) { return; } _setBalance(account, newBalance); //Set this so vesting calculations work after the account get a balance if(newBalance > 0 && lastClaimTimes[account] == 0) { setLastClaimTime(account); } autoClaim(1); } uint256 public constant WITHDRAW_MAX_FACTOR = 10000; function getAccountClaimFactor(address account) public view returns (uint256) { uint256 lastClaimTime = lastClaimTimes[account]; if(lastClaimTime == 0) { return 0; } uint256 elapsed = block.timestamp - lastClaimTime; uint256 factor; if(elapsed >= vestingDuration) { factor = WITHDRAW_MAX_FACTOR; } else { factor = WITHDRAW_MAX_FACTOR * elapsed / vestingDuration; } return factor; } function distributeDividendsFromOwner(uint256 amount) external onlyOwner { try rewardToken.transferFrom(owner(), address(this), amount) returns (bool success) { if(success) { distributeDividends(amount); } } catch { } } function claimDividends(address account) external onlyOwner returns (bool) { return _claimDividends(account); } function _claimDividends(address account) private returns (bool) { uint256 withdrawableDividend = withdrawableDividendOf(account); if(withdrawableDividend == 0) { setLastClaimTime(account); return true; } uint256 factor = getAccountClaimFactor(account); withdrawnDividends[account] = withdrawnDividends[account].add(withdrawableDividend); emit DividendWithdrawn(account, withdrawableDividend); uint256 vestedAmount = withdrawableDividend * factor / WITHDRAW_MAX_FACTOR; uint256 unvestedAmount = withdrawableDividend - vestedAmount; try rewardToken.transfer(account, vestedAmount) returns (bool success) { if(!success) { withdrawnDividends[account] = withdrawnDividends[account].sub(withdrawableDividend); return false; } } catch { withdrawnDividends[account] = withdrawnDividends[account].sub(withdrawableDividend); return false; } uint256 toMarketing = 0; uint256 toDivs = 0; if(unvestedAmount > 0) { toMarketing = unvestedAmount / 3; toDivs = unvestedAmount - toMarketing; try rewardToken.transfer(Ownable(owner()).owner(), toMarketing) returns (bool success) { if(!success) { distributeDividends(toMarketing); } } catch { distributeDividends(toMarketing); } distributeDividends(toDivs); } setLastClaimTime(account); emit Claim(account, factor, vestedAmount, toMarketing, toDivs); return true; } function setLastClaimTime(address account) private { lastClaimTimes[account] = block.timestamp; if(autoClaimAccountIndex[account] != 0) { delete autoClaims[autoClaimAccountIndex[account]]; } AutoClaimInfo memory autoClaimInfo; autoClaimInfo.account = account; autoClaimInfo.time = block.timestamp + vestingDuration; autoClaimAccountIndex[account] = autoClaims.length; autoClaims.push(autoClaimInfo); } function autoClaim(uint256 amount) public { uint256 iterations = 0; for(uint256 i = autoClaimIndex; i < autoClaims.length && iterations < amount; i++) { AutoClaimInfo storage autoClaimInfo = autoClaims[i]; if(autoClaimInfo.time > block.timestamp) { return; } if(autoClaimInfo.account != address(0)) { _claimDividends(autoClaimInfo.account); } autoClaimIndex++; iterations++; } } }
{ "optimizer": { "enabled": false, "runs": 200 }, "outputSelection": { "*": { "*": [ "evm.bytecode", "evm.deployedBytecode", "devdoc", "userdoc", "metadata", "abi" ] } }, "libraries": {} }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"spender","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"price","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"peakPrice","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"dipPercent","type":"uint256"}],"name":"DipPayout","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"spender","type":"address"}],"name":"allowance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"approve","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"claim","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"decimals","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"subtractedValue","type":"uint256"}],"name":"decreaseAllowance","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"notbot","type":"address"}],"name":"delBot","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"user","type":"address"}],"name":"excludeFromSellLock","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"getData","outputs":[{"internalType":"uint256[]","name":"dividendInfo","type":"uint256[]"},{"internalType":"uint256","name":"dipPoolBalance","type":"uint256"},{"internalType":"uint256","name":"dip","type":"uint256"},{"internalType":"uint256","name":"lastDipPayoutAmount","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"addedValue","type":"uint256"}],"name":"increaseAllowance","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"meditationRewards","outputs":[{"internalType":"contract MeditationRewards","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"openTrading","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"tokenAddress","type":"address"},{"internalType":"uint256","name":"tokenAmount","type":"uint256"}],"name":"recoverFunds","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"removeStrictWalletLimit","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address[]","name":"bots_","type":"address[]"}],"name":"setBots","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"onoff","type":"bool"}],"name":"setCooldownEnabled","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"setMaxTokensToSwapForFees","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"setSwapTokensAt","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"discount","type":"uint256"}],"name":"swapFees","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transfer","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transferFrom","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newMeditationRewards","type":"address"}],"name":"updateMeditationRewards","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"discount","type":"uint256"}],"name":"updateSlippageDiscount","outputs":[],"stateMutability":"nonpayable","type":"function"},{"stateMutability":"payable","type":"receive"}]
Contract Creation Code
60806040526000601660006101000a81548160ff0219169083151502179055506000601660016101000a81548160ff0219169083151502179055506000601660026101000a81548160ff021916908315150217905550601c5460175560026019556002601a556014601b556b033b2e3c9fd0803ce8000000601c553480156200008757600080fd5b506040518060400160405280600a81526020017f536f6e4f665473756b61000000000000000000000000000000000000000000008152506040518060400160405280600481526020017f24534f540000000000000000000000000000000000000000000000000000000081525081600390805190602001906200010c92919062000eb7565b5080600490805190602001906200012592919062000eb7565b50505060006200013a62000a8a60201b60201c565b905080600560006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508073ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a350739549fc2bf891a8bc103e49657a3816c565b74947600e60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550737cc26593f13085c6cc8cc8981689964ebd5a3e5c600f60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506001600760006200029962000a9260201b60201c565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055506001600760003073ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff021916908315150217905550600160076000600e60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff021916908315150217905550600160076000600f60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055506001600860006200044c62000a9260201b60201c565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055506001600860003073ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff021916908315150217905550737a250d5630b4cf539739df2c5dacb4c659f2488d601060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555073c5fb36dd2fb59d3b98deff88425a3f425ee469ed601260006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555073a0b86991c6218b36c1d19d4a2e9eb0ce3606eb48601360006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550601060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663c45a01556040518163ffffffff1660e01b815260040160206040518083038186803b1580156200065d57600080fd5b505afa15801562000672573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019062000698919062000fba565b73ffffffffffffffffffffffffffffffffffffffff1663e6a43905601260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16601360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff166040518363ffffffff1660e01b81526004016200071892919062001101565b60206040518083038186803b1580156200073157600080fd5b505afa15801562000746573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906200076c919062000fba565b601460006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550620007bc62000abc60201b60201c565b30601260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16601360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16604051620008119062000f48565b6200081f93929190620010c4565b604051809103906000f0801580156200083c573d6000803e3d6000fd5b50601860006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550601860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166331e79db0601860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff166040518263ffffffff1660e01b8152600401620008fc9190620010a7565b600060405180830381600087803b1580156200091757600080fd5b505af11580156200092c573d6000803e3d6000fd5b50505050601860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166331e79db0306040518263ffffffff1660e01b81526004016200098d9190620010a7565b600060405180830381600087803b158015620009a857600080fd5b505af1158015620009bd573d6000803e3d6000fd5b50505050601860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166331e79db062000a0f62000a9260201b60201c565b6040518263ffffffff1660e01b815260040162000a2d9190620010a7565b600060405180830381600087803b15801562000a4857600080fd5b505af115801562000a5d573d6000803e3d6000fd5b5050505062000a8462000a7562000a9260201b60201c565b601c5462000d3f60201b60201c565b6200138a565b600033905090565b6000600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b43601d60050154141562000ad05762000d3d565b601d60050154601d60020181905550601d60030154601d60000181905550601d60040154601d60010181905550600080601460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16630902f1ac6040518163ffffffff1660e01b815260040160606040518083038186803b15801562000b6957600080fd5b505afa15801562000b7e573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019062000ba4919062000fe6565b506dffffffffffffffffffffffffffff1691506dffffffffffffffffffffffffffff1691506000601460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16630dfe16816040518163ffffffff1660e01b815260040160206040518083038186803b15801562000c3457600080fd5b505afa15801562000c49573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019062000c6f919062000fba565b9050601360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16141562000ce25782601d6003018190555081601d6004018190555062000cf7565b81601d6003018190555082601d600401819055505b6000601d60050154141562000d2f5743601d60020181905550601d60030154601d60000181905550601d60040154601d600101819055505b43601d600501819055505050505b565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141562000db2576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040162000da9906200112e565b60405180910390fd5b62000dc66000838362000ead60201b60201c565b806002600082825462000dda91906200117e565b92505081905550806000808473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825401925050819055508173ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef8360405162000e8d919062001150565b60405180910390a362000ea96000838362000eb260201b60201c565b5050565b505050565b505050565b82805462000ec5906200127f565b90600052602060002090601f01602090048101928262000ee9576000855562000f35565b82601f1062000f0457805160ff191683800117855562000f35565b8280016001018555821562000f35579182015b8281111562000f3457825182559160200191906001019062000f17565b5b50905062000f44919062000f56565b5090565b6146cd806200737483390190565b5b8082111562000f7157600081600090555060010162000f57565b5090565b60008151905062000f86816200133c565b92915050565b60008151905062000f9d8162001356565b92915050565b60008151905062000fb48162001370565b92915050565b60006020828403121562000fcd57600080fd5b600062000fdd8482850162000f75565b91505092915050565b60008060006060848603121562000ffc57600080fd5b60006200100c8682870162000f8c565b93505060206200101f8682870162000f8c565b9250506040620010328682870162000fa3565b9150509250925092565b6200104781620011ef565b82525050565b6200105881620011db565b82525050565b620010698162001257565b82525050565b60006200107e601f836200116d565b91506200108b8262001313565b602082019050919050565b620010a1816200123d565b82525050565b6000602082019050620010be60008301846200104d565b92915050565b6000606082019050620010db60008301866200103c565b620010ea60208301856200105e565b620010f960408301846200105e565b949350505050565b60006040820190506200111860008301856200104d565b6200112760208301846200104d565b9392505050565b6000602082019050818103600083015262001149816200106f565b9050919050565b600060208201905062001167600083018462001096565b92915050565b600082825260208201905092915050565b60006200118b826200123d565b915062001198836200123d565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff03821115620011d057620011cf620012b5565b5b828201905092915050565b6000620011e8826200121d565b9050919050565b6000620011fc826200121d565b9050919050565b60006dffffffffffffffffffffffffffff82169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b600063ffffffff82169050919050565b600062001264826200126b565b9050919050565b600062001278826200121d565b9050919050565b600060028204905060018216806200129857607f821691505b60208210811415620012af57620012ae620012e4565b5b50919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f45524332303a206d696e7420746f20746865207a65726f206164647265737300600082015250565b6200134781620011db565b81146200135357600080fd5b50565b620013618162001203565b81146200136d57600080fd5b50565b6200137b8162001247565b81146200138757600080fd5b50565b615fda806200139a6000396000f3fe6080604052600436106101c65760003560e01c8063715018a6116100f7578063a457c2d711610095578063cd6ef3a411610064578063cd6ef3a414610626578063dd62ed3e1461064f578063f2fde38b1461068c578063f57d8ac1146106b5576101cd565b8063a457c2d71461056c578063a9059cbb146105a9578063b515566a146105e6578063c9567bf91461060f576101cd565b80637b4e8038116100d15780637b4e8038146104d65780638da5cb5b146104ff57806395d89b411461052a57806399ce371a14610555576101cd565b8063715018a61461046b5780637229006914610482578063729d8a87146104ad576101cd565b806338266b221161016457806353674ba61161013e57806353674ba6146103b357806358609754146103dc5780635932ead11461040557806370a082311461042e576101cd565b806338266b221461031f578063395093511461035f5780634e71d92d1461039c576101cd565b806323b872dd116101a057806323b872dd14610265578063273123b7146102a25780632a5bdc33146102cb578063313ce567146102f4576101cd565b806306fdde03146101d2578063095ea7b3146101fd57806318160ddd1461023a576101cd565b366101cd57005b600080fd5b3480156101de57600080fd5b506101e76106de565b6040516101f491906153e7565b60405180910390f35b34801561020957600080fd5b50610224600480360381019061021f9190614ca6565b610770565b60405161023191906153b1565b60405180910390f35b34801561024657600080fd5b5061024f610793565b60405161025c91906155a9565b60405180910390f35b34801561027157600080fd5b5061028c60048036038101906102879190614c57565b61079d565b60405161029991906153b1565b60405180910390f35b3480156102ae57600080fd5b506102c960048036038101906102c49190614bc9565b6107cc565b005b3480156102d757600080fd5b506102f260048036038101906102ed9190614bc9565b6108be565b005b34801561030057600080fd5b506103096109b0565b60405161031691906156bd565b60405180910390f35b34801561032b57600080fd5b5061034660048036038101906103419190614bc9565b6109b9565b6040516103569493929190615365565b60405180910390f35b34801561036b57600080fd5b5061038660048036038101906103819190614ca6565b610b30565b60405161039391906153b1565b60405180910390f35b3480156103a857600080fd5b506103b1610b67565b005b3480156103bf57600080fd5b506103da60048036038101906103d59190614e05565b610c17565b005b3480156103e857600080fd5b5061040360048036038101906103fe9190614ca6565b610cb8565b005b34801561041157600080fd5b5061042c60048036038101906104279190614d64565b610ecb565b005b34801561043a57600080fd5b5061045560048036038101906104509190614bc9565b610f7f565b60405161046291906155a9565b60405180910390f35b34801561047757600080fd5b50610480610fc7565b005b34801561048e57600080fd5b5061049761111f565b6040516104a491906153cc565b60405180910390f35b3480156104b957600080fd5b506104d460048036038101906104cf9190614e05565b611145565b005b3480156104e257600080fd5b506104fd60048036038101906104f89190614e05565b6111e6565b005b34801561050b57600080fd5b50610514611289565b6040516105219190615251565b60405180910390f35b34801561053657600080fd5b5061053f6112b3565b60405161054c91906153e7565b60405180910390f35b34801561056157600080fd5b5061056a611345565b005b34801561057857600080fd5b50610593600480360381019061058e9190614ca6565b6113e7565b6040516105a091906153b1565b60405180910390f35b3480156105b557600080fd5b506105d060048036038101906105cb9190614ca6565b61145e565b6040516105dd91906153b1565b60405180910390f35b3480156105f257600080fd5b5061060d60048036038101906106089190614ce2565b611481565b005b34801561061b57600080fd5b506106246116a0565b005b34801561063257600080fd5b5061064d60048036038101906106489190614bc9565b61202c565b005b34801561065b57600080fd5b5061067660048036038101906106719190614c1b565b612107565b60405161068391906155a9565b60405180910390f35b34801561069857600080fd5b506106b360048036038101906106ae9190614bc9565b61218e565b005b3480156106c157600080fd5b506106dc60048036038101906106d79190614e05565b6122a1565b005b6060600380546106ed90615abf565b80601f016020809104026020016040519081016040528092919081815260200182805461071990615abf565b80156107665780601f1061073b57610100808354040283529160200191610766565b820191906000526020600020905b81548152906001019060200180831161074957829003601f168201915b5050505050905090565b60008061077b612350565b9050610788818585612358565b600191505092915050565b6000600254905090565b6000806107a8612350565b90506107b5858285612523565b6107c08585856125af565b60019150509392505050565b6107d4612350565b73ffffffffffffffffffffffffffffffffffffffff16600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614610863576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161085a90615569565b60405180910390fd5b6000600960008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555050565b6108c6612350565b73ffffffffffffffffffffffffffffffffffffffff16600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614610955576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161094c90615569565b60405180910390fd5b6001600860008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555050565b60006012905090565b60606000806000601860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663b2e6819b866040518263ffffffff1660e01b8152600401610a1b9190615251565b60006040518083038186803b158015610a3357600080fd5b505afa158015610a47573d6000803e3d6000fd5b505050506040513d6000823e3d601f19601f82011682018060405250810190610a709190614d23565b9350601260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b8152600401610acd9190615251565b60206040518083038186803b158015610ae557600080fd5b505afa158015610af9573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610b1d9190614e2e565b9250602454915060255490509193509193565b600080610b3b612350565b9050610b5c818585610b4d8589612107565b610b579190615882565b612358565b600191505092915050565b601860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663c7e772ed336040518263ffffffff1660e01b8152600401610bc29190615251565b602060405180830381600087803b158015610bdc57600080fd5b505af1158015610bf0573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610c149190614d8d565b50565b610c1f612350565b73ffffffffffffffffffffffffffffffffffffffff16600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614610cae576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ca590615569565b60405180910390fd5b80600c8190555050565b610cc0612350565b73ffffffffffffffffffffffffffffffffffffffff16600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614610d4f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d4690615569565b60405180910390fd5b601260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415610daa57600080fd5b8173ffffffffffffffffffffffffffffffffffffffff1663a9059cbb610dce611289565b836040518363ffffffff1660e01b8152600401610dec92919061533c565b602060405180830381600087803b158015610e0657600080fd5b505af1158015610e1a573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610e3e9190614d8d565b506000471115610ec7576000610e52611289565b73ffffffffffffffffffffffffffffffffffffffff1647604051610e759061523c565b60006040518083038185875af1925050503d8060008114610eb2576040519150601f19603f3d011682016040523d82523d6000602084013e610eb7565b606091505b5050905080610ec557600080fd5b505b5050565b610ed3612350565b73ffffffffffffffffffffffffffffffffffffffff16600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614610f62576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f5990615569565b60405180910390fd5b80601660026101000a81548160ff02191690831515021790555050565b60008060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b610fcf612350565b73ffffffffffffffffffffffffffffffffffffffff16600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161461105e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161105590615569565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff16600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a36000600560006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550565b601860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b61114d612350565b73ffffffffffffffffffffffffffffffffffffffff16600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16146111dc576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111d390615569565b60405180910390fd5b80600d8190555050565b6111ee612350565b73ffffffffffffffffffffffffffffffffffffffff16600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161461127d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161127490615569565b60405180910390fd5b6112868161321c565b50565b6000600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b6060600480546112c290615abf565b80601f01602080910402602001604051908101604052809291908181526020018280546112ee90615abf565b801561133b5780601f106113105761010080835404028352916020019161133b565b820191906000526020600020905b81548152906001019060200180831161131e57829003601f168201915b5050505050905090565b61134d612350565b73ffffffffffffffffffffffffffffffffffffffff16600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16146113dc576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113d390615569565b60405180910390fd5b601c54601781905550565b6000806113f2612350565b905060006114008286612107565b905083811015611445576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161143c906154e9565b60405180910390fd5b6114528286868403612358565b60019250505092915050565b600080611469612350565b90506114768185856125af565b600191505092915050565b611489612350565b73ffffffffffffffffffffffffffffffffffffffff16600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614611518576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161150f90615569565b60405180910390fd5b60005b815181101561169c57600160096000848481518110611563577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b602002602001015173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff021916908315150217905550601860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166331e79db0838381518110611633577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60200260200101516040518263ffffffff1660e01b81526004016116579190615251565b600060405180830381600087803b15801561167157600080fd5b505af1158015611685573d6000803e3d6000fd5b50505050808061169490615b22565b91505061151b565b5050565b6116a8612350565b73ffffffffffffffffffffffffffffffffffffffff16600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614611737576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161172e90615569565b60405180910390fd5b60006015541461177c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161177390615509565b60405180910390fd5b6117ab30601060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16601c54612358565b601360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663095ea7b3601060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff167fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff6040518363ffffffff1660e01b815260040161184a92919061533c565b602060405180830381600087803b15801561186457600080fd5b505af1158015611878573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061189c9190614d8d565b50601060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663c45a01556040518163ffffffff1660e01b815260040160206040518083038186803b15801561190557600080fd5b505afa158015611919573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061193d9190614bf2565b73ffffffffffffffffffffffffffffffffffffffff1663c9c6539630601360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff166040518363ffffffff1660e01b8152600401611999929190615295565b602060405180830381600087803b1580156119b357600080fd5b505af11580156119c7573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906119eb9190614bf2565b601160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550601860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166331e79db0601060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff166040518263ffffffff1660e01b8152600401611aa89190615251565b600060405180830381600087803b158015611ac257600080fd5b505af1158015611ad6573d6000803e3d6000fd5b50505050601860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166331e79db0601160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff166040518263ffffffff1660e01b8152600401611b579190615251565b600060405180830381600087803b158015611b7157600080fd5b505af1158015611b85573d6000803e3d6000fd5b50505050600160086000601060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff021916908315150217905550600160086000601160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555060076000601060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a905050601060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663e8e33700601360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1630601360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b8152600401611da79190615251565b60206040518083038186803b158015611dbf57600080fd5b505afa158015611dd3573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611df79190614e2e565b611e0030610f7f565b600080611e0b611289565b426040518963ffffffff1660e01b8152600401611e2f9897969594939291906152be565b606060405180830381600087803b158015611e4957600080fd5b505af1158015611e5d573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611e819190614e57565b5050506001601660016101000a81548160ff0219169083151502179055506001601660026101000a81548160ff02191690831515021790555060646002601c54611ecb9190615909565b611ed591906158d8565b601781905550426015819055506103e86001601c54611ef49190615909565b611efe91906158d8565b600c819055506103e86002601c54611f169190615909565b611f2091906158d8565b600d81905550601160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663095ea7b3601060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff167fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff6040518363ffffffff1660e01b8152600401611fc592919061533c565b602060405180830381600087803b158015611fdf57600080fd5b505af1158015611ff3573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906120179190614d8d565b50612020613936565b61202a6000613bac565b565b612034612350565b73ffffffffffffffffffffffffffffffffffffffff16600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16146120c3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016120ba90615569565b60405180910390fd5b80601860006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b6000600160008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905092915050565b612196612350565b73ffffffffffffffffffffffffffffffffffffffff16600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614612225576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161221c90615569565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415612295576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161228c90615429565b60405180910390fd5b61229e81613e94565b50565b6122a9612350565b73ffffffffffffffffffffffffffffffffffffffff16600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614612338576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161232f90615569565b60405180910390fd5b606481111561234657600080fd5b80601b8190555050565b600033905090565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614156123c8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016123bf90615589565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415612438576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161242f90615449565b60405180910390fd5b80600160008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b9258360405161251691906155a9565b60405180910390a3505050565b600061252f8484612107565b90507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff81146125a9578181101561259b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612592906154a9565b60405180910390fd5b6125a88484848403612358565b5b50505050565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16141561261f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161261690615469565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141561268f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161268690615489565b60405180910390fd5b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614156126d3576126ce838383613f5a565b613217565b6126db611289565b73ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16141580156127495750612719611289565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614155b15612cce576000601554118061278a57503073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16145b61279357600080fd5b600960008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff161580156128375750600960008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16155b61284057600080fd5b601160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161480156128eb5750601060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614155b80156129415750600760008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16155b80156129595750601660029054906101000a900460ff165b15612b49576017548161296b84610f7f565b6129759190615882565b111561298057600080fd5b42600a60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054106129cb57600080fd5b600f426129d89190615882565b600a60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550600860008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16158015612ab457506000600b60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054145b15612b4457600060155442612ac99190615963565b9050601e811015612b42576000607882601e612ae59190615963565b612aef9190615909565b90508042612afd9190615882565b600b60008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550505b505b612c1d565b600860008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16612c1c5742600b60008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205410612c1b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612c1290615549565b60405180910390fd5b5b5b6000612c2830610f7f565b9050600c548110158015612c495750601660009054906101000a900460ff16155b8015612ca35750601160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1614155b8015612cbb5750601660019054906101000a900460ff165b15612ccc57612ccb601b5461321c565b5b505b601060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614158015612d795750601160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16145b15612e2d57601860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663c7e772ed846040518263ffffffff1660e01b8152600401612dd99190615251565b602060405180830381600087803b158015612df357600080fd5b505af1158015612e07573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612e2b9190614d8d565b505b6000601a54601954612e3f9190615882565b905060006015541480612e5e5750601660009054906101000a900460ff165b15612e6857600090505b600760008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1680612f095750600760008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff165b15612f1357600090505b601060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161480612fbc5750601060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16145b15612fc657600090505b600081111561300657600060648383612fdf9190615909565b612fe991906158d8565b9050612ff6853083613f5a565b80836130029190615963565b9250505b613011848484613f5a565b601860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663e30443bc8561305987610f7f565b6040518363ffffffff1660e01b815260040161307692919061526c565b600060405180830381600087803b15801561309057600080fd5b505af11580156130a4573d6000803e3d6000fd5b50505050601860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663e30443bc846130f086610f7f565b6040518363ffffffff1660e01b815260040161310d92919061526c565b600060405180830381600087803b15801561312757600080fd5b505af115801561313b573d6000803e3d6000fd5b50505050613147613936565b6000601160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff1614156131b057826131a990615b6b565b905061320b565b601160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff16141561320a578290505b5b61321481613bac565b50505b505050565b6001601660006101000a81548160ff021916908315150217905550600061324230610f7f565b90506000819050600d5481111561325957600d5490505b6000601954601a5461326b9190615882565b601a54836132799190615909565b61328391906158d8565b9050600081836132939190615963565b905061329e826141d2565b6132a747614530565b60006132b3600061463c565b9050600068056bc75e2d6310000082846132cd9190615909565b6132d791906158d8565b90506000601d6003015490506000601d600401549050601d6005015443141561330b57601d600001549150601d6001015490505b600082828561331a9190615909565b61332491906158d8565b905060648a60646133359190615963565b826133409190615909565b61334a91906158d8565b90506000601260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b81526004016133a99190615251565b60206040518083038186803b1580156133c157600080fd5b505afa1580156133d5573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906133f99190614e2e565b90506000600367ffffffffffffffff81111561343e577f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b60405190808252806020026020018201604052801561346c5781602001602082028036833780820191505090505b50905030816000815181106134aa577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff1681525050601360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681600181518110613541577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff1681525050601260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16816002815181106135d8577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff168152505061363f30601060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff168a612358565b601060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16635c11d79589858430426040518663ffffffff1660e01b81526004016136a295949392919061561e565b600060405180830381600087803b1580156136bc57600080fd5b505af19250505080156136cd575060015b6136d6576136d7565b5b600082601260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b81526004016137359190615251565b60206040518083038186803b15801561374d57600080fd5b505afa158015613761573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906137859190614e2e565b61378f9190615963565b9050600081111561390c5760006002826137a991906158d8565b9050601260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663095ea7b3601860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16836040518363ffffffff1660e01b815260040161382a92919061533c565b602060405180830381600087803b15801561384457600080fd5b505af1158015613858573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061387c9190614d8d565b50601860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166303dd6b90826040518263ffffffff1660e01b81526004016138d891906155a9565b600060405180830381600087803b1580156138f257600080fd5b505af1158015613906573d6000803e3d6000fd5b50505050505b6000601660006101000a81548160ff02191690831515021790555050505050505050505050505050565b43601d60050154141561394857613baa565b601d60050154601d60020181905550601d60030154601d60000181905550601d60040154601d60010181905550600080601460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16630902f1ac6040518163ffffffff1660e01b815260040160606040518083038186803b1580156139e057600080fd5b505afa1580156139f4573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613a189190614db6565b506dffffffffffffffffffffffffffff1691506dffffffffffffffffffffffffffff1691506000601460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16630dfe16816040518163ffffffff1660e01b815260040160206040518083038186803b158015613aa757600080fd5b505afa158015613abb573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613adf9190614bf2565b9050601360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415613b505782601d6003018190555081601d60040181905550613b65565b81601d6003018190555082601d600401819055505b6000601d600501541415613b9c5743601d60020181905550601d60030154601d60000181905550601d60040154601d600101819055505b43601d600501819055505050505b565b6000613bb78261463c565b90506000811415613bc85750613e91565b602354811115613bda57806023819055505b602354606482613bea9190615909565b613bf491906158d8565b6064613c009190615963565b602481905550603260245410613e8f57600060646032601260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b8152600401613c719190615251565b60206040518083038186803b158015613c8957600080fd5b505afa158015613c9d573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613cc19190614e2e565b613ccb9190615909565b613cd591906158d8565b90507f75a56278d9bb7100eb58040300f14109299b3494d97d5fc015b06c8ca27c5fec8183602354602454604051613d109493929190615678565b60405180910390a1601260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663095ea7b3601860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16836040518363ffffffff1660e01b8152600401613d9792919061533c565b602060405180830381600087803b158015613db157600080fd5b505af1158015613dc5573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613de99190614d8d565b50601860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166303dd6b90826040518263ffffffff1660e01b8152600401613e4591906155a9565b600060405180830381600087803b158015613e5f57600080fd5b505af1158015613e73573d6000803e3d6000fd5b5050505081602381905550600060248190555080602581905550505b505b50565b6000600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600560006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415613fca576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613fc190615409565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141561403a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161403190615489565b60405180910390fd5b6140458383836148c3565b60008060008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050818110156140cb576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016140c2906154c9565b60405180910390fd5b8181036000808673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550816000808573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825401925050819055508273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef846040516141b991906155a9565b60405180910390a36141cc8484846148c8565b50505050565b6000600367ffffffffffffffff811115614215577f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6040519080825280602002602001820160405280156142435781602001602082028036833780820191505090505b5090503081600081518110614281577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff1681525050601360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681600181518110614318577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff1681525050601060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663ad5c46486040518163ffffffff1660e01b815260040160206040518083038186803b1580156143ba57600080fd5b505afa1580156143ce573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906143f29190614bf2565b8160028151811061442c577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff168152505061449330601060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1684612358565b601060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663791ac9478360008430426040518663ffffffff1660e01b81526004016144f79594939291906155c4565b600060405180830381600087803b15801561451157600080fd5b505af1925050508015614522575060015b61452b5761452c565b5b5050565b6000614559606461454b603c856148cd90919063ffffffff16565b61494890919063ffffffff16565b9050600e60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166108fc829081150290604051600060405180830381858888f193505050501580156145c3573d6000803e3d6000fd5b50600f60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166108fc828461460c9190615963565b9081150290604051600060405180830381858888f19350505050158015614637573d6000803e3d6000fd5b505050565b60008073ffffffffffffffffffffffffffffffffffffffff16601160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16141561469d57600090506148be565b600080601160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16630902f1ac6040518163ffffffff1660e01b815260040160606040518083038186803b15801561470857600080fd5b505afa15801561471c573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906147409190614db6565b506dffffffffffffffffffffffffffff1691506dffffffffffffffffffffffffffff1691506000601160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16630dfe16816040518163ffffffff1660e01b815260040160206040518083038186803b1580156147cf57600080fd5b505afa1580156147e3573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906148079190614bf2565b9050601360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161461486b576000839050829350809250505b600082846148799190615909565b9050858361488791906157ee565b9250828161489591906158d8565b93508268056bc75e2d63100000856148ad9190615909565b6148b791906158d8565b9450505050505b919050565b505050565b505050565b6000808314156148e05760009050614942565b600082846148ee9190615909565b90508284826148fd91906158d8565b1461493d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161493490615529565b60405180910390fd5b809150505b92915050565b600061498a83836040518060400160405280601a81526020017f536166654d6174683a206469766973696f6e206279207a65726f000000000000815250614992565b905092915050565b600080831182906149d9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016149d091906153e7565b60405180910390fd5b50600083856149e891906158d8565b9050809150509392505050565b6000614a08614a03846156fd565b6156d8565b90508083825260208201905082856020860282011115614a2757600080fd5b60005b85811015614a575781614a3d8882614acd565b845260208401935060208301925050600181019050614a2a565b5050509392505050565b6000614a74614a6f84615729565b6156d8565b90508083825260208201905082856020860282011115614a9357600080fd5b60005b85811015614ac35781614aa98882614b9f565b845260208401935060208301925050600181019050614a96565b5050509392505050565b600081359050614adc81615f31565b92915050565b600081519050614af181615f31565b92915050565b600082601f830112614b0857600080fd5b8135614b188482602086016149f5565b91505092915050565b600082601f830112614b3257600080fd5b8151614b42848260208601614a61565b91505092915050565b600081359050614b5a81615f48565b92915050565b600081519050614b6f81615f48565b92915050565b600081519050614b8481615f5f565b92915050565b600081359050614b9981615f76565b92915050565b600081519050614bae81615f76565b92915050565b600081519050614bc381615f8d565b92915050565b600060208284031215614bdb57600080fd5b6000614be984828501614acd565b91505092915050565b600060208284031215614c0457600080fd5b6000614c1284828501614ae2565b91505092915050565b60008060408385031215614c2e57600080fd5b6000614c3c85828601614acd565b9250506020614c4d85828601614acd565b9150509250929050565b600080600060608486031215614c6c57600080fd5b6000614c7a86828701614acd565b9350506020614c8b86828701614acd565b9250506040614c9c86828701614b8a565b9150509250925092565b60008060408385031215614cb957600080fd5b6000614cc785828601614acd565b9250506020614cd885828601614b8a565b9150509250929050565b600060208284031215614cf457600080fd5b600082013567ffffffffffffffff811115614d0e57600080fd5b614d1a84828501614af7565b91505092915050565b600060208284031215614d3557600080fd5b600082015167ffffffffffffffff811115614d4f57600080fd5b614d5b84828501614b21565b91505092915050565b600060208284031215614d7657600080fd5b6000614d8484828501614b4b565b91505092915050565b600060208284031215614d9f57600080fd5b6000614dad84828501614b60565b91505092915050565b600080600060608486031215614dcb57600080fd5b6000614dd986828701614b75565b9350506020614dea86828701614b75565b9250506040614dfb86828701614bb4565b9150509250925092565b600060208284031215614e1757600080fd5b6000614e2584828501614b8a565b91505092915050565b600060208284031215614e4057600080fd5b6000614e4e84828501614b9f565b91505092915050565b600080600060608486031215614e6c57600080fd5b6000614e7a86828701614b9f565b9350506020614e8b86828701614b9f565b9250506040614e9c86828701614b9f565b9150509250925092565b6000614eb28383614ee5565b60208301905092915050565b6000614eca838361520f565b60208301905092915050565b614edf81615a20565b82525050565b614eee81615997565b82525050565b614efd81615997565b82525050565b6000614f0e82615775565b614f1881856157b0565b9350614f2383615755565b8060005b83811015614f54578151614f3b8882614ea6565b9750614f4683615796565b925050600181019050614f27565b5085935050505092915050565b6000614f6c82615780565b614f7681856157c1565b9350614f8183615765565b8060005b83811015614fb2578151614f998882614ebe565b9750614fa4836157a3565b925050600181019050614f85565b5085935050505092915050565b614fc8816159a9565b82525050565b614fd781615a32565b82525050565b614fe681615a56565b82525050565b6000614ff78261578b565b61500181856157dd565b9350615011818560208601615a8c565b61501a81615c70565b840191505092915050565b6000615032601d836157dd565b915061503d82615c81565b602082019050919050565b60006150556026836157dd565b915061506082615caa565b604082019050919050565b60006150786022836157dd565b915061508382615cf9565b604082019050919050565b600061509b601e836157dd565b91506150a682615d48565b602082019050919050565b60006150be601c836157dd565b91506150c982615d71565b602082019050919050565b60006150e1601d836157dd565b91506150ec82615d9a565b602082019050919050565b6000615104601f836157dd565b915061510f82615dc3565b602082019050919050565b6000615127601e836157dd565b915061513282615dec565b602082019050919050565b600061514a600c836157dd565b915061515582615e15565b602082019050919050565b600061516d6021836157dd565b915061517882615e3e565b604082019050919050565b60006151906004836157dd565b915061519b82615e8d565b602082019050919050565b60006151b36020836157dd565b91506151be82615eb6565b602082019050919050565b60006151d66000836157d2565b91506151e182615edf565b600082019050919050565b60006151f96024836157dd565b915061520482615ee2565b604082019050919050565b615218816159f9565b82525050565b615227816159f9565b82525050565b61523681615a13565b82525050565b6000615247826151c9565b9150819050919050565b60006020820190506152666000830184614ef4565b92915050565b60006040820190506152816000830185614ed6565b61528e602083018461521e565b9392505050565b60006040820190506152aa6000830185614ef4565b6152b76020830184614ef4565b9392505050565b6000610100820190506152d4600083018b614ef4565b6152e1602083018a614ef4565b6152ee604083018961521e565b6152fb606083018861521e565b6153086080830187614fdd565b61531560a0830186614fdd565b61532260c0830185614ef4565b61532f60e083018461521e565b9998505050505050505050565b60006040820190506153516000830185614ef4565b61535e602083018461521e565b9392505050565b6000608082019050818103600083015261537f8187614f61565b905061538e602083018661521e565b61539b604083018561521e565b6153a8606083018461521e565b95945050505050565b60006020820190506153c66000830184614fbf565b92915050565b60006020820190506153e16000830184614fce565b92915050565b600060208201905081810360008301526154018184614fec565b905092915050565b6000602082019050818103600083015261542281615025565b9050919050565b6000602082019050818103600083015261544281615048565b9050919050565b600060208201905081810360008301526154628161506b565b9050919050565b600060208201905081810360008301526154828161508e565b9050919050565b600060208201905081810360008301526154a2816150b1565b9050919050565b600060208201905081810360008301526154c2816150d4565b9050919050565b600060208201905081810360008301526154e2816150f7565b9050919050565b600060208201905081810360008301526155028161511a565b9050919050565b600060208201905081810360008301526155228161513d565b9050919050565b6000602082019050818103600083015261554281615160565b9050919050565b6000602082019050818103600083015261556281615183565b9050919050565b60006020820190508181036000830152615582816151a6565b9050919050565b600060208201905081810360008301526155a2816151ec565b9050919050565b60006020820190506155be600083018461521e565b92915050565b600060a0820190506155d9600083018861521e565b6155e66020830187614fdd565b81810360408301526155f88186614f03565b90506156076060830185614ef4565b615614608083018461521e565b9695505050505050565b600060a082019050615633600083018861521e565b615640602083018761521e565b81810360408301526156528186614f03565b90506156616060830185614ef4565b61566e608083018461521e565b9695505050505050565b600060808201905061568d600083018761521e565b61569a602083018661521e565b6156a7604083018561521e565b6156b4606083018461521e565b95945050505050565b60006020820190506156d2600083018461522d565b92915050565b60006156e26156f3565b90506156ee8282615af1565b919050565b6000604051905090565b600067ffffffffffffffff82111561571857615717615c41565b5b602082029050602081019050919050565b600067ffffffffffffffff82111561574457615743615c41565b5b602082029050602081019050919050565b6000819050602082019050919050565b6000819050602082019050919050565b600081519050919050565b600081519050919050565b600081519050919050565b6000602082019050919050565b6000602082019050919050565b600082825260208201905092915050565b600082825260208201905092915050565b600081905092915050565b600082825260208201905092915050565b60006157f9826159b5565b9150615804836159b5565b9250817f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0383136000831215161561583f5761583e615bb4565b5b817f800000000000000000000000000000000000000000000000000000000000000003831260008312161561587757615876615bb4565b5b828201905092915050565b600061588d826159f9565b9150615898836159f9565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff038211156158cd576158cc615bb4565b5b828201905092915050565b60006158e3826159f9565b91506158ee836159f9565b9250826158fe576158fd615be3565b5b828204905092915050565b6000615914826159f9565b915061591f836159f9565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff048311821515161561595857615957615bb4565b5b828202905092915050565b600061596e826159f9565b9150615979836159f9565b92508282101561598c5761598b615bb4565b5b828203905092915050565b60006159a2826159d9565b9050919050565b60008115159050919050565b6000819050919050565b60006dffffffffffffffffffffffffffff82169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b600063ffffffff82169050919050565b600060ff82169050919050565b6000615a2b82615a68565b9050919050565b6000615a3d82615a44565b9050919050565b6000615a4f826159d9565b9050919050565b6000615a61826159f9565b9050919050565b6000615a7382615a7a565b9050919050565b6000615a85826159d9565b9050919050565b60005b83811015615aaa578082015181840152602081019050615a8f565b83811115615ab9576000848401525b50505050565b60006002820490506001821680615ad757607f821691505b60208210811415615aeb57615aea615c12565b5b50919050565b615afa82615c70565b810181811067ffffffffffffffff82111715615b1957615b18615c41565b5b80604052505050565b6000615b2d826159f9565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff821415615b6057615b5f615bb4565b5b600182019050919050565b6000615b76826159b5565b91507f8000000000000000000000000000000000000000000000000000000000000000821415615ba957615ba8615bb4565b5b816000039050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6000601f19601f8301169050919050565b7f74616e736665722066726f6d20746865207a65726f2061646472657373000000600082015250565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b7f45524332303a20617070726f766520746f20746865207a65726f20616464726560008201527f7373000000000000000000000000000000000000000000000000000000000000602082015250565b7f7472616e736665722066726f6d20746865207a65726f20616464726573730000600082015250565b7f7472616e7366657220746f20746865207a65726f206164647265737300000000600082015250565b7f45524332303a20696e73756666696369656e7420616c6c6f77616e6365000000600082015250565b7f7472616e7366657220616d6f756e7420657863656564732062616c616e636500600082015250565b7f64656372656173656420616c6c6f77616e63652062656c6f77207a65726f0000600082015250565b7f616c7265616479206f70656e0000000000000000000000000000000000000000600082015250565b7f536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f60008201527f7700000000000000000000000000000000000000000000000000000000000000602082015250565b7f7761697400000000000000000000000000000000000000000000000000000000600082015250565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b50565b7f45524332303a20617070726f76652066726f6d20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b615f3a81615997565b8114615f4557600080fd5b50565b615f51816159a9565b8114615f5c57600080fd5b50565b615f68816159bf565b8114615f7357600080fd5b50565b615f7f816159f9565b8114615f8a57600080fd5b50565b615f9681615a03565b8114615fa157600080fd5b5056fea264697066735822122005ffb5d7609075d0513f767483910cb20fbd35732a3fb8aea502620a0362952564736f6c6343000804003360e06040523480156200001157600080fd5b50604051620046cd380380620046cd8339818101604052810190620000379190620005ec565b6040518060400160405280601081526020017f4d656469746174696e52657761726473000000000000000000000000000000008152506040518060400160405280600981526020017f244d45444954415445000000000000000000000000000000000000000000000081525081818160039080519060200190620000bd929190620004de565b508060049080519060200190620000d6929190620004de565b5050506000620000eb620002e760201b60201c565b905080600560006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508073ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050508173ffffffffffffffffffffffffffffffffffffffff1660a08173ffffffffffffffffffffffffffffffffffffffff1660601b815250508073ffffffffffffffffffffffffffffffffffffffff1660c08173ffffffffffffffffffffffffffffffffffffffff1660601b815250508273ffffffffffffffffffffffffffffffffffffffff1660808173ffffffffffffffffffffffffffffffffffffffff1660601b81525050620d2f00600e819055506200024c83620002ef60201b60201c565b620002566200056f565b600f81908060018154018082558091505060019003906000526020600020906002020160009091909190915060008201518160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060208201518160010155505060016010819055505050505062000852565b600033905090565b620002ff620002e760201b60201c565b73ffffffffffffffffffffffffffffffffffffffff16600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161462000391576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016200038890620006b2565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16141562000404576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401620003fb9062000690565b60405180910390fd5b62000415816200041860201b60201c565b50565b6000600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600560006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b828054620004ec9062000741565b90600052602060002090601f0160209004810192826200051057600085556200055c565b82601f106200052b57805160ff19168380011785556200055c565b828001600101855582156200055c579182015b828111156200055b5782518255916020019190600101906200053e565b5b5090506200056b91906200059f565b5090565b6040518060400160405280600073ffffffffffffffffffffffffffffffffffffffff168152602001600081525090565b5b80821115620005ba576000816000905550600101620005a0565b5090565b600081519050620005cf816200081e565b92915050565b600081519050620005e68162000838565b92915050565b6000806000606084860312156200060257600080fd5b60006200061286828701620005be565b93505060206200062586828701620005d5565b92505060406200063886828701620005d5565b9150509250925092565b600062000651602683620006d4565b91506200065e82620007a6565b604082019050919050565b600062000678602083620006d4565b91506200068582620007f5565b602082019050919050565b60006020820190508181036000830152620006ab8162000642565b9050919050565b60006020820190508181036000830152620006cd8162000669565b9050919050565b600082825260208201905092915050565b6000620006f28262000721565b9050919050565b6000620007068262000721565b9050919050565b60006200071a82620006e5565b9050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b600060028204905060018216806200075a57607f821691505b6020821081141562000771576200077062000777565b5b50919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b6200082981620006f9565b81146200083557600080fd5b50565b62000843816200070d565b81146200084f57600080fd5b50565b60805160601c60a05160601c60c05160601c613e2d620008a0600039600061114d01526000818161077901528181611b050152818161219501526123b301526000611b290152613e2d6000f3fe608060405234801561001057600080fd5b50600436106101fb5760003560e01c80638da5cb5b1161011a578063aafd847a116100ad578063dd62ed3e1161007c578063dd62ed3e1461063c578063e30443bc1461066c578063f2fde38b14610688578063f7c618c1146106a4578063fc0c546a146106c2576101fb565b8063aafd847a1461058e578063b2e6819b146105be578063bc091122146105ee578063c7e772ed1461060c576101fb565b8063a8b9d240116100e9578063a8b9d240146104e0578063a9059cbb14610510578063a93a8d2214610540578063a9d75b2b14610570576101fb565b80638da5cb5b1461044457806391b89fba1461046257806395d89b4114610492578063a457c2d7146104b0576101fb565b8063313ce567116101925780634e7b827f116101615780634e7b827f146103bc57806370a08231146103ec578063715018a61461041c57806385a6b3ae14610426576101fb565b8063313ce5671461033657806331e79db014610354578063395093511461037057806340b63369146103a0576101fb565b806318160ddd116101ce57806318160ddd14610288578063226cfa3d146102a657806323b872dd146102d657806327ce014714610306576101fb565b806303dd6b901461020057806306fdde031461021c578063095ea7b31461023a5780631514617e1461026a575b600080fd5b61021a6004803603810190610215919061306d565b6106e0565b005b610224610844565b6040516102319190613440565b60405180910390f35b610254600480360381019061024f9190613008565b6108d6565b60405161026191906133ef565b60405180910390f35b6102726108f9565b60405161027f91906135e2565b60405180910390f35b6102906108ff565b60405161029d91906135e2565b60405180910390f35b6102c060048036038101906102bb9190612f2b565b610909565b6040516102cd91906135e2565b60405180910390f35b6102f060048036038101906102eb9190612fb9565b610921565b6040516102fd91906133ef565b60405180910390f35b610320600480360381019061031b9190612f2b565b610950565b60405161032d91906135e2565b60405180910390f35b61033e6109f3565b60405161034b9190613642565b60405180910390f35b61036e60048036038101906103699190612f2b565b6109fc565b005b61038a60048036038101906103859190613008565b610b94565b60405161039791906133ef565b60405180910390f35b6103ba60048036038101906103b5919061306d565b610bcb565b005b6103d660048036038101906103d19190612f2b565b610d13565b6040516103e391906133ef565b60405180910390f35b61040660048036038101906104019190612f2b565b610d33565b60405161041391906135e2565b60405180910390f35b610424610d7b565b005b61042e610ed3565b60405161043b91906135e2565b60405180910390f35b61044c610ed9565b6040516104599190613352565b60405180910390f35b61047c60048036038101906104779190612f2b565b610f03565b60405161048991906135e2565b60405180910390f35b61049a610f15565b6040516104a79190613440565b60405180910390f35b6104ca60048036038101906104c59190613008565b610fa7565b6040516104d791906133ef565b60405180910390f35b6104fa60048036038101906104f59190612f2b565b61101e565b60405161050791906135e2565b60405180910390f35b61052a60048036038101906105259190613008565b611081565b60405161053791906133ef565b60405180910390f35b61055a60048036038101906105559190612f2b565b6110a4565b60405161056791906135e2565b60405180910390f35b61057861114b565b604051610585919061340a565b60405180910390f35b6105a860048036038101906105a39190612f2b565b61116f565b6040516105b591906135e2565b60405180910390f35b6105d860048036038101906105d39190612f2b565b6111b8565b6040516105e591906133cd565b60405180910390f35b6105f6611755565b60405161060391906135e2565b60405180910390f35b61062660048036038101906106219190612f2b565b61175b565b60405161063391906133ef565b60405180910390f35b61065660048036038101906106519190612f7d565b611804565b60405161066391906135e2565b60405180910390f35b61068660048036038101906106819190613008565b61188b565b005b6106a2600480360381019061069d9190612f2b565b6119f0565b005b6106ac611b03565b6040516106b9919061340a565b60405180910390f35b6106ca611b27565b6040516106d79190613425565b60405180910390f35b6106e8611b4b565b73ffffffffffffffffffffffffffffffffffffffff16600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614610777576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161076e90613562565b60405180910390fd5b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff166323b872dd6107bb610ed9565b30846040518463ffffffff1660e01b81526004016107db9392919061336d565b602060405180830381600087803b1580156107f557600080fd5b505af192505050801561082657506040513d601f19601f820116820180604052508101906108239190613044565b60015b61082f57610841565b801561083f5761083e82611b53565b5b505b50565b606060038054610853906139c9565b80601f016020809104026020016040519081016040528092919081815260200182805461087f906139c9565b80156108cc5780601f106108a1576101008083540402835291602001916108cc565b820191906000526020600020905b8154815290600101906020018083116108af57829003601f168201915b5050505050905090565b6000806108e1611b4b565b90506108ee818585611c2d565b600191505092915050565b600e5481565b6000600254905090565b600d6020528060005260406000206000915090505481565b60008061092c611b4b565b9050610939858285611df8565b610944858585611e84565b60019150509392505050565b60007001000000000000000000000000000000006109e26109dd600960008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546109cf6109ca6109b988610d33565b600754611ee590919063ffffffff16565b611f60565b611f7d90919063ffffffff16565b611fc8565b6109ec919061379c565b9050919050565b60006012905090565b610a04611b4b565b73ffffffffffffffffffffffffffffffffffffffff16600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614610a93576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a8a90613562565b60405180910390fd5b600c60008273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1615610aea57610b91565b6001600c60008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff021916908315150217905550610b4d816000611fdf565b8073ffffffffffffffffffffffffffffffffffffffff167fa878b31040b2e6d0a9a3d3361209db3908ba62014b0dca52adbaee451d128b2560405160405180910390a25b50565b600080610b9f611b4b565b9050610bc0818585610bb18589611804565b610bbb9190613746565b611c2d565b600191505092915050565b60008060105490505b600f8054905081108015610be757508282105b15610d0d576000600f8281548110610c28577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b906000526020600020906002020190504281600101541115610c4c57505050610d10565b600073ffffffffffffffffffffffffffffffffffffffff168160000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614610cd357610cd18160000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1661204c565b505b60106000815480929190610ce6906139fb565b91905055508280610cf6906139fb565b935050508080610d05906139fb565b915050610bd4565b50505b50565b600c6020528060005260406000206000915054906101000a900460ff1681565b60008060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b610d83611b4b565b73ffffffffffffffffffffffffffffffffffffffff16600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614610e12576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e0990613562565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff16600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a36000600560006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550565b600b5481565b6000600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b6000610f0e8261101e565b9050919050565b606060048054610f24906139c9565b80601f0160208091040260200160405190810160405280929190818152602001828054610f50906139c9565b8015610f9d5780601f10610f7257610100808354040283529160200191610f9d565b820191906000526020600020905b815481529060010190602001808311610f8057829003601f168201915b5050505050905090565b600080610fb2611b4b565b90506000610fc08286611804565b905083811015611005576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ffc90613522565b60405180910390fd5b6110128286868403611c2d565b60019250505092915050565b600061107a600a60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205461106c84610950565b61257590919063ffffffff16565b9050919050565b60008061108c611b4b565b9050611099818585611e84565b600191505092915050565b600080600d60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905060008114156110fc576000915050611146565b6000814261110a91906138bb565b90506000600e54821061112157612710905061113f565b600e548261271061113291906137cd565b61113c919061379c565b90505b8093505050505b919050565b7f000000000000000000000000000000000000000000000000000000000000000081565b6000600a60008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b606060006111c58361101e565b905060006111d284610950565b905060006111df856110a4565b90506000600d60008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205490506000808211611235576000611244565b600e54826112439190613746565b5b9050600b67ffffffffffffffff811115611287577f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6040519080825280602002602001820160405280156112b55781602001602082028036833780820191505090505b50955084866000815181106112f3577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b602002602001018181525050838660018151811061133a577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b6020026020010181815250508286600281518110611381577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60200260200101818152505081866003815181106113c8577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b602002602001018181525050808660048151811061140f577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60200260200101818152505061142487610d33565b8660058151811061145e577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60200260200101818152505060006114746108ff565b1115611522576114826108ff565b612710876005815181106114bf577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60200260200101516114d191906137cd565b6114db919061379c565b86600681518110611515577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b6020026020010181815250505b601160008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020548660078151811061159c577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b6020026020010181815250506000600f876007815181106115e6577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b602002602001015181548110611625577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b906000526020600020906002020190508060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16876008815181106116aa577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b6020026020010181815250508060010154876009815181106116f5577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60200260200101818152505060105487600a8151811061173e577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b602002602001018181525050505050505050919050565b61271081565b6000611765611b4b565b73ffffffffffffffffffffffffffffffffffffffff16600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16146117f4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016117eb90613562565b60405180910390fd5b6117fd8261204c565b9050919050565b6000600160008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905092915050565b611893611b4b565b73ffffffffffffffffffffffffffffffffffffffff16600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614611922576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161191990613562565b60405180910390fd5b600c60008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1615611979576119ec565b6119838282611fdf565b6000811180156119d257506000600d60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054145b156119e1576119e0826125bf565b5b6119eb6001610bcb565b5b5050565b6119f8611b4b565b73ffffffffffffffffffffffffffffffffffffffff16600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614611a87576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a7e90613562565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415611af7576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611aee906134a2565b60405180910390fd5b611b0081612827565b50565b7f000000000000000000000000000000000000000000000000000000000000000081565b7f000000000000000000000000000000000000000000000000000000000000000081565b600033905090565b6000611b5d6108ff565b11611b6757600080fd5b6000811115611c2a57611bba611b7b6108ff565b611b9f70010000000000000000000000000000000084611ee590919063ffffffff16565b611ba9919061379c565b6007546128ed90919063ffffffff16565b6007819055503373ffffffffffffffffffffffffffffffffffffffff167fa493a9229478c3fcd73f66d2cdeb7f94fd0f341da924d1054236d7845411651182604051611c0691906135e2565b60405180910390a2611c2381600b546128ed90919063ffffffff16565b600b819055505b50565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415611c9d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c94906135a2565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611d0d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d04906134c2565b60405180910390fd5b80600160008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92583604051611deb91906135e2565b60405180910390a3505050565b6000611e048484611804565b90507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8114611e7e5781811015611e70576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e6790613502565b60405180910390fd5b611e7d8484848403611c2d565b5b50505050565b6001601260006101000a81548160ff0219169083151502179055506000611ee0576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ed790613482565b60405180910390fd5b505050565b600080831415611ef85760009050611f5a565b60008284611f0691906137cd565b9050828482611f15919061379c565b14611f55576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f4c90613542565b60405180910390fd5b809150505b92915050565b6000808290506000811215611f7457600080fd5b80915050919050565b6000808284611f8c91906136b2565b905060008312158015611f9f5750838112155b80611fb55750600083128015611fb457508381125b5b611fbe57600080fd5b8091505092915050565b600080821215611fd757600080fd5b819050919050565b6000611fea83610d33565b90508082111561201b576000612009828461257590919063ffffffff16565b9050612015848261294b565b50612047565b80821015612046576000612038838361257590919063ffffffff16565b90506120448482612a0a565b505b5b505050565b6000806120588361101e565b905060008114156120765761206c836125bf565b6001915050612570565b6000612081846110a4565b90506120d582600a60008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546128ed90919063ffffffff16565b600a60008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508373ffffffffffffffffffffffffffffffffffffffff167fee503bee2bb6a87e57bc57db795f98137327401a0e7b7ce42e37926cc1a9ca4d8360405161215e91906135e2565b60405180910390a26000612710828461217791906137cd565b612181919061379c565b90506000818461219191906138bb565b90507f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663a9059cbb87846040518363ffffffff1660e01b81526004016121ee9291906133a4565b602060405180830381600087803b15801561220857600080fd5b505af192505050801561223957506040513d601f19601f820116820180604052508101906122369190613044565b60015b6122df5761228f84600a60008973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205461257590919063ffffffff16565b600a60008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055506000945050505050612570565b806123875761233685600a60008a73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205461257590919063ffffffff16565b600a60008973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550600095505050505050612570565b506000806000831115612508576003836123a1919061379c565b915081836123af91906138bb565b90507f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663a9059cbb6123f5610ed9565b73ffffffffffffffffffffffffffffffffffffffff16638da5cb5b6040518163ffffffff1660e01b815260040160206040518083038186803b15801561243a57600080fd5b505afa15801561244e573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906124729190612f54565b846040518363ffffffff1660e01b81526004016124909291906133a4565b602060405180830381600087803b1580156124aa57600080fd5b505af19250505080156124db57506040513d601f19601f820116820180604052508101906124d89190613044565b60015b6124ed576124e882611b53565b6124fe565b806124fc576124fb83611b53565b5b505b61250781611b53565b5b612511886125bf565b8773ffffffffffffffffffffffffffffffffffffffff167f68e1caf97c4c29c1ac46024e9590f80b7a1f690d393703879cf66eea4e1e84218686858560405161255d94939291906135fd565b60405180910390a2600196505050505050505b919050565b60006125b783836040518060400160405280601e81526020017f536166654d6174683a207375627472616374696f6e206f766572666c6f770000815250612ac9565b905092915050565b42600d60008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055506000601160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020541461270457600f601160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054815481106126c3577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b9060005260206000209060020201600080820160006101000a81549073ffffffffffffffffffffffffffffffffffffffff0219169055600182016000905550505b61270c612ea7565b81816000019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff1681525050600e54426127529190613746565b816020018181525050600f80549050601160008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550600f81908060018154018082558091505060019003906000526020600020906002020160009091909190915060008201518160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506020820151816001015550505050565b6000600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600560006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b60008082846128fc9190613746565b905083811015612941576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612938906134e2565b60405180910390fd5b8091505092915050565b6129558282612b2d565b6129c361297561297083600754611ee590919063ffffffff16565b611f60565b600960008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054612c8490919063ffffffff16565b600960008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055505050565b612a148282612ccf565b612a82612a34612a2f83600754611ee590919063ffffffff16565b611f60565b600960008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054611f7d90919063ffffffff16565b600960008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055505050565b6000838311158290612b11576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612b089190613440565b60405180910390fd5b5060008385612b2091906138bb565b9050809150509392505050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415612b9d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612b94906135c2565b60405180910390fd5b612ba960008383612e9d565b8060026000828254612bbb9190613746565b92505081905550806000808473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825401925050819055508173ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef83604051612c6c91906135e2565b60405180910390a3612c8060008383612ea2565b5050565b6000808284612c939190613827565b905060008312158015612ca65750838113155b80612cbc5750600083128015612cbb57508381135b5b612cc557600080fd5b8091505092915050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415612d3f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612d3690613582565b60405180910390fd5b612d4b82600083612e9d565b60008060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905081811015612dd1576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612dc890613462565b60405180910390fd5b8181036000808573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208190555081600260008282540392505081905550600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef84604051612e8491906135e2565b60405180910390a3612e9883600084612ea2565b505050565b505050565b505050565b6040518060400160405280600073ffffffffffffffffffffffffffffffffffffffff168152602001600081525090565b600081359050612ee681613db2565b92915050565b600081519050612efb81613db2565b92915050565b600081519050612f1081613dc9565b92915050565b600081359050612f2581613de0565b92915050565b600060208284031215612f3d57600080fd5b6000612f4b84828501612ed7565b91505092915050565b600060208284031215612f6657600080fd5b6000612f7484828501612eec565b91505092915050565b60008060408385031215612f9057600080fd5b6000612f9e85828601612ed7565b9250506020612faf85828601612ed7565b9150509250929050565b600080600060608486031215612fce57600080fd5b6000612fdc86828701612ed7565b9350506020612fed86828701612ed7565b9250506040612ffe86828701612f16565b9150509250925092565b6000806040838503121561301b57600080fd5b600061302985828601612ed7565b925050602061303a85828601612f16565b9150509250929050565b60006020828403121561305657600080fd5b600061306484828501612f01565b91505092915050565b60006020828403121561307f57600080fd5b600061308d84828501612f16565b91505092915050565b60006130a28383613325565b60208301905092915050565b6130b7816138ef565b82525050565b60006130c88261366d565b6130d28185613690565b93506130dd8361365d565b8060005b8381101561310e5781516130f58882613096565b975061310083613683565b9250506001810190506130e1565b5085935050505092915050565b61312481613901565b82525050565b6131338161394e565b82525050565b61314281613972565b82525050565b600061315382613678565b61315d81856136a1565b935061316d818560208601613996565b61317681613ad1565b840191505092915050565b600061318e6022836136a1565b915061319982613ae2565b604082019050919050565b60006131b16003836136a1565b91506131bc82613b31565b602082019050919050565b60006131d46026836136a1565b91506131df82613b5a565b604082019050919050565b60006131f76022836136a1565b915061320282613ba9565b604082019050919050565b600061321a601b836136a1565b915061322582613bf8565b602082019050919050565b600061323d601d836136a1565b915061324882613c21565b602082019050919050565b6000613260601e836136a1565b915061326b82613c4a565b602082019050919050565b60006132836021836136a1565b915061328e82613c73565b604082019050919050565b60006132a66020836136a1565b91506132b182613cc2565b602082019050919050565b60006132c96021836136a1565b91506132d482613ceb565b604082019050919050565b60006132ec6024836136a1565b91506132f782613d3a565b604082019050919050565b600061330f601f836136a1565b915061331a82613d89565b602082019050919050565b61332e81613937565b82525050565b61333d81613937565b82525050565b61334c81613941565b82525050565b600060208201905061336760008301846130ae565b92915050565b600060608201905061338260008301866130ae565b61338f60208301856130ae565b61339c6040830184613334565b949350505050565b60006040820190506133b960008301856130ae565b6133c66020830184613334565b9392505050565b600060208201905081810360008301526133e781846130bd565b905092915050565b6000602082019050613404600083018461311b565b92915050565b600060208201905061341f600083018461312a565b92915050565b600060208201905061343a6000830184613139565b92915050565b6000602082019050818103600083015261345a8184613148565b905092915050565b6000602082019050818103600083015261347b81613181565b9050919050565b6000602082019050818103600083015261349b816131a4565b9050919050565b600060208201905081810360008301526134bb816131c7565b9050919050565b600060208201905081810360008301526134db816131ea565b9050919050565b600060208201905081810360008301526134fb8161320d565b9050919050565b6000602082019050818103600083015261351b81613230565b9050919050565b6000602082019050818103600083015261353b81613253565b9050919050565b6000602082019050818103600083015261355b81613276565b9050919050565b6000602082019050818103600083015261357b81613299565b9050919050565b6000602082019050818103600083015261359b816132bc565b9050919050565b600060208201905081810360008301526135bb816132df565b9050919050565b600060208201905081810360008301526135db81613302565b9050919050565b60006020820190506135f76000830184613334565b92915050565b60006080820190506136126000830187613334565b61361f6020830186613334565b61362c6040830185613334565b6136396060830184613334565b95945050505050565b60006020820190506136576000830184613343565b92915050565b6000819050602082019050919050565b600081519050919050565b600081519050919050565b6000602082019050919050565b600082825260208201905092915050565b600082825260208201905092915050565b60006136bd8261390d565b91506136c88361390d565b9250817f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0383136000831215161561370357613702613a44565b5b817f800000000000000000000000000000000000000000000000000000000000000003831260008312161561373b5761373a613a44565b5b828201905092915050565b600061375182613937565b915061375c83613937565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0382111561379157613790613a44565b5b828201905092915050565b60006137a782613937565b91506137b283613937565b9250826137c2576137c1613a73565b5b828204905092915050565b60006137d882613937565b91506137e383613937565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff048311821515161561381c5761381b613a44565b5b828202905092915050565b60006138328261390d565b915061383d8361390d565b9250827f80000000000000000000000000000000000000000000000000000000000000000182126000841215161561387857613877613a44565b5b827f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0182136000841216156138b0576138af613a44565b5b828203905092915050565b60006138c682613937565b91506138d183613937565b9250828210156138e4576138e3613a44565b5b828203905092915050565b60006138fa82613917565b9050919050565b60008115159050919050565b6000819050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b600060ff82169050919050565b600061395982613960565b9050919050565b600061396b82613917565b9050919050565b600061397d82613984565b9050919050565b600061398f82613917565b9050919050565b60005b838110156139b4578082015181840152602081019050613999565b838111156139c3576000848401525b50505050565b600060028204905060018216806139e157607f821691505b602082108114156139f5576139f4613aa2565b5b50919050565b6000613a0682613937565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff821415613a3957613a38613a44565b5b600182019050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b6000601f19601f8301169050919050565b7f45524332303a206275726e20616d6f756e7420657863656564732062616c616e60008201527f6365000000000000000000000000000000000000000000000000000000000000602082015250565b7f6e61680000000000000000000000000000000000000000000000000000000000600082015250565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b7f45524332303a20617070726f766520746f20746865207a65726f20616464726560008201527f7373000000000000000000000000000000000000000000000000000000000000602082015250565b7f536166654d6174683a206164646974696f6e206f766572666c6f770000000000600082015250565b7f45524332303a20696e73756666696369656e7420616c6c6f77616e6365000000600082015250565b7f64656372656173656420616c6c6f77616e63652062656c6f77207a65726f0000600082015250565b7f536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f60008201527f7700000000000000000000000000000000000000000000000000000000000000602082015250565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b7f45524332303a206275726e2066726f6d20746865207a65726f2061646472657360008201527f7300000000000000000000000000000000000000000000000000000000000000602082015250565b7f45524332303a20617070726f76652066726f6d20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b7f45524332303a206d696e7420746f20746865207a65726f206164647265737300600082015250565b613dbb816138ef565b8114613dc657600080fd5b50565b613dd281613901565b8114613ddd57600080fd5b50565b613de981613937565b8114613df457600080fd5b5056fea26469706673582212205212967d7afe5c28e0ad7f4eb9a90e2359353885e8228b9bfe8deb93666616be64736f6c63430008040033
Deployed Bytecode
0x6080604052600436106101c65760003560e01c8063715018a6116100f7578063a457c2d711610095578063cd6ef3a411610064578063cd6ef3a414610626578063dd62ed3e1461064f578063f2fde38b1461068c578063f57d8ac1146106b5576101cd565b8063a457c2d71461056c578063a9059cbb146105a9578063b515566a146105e6578063c9567bf91461060f576101cd565b80637b4e8038116100d15780637b4e8038146104d65780638da5cb5b146104ff57806395d89b411461052a57806399ce371a14610555576101cd565b8063715018a61461046b5780637229006914610482578063729d8a87146104ad576101cd565b806338266b221161016457806353674ba61161013e57806353674ba6146103b357806358609754146103dc5780635932ead11461040557806370a082311461042e576101cd565b806338266b221461031f578063395093511461035f5780634e71d92d1461039c576101cd565b806323b872dd116101a057806323b872dd14610265578063273123b7146102a25780632a5bdc33146102cb578063313ce567146102f4576101cd565b806306fdde03146101d2578063095ea7b3146101fd57806318160ddd1461023a576101cd565b366101cd57005b600080fd5b3480156101de57600080fd5b506101e76106de565b6040516101f491906153e7565b60405180910390f35b34801561020957600080fd5b50610224600480360381019061021f9190614ca6565b610770565b60405161023191906153b1565b60405180910390f35b34801561024657600080fd5b5061024f610793565b60405161025c91906155a9565b60405180910390f35b34801561027157600080fd5b5061028c60048036038101906102879190614c57565b61079d565b60405161029991906153b1565b60405180910390f35b3480156102ae57600080fd5b506102c960048036038101906102c49190614bc9565b6107cc565b005b3480156102d757600080fd5b506102f260048036038101906102ed9190614bc9565b6108be565b005b34801561030057600080fd5b506103096109b0565b60405161031691906156bd565b60405180910390f35b34801561032b57600080fd5b5061034660048036038101906103419190614bc9565b6109b9565b6040516103569493929190615365565b60405180910390f35b34801561036b57600080fd5b5061038660048036038101906103819190614ca6565b610b30565b60405161039391906153b1565b60405180910390f35b3480156103a857600080fd5b506103b1610b67565b005b3480156103bf57600080fd5b506103da60048036038101906103d59190614e05565b610c17565b005b3480156103e857600080fd5b5061040360048036038101906103fe9190614ca6565b610cb8565b005b34801561041157600080fd5b5061042c60048036038101906104279190614d64565b610ecb565b005b34801561043a57600080fd5b5061045560048036038101906104509190614bc9565b610f7f565b60405161046291906155a9565b60405180910390f35b34801561047757600080fd5b50610480610fc7565b005b34801561048e57600080fd5b5061049761111f565b6040516104a491906153cc565b60405180910390f35b3480156104b957600080fd5b506104d460048036038101906104cf9190614e05565b611145565b005b3480156104e257600080fd5b506104fd60048036038101906104f89190614e05565b6111e6565b005b34801561050b57600080fd5b50610514611289565b6040516105219190615251565b60405180910390f35b34801561053657600080fd5b5061053f6112b3565b60405161054c91906153e7565b60405180910390f35b34801561056157600080fd5b5061056a611345565b005b34801561057857600080fd5b50610593600480360381019061058e9190614ca6565b6113e7565b6040516105a091906153b1565b60405180910390f35b3480156105b557600080fd5b506105d060048036038101906105cb9190614ca6565b61145e565b6040516105dd91906153b1565b60405180910390f35b3480156105f257600080fd5b5061060d60048036038101906106089190614ce2565b611481565b005b34801561061b57600080fd5b506106246116a0565b005b34801561063257600080fd5b5061064d60048036038101906106489190614bc9565b61202c565b005b34801561065b57600080fd5b5061067660048036038101906106719190614c1b565b612107565b60405161068391906155a9565b60405180910390f35b34801561069857600080fd5b506106b360048036038101906106ae9190614bc9565b61218e565b005b3480156106c157600080fd5b506106dc60048036038101906106d79190614e05565b6122a1565b005b6060600380546106ed90615abf565b80601f016020809104026020016040519081016040528092919081815260200182805461071990615abf565b80156107665780601f1061073b57610100808354040283529160200191610766565b820191906000526020600020905b81548152906001019060200180831161074957829003601f168201915b5050505050905090565b60008061077b612350565b9050610788818585612358565b600191505092915050565b6000600254905090565b6000806107a8612350565b90506107b5858285612523565b6107c08585856125af565b60019150509392505050565b6107d4612350565b73ffffffffffffffffffffffffffffffffffffffff16600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614610863576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161085a90615569565b60405180910390fd5b6000600960008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555050565b6108c6612350565b73ffffffffffffffffffffffffffffffffffffffff16600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614610955576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161094c90615569565b60405180910390fd5b6001600860008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555050565b60006012905090565b60606000806000601860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663b2e6819b866040518263ffffffff1660e01b8152600401610a1b9190615251565b60006040518083038186803b158015610a3357600080fd5b505afa158015610a47573d6000803e3d6000fd5b505050506040513d6000823e3d601f19601f82011682018060405250810190610a709190614d23565b9350601260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b8152600401610acd9190615251565b60206040518083038186803b158015610ae557600080fd5b505afa158015610af9573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610b1d9190614e2e565b9250602454915060255490509193509193565b600080610b3b612350565b9050610b5c818585610b4d8589612107565b610b579190615882565b612358565b600191505092915050565b601860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663c7e772ed336040518263ffffffff1660e01b8152600401610bc29190615251565b602060405180830381600087803b158015610bdc57600080fd5b505af1158015610bf0573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610c149190614d8d565b50565b610c1f612350565b73ffffffffffffffffffffffffffffffffffffffff16600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614610cae576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ca590615569565b60405180910390fd5b80600c8190555050565b610cc0612350565b73ffffffffffffffffffffffffffffffffffffffff16600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614610d4f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d4690615569565b60405180910390fd5b601260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415610daa57600080fd5b8173ffffffffffffffffffffffffffffffffffffffff1663a9059cbb610dce611289565b836040518363ffffffff1660e01b8152600401610dec92919061533c565b602060405180830381600087803b158015610e0657600080fd5b505af1158015610e1a573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610e3e9190614d8d565b506000471115610ec7576000610e52611289565b73ffffffffffffffffffffffffffffffffffffffff1647604051610e759061523c565b60006040518083038185875af1925050503d8060008114610eb2576040519150601f19603f3d011682016040523d82523d6000602084013e610eb7565b606091505b5050905080610ec557600080fd5b505b5050565b610ed3612350565b73ffffffffffffffffffffffffffffffffffffffff16600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614610f62576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f5990615569565b60405180910390fd5b80601660026101000a81548160ff02191690831515021790555050565b60008060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b610fcf612350565b73ffffffffffffffffffffffffffffffffffffffff16600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161461105e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161105590615569565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff16600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a36000600560006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550565b601860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b61114d612350565b73ffffffffffffffffffffffffffffffffffffffff16600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16146111dc576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111d390615569565b60405180910390fd5b80600d8190555050565b6111ee612350565b73ffffffffffffffffffffffffffffffffffffffff16600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161461127d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161127490615569565b60405180910390fd5b6112868161321c565b50565b6000600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b6060600480546112c290615abf565b80601f01602080910402602001604051908101604052809291908181526020018280546112ee90615abf565b801561133b5780601f106113105761010080835404028352916020019161133b565b820191906000526020600020905b81548152906001019060200180831161131e57829003601f168201915b5050505050905090565b61134d612350565b73ffffffffffffffffffffffffffffffffffffffff16600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16146113dc576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113d390615569565b60405180910390fd5b601c54601781905550565b6000806113f2612350565b905060006114008286612107565b905083811015611445576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161143c906154e9565b60405180910390fd5b6114528286868403612358565b60019250505092915050565b600080611469612350565b90506114768185856125af565b600191505092915050565b611489612350565b73ffffffffffffffffffffffffffffffffffffffff16600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614611518576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161150f90615569565b60405180910390fd5b60005b815181101561169c57600160096000848481518110611563577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b602002602001015173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff021916908315150217905550601860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166331e79db0838381518110611633577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60200260200101516040518263ffffffff1660e01b81526004016116579190615251565b600060405180830381600087803b15801561167157600080fd5b505af1158015611685573d6000803e3d6000fd5b50505050808061169490615b22565b91505061151b565b5050565b6116a8612350565b73ffffffffffffffffffffffffffffffffffffffff16600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614611737576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161172e90615569565b60405180910390fd5b60006015541461177c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161177390615509565b60405180910390fd5b6117ab30601060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16601c54612358565b601360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663095ea7b3601060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff167fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff6040518363ffffffff1660e01b815260040161184a92919061533c565b602060405180830381600087803b15801561186457600080fd5b505af1158015611878573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061189c9190614d8d565b50601060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663c45a01556040518163ffffffff1660e01b815260040160206040518083038186803b15801561190557600080fd5b505afa158015611919573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061193d9190614bf2565b73ffffffffffffffffffffffffffffffffffffffff1663c9c6539630601360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff166040518363ffffffff1660e01b8152600401611999929190615295565b602060405180830381600087803b1580156119b357600080fd5b505af11580156119c7573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906119eb9190614bf2565b601160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550601860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166331e79db0601060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff166040518263ffffffff1660e01b8152600401611aa89190615251565b600060405180830381600087803b158015611ac257600080fd5b505af1158015611ad6573d6000803e3d6000fd5b50505050601860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166331e79db0601160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff166040518263ffffffff1660e01b8152600401611b579190615251565b600060405180830381600087803b158015611b7157600080fd5b505af1158015611b85573d6000803e3d6000fd5b50505050600160086000601060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff021916908315150217905550600160086000601160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555060076000601060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a905050601060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663e8e33700601360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1630601360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b8152600401611da79190615251565b60206040518083038186803b158015611dbf57600080fd5b505afa158015611dd3573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611df79190614e2e565b611e0030610f7f565b600080611e0b611289565b426040518963ffffffff1660e01b8152600401611e2f9897969594939291906152be565b606060405180830381600087803b158015611e4957600080fd5b505af1158015611e5d573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611e819190614e57565b5050506001601660016101000a81548160ff0219169083151502179055506001601660026101000a81548160ff02191690831515021790555060646002601c54611ecb9190615909565b611ed591906158d8565b601781905550426015819055506103e86001601c54611ef49190615909565b611efe91906158d8565b600c819055506103e86002601c54611f169190615909565b611f2091906158d8565b600d81905550601160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663095ea7b3601060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff167fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff6040518363ffffffff1660e01b8152600401611fc592919061533c565b602060405180830381600087803b158015611fdf57600080fd5b505af1158015611ff3573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906120179190614d8d565b50612020613936565b61202a6000613bac565b565b612034612350565b73ffffffffffffffffffffffffffffffffffffffff16600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16146120c3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016120ba90615569565b60405180910390fd5b80601860006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b6000600160008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905092915050565b612196612350565b73ffffffffffffffffffffffffffffffffffffffff16600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614612225576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161221c90615569565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415612295576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161228c90615429565b60405180910390fd5b61229e81613e94565b50565b6122a9612350565b73ffffffffffffffffffffffffffffffffffffffff16600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614612338576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161232f90615569565b60405180910390fd5b606481111561234657600080fd5b80601b8190555050565b600033905090565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614156123c8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016123bf90615589565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415612438576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161242f90615449565b60405180910390fd5b80600160008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b9258360405161251691906155a9565b60405180910390a3505050565b600061252f8484612107565b90507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff81146125a9578181101561259b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612592906154a9565b60405180910390fd5b6125a88484848403612358565b5b50505050565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16141561261f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161261690615469565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141561268f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161268690615489565b60405180910390fd5b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614156126d3576126ce838383613f5a565b613217565b6126db611289565b73ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16141580156127495750612719611289565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614155b15612cce576000601554118061278a57503073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16145b61279357600080fd5b600960008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff161580156128375750600960008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16155b61284057600080fd5b601160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161480156128eb5750601060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614155b80156129415750600760008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16155b80156129595750601660029054906101000a900460ff165b15612b49576017548161296b84610f7f565b6129759190615882565b111561298057600080fd5b42600a60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054106129cb57600080fd5b600f426129d89190615882565b600a60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550600860008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16158015612ab457506000600b60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054145b15612b4457600060155442612ac99190615963565b9050601e811015612b42576000607882601e612ae59190615963565b612aef9190615909565b90508042612afd9190615882565b600b60008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550505b505b612c1d565b600860008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16612c1c5742600b60008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205410612c1b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612c1290615549565b60405180910390fd5b5b5b6000612c2830610f7f565b9050600c548110158015612c495750601660009054906101000a900460ff16155b8015612ca35750601160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1614155b8015612cbb5750601660019054906101000a900460ff165b15612ccc57612ccb601b5461321c565b5b505b601060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614158015612d795750601160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16145b15612e2d57601860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663c7e772ed846040518263ffffffff1660e01b8152600401612dd99190615251565b602060405180830381600087803b158015612df357600080fd5b505af1158015612e07573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612e2b9190614d8d565b505b6000601a54601954612e3f9190615882565b905060006015541480612e5e5750601660009054906101000a900460ff165b15612e6857600090505b600760008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1680612f095750600760008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff165b15612f1357600090505b601060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161480612fbc5750601060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16145b15612fc657600090505b600081111561300657600060648383612fdf9190615909565b612fe991906158d8565b9050612ff6853083613f5a565b80836130029190615963565b9250505b613011848484613f5a565b601860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663e30443bc8561305987610f7f565b6040518363ffffffff1660e01b815260040161307692919061526c565b600060405180830381600087803b15801561309057600080fd5b505af11580156130a4573d6000803e3d6000fd5b50505050601860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663e30443bc846130f086610f7f565b6040518363ffffffff1660e01b815260040161310d92919061526c565b600060405180830381600087803b15801561312757600080fd5b505af115801561313b573d6000803e3d6000fd5b50505050613147613936565b6000601160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff1614156131b057826131a990615b6b565b905061320b565b601160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff16141561320a578290505b5b61321481613bac565b50505b505050565b6001601660006101000a81548160ff021916908315150217905550600061324230610f7f565b90506000819050600d5481111561325957600d5490505b6000601954601a5461326b9190615882565b601a54836132799190615909565b61328391906158d8565b9050600081836132939190615963565b905061329e826141d2565b6132a747614530565b60006132b3600061463c565b9050600068056bc75e2d6310000082846132cd9190615909565b6132d791906158d8565b90506000601d6003015490506000601d600401549050601d6005015443141561330b57601d600001549150601d6001015490505b600082828561331a9190615909565b61332491906158d8565b905060648a60646133359190615963565b826133409190615909565b61334a91906158d8565b90506000601260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b81526004016133a99190615251565b60206040518083038186803b1580156133c157600080fd5b505afa1580156133d5573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906133f99190614e2e565b90506000600367ffffffffffffffff81111561343e577f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b60405190808252806020026020018201604052801561346c5781602001602082028036833780820191505090505b50905030816000815181106134aa577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff1681525050601360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681600181518110613541577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff1681525050601260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16816002815181106135d8577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff168152505061363f30601060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff168a612358565b601060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16635c11d79589858430426040518663ffffffff1660e01b81526004016136a295949392919061561e565b600060405180830381600087803b1580156136bc57600080fd5b505af19250505080156136cd575060015b6136d6576136d7565b5b600082601260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b81526004016137359190615251565b60206040518083038186803b15801561374d57600080fd5b505afa158015613761573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906137859190614e2e565b61378f9190615963565b9050600081111561390c5760006002826137a991906158d8565b9050601260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663095ea7b3601860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16836040518363ffffffff1660e01b815260040161382a92919061533c565b602060405180830381600087803b15801561384457600080fd5b505af1158015613858573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061387c9190614d8d565b50601860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166303dd6b90826040518263ffffffff1660e01b81526004016138d891906155a9565b600060405180830381600087803b1580156138f257600080fd5b505af1158015613906573d6000803e3d6000fd5b50505050505b6000601660006101000a81548160ff02191690831515021790555050505050505050505050505050565b43601d60050154141561394857613baa565b601d60050154601d60020181905550601d60030154601d60000181905550601d60040154601d60010181905550600080601460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16630902f1ac6040518163ffffffff1660e01b815260040160606040518083038186803b1580156139e057600080fd5b505afa1580156139f4573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613a189190614db6565b506dffffffffffffffffffffffffffff1691506dffffffffffffffffffffffffffff1691506000601460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16630dfe16816040518163ffffffff1660e01b815260040160206040518083038186803b158015613aa757600080fd5b505afa158015613abb573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613adf9190614bf2565b9050601360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415613b505782601d6003018190555081601d60040181905550613b65565b81601d6003018190555082601d600401819055505b6000601d600501541415613b9c5743601d60020181905550601d60030154601d60000181905550601d60040154601d600101819055505b43601d600501819055505050505b565b6000613bb78261463c565b90506000811415613bc85750613e91565b602354811115613bda57806023819055505b602354606482613bea9190615909565b613bf491906158d8565b6064613c009190615963565b602481905550603260245410613e8f57600060646032601260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b8152600401613c719190615251565b60206040518083038186803b158015613c8957600080fd5b505afa158015613c9d573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613cc19190614e2e565b613ccb9190615909565b613cd591906158d8565b90507f75a56278d9bb7100eb58040300f14109299b3494d97d5fc015b06c8ca27c5fec8183602354602454604051613d109493929190615678565b60405180910390a1601260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663095ea7b3601860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16836040518363ffffffff1660e01b8152600401613d9792919061533c565b602060405180830381600087803b158015613db157600080fd5b505af1158015613dc5573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613de99190614d8d565b50601860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166303dd6b90826040518263ffffffff1660e01b8152600401613e4591906155a9565b600060405180830381600087803b158015613e5f57600080fd5b505af1158015613e73573d6000803e3d6000fd5b5050505081602381905550600060248190555080602581905550505b505b50565b6000600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600560006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415613fca576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613fc190615409565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141561403a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161403190615489565b60405180910390fd5b6140458383836148c3565b60008060008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050818110156140cb576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016140c2906154c9565b60405180910390fd5b8181036000808673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550816000808573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825401925050819055508273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef846040516141b991906155a9565b60405180910390a36141cc8484846148c8565b50505050565b6000600367ffffffffffffffff811115614215577f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6040519080825280602002602001820160405280156142435781602001602082028036833780820191505090505b5090503081600081518110614281577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff1681525050601360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681600181518110614318577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff1681525050601060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663ad5c46486040518163ffffffff1660e01b815260040160206040518083038186803b1580156143ba57600080fd5b505afa1580156143ce573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906143f29190614bf2565b8160028151811061442c577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff168152505061449330601060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1684612358565b601060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663791ac9478360008430426040518663ffffffff1660e01b81526004016144f79594939291906155c4565b600060405180830381600087803b15801561451157600080fd5b505af1925050508015614522575060015b61452b5761452c565b5b5050565b6000614559606461454b603c856148cd90919063ffffffff16565b61494890919063ffffffff16565b9050600e60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166108fc829081150290604051600060405180830381858888f193505050501580156145c3573d6000803e3d6000fd5b50600f60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166108fc828461460c9190615963565b9081150290604051600060405180830381858888f19350505050158015614637573d6000803e3d6000fd5b505050565b60008073ffffffffffffffffffffffffffffffffffffffff16601160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16141561469d57600090506148be565b600080601160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16630902f1ac6040518163ffffffff1660e01b815260040160606040518083038186803b15801561470857600080fd5b505afa15801561471c573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906147409190614db6565b506dffffffffffffffffffffffffffff1691506dffffffffffffffffffffffffffff1691506000601160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16630dfe16816040518163ffffffff1660e01b815260040160206040518083038186803b1580156147cf57600080fd5b505afa1580156147e3573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906148079190614bf2565b9050601360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161461486b576000839050829350809250505b600082846148799190615909565b9050858361488791906157ee565b9250828161489591906158d8565b93508268056bc75e2d63100000856148ad9190615909565b6148b791906158d8565b9450505050505b919050565b505050565b505050565b6000808314156148e05760009050614942565b600082846148ee9190615909565b90508284826148fd91906158d8565b1461493d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161493490615529565b60405180910390fd5b809150505b92915050565b600061498a83836040518060400160405280601a81526020017f536166654d6174683a206469766973696f6e206279207a65726f000000000000815250614992565b905092915050565b600080831182906149d9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016149d091906153e7565b60405180910390fd5b50600083856149e891906158d8565b9050809150509392505050565b6000614a08614a03846156fd565b6156d8565b90508083825260208201905082856020860282011115614a2757600080fd5b60005b85811015614a575781614a3d8882614acd565b845260208401935060208301925050600181019050614a2a565b5050509392505050565b6000614a74614a6f84615729565b6156d8565b90508083825260208201905082856020860282011115614a9357600080fd5b60005b85811015614ac35781614aa98882614b9f565b845260208401935060208301925050600181019050614a96565b5050509392505050565b600081359050614adc81615f31565b92915050565b600081519050614af181615f31565b92915050565b600082601f830112614b0857600080fd5b8135614b188482602086016149f5565b91505092915050565b600082601f830112614b3257600080fd5b8151614b42848260208601614a61565b91505092915050565b600081359050614b5a81615f48565b92915050565b600081519050614b6f81615f48565b92915050565b600081519050614b8481615f5f565b92915050565b600081359050614b9981615f76565b92915050565b600081519050614bae81615f76565b92915050565b600081519050614bc381615f8d565b92915050565b600060208284031215614bdb57600080fd5b6000614be984828501614acd565b91505092915050565b600060208284031215614c0457600080fd5b6000614c1284828501614ae2565b91505092915050565b60008060408385031215614c2e57600080fd5b6000614c3c85828601614acd565b9250506020614c4d85828601614acd565b9150509250929050565b600080600060608486031215614c6c57600080fd5b6000614c7a86828701614acd565b9350506020614c8b86828701614acd565b9250506040614c9c86828701614b8a565b9150509250925092565b60008060408385031215614cb957600080fd5b6000614cc785828601614acd565b9250506020614cd885828601614b8a565b9150509250929050565b600060208284031215614cf457600080fd5b600082013567ffffffffffffffff811115614d0e57600080fd5b614d1a84828501614af7565b91505092915050565b600060208284031215614d3557600080fd5b600082015167ffffffffffffffff811115614d4f57600080fd5b614d5b84828501614b21565b91505092915050565b600060208284031215614d7657600080fd5b6000614d8484828501614b4b565b91505092915050565b600060208284031215614d9f57600080fd5b6000614dad84828501614b60565b91505092915050565b600080600060608486031215614dcb57600080fd5b6000614dd986828701614b75565b9350506020614dea86828701614b75565b9250506040614dfb86828701614bb4565b9150509250925092565b600060208284031215614e1757600080fd5b6000614e2584828501614b8a565b91505092915050565b600060208284031215614e4057600080fd5b6000614e4e84828501614b9f565b91505092915050565b600080600060608486031215614e6c57600080fd5b6000614e7a86828701614b9f565b9350506020614e8b86828701614b9f565b9250506040614e9c86828701614b9f565b9150509250925092565b6000614eb28383614ee5565b60208301905092915050565b6000614eca838361520f565b60208301905092915050565b614edf81615a20565b82525050565b614eee81615997565b82525050565b614efd81615997565b82525050565b6000614f0e82615775565b614f1881856157b0565b9350614f2383615755565b8060005b83811015614f54578151614f3b8882614ea6565b9750614f4683615796565b925050600181019050614f27565b5085935050505092915050565b6000614f6c82615780565b614f7681856157c1565b9350614f8183615765565b8060005b83811015614fb2578151614f998882614ebe565b9750614fa4836157a3565b925050600181019050614f85565b5085935050505092915050565b614fc8816159a9565b82525050565b614fd781615a32565b82525050565b614fe681615a56565b82525050565b6000614ff78261578b565b61500181856157dd565b9350615011818560208601615a8c565b61501a81615c70565b840191505092915050565b6000615032601d836157dd565b915061503d82615c81565b602082019050919050565b60006150556026836157dd565b915061506082615caa565b604082019050919050565b60006150786022836157dd565b915061508382615cf9565b604082019050919050565b600061509b601e836157dd565b91506150a682615d48565b602082019050919050565b60006150be601c836157dd565b91506150c982615d71565b602082019050919050565b60006150e1601d836157dd565b91506150ec82615d9a565b602082019050919050565b6000615104601f836157dd565b915061510f82615dc3565b602082019050919050565b6000615127601e836157dd565b915061513282615dec565b602082019050919050565b600061514a600c836157dd565b915061515582615e15565b602082019050919050565b600061516d6021836157dd565b915061517882615e3e565b604082019050919050565b60006151906004836157dd565b915061519b82615e8d565b602082019050919050565b60006151b36020836157dd565b91506151be82615eb6565b602082019050919050565b60006151d66000836157d2565b91506151e182615edf565b600082019050919050565b60006151f96024836157dd565b915061520482615ee2565b604082019050919050565b615218816159f9565b82525050565b615227816159f9565b82525050565b61523681615a13565b82525050565b6000615247826151c9565b9150819050919050565b60006020820190506152666000830184614ef4565b92915050565b60006040820190506152816000830185614ed6565b61528e602083018461521e565b9392505050565b60006040820190506152aa6000830185614ef4565b6152b76020830184614ef4565b9392505050565b6000610100820190506152d4600083018b614ef4565b6152e1602083018a614ef4565b6152ee604083018961521e565b6152fb606083018861521e565b6153086080830187614fdd565b61531560a0830186614fdd565b61532260c0830185614ef4565b61532f60e083018461521e565b9998505050505050505050565b60006040820190506153516000830185614ef4565b61535e602083018461521e565b9392505050565b6000608082019050818103600083015261537f8187614f61565b905061538e602083018661521e565b61539b604083018561521e565b6153a8606083018461521e565b95945050505050565b60006020820190506153c66000830184614fbf565b92915050565b60006020820190506153e16000830184614fce565b92915050565b600060208201905081810360008301526154018184614fec565b905092915050565b6000602082019050818103600083015261542281615025565b9050919050565b6000602082019050818103600083015261544281615048565b9050919050565b600060208201905081810360008301526154628161506b565b9050919050565b600060208201905081810360008301526154828161508e565b9050919050565b600060208201905081810360008301526154a2816150b1565b9050919050565b600060208201905081810360008301526154c2816150d4565b9050919050565b600060208201905081810360008301526154e2816150f7565b9050919050565b600060208201905081810360008301526155028161511a565b9050919050565b600060208201905081810360008301526155228161513d565b9050919050565b6000602082019050818103600083015261554281615160565b9050919050565b6000602082019050818103600083015261556281615183565b9050919050565b60006020820190508181036000830152615582816151a6565b9050919050565b600060208201905081810360008301526155a2816151ec565b9050919050565b60006020820190506155be600083018461521e565b92915050565b600060a0820190506155d9600083018861521e565b6155e66020830187614fdd565b81810360408301526155f88186614f03565b90506156076060830185614ef4565b615614608083018461521e565b9695505050505050565b600060a082019050615633600083018861521e565b615640602083018761521e565b81810360408301526156528186614f03565b90506156616060830185614ef4565b61566e608083018461521e565b9695505050505050565b600060808201905061568d600083018761521e565b61569a602083018661521e565b6156a7604083018561521e565b6156b4606083018461521e565b95945050505050565b60006020820190506156d2600083018461522d565b92915050565b60006156e26156f3565b90506156ee8282615af1565b919050565b6000604051905090565b600067ffffffffffffffff82111561571857615717615c41565b5b602082029050602081019050919050565b600067ffffffffffffffff82111561574457615743615c41565b5b602082029050602081019050919050565b6000819050602082019050919050565b6000819050602082019050919050565b600081519050919050565b600081519050919050565b600081519050919050565b6000602082019050919050565b6000602082019050919050565b600082825260208201905092915050565b600082825260208201905092915050565b600081905092915050565b600082825260208201905092915050565b60006157f9826159b5565b9150615804836159b5565b9250817f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0383136000831215161561583f5761583e615bb4565b5b817f800000000000000000000000000000000000000000000000000000000000000003831260008312161561587757615876615bb4565b5b828201905092915050565b600061588d826159f9565b9150615898836159f9565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff038211156158cd576158cc615bb4565b5b828201905092915050565b60006158e3826159f9565b91506158ee836159f9565b9250826158fe576158fd615be3565b5b828204905092915050565b6000615914826159f9565b915061591f836159f9565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff048311821515161561595857615957615bb4565b5b828202905092915050565b600061596e826159f9565b9150615979836159f9565b92508282101561598c5761598b615bb4565b5b828203905092915050565b60006159a2826159d9565b9050919050565b60008115159050919050565b6000819050919050565b60006dffffffffffffffffffffffffffff82169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b600063ffffffff82169050919050565b600060ff82169050919050565b6000615a2b82615a68565b9050919050565b6000615a3d82615a44565b9050919050565b6000615a4f826159d9565b9050919050565b6000615a61826159f9565b9050919050565b6000615a7382615a7a565b9050919050565b6000615a85826159d9565b9050919050565b60005b83811015615aaa578082015181840152602081019050615a8f565b83811115615ab9576000848401525b50505050565b60006002820490506001821680615ad757607f821691505b60208210811415615aeb57615aea615c12565b5b50919050565b615afa82615c70565b810181811067ffffffffffffffff82111715615b1957615b18615c41565b5b80604052505050565b6000615b2d826159f9565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff821415615b6057615b5f615bb4565b5b600182019050919050565b6000615b76826159b5565b91507f8000000000000000000000000000000000000000000000000000000000000000821415615ba957615ba8615bb4565b5b816000039050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6000601f19601f8301169050919050565b7f74616e736665722066726f6d20746865207a65726f2061646472657373000000600082015250565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b7f45524332303a20617070726f766520746f20746865207a65726f20616464726560008201527f7373000000000000000000000000000000000000000000000000000000000000602082015250565b7f7472616e736665722066726f6d20746865207a65726f20616464726573730000600082015250565b7f7472616e7366657220746f20746865207a65726f206164647265737300000000600082015250565b7f45524332303a20696e73756666696369656e7420616c6c6f77616e6365000000600082015250565b7f7472616e7366657220616d6f756e7420657863656564732062616c616e636500600082015250565b7f64656372656173656420616c6c6f77616e63652062656c6f77207a65726f0000600082015250565b7f616c7265616479206f70656e0000000000000000000000000000000000000000600082015250565b7f536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f60008201527f7700000000000000000000000000000000000000000000000000000000000000602082015250565b7f7761697400000000000000000000000000000000000000000000000000000000600082015250565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b50565b7f45524332303a20617070726f76652066726f6d20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b615f3a81615997565b8114615f4557600080fd5b50565b615f51816159a9565b8114615f5c57600080fd5b50565b615f68816159bf565b8114615f7357600080fd5b50565b615f7f816159f9565b8114615f8a57600080fd5b50565b615f9681615a03565b8114615fa157600080fd5b5056fea264697066735822122005ffb5d7609075d0513f767483910cb20fbd35732a3fb8aea502620a0362952564736f6c63430008040033
Loading...
Loading
Loading...
Loading
Loading...
Loading
[ Download: CSV Export ]
[ Download: CSV Export ]
A contract address hosts a smart contract, which is a set of code stored on the blockchain that runs when predetermined conditions are met. Learn more about addresses in our Knowledge Base.