ERC-20
Overview
Max Total Supply
1,000,000,000,000 FomoETH
Holders
127
Market
Onchain Market Cap
$0.00
Circulating Supply Market Cap
-
Other Info
Token Contract (WITH 9 Decimals)
Balance
420,573,071,976.831230108 FomoETHValue
$0.00Loading...
Loading
Loading...
Loading
Loading...
Loading
# | Exchange | Pair | Price | 24H Volume | % Volume |
---|
This contract contains unverified libraries: IterableMapping
This contract may be a proxy contract. Click on More Options and select Is this a proxy? to confirm and enable the "Read as Proxy" & "Write as Proxy" tabs.
Contract Name:
FomoETH
Compiler Version
v0.8.0+commit.c7dfd78e
Contract Source Code (Solidity)
/** *Submitted for verification at Etherscan.io on 2021-12-09 */ //SPDX-License-Identifier: Unlicensed // Website: https://fomoeth.net/ // Telegram: https://t.me/FomoETH // Twitter: https://twitter.com/fomo_eth pragma solidity ^0.8.0; abstract contract Context { function _msgSender() internal view virtual returns (address) { return msg.sender; } function _msgData() internal view virtual returns (bytes calldata) { return msg.data; } } contract Ownable is Context { address private _owner; address private _previousOwner; event OwnershipTransferred(address indexed previousOwner, address indexed newOwner); /** * @dev Initializes the contract setting the deployer as the initial owner. */ constructor () { address msgSender = _msgSender(); _owner = msgSender; emit OwnershipTransferred(address(0), msgSender); } /** * @dev Returns the address of the current owner. */ function owner() public view returns (address) { return _owner; } /** * @dev Throws if called by any account other than the owner. */ modifier onlyOwner() { require(_owner == _msgSender(), "Ownable: caller is not the owner"); _; } /** * @dev Leaves the contract without owner. It will not be possible to call * `onlyOwner` functions anymore. Can only be called by the current owner. * * NOTE: Renouncing ownership will leave the contract without an owner, * thereby removing any functionality that is only available to the owner. */ function renounceOwnership() public virtual onlyOwner { emit OwnershipTransferred(_owner, address(0)); _owner = address(0); } /** * @dev Transfers ownership of the contract to a new account (`newOwner`). * Can only be called by the current owner. */ function transferOwnership(address newOwner) public virtual onlyOwner { require(newOwner != address(0), "Ownable: new owner is the zero address"); emit OwnershipTransferred(_owner, newOwner); _owner = newOwner; } } interface IERC20 { /** * @dev Returns the amount of tokens in existence. */ function totalSupply() external view returns (uint256); /** * @dev Returns the amount of tokens owned by `account`. */ function balanceOf(address account) external view returns (uint256); /** * @dev Moves `amount` tokens from the caller's account to `recipient`. * * Returns a boolean value indicating whether the operation succeeded. * * Emits a {Transfer} event. */ function transfer(address recipient, uint256 amount) external returns (bool); /** * @dev Returns the remaining number of tokens that `spender` will be * allowed to spend on behalf of `owner` through {transferFrom}. This is * zero by default. * * This value changes when {approve} or {transferFrom} are called. */ function allowance(address owner, address spender) external view returns (uint256); /** * @dev Sets `amount` as the allowance of `spender` over the caller's tokens. * * Returns a boolean value indicating whether the operation succeeded. * * IMPORTANT: Beware that changing an allowance with this method brings the risk * that someone may use both the old and the new allowance by unfortunate * transaction ordering. One possible solution to mitigate this race * condition is to first reduce the spender's allowance to 0 and set the * desired value afterwards: * https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729 * * Emits an {Approval} event. */ function approve(address spender, uint256 amount) external returns (bool); /** * @dev Moves `amount` tokens from `sender` to `recipient` using the * allowance mechanism. `amount` is then deducted from the caller's * allowance. * * Returns a boolean value indicating whether the operation succeeded. * * Emits a {Transfer} event. */ function transferFrom( address sender, address recipient, uint256 amount ) external returns (bool); /** * @dev Emitted when `value` tokens are moved from one account (`from`) to * another (`to`). * * Note that `value` may be zero. */ event Transfer(address indexed from, address indexed to, uint256 value); /** * @dev Emitted when the allowance of a `spender` for an `owner` is set by * a call to {approve}. `value` is the new allowance. */ event Approval(address indexed owner, address indexed spender, uint256 value); } interface IERC20Metadata is IERC20 { /** * @dev Returns the name of the token. */ function name() external view returns (string memory); /** * @dev Returns the symbol of the token. */ function symbol() external view returns (string memory); /** * @dev Returns the decimals places of the token. */ function decimals() external view returns (uint256); } contract ERC20 is Context, IERC20, IERC20Metadata { mapping(address => uint256) private _balances; mapping(address => mapping(address => uint256)) private _allowances; uint256 private _totalSupply; string private _name; string private _symbol; /** * @dev Sets the values for {name} and {symbol}. * * The default value of {decimals} is 18. To select a different value for * {decimals} you should overload it. * * All two of these values are immutable: they can only be set once during * construction. */ constructor(string memory name_, string memory symbol_) { _name = name_; _symbol = symbol_; } /** * @dev Returns the name of the token. */ function name() public view virtual override returns (string memory) { return _name; } /** * @dev Returns the symbol of the token, usually a shorter version of the * name. */ function symbol() public view virtual override returns (string memory) { return _symbol; } /** * @dev Returns the number of decimals used to get its user representation. * For example, if `decimals` equals `2`, a balance of `505` tokens should * be displayed to a user as `5,05` (`505 / 10 ** 2`). * * Tokens usually opt for a value of 18, imitating the relationship between * Ether and Wei. This is the value {ERC20} uses, unless this function is * overridden; * * NOTE: This information is only used for _display_ purposes: it in * no way affects any of the arithmetic of the contract, including * {IERC20-balanceOf} and {IERC20-transfer}. */ function decimals() public view virtual override returns (uint256) { return 9; } /** * @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: * * - `recipient` cannot be the zero address. * - the caller must have a balance of at least `amount`. */ function transfer(address recipient, uint256 amount) public virtual override returns (bool) { _transfer(_msgSender(), recipient, 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}. * * Requirements: * * - `spender` cannot be the zero address. */ function approve(address spender, uint256 amount) public virtual override returns (bool) { _approve(_msgSender(), 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}. * * Requirements: * * - `sender` and `recipient` cannot be the zero address. * - `sender` must have a balance of at least `amount`. * - the caller must have allowance for ``sender``'s tokens of at least * `amount`. */ function transferFrom( address sender, address recipient, uint256 amount ) public virtual override returns (bool) { _transfer(sender, recipient, amount); uint256 currentAllowance = _allowances[sender][_msgSender()]; require(currentAllowance >= amount, "ERC20: transfer amount exceeds allowance"); unchecked { _approve(sender, _msgSender(), currentAllowance - 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) { _approve(_msgSender(), spender, _allowances[_msgSender()][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) { uint256 currentAllowance = _allowances[_msgSender()][spender]; require(currentAllowance >= subtractedValue, "ERC20: decreased allowance below zero"); unchecked { _approve(_msgSender(), spender, currentAllowance - subtractedValue); } return true; } /** * @dev Moves `amount` of tokens from `sender` to `recipient`. * * 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: * * - `sender` cannot be the zero address. * - `recipient` cannot be the zero address. * - `sender` must have a balance of at least `amount`. */ function _transfer( address sender, address recipient, uint256 amount ) internal virtual { require(sender != address(0), "ERC20: transfer from the zero address"); require(recipient != address(0), "ERC20: transfer to the zero address"); _beforeTokenTransfer(sender, recipient, amount); uint256 senderBalance = _balances[sender]; require(senderBalance >= amount, "ERC20: transfer amount exceeds balance"); unchecked { _balances[sender] = senderBalance - amount; } _balances[recipient] += amount; emit Transfer(sender, recipient, amount); _afterTokenTransfer(sender, recipient, amount); } /** @dev Creates `amount` tokens and assigns them to `account`, increasing * the total supply. * * Emits a {Transfer} event with `from` set to the zero address. * * Requirements: * * - `account` cannot be the zero address. */ function _mint(address account, uint256 amount) internal virtual { require(account != address(0), "ERC20: mint to the zero address"); _beforeTokenTransfer(address(0), account, amount); _totalSupply += amount; _balances[account] += amount; emit Transfer(address(0), account, amount); _afterTokenTransfer(address(0), account, amount); } /** * @dev Destroys `amount` tokens from `account`, reducing the * total supply. * * Emits a {Transfer} event with `to` set to the zero address. * * Requirements: * * - `account` cannot be the zero address. * - `account` must have at least `amount` tokens. */ function _burn(address account, uint256 amount) internal virtual { require(account != address(0), "ERC20: burn from the zero address"); _beforeTokenTransfer(account, address(0), amount); uint256 accountBalance = _balances[account]; require(accountBalance >= amount, "ERC20: burn amount exceeds balance"); unchecked { _balances[account] = accountBalance - amount; } _totalSupply -= amount; emit Transfer(account, address(0), amount); _afterTokenTransfer(account, address(0), amount); } /** * @dev Sets `amount` as the allowance of `spender` over the `owner` s tokens. * * This internal function is equivalent to `approve`, and can be used to * e.g. set automatic allowances for certain subsystems, etc. * * Emits an {Approval} event. * * Requirements: * * - `owner` cannot be the zero address. * - `spender` cannot be the zero address. */ function _approve( address owner, address spender, uint256 amount ) internal virtual { require(owner != address(0), "ERC20: approve from the zero address"); require(spender != address(0), "ERC20: approve to the zero address"); _allowances[owner][spender] = amount; emit Approval(owner, spender, amount); } /** * @dev 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 SafeMathUint { function toInt256Safe(uint256 a) internal pure returns (int256) { int256 b = int256(a); require(b >= 0); return b; } } library SafeMathInt { function mul(int256 a, int256 b) internal pure returns (int256) { // Prevent overflow when multiplying INT256_MIN with -1 // https://github.com/RequestNetwork/requestNetwork/issues/43 require(!(a == - 2**255 && b == -1) && !(b == - 2**255 && a == -1)); int256 c = a * b; require((b == 0) || (c / b == a)); return c; } function div(int256 a, int256 b) internal pure returns (int256) { // Prevent overflow when dividing INT256_MIN by -1 // https://github.com/RequestNetwork/requestNetwork/issues/43 require(!(a == - 2**255 && b == -1) && (b > 0)); return a / b; } function sub(int256 a, int256 b) internal pure returns (int256) { require((b >= 0 && a - b <= a) || (b < 0 && a - b > a)); return a - b; } 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; } function toUint256Safe(int256 a) internal pure returns (uint256) { require(a >= 0); return uint256(a); } } library SafeMath { /** * @dev Returns the addition of two unsigned integers, with an overflow flag. * * _Available since v3.4._ */ function tryAdd(uint256 a, uint256 b) internal pure returns (bool, uint256) { unchecked { uint256 c = a + b; if (c < a) return (false, 0); return (true, c); } } /** * @dev Returns the substraction of two unsigned integers, with an overflow flag. * * _Available since v3.4._ */ function trySub(uint256 a, uint256 b) internal pure returns (bool, uint256) { unchecked { if (b > a) return (false, 0); return (true, a - b); } } /** * @dev Returns the multiplication of two unsigned integers, with an overflow flag. * * _Available since v3.4._ */ function tryMul(uint256 a, uint256 b) internal pure returns (bool, uint256) { unchecked { // Gas optimization: this is cheaper than requiring 'a' not being zero, but the // benefit is lost if 'b' is also tested. // See: https://github.com/OpenZeppelin/openzeppelin-contracts/pull/522 if (a == 0) return (true, 0); uint256 c = a * b; if (c / a != b) return (false, 0); return (true, c); } } /** * @dev Returns the division of two unsigned integers, with a division by zero flag. * * _Available since v3.4._ */ function tryDiv(uint256 a, uint256 b) internal pure returns (bool, uint256) { unchecked { if (b == 0) return (false, 0); return (true, a / b); } } /** * @dev Returns the remainder of dividing two unsigned integers, with a division by zero flag. * * _Available since v3.4._ */ function tryMod(uint256 a, uint256 b) internal pure returns (bool, uint256) { unchecked { if (b == 0) return (false, 0); return (true, a % b); } } /** * @dev Returns the addition of two unsigned integers, reverting on * overflow. * * Counterpart to Solidity's `+` operator. * * Requirements: * * - Addition cannot overflow. */ function add(uint256 a, uint256 b) internal pure returns (uint256) { return a + b; } /** * @dev Returns the subtraction of two unsigned integers, reverting on * overflow (when the result is negative). * * Counterpart to Solidity's `-` operator. * * Requirements: * * - Subtraction cannot overflow. */ function sub(uint256 a, uint256 b) internal pure returns (uint256) { return a - b; } /** * @dev Returns the multiplication of two unsigned integers, reverting on * overflow. * * Counterpart to Solidity's `*` operator. * * Requirements: * * - Multiplication cannot overflow. */ function mul(uint256 a, uint256 b) internal pure returns (uint256) { return a * b; } /** * @dev Returns the integer division of two unsigned integers, reverting on * division by zero. The result is rounded towards zero. * * Counterpart to Solidity's `/` operator. * * Requirements: * * - The divisor cannot be zero. */ function div(uint256 a, uint256 b) internal pure returns (uint256) { return a / b; } /** * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo), * reverting when dividing by zero. * * Counterpart to Solidity's `%` operator. This function uses a `revert` * opcode (which leaves remaining gas untouched) while Solidity uses an * invalid opcode to revert (consuming all remaining gas). * * Requirements: * * - The divisor cannot be zero. */ function mod(uint256 a, uint256 b) internal pure returns (uint256) { return a % b; } /** * @dev Returns the subtraction of two unsigned integers, reverting with custom message on * overflow (when the result is negative). * * CAUTION: This function is deprecated because it requires allocating memory for the error * message unnecessarily. For custom revert reasons use {trySub}. * * Counterpart to Solidity's `-` operator. * * Requirements: * * - Subtraction cannot overflow. */ function sub( uint256 a, uint256 b, string memory errorMessage ) internal pure returns (uint256) { unchecked { require(b <= a, errorMessage); return a - b; } } /** * @dev Returns the integer division of two unsigned integers, reverting with custom message on * division by zero. The result is rounded towards zero. * * Counterpart to Solidity's `/` operator. Note: this function uses a * `revert` opcode (which leaves remaining gas untouched) while Solidity * uses an invalid opcode to revert (consuming all remaining gas). * * Requirements: * * - The divisor cannot be zero. */ function div( uint256 a, uint256 b, string memory errorMessage ) internal pure returns (uint256) { unchecked { require(b > 0, errorMessage); return a / b; } } /** * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo), * reverting with custom message when dividing by zero. * * CAUTION: This function is deprecated because it requires allocating memory for the error * message unnecessarily. For custom revert reasons use {tryMod}. * * Counterpart to Solidity's `%` operator. This function uses a `revert` * opcode (which leaves remaining gas untouched) while Solidity uses an * invalid opcode to revert (consuming all remaining gas). * * Requirements: * * - The divisor cannot be zero. */ function mod( uint256 a, uint256 b, string memory errorMessage ) internal pure returns (uint256) { unchecked { require(b > 0, errorMessage); return a % b; } } } library IterableMapping { // Iterable mapping from address to uint; struct Map { address[] keys; mapping(address => uint) values; mapping(address => uint) indexOf; mapping(address => bool) inserted; } function get(Map storage map, address key) public view returns (uint) { return map.values[key]; } function getIndexOfKey(Map storage map, address key) public view returns (int) { if(!map.inserted[key]) { return -1; } return int(map.indexOf[key]); } function getKeyAtIndex(Map storage map, uint index) public view returns (address) { return map.keys[index]; } function size(Map storage map) public view returns (uint) { return map.keys.length; } function set(Map storage map, address key, uint val) public { if (map.inserted[key]) { map.values[key] = val; } else { map.inserted[key] = true; map.values[key] = val; map.indexOf[key] = map.keys.length; map.keys.push(key); } } function remove(Map storage map, address key) public { if (!map.inserted[key]) { return; } delete map.inserted[key]; delete map.values[key]; uint index = map.indexOf[key]; uint lastIndex = map.keys.length - 1; address lastKey = map.keys[lastIndex]; map.indexOf[lastKey] = index; delete map.indexOf[key]; map.keys[index] = lastKey; map.keys.pop(); } } interface DividendPayingTokenOptionalInterface { function withdrawableDividendOf(address _owner) external view returns(uint256); function withdrawnDividendOf(address _owner) external view returns(uint256); function accumulativeDividendOf(address _owner) external view returns(uint256); } interface DividendPayingTokenInterface { function dividendOf(address _owner) external view returns(uint256); function distributeDividends() external payable; function withdrawDividend() external; event DividendsDistributed(address indexed from, uint256 weiAmount); event DividendWithdrawn(address indexed to, uint256 weiAmount); } contract DividendPayingToken is ERC20, DividendPayingTokenInterface, DividendPayingTokenOptionalInterface { using SafeMath for uint256; using SafeMathUint for uint256; using SafeMathInt for int256; // With `magnitude`, we can properly distribute dividends even if the amount of received ether is small. // For more discussion about choosing the value of `magnitude`, // see https://github.com/ethereum/EIPs/issues/1726#issuecomment-472352728 uint256 constant internal magnitude = 2**128; uint256 internal magnifiedDividendPerShare; // About dividendCorrection: // If the token balance of a `_user` is never changed, the dividend of `_user` can be computed with: // `dividendOf(_user) = dividendPerShare * balanceOf(_user)`. // When `balanceOf(_user)` is changed (via minting/burning/transferring tokens), // `dividendOf(_user)` should not be changed, // but the computed value of `dividendPerShare * balanceOf(_user)` is changed. // To keep the `dividendOf(_user)` unchanged, we add a correction term: // `dividendOf(_user) = dividendPerShare * balanceOf(_user) + dividendCorrectionOf(_user)`, // where `dividendCorrectionOf(_user)` is updated whenever `balanceOf(_user)` is changed: // `dividendCorrectionOf(_user) = dividendPerShare * (old balanceOf(_user)) - (new balanceOf(_user))`. // So now `dividendOf(_user)` returns the same value before and after `balanceOf(_user)` is changed. mapping(address => int256) internal magnifiedDividendCorrections; mapping(address => uint256) internal withdrawnDividends; uint256 public totalDividendsDistributed; constructor(string memory _name, string memory _symbol) ERC20(_name, _symbol) { } /// @dev Distributes dividends whenever ether is paid to this contract. receive() external payable { distributeDividends(); } /// @notice Distributes ether to token holders as dividends. /// @dev It reverts if the total supply of tokens is 0. /// It emits the `DividendsDistributed` event if the amount of received ether is greater than 0. /// About undistributed ether: /// In each distribution, there is a small amount of ether not distributed, /// the magnified amount of which is /// `(msg.value * magnitude) % totalSupply()`. /// With a well-chosen `magnitude`, the amount of undistributed ether /// (de-magnified) in a distribution can be less than 1 wei. /// We can actually keep track of the undistributed ether in a distribution /// and try to distribute it in the next distribution, /// but keeping track of such data on-chain costs much more than /// the saved ether, so we don't do that. function distributeDividends() public override payable { require(totalSupply() > 0); if (msg.value > 0) { magnifiedDividendPerShare = magnifiedDividendPerShare.add( (msg.value).mul(magnitude) / totalSupply() ); emit DividendsDistributed(msg.sender, msg.value); totalDividendsDistributed = totalDividendsDistributed.add(msg.value); } } /// @notice Withdraws the ether distributed to the sender. /// @dev It emits a `DividendWithdrawn` event if the amount of withdrawn ether is greater than 0. function withdrawDividend() public virtual override { _withdrawDividendOfUser(payable(msg.sender)); } /// @notice Withdraws the ether distributed to the sender. /// @dev It emits a `DividendWithdrawn` event if the amount of withdrawn ether is greater than 0. function _withdrawDividendOfUser(address payable user) internal returns (uint256) { uint256 _withdrawableDividend = withdrawableDividendOf(user); if (_withdrawableDividend > 0) { withdrawnDividends[user] = withdrawnDividends[user].add(_withdrawableDividend); emit DividendWithdrawn(user, _withdrawableDividend); (bool success,) = user.call{value: _withdrawableDividend, gas: 3000}(""); if(!success) { withdrawnDividends[user] = withdrawnDividends[user].sub(_withdrawableDividend); return 0; } return _withdrawableDividend; } return 0; } /// @notice View the amount of dividend in wei that an address can withdraw. /// @param _owner The address of a token holder. /// @return The amount of dividend in wei that `_owner` can withdraw. function dividendOf(address _owner) public view override returns(uint256) { return withdrawableDividendOf(_owner); } /// @notice View the amount of dividend in wei that an address can withdraw. /// @param _owner The address of a token holder. /// @return The amount of dividend in wei that `_owner` can withdraw. function withdrawableDividendOf(address _owner) public view override returns(uint256) { return accumulativeDividendOf(_owner).sub(withdrawnDividends[_owner]); } /// @notice View the amount of dividend in wei that an address has withdrawn. /// @param _owner The address of a token holder. /// @return The amount of dividend in wei that `_owner` has withdrawn. function withdrawnDividendOf(address _owner) public view override returns(uint256) { return withdrawnDividends[_owner]; } /// @notice View the amount of dividend in wei that an address has earned in total. /// @dev accumulativeDividendOf(_owner) = withdrawableDividendOf(_owner) + withdrawnDividendOf(_owner) /// = (magnifiedDividendPerShare * balanceOf(_owner) + magnifiedDividendCorrections[_owner]) / magnitude /// @param _owner The address of a token holder. /// @return The amount of dividend in wei that `_owner` has earned in total. function accumulativeDividendOf(address _owner) public view override returns(uint256) { return magnifiedDividendPerShare.mul(balanceOf(_owner)).toInt256Safe() .add(magnifiedDividendCorrections[_owner]).toUint256Safe() / magnitude; } /// @dev Internal function that transfer tokens from one address to another. /// Update magnifiedDividendCorrections to keep dividends unchanged. /// @param from The address to transfer from. /// @param to The address to transfer to. /// @param value The amount to be transferred. 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); } /// @dev Internal function that mints tokens to an account. /// Update magnifiedDividendCorrections to keep dividends unchanged. /// @param account The account that will receive the created tokens. /// @param value The amount that will be created. function _mint(address account, uint256 value) internal override { super._mint(account, value); magnifiedDividendCorrections[account] = magnifiedDividendCorrections[account] .sub( (magnifiedDividendPerShare.mul(value)).toInt256Safe() ); } /// @dev Internal function that burns an amount of the token of a given account. /// Update magnifiedDividendCorrections to keep dividends unchanged. /// @param account The account whose tokens will be burnt. /// @param value The amount that will be burnt. 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 FomoETHDividendTracker is DividendPayingToken, Ownable { using SafeMath for uint256; using SafeMathInt for int256; using IterableMapping for IterableMapping.Map; IterableMapping.Map private tokenHoldersMap; uint256 public lastProcessedIndex; mapping (address => bool) public excludedFromDividends; mapping (address => uint256) public lastClaimTimes; uint256 public claimWait; uint256 public minimumTokenBalanceForDividends; event ExcludeFromDividends(address indexed account); event ClaimWaitUpdated(uint256 indexed newValue, uint256 indexed oldValue); event UpdateDistributionBalanceOfUser(address account, uint256 newBalance); event Claim(address indexed account, uint256 amount, bool indexed automatic); constructor() DividendPayingToken("FomoETHDividendTracker", "FomoETH_DividendTracker") { claimWait = 3600; minimumTokenBalanceForDividends = 10000 * (10**decimals()); //must hold 10000+ tokens } function _transfer(address, address, uint256) internal pure override { require(false, "FomoETHDividendTracker: No transfers allowed"); } function withdrawDividend() public pure override { require(false, "FomoETHDividendTracker: withdrawDividend disabled. Use the 'claim' function on the main FomoETH contract."); } function excludeFromDividends(address account) external onlyOwner { require(!excludedFromDividends[account]); excludedFromDividends[account] = true; _setBalance(account, 0); tokenHoldersMap.remove(account); emit ExcludeFromDividends(account); } function updateClaimWait(uint256 newClaimWait) external onlyOwner { emit ClaimWaitUpdated(newClaimWait, claimWait); claimWait = newClaimWait; } function updateMinimumTokenBalanceForDividends(uint256 newTokenBalance) external onlyOwner { emit ClaimWaitUpdated(newTokenBalance, minimumTokenBalanceForDividends); minimumTokenBalanceForDividends = newTokenBalance; } function getLastProcessedIndex() external view returns(uint256) { return lastProcessedIndex; } function getNumberOfTokenHolders() external view returns(uint256) { return tokenHoldersMap.keys.length; } function getAccount(address _account) public view returns ( address account, int256 index, int256 iterationsUntilProcessed, uint256 withdrawableDividends, uint256 totalDividends, uint256 lastClaimTime, uint256 nextClaimTime, uint256 secondsUntilAutoClaimAvailable) { account = _account; index = tokenHoldersMap.getIndexOfKey(account); iterationsUntilProcessed = -1; if(index >= 0) { if(uint256(index) > lastProcessedIndex) { iterationsUntilProcessed = index.sub(int256(lastProcessedIndex)); } else { uint256 processesUntilEndOfArray = tokenHoldersMap.keys.length > lastProcessedIndex ? tokenHoldersMap.keys.length.sub(lastProcessedIndex) : 0; iterationsUntilProcessed = index.add(int256(processesUntilEndOfArray)); } } withdrawableDividends = withdrawableDividendOf(account); totalDividends = accumulativeDividendOf(account); lastClaimTime = lastClaimTimes[account]; nextClaimTime = lastClaimTime > 0 ? lastClaimTime.add(claimWait) : 0; secondsUntilAutoClaimAvailable = nextClaimTime > block.timestamp ? nextClaimTime.sub(block.timestamp) : 0; } function getAccountAtIndex(uint256 index) public view returns ( address, int256, int256, uint256, uint256, uint256, uint256, uint256) { if(index >= tokenHoldersMap.size()) { return (0x0000000000000000000000000000000000000000, -1, -1, 0, 0, 0, 0, 0); } address account = tokenHoldersMap.getKeyAtIndex(index); return getAccount(account); } function canAutoClaim(uint256 lastClaimTime) private view returns (bool) { if(lastClaimTime > block.timestamp) { return false; } return block.timestamp.sub(lastClaimTime) >= claimWait; } function setBalance(address payable account, uint256 newBalance) external onlyOwner { if(excludedFromDividends[account]) { return; } if(newBalance >= minimumTokenBalanceForDividends) { _setBalance(account, newBalance); tokenHoldersMap.set(account, newBalance); } else { _setBalance(account, 0); tokenHoldersMap.remove(account); } emit UpdateDistributionBalanceOfUser(account, newBalance); processAccount(account, true); } function process(uint256 gas) public returns (uint256, uint256, uint256) { uint256 numberOfTokenHolders = tokenHoldersMap.keys.length; if(numberOfTokenHolders == 0) { return (0, 0, lastProcessedIndex); } uint256 _lastProcessedIndex = lastProcessedIndex; uint256 gasUsed = 0; uint256 gasLeft = gasleft(); uint256 iterations = 0; uint256 claims = 0; while(gasUsed < gas && iterations < numberOfTokenHolders) { _lastProcessedIndex++; if(_lastProcessedIndex >= tokenHoldersMap.keys.length) { _lastProcessedIndex = 0; } address account = tokenHoldersMap.keys[_lastProcessedIndex]; if(canAutoClaim(lastClaimTimes[account])) { if(processAccount(payable(account), true)) { claims++; } } iterations++; uint256 newGasLeft = gasleft(); if(gasLeft > newGasLeft) { gasUsed = gasUsed.add(gasLeft.sub(newGasLeft)); } gasLeft = newGasLeft; } lastProcessedIndex = _lastProcessedIndex; return (iterations, claims, lastProcessedIndex); } function processAccount(address payable account, bool automatic) public onlyOwner returns (bool) { uint256 amount = _withdrawDividendOfUser(account); if(amount > 0) { lastClaimTimes[account] = block.timestamp; emit Claim(account, amount, automatic); return true; } return false; } } 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 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 (uint256); 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; } interface IUniswapV2Router01 { function factory() external pure returns (address); function WETH() external pure returns (address); function addLiquidity( address tokenA, address tokenB, uint amountADesired, uint amountBDesired, uint amountAMin, uint amountBMin, address to, uint deadline ) external returns (uint amountA, uint amountB, uint liquidity); function addLiquidityETH( address token, uint amountTokenDesired, uint amountTokenMin, uint amountETHMin, address to, uint deadline ) external payable returns (uint amountToken, uint amountETH, uint liquidity); function removeLiquidity( address tokenA, address tokenB, uint liquidity, uint amountAMin, uint amountBMin, address to, uint deadline ) external returns (uint amountA, uint amountB); function removeLiquidityETH( address token, uint liquidity, uint amountTokenMin, uint amountETHMin, address to, uint deadline ) external returns (uint amountToken, uint amountETH); function removeLiquidityWithPermit( address tokenA, address tokenB, uint liquidity, uint amountAMin, uint amountBMin, address to, uint deadline, bool approveMax, uint8 v, bytes32 r, bytes32 s ) external returns (uint amountA, uint amountB); function removeLiquidityETHWithPermit( address token, uint liquidity, uint amountTokenMin, uint amountETHMin, address to, uint deadline, bool approveMax, uint8 v, bytes32 r, bytes32 s ) external returns (uint amountToken, uint amountETH); function swapExactTokensForTokens( uint amountIn, uint amountOutMin, address[] calldata path, address to, uint deadline ) external returns (uint[] memory amounts); function swapTokensForExactTokens( uint amountOut, uint amountInMax, address[] calldata path, address to, uint deadline ) external returns (uint[] memory amounts); function swapExactETHForTokens(uint amountOutMin, address[] calldata path, address to, uint deadline) external payable returns (uint[] memory amounts); function swapTokensForExactETH(uint amountOut, uint amountInMax, address[] calldata path, address to, uint deadline) external returns (uint[] memory amounts); function swapExactTokensForETH(uint amountIn, uint amountOutMin, address[] calldata path, address to, uint deadline) external returns (uint[] memory amounts); function swapETHForExactTokens(uint amountOut, address[] calldata path, address to, uint deadline) external payable returns (uint[] memory amounts); function quote(uint amountA, uint reserveA, uint reserveB) external pure returns (uint amountB); function getAmountOut(uint amountIn, uint reserveIn, uint reserveOut) external pure returns (uint amountOut); function getAmountIn(uint amountOut, uint reserveIn, uint reserveOut) external pure returns (uint amountIn); function getAmountsOut(uint amountIn, address[] calldata path) external view returns (uint[] memory amounts); function getAmountsIn(uint amountOut, address[] calldata path) external view returns (uint[] memory amounts); } interface IUniswapV2Router02 is IUniswapV2Router01 { function removeLiquidityETHSupportingFeeOnTransferTokens( address token, uint liquidity, uint amountTokenMin, uint amountETHMin, address to, uint deadline ) external returns (uint amountETH); function removeLiquidityETHWithPermitSupportingFeeOnTransferTokens( address token, uint liquidity, uint amountTokenMin, uint amountETHMin, address to, uint deadline, bool approveMax, uint8 v, bytes32 r, bytes32 s ) external returns (uint amountETH); function swapExactTokensForTokensSupportingFeeOnTransferTokens( uint amountIn, uint amountOutMin, address[] calldata path, address to, uint deadline ) external; function swapExactETHForTokensSupportingFeeOnTransferTokens( uint amountOutMin, address[] calldata path, address to, uint deadline ) external payable; function swapExactTokensForETHSupportingFeeOnTransferTokens( uint amountIn, uint amountOutMin, address[] calldata path, address to, uint deadline ) external; } contract FomoETH is ERC20, Ownable { using SafeMath for uint256; IUniswapV2Router02 public uniswapV2Router; address public uniswapV2Pair; bool private swapping; FomoETHDividendTracker public dividendTracker; address private marketingWallet = 0x8507A7644505218aF56d1F39d1C30d57069617b1; address public deadWallet = 0x000000000000000000000000000000000000dEaD; uint256 public maxTransactionAmount; uint256 public swapTokensAtAmount = 1000000 * (10**decimals()); uint256 private marketingFee = 5; uint256 private dividendFee = 5; uint256 private sellMarketingFee = 7; uint256 private sellDividendFee = 8; uint256 public accMarketingFee = 1; uint256 public accDividendFee = 1; mapping(address => bool) private _bot; // use by default 300,000 gas to process auto-claiming dividends uint256 public gasForProcessing = 300000; bool public swappingEnabled = true; event UpdateSwappingStatus(bool status); event UpdateTradingStatus(bool status); // exlcude from fees and max transaction amount mapping (address => bool) private _isExcludedFromFees; mapping (address => bool) private _isExcludedFromMaxTxLimit; event UpdateDividendTracker(address indexed newAddress, address indexed oldAddress); event UpdateWallet(address oldMarketing, address newMarketing); event UpdateUniswapV2Router(address indexed newAddress, address indexed oldAddress); event ExcludeFromFees(address indexed account, bool isExcluded); event ExcludeFromMaxTxLimit(address indexed account, bool isExcluded); event ExcludeMultipleAccountsFromFees(address[] accounts, bool isExcluded); event GasForProcessingUpdated(uint256 indexed newValue, uint256 indexed oldValue); event SetBuyFees(uint256 MarketingFee, uint256 DividendFee); event SetSellFees(uint256 SellMarketingFee, uint256 SellDividendFee); event SetMaxTxAmount(uint256 OldPercent, uint256 NewPercent); event SetSwapTokensAtAmount(uint256 OldAmount, uint256 NewAmount); event StartSwapTokensForEth(uint256 tokenAmountToBeSwapped); event FinishSwapTokensForEth(uint256 ethAmountSwapped); event CalculatedETHForEachRecipient(uint256 forMarketing, uint256 forDividends); event ErrorInProcess(address msgSender); event SwapAndSendTo( uint256 tokensSwapped, uint256 amount, string to ); event ProcessedDividendTracker( uint256 iterations, uint256 claims, uint256 lastProcessedIndex, bool indexed automatic, uint256 gas, address indexed processor ); constructor() ERC20("FomoETH", "FomoETH") { dividendTracker = new FomoETHDividendTracker(); updateUniswapV2Router(0x7a250d5630B4cF539739dF2C5dAcb4c659F2488D); // exclude from receiving dividends dividendTracker.excludeFromDividends(address(dividendTracker)); dividendTracker.excludeFromDividends(address(this)); dividendTracker.excludeFromDividends(address(0)); dividendTracker.excludeFromDividends(deadWallet); excludeFromAllLimits(owner(), true); excludeFromAllLimits(address(this), true); /* _mint is an internal function in ERC20.sol that is only called here, and CANNOT be called ever again */ _mint(owner(), 10**12 * (10**decimals())); maxTransactionAmount = totalSupply().div(100); } function updateUniswapV2Router(address newAddress) public onlyOwner { require(newAddress != address(uniswapV2Router), "FomoETH: The router already has that address"); emit UpdateUniswapV2Router(newAddress, address(uniswapV2Router)); uniswapV2Router = IUniswapV2Router02(newAddress); address _uniswapV2Pair = IUniswapV2Factory(uniswapV2Router.factory()) .createPair(address(this), uniswapV2Router.WETH()); uniswapV2Pair = _uniswapV2Pair; dividendTracker.excludeFromDividends(address(uniswapV2Router)); dividendTracker.excludeFromDividends(uniswapV2Pair); excludeFromAllLimits(newAddress, true); } receive() external payable { } function excludeFromAllLimits(address account, bool status) public onlyOwner { _isExcludedFromFees[account] = status; _isExcludedFromMaxTxLimit[account] = status; } function setSwapTokensAtAmount(uint256 amount) external onlyOwner { emit SetSwapTokensAtAmount(swapTokensAtAmount, amount); swapTokensAtAmount = amount; } function setMaxTxAmount(uint256 amount) external onlyOwner { emit SetMaxTxAmount(maxTransactionAmount, amount); maxTransactionAmount = amount; } function setBuyFees(uint256 _MarketingFee, uint256 _DividendFee) external onlyOwner { marketingFee = _MarketingFee; dividendFee = _DividendFee; uint256 totalFees = marketingFee + dividendFee; require(totalFees < 51, "Too much"); emit SetBuyFees(_MarketingFee, _DividendFee); } function setSellFees(uint256 _SellMarketingFee, uint256 _SellDividendFee) external onlyOwner { sellMarketingFee = _SellMarketingFee; sellDividendFee = _SellDividendFee; uint256 totalFees = sellMarketingFee + sellDividendFee; require(totalFees < 51, "Too much"); emit SetSellFees(_SellMarketingFee, _SellDividendFee); } function setWallet(address newMarketingWallet) external onlyOwner { require(newMarketingWallet != address(0), 'Marketing Zero address'); emit UpdateWallet(marketingWallet, newMarketingWallet); marketingWallet = newMarketingWallet; } function excludeFromDividends(address account) external onlyOwner { dividendTracker.excludeFromDividends(account); } function isExcludedFromDividends(address account) external view returns (bool){ return dividendTracker.excludedFromDividends(account); } function updateDividendTracker(address newAddress) public onlyOwner { require(newAddress != address(dividendTracker), "FomoETH: The dividend tracker already has that address"); FomoETHDividendTracker newDividendTracker = FomoETHDividendTracker(payable(newAddress)); require(newDividendTracker.owner() == address(this), "FomoETH: The new dividend tracker must be owned by the FomoETH token contract"); newDividendTracker.excludeFromDividends(address(newDividendTracker)); newDividendTracker.excludeFromDividends(address(this)); newDividendTracker.excludeFromDividends(address(uniswapV2Router)); emit UpdateDividendTracker(newAddress, address(dividendTracker)); dividendTracker = newDividendTracker; } function excludeFromFees(address account, bool excluded) public onlyOwner { require(_isExcludedFromFees[account] != excluded, "FomoETH: Account is already the value of 'excluded'"); _isExcludedFromFees[account] = excluded; emit ExcludeFromFees(account, excluded); } function excludeFromMaxTxLimit(address account, bool excluded) public onlyOwner { require(_isExcludedFromMaxTxLimit[account] != excluded, "FomoETH: Account is already the value of 'excluded'"); _isExcludedFromMaxTxLimit[account] = excluded; emit ExcludeFromMaxTxLimit(account, excluded); } function excludeFromBot(address account) public onlyOwner { _bot[account] = false; } function includeInBot(address account) public onlyOwner { _bot[account] = true; } function excludeMultipleAccountsFromFees(address[] calldata accounts, bool excluded) public onlyOwner { for(uint256 i = 0; i < accounts.length; i++) { _isExcludedFromFees[accounts[i]] = excluded; } emit ExcludeMultipleAccountsFromFees(accounts, excluded); } function updateGasForProcessing(uint256 newValue) public onlyOwner { require(newValue >= 200000 && newValue <= 500000, "FomoETH: gasForProcessing must be between 200,000 and 500,000"); require(newValue != gasForProcessing, "FomoETH: Cannot update gasForProcessing to same value"); emit GasForProcessingUpdated(newValue, gasForProcessing); gasForProcessing = newValue; } function updateClaimWait(uint256 claimWait) external onlyOwner { dividendTracker.updateClaimWait(claimWait); } function updateMinimumTokenBalanceForDividends(uint256 newTokenBalance) external onlyOwner { dividendTracker.updateMinimumTokenBalanceForDividends(newTokenBalance); } function getClaimWait() external view returns(uint256) { return dividendTracker.claimWait(); } function getTotalDividendsDistributed() external view returns (uint256) { return dividendTracker.totalDividendsDistributed(); } function isExcludedFromFees(address account) public view returns(bool) { return _isExcludedFromFees[account]; } function isExcludedFromMaxTxLimit(address account) public view returns(bool) { return _isExcludedFromMaxTxLimit[account]; } function withdrawableDividendOf(address account) public view returns(uint256) { return dividendTracker.withdrawableDividendOf(account); } function dividendTokenBalanceOf(address account) public view returns (uint256) { return dividendTracker.balanceOf(account); } function getAccountDividendsInfo(address account) external view returns ( address, int256, int256, uint256, uint256, uint256, uint256, uint256) { return dividendTracker.getAccount(account); } function getAccountDividendsInfoAtIndex(uint256 index) external view returns ( address, int256, int256, uint256, uint256, uint256, uint256, uint256) { return dividendTracker.getAccountAtIndex(index); } function processDividendTracker(uint256 gas) external { (uint256 iterations, uint256 claims, uint256 lastProcessedIndex) = dividendTracker.process(gas); emit ProcessedDividendTracker(iterations, claims, lastProcessedIndex, false, gas, tx.origin); } function claim() external { dividendTracker.processAccount(payable(msg.sender), false); } function getLastProcessedIndex() external view returns(uint256) { return dividendTracker.getLastProcessedIndex(); } function getNumberOfDividendTokenHolders() external view returns(uint256) { return dividendTracker.getNumberOfTokenHolders(); } function setSwapIsEnabled(bool status) external onlyOwner { swappingEnabled = status; emit UpdateSwappingStatus(status); } function _transfer( address from, address to, uint256 amount ) internal override { require(from != address(0), "ERC20: transfer from the zero address"); require(to != address(0), "ERC20: transfer to the zero address"); if(amount == 0) { super._transfer(from, to, 0); return; } if( !swapping && !_isExcludedFromMaxTxLimit[from] && !_isExcludedFromMaxTxLimit[to] ) { require(amount <= maxTransactionAmount, "Transfer amount exceeds the maxTransactionAmount."); require(!_bot[from] && !_bot[to], "Transfer from bot detected"); } bool canSwap = balanceOf(address(this)) >= swapTokensAtAmount; if( canSwap && !swapping && swappingEnabled && msg.sender != uniswapV2Pair ) { swapping = true; swapAndDistributeETH(swapTokensAtAmount); swapping = false; } bool takeFee = !swapping; if(_isExcludedFromFees[from] || _isExcludedFromFees[to]) { takeFee = false; } if(takeFee) { uint256 forMarketing; uint256 forDividends; if (to == uniswapV2Pair) { forMarketing = amount.mul(sellMarketingFee).div(100); forDividends = amount.mul(sellDividendFee).div(100); } else { forMarketing = amount.mul(marketingFee).div(100); forDividends = amount.mul(dividendFee).div(100); } accMarketingFee = accMarketingFee.add(forMarketing); accDividendFee = accDividendFee.add(forDividends); uint256 fees = forMarketing.add(forDividends); amount = amount.sub(fees); super._transfer(from, address(this), fees); } super._transfer(from, to, amount); try dividendTracker.setBalance(payable(from), balanceOf(from)) {} catch {} try dividendTracker.setBalance(payable(to), balanceOf(to)) {} catch {} if(!swapping) { uint256 gas = gasForProcessing; try dividendTracker.process(gas) returns (uint256 iterations, uint256 claims, uint256 lastProcessedIndex) { emit ProcessedDividendTracker(iterations, claims, lastProcessedIndex, true, gas, tx.origin); } catch { emit ErrorInProcess(msg.sender); } } } function swapTokensForEth(uint256 tokenAmount) private { emit StartSwapTokensForEth(tokenAmount); // generate the uniswapV2 pair path of token -> weth address[] memory path = new address[](2); path[0] = address(this); path[1] = uniswapV2Router.WETH(); _approve(address(this), address(uniswapV2Router), tokenAmount); // make the swap uniswapV2Router.swapExactTokensForETHSupportingFeeOnTransferTokens( tokenAmount, 0, // accept any amount of ETH path, address(this), block.timestamp ); emit FinishSwapTokensForEth(address(this).balance); } function swapAndDistributeETH(uint256 tokens) private { swapTokensForEth(tokens); uint256 balance = address(this).balance; uint256 accTotal = accDividendFee.add(accMarketingFee); uint256 forMarketing = balance.mul(accMarketingFee).div(accTotal); uint256 forDividends = balance.sub(forMarketing); emit CalculatedETHForEachRecipient(forMarketing, forDividends); (bool success,) = address(marketingWallet).call{value: forMarketing}(""); if(success) { emit SwapAndSendTo(accMarketingFee, forMarketing, "MARKETING"); accMarketingFee = 1; } (success,) = address(dividendTracker).call{value: forDividends}(""); if(success) { emit SwapAndSendTo(accDividendFee, forDividends, "DIVIDENDS"); accDividendFee = 1; } } function withdrawStuckTokens(address _token, uint256 _amount) public onlyOwner { IERC20(_token).transfer(msg.sender, _amount); } }
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":"forMarketing","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"forDividends","type":"uint256"}],"name":"CalculatedETHForEachRecipient","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"msgSender","type":"address"}],"name":"ErrorInProcess","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"account","type":"address"},{"indexed":false,"internalType":"bool","name":"isExcluded","type":"bool"}],"name":"ExcludeFromFees","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"account","type":"address"},{"indexed":false,"internalType":"bool","name":"isExcluded","type":"bool"}],"name":"ExcludeFromMaxTxLimit","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address[]","name":"accounts","type":"address[]"},{"indexed":false,"internalType":"bool","name":"isExcluded","type":"bool"}],"name":"ExcludeMultipleAccountsFromFees","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"ethAmountSwapped","type":"uint256"}],"name":"FinishSwapTokensForEth","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"newValue","type":"uint256"},{"indexed":true,"internalType":"uint256","name":"oldValue","type":"uint256"}],"name":"GasForProcessingUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"iterations","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"claims","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"lastProcessedIndex","type":"uint256"},{"indexed":true,"internalType":"bool","name":"automatic","type":"bool"},{"indexed":false,"internalType":"uint256","name":"gas","type":"uint256"},{"indexed":true,"internalType":"address","name":"processor","type":"address"}],"name":"ProcessedDividendTracker","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"MarketingFee","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"DividendFee","type":"uint256"}],"name":"SetBuyFees","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"OldPercent","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"NewPercent","type":"uint256"}],"name":"SetMaxTxAmount","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"SellMarketingFee","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"SellDividendFee","type":"uint256"}],"name":"SetSellFees","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"OldAmount","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"NewAmount","type":"uint256"}],"name":"SetSwapTokensAtAmount","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"tokenAmountToBeSwapped","type":"uint256"}],"name":"StartSwapTokensForEth","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"tokensSwapped","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"},{"indexed":false,"internalType":"string","name":"to","type":"string"}],"name":"SwapAndSendTo","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"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"newAddress","type":"address"},{"indexed":true,"internalType":"address","name":"oldAddress","type":"address"}],"name":"UpdateDividendTracker","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"bool","name":"status","type":"bool"}],"name":"UpdateSwappingStatus","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"bool","name":"status","type":"bool"}],"name":"UpdateTradingStatus","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"newAddress","type":"address"},{"indexed":true,"internalType":"address","name":"oldAddress","type":"address"}],"name":"UpdateUniswapV2Router","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"oldMarketing","type":"address"},{"indexed":false,"internalType":"address","name":"newMarketing","type":"address"}],"name":"UpdateWallet","type":"event"},{"inputs":[],"name":"accDividendFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"accMarketingFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"spender","type":"address"}],"name":"allowance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"approve","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"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":"deadWallet","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"decimals","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"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":"account","type":"address"}],"name":"dividendTokenBalanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"dividendTracker","outputs":[{"internalType":"contract FomoETHDividendTracker","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"bool","name":"status","type":"bool"}],"name":"excludeFromAllLimits","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"excludeFromBot","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"excludeFromDividends","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"bool","name":"excluded","type":"bool"}],"name":"excludeFromFees","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"bool","name":"excluded","type":"bool"}],"name":"excludeFromMaxTxLimit","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address[]","name":"accounts","type":"address[]"},{"internalType":"bool","name":"excluded","type":"bool"}],"name":"excludeMultipleAccountsFromFees","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"gasForProcessing","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"getAccountDividendsInfo","outputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"int256","name":"","type":"int256"},{"internalType":"int256","name":"","type":"int256"},{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"index","type":"uint256"}],"name":"getAccountDividendsInfoAtIndex","outputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"int256","name":"","type":"int256"},{"internalType":"int256","name":"","type":"int256"},{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getClaimWait","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getLastProcessedIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getNumberOfDividendTokenHolders","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getTotalDividendsDistributed","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"includeInBot","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"addedValue","type":"uint256"}],"name":"increaseAllowance","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"isExcludedFromDividends","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"isExcludedFromFees","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"isExcludedFromMaxTxLimit","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxTransactionAmount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"gas","type":"uint256"}],"name":"processDividendTracker","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_MarketingFee","type":"uint256"},{"internalType":"uint256","name":"_DividendFee","type":"uint256"}],"name":"setBuyFees","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"setMaxTxAmount","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_SellMarketingFee","type":"uint256"},{"internalType":"uint256","name":"_SellDividendFee","type":"uint256"}],"name":"setSellFees","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"status","type":"bool"}],"name":"setSwapIsEnabled","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"setSwapTokensAtAmount","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newMarketingWallet","type":"address"}],"name":"setWallet","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"swapTokensAtAmount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"swappingEnabled","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","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":"recipient","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transfer","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"sender","type":"address"},{"internalType":"address","name":"recipient","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transferFrom","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"uniswapV2Pair","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"uniswapV2Router","outputs":[{"internalType":"contract IUniswapV2Router02","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"claimWait","type":"uint256"}],"name":"updateClaimWait","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newAddress","type":"address"}],"name":"updateDividendTracker","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"newValue","type":"uint256"}],"name":"updateGasForProcessing","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"newTokenBalance","type":"uint256"}],"name":"updateMinimumTokenBalanceForDividends","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newAddress","type":"address"}],"name":"updateUniswapV2Router","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_token","type":"address"},{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"withdrawStuckTokens","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"withdrawableDividendOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"stateMutability":"payable","type":"receive"}]
Contract Creation Code
6080604052600a80546001600160a01b0319908116738507a7644505218af56d1f39d1c30d57069617b117909155600b805490911661dead17905562000044620003fb565b6200005190600a62000b32565b6200006090620f424062000c1a565b600d556005600e819055600f5560076010556008601155600160128190556013819055620493e06015556016805460ff19169091179055348015620000a457600080fd5b5060408051808201825260078082526608cdedade8aa8960cb1b602080840182815285518087019096529285528401528151919291620000e791600391620008dd565b508051620000fd906004906020840190620008dd565b5050506000620001126200040060201b60201c565b600580546001600160a01b0319166001600160a01b038316908117909155604051919250906000907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908290a3506040516200016e906200096c565b604051809103906000f0801580156200018b573d6000803e3d6000fd5b50600980546001600160a01b0319166001600160a01b0392909216919091179055620001cb737a250d5630b4cf539739df2c5dacb4c659f2488d62000404565b60095460405163031e79db60e41b81526001600160a01b03909116906331e79db090620001fd908390600401620009ba565b600060405180830381600087803b1580156200021857600080fd5b505af11580156200022d573d6000803e3d6000fd5b505060095460405163031e79db60e41b81526001600160a01b0390911692506331e79db0915062000263903090600401620009ba565b600060405180830381600087803b1580156200027e57600080fd5b505af115801562000293573d6000803e3d6000fd5b505060095460405163031e79db60e41b81526001600160a01b0390911692506331e79db09150620002ca90600090600401620009ba565b600060405180830381600087803b158015620002e557600080fd5b505af1158015620002fa573d6000803e3d6000fd5b5050600954600b5460405163031e79db60e41b81526001600160a01b0392831694506331e79db09350620003359290911690600401620009ba565b600060405180830381600087803b1580156200035057600080fd5b505af115801562000365573d6000803e3d6000fd5b50505050620003856200037d6200076160201b60201c565b600162000770565b6200039230600162000770565b620003ce620003a062000761565b620003aa620003fb565b620003b790600a62000b32565b620003c89064e8d4a5100062000c1a565b620007e8565b620003f26064620003de620008bd565b620008c360201b620022de1790919060201c565b600c5562000c8f565b600990565b3390565b6200040e62000400565b6005546001600160a01b03908116911614620004475760405162461bcd60e51b81526004016200043e9062000a34565b60405180910390fd5b6007546001600160a01b0382811691161415620004785760405162461bcd60e51b81526004016200043e90620009e8565b6007546040516001600160a01b03918216918316907f8fc842bbd331dfa973645f4ed48b11683d501ebf1352708d77a5da2ab49a576e90600090a3600780546001600160a01b0319166001600160a01b0383811691909117918290556040805163c45a015560e01b815290516000939092169163c45a015591600480820192602092909190829003018186803b1580156200051257600080fd5b505afa15801562000527573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906200054d919062000991565b6001600160a01b031663c9c6539630600760009054906101000a90046001600160a01b03166001600160a01b031663ad5c46486040518163ffffffff1660e01b815260040160206040518083038186803b158015620005ab57600080fd5b505afa158015620005c0573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620005e6919062000991565b6040518363ffffffff1660e01b815260040162000605929190620009ce565b602060405180830381600087803b1580156200062057600080fd5b505af115801562000635573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906200065b919062000991565b600880546001600160a01b0319166001600160a01b038381169190911790915560095460075460405163031e79db60e41b8152939450908216926331e79db092620006ab921690600401620009ba565b600060405180830381600087803b158015620006c657600080fd5b505af1158015620006db573d6000803e3d6000fd5b505060095460085460405163031e79db60e41b81526001600160a01b0392831694506331e79db09350620007169290911690600401620009ba565b600060405180830381600087803b1580156200073157600080fd5b505af115801562000746573d6000803e3d6000fd5b505050506200075d8260016200077060201b60201c565b5050565b6005546001600160a01b031690565b6200077a62000400565b6005546001600160a01b03908116911614620007aa5760405162461bcd60e51b81526004016200043e9062000a34565b6001600160a01b039091166000908152601760209081526040808320805494151560ff19958616811790915560189092529091208054909216179055565b6001600160a01b038216620008115760405162461bcd60e51b81526004016200043e9062000a69565b6200081f60008383620008d8565b806002600082825462000833919062000aa9565b90915550506001600160a01b038216600090815260208190526040812080548392906200086290849062000aa9565b90915550506040516001600160a01b038316906000907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef90620008a790859062000aa0565b60405180910390a36200075d60008383620008d8565b60025490565b6000620008d1828462000ac4565b9392505050565b505050565b828054620008eb9062000c3c565b90600052602060002090601f0160209004810192826200090f57600085556200095a565b82601f106200092a57805160ff19168380011785556200095a565b828001600101855582156200095a579182015b828111156200095a5782518255916020019190600101906200093d565b50620009689291506200097a565b5090565b6124ff80620045df83390190565b5b808211156200096857600081556001016200097b565b600060208284031215620009a3578081fd5b81516001600160a01b0381168114620008d1578182fd5b6001600160a01b0391909116815260200190565b6001600160a01b0392831681529116602082015260400190565b6020808252602c908201527f466f6d6f4554483a2054686520726f7574657220616c7265616479206861732060408201526b74686174206164647265737360a01b606082015260800190565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b6020808252601f908201527f45524332303a206d696e7420746f20746865207a65726f206164647265737300604082015260600190565b90815260200190565b6000821982111562000abf5762000abf62000c79565b500190565b60008262000ae057634e487b7160e01b81526012600452602481fd5b500490565b80825b600180861162000af9575062000b29565b81870482111562000b0e5762000b0e62000c79565b8086161562000b1c57918102915b9490941c93800262000ae8565b94509492505050565b6000620008d1600019848460008262000b4e57506001620008d1565b8162000b5d57506000620008d1565b816001811462000b76576002811462000b815762000bb5565b6001915050620008d1565b60ff84111562000b955762000b9562000c79565b6001841b91508482111562000bae5762000bae62000c79565b50620008d1565b5060208310610133831016604e8410600b841016171562000bed575081810a8381111562000be75762000be762000c79565b620008d1565b62000bfc848484600162000ae5565b80860482111562000c115762000c1162000c79565b02949350505050565b600081600019048311821515161562000c375762000c3762000c79565b500290565b60028104600182168062000c5157607f821691505b6020821081141562000c7357634e487b7160e01b600052602260045260246000fd5b50919050565b634e487b7160e01b600052601160045260246000fd5b6139408062000c9f6000396000f3fe60806040526004361061036f5760003560e01c80638da5cb5b116101c6578063c492f046116100f7578063deaa59df11610095578063e98030c71161006f578063e98030c714610967578063ec28438a14610987578063f27fd254146109a7578063f2fde38b146109c757610376565b8063deaa59df1461091d578063e2f456051461093d578063e7841ec01461095257610376565b8063cd49513f116100d1578063cd49513f1461089d578063cf88f825146108bd578063d84e4439146108dd578063dd62ed3e146108fd57610376565b8063c492f04614610848578063c705c56914610868578063c8c8ebe41461088857610376565b8063a9059cbb11610164578063afa4f3b21161013e578063afa4f3b2146107c8578063b2d8f208146107e8578063bd61f0a614610808578063c02466681461082857610376565b8063a9059cbb1461075f578063ad56c13c1461077f578063aeb55569146107b357610376565b80639fd8234e116101a05780639fd8234e146106ea578063a26579ad1461070a578063a457c2d71461071f578063a8b9d2401461073f57610376565b80638da5cb5b146106ab57806395d89b41146106c05780639c1b8af5146106d557610376565b806345de8926116102a05780636ffcdaf01161023e578063715018a611610218578063715018a61461064157806385141a7714610656578063871c128d1461066b57806388bdd9be1461068b57610376565b80636ffcdaf0146105ec578063700bb1911461060157806370a082311461062157610376565b80634fbee1931161027a5780634fbee1931461057757806364b0f6531461059757806365b8dbc0146105ac5780636843cd84146105cc57610376565b806345de89261461052d57806349bd5a5e1461054d5780634e71d92d1461056257610376565b80632c1f52161161030d57806331e79db0116102e757806331e79db0146104b857806339509351146104d8578063412eaabc146104f857806343db57001461050d57610376565b80632c1f52161461047957806330bb4cff1461048e578063313ce567146104a357610376565b80631694505e116103495780631694505e146103f557806318160ddd1461041757806323b872dd1461043957806323cc66011461045957610376565b806306fdde031461037b578063095ea7b3146103a65780630dcb2e89146103d357610376565b3661037657005b600080fd5b34801561038757600080fd5b506103906109e7565b60405161039d919061316a565b60405180910390f35b3480156103b257600080fd5b506103c66103c1366004612eff565b610a79565b60405161039d919061315f565b3480156103df57600080fd5b506103f36103ee366004612fe2565b610a96565b005b34801561040157600080fd5b5061040a610b39565b60405161039d9190613063565b34801561042357600080fd5b5061042c610b48565b60405161039d919061370d565b34801561044557600080fd5b506103c6610454366004612e29565b610b4e565b34801561046557600080fd5b506103f3610474366004612e69565b610bde565b34801561048557600080fd5b5061040a610cb2565b34801561049a57600080fd5b5061042c610cc1565b3480156104af57600080fd5b5061042c610d43565b3480156104c457600080fd5b506103f36104d3366004612db9565b610d48565b3480156104e457600080fd5b506103c66104f3366004612eff565b610dad565b34801561050457600080fd5b5061042c610e01565b34801561051957600080fd5b506103c6610528366004612db9565b610e07565b34801561053957600080fd5b506103f3610548366004612faa565b610e25565b34801561055957600080fd5b5061040a610ea3565b34801561056e57600080fd5b506103f3610eb2565b34801561058357600080fd5b506103c6610592366004612db9565b610f3a565b3480156105a357600080fd5b5061042c610f58565b3480156105b857600080fd5b506103f36105c7366004612db9565b610f9d565b3480156105d857600080fd5b5061042c6105e7366004612db9565b6112cb565b3480156105f857600080fd5b5061042c611352565b34801561060d57600080fd5b506103f361061c366004612fe2565b611358565b34801561062d57600080fd5b5061042c61063c366004612db9565b611439565b34801561064d57600080fd5b506103f3611454565b34801561066257600080fd5b5061040a6114d3565b34801561067757600080fd5b506103f3610686366004612fe2565b6114e2565b34801561069757600080fd5b506103f36106a6366004612db9565b61159e565b3480156106b757600080fd5b5061040a611824565b3480156106cc57600080fd5b50610390611833565b3480156106e157600080fd5b5061042c611842565b3480156106f657600080fd5b506103f3610705366004613012565b611848565b34801561071657600080fd5b5061042c6118f3565b34801561072b57600080fd5b506103c661073a366004612eff565b611938565b34801561074b57600080fd5b5061042c61075a366004612db9565b6119b1565b34801561076b57600080fd5b506103c661077a366004612eff565b6119e2565b34801561078b57600080fd5b5061079f61079a366004612db9565b6119f6565b60405161039d9897969594939291906130c5565b3480156107bf57600080fd5b506103c6611aa3565b3480156107d457600080fd5b506103f36107e3366004612fe2565b611aac565b3480156107f457600080fd5b506103f3610803366004613012565b611b21565b34801561081457600080fd5b506103f3610823366004612eff565b611bbf565b34801561083457600080fd5b506103f3610843366004612e69565b611c79565b34801561085457600080fd5b506103f3610863366004612f2a565b611d41565b34801561087457600080fd5b506103c6610883366004612db9565b611e29565b34801561089457600080fd5b5061042c611eaa565b3480156108a957600080fd5b506103f36108b8366004612e69565b611eb0565b3480156108c957600080fd5b506103f36108d8366004612db9565b611f23565b3480156108e957600080fd5b506103f36108f8366004612db9565b611f7c565b34801561090957600080fd5b5061042c610918366004612df1565b611fd2565b34801561092957600080fd5b506103f3610938366004612db9565b611ffd565b34801561094957600080fd5b5061042c6120c1565b34801561095e57600080fd5b5061042c6120c7565b34801561097357600080fd5b506103f3610982366004612fe2565b61210c565b34801561099357600080fd5b506103f36109a2366004612fe2565b612171565b3480156109b357600080fd5b5061079f6109c2366004612fe2565b6121e6565b3480156109d357600080fd5b506103f36109e2366004612db9565b612227565b6060600380546109f69061387b565b80601f0160208091040260200160405190810160405280929190818152602001828054610a229061387b565b8015610a6f5780601f10610a4457610100808354040283529160200191610a6f565b820191906000526020600020905b815481529060010190602001808311610a5257829003601f168201915b5050505050905090565b6000610a8d610a866122f1565b84846122f5565b50600192915050565b610a9e6122f1565b6005546001600160a01b03908116911614610ad45760405162461bcd60e51b8152600401610acb90613466565b60405180910390fd5b600954604051630dcb2e8960e01b81526001600160a01b0390911690630dcb2e8990610b0490849060040161370d565b600060405180830381600087803b158015610b1e57600080fd5b505af1158015610b32573d6000803e3d6000fd5b5050505050565b6007546001600160a01b031681565b60025490565b6000610b5b8484846123a9565b6001600160a01b038416600090815260016020526040812081610b7c6122f1565b6001600160a01b03166001600160a01b0316815260200190815260200160002054905082811015610bbf5760405162461bcd60e51b8152600401610acb9061341e565b610bd385610bcb6122f1565b8584036122f5565b506001949350505050565b610be66122f1565b6005546001600160a01b03908116911614610c135760405162461bcd60e51b8152600401610acb90613466565b6001600160a01b03821660009081526018602052604090205460ff1615158115151415610c525760405162461bcd60e51b8152600401610acb906134ec565b6001600160a01b03821660008181526018602052604090819020805460ff1916841515179055517f3c054e3f2f036e0e59d335fc15b75af48358879a01263a9bb61414efba3b0ca290610ca690849061315f565b60405180910390a25050565b6009546001600160a01b031681565b600954604080516342d359d760e11b815290516000926001600160a01b0316916385a6b3ae916004808301926020929190829003018186803b158015610d0657600080fd5b505afa158015610d1a573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610d3e9190612ffa565b905090565b600990565b610d506122f1565b6005546001600160a01b03908116911614610d7d5760405162461bcd60e51b8152600401610acb90613466565b60095460405163031e79db60e41b81526001600160a01b03909116906331e79db090610b04908490600401613063565b6000610a8d610dba6122f1565b848460016000610dc86122f1565b6001600160a01b03908116825260208083019390935260409182016000908120918b1681529252902054610dfc919061380d565b6122f5565b60125481565b6001600160a01b031660009081526018602052604090205460ff1690565b610e2d6122f1565b6005546001600160a01b03908116911614610e5a5760405162461bcd60e51b8152600401610acb90613466565b6016805460ff19168215151790556040517f5622abe2b5d0eae4b753d16b630beb4545f383075afebbe3221c3a12cd008c2490610e9890839061315f565b60405180910390a150565b6008546001600160a01b031681565b60095460405163bc4c4b3760e01b81526001600160a01b039091169063bc4c4b3790610ee5903390600090600401613077565b602060405180830381600087803b158015610eff57600080fd5b505af1158015610f13573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610f379190612fc6565b50565b6001600160a01b031660009081526017602052604090205460ff1690565b600954604080516304ddf6ef60e11b815290516000926001600160a01b0316916309bbedde916004808301926020929190829003018186803b158015610d0657600080fd5b610fa56122f1565b6005546001600160a01b03908116911614610fd25760405162461bcd60e51b8152600401610acb90613466565b6007546001600160a01b03828116911614156110005760405162461bcd60e51b8152600401610acb906132ff565b6007546040516001600160a01b03918216918316907f8fc842bbd331dfa973645f4ed48b11683d501ebf1352708d77a5da2ab49a576e90600090a3600780546001600160a01b0319166001600160a01b0383811691909117918290556040805163c45a015560e01b815290516000939092169163c45a015591600480820192602092909190829003018186803b15801561109957600080fd5b505afa1580156110ad573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906110d19190612dd5565b6001600160a01b031663c9c6539630600760009054906101000a90046001600160a01b03166001600160a01b031663ad5c46486040518163ffffffff1660e01b815260040160206040518083038186803b15801561112e57600080fd5b505afa158015611142573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906111669190612dd5565b6040518363ffffffff1660e01b81526004016111839291906130ab565b602060405180830381600087803b15801561119d57600080fd5b505af11580156111b1573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906111d59190612dd5565b600880546001600160a01b0319166001600160a01b038381169190911790915560095460075460405163031e79db60e41b8152939450908216926331e79db092611223921690600401613063565b600060405180830381600087803b15801561123d57600080fd5b505af1158015611251573d6000803e3d6000fd5b505060095460085460405163031e79db60e41b81526001600160a01b0392831694506331e79db0935061128a9290911690600401613063565b600060405180830381600087803b1580156112a457600080fd5b505af11580156112b8573d6000803e3d6000fd5b505050506112c7826001611eb0565b5050565b6009546040516370a0823160e01b81526000916001600160a01b0316906370a08231906112fc908590600401613063565b60206040518083038186803b15801561131457600080fd5b505afa158015611328573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061134c9190612ffa565b92915050565b60135481565b6009546040516001624d3b8760e01b03198152600091829182916001600160a01b03169063ffb2c4799061139090879060040161370d565b606060405180830381600087803b1580156113aa57600080fd5b505af11580156113be573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906113e29190613033565b925092509250326001600160a01b0316600015157fc864333d6121033635ab41b29ae52f10a22cf4438c3e4f1c4c68518feb2f8a988585858960405161142b94939291906137f2565b60405180910390a350505050565b6001600160a01b031660009081526020819052604090205490565b61145c6122f1565b6005546001600160a01b039081169116146114895760405162461bcd60e51b8152600401610acb90613466565b6005546040516000916001600160a01b0316907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908390a3600580546001600160a01b0319169055565b600b546001600160a01b031681565b6114ea6122f1565b6005546001600160a01b039081169116146115175760405162461bcd60e51b8152600401610acb90613466565b62030d40811015801561152d57506207a1208111155b6115495760405162461bcd60e51b8152600401610acb906135c8565b60155481141561156b5760405162461bcd60e51b8152600401610acb90613222565b60155460405182907f40d7e40e79af4e8e5a9b3c57030d8ea93f13d669c06d448c4d631d4ae7d23db790600090a3601555565b6115a66122f1565b6005546001600160a01b039081169116146115d35760405162461bcd60e51b8152600401610acb90613466565b6009546001600160a01b03828116911614156116015760405162461bcd60e51b8152600401610acb90613391565b6000819050306001600160a01b0316816001600160a01b0316638da5cb5b6040518163ffffffff1660e01b815260040160206040518083038186803b15801561164957600080fd5b505afa15801561165d573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906116819190612dd5565b6001600160a01b0316146116a75760405162461bcd60e51b8152600401610acb90613655565b60405163031e79db60e41b81526001600160a01b038216906331e79db0906116d3908490600401613063565b600060405180830381600087803b1580156116ed57600080fd5b505af1158015611701573d6000803e3d6000fd5b505060405163031e79db60e41b81526001600160a01b03841692506331e79db09150611731903090600401613063565b600060405180830381600087803b15801561174b57600080fd5b505af115801561175f573d6000803e3d6000fd5b505060075460405163031e79db60e41b81526001600160a01b0380861694506331e79db09350611793921690600401613063565b600060405180830381600087803b1580156117ad57600080fd5b505af11580156117c1573d6000803e3d6000fd5b50506009546040516001600160a01b03918216935090851691507f90c7d74461c613da5efa97d90740869367d74ab3aa5837aa4ae9a975f954b7a890600090a3600980546001600160a01b0319166001600160a01b039290921691909117905550565b6005546001600160a01b031690565b6060600480546109f69061387b565b60155481565b6118506122f1565b6005546001600160a01b0390811691161461187d5760405162461bcd60e51b8152600401610acb90613466565b601082905560118190556000611893828461380d565b9050603381106118b55760405162461bcd60e51b8152600401610acb90613200565b7f125b37650f21d088600cef1223439f6a8bd70800debfd486c503a8a2d19d4b0183836040516118e6929190613786565b60405180910390a1505050565b60095460408051631bc9e27b60e21b815290516000926001600160a01b031691636f2789ec916004808301926020929190829003018186803b158015610d0657600080fd5b600080600160006119476122f1565b6001600160a01b03908116825260208083019390935260409182016000908120918816815292529020549050828110156119935760405162461bcd60e51b8152600401610acb906136c8565b6119a761199e6122f1565b858584036122f5565b5060019392505050565b6009546040516302a2e74960e61b81526000916001600160a01b03169063a8b9d240906112fc908590600401613063565b6000610a8d6119ef6122f1565b84846123a9565b60095460405163fbcbc0f160e01b815260009182918291829182918291829182916001600160a01b039091169063fbcbc0f190611a37908c90600401613063565b6101006040518083038186803b158015611a5057600080fd5b505afa158015611a64573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611a889190612e96565b97509750975097509750975097509750919395975091939597565b60165460ff1681565b611ab46122f1565b6005546001600160a01b03908116911614611ae15760405162461bcd60e51b8152600401610acb90613466565b7f190dc7c30bc62ef30e35c5f5512ad715a1bd03230f2d89c965249246c8d8ecca600d5482604051611b14929190613786565b60405180910390a1600d55565b611b296122f1565b6005546001600160a01b03908116911614611b565760405162461bcd60e51b8152600401610acb90613466565b600e829055600f8190556000611b6c828461380d565b905060338110611b8e5760405162461bcd60e51b8152600401610acb90613200565b7f5fcc0eea159d45a3b8d481be746c9beed251431a542a5fed4484be37ab783e8d83836040516118e6929190613786565b611bc76122f1565b6005546001600160a01b03908116911614611bf45760405162461bcd60e51b8152600401610acb90613466565b60405163a9059cbb60e01b81526001600160a01b0383169063a9059cbb90611c229033908590600401613092565b602060405180830381600087803b158015611c3c57600080fd5b505af1158015611c50573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611c749190612fc6565b505050565b611c816122f1565b6005546001600160a01b03908116911614611cae5760405162461bcd60e51b8152600401610acb90613466565b6001600160a01b03821660009081526017602052604090205460ff1615158115151415611ced5760405162461bcd60e51b8152600401610acb906134ec565b6001600160a01b03821660008181526017602052604090819020805460ff1916841515179055517f9d8f7706ea1113d1a167b526eca956215946dd36cc7df39eb16180222d8b5df790610ca690849061315f565b611d496122f1565b6005546001600160a01b03908116911614611d765760405162461bcd60e51b8152600401610acb90613466565b60005b82811015611df5578160176000868685818110611da657634e487b7160e01b600052603260045260246000fd5b9050602002016020810190611dbb9190612db9565b6001600160a01b031681526020810191909152604001600020805460ff191691151591909117905580611ded816138b6565b915050611d79565b507f7fdaf542373fa84f4ee8d662c642f44e4c2276a217d7d29e548b6eb29a233b358383836040516118e693929190613106565b600954604051634e7b827f60e01b81526000916001600160a01b031690634e7b827f90611e5a908590600401613063565b60206040518083038186803b158015611e7257600080fd5b505afa158015611e86573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061134c9190612fc6565b600c5481565b611eb86122f1565b6005546001600160a01b03908116911614611ee55760405162461bcd60e51b8152600401610acb90613466565b6001600160a01b039091166000908152601760209081526040808320805494151560ff19958616811790915560189092529091208054909216179055565b611f2b6122f1565b6005546001600160a01b03908116911614611f585760405162461bcd60e51b8152600401610acb90613466565b6001600160a01b03166000908152601460205260409020805460ff19166001179055565b611f846122f1565b6005546001600160a01b03908116911614611fb15760405162461bcd60e51b8152600401610acb90613466565b6001600160a01b03166000908152601460205260409020805460ff19169055565b6001600160a01b03918216600090815260016020908152604080832093909416825291909152205490565b6120056122f1565b6005546001600160a01b039081169116146120325760405162461bcd60e51b8152600401610acb90613466565b6001600160a01b0381166120585760405162461bcd60e51b8152600401610acb90613625565b600a546040517fceb4a6bb0f5ce9dc9274d4ddd707cc147f37d2f6f24df18977bcde5b0e8d9f4a91612097916001600160a01b039091169084906130ab565b60405180910390a1600a80546001600160a01b0319166001600160a01b0392909216919091179055565b600d5481565b6009546040805163039e107b60e61b815290516000926001600160a01b03169163e7841ec0916004808301926020929190829003018186803b158015610d0657600080fd5b6121146122f1565b6005546001600160a01b039081169116146121415760405162461bcd60e51b8152600401610acb90613466565b60095460405163e98030c760e01b81526001600160a01b039091169063e98030c790610b0490849060040161370d565b6121796122f1565b6005546001600160a01b039081169116146121a65760405162461bcd60e51b8152600401610acb90613466565b7f4a79811e633121b844203daf0d546b7b3a675face68ce9a9739022ab21161dae600c54826040516121d9929190613786565b60405180910390a1600c55565b600954604051635183d6fd60e01b815260009182918291829182918291829182916001600160a01b0390911690635183d6fd90611a37908c9060040161370d565b61222f6122f1565b6005546001600160a01b0390811691161461225c5760405162461bcd60e51b8152600401610acb90613466565b6001600160a01b0381166122825760405162461bcd60e51b8152600401610acb90613277565b6005546040516001600160a01b038084169216907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a3600580546001600160a01b0319166001600160a01b0392909216919091179055565b60006122ea8284613825565b9392505050565b3390565b6001600160a01b03831661231b5760405162461bcd60e51b8152600401610acb90613584565b6001600160a01b0382166123415760405162461bcd60e51b8152600401610acb906132bd565b6001600160a01b0380841660008181526001602090815260408083209487168084529490915290819020849055517f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b9259061239c90859061370d565b60405180910390a3505050565b6001600160a01b0383166123cf5760405162461bcd60e51b8152600401610acb9061353f565b6001600160a01b0382166123f55760405162461bcd60e51b8152600401610acb906131bd565b8061240b5761240683836000612898565b611c74565b600854600160a01b900460ff1615801561243e57506001600160a01b03831660009081526018602052604090205460ff16155b801561246357506001600160a01b03821660009081526018602052604090205460ff16155b156124e857600c5481111561248a5760405162461bcd60e51b8152600401610acb9061349b565b6001600160a01b03831660009081526014602052604090205460ff161580156124cc57506001600160a01b03821660009081526014602052604090205460ff16155b6124e85760405162461bcd60e51b8152600401610acb906133e7565b6000600d546124f630611439565b101590508080156125115750600854600160a01b900460ff16155b801561251f575060165460ff165b801561253657506008546001600160a01b03163314155b15612568576008805460ff60a01b1916600160a01b179055600d5461255a906129c2565b6008805460ff60a01b191690555b6008546001600160a01b03851660009081526017602052604090205460ff600160a01b9092048216159116806125b657506001600160a01b03841660009081526017602052604090205460ff165b156125bf575060005b80156126a55760085460009081906001600160a01b03878116911614156126235761260060646125fa60105488612ba290919063ffffffff16565b906122de565b915061261c60646125fa60115488612ba290919063ffffffff16565b905061265c565b61263d60646125fa600e5488612ba290919063ffffffff16565b915061265960646125fa600f5488612ba290919063ffffffff16565b90505b6012546126699083612bae565b6012556013546126799082612bae565b60135560006126888383612bae565b90506126948682612bba565b95506126a1883083612898565b5050505b6126b0858585612898565b6009546001600160a01b031663e30443bc866126cb81611439565b6040518363ffffffff1660e01b81526004016126e8929190613092565b600060405180830381600087803b15801561270257600080fd5b505af1925050508015612713575060015b506009546001600160a01b031663e30443bc8561272f81611439565b6040518363ffffffff1660e01b815260040161274c929190613092565b600060405180830381600087803b15801561276657600080fd5b505af1925050508015612777575060015b50600854600160a01b900460ff16610b32576015546009546040516001624d3b8760e01b031981526001600160a01b039091169063ffb2c479906127bf90849060040161370d565b606060405180830381600087803b1580156127d957600080fd5b505af1925050508015612809575060408051601f3d908101601f1916820190925261280691810190613033565b60015b612849577fff5498d77d5af8c805c9de192af65087317bbd617850c052f633b4812c5b64f23360405161283c9190613063565b60405180910390a1612890565b60405132906001907fc864333d6121033635ab41b29ae52f10a22cf4438c3e4f1c4c68518feb2f8a9890612884908790879087908b906137f2565b60405180910390a35050505b505050505050565b6001600160a01b0383166128be5760405162461bcd60e51b8152600401610acb9061353f565b6001600160a01b0382166128e45760405162461bcd60e51b8152600401610acb906131bd565b6128ef838383611c74565b6001600160a01b038316600090815260208190526040902054818110156129285760405162461bcd60e51b8152600401610acb9061334b565b6001600160a01b0380851660009081526020819052604080822085850390559185168152908120805484929061295f90849061380d565b92505081905550826001600160a01b0316846001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef846040516129a9919061370d565b60405180910390a36129bc848484611c74565b50505050565b6129cb81612bc6565b60125460135447916000916129df91612bae565b905060006129fc826125fa60125486612ba290919063ffffffff16565b90506000612a0a8483612bba565b90507fb1eec77c1dd02c7e01c512a637bd875dab5b6270238682b3cc528873900eb0188282604051612a3d929190613786565b60405180910390a1600a546040516000916001600160a01b0316908490612a6390613060565b60006040518083038185875af1925050503d8060008114612aa0576040519150601f19603f3d011682016040523d82523d6000602084013e612aa5565b606091505b505090508015612af0577fb0496abac68756d71a8197a35281274b24ef743ec90b4111621eaaabb1e2d01160125484604051612ae2929190613794565b60405180910390a160016012555b6009546040516001600160a01b03909116908390612b0d90613060565b60006040518083038185875af1925050503d8060008114612b4a576040519150601f19603f3d011682016040523d82523d6000602084013e612b4f565b606091505b50909150508015612890577fb0496abac68756d71a8197a35281274b24ef743ec90b4111621eaaabb1e2d01160135483604051612b8d9291906137c3565b60405180910390a16001601355505050505050565b60006122ea8284613845565b60006122ea828461380d565b60006122ea8284613864565b7f4ec548c733e604b4a7a7097e329bf97981b29a0a3a1d8a3ed609b3f3603c50fa81604051612bf5919061370d565b60405180910390a16040805160028082526060820183526000926020830190803683370190505090503081600081518110612c4057634e487b7160e01b600052603260045260246000fd5b6001600160a01b03928316602091820292909201810191909152600754604080516315ab88c960e31b81529051919093169263ad5c4648926004808301939192829003018186803b158015612c9457600080fd5b505afa158015612ca8573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612ccc9190612dd5565b81600181518110612ced57634e487b7160e01b600052603260045260246000fd5b6001600160a01b039283166020918202929092010152600754612d1391309116846122f5565b60075460405163791ac94760e01b81526001600160a01b039091169063791ac94790612d4c908590600090869030904290600401613716565b600060405180830381600087803b158015612d6657600080fd5b505af1158015612d7a573d6000803e3d6000fd5b505050507f18f9217bd756ce5f125fd65c3c43a197667b28455af5cd235235cf23600ac8e947604051612dad919061370d565b60405180910390a15050565b600060208284031215612dca578081fd5b81356122ea816138e7565b600060208284031215612de6578081fd5b81516122ea816138e7565b60008060408385031215612e03578081fd5b8235612e0e816138e7565b91506020830135612e1e816138e7565b809150509250929050565b600080600060608486031215612e3d578081fd5b8335612e48816138e7565b92506020840135612e58816138e7565b929592945050506040919091013590565b60008060408385031215612e7b578182fd5b8235612e86816138e7565b91506020830135612e1e816138fc565b600080600080600080600080610100898b031215612eb2578384fd5b8851612ebd816138e7565b809850506020890151965060408901519550606089015194506080890151935060a0890151925060c0890151915060e089015190509295985092959890939650565b60008060408385031215612f11578182fd5b8235612f1c816138e7565b946020939093013593505050565b600080600060408486031215612f3e578283fd5b833567ffffffffffffffff80821115612f55578485fd5b818601915086601f830112612f68578485fd5b813581811115612f76578586fd5b8760208083028501011115612f89578586fd5b60209283019550935050840135612f9f816138fc565b809150509250925092565b600060208284031215612fbb578081fd5b81356122ea816138fc565b600060208284031215612fd7578081fd5b81516122ea816138fc565b600060208284031215612ff3578081fd5b5035919050565b60006020828403121561300b578081fd5b5051919050565b60008060408385031215613024578182fd5b50508035926020909101359150565b600080600060608486031215613047578283fd5b8351925060208401519150604084015190509250925092565b90565b6001600160a01b0391909116815260200190565b6001600160a01b039290921682521515602082015260400190565b6001600160a01b03929092168252602082015260400190565b6001600160a01b0392831681529116602082015260400190565b6001600160a01b03989098168852602088019690965260408701949094526060860192909252608085015260a084015260c083015260e08201526101000190565b6040808252810183905260008460608301825b8681101561314957823561312c816138e7565b6001600160a01b0316825260209283019290910190600101613119565b5080925050508215156020830152949350505050565b901515815260200190565b6000602080835283518082850152825b818110156131965785810183015185820160400152820161317a565b818111156131a75783604083870101525b50601f01601f1916929092016040019392505050565b60208082526023908201527f45524332303a207472616e7366657220746f20746865207a65726f206164647260408201526265737360e81b606082015260800190565b6020808252600890820152670a8dede40daeac6d60c31b604082015260600190565b60208082526035908201527f466f6d6f4554483a2043616e6e6f742075706461746520676173466f7250726f60408201527463657373696e6720746f2073616d652076616c756560581b606082015260800190565b60208082526026908201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160408201526564647265737360d01b606082015260800190565b60208082526022908201527f45524332303a20617070726f766520746f20746865207a65726f206164647265604082015261737360f01b606082015260800190565b6020808252602c908201527f466f6d6f4554483a2054686520726f7574657220616c7265616479206861732060408201526b74686174206164647265737360a01b606082015260800190565b60208082526026908201527f45524332303a207472616e7366657220616d6f756e7420657863656564732062604082015265616c616e636560d01b606082015260800190565b60208082526036908201527f466f6d6f4554483a20546865206469766964656e6420747261636b657220616c6040820152757265616479206861732074686174206164647265737360501b606082015260800190565b6020808252601a908201527f5472616e736665722066726f6d20626f74206465746563746564000000000000604082015260600190565b60208082526028908201527f45524332303a207472616e7366657220616d6f756e74206578636565647320616040820152676c6c6f77616e636560c01b606082015260800190565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b60208082526031908201527f5472616e7366657220616d6f756e74206578636565647320746865206d6178546040820152703930b739b0b1ba34b7b720b6b7bab73a1760791b606082015260800190565b60208082526033908201527f466f6d6f4554483a204163636f756e7420697320616c7265616479207468652060408201527276616c7565206f6620276578636c756465642760681b606082015260800190565b60208082526025908201527f45524332303a207472616e736665722066726f6d20746865207a65726f206164604082015264647265737360d81b606082015260800190565b60208082526024908201527f45524332303a20617070726f76652066726f6d20746865207a65726f206164646040820152637265737360e01b606082015260800190565b6020808252603d908201527f466f6d6f4554483a20676173466f7250726f63657373696e67206d757374206260408201527f65206265747765656e203230302c30303020616e64203530302c303030000000606082015260800190565b6020808252601690820152754d61726b6574696e67205a65726f206164647265737360501b604082015260600190565b6020808252604d908201527f466f6d6f4554483a20546865206e6577206469766964656e6420747261636b6560408201527f72206d757374206265206f776e65642062792074686520466f6d6f455448207460608201526c1bdad95b8818dbdb9d1c9858dd609a1b608082015260a00190565b60208082526025908201527f45524332303a2064656372656173656420616c6c6f77616e63652062656c6f77604082015264207a65726f60d81b606082015260800190565b90815260200190565b600060a082018783526020878185015260a0604085015281875180845260c0860191508289019350845b818110156137655784516001600160a01b031683529383019391830191600101613740565b50506001600160a01b03969096166060850152505050608001529392505050565b918252602082015260400190565b9182526020820152606060408201819052600990820152684d41524b4554494e4760b81b608082015260a00190565b9182526020820152606060408201819052600990820152684449564944454e445360b81b608082015260a00190565b93845260208401929092526040830152606082015260800190565b60008219821115613820576138206138d1565b500190565b60008261384057634e487b7160e01b81526012600452602481fd5b500490565b600081600019048311821515161561385f5761385f6138d1565b500290565b600082821015613876576138766138d1565b500390565b60028104600182168061388f57607f821691505b602082108114156138b057634e487b7160e01b600052602260045260246000fd5b50919050565b60006000198214156138ca576138ca6138d1565b5060010190565b634e487b7160e01b600052601160045260246000fd5b6001600160a01b0381168114610f3757600080fd5b8015158114610f3757600080fdfea2646970667358221220442cf67d2522643e67af13d5c6995dff2c5a9b7a001ce1b0b5cb80dc2033d0af64736f6c6343000800003360806040523480156200001157600080fd5b50604080518082018252601681527f466f6d6f4554484469766964656e64547261636b65720000000000000000000060208083019182528351808501909452601784527f466f6d6f4554485f4469766964656e64547261636b657200000000000000000090840152815191929183918391620000909160039162000148565b508051620000a690600490602084019062000148565b50505050506000620000bd6200013f60201b60201c565b600980546001600160a01b0319166001600160a01b038316908117909155604051919250906000907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908290a350610e106012556200011b62000143565b6200012890600a6200023b565b620001369061271062000330565b601355620003a5565b3390565b600990565b828054620001569062000352565b90600052602060002090601f0160209004810192826200017a5760008555620001c5565b82601f106200019557805160ff1916838001178555620001c5565b82800160010185558215620001c5579182015b82811115620001c5578251825591602001919060010190620001a8565b50620001d3929150620001d7565b5090565b5b80821115620001d35760008155600101620001d8565b80825b600180861162000202575062000232565b8187048211156200021757620002176200038f565b808616156200022557918102915b9490941c938002620001f1565b94509492505050565b60006200024c600019848462000253565b9392505050565b60008262000264575060016200024c565b8162000273575060006200024c565b81600181146200028c57600281146200029757620002cb565b60019150506200024c565b60ff841115620002ab57620002ab6200038f565b6001841b915084821115620002c457620002c46200038f565b506200024c565b5060208310610133831016604e8410600b841016171562000303575081810a83811115620002fd57620002fd6200038f565b6200024c565b620003128484846001620001ee565b8086048211156200032757620003276200038f565b02949350505050565b60008160001904831182151516156200034d576200034d6200038f565b500290565b6002810460018216806200036757607f821691505b602082108114156200038957634e487b7160e01b600052602260045260246000fd5b50919050565b634e487b7160e01b600052601160045260246000fd5b61214a80620003b56000396000f3fe6080604052600436106102135760003560e01c8063715018a611610118578063bc4c4b37116100a0578063e7841ec01161006f578063e7841ec0146105bc578063e98030c7146105d1578063f2fde38b146105f1578063fbcbc0f114610611578063ffb2c4791461063157610222565b8063bc4c4b3714610547578063be10b61414610567578063dd62ed3e1461057c578063e30443bc1461059c57610222565b806395d89b41116100e757806395d89b41146104b2578063a457c2d7146104c7578063a8b9d240146104e7578063a9059cbb14610507578063aafd847a1461052757610222565b8063715018a61461044657806385a6b3ae1461045b5780638da5cb5b1461047057806391b89fba1461049257610222565b80633009a6091161019b5780634e7b827f1161016a5780634e7b827f146103a85780635183d6fd146103c85780636a474002146103fc5780636f2789ec1461041157806370a082311461042657610222565b80633009a6091461033e578063313ce5671461035357806331e79db014610368578063395093511461038857610222565b80630dcb2e89116101e25780630dcb2e89146102a957806318160ddd146102c9578063226cfa3d146102de57806323b872dd146102fe57806327ce01471461031e57610222565b806303c833021461022757806306fdde031461022f578063095ea7b31461025a57806309bbedde1461028757610222565b3661022257610220610660565b005b600080fd5b610220610660565b34801561023b57600080fd5b506102446106f6565b6040516102519190611bc3565b60405180910390f35b34801561026657600080fd5b5061027a610275366004611a7f565b610788565b6040516102519190611bb8565b34801561029357600080fd5b5061029c6107a6565b6040516102519190611f3f565b3480156102b557600080fd5b506102206102c4366004611b2f565b6107ac565b3480156102d557600080fd5b5061029c61081d565b3480156102ea57600080fd5b5061029c6102f9366004611a0b565b610823565b34801561030a57600080fd5b5061027a610319366004611ad7565b610835565b34801561032a57600080fd5b5061029c610339366004611a0b565b6108c5565b34801561034a57600080fd5b5061029c610926565b34801561035f57600080fd5b5061029c61092c565b34801561037457600080fd5b50610220610383366004611a0b565b610931565b34801561039457600080fd5b5061027a6103a3366004611a7f565b610a5b565b3480156103b457600080fd5b5061027a6103c3366004611a0b565b610aaf565b3480156103d457600080fd5b506103e86103e3366004611b2f565b610ac4565b604051610251989796959493929190611b77565b34801561040857600080fd5b50610220610c34565b34801561041d57600080fd5b5061029c610c4c565b34801561043257600080fd5b5061029c610441366004611a0b565b610c52565b34801561045257600080fd5b50610220610c6d565b34801561046757600080fd5b5061029c610cec565b34801561047c57600080fd5b50610485610cf2565b6040516102519190611b4a565b34801561049e57600080fd5b5061029c6104ad366004611a0b565b610d01565b3480156104be57600080fd5b50610244610d0c565b3480156104d357600080fd5b5061027a6104e2366004611a7f565b610d1b565b3480156104f357600080fd5b5061029c610502366004611a0b565b610d94565b34801561051357600080fd5b5061027a610522366004611a7f565b610dc0565b34801561053357600080fd5b5061029c610542366004611a0b565b610dd4565b34801561055357600080fd5b5061027a610562366004611a43565b610def565b34801561057357600080fd5b5061029c610ea5565b34801561058857600080fd5b5061029c610597366004611aaa565b610eab565b3480156105a857600080fd5b506102206105b7366004611a7f565b610ed6565b3480156105c857600080fd5b5061029c611075565b3480156105dd57600080fd5b506102206105ec366004611b2f565b61107b565b3480156105fd57600080fd5b5061022061060c366004611a0b565b6110e3565b34801561061d57600080fd5b506103e861062c366004611a0b565b61119a565b34801561063d57600080fd5b5061065161064c366004611b2f565b61130a565b60405161025193929190611f8c565b600061066a61081d565b1161067457600080fd5b34156106f4576106a661068561081d565b61069334600160801b611433565b61069d9190611ffb565b60055490611446565b60055560405133907fa493a9229478c3fcd73f66d2cdeb7f94fd0f341da924d1054236d78454116511906106db903490611f3f565b60405180910390a26008546106f09034611446565b6008555b565b60606003805461070590612090565b80601f016020809104026020016040519081016040528092919081815260200182805461073190612090565b801561077e5780601f106107535761010080835404028352916020019161077e565b820191906000526020600020905b81548152906001019060200180831161076157829003601f168201915b5050505050905090565b600061079c610795611452565b8484611456565b5060015b92915050565b600b5490565b6107b4611452565b6009546001600160a01b039081169116146107ea5760405162461bcd60e51b81526004016107e190611dbd565b60405180910390fd5b60135460405182907f474ea64804364a1e29a4487ddb63c3342a2dd826ccd8acf48825e680a0e6f20f90600090a3601355565b60025490565b60116020526000908152604090205481565b600061084284848461150a565b6001600160a01b038416600090815260016020526040812081610863611452565b6001600160a01b03166001600160a01b03168152602001908152602001600020549050828110156108a65760405162461bcd60e51b81526004016107e190611d75565b6108ba856108b2611452565b858403611456565b506001949350505050565b6001600160a01b038116600090815260066020526040812054600160801b906109149061090f906109096109046108fb88610c52565b60055490611433565b611522565b90611532565b611570565b61091e9190611ffb565b90505b919050565b600f5481565b600990565b610939611452565b6009546001600160a01b039081169116146109665760405162461bcd60e51b81526004016107e190611dbd565b6001600160a01b03811660009081526010602052604090205460ff161561098c57600080fd5b6001600160a01b0381166000908152601060205260408120805460ff191660011790556109ba908290611583565b60405163131836e760e21b815273fe491baeb811ced7adaba010fc5bd6c018dff86090634c60db9c906109f490600b908590600401611f48565b60006040518083038186803b158015610a0c57600080fd5b505af4158015610a20573d6000803e3d6000fd5b50506040516001600160a01b03841692507fa878b31040b2e6d0a9a3d3361209db3908ba62014b0dca52adbaee451d128b259150600090a250565b600061079c610a68611452565b848460016000610a76611452565b6001600160a01b03908116825260208083019390935260409182016000908120918b1681529252902054610aaa9190611fe3565b611456565b60106020526000908152604090205460ff1681565b600080600080600080600080600b73fe491baeb811ced7adaba010fc5bd6c018dff86063deb3d89690916040518263ffffffff1660e01b8152600401610b0a9190611f3f565b60206040518083038186803b158015610b2257600080fd5b505af4158015610b36573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610b5a9190611b17565b8910610b7f575060009650600019955085945086935083925082915081905080610c29565b6040516368d54f3f60e11b815260009073fe491baeb811ced7adaba010fc5bd6c018dff8609063d1aa9e7e90610bbc90600b908e90600401611f7e565b60206040518083038186803b158015610bd457600080fd5b505af4158015610be8573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610c0c9190611a27565b9050610c178161119a565b98509850985098509850985098509850505b919395975091939597565b60405162461bcd60e51b81526004016107e190611ce0565b60125481565b6001600160a01b031660009081526020819052604090205490565b610c75611452565b6009546001600160a01b03908116911614610ca25760405162461bcd60e51b81526004016107e190611dbd565b6009546040516000916001600160a01b0316907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908390a3600980546001600160a01b0319169055565b60085481565b6009546001600160a01b031690565b600061091e82610d94565b60606004805461070590612090565b60008060016000610d2a611452565b6001600160a01b0390811682526020808301939093526040918201600090812091881681529252902054905082811015610d765760405162461bcd60e51b81526004016107e190611ec3565b610d8a610d81611452565b85858403611456565b5060019392505050565b6001600160a01b03811660009081526007602052604081205461091e90610dba846108c5565b906115dc565b600061079c610dcd611452565b848461150a565b6001600160a01b031660009081526007602052604090205490565b6000610df9611452565b6009546001600160a01b03908116911614610e265760405162461bcd60e51b81526004016107e190611dbd565b6000610e31846115e8565b90508015610e9b576001600160a01b038416600081815260116020526040908190204290555184151591907fa2c38e2d2fb7e3e1912d937fd1ca11ed6d51864dee4cfa7a7bf02becd7acf09290610e89908590611f3f565b60405180910390a360019150506107a0565b5060009392505050565b60135481565b6001600160a01b03918216600090815260016020908152604080832093909416825291909152205490565b610ede611452565b6009546001600160a01b03908116911614610f0b5760405162461bcd60e51b81526004016107e190611dbd565b6001600160a01b03821660009081526010602052604090205460ff1615610f3157611071565b6013548110610fb557610f448282611583565b604051632f0ad01760e21b815273fe491baeb811ced7adaba010fc5bd6c018dff8609063bc2b405c90610f8090600b9086908690600401611f5f565b60006040518083038186803b158015610f9857600080fd5b505af4158015610fac573d6000803e3d6000fd5b5050505061102b565b610fc0826000611583565b60405163131836e760e21b815273fe491baeb811ced7adaba010fc5bd6c018dff86090634c60db9c90610ffa90600b908690600401611f48565b60006040518083038186803b15801561101257600080fd5b505af4158015611026573d6000803e3d6000fd5b505050505b7f24e94d300b5959a74b33ce8e06df9bce411d925478c5a1eba9a1066c1729f5f4828260405161105c929190611b5e565b60405180910390a161106f826001610def565b505b5050565b600f5490565b611083611452565b6009546001600160a01b039081169116146110b05760405162461bcd60e51b81526004016107e190611dbd565b60125460405182907f474ea64804364a1e29a4487ddb63c3342a2dd826ccd8acf48825e680a0e6f20f90600090a3601255565b6110eb611452565b6009546001600160a01b039081169116146111185760405162461bcd60e51b81526004016107e190611dbd565b6001600160a01b03811661113e5760405162461bcd60e51b81526004016107e190611c58565b6009546040516001600160a01b038084169216907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a3600980546001600160a01b0319166001600160a01b0392909216919091179055565b600080600080600080600080889750600b73fe491baeb811ced7adaba010fc5bd6c018dff8606317e142d190918a6040518363ffffffff1660e01b81526004016111e5929190611f48565b60206040518083038186803b1580156111fd57600080fd5b505af4158015611211573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906112359190611b17565b965060001995506000871261129757600f5487111561126357600f5461125c908890611737565b9550611297565b600f54600b5460009110611278576000611287565b600f54600b54611287916115dc565b90506112938882611532565b9650505b6112a088610d94565b94506112ab886108c5565b6001600160a01b0389166000908152601160205260409020549094509250826112d55760006112e3565b6012546112e3908490611446565b91504282116112f35760006112fd565b6112fd82426115dc565b9050919395975091939597565b600b54600090819081908061132a575050600f546000925082915061142c565b600f546000805a90506000805b898410801561134557508582105b1561141b5784611354816120cb565b600b549096508610905061136757600094505b6000600b600001868154811061138d57634e487b7160e01b600052603260045260246000fd5b60009182526020808320909101546001600160a01b031680835260119091526040909120549091506113be90611783565b156113e1576113ce816001610def565b156113e157816113dd816120cb565b9250505b826113eb816120cb565b93505060005a9050808511156114125761140f61140886836115dc565b8790611446565b95505b93506113379050565b600f85905590975095509193505050505b9193909250565b600061143f828461201b565b9392505050565b600061143f8284611fe3565b3390565b6001600160a01b03831661147c5760405162461bcd60e51b81526004016107e190611e33565b6001600160a01b0382166114a25760405162461bcd60e51b81526004016107e190611c9e565b6001600160a01b0380841660008181526001602090815260408083209487168084529490915290819020849055517f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925906114fd908590611f3f565b60405180910390a3505050565b60405162461bcd60e51b81526004016107e190611e77565b6000818181121561091e57600080fd5b60008061153f8385611fa2565b9050600083121580156115525750838112155b80611567575060008312801561156757508381125b61143f57600080fd5b60008082121561157f57600080fd5b5090565b600061158e83610c52565b9050808211156115b65760006115a483836115dc565b90506115b084826117aa565b5061106f565b8082101561106f5760006115ca82846115dc565b90506115d6848261180e565b50505050565b600061143f8284612079565b6000806115f483610d94565b9050801561172e576001600160a01b03831660009081526007602052604090205461161f9082611446565b6001600160a01b038416600081815260076020526040908190209290925590517fee503bee2bb6a87e57bc57db795f98137327401a0e7b7ce42e37926cc1a9ca4d9061166c908490611f3f565b60405180910390a26000836001600160a01b031682610bb89060405161169190611b47565b600060405180830381858888f193505050503d80600081146116cf576040519150601f19603f3d011682016040523d82523d6000602084013e6116d4565b606091505b5050905080611726576001600160a01b03841660009081526007602052604090205461170090836115dc565b6001600160a01b0385166000908152600760205260408120919091559250610921915050565b509050610921565b50600092915050565b600080821215801561175257508261174f838261203a565b13155b80611770575060008212801561177057508261176e838261203a565b135b61177957600080fd5b61143f828461203a565b60004282111561179557506000610921565b6012546117a242846115dc565b101592915050565b6117b48282611852565b6117ee6117cf6109048360055461143390919063ffffffff16565b6001600160a01b03841660009081526006602052604090205490611737565b6001600160a01b0390921660009081526006602052604090209190915550565b611818828261191a565b6117ee6118336109048360055461143390919063ffffffff16565b6001600160a01b03841660009081526006602052604090205490611532565b6001600160a01b0382166118785760405162461bcd60e51b81526004016107e190611f08565b6118846000838361106f565b80600260008282546118969190611fe3565b90915550506001600160a01b038216600090815260208190526040812080548392906118c3908490611fe3565b90915550506040516001600160a01b038316906000907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef90611906908590611f3f565b60405180910390a36110716000838361106f565b6001600160a01b0382166119405760405162461bcd60e51b81526004016107e190611df2565b61194c8260008361106f565b6001600160a01b038216600090815260208190526040902054818110156119855760405162461bcd60e51b81526004016107e190611c16565b6001600160a01b03831660009081526020819052604081208383039055600280548492906119b4908490612079565b90915550506040516000906001600160a01b038516907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef906119f7908690611f3f565b60405180910390a361106f8360008461106f565b600060208284031215611a1c578081fd5b813561143f816120fc565b600060208284031215611a38578081fd5b815161143f816120fc565b60008060408385031215611a55578081fd5b8235611a60816120fc565b915060208301358015158114611a74578182fd5b809150509250929050565b60008060408385031215611a91578182fd5b8235611a9c816120fc565b946020939093013593505050565b60008060408385031215611abc578182fd5b8235611ac7816120fc565b91506020830135611a74816120fc565b600080600060608486031215611aeb578081fd5b8335611af6816120fc565b92506020840135611b06816120fc565b929592945050506040919091013590565b600060208284031215611b28578081fd5b5051919050565b600060208284031215611b40578081fd5b5035919050565b90565b6001600160a01b0391909116815260200190565b6001600160a01b03929092168252602082015260400190565b6001600160a01b03989098168852602088019690965260408701949094526060860192909252608085015260a084015260c083015260e08201526101000190565b901515815260200190565b6000602080835283518082850152825b81811015611bef57858101830151858201604001528201611bd3565b81811115611c005783604083870101525b50601f01601f1916929092016040019392505050565b60208082526022908201527f45524332303a206275726e20616d6f756e7420657863656564732062616c616e604082015261636560f01b606082015260800190565b60208082526026908201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160408201526564647265737360d01b606082015260800190565b60208082526022908201527f45524332303a20617070726f766520746f20746865207a65726f206164647265604082015261737360f01b606082015260800190565b60208082526069908201527f466f6d6f4554484469766964656e64547261636b65723a20776974686472617760408201527f4469766964656e642064697361626c65642e20557365207468652027636c616960608201527f6d272066756e6374696f6e206f6e20746865206d61696e20466f6d6f4554482060808201526831b7b73a3930b1ba1760b91b60a082015260c00190565b60208082526028908201527f45524332303a207472616e7366657220616d6f756e74206578636565647320616040820152676c6c6f77616e636560c01b606082015260800190565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b60208082526021908201527f45524332303a206275726e2066726f6d20746865207a65726f206164647265736040820152607360f81b606082015260800190565b60208082526024908201527f45524332303a20617070726f76652066726f6d20746865207a65726f206164646040820152637265737360e01b606082015260800190565b6020808252602c908201527f466f6d6f4554484469766964656e64547261636b65723a204e6f207472616e7360408201526b19995c9cc8185b1b1bddd95960a21b606082015260800190565b60208082526025908201527f45524332303a2064656372656173656420616c6c6f77616e63652062656c6f77604082015264207a65726f60d81b606082015260800190565b6020808252601f908201527f45524332303a206d696e7420746f20746865207a65726f206164647265737300604082015260600190565b90815260200190565b9182526001600160a01b0316602082015260400190565b9283526001600160a01b03919091166020830152604082015260600190565b918252602082015260400190565b9283526020830191909152604082015260600190565b600080821280156001600160ff1b0384900385131615611fc457611fc46120e6565b600160ff1b8390038412811615611fdd57611fdd6120e6565b50500190565b60008219821115611ff657611ff66120e6565b500190565b60008261201657634e487b7160e01b81526012600452602481fd5b500490565b6000816000190483118215151615612035576120356120e6565b500290565b60008083128015600160ff1b850184121615612058576120586120e6565b6001600160ff1b0384018313811615612073576120736120e6565b50500390565b60008282101561208b5761208b6120e6565b500390565b6002810460018216806120a457607f821691505b602082108114156120c557634e487b7160e01b600052602260045260246000fd5b50919050565b60006000198214156120df576120df6120e6565b5060010190565b634e487b7160e01b600052601160045260246000fd5b6001600160a01b038116811461211157600080fd5b5056fea26469706673582212206bc4cf4ef4c205201c1bd5f2b473177180f4d292a6a660fb848980d45e370c0764736f6c63430008000033
Deployed Bytecode
0x60806040526004361061036f5760003560e01c80638da5cb5b116101c6578063c492f046116100f7578063deaa59df11610095578063e98030c71161006f578063e98030c714610967578063ec28438a14610987578063f27fd254146109a7578063f2fde38b146109c757610376565b8063deaa59df1461091d578063e2f456051461093d578063e7841ec01461095257610376565b8063cd49513f116100d1578063cd49513f1461089d578063cf88f825146108bd578063d84e4439146108dd578063dd62ed3e146108fd57610376565b8063c492f04614610848578063c705c56914610868578063c8c8ebe41461088857610376565b8063a9059cbb11610164578063afa4f3b21161013e578063afa4f3b2146107c8578063b2d8f208146107e8578063bd61f0a614610808578063c02466681461082857610376565b8063a9059cbb1461075f578063ad56c13c1461077f578063aeb55569146107b357610376565b80639fd8234e116101a05780639fd8234e146106ea578063a26579ad1461070a578063a457c2d71461071f578063a8b9d2401461073f57610376565b80638da5cb5b146106ab57806395d89b41146106c05780639c1b8af5146106d557610376565b806345de8926116102a05780636ffcdaf01161023e578063715018a611610218578063715018a61461064157806385141a7714610656578063871c128d1461066b57806388bdd9be1461068b57610376565b80636ffcdaf0146105ec578063700bb1911461060157806370a082311461062157610376565b80634fbee1931161027a5780634fbee1931461057757806364b0f6531461059757806365b8dbc0146105ac5780636843cd84146105cc57610376565b806345de89261461052d57806349bd5a5e1461054d5780634e71d92d1461056257610376565b80632c1f52161161030d57806331e79db0116102e757806331e79db0146104b857806339509351146104d8578063412eaabc146104f857806343db57001461050d57610376565b80632c1f52161461047957806330bb4cff1461048e578063313ce567146104a357610376565b80631694505e116103495780631694505e146103f557806318160ddd1461041757806323b872dd1461043957806323cc66011461045957610376565b806306fdde031461037b578063095ea7b3146103a65780630dcb2e89146103d357610376565b3661037657005b600080fd5b34801561038757600080fd5b506103906109e7565b60405161039d919061316a565b60405180910390f35b3480156103b257600080fd5b506103c66103c1366004612eff565b610a79565b60405161039d919061315f565b3480156103df57600080fd5b506103f36103ee366004612fe2565b610a96565b005b34801561040157600080fd5b5061040a610b39565b60405161039d9190613063565b34801561042357600080fd5b5061042c610b48565b60405161039d919061370d565b34801561044557600080fd5b506103c6610454366004612e29565b610b4e565b34801561046557600080fd5b506103f3610474366004612e69565b610bde565b34801561048557600080fd5b5061040a610cb2565b34801561049a57600080fd5b5061042c610cc1565b3480156104af57600080fd5b5061042c610d43565b3480156104c457600080fd5b506103f36104d3366004612db9565b610d48565b3480156104e457600080fd5b506103c66104f3366004612eff565b610dad565b34801561050457600080fd5b5061042c610e01565b34801561051957600080fd5b506103c6610528366004612db9565b610e07565b34801561053957600080fd5b506103f3610548366004612faa565b610e25565b34801561055957600080fd5b5061040a610ea3565b34801561056e57600080fd5b506103f3610eb2565b34801561058357600080fd5b506103c6610592366004612db9565b610f3a565b3480156105a357600080fd5b5061042c610f58565b3480156105b857600080fd5b506103f36105c7366004612db9565b610f9d565b3480156105d857600080fd5b5061042c6105e7366004612db9565b6112cb565b3480156105f857600080fd5b5061042c611352565b34801561060d57600080fd5b506103f361061c366004612fe2565b611358565b34801561062d57600080fd5b5061042c61063c366004612db9565b611439565b34801561064d57600080fd5b506103f3611454565b34801561066257600080fd5b5061040a6114d3565b34801561067757600080fd5b506103f3610686366004612fe2565b6114e2565b34801561069757600080fd5b506103f36106a6366004612db9565b61159e565b3480156106b757600080fd5b5061040a611824565b3480156106cc57600080fd5b50610390611833565b3480156106e157600080fd5b5061042c611842565b3480156106f657600080fd5b506103f3610705366004613012565b611848565b34801561071657600080fd5b5061042c6118f3565b34801561072b57600080fd5b506103c661073a366004612eff565b611938565b34801561074b57600080fd5b5061042c61075a366004612db9565b6119b1565b34801561076b57600080fd5b506103c661077a366004612eff565b6119e2565b34801561078b57600080fd5b5061079f61079a366004612db9565b6119f6565b60405161039d9897969594939291906130c5565b3480156107bf57600080fd5b506103c6611aa3565b3480156107d457600080fd5b506103f36107e3366004612fe2565b611aac565b3480156107f457600080fd5b506103f3610803366004613012565b611b21565b34801561081457600080fd5b506103f3610823366004612eff565b611bbf565b34801561083457600080fd5b506103f3610843366004612e69565b611c79565b34801561085457600080fd5b506103f3610863366004612f2a565b611d41565b34801561087457600080fd5b506103c6610883366004612db9565b611e29565b34801561089457600080fd5b5061042c611eaa565b3480156108a957600080fd5b506103f36108b8366004612e69565b611eb0565b3480156108c957600080fd5b506103f36108d8366004612db9565b611f23565b3480156108e957600080fd5b506103f36108f8366004612db9565b611f7c565b34801561090957600080fd5b5061042c610918366004612df1565b611fd2565b34801561092957600080fd5b506103f3610938366004612db9565b611ffd565b34801561094957600080fd5b5061042c6120c1565b34801561095e57600080fd5b5061042c6120c7565b34801561097357600080fd5b506103f3610982366004612fe2565b61210c565b34801561099357600080fd5b506103f36109a2366004612fe2565b612171565b3480156109b357600080fd5b5061079f6109c2366004612fe2565b6121e6565b3480156109d357600080fd5b506103f36109e2366004612db9565b612227565b6060600380546109f69061387b565b80601f0160208091040260200160405190810160405280929190818152602001828054610a229061387b565b8015610a6f5780601f10610a4457610100808354040283529160200191610a6f565b820191906000526020600020905b815481529060010190602001808311610a5257829003601f168201915b5050505050905090565b6000610a8d610a866122f1565b84846122f5565b50600192915050565b610a9e6122f1565b6005546001600160a01b03908116911614610ad45760405162461bcd60e51b8152600401610acb90613466565b60405180910390fd5b600954604051630dcb2e8960e01b81526001600160a01b0390911690630dcb2e8990610b0490849060040161370d565b600060405180830381600087803b158015610b1e57600080fd5b505af1158015610b32573d6000803e3d6000fd5b5050505050565b6007546001600160a01b031681565b60025490565b6000610b5b8484846123a9565b6001600160a01b038416600090815260016020526040812081610b7c6122f1565b6001600160a01b03166001600160a01b0316815260200190815260200160002054905082811015610bbf5760405162461bcd60e51b8152600401610acb9061341e565b610bd385610bcb6122f1565b8584036122f5565b506001949350505050565b610be66122f1565b6005546001600160a01b03908116911614610c135760405162461bcd60e51b8152600401610acb90613466565b6001600160a01b03821660009081526018602052604090205460ff1615158115151415610c525760405162461bcd60e51b8152600401610acb906134ec565b6001600160a01b03821660008181526018602052604090819020805460ff1916841515179055517f3c054e3f2f036e0e59d335fc15b75af48358879a01263a9bb61414efba3b0ca290610ca690849061315f565b60405180910390a25050565b6009546001600160a01b031681565b600954604080516342d359d760e11b815290516000926001600160a01b0316916385a6b3ae916004808301926020929190829003018186803b158015610d0657600080fd5b505afa158015610d1a573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610d3e9190612ffa565b905090565b600990565b610d506122f1565b6005546001600160a01b03908116911614610d7d5760405162461bcd60e51b8152600401610acb90613466565b60095460405163031e79db60e41b81526001600160a01b03909116906331e79db090610b04908490600401613063565b6000610a8d610dba6122f1565b848460016000610dc86122f1565b6001600160a01b03908116825260208083019390935260409182016000908120918b1681529252902054610dfc919061380d565b6122f5565b60125481565b6001600160a01b031660009081526018602052604090205460ff1690565b610e2d6122f1565b6005546001600160a01b03908116911614610e5a5760405162461bcd60e51b8152600401610acb90613466565b6016805460ff19168215151790556040517f5622abe2b5d0eae4b753d16b630beb4545f383075afebbe3221c3a12cd008c2490610e9890839061315f565b60405180910390a150565b6008546001600160a01b031681565b60095460405163bc4c4b3760e01b81526001600160a01b039091169063bc4c4b3790610ee5903390600090600401613077565b602060405180830381600087803b158015610eff57600080fd5b505af1158015610f13573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610f379190612fc6565b50565b6001600160a01b031660009081526017602052604090205460ff1690565b600954604080516304ddf6ef60e11b815290516000926001600160a01b0316916309bbedde916004808301926020929190829003018186803b158015610d0657600080fd5b610fa56122f1565b6005546001600160a01b03908116911614610fd25760405162461bcd60e51b8152600401610acb90613466565b6007546001600160a01b03828116911614156110005760405162461bcd60e51b8152600401610acb906132ff565b6007546040516001600160a01b03918216918316907f8fc842bbd331dfa973645f4ed48b11683d501ebf1352708d77a5da2ab49a576e90600090a3600780546001600160a01b0319166001600160a01b0383811691909117918290556040805163c45a015560e01b815290516000939092169163c45a015591600480820192602092909190829003018186803b15801561109957600080fd5b505afa1580156110ad573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906110d19190612dd5565b6001600160a01b031663c9c6539630600760009054906101000a90046001600160a01b03166001600160a01b031663ad5c46486040518163ffffffff1660e01b815260040160206040518083038186803b15801561112e57600080fd5b505afa158015611142573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906111669190612dd5565b6040518363ffffffff1660e01b81526004016111839291906130ab565b602060405180830381600087803b15801561119d57600080fd5b505af11580156111b1573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906111d59190612dd5565b600880546001600160a01b0319166001600160a01b038381169190911790915560095460075460405163031e79db60e41b8152939450908216926331e79db092611223921690600401613063565b600060405180830381600087803b15801561123d57600080fd5b505af1158015611251573d6000803e3d6000fd5b505060095460085460405163031e79db60e41b81526001600160a01b0392831694506331e79db0935061128a9290911690600401613063565b600060405180830381600087803b1580156112a457600080fd5b505af11580156112b8573d6000803e3d6000fd5b505050506112c7826001611eb0565b5050565b6009546040516370a0823160e01b81526000916001600160a01b0316906370a08231906112fc908590600401613063565b60206040518083038186803b15801561131457600080fd5b505afa158015611328573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061134c9190612ffa565b92915050565b60135481565b6009546040516001624d3b8760e01b03198152600091829182916001600160a01b03169063ffb2c4799061139090879060040161370d565b606060405180830381600087803b1580156113aa57600080fd5b505af11580156113be573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906113e29190613033565b925092509250326001600160a01b0316600015157fc864333d6121033635ab41b29ae52f10a22cf4438c3e4f1c4c68518feb2f8a988585858960405161142b94939291906137f2565b60405180910390a350505050565b6001600160a01b031660009081526020819052604090205490565b61145c6122f1565b6005546001600160a01b039081169116146114895760405162461bcd60e51b8152600401610acb90613466565b6005546040516000916001600160a01b0316907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908390a3600580546001600160a01b0319169055565b600b546001600160a01b031681565b6114ea6122f1565b6005546001600160a01b039081169116146115175760405162461bcd60e51b8152600401610acb90613466565b62030d40811015801561152d57506207a1208111155b6115495760405162461bcd60e51b8152600401610acb906135c8565b60155481141561156b5760405162461bcd60e51b8152600401610acb90613222565b60155460405182907f40d7e40e79af4e8e5a9b3c57030d8ea93f13d669c06d448c4d631d4ae7d23db790600090a3601555565b6115a66122f1565b6005546001600160a01b039081169116146115d35760405162461bcd60e51b8152600401610acb90613466565b6009546001600160a01b03828116911614156116015760405162461bcd60e51b8152600401610acb90613391565b6000819050306001600160a01b0316816001600160a01b0316638da5cb5b6040518163ffffffff1660e01b815260040160206040518083038186803b15801561164957600080fd5b505afa15801561165d573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906116819190612dd5565b6001600160a01b0316146116a75760405162461bcd60e51b8152600401610acb90613655565b60405163031e79db60e41b81526001600160a01b038216906331e79db0906116d3908490600401613063565b600060405180830381600087803b1580156116ed57600080fd5b505af1158015611701573d6000803e3d6000fd5b505060405163031e79db60e41b81526001600160a01b03841692506331e79db09150611731903090600401613063565b600060405180830381600087803b15801561174b57600080fd5b505af115801561175f573d6000803e3d6000fd5b505060075460405163031e79db60e41b81526001600160a01b0380861694506331e79db09350611793921690600401613063565b600060405180830381600087803b1580156117ad57600080fd5b505af11580156117c1573d6000803e3d6000fd5b50506009546040516001600160a01b03918216935090851691507f90c7d74461c613da5efa97d90740869367d74ab3aa5837aa4ae9a975f954b7a890600090a3600980546001600160a01b0319166001600160a01b039290921691909117905550565b6005546001600160a01b031690565b6060600480546109f69061387b565b60155481565b6118506122f1565b6005546001600160a01b0390811691161461187d5760405162461bcd60e51b8152600401610acb90613466565b601082905560118190556000611893828461380d565b9050603381106118b55760405162461bcd60e51b8152600401610acb90613200565b7f125b37650f21d088600cef1223439f6a8bd70800debfd486c503a8a2d19d4b0183836040516118e6929190613786565b60405180910390a1505050565b60095460408051631bc9e27b60e21b815290516000926001600160a01b031691636f2789ec916004808301926020929190829003018186803b158015610d0657600080fd5b600080600160006119476122f1565b6001600160a01b03908116825260208083019390935260409182016000908120918816815292529020549050828110156119935760405162461bcd60e51b8152600401610acb906136c8565b6119a761199e6122f1565b858584036122f5565b5060019392505050565b6009546040516302a2e74960e61b81526000916001600160a01b03169063a8b9d240906112fc908590600401613063565b6000610a8d6119ef6122f1565b84846123a9565b60095460405163fbcbc0f160e01b815260009182918291829182918291829182916001600160a01b039091169063fbcbc0f190611a37908c90600401613063565b6101006040518083038186803b158015611a5057600080fd5b505afa158015611a64573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611a889190612e96565b97509750975097509750975097509750919395975091939597565b60165460ff1681565b611ab46122f1565b6005546001600160a01b03908116911614611ae15760405162461bcd60e51b8152600401610acb90613466565b7f190dc7c30bc62ef30e35c5f5512ad715a1bd03230f2d89c965249246c8d8ecca600d5482604051611b14929190613786565b60405180910390a1600d55565b611b296122f1565b6005546001600160a01b03908116911614611b565760405162461bcd60e51b8152600401610acb90613466565b600e829055600f8190556000611b6c828461380d565b905060338110611b8e5760405162461bcd60e51b8152600401610acb90613200565b7f5fcc0eea159d45a3b8d481be746c9beed251431a542a5fed4484be37ab783e8d83836040516118e6929190613786565b611bc76122f1565b6005546001600160a01b03908116911614611bf45760405162461bcd60e51b8152600401610acb90613466565b60405163a9059cbb60e01b81526001600160a01b0383169063a9059cbb90611c229033908590600401613092565b602060405180830381600087803b158015611c3c57600080fd5b505af1158015611c50573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611c749190612fc6565b505050565b611c816122f1565b6005546001600160a01b03908116911614611cae5760405162461bcd60e51b8152600401610acb90613466565b6001600160a01b03821660009081526017602052604090205460ff1615158115151415611ced5760405162461bcd60e51b8152600401610acb906134ec565b6001600160a01b03821660008181526017602052604090819020805460ff1916841515179055517f9d8f7706ea1113d1a167b526eca956215946dd36cc7df39eb16180222d8b5df790610ca690849061315f565b611d496122f1565b6005546001600160a01b03908116911614611d765760405162461bcd60e51b8152600401610acb90613466565b60005b82811015611df5578160176000868685818110611da657634e487b7160e01b600052603260045260246000fd5b9050602002016020810190611dbb9190612db9565b6001600160a01b031681526020810191909152604001600020805460ff191691151591909117905580611ded816138b6565b915050611d79565b507f7fdaf542373fa84f4ee8d662c642f44e4c2276a217d7d29e548b6eb29a233b358383836040516118e693929190613106565b600954604051634e7b827f60e01b81526000916001600160a01b031690634e7b827f90611e5a908590600401613063565b60206040518083038186803b158015611e7257600080fd5b505afa158015611e86573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061134c9190612fc6565b600c5481565b611eb86122f1565b6005546001600160a01b03908116911614611ee55760405162461bcd60e51b8152600401610acb90613466565b6001600160a01b039091166000908152601760209081526040808320805494151560ff19958616811790915560189092529091208054909216179055565b611f2b6122f1565b6005546001600160a01b03908116911614611f585760405162461bcd60e51b8152600401610acb90613466565b6001600160a01b03166000908152601460205260409020805460ff19166001179055565b611f846122f1565b6005546001600160a01b03908116911614611fb15760405162461bcd60e51b8152600401610acb90613466565b6001600160a01b03166000908152601460205260409020805460ff19169055565b6001600160a01b03918216600090815260016020908152604080832093909416825291909152205490565b6120056122f1565b6005546001600160a01b039081169116146120325760405162461bcd60e51b8152600401610acb90613466565b6001600160a01b0381166120585760405162461bcd60e51b8152600401610acb90613625565b600a546040517fceb4a6bb0f5ce9dc9274d4ddd707cc147f37d2f6f24df18977bcde5b0e8d9f4a91612097916001600160a01b039091169084906130ab565b60405180910390a1600a80546001600160a01b0319166001600160a01b0392909216919091179055565b600d5481565b6009546040805163039e107b60e61b815290516000926001600160a01b03169163e7841ec0916004808301926020929190829003018186803b158015610d0657600080fd5b6121146122f1565b6005546001600160a01b039081169116146121415760405162461bcd60e51b8152600401610acb90613466565b60095460405163e98030c760e01b81526001600160a01b039091169063e98030c790610b0490849060040161370d565b6121796122f1565b6005546001600160a01b039081169116146121a65760405162461bcd60e51b8152600401610acb90613466565b7f4a79811e633121b844203daf0d546b7b3a675face68ce9a9739022ab21161dae600c54826040516121d9929190613786565b60405180910390a1600c55565b600954604051635183d6fd60e01b815260009182918291829182918291829182916001600160a01b0390911690635183d6fd90611a37908c9060040161370d565b61222f6122f1565b6005546001600160a01b0390811691161461225c5760405162461bcd60e51b8152600401610acb90613466565b6001600160a01b0381166122825760405162461bcd60e51b8152600401610acb90613277565b6005546040516001600160a01b038084169216907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a3600580546001600160a01b0319166001600160a01b0392909216919091179055565b60006122ea8284613825565b9392505050565b3390565b6001600160a01b03831661231b5760405162461bcd60e51b8152600401610acb90613584565b6001600160a01b0382166123415760405162461bcd60e51b8152600401610acb906132bd565b6001600160a01b0380841660008181526001602090815260408083209487168084529490915290819020849055517f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b9259061239c90859061370d565b60405180910390a3505050565b6001600160a01b0383166123cf5760405162461bcd60e51b8152600401610acb9061353f565b6001600160a01b0382166123f55760405162461bcd60e51b8152600401610acb906131bd565b8061240b5761240683836000612898565b611c74565b600854600160a01b900460ff1615801561243e57506001600160a01b03831660009081526018602052604090205460ff16155b801561246357506001600160a01b03821660009081526018602052604090205460ff16155b156124e857600c5481111561248a5760405162461bcd60e51b8152600401610acb9061349b565b6001600160a01b03831660009081526014602052604090205460ff161580156124cc57506001600160a01b03821660009081526014602052604090205460ff16155b6124e85760405162461bcd60e51b8152600401610acb906133e7565b6000600d546124f630611439565b101590508080156125115750600854600160a01b900460ff16155b801561251f575060165460ff165b801561253657506008546001600160a01b03163314155b15612568576008805460ff60a01b1916600160a01b179055600d5461255a906129c2565b6008805460ff60a01b191690555b6008546001600160a01b03851660009081526017602052604090205460ff600160a01b9092048216159116806125b657506001600160a01b03841660009081526017602052604090205460ff165b156125bf575060005b80156126a55760085460009081906001600160a01b03878116911614156126235761260060646125fa60105488612ba290919063ffffffff16565b906122de565b915061261c60646125fa60115488612ba290919063ffffffff16565b905061265c565b61263d60646125fa600e5488612ba290919063ffffffff16565b915061265960646125fa600f5488612ba290919063ffffffff16565b90505b6012546126699083612bae565b6012556013546126799082612bae565b60135560006126888383612bae565b90506126948682612bba565b95506126a1883083612898565b5050505b6126b0858585612898565b6009546001600160a01b031663e30443bc866126cb81611439565b6040518363ffffffff1660e01b81526004016126e8929190613092565b600060405180830381600087803b15801561270257600080fd5b505af1925050508015612713575060015b506009546001600160a01b031663e30443bc8561272f81611439565b6040518363ffffffff1660e01b815260040161274c929190613092565b600060405180830381600087803b15801561276657600080fd5b505af1925050508015612777575060015b50600854600160a01b900460ff16610b32576015546009546040516001624d3b8760e01b031981526001600160a01b039091169063ffb2c479906127bf90849060040161370d565b606060405180830381600087803b1580156127d957600080fd5b505af1925050508015612809575060408051601f3d908101601f1916820190925261280691810190613033565b60015b612849577fff5498d77d5af8c805c9de192af65087317bbd617850c052f633b4812c5b64f23360405161283c9190613063565b60405180910390a1612890565b60405132906001907fc864333d6121033635ab41b29ae52f10a22cf4438c3e4f1c4c68518feb2f8a9890612884908790879087908b906137f2565b60405180910390a35050505b505050505050565b6001600160a01b0383166128be5760405162461bcd60e51b8152600401610acb9061353f565b6001600160a01b0382166128e45760405162461bcd60e51b8152600401610acb906131bd565b6128ef838383611c74565b6001600160a01b038316600090815260208190526040902054818110156129285760405162461bcd60e51b8152600401610acb9061334b565b6001600160a01b0380851660009081526020819052604080822085850390559185168152908120805484929061295f90849061380d565b92505081905550826001600160a01b0316846001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef846040516129a9919061370d565b60405180910390a36129bc848484611c74565b50505050565b6129cb81612bc6565b60125460135447916000916129df91612bae565b905060006129fc826125fa60125486612ba290919063ffffffff16565b90506000612a0a8483612bba565b90507fb1eec77c1dd02c7e01c512a637bd875dab5b6270238682b3cc528873900eb0188282604051612a3d929190613786565b60405180910390a1600a546040516000916001600160a01b0316908490612a6390613060565b60006040518083038185875af1925050503d8060008114612aa0576040519150601f19603f3d011682016040523d82523d6000602084013e612aa5565b606091505b505090508015612af0577fb0496abac68756d71a8197a35281274b24ef743ec90b4111621eaaabb1e2d01160125484604051612ae2929190613794565b60405180910390a160016012555b6009546040516001600160a01b03909116908390612b0d90613060565b60006040518083038185875af1925050503d8060008114612b4a576040519150601f19603f3d011682016040523d82523d6000602084013e612b4f565b606091505b50909150508015612890577fb0496abac68756d71a8197a35281274b24ef743ec90b4111621eaaabb1e2d01160135483604051612b8d9291906137c3565b60405180910390a16001601355505050505050565b60006122ea8284613845565b60006122ea828461380d565b60006122ea8284613864565b7f4ec548c733e604b4a7a7097e329bf97981b29a0a3a1d8a3ed609b3f3603c50fa81604051612bf5919061370d565b60405180910390a16040805160028082526060820183526000926020830190803683370190505090503081600081518110612c4057634e487b7160e01b600052603260045260246000fd5b6001600160a01b03928316602091820292909201810191909152600754604080516315ab88c960e31b81529051919093169263ad5c4648926004808301939192829003018186803b158015612c9457600080fd5b505afa158015612ca8573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612ccc9190612dd5565b81600181518110612ced57634e487b7160e01b600052603260045260246000fd5b6001600160a01b039283166020918202929092010152600754612d1391309116846122f5565b60075460405163791ac94760e01b81526001600160a01b039091169063791ac94790612d4c908590600090869030904290600401613716565b600060405180830381600087803b158015612d6657600080fd5b505af1158015612d7a573d6000803e3d6000fd5b505050507f18f9217bd756ce5f125fd65c3c43a197667b28455af5cd235235cf23600ac8e947604051612dad919061370d565b60405180910390a15050565b600060208284031215612dca578081fd5b81356122ea816138e7565b600060208284031215612de6578081fd5b81516122ea816138e7565b60008060408385031215612e03578081fd5b8235612e0e816138e7565b91506020830135612e1e816138e7565b809150509250929050565b600080600060608486031215612e3d578081fd5b8335612e48816138e7565b92506020840135612e58816138e7565b929592945050506040919091013590565b60008060408385031215612e7b578182fd5b8235612e86816138e7565b91506020830135612e1e816138fc565b600080600080600080600080610100898b031215612eb2578384fd5b8851612ebd816138e7565b809850506020890151965060408901519550606089015194506080890151935060a0890151925060c0890151915060e089015190509295985092959890939650565b60008060408385031215612f11578182fd5b8235612f1c816138e7565b946020939093013593505050565b600080600060408486031215612f3e578283fd5b833567ffffffffffffffff80821115612f55578485fd5b818601915086601f830112612f68578485fd5b813581811115612f76578586fd5b8760208083028501011115612f89578586fd5b60209283019550935050840135612f9f816138fc565b809150509250925092565b600060208284031215612fbb578081fd5b81356122ea816138fc565b600060208284031215612fd7578081fd5b81516122ea816138fc565b600060208284031215612ff3578081fd5b5035919050565b60006020828403121561300b578081fd5b5051919050565b60008060408385031215613024578182fd5b50508035926020909101359150565b600080600060608486031215613047578283fd5b8351925060208401519150604084015190509250925092565b90565b6001600160a01b0391909116815260200190565b6001600160a01b039290921682521515602082015260400190565b6001600160a01b03929092168252602082015260400190565b6001600160a01b0392831681529116602082015260400190565b6001600160a01b03989098168852602088019690965260408701949094526060860192909252608085015260a084015260c083015260e08201526101000190565b6040808252810183905260008460608301825b8681101561314957823561312c816138e7565b6001600160a01b0316825260209283019290910190600101613119565b5080925050508215156020830152949350505050565b901515815260200190565b6000602080835283518082850152825b818110156131965785810183015185820160400152820161317a565b818111156131a75783604083870101525b50601f01601f1916929092016040019392505050565b60208082526023908201527f45524332303a207472616e7366657220746f20746865207a65726f206164647260408201526265737360e81b606082015260800190565b6020808252600890820152670a8dede40daeac6d60c31b604082015260600190565b60208082526035908201527f466f6d6f4554483a2043616e6e6f742075706461746520676173466f7250726f60408201527463657373696e6720746f2073616d652076616c756560581b606082015260800190565b60208082526026908201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160408201526564647265737360d01b606082015260800190565b60208082526022908201527f45524332303a20617070726f766520746f20746865207a65726f206164647265604082015261737360f01b606082015260800190565b6020808252602c908201527f466f6d6f4554483a2054686520726f7574657220616c7265616479206861732060408201526b74686174206164647265737360a01b606082015260800190565b60208082526026908201527f45524332303a207472616e7366657220616d6f756e7420657863656564732062604082015265616c616e636560d01b606082015260800190565b60208082526036908201527f466f6d6f4554483a20546865206469766964656e6420747261636b657220616c6040820152757265616479206861732074686174206164647265737360501b606082015260800190565b6020808252601a908201527f5472616e736665722066726f6d20626f74206465746563746564000000000000604082015260600190565b60208082526028908201527f45524332303a207472616e7366657220616d6f756e74206578636565647320616040820152676c6c6f77616e636560c01b606082015260800190565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b60208082526031908201527f5472616e7366657220616d6f756e74206578636565647320746865206d6178546040820152703930b739b0b1ba34b7b720b6b7bab73a1760791b606082015260800190565b60208082526033908201527f466f6d6f4554483a204163636f756e7420697320616c7265616479207468652060408201527276616c7565206f6620276578636c756465642760681b606082015260800190565b60208082526025908201527f45524332303a207472616e736665722066726f6d20746865207a65726f206164604082015264647265737360d81b606082015260800190565b60208082526024908201527f45524332303a20617070726f76652066726f6d20746865207a65726f206164646040820152637265737360e01b606082015260800190565b6020808252603d908201527f466f6d6f4554483a20676173466f7250726f63657373696e67206d757374206260408201527f65206265747765656e203230302c30303020616e64203530302c303030000000606082015260800190565b6020808252601690820152754d61726b6574696e67205a65726f206164647265737360501b604082015260600190565b6020808252604d908201527f466f6d6f4554483a20546865206e6577206469766964656e6420747261636b6560408201527f72206d757374206265206f776e65642062792074686520466f6d6f455448207460608201526c1bdad95b8818dbdb9d1c9858dd609a1b608082015260a00190565b60208082526025908201527f45524332303a2064656372656173656420616c6c6f77616e63652062656c6f77604082015264207a65726f60d81b606082015260800190565b90815260200190565b600060a082018783526020878185015260a0604085015281875180845260c0860191508289019350845b818110156137655784516001600160a01b031683529383019391830191600101613740565b50506001600160a01b03969096166060850152505050608001529392505050565b918252602082015260400190565b9182526020820152606060408201819052600990820152684d41524b4554494e4760b81b608082015260a00190565b9182526020820152606060408201819052600990820152684449564944454e445360b81b608082015260a00190565b93845260208401929092526040830152606082015260800190565b60008219821115613820576138206138d1565b500190565b60008261384057634e487b7160e01b81526012600452602481fd5b500490565b600081600019048311821515161561385f5761385f6138d1565b500290565b600082821015613876576138766138d1565b500390565b60028104600182168061388f57607f821691505b602082108114156138b057634e487b7160e01b600052602260045260246000fd5b50919050565b60006000198214156138ca576138ca6138d1565b5060010190565b634e487b7160e01b600052601160045260246000fd5b6001600160a01b0381168114610f3757600080fd5b8015158114610f3757600080fdfea2646970667358221220442cf67d2522643e67af13d5c6995dff2c5a9b7a001ce1b0b5cb80dc2033d0af64736f6c63430008000033
Deployed Bytecode Sourcemap
49157:15407:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;6024:100;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;8192:169;;;;;;;;;;-1:-1:-1;8192:169:0;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;57788:180::-;;;;;;;;;;-1:-1:-1;57788:180:0;;;;;:::i;:::-;;:::i;:::-;;49234:41;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;7145:108::-;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;8843:480::-;;;;;;;;;;-1:-1:-1;8843:480:0;;;;;:::i;:::-;;:::i;56386:323::-;;;;;;;;;;-1:-1:-1;56386:323:0;;;;;:::i;:::-;;:::i;49349:45::-;;;;;;;;;;;;;:::i;58092:141::-;;;;;;;;;;;;;:::i;6986:94::-;;;;;;;;;;;;;:::i;54989:130::-;;;;;;;;;;-1:-1:-1;54989:130:0;;;;;:::i;:::-;;:::i;9732:215::-;;;;;;;;;;-1:-1:-1;9732:215:0;;;;;:::i;:::-;;:::i;49844:34::-;;;;;;;;;;;;;:::i;58374:137::-;;;;;;;;;;-1:-1:-1;58374:137:0;;;;;:::i;:::-;;:::i;60091:145::-;;;;;;;;;;-1:-1:-1;60091:145:0;;;;;:::i;:::-;;:::i;49282:28::-;;;;;;;;;;;;;:::i;59694:103::-;;;;;;;;;;;;;:::i;58241:125::-;;;;;;;;;;-1:-1:-1;58241:125:0;;;;;:::i;:::-;;:::i;59942:141::-;;;;;;;;;;;;;:::i;52714:685::-;;;;;;;;;;-1:-1:-1;52714:685:0;;;;;:::i;:::-;;:::i;58678:139::-;;;;;;;;;;-1:-1:-1;58678:139:0;;;;;:::i;:::-;;:::i;49885:33::-;;;;;;;;;;;;;:::i;59415:271::-;;;;;;;;;;-1:-1:-1;59415:271:0;;;;;:::i;:::-;;:::i;7316:127::-;;;;;;;;;;-1:-1:-1;7316:127:0;;;;;:::i;:::-;;:::i;1593:148::-;;;;;;;;;;;;;:::i;49486:70::-;;;;;;;;;;;;;:::i;57238:410::-;;;;;;;;;;-1:-1:-1;57238:410:0;;;;;:::i;:::-;;:::i;55285:786::-;;;;;;;;;;-1:-1:-1;55285:786:0;;;;;:::i;:::-;;:::i;957:79::-;;;;;;;;;;;;;:::i;6243:104::-;;;;;;;;;;;;;:::i;50043:40::-;;;;;;;;;;;;;:::i;54340:369::-;;;;;;;;;;-1:-1:-1;54340:369:0;;;;;:::i;:::-;;:::i;57976:108::-;;;;;;;;;;;;;:::i;10450:401::-;;;;;;;;;;-1:-1:-1;10450:401:0;;;;;:::i;:::-;;:::i;58519:151::-;;;;;;;;;;-1:-1:-1;58519:151:0;;;;;:::i;:::-;;:::i;7656:175::-;;;;;;;;;;-1:-1:-1;7656:175:0;;;;;:::i;:::-;;:::i;58825:282::-;;;;;;;;;;-1:-1:-1;58825:282:0;;;;;:::i;:::-;;:::i;:::-;;;;;;;;;;;;;;:::i;50092:34::-;;;;;;;;;;;;;:::i;53645:177::-;;;;;;;;;;-1:-1:-1;53645:177:0;;;;;:::i;:::-;;:::i;54005:327::-;;;;;;;;;;-1:-1:-1;54005:327:0;;;;;:::i;:::-;;:::i;64419:142::-;;;;;;;;;;-1:-1:-1;64419:142:0;;;;;:::i;:::-;;:::i;56079:299::-;;;;;;;;;;-1:-1:-1;56079:299:0;;;;;:::i;:::-;;:::i;56926:304::-;;;;;;;;;;-1:-1:-1;56926:304:0;;;;;:::i;:::-;;:::i;55127:150::-;;;;;;;;;;-1:-1:-1;55127:150:0;;;;;:::i;:::-;;:::i;49565:35::-;;;;;;;;;;;;;:::i;53450:187::-;;;;;;;;;;-1:-1:-1;53450:187:0;;;;;:::i;:::-;;:::i;56823:95::-;;;;;;;;;;-1:-1:-1;56823:95:0;;;;;:::i;:::-;;:::i;56717:98::-;;;;;;;;;;-1:-1:-1;56717:98:0;;;;;:::i;:::-;;:::i;7894:151::-;;;;;;;;;;-1:-1:-1;7894:151:0;;;;;:::i;:::-;;:::i;54717:264::-;;;;;;;;;;-1:-1:-1;54717:264:0;;;;;:::i;:::-;;:::i;49607:62::-;;;;;;;;;;;;;:::i;59805:129::-;;;;;;;;;;;;;:::i;57656:124::-;;;;;;;;;;-1:-1:-1;57656:124:0;;;;;:::i;:::-;;:::i;53830:167::-;;;;;;;;;;-1:-1:-1;53830:167:0;;;;;:::i;:::-;;:::i;59115:292::-;;;;;;;;;;-1:-1:-1;59115:292:0;;;;;:::i;:::-;;:::i;1896:244::-;;;;;;;;;;-1:-1:-1;1896:244:0;;;;;:::i;:::-;;:::i;6024:100::-;6078:13;6111:5;6104:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;6024:100;:::o;8192:169::-;8275:4;8292:39;8301:12;:10;:12::i;:::-;8315:7;8324:6;8292:8;:39::i;:::-;-1:-1:-1;8349:4:0;8192:169;;;;:::o;57788:180::-;1179:12;:10;:12::i;:::-;1169:6;;-1:-1:-1;;;;;1169:6:0;;;:22;;;1161:67;;;;-1:-1:-1;;;1161:67:0;;;;;;;:::i;:::-;;;;;;;;;57890:15:::1;::::0;:70:::1;::::0;-1:-1:-1;;;57890:70:0;;-1:-1:-1;;;;;57890:15:0;;::::1;::::0;:53:::1;::::0;:70:::1;::::0;57944:15;;57890:70:::1;;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;57788:180:::0;:::o;49234:41::-;;;-1:-1:-1;;;;;49234:41:0;;:::o;7145:108::-;7233:12;;7145:108;:::o;8843:480::-;8983:4;9000:36;9010:6;9018:9;9029:6;9000:9;:36::i;:::-;-1:-1:-1;;;;;9076:19:0;;9049:24;9076:19;;;:11;:19;;;;;9049:24;9096:12;:10;:12::i;:::-;-1:-1:-1;;;;;9076:33:0;-1:-1:-1;;;;;9076:33:0;;;;;;;;;;;;;9049:60;;9148:6;9128:16;:26;;9120:79;;;;-1:-1:-1;;;9120:79:0;;;;;;;:::i;:::-;9227:57;9236:6;9244:12;:10;:12::i;:::-;9277:6;9258:16;:25;9227:8;:57::i;:::-;-1:-1:-1;9311:4:0;;8843:480;-1:-1:-1;;;;8843:480:0:o;56386:323::-;1179:12;:10;:12::i;:::-;1169:6;;-1:-1:-1;;;;;1169:6:0;;;:22;;;1161:67;;;;-1:-1:-1;;;1161:67:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;56485:34:0;::::1;;::::0;;;:25:::1;:34;::::0;;;;;::::1;;:46;;::::0;::::1;;;;56477:110;;;;-1:-1:-1::0;;;56477:110:0::1;;;;;;;:::i;:::-;-1:-1:-1::0;;;;;56598:34:0;::::1;;::::0;;;:25:::1;:34;::::0;;;;;;:45;;-1:-1:-1;;56598:45:0::1;::::0;::::1;;;::::0;;56661:40;::::1;::::0;::::1;::::0;56598:45;;56661:40:::1;:::i;:::-;;;;;;;;56386:323:::0;;:::o;49349:45::-;;;-1:-1:-1;;;;;49349:45:0;;:::o;58092:141::-;58182:15;;:43;;;-1:-1:-1;;;58182:43:0;;;;58155:7;;-1:-1:-1;;;;;58182:15:0;;:41;;:43;;;;;;;;;;;;;;:15;:43;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;58175:50;;58092:141;:::o;6986:94::-;7071:1;6986:94;:::o;54989:130::-;1179:12;:10;:12::i;:::-;1169:6;;-1:-1:-1;;;;;1169:6:0;;;:22;;;1161:67;;;;-1:-1:-1;;;1161:67:0;;;;;;;:::i;:::-;55066:15:::1;::::0;:45:::1;::::0;-1:-1:-1;;;55066:45:0;;-1:-1:-1;;;;;55066:15:0;;::::1;::::0;:36:::1;::::0;:45:::1;::::0;55103:7;;55066:45:::1;;;:::i;9732:215::-:0;9820:4;9837:80;9846:12;:10;:12::i;:::-;9860:7;9906:10;9869:11;:25;9881:12;:10;:12::i;:::-;-1:-1:-1;;;;;9869:25:0;;;;;;;;;;;;;;;;;-1:-1:-1;9869:25:0;;;:34;;;;;;;;;;:47;;;;:::i;:::-;9837:8;:80::i;49844:34::-;;;;:::o;58374:137::-;-1:-1:-1;;;;;58469:34:0;58445:4;58469:34;;;:25;:34;;;;;;;;;58374:137::o;60091:145::-;1179:12;:10;:12::i;:::-;1169:6;;-1:-1:-1;;;;;1169:6:0;;;:22;;;1161:67;;;;-1:-1:-1;;;1161:67:0;;;;;;;:::i;:::-;60160:15:::1;:24:::0;;-1:-1:-1;;60160:24:0::1;::::0;::::1;;;::::0;;60200:28:::1;::::0;::::1;::::0;::::1;::::0;60160:24;;60200:28:::1;:::i;:::-;;;;;;;;60091:145:::0;:::o;49282:28::-;;;-1:-1:-1;;;;;49282:28:0;;:::o;59694:103::-;59731:15;;:58;;-1:-1:-1;;;59731:58:0;;-1:-1:-1;;;;;59731:15:0;;;;:30;;:58;;59770:10;;59731:15;;:58;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;59694:103::o;58241:125::-;-1:-1:-1;;;;;58330:28:0;58306:4;58330:28;;;:19;:28;;;;;;;;;58241:125::o;59942:141::-;60034:15;;:41;;;-1:-1:-1;;;60034:41:0;;;;60007:7;;-1:-1:-1;;;;;60034:15:0;;:39;;:41;;;;;;;;;;;;;;:15;:41;;;;;;;;;;52714:685;1179:12;:10;:12::i;:::-;1169:6;;-1:-1:-1;;;;;1169:6:0;;;:22;;;1161:67;;;;-1:-1:-1;;;1161:67:0;;;;;;;:::i;:::-;52823:15:::1;::::0;-1:-1:-1;;;;;52801:38:0;;::::1;52823:15:::0;::::1;52801:38;;52793:95;;;;-1:-1:-1::0;;;52793:95:0::1;;;;;;;:::i;:::-;52946:15;::::0;52904:59:::1;::::0;-1:-1:-1;;;;;52946:15:0;;::::1;::::0;52904:59;::::1;::::0;::::1;::::0;52946:15:::1;::::0;52904:59:::1;52974:15;:48:::0;;-1:-1:-1;;;;;;52974:48:0::1;-1:-1:-1::0;;;;;52974:48:0;;::::1;::::0;;;::::1;::::0;;;;53076:25:::1;::::0;;-1:-1:-1;;;53076:25:0;;;;-1:-1:-1;;53076:15:0;;::::1;::::0;:23:::1;::::0;:25:::1;::::0;;::::1;::::0;::::1;::::0;;;;;;;;;:15;:25;::::1;;::::0;::::1;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1::0;;;;;53058:65:0::1;;53132:4;53139:15;;;;;;;;;-1:-1:-1::0;;;;;53139:15:0::1;-1:-1:-1::0;;;;;53139:20:0::1;;:22;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;53058:104;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;53173:13;:30:::0;;-1:-1:-1;;;;;;53173:30:0::1;-1:-1:-1::0;;;;;53173:30:0;;::::1;::::0;;;::::1;::::0;;;53216:15:::1;::::0;53261::::1;::::0;53216:62:::1;::::0;-1:-1:-1;;;53216:62:0;;53173:30;;-1:-1:-1;53216:15:0;;::::1;::::0;:36:::1;::::0;:62:::1;::::0;53261:15:::1;::::0;53216:62:::1;;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;-1:-1:-1::0;;53289:15:0::1;::::0;53326:13:::1;::::0;53289:51:::1;::::0;-1:-1:-1;;;53289:51:0;;-1:-1:-1;;;;;53289:15:0;;::::1;::::0;-1:-1:-1;53289:36:0::1;::::0;-1:-1:-1;53289:51:0::1;::::0;53326:13;;::::1;::::0;53289:51:::1;;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;53353:38;53374:10;53386:4;53353:20;:38::i;:::-;1239:1;52714:685:::0;:::o;58678:139::-;58775:15;;:34;;-1:-1:-1;;;58775:34:0;;58748:7;;-1:-1:-1;;;;;58775:15:0;;:25;;:34;;58801:7;;58775:34;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;58768:41;58678:139;-1:-1:-1;;58678:139:0:o;49885:33::-;;;;:::o;59415:271::-;59547:15;;:28;;-1:-1:-1;;;;;;59547:28:0;;59481:18;;;;;;-1:-1:-1;;;;;59547:15:0;;:23;;:28;;59571:3;;59547:28;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;59480:95;;;;;;59668:9;-1:-1:-1;;;;;59591:87:0;59656:5;59591:87;;;59616:10;59628:6;59636:18;59663:3;59591:87;;;;;;;;;:::i;:::-;;;;;;;;59415:271;;;;:::o;7316:127::-;-1:-1:-1;;;;;7417:18:0;7390:7;7417:18;;;;;;;;;;;;7316:127::o;1593:148::-;1179:12;:10;:12::i;:::-;1169:6;;-1:-1:-1;;;;;1169:6:0;;;:22;;;1161:67;;;;-1:-1:-1;;;1161:67:0;;;;;;;:::i;:::-;1684:6:::1;::::0;1663:40:::1;::::0;1700:1:::1;::::0;-1:-1:-1;;;;;1684:6:0::1;::::0;1663:40:::1;::::0;1700:1;;1663:40:::1;1714:6;:19:::0;;-1:-1:-1;;;;;;1714:19:0::1;::::0;;1593:148::o;49486:70::-;;;-1:-1:-1;;;;;49486:70:0;;:::o;57238:410::-;1179:12;:10;:12::i;:::-;1169:6;;-1:-1:-1;;;;;1169:6:0;;;:22;;;1161:67;;;;-1:-1:-1;;;1161:67:0;;;;;;;:::i;:::-;57336:6:::1;57324:8;:18;;:40;;;;;57358:6;57346:8;:18;;57324:40;57316:114;;;;-1:-1:-1::0;;;57316:114:0::1;;;;;;;:::i;:::-;57461:16;;57449:8;:28;;57441:94;;;;-1:-1:-1::0;;;57441:94:0::1;;;;;;;:::i;:::-;57585:16;::::0;57551:51:::1;::::0;57575:8;;57551:51:::1;::::0;;;::::1;57613:16;:27:::0;57238:410::o;55285:786::-;1179:12;:10;:12::i;:::-;1169:6;;-1:-1:-1;;;;;1169:6:0;;;:22;;;1161:67;;;;-1:-1:-1;;;1161:67:0;;;;;;;:::i;:::-;55394:15:::1;::::0;-1:-1:-1;;;;;55372:38:0;;::::1;55394:15:::0;::::1;55372:38;;55364:105;;;;-1:-1:-1::0;;;55364:105:0::1;;;;;;;:::i;:::-;55482:41;55557:10;55482:87;;55628:4;-1:-1:-1::0;;;;;55590:43:0::1;:18;-1:-1:-1::0;;;;;55590:24:0::1;;:26;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1::0;;;;;55590:43:0::1;;55582:133;;;;-1:-1:-1::0;;;55582:133:0::1;;;;;;;:::i;:::-;55728:68;::::0;-1:-1:-1;;;55728:68:0;;-1:-1:-1;;;;;55728:39:0;::::1;::::0;::::1;::::0;:68:::1;::::0;:18;;:68:::1;;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;-1:-1:-1::0;;55807:54:0::1;::::0;-1:-1:-1;;;55807:54:0;;-1:-1:-1;;;;;55807:39:0;::::1;::::0;-1:-1:-1;55807:39:0::1;::::0;-1:-1:-1;55807:54:0::1;::::0;55855:4:::1;::::0;55807:54:::1;;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;-1:-1:-1::0;;55920:15:0::1;::::0;55872:65:::1;::::0;-1:-1:-1;;;55872:65:0;;-1:-1:-1;;;;;55872:39:0;;::::1;::::0;-1:-1:-1;55872:39:0::1;::::0;-1:-1:-1;55872:65:0::1;::::0;55920:15:::1;::::0;55872:65:::1;;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;-1:-1:-1::0;;55997:15:0::1;::::0;55955:59:::1;::::0;-1:-1:-1;;;;;55997:15:0;;::::1;::::0;-1:-1:-1;55955:59:0;;::::1;::::0;-1:-1:-1;55955:59:0::1;::::0;55997:15:::1;::::0;55955:59:::1;56027:15;:36:::0;;-1:-1:-1;;;;;;56027:36:0::1;-1:-1:-1::0;;;;;56027:36:0;;;::::1;::::0;;;::::1;::::0;;-1:-1:-1;55285:786:0:o;957:79::-;1022:6;;-1:-1:-1;;;;;1022:6:0;957:79;:::o;6243:104::-;6299:13;6332:7;6325:14;;;;;:::i;50043:40::-;;;;:::o;54340:369::-;1179:12;:10;:12::i;:::-;1169:6;;-1:-1:-1;;;;;1169:6:0;;;:22;;;1161:67;;;;-1:-1:-1;;;1161:67:0;;;;;;;:::i;:::-;54445:16:::1;:36:::0;;;54492:15:::1;:34:::0;;;-1:-1:-1;54557:34:0::1;54510:16:::0;54464:17;54557:34:::1;:::i;:::-;54537:54;;54622:2;54610:9;:14;54602:35;;;;-1:-1:-1::0;;;54602:35:0::1;;;;;;;:::i;:::-;54653:48;54665:17;54684:16;54653:48;;;;;;;:::i;:::-;;;;;;;;1239:1;54340:369:::0;;:::o;57976:108::-;58049:15;;:27;;;-1:-1:-1;;;58049:27:0;;;;58022:7;;-1:-1:-1;;;;;58049:15:0;;:25;;:27;;;;;;;;;;;;;;:15;:27;;;;;;;;;;10450:401;10543:4;10560:24;10587:11;:25;10599:12;:10;:12::i;:::-;-1:-1:-1;;;;;10587:25:0;;;;;;;;;;;;;;;;;-1:-1:-1;10587:25:0;;;:34;;;;;;;;;;;-1:-1:-1;10640:35:0;;;;10632:85;;;;-1:-1:-1;;;10632:85:0;;;;;;;:::i;:::-;10745:67;10754:12;:10;:12::i;:::-;10768:7;10796:15;10777:16;:34;10745:8;:67::i;:::-;-1:-1:-1;10839:4:0;;10450:401;-1:-1:-1;;;10450:401:0:o;58519:151::-;58615:15;;:47;;-1:-1:-1;;;58615:47:0;;58588:7;;-1:-1:-1;;;;;58615:15:0;;:38;;:47;;58654:7;;58615:47;;;:::i;7656:175::-;7742:4;7759:42;7769:12;:10;:12::i;:::-;7783:9;7794:6;7759:9;:42::i;58825:282::-;59064:15;;:35;;-1:-1:-1;;;59064:35:0;;58913:7;;;;;;;;;;;;;;;;-1:-1:-1;;;;;59064:15:0;;;;:26;;:35;;59091:7;;59064:35;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;59057:42;;;;;;;;;;;;;;;;58825:282;;;;;;;;;:::o;50092:34::-;;;;;;:::o;53645:177::-;1179:12;:10;:12::i;:::-;1169:6;;-1:-1:-1;;;;;1169:6:0;;;:22;;;1161:67;;;;-1:-1:-1;;;1161:67:0;;;;;;;:::i;:::-;53727:49:::1;53749:18;;53769:6;53727:49;;;;;;;:::i;:::-;;;;;;;;53787:18;:27:::0;53645:177::o;54005:327::-;1179:12;:10;:12::i;:::-;1169:6;;-1:-1:-1;;;;;1169:6:0;;;:22;;;1161:67;;;;-1:-1:-1;;;1161:67:0;;;;;;;:::i;:::-;54101:12:::1;:28:::0;;;54140:11:::1;:26:::0;;;-1:-1:-1;54197:26:0::1;54154:12:::0;54116:13;54197:26:::1;:::i;:::-;54177:46;;54254:2;54242:9;:14;54234:35;;;;-1:-1:-1::0;;;54234:35:0::1;;;;;;;:::i;:::-;54285:39;54296:13;54311:12;54285:39;;;;;;;:::i;64419:142::-:0;1179:12;:10;:12::i;:::-;1169:6;;-1:-1:-1;;;;;1169:6:0;;;:22;;;1161:67;;;;-1:-1:-1;;;1161:67:0;;;;;;;:::i;:::-;64509:44:::1;::::0;-1:-1:-1;;;64509:44:0;;-1:-1:-1;;;;;64509:23:0;::::1;::::0;::::1;::::0;:44:::1;::::0;64533:10:::1;::::0;64545:7;;64509:44:::1;;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;64419:142:::0;;:::o;56079:299::-;1179:12;:10;:12::i;:::-;1169:6;;-1:-1:-1;;;;;1169:6:0;;;:22;;;1161:67;;;;-1:-1:-1;;;1161:67:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;56172:28:0;::::1;;::::0;;;:19:::1;:28;::::0;;;;;::::1;;:40;;::::0;::::1;;;;56164:104;;;;-1:-1:-1::0;;;56164:104:0::1;;;;;;;:::i;:::-;-1:-1:-1::0;;;;;56279:28:0;::::1;;::::0;;;:19:::1;:28;::::0;;;;;;:39;;-1:-1:-1;;56279:39:0::1;::::0;::::1;;;::::0;;56336:34;::::1;::::0;::::1;::::0;56279:39;;56336:34:::1;:::i;56926:304::-:0;1179:12;:10;:12::i;:::-;1169:6;;-1:-1:-1;;;;;1169:6:0;;;:22;;;1161:67;;;;-1:-1:-1;;;1161:67:0;;;;;;;:::i;:::-;57043:9:::1;57039:115;57058:19:::0;;::::1;57039:115;;;57134:8;57099:19;:32;57119:8;;57128:1;57119:11;;;;;-1:-1:-1::0;;;57119:11:0::1;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1::0;;;;;57099:32:0::1;::::0;;::::1;::::0;::::1;::::0;;;;;;-1:-1:-1;57099:32:0;:43;;-1:-1:-1;;57099:43:0::1;::::0;::::1;;::::0;;;::::1;::::0;;57079:3;::::1;::::0;::::1;:::i;:::-;;;;57039:115;;;;57171:51;57203:8;;57213;57171:51;;;;;;;;:::i;55127:150::-:0;55223:15;;:46;;-1:-1:-1;;;55223:46:0;;55200:4;;-1:-1:-1;;;;;55223:15:0;;:37;;:46;;55261:7;;55223:46;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;49565:35::-;;;;:::o;53450:187::-;1179:12;:10;:12::i;:::-;1169:6;;-1:-1:-1;;;;;1169:6:0;;;:22;;;1161:67;;;;-1:-1:-1;;;1161:67:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;53538:28:0;;::::1;;::::0;;;:19:::1;:28;::::0;;;;;;;:37;;;::::1;;-1:-1:-1::0;;53538:37:0;;::::1;::::0;::::1;::::0;;;53586:25:::1;:34:::0;;;;;;:43;;;;::::1;;::::0;;53450:187::o;56823:95::-;1179:12;:10;:12::i;:::-;1169:6;;-1:-1:-1;;;;;1169:6:0;;;:22;;;1161:67;;;;-1:-1:-1;;;1161:67:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;56890:13:0::1;;::::0;;;:4:::1;:13;::::0;;;;:20;;-1:-1:-1;;56890:20:0::1;56906:4;56890:20;::::0;;56823:95::o;56717:98::-;1179:12;:10;:12::i;:::-;1169:6;;-1:-1:-1;;;;;1169:6:0;;;:22;;;1161:67;;;;-1:-1:-1;;;1161:67:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;56786:13:0::1;56802:5;56786:13:::0;;;:4:::1;:13;::::0;;;;:21;;-1:-1:-1;;56786:21:0::1;::::0;;56717:98::o;7894:151::-;-1:-1:-1;;;;;8010:18:0;;;7983:7;8010:18;;;:11;:18;;;;;;;;:27;;;;;;;;;;;;;7894:151::o;54717:264::-;1179:12;:10;:12::i;:::-;1169:6;;-1:-1:-1;;;;;1169:6:0;;;:22;;;1161:67;;;;-1:-1:-1;;;1161:67:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;54802:32:0;::::1;54794:67;;;;-1:-1:-1::0;;;54794:67:0::1;;;;;;;:::i;:::-;54890:15;::::0;54877:49:::1;::::0;::::1;::::0;::::1;::::0;-1:-1:-1;;;;;54890:15:0;;::::1;::::0;54907:18;;54877:49:::1;:::i;:::-;;;;;;;;54937:15;:36:::0;;-1:-1:-1;;;;;;54937:36:0::1;-1:-1:-1::0;;;;;54937:36:0;;;::::1;::::0;;;::::1;::::0;;54717:264::o;49607:62::-;;;;:::o;59805:129::-;59887:15;;:39;;;-1:-1:-1;;;59887:39:0;;;;59860:7;;-1:-1:-1;;;;;59887:15:0;;:37;;:39;;;;;;;;;;;;;;:15;:39;;;;;;;;;;57656:124;1179:12;:10;:12::i;:::-;1169:6;;-1:-1:-1;;;;;1169:6:0;;;:22;;;1161:67;;;;-1:-1:-1;;;1161:67:0;;;;;;;:::i;:::-;57730:15:::1;::::0;:42:::1;::::0;-1:-1:-1;;;57730:42:0;;-1:-1:-1;;;;;57730:15:0;;::::1;::::0;:31:::1;::::0;:42:::1;::::0;57762:9;;57730:42:::1;;;:::i;53830:167::-:0;1179:12;:10;:12::i;:::-;1169:6;;-1:-1:-1;;;;;1169:6:0;;;:22;;;1161:67;;;;-1:-1:-1;;;1161:67:0;;;;;;;:::i;:::-;53905:44:::1;53920:20;;53942:6;53905:44;;;;;;;:::i;:::-;;;;;;;;53960:20;:29:::0;53830:167::o;59115:292::-;59359:15;;:40;;-1:-1:-1;;;59359:40:0;;59208:7;;;;;;;;;;;;;;;;-1:-1:-1;;;;;59359:15:0;;;;:33;;:40;;59393:5;;59359:40;;;:::i;1896:244::-;1179:12;:10;:12::i;:::-;1169:6;;-1:-1:-1;;;;;1169:6:0;;;:22;;;1161:67;;;;-1:-1:-1;;;1161:67:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;1985:22:0;::::1;1977:73;;;;-1:-1:-1::0;;;1977:73:0::1;;;;;;;:::i;:::-;2087:6;::::0;2066:38:::1;::::0;-1:-1:-1;;;;;2066:38:0;;::::1;::::0;2087:6:::1;::::0;2066:38:::1;::::0;2087:6:::1;::::0;2066:38:::1;2115:6;:17:::0;;-1:-1:-1;;;;;;2115:17:0::1;-1:-1:-1::0;;;;;2115:17:0;;;::::1;::::0;;;::::1;::::0;;1896:244::o;20701:98::-;20759:7;20786:5;20790:1;20786;:5;:::i;:::-;20779:12;20701:98;-1:-1:-1;;;20701:98:0:o;214:::-;294:10;214:98;:::o;14098:380::-;-1:-1:-1;;;;;14234:19:0;;14226:68;;;;-1:-1:-1;;;14226:68:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;14313:21:0;;14305:68;;;;-1:-1:-1;;;14305:68:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;14386:18:0;;;;;;;:11;:18;;;;;;;;:27;;;;;;;;;;;;;;:36;;;14438:32;;;;;14416:6;;14438:32;:::i;:::-;;;;;;;;14098:380;;;:::o;60244:2570::-;-1:-1:-1;;;;;60376:18:0;;60368:68;;;;-1:-1:-1;;;60368:68:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;60455:16:0;;60447:64;;;;-1:-1:-1;;;60447:64:0;;;;;;;:::i;:::-;60527:11;60524:92;;60555:28;60571:4;60577:2;60581:1;60555:15;:28::i;:::-;60598:7;;60524:92;60633:8;;-1:-1:-1;;;60633:8:0;;;;60632:9;:54;;;;-1:-1:-1;;;;;;60655:31:0;;;;;;:25;:31;;;;;;;;60654:32;60632:54;:97;;;;-1:-1:-1;;;;;;60700:29:0;;;;;;:25;:29;;;;;;;;60699:30;60632:97;60628:301;;;60765:20;;60755:6;:30;;60747:92;;;;-1:-1:-1;;;60747:92:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;60863:10:0;;;;;;:4;:10;;;;;;;;60862:11;:24;;;;-1:-1:-1;;;;;;60878:8:0;;;;;;:4;:8;;;;;;;;60877:9;60862:24;60854:63;;;;-1:-1:-1;;;60854:63:0;;;;;;;:::i;:::-;60941:12;60985:18;;60957:24;60975:4;60957:9;:24::i;:::-;:46;;60941:62;;61033:7;:33;;;;-1:-1:-1;61058:8:0;;-1:-1:-1;;;61058:8:0;;;;61057:9;61033:33;:65;;;;-1:-1:-1;61083:15:0;;;;61033:65;:109;;;;-1:-1:-1;61129:13:0;;-1:-1:-1;;;;;61129:13:0;61115:10;:27;;61033:109;61016:266;;;61169:8;:15;;-1:-1:-1;;;;61169:15:0;-1:-1:-1;;;61169:15:0;;;61220:18;;61199:40;;:20;:40::i;:::-;61254:8;:16;;-1:-1:-1;;;;61254:16:0;;;61016:266;61310:8;;-1:-1:-1;;;;;61334:25:0;;61294:12;61334:25;;;:19;:25;;;;;;61310:8;-1:-1:-1;;;61310:8:0;;;;;61309:9;;61334:25;;:52;;-1:-1:-1;;;;;;61363:23:0;;;;;;:19;:23;;;;;;;;61334:52;61331:99;;;-1:-1:-1;61413:5:0;61331:99;61445:7;61442:736;;;61549:13;;61469:20;;;;-1:-1:-1;;;;;61543:19:0;;;61549:13;;61543:19;61539:337;;;61598:37;61631:3;61598:28;61609:16;;61598:6;:10;;:28;;;;:::i;:::-;:32;;:37::i;:::-;61583:52;;61669:36;61701:3;61669:27;61680:15;;61669:6;:10;;:27;;;;:::i;:36::-;61654:51;;61539:337;;;61761:33;61790:3;61761:24;61772:12;;61761:6;:10;;:24;;;;:::i;:33::-;61746:48;;61828:32;61856:3;61828:23;61839:11;;61828:6;:10;;:23;;;;:::i;:32::-;61813:47;;61539:337;61910:15;;:33;;61930:12;61910:19;:33::i;:::-;61892:15;:51;61975:14;;:32;;61994:12;61975:18;:32::i;:::-;61958:14;:49;62024:12;62039:30;:12;62056;62039:16;:30::i;:::-;62024:45;-1:-1:-1;62093:16:0;:6;62024:45;62093:10;:16::i;:::-;62084:25;;62124:42;62140:4;62154;62161;62124:15;:42::i;:::-;61442:736;;;;62190:33;62206:4;62212:2;62216:6;62190:15;:33::i;:::-;62240:15;;-1:-1:-1;;;;;62240:15:0;:26;62275:4;62282:15;62275:4;62282:9;:15::i;:::-;62240:58;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;62236:74;62324:15;;-1:-1:-1;;;;;62324:15:0;:26;62359:2;62364:13;62359:2;62364:9;:13::i;:::-;62324:54;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;62320:70;62406:8;;-1:-1:-1;;;62406:8:0;;;;62402:405;;62445:16;;62482:15;;:28;;-1:-1:-1;;;;;;62482:28:0;;-1:-1:-1;;;;;62482:15:0;;;;:23;;:28;;62445:16;;62482:28;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;62482:28:0;;;;;;;;-1:-1:-1;;62482:28:0;;;;;;;;;;;;:::i;:::-;;;62478:318;;62754:26;62769:10;62754:26;;;;;;:::i;:::-;;;;;;;;62478:318;;;62608:86;;62684:9;;62673:4;;62608:86;;;;62633:10;;62645:6;;62653:18;;62679:3;;62608:86;:::i;:::-;;;;;;;;62511:199;;;62478:318;62402:405;60244:2570;;;;;:::o;11341:721::-;-1:-1:-1;;;;;11481:20:0;;11473:70;;;;-1:-1:-1;;;11473:70:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;11562:23:0;;11554:71;;;;-1:-1:-1;;;11554:71:0;;;;;;;:::i;:::-;11638:47;11659:6;11667:9;11678:6;11638:20;:47::i;:::-;-1:-1:-1;;;;;11722:17:0;;11698:21;11722:17;;;;;;;;;;;11758:23;;;;11750:74;;;;-1:-1:-1;;;11750:74:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;11852:17:0;;;:9;:17;;;;;;;;;;;11872:22;;;11852:42;;11912:20;;;;;;;;:30;;11888:6;;11852:9;11912:30;;11888:6;;11912:30;:::i;:::-;;;;;;;;11977:9;-1:-1:-1;;;;;11960:35:0;11969:6;-1:-1:-1;;;;;11960:35:0;;11988:6;11960:35;;;;;;:::i;:::-;;;;;;;;12008:46;12028:6;12036:9;12047:6;12008:19;:46::i;:::-;11341:721;;;;:::o;63532:879::-;63597:24;63614:6;63597:16;:24::i;:::-;63720:15;;63701:14;;63650:21;;63632:15;;63701:35;;:18;:35::i;:::-;63682:54;;63747:20;63770:42;63803:8;63770:28;63782:15;;63770:7;:11;;:28;;;;:::i;:42::-;63747:65;-1:-1:-1;63823:20:0;63846:25;:7;63747:65;63846:11;:25::i;:::-;63823:48;;63889:57;63919:12;63933;63889:57;;;;;;;:::i;:::-;;;;;;;;63985:15;;63977:54;;63960:12;;-1:-1:-1;;;;;63985:15:0;;64014:12;;63977:54;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;63959:72;;;64047:7;64044:135;;;64076:57;64090:15;;64107:12;64076:57;;;;;;;:::i;:::-;;;;;;;;64166:1;64148:15;:19;64044:135;64212:15;;64204:54;;-1:-1:-1;;;;;64212:15:0;;;;64241:12;;64204:54;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;64191:67:0;;-1:-1:-1;;64271:133:0;;;;64303:56;64317:14;;64333:12;64303:56;;;;;;;:::i;:::-;;;;;;;;64391:1;64374:14;:18;63532:879;;;;;;:::o;20302:98::-;20360:7;20387:5;20391:1;20387;:5;:::i;19564:98::-;19622:7;19649:5;19653:1;19649;:5;:::i;19945:98::-;20003:7;20030:5;20034:1;20030;:5;:::i;62822:702::-;62893:34;62915:11;62893:34;;;;;;:::i;:::-;;;;;;;;63024:16;;;63038:1;63024:16;;;;;;;;63000:21;;63024:16;;;;;;;;;;-1:-1:-1;63024:16:0;63000:40;;63069:4;63051;63056:1;63051:7;;;;;;-1:-1:-1;;;63051:7:0;;;;;;;;;-1:-1:-1;;;;;63051:23:0;;;:7;;;;;;;;;;:23;;;;63095:15;;:22;;;-1:-1:-1;;;63095:22:0;;;;:15;;;;;:20;;:22;;;;;63051:7;;63095:22;;;;;:15;:22;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;63085:4;63090:1;63085:7;;;;;;-1:-1:-1;;;63085:7:0;;;;;;;;;-1:-1:-1;;;;;63085:32:0;;;:7;;;;;;;;;:32;63162:15;;63130:62;;63147:4;;63162:15;63180:11;63130:8;:62::i;:::-;63231:15;;:224;;-1:-1:-1;;;63231:224:0;;-1:-1:-1;;;;;63231:15:0;;;;:66;;:224;;63312:11;;63231:15;;63382:4;;63409;;63429:15;;63231:224;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;63471:45;63494:21;63471:45;;;;;;:::i;:::-;;;;;;;;62822:702;;:::o;14:259:1:-;;126:2;114:9;105:7;101:23;97:32;94:2;;;147:6;139;132:22;94:2;191:9;178:23;210:33;237:5;210:33;:::i;278:263::-;;401:2;389:9;380:7;376:23;372:32;369:2;;;422:6;414;407:22;369:2;459:9;453:16;478:33;505:5;478:33;:::i;546:402::-;;;675:2;663:9;654:7;650:23;646:32;643:2;;;696:6;688;681:22;643:2;740:9;727:23;759:33;786:5;759:33;:::i;:::-;811:5;-1:-1:-1;868:2:1;853:18;;840:32;881:35;840:32;881:35;:::i;:::-;935:7;925:17;;;633:315;;;;;:::o;953:470::-;;;;1099:2;1087:9;1078:7;1074:23;1070:32;1067:2;;;1120:6;1112;1105:22;1067:2;1164:9;1151:23;1183:33;1210:5;1183:33;:::i;:::-;1235:5;-1:-1:-1;1292:2:1;1277:18;;1264:32;1305:35;1264:32;1305:35;:::i;:::-;1057:366;;1359:7;;-1:-1:-1;;;1413:2:1;1398:18;;;;1385:32;;1057:366::o;1428:396::-;;;1554:2;1542:9;1533:7;1529:23;1525:32;1522:2;;;1575:6;1567;1560:22;1522:2;1619:9;1606:23;1638:33;1665:5;1638:33;:::i;:::-;1690:5;-1:-1:-1;1747:2:1;1732:18;;1719:32;1760;1719;1760;:::i;1829:693::-;;;;;;;;;2069:3;2057:9;2048:7;2044:23;2040:33;2037:2;;;2091:6;2083;2076:22;2037:2;2128:9;2122:16;2147:33;2174:5;2147:33;:::i;:::-;2199:5;2189:15;;;2244:2;2233:9;2229:18;2223:25;2213:35;;2288:2;2277:9;2273:18;2267:25;2257:35;;2332:2;2321:9;2317:18;2311:25;2301:35;;2376:3;2365:9;2361:19;2355:26;2345:36;;2421:3;2410:9;2406:19;2400:26;2390:36;;2466:3;2455:9;2451:19;2445:26;2435:36;;2511:3;2500:9;2496:19;2490:26;2480:36;;2027:495;;;;;;;;;;;:::o;2527:327::-;;;2656:2;2644:9;2635:7;2631:23;2627:32;2624:2;;;2677:6;2669;2662:22;2624:2;2721:9;2708:23;2740:33;2767:5;2740:33;:::i;:::-;2792:5;2844:2;2829:18;;;;2816:32;;-1:-1:-1;;;2614:240:1:o;2859:805::-;;;;3020:2;3008:9;2999:7;2995:23;2991:32;2988:2;;;3041:6;3033;3026:22;2988:2;3086:9;3073:23;3115:18;3156:2;3148:6;3145:14;3142:2;;;3177:6;3169;3162:22;3142:2;3220:6;3209:9;3205:22;3195:32;;3265:7;3258:4;3254:2;3250:13;3246:27;3236:2;;3292:6;3284;3277:22;3236:2;3337;3324:16;3363:2;3355:6;3352:14;3349:2;;;3384:6;3376;3369:22;3349:2;3447:7;3440:4;3432;3424:6;3420:17;3416:2;3412:26;3408:37;3405:50;3402:2;;;3473:6;3465;3458:22;3402:2;3509:4;3501:13;;;;-1:-1:-1;3533:6:1;-1:-1:-1;;3574:20:1;;3561:34;3604:30;3561:34;3604:30;:::i;:::-;3653:5;3643:15;;;2978:686;;;;;:::o;3669:253::-;;3778:2;3766:9;3757:7;3753:23;3749:32;3746:2;;;3799:6;3791;3784:22;3746:2;3843:9;3830:23;3862:30;3886:5;3862:30;:::i;3927:257::-;;4047:2;4035:9;4026:7;4022:23;4018:32;4015:2;;;4068:6;4060;4053:22;4015:2;4105:9;4099:16;4124:30;4148:5;4124:30;:::i;4189:190::-;;4301:2;4289:9;4280:7;4276:23;4272:32;4269:2;;;4322:6;4314;4307:22;4269:2;-1:-1:-1;4350:23:1;;4259:120;-1:-1:-1;4259:120:1:o;4384:194::-;;4507:2;4495:9;4486:7;4482:23;4478:32;4475:2;;;4528:6;4520;4513:22;4475:2;-1:-1:-1;4556:16:1;;4465:113;-1:-1:-1;4465:113:1:o;4583:258::-;;;4712:2;4700:9;4691:7;4687:23;4683:32;4680:2;;;4733:6;4725;4718:22;4680:2;-1:-1:-1;;4761:23:1;;;4831:2;4816:18;;;4803:32;;-1:-1:-1;4670:171:1:o;4846:316::-;;;;5003:2;4991:9;4982:7;4978:23;4974:32;4971:2;;;5024:6;5016;5009:22;4971:2;5058:9;5052:16;5042:26;;5108:2;5097:9;5093:18;5087:25;5077:35;;5152:2;5141:9;5137:18;5131:25;5121:35;;4961:201;;;;;:::o;5167:205::-;5367:3;5358:14::o;5377:203::-;-1:-1:-1;;;;;5541:32:1;;;;5523:51;;5511:2;5496:18;;5478:102::o;5585:300::-;-1:-1:-1;;;;;5787:32:1;;;;5769:51;;5863:14;5856:22;5851:2;5836:18;;5829:50;5757:2;5742:18;;5724:161::o;5890:290::-;-1:-1:-1;;;;;6098:32:1;;;;6080:51;;6162:2;6147:18;;6140:34;6068:2;6053:18;;6035:145::o;6185:304::-;-1:-1:-1;;;;;6415:15:1;;;6397:34;;6467:15;;6462:2;6447:18;;6440:43;6347:2;6332:18;;6314:175::o;6494:701::-;-1:-1:-1;;;;;6851:32:1;;;;6833:51;;6915:2;6900:18;;6893:34;;;;6958:2;6943:18;;6936:34;;;;7001:2;6986:18;;6979:34;;;;7044:3;7029:19;;7022:35;6871:3;7073:19;;7066:35;7132:3;7117:19;;7110:35;7176:3;7161:19;;7154:35;6820:3;6805:19;;6787:408::o;7479:799::-;7701:2;7713:21;;;7686:18;;7769:22;;;7479:799;7848:6;7822:2;7807:18;;7479:799;7885:306;7899:6;7896:1;7893:13;7885:306;;;7974:6;7961:20;7994:33;8021:5;7994:33;:::i;:::-;-1:-1:-1;;;;;8052:31:1;8040:44;;8107:4;8166:15;;;;8131:12;;;;8080:1;7914:9;7885:306;;;7889:3;8208;8200:11;;;;8263:6;8256:14;8249:22;8242:4;8231:9;8227:20;8220:52;7662:616;;;;;;:::o;8283:187::-;8448:14;;8441:22;8423:41;;8411:2;8396:18;;8378:92::o;8957:603::-;;9098:2;9127;9116:9;9109:21;9159:6;9153:13;9202:6;9197:2;9186:9;9182:18;9175:34;9227:4;9240:140;9254:6;9251:1;9248:13;9240:140;;;9349:14;;;9345:23;;9339:30;9315:17;;;9334:2;9311:26;9304:66;9269:10;;9240:140;;;9398:6;9395:1;9392:13;9389:2;;;9468:4;9463:2;9454:6;9443:9;9439:22;9435:31;9428:45;9389:2;-1:-1:-1;9544:2:1;9523:15;-1:-1:-1;;9519:29:1;9504:45;;;;9551:2;9500:54;;9078:482;-1:-1:-1;;;9078:482:1:o;9565:399::-;9767:2;9749:21;;;9806:2;9786:18;;;9779:30;9845:34;9840:2;9825:18;;9818:62;-1:-1:-1;;;9911:2:1;9896:18;;9889:33;9954:3;9939:19;;9739:225::o;9969:331::-;10171:2;10153:21;;;10210:1;10190:18;;;10183:29;-1:-1:-1;;;10243:2:1;10228:18;;10221:38;10291:2;10276:18;;10143:157::o;10305:417::-;10507:2;10489:21;;;10546:2;10526:18;;;10519:30;10585:34;10580:2;10565:18;;10558:62;-1:-1:-1;;;10651:2:1;10636:18;;10629:51;10712:3;10697:19;;10479:243::o;10727:402::-;10929:2;10911:21;;;10968:2;10948:18;;;10941:30;11007:34;11002:2;10987:18;;10980:62;-1:-1:-1;;;11073:2:1;11058:18;;11051:36;11119:3;11104:19;;10901:228::o;11134:398::-;11336:2;11318:21;;;11375:2;11355:18;;;11348:30;11414:34;11409:2;11394:18;;11387:62;-1:-1:-1;;;11480:2:1;11465:18;;11458:32;11522:3;11507:19;;11308:224::o;11537:408::-;11739:2;11721:21;;;11778:2;11758:18;;;11751:30;11817:34;11812:2;11797:18;;11790:62;-1:-1:-1;;;11883:2:1;11868:18;;11861:42;11935:3;11920:19;;11711:234::o;11950:402::-;12152:2;12134:21;;;12191:2;12171:18;;;12164:30;12230:34;12225:2;12210:18;;12203:62;-1:-1:-1;;;12296:2:1;12281:18;;12274:36;12342:3;12327:19;;12124:228::o;12357:418::-;12559:2;12541:21;;;12598:2;12578:18;;;12571:30;12637:34;12632:2;12617:18;;12610:62;-1:-1:-1;;;12703:2:1;12688:18;;12681:52;12765:3;12750:19;;12531:244::o;12780:350::-;12982:2;12964:21;;;13021:2;13001:18;;;12994:30;13060:28;13055:2;13040:18;;13033:56;13121:2;13106:18;;12954:176::o;13135:404::-;13337:2;13319:21;;;13376:2;13356:18;;;13349:30;13415:34;13410:2;13395:18;;13388:62;-1:-1:-1;;;13481:2:1;13466:18;;13459:38;13529:3;13514:19;;13309:230::o;13544:356::-;13746:2;13728:21;;;13765:18;;;13758:30;13824:34;13819:2;13804:18;;13797:62;13891:2;13876:18;;13718:182::o;13905:413::-;14107:2;14089:21;;;14146:2;14126:18;;;14119:30;14185:34;14180:2;14165:18;;14158:62;-1:-1:-1;;;14251:2:1;14236:18;;14229:47;14308:3;14293:19;;14079:239::o;14323:415::-;14525:2;14507:21;;;14564:2;14544:18;;;14537:30;14603:34;14598:2;14583:18;;14576:62;-1:-1:-1;;;14669:2:1;14654:18;;14647:49;14728:3;14713:19;;14497:241::o;14743:401::-;14945:2;14927:21;;;14984:2;14964:18;;;14957:30;15023:34;15018:2;15003:18;;14996:62;-1:-1:-1;;;15089:2:1;15074:18;;15067:35;15134:3;15119:19;;14917:227::o;15149:400::-;15351:2;15333:21;;;15390:2;15370:18;;;15363:30;15429:34;15424:2;15409:18;;15402:62;-1:-1:-1;;;15495:2:1;15480:18;;15473:34;15539:3;15524:19;;15323:226::o;15554:425::-;15756:2;15738:21;;;15795:2;15775:18;;;15768:30;15834:34;15829:2;15814:18;;15807:62;15905:31;15900:2;15885:18;;15878:59;15969:3;15954:19;;15728:251::o;15984:346::-;16186:2;16168:21;;;16225:2;16205:18;;;16198:30;-1:-1:-1;;;16259:2:1;16244:18;;16237:52;16321:2;16306:18;;16158:172::o;16335:481::-;16537:2;16519:21;;;16576:2;16556:18;;;16549:30;16615:34;16610:2;16595:18;;16588:62;16686:34;16681:2;16666:18;;16659:62;-1:-1:-1;;;16752:3:1;16737:19;;16730:44;16806:3;16791:19;;16509:307::o;16821:401::-;17023:2;17005:21;;;17062:2;17042:18;;;17035:30;17101:34;17096:2;17081:18;;17074:62;-1:-1:-1;;;17167:2:1;17152:18;;17145:35;17212:3;17197:19;;16995:227::o;17227:177::-;17373:25;;;17361:2;17346:18;;17328:76::o;17409:983::-;;17719:3;17708:9;17704:19;17750:6;17739:9;17732:25;17776:2;17814:6;17809:2;17798:9;17794:18;17787:34;17857:3;17852:2;17841:9;17837:18;17830:31;17881:6;17916;17910:13;17947:6;17939;17932:22;17985:3;17974:9;17970:19;17963:26;;18024:2;18016:6;18012:15;17998:29;;18045:4;18058:195;18072:6;18069:1;18066:13;18058:195;;;18137:13;;-1:-1:-1;;;;;18133:39:1;18121:52;;18228:15;;;;18193:12;;;;18169:1;18087:9;18058:195;;;-1:-1:-1;;;;;;;18309:32:1;;;;18304:2;18289:18;;18282:60;-1:-1:-1;;;18373:3:1;18358:19;18351:35;18270:3;17680:712;-1:-1:-1;;;17680:712:1:o;18397:248::-;18571:25;;;18627:2;18612:18;;18605:34;18559:2;18544:18;;18526:119::o;18650:476::-;18890:25;;;18946:2;18931:18;;18924:34;18994:2;18989;18974:18;;18967:30;;;19033:1;19013:18;;;19006:29;-1:-1:-1;;;19066:3:1;19051:19;;19044:40;19116:3;19101:19;;18880:246::o;19131:476::-;19371:25;;;19427:2;19412:18;;19405:34;19475:2;19470;19455:18;;19448:30;;;19514:1;19494:18;;;19487:29;-1:-1:-1;;;19547:3:1;19532:19;;19525:40;19597:3;19582:19;;19361:246::o;19612:391::-;19843:25;;;19899:2;19884:18;;19877:34;;;;19942:2;19927:18;;19920:34;19985:2;19970:18;;19963:34;19830:3;19815:19;;19797:206::o;20008:128::-;;20079:1;20075:6;20072:1;20069:13;20066:2;;;20085:18;;:::i;:::-;-1:-1:-1;20121:9:1;;20056:80::o;20141:217::-;;20207:1;20197:2;;-1:-1:-1;;;20232:31:1;;20286:4;20283:1;20276:15;20314:4;20239:1;20304:15;20197:2;-1:-1:-1;20343:9:1;;20187:171::o;20363:168::-;;20469:1;20465;20461:6;20457:14;20454:1;20451:21;20446:1;20439:9;20432:17;20428:45;20425:2;;;20476:18;;:::i;:::-;-1:-1:-1;20516:9:1;;20415:116::o;20536:125::-;;20604:1;20601;20598:8;20595:2;;;20609:18;;:::i;:::-;-1:-1:-1;20646:9:1;;20585:76::o;20666:380::-;20751:1;20741:12;;20798:1;20788:12;;;20809:2;;20863:4;20855:6;20851:17;20841:27;;20809:2;20916;20908:6;20905:14;20885:18;20882:38;20879:2;;;20962:10;20957:3;20953:20;20950:1;20943:31;20997:4;20994:1;20987:15;21025:4;21022:1;21015:15;20879:2;;20721:325;;;:::o;21051:135::-;;-1:-1:-1;;21111:17:1;;21108:2;;;21131:18;;:::i;:::-;-1:-1:-1;21178:1:1;21167:13;;21098:88::o;21191:127::-;21252:10;21247:3;21243:20;21240:1;21233:31;21283:4;21280:1;21273:15;21307:4;21304:1;21297:15;21323:133;-1:-1:-1;;;;;21400:31:1;;21390:42;;21380:2;;21446:1;21443;21436:12;21461:120;21549:5;21542:13;21535:21;21528:5;21525:32;21515:2;;21571:1;21568;21561:12
Swarm Source
ipfs://6bc4cf4ef4c205201c1bd5f2b473177180f4d292a6a660fb848980d45e370c07
Loading...
Loading
Loading...
Loading
[ Download: CSV Export ]
[ Download: CSV Export ]
A token is a representation of an on-chain or off-chain asset. The token page shows information such as price, total supply, holders, transfers and social links. Learn more about this page in our Knowledge Base.