ERC-20
Overview
Max Total Supply
1,000,000,000 𝕏-APP
Holders
31
Market
Onchain Market Cap
$0.00
Circulating Supply Market Cap
-
Other Info
Token Contract (WITH 18 Decimals)
Balance
7,003,459.909814916054933764 𝕏-APPValue
$0.00Loading...
Loading
Loading...
Loading
Loading...
Loading
# | Exchange | Pair | Price | 24H Volume | % Volume |
---|
Contract Name:
XAPP
Compiler Version
v0.8.20+commit.a1b79de6
Contract Source Code (Solidity)
/** *Submitted for verification at Etherscan.io on 2023-07-24 */ // TG: https://t.me/xapp_token // X: https://twitter.com/x_app_ETH // SPDX-License-Identifier: MIT // File: @uniswap/v2-periphery/contracts/interfaces/IUniswapV2Router01.sol pragma solidity >=0.6.2; 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); } // File: @uniswap/v2-periphery/contracts/interfaces/IUniswapV2Router02.sol pragma solidity >=0.6.2; 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; } // File: @uniswap/v2-core/contracts/interfaces/IUniswapV2Factory.sol pragma solidity >=0.5.0; 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; } // File: @openzeppelin/contracts/utils/math/SafeMath.sol // OpenZeppelin Contracts (last updated v4.9.0) (utils/math/SafeMath.sol) pragma solidity ^0.8.0; // CAUTION // This version of SafeMath should only be used with Solidity 0.8 or later, // because it relies on the compiler's built in overflow checks. /** * @dev Wrappers over Solidity's arithmetic operations. * * NOTE: `SafeMath` is generally not needed starting with Solidity 0.8, since the compiler * now has built in overflow checking. */ library SafeMath { /** * @dev Returns the addition of two unsigned integers, with an overflow flag. * * _Available since v3.4._ */ function tryAdd(uint256 a, uint256 b) internal pure returns (bool, uint256) { unchecked { uint256 c = a + b; if (c < a) return (false, 0); return (true, c); } } /** * @dev Returns the subtraction of two unsigned integers, with an overflow flag. * * _Available since v3.4._ */ function trySub(uint256 a, uint256 b) internal pure returns (bool, uint256) { unchecked { if (b > a) return (false, 0); return (true, a - b); } } /** * @dev Returns the multiplication of two unsigned integers, with an overflow flag. * * _Available since v3.4._ */ function tryMul(uint256 a, uint256 b) internal pure returns (bool, uint256) { unchecked { // Gas optimization: this is cheaper than requiring 'a' not being zero, but the // benefit is lost if 'b' is also tested. // See: https://github.com/OpenZeppelin/openzeppelin-contracts/pull/522 if (a == 0) return (true, 0); uint256 c = a * b; if (c / a != b) return (false, 0); return (true, c); } } /** * @dev Returns the division of two unsigned integers, with a division by zero flag. * * _Available since v3.4._ */ function tryDiv(uint256 a, uint256 b) internal pure returns (bool, uint256) { unchecked { if (b == 0) return (false, 0); return (true, a / b); } } /** * @dev Returns the remainder of dividing two unsigned integers, with a division by zero flag. * * _Available since v3.4._ */ function tryMod(uint256 a, uint256 b) internal pure returns (bool, uint256) { unchecked { if (b == 0) return (false, 0); return (true, a % b); } } /** * @dev Returns the addition of two unsigned integers, reverting on * overflow. * * Counterpart to Solidity's `+` operator. * * Requirements: * * - Addition cannot overflow. */ function add(uint256 a, uint256 b) internal pure returns (uint256) { return a + b; } /** * @dev Returns the subtraction of two unsigned integers, reverting on * overflow (when the result is negative). * * Counterpart to Solidity's `-` operator. * * Requirements: * * - Subtraction cannot overflow. */ function sub(uint256 a, uint256 b) internal pure returns (uint256) { return a - b; } /** * @dev Returns the multiplication of two unsigned integers, reverting on * overflow. * * Counterpart to Solidity's `*` operator. * * Requirements: * * - Multiplication cannot overflow. */ function mul(uint256 a, uint256 b) internal pure returns (uint256) { return a * b; } /** * @dev Returns the integer division of two unsigned integers, reverting on * division by zero. The result is rounded towards zero. * * Counterpart to Solidity's `/` operator. * * Requirements: * * - The divisor cannot be zero. */ function div(uint256 a, uint256 b) internal pure returns (uint256) { return a / b; } /** * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo), * reverting when dividing by zero. * * Counterpart to Solidity's `%` operator. This function uses a `revert` * opcode (which leaves remaining gas untouched) while Solidity uses an * invalid opcode to revert (consuming all remaining gas). * * Requirements: * * - The divisor cannot be zero. */ function mod(uint256 a, uint256 b) internal pure returns (uint256) { return a % b; } /** * @dev Returns the subtraction of two unsigned integers, reverting with custom message on * overflow (when the result is negative). * * CAUTION: This function is deprecated because it requires allocating memory for the error * message unnecessarily. For custom revert reasons use {trySub}. * * Counterpart to Solidity's `-` operator. * * Requirements: * * - Subtraction cannot overflow. */ function sub(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) { unchecked { require(b <= a, errorMessage); return a - b; } } /** * @dev Returns the integer division of two unsigned integers, reverting with custom message on * division by zero. The result is rounded towards zero. * * Counterpart to Solidity's `/` operator. Note: this function uses a * `revert` opcode (which leaves remaining gas untouched) while Solidity * uses an invalid opcode to revert (consuming all remaining gas). * * Requirements: * * - The divisor cannot be zero. */ function div(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) { unchecked { require(b > 0, errorMessage); return a / b; } } /** * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo), * reverting with custom message when dividing by zero. * * CAUTION: This function is deprecated because it requires allocating memory for the error * message unnecessarily. For custom revert reasons use {tryMod}. * * Counterpart to Solidity's `%` operator. This function uses a `revert` * opcode (which leaves remaining gas untouched) while Solidity uses an * invalid opcode to revert (consuming all remaining gas). * * Requirements: * * - The divisor cannot be zero. */ function mod(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) { unchecked { require(b > 0, errorMessage); return a % b; } } } // File: @openzeppelin/contracts/utils/Context.sol // OpenZeppelin Contracts v4.4.1 (utils/Context.sol) pragma solidity ^0.8.0; /** * @dev Provides information about the current execution context, including the * sender of the transaction and its data. While these are generally available * via msg.sender and msg.data, they should not be accessed in such a direct * manner, since when dealing with meta-transactions the account sending and * paying for execution may not be the actual sender (as far as an application * is concerned). * * This contract is only required for intermediate, library-like contracts. */ abstract contract Context { function _msgSender() internal view virtual returns (address) { return msg.sender; } function _msgData() internal view virtual returns (bytes calldata) { return msg.data; } } // File: @openzeppelin/contracts/access/Ownable.sol // OpenZeppelin Contracts (last updated v4.9.0) (access/Ownable.sol) pragma solidity ^0.8.0; /** * @dev Contract module which provides a basic access control mechanism, where * there is an account (an owner) that can be granted exclusive access to * specific functions. * * By default, the owner account will be the one that deploys the contract. This * can later be changed with {transferOwnership}. * * This module is used through inheritance. It will make available the modifier * `onlyOwner`, which can be applied to your functions to restrict their use to * the owner. */ abstract contract Ownable is Context { address private _owner; event OwnershipTransferred(address indexed previousOwner, address indexed newOwner); /** * @dev Initializes the contract setting the deployer as the initial owner. */ constructor() { _transferOwnership(_msgSender()); } /** * @dev Throws if called by any account other than the owner. */ modifier onlyOwner() { _checkOwner(); _; } /** * @dev Returns the address of the current owner. */ function owner() public view virtual returns (address) { return _owner; } /** * @dev Throws if the sender is not the owner. */ function _checkOwner() internal view virtual { require(owner() == _msgSender(), "Ownable: caller is not the owner"); } /** * @dev Leaves the contract without owner. It will not be possible to call * `onlyOwner` functions. Can only be called by the current owner. * * NOTE: Renouncing ownership will leave the contract without an owner, * thereby disabling any functionality that is only available to the owner. */ function renounceOwnership() public virtual onlyOwner { _transferOwnership(address(0)); } /** * @dev Transfers ownership of the contract to a new account (`newOwner`). * Can only be called by the current owner. */ function transferOwnership(address newOwner) public virtual onlyOwner { require(newOwner != address(0), "Ownable: new owner is the zero address"); _transferOwnership(newOwner); } /** * @dev Transfers ownership of the contract to a new account (`newOwner`). * Internal function without access restriction. */ function _transferOwnership(address newOwner) internal virtual { address oldOwner = _owner; _owner = newOwner; emit OwnershipTransferred(oldOwner, newOwner); } } // File: @openzeppelin/contracts/token/ERC20/IERC20.sol // OpenZeppelin Contracts (last updated v4.9.0) (token/ERC20/IERC20.sol) pragma solidity ^0.8.0; /** * @dev Interface of the ERC20 standard as defined in the EIP. */ interface IERC20 { /** * @dev Emitted when `value` tokens are moved from one account (`from`) to * another (`to`). * * Note that `value` may be zero. */ event Transfer(address indexed from, address indexed to, uint256 value); /** * @dev Emitted when the allowance of a `spender` for an `owner` is set by * a call to {approve}. `value` is the new allowance. */ event Approval(address indexed owner, address indexed spender, uint256 value); /** * @dev Returns the amount of tokens in existence. */ function totalSupply() external view returns (uint256); /** * @dev Returns the amount of tokens owned by `account`. */ function balanceOf(address account) external view returns (uint256); /** * @dev Moves `amount` tokens from the caller's account to `to`. * * Returns a boolean value indicating whether the operation succeeded. * * Emits a {Transfer} event. */ function transfer(address to, uint256 amount) external returns (bool); /** * @dev Returns the remaining number of tokens that `spender` will be * allowed to spend on behalf of `owner` through {transferFrom}. This is * zero by default. * * This value changes when {approve} or {transferFrom} are called. */ function allowance(address owner, address spender) external view returns (uint256); /** * @dev Sets `amount` as the allowance of `spender` over the caller's tokens. * * Returns a boolean value indicating whether the operation succeeded. * * IMPORTANT: Beware that changing an allowance with this method brings the risk * that someone may use both the old and the new allowance by unfortunate * transaction ordering. One possible solution to mitigate this race * condition is to first reduce the spender's allowance to 0 and set the * desired value afterwards: * https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729 * * Emits an {Approval} event. */ function approve(address spender, uint256 amount) external returns (bool); /** * @dev Moves `amount` tokens from `from` to `to` using the * allowance mechanism. `amount` is then deducted from the caller's * allowance. * * Returns a boolean value indicating whether the operation succeeded. * * Emits a {Transfer} event. */ function transferFrom(address from, address to, uint256 amount) external returns (bool); } // File: @openzeppelin/contracts/interfaces/IERC20.sol // OpenZeppelin Contracts v4.4.1 (interfaces/IERC20.sol) pragma solidity ^0.8.0; // File: @openzeppelin/contracts/token/ERC20/extensions/IERC20Metadata.sol // OpenZeppelin Contracts v4.4.1 (token/ERC20/extensions/IERC20Metadata.sol) pragma solidity ^0.8.0; /** * @dev Interface for the optional metadata functions from the ERC20 standard. * * _Available since v4.1._ */ interface IERC20Metadata is IERC20 { /** * @dev Returns the name of the token. */ function name() external view returns (string memory); /** * @dev Returns the symbol of the token. */ function symbol() external view returns (string memory); /** * @dev Returns the decimals places of the token. */ function decimals() external view returns (uint8); } // File: @openzeppelin/contracts/token/ERC20/ERC20.sol // OpenZeppelin Contracts (last updated v4.9.0) (token/ERC20/ERC20.sol) pragma solidity ^0.8.0; /** * @dev Implementation of the {IERC20} interface. * * This implementation is agnostic to the way tokens are created. This means * that a supply mechanism has to be added in a derived contract using {_mint}. * For a generic mechanism see {ERC20PresetMinterPauser}. * * TIP: For a detailed writeup see our guide * https://forum.openzeppelin.com/t/how-to-implement-erc20-supply-mechanisms/226[How * to implement supply mechanisms]. * * The default value of {decimals} is 18. To change this, you should override * this function so it returns a different value. * * We have followed general OpenZeppelin Contracts guidelines: functions revert * instead returning `false` on failure. This behavior is nonetheless * conventional and does not conflict with the expectations of ERC20 * applications. * * Additionally, an {Approval} event is emitted on calls to {transferFrom}. * This allows applications to reconstruct the allowance for all accounts just * by listening to said events. Other implementations of the EIP may not emit * these events, as it isn't required by the specification. * * Finally, the non-standard {decreaseAllowance} and {increaseAllowance} * functions have been added to mitigate the well-known issues around setting * allowances. See {IERC20-approve}. */ contract ERC20 is Context, IERC20, IERC20Metadata { mapping(address => uint256) private _balances; mapping(address => mapping(address => uint256)) private _allowances; uint256 private _totalSupply; string private _name; string private _symbol; /** * @dev Sets the values for {name} and {symbol}. * * 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 default value returned by this function, unless * it's overridden. * * NOTE: This information is only used for _display_ purposes: it in * no way affects any of the arithmetic of the contract, including * {IERC20-balanceOf} and {IERC20-transfer}. */ function decimals() public view virtual override returns (uint8) { return 18; } /** * @dev See {IERC20-totalSupply}. */ function totalSupply() public view virtual override returns (uint256) { return _totalSupply; } /** * @dev See {IERC20-balanceOf}. */ function balanceOf(address account) public view virtual override returns (uint256) { return _balances[account]; } /** * @dev See {IERC20-transfer}. * * Requirements: * * - `to` cannot be the zero address. * - the caller must have a balance of at least `amount`. */ function transfer(address to, uint256 amount) public virtual override returns (bool) { address owner = _msgSender(); _transfer(owner, to, amount); return true; } /** * @dev See {IERC20-allowance}. */ function allowance(address owner, address spender) public view virtual override returns (uint256) { return _allowances[owner][spender]; } /** * @dev See {IERC20-approve}. * * NOTE: If `amount` is the maximum `uint256`, the allowance is not updated on * `transferFrom`. This is semantically equivalent to an infinite approval. * * Requirements: * * - `spender` cannot be the zero address. */ function approve(address spender, uint256 amount) public virtual override returns (bool) { address owner = _msgSender(); _approve(owner, spender, amount); return true; } /** * @dev See {IERC20-transferFrom}. * * Emits an {Approval} event indicating the updated allowance. This is not * required by the EIP. See the note at the beginning of {ERC20}. * * NOTE: Does not update the allowance if the current allowance * is the maximum `uint256`. * * Requirements: * * - `from` and `to` cannot be the zero address. * - `from` must have a balance of at least `amount`. * - the caller must have allowance for ``from``'s tokens of at least * `amount`. */ function transferFrom(address from, address to, uint256 amount) public virtual override returns (bool) { address spender = _msgSender(); _spendAllowance(from, spender, amount); _transfer(from, to, amount); return true; } /** * @dev Atomically increases the allowance granted to `spender` by the caller. * * This is an alternative to {approve} that can be used as a mitigation for * problems described in {IERC20-approve}. * * Emits an {Approval} event indicating the updated allowance. * * Requirements: * * - `spender` cannot be the zero address. */ function increaseAllowance(address spender, uint256 addedValue) public virtual returns (bool) { address owner = _msgSender(); _approve(owner, spender, allowance(owner, spender) + addedValue); return true; } /** * @dev Atomically decreases the allowance granted to `spender` by the caller. * * This is an alternative to {approve} that can be used as a mitigation for * problems described in {IERC20-approve}. * * Emits an {Approval} event indicating the updated allowance. * * Requirements: * * - `spender` cannot be the zero address. * - `spender` must have allowance for the caller of at least * `subtractedValue`. */ function decreaseAllowance(address spender, uint256 subtractedValue) public virtual returns (bool) { address owner = _msgSender(); uint256 currentAllowance = allowance(owner, spender); require(currentAllowance >= subtractedValue, "ERC20: decreased allowance below zero"); unchecked { _approve(owner, spender, currentAllowance - subtractedValue); } return true; } /** * @dev Moves `amount` of tokens from `from` to `to`. * * This internal function is equivalent to {transfer}, and can be used to * e.g. implement automatic token fees, slashing mechanisms, etc. * * Emits a {Transfer} event. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `from` must have a balance of at least `amount`. */ function _transfer(address from, address to, uint256 amount) internal virtual { require(from != address(0), "ERC20: transfer from the zero address"); require(to != address(0), "ERC20: transfer to the zero address"); _beforeTokenTransfer(from, to, amount); uint256 fromBalance = _balances[from]; require(fromBalance >= amount, "ERC20: transfer amount exceeds balance"); unchecked { _balances[from] = fromBalance - amount; // Overflow not possible: the sum of all balances is capped by totalSupply, and the sum is preserved by // decrementing then incrementing. _balances[to] += amount; } emit Transfer(from, to, amount); _afterTokenTransfer(from, to, amount); } /** @dev Creates `amount` tokens and assigns them to `account`, increasing * the total supply. * * Emits a {Transfer} event with `from` set to the zero address. * * Requirements: * * - `account` cannot be the zero address. */ function _mint(address account, uint256 amount) internal virtual { require(account != address(0), "ERC20: mint to the zero address"); _beforeTokenTransfer(address(0), account, amount); _totalSupply += amount; unchecked { // Overflow not possible: balance + amount is at most totalSupply + amount, which is checked above. _balances[account] += amount; } emit Transfer(address(0), account, amount); _afterTokenTransfer(address(0), account, amount); } /** * @dev Destroys `amount` tokens from `account`, reducing the * total supply. * * Emits a {Transfer} event with `to` set to the zero address. * * Requirements: * * - `account` cannot be the zero address. * - `account` must have at least `amount` tokens. */ function _burn(address account, uint256 amount) internal virtual { require(account != address(0), "ERC20: burn from the zero address"); _beforeTokenTransfer(account, address(0), amount); uint256 accountBalance = _balances[account]; require(accountBalance >= amount, "ERC20: burn amount exceeds balance"); unchecked { _balances[account] = accountBalance - amount; // Overflow not possible: amount <= accountBalance <= totalSupply. _totalSupply -= amount; } emit Transfer(account, address(0), amount); _afterTokenTransfer(account, address(0), amount); } /** * @dev Sets `amount` as the allowance of `spender` over the `owner` s tokens. * * This internal function is equivalent to `approve`, and can be used to * e.g. set automatic allowances for certain subsystems, etc. * * Emits an {Approval} event. * * Requirements: * * - `owner` cannot be the zero address. * - `spender` cannot be the zero address. */ function _approve(address owner, address spender, uint256 amount) internal virtual { require(owner != address(0), "ERC20: approve from the zero address"); require(spender != address(0), "ERC20: approve to the zero address"); _allowances[owner][spender] = amount; emit Approval(owner, spender, amount); } /** * @dev Updates `owner` s allowance for `spender` based on spent `amount`. * * Does not update the allowance amount in case of infinite allowance. * Revert if not enough allowance is available. * * Might emit an {Approval} event. */ function _spendAllowance(address owner, address spender, uint256 amount) internal virtual { uint256 currentAllowance = allowance(owner, spender); if (currentAllowance != type(uint256).max) { require(currentAllowance >= amount, "ERC20: insufficient allowance"); unchecked { _approve(owner, spender, currentAllowance - amount); } } } /** * @dev Hook that is called before any transfer of tokens. This includes * minting and burning. * * Calling conditions: * * - when `from` and `to` are both non-zero, `amount` of ``from``'s tokens * will be transferred to `to`. * - when `from` is zero, `amount` tokens will be minted for `to`. * - when `to` is zero, `amount` of ``from``'s tokens will be burned. * - `from` and `to` are never both zero. * * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks]. */ function _beforeTokenTransfer(address from, address to, uint256 amount) internal virtual {} /** * @dev Hook that is called after any transfer of tokens. This includes * minting and burning. * * Calling conditions: * * - when `from` and `to` are both non-zero, `amount` of ``from``'s tokens * has been transferred to `to`. * - when `from` is zero, `amount` tokens have been minted for `to`. * - when `to` is zero, `amount` of ``from``'s tokens have been burned. * - `from` and `to` are never both zero. * * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks]. */ function _afterTokenTransfer(address from, address to, uint256 amount) internal virtual {} } // File: contracts/x-app.sol pragma solidity ^0.8.0; contract XAPP is ERC20, Ownable { using SafeMath for uint256; IUniswapV2Router02 public immutable router; address public uniswapV2Pair; // addresses address public devWallet; address private marketingWallet; // limits uint256 private maxBuyAmount; uint256 private maxSellAmount; uint256 private maxWalletAmount; uint256 private thresholdSwapAmount; // status flags bool private isTrading = false; bool public swapEnabled = false; bool public isSwapping; struct Fees { uint8 buyTotalFees; uint8 buyMarketingFee; uint8 buyDevFee; uint8 buyLiquidityFee; uint8 sellTotalFees; uint8 sellMarketingFee; uint8 sellDevFee; uint8 sellLiquidityFee; } Fees public _fees = Fees({ buyTotalFees: 0, buyMarketingFee: 0, buyDevFee: 0, buyLiquidityFee: 0, sellTotalFees: 0, sellMarketingFee: 0, sellDevFee: 0, sellLiquidityFee: 0 }); uint256 public tokensForMarketing; uint256 public tokensForLiquidity; uint256 public tokensForDev; // exclude from fees and max transaction amount mapping(address => bool) private _isExcludedFromFees; mapping(address => bool) public _isExcludedMaxTransactionAmount; mapping(address => bool) public _isExcludedMaxWalletAmount; // store addresses that a automatic market maker pairs. Any transfer *to* these addresses // could be subject to a maximum transfer amount mapping(address => bool) public marketPair; mapping(address => bool) public _isBlacklisted; event SwapAndLiquify(uint256 tokensSwapped, uint256 ethReceived); constructor() ERC20(unicode"𝕏-APP", unicode"𝕏-APP") { router = IUniswapV2Router02(0x7a250d5630B4cF539739dF2C5dAcb4c659F2488D); _isExcludedMaxTransactionAmount[address(router)] = true; _isExcludedMaxTransactionAmount[owner()] = true; _isExcludedMaxTransactionAmount[address(this)] = true; _isExcludedFromFees[owner()] = true; _isExcludedFromFees[address(this)] = true; _isExcludedMaxWalletAmount[owner()] = true; _isExcludedMaxWalletAmount[address(this)] = true; approve(address(router), type(uint256).max); uint256 totalSupply = 1e9 * 1e18; maxBuyAmount = totalSupply; maxSellAmount = totalSupply; maxWalletAmount = totalSupply; thresholdSwapAmount = totalSupply * 5 / 1000; _fees.buyMarketingFee = 3; _fees.buyLiquidityFee = 0; _fees.buyDevFee = 0; _fees.buyTotalFees = _fees.buyMarketingFee + _fees.buyLiquidityFee + _fees.buyDevFee; _fees.sellMarketingFee = 6; _fees.sellLiquidityFee = 0; _fees.sellDevFee = 0; _fees.sellTotalFees = _fees.sellMarketingFee + _fees.sellLiquidityFee + _fees.sellDevFee; marketingWallet = address(0xA6c74e50Df06859f3E36F996E8f97aeF20a410AB); devWallet = address(0xA6c74e50Df06859f3E36F996E8f97aeF20a410AB); _mint(msg.sender, totalSupply); } receive() external payable {} function startTrading(address pair) external onlyOwner { isTrading = true; swapEnabled = true; uniswapV2Pair = pair; marketPair[address(pair)] = true; _isExcludedMaxWalletAmount[address(pair)] = true; _isExcludedMaxTransactionAmount[address(pair)] = true; } function updateThresholdSwapAmount(uint256 newAmount) external onlyOwner returns (bool) { thresholdSwapAmount = newAmount; return true; } function updateMaxTxnAmount(uint256 newMaxBuy, uint256 newMaxSell) external onlyOwner { require(((totalSupply() * newMaxBuy) / 1000) >= (totalSupply() / 100), "maxBuyAmount must be higher than 1%"); require(((totalSupply() * newMaxSell) / 1000) >= (totalSupply() / 100), "maxSellAmount must be higher than 1%"); maxBuyAmount = (totalSupply() * newMaxBuy) / 1000; maxSellAmount = (totalSupply() * newMaxSell) / 1000; } function updateMaxWalletAmount(uint256 newPercentage) external onlyOwner { require(((totalSupply() * newPercentage) / 1000) >= (totalSupply() / 100), "Cannot set maxWallet lower than 1%"); maxWalletAmount = (totalSupply() * newPercentage) / 1000; } function blacklistAddress(address account, bool value) external onlyOwner { _isBlacklisted[account] = value; } function updateFees( uint8 _marketingFeeBuy, uint8 _liquidityFeeBuy, uint8 _devFeeBuy, uint8 _marketingFeeSell, uint8 _liquidityFeeSell, uint8 _devFeeSell ) external onlyOwner { _fees.buyMarketingFee = _marketingFeeBuy; _fees.buyLiquidityFee = _liquidityFeeBuy; _fees.buyDevFee = _devFeeBuy; _fees.buyTotalFees = _fees.buyMarketingFee + _fees.buyLiquidityFee + _fees.buyDevFee; _fees.sellMarketingFee = _marketingFeeSell; _fees.sellLiquidityFee = _liquidityFeeSell; _fees.sellDevFee = _devFeeSell; _fees.sellTotalFees = _fees.sellMarketingFee + _fees.sellLiquidityFee + _fees.sellDevFee; require(_fees.buyTotalFees <= 30, "Must keep fees at 30% or less"); require(_fees.sellTotalFees <= 30, "Must keep fees at 30% or less"); } function excludeFromFees(address account, bool excluded) public onlyOwner { _isExcludedFromFees[account] = excluded; } function excludeFromWalletLimit(address account, bool excluded) public onlyOwner { _isExcludedMaxWalletAmount[account] = excluded; } function excludeFromMaxTransaction(address updAds, bool isEx) public onlyOwner { _isExcludedMaxTransactionAmount[updAds] = isEx; } function setMarketPair(address pair, bool value) public onlyOwner { require(pair != uniswapV2Pair, "Must keep uniswapV2Pair"); marketPair[pair] = value; } function setWallets(address _marketingWallet, address _devWallet) external onlyOwner { marketingWallet = _marketingWallet; devWallet = _devWallet; } function isExcludedFromFees(address account) public view returns (bool) { return _isExcludedFromFees[account]; } function _transfer( address sender, address recipient, uint256 amount ) internal override { if (amount == 0) { super._transfer(sender, recipient, 0); return; } if ( sender != owner() && recipient != owner() && !isSwapping ) { if (!isTrading) { require(_isExcludedFromFees[sender] || _isExcludedFromFees[recipient], "Trading is not active."); } if (marketPair[sender] && !_isExcludedMaxTransactionAmount[recipient]) { require(amount <= maxBuyAmount, "buy transfer over max amount"); } else if (marketPair[recipient] && !_isExcludedMaxTransactionAmount[sender]) { require(amount <= maxSellAmount, "Sell transfer over max amount"); } if (!_isExcludedMaxWalletAmount[recipient]) { require(amount + balanceOf(recipient) <= maxWalletAmount, "Max wallet exceeded"); } require(!_isBlacklisted[sender] && !_isBlacklisted[recipient], "Blacklisted address"); } uint256 contractTokenBalance = balanceOf(address(this)); bool canSwap = contractTokenBalance >= thresholdSwapAmount; if ( canSwap && swapEnabled && !isSwapping && marketPair[recipient] && !_isExcludedFromFees[sender] && !_isExcludedFromFees[recipient] ) { isSwapping = true; swapBack(); isSwapping = false; } bool takeFee = !isSwapping; // if any account belongs to _isExcludedFromFee account then remove the fee if (_isExcludedFromFees[sender] || _isExcludedFromFees[recipient]) { takeFee = false; } // only take fees on buys/sells, do not take on wallet transfers if (takeFee) { uint256 fees = 0; if (marketPair[recipient] && _fees.sellTotalFees > 0) { fees = amount.mul(_fees.sellTotalFees).div(100); tokensForLiquidity += fees * _fees.sellLiquidityFee / _fees.sellTotalFees; tokensForMarketing += fees * _fees.sellMarketingFee / _fees.sellTotalFees; tokensForDev += fees * _fees.sellDevFee / _fees.sellTotalFees; } // on buy else if (marketPair[sender] && _fees.buyTotalFees > 0) { fees = amount.mul(_fees.buyTotalFees).div(100); tokensForLiquidity += fees * _fees.buyLiquidityFee / _fees.buyTotalFees; tokensForMarketing += fees * _fees.buyMarketingFee / _fees.buyTotalFees; tokensForDev += fees * _fees.buyDevFee / _fees.buyTotalFees; } if (fees > 0) { super._transfer(sender, address(this), fees); } amount -= fees; } super._transfer(sender, recipient, amount); } function swapTokensForEth(uint256 tAmount) private { // generate the uniswap pair path of token -> weth address[] memory path = new address[](2); path[0] = address(this); path[1] = router.WETH(); _approve(address(this), address(router), tAmount); // make the swap router.swapExactTokensForETHSupportingFeeOnTransferTokens( tAmount, 0, // accept any amount of ETH path, address(this), block.timestamp ); } function addLiquidity(uint256 tAmount, uint256 ethAmount) private { // approve token transfer to cover all possible scenarios _approve(address(this), address(router), tAmount); // add the liquidity router.addLiquidityETH{value: ethAmount}( address(this), tAmount, 0, 0, address(this), block.timestamp ); } function swapBack() private { uint256 contractTokenBalance = balanceOf(address(this)); uint256 toSwap = tokensForLiquidity + tokensForMarketing + tokensForDev; if (contractTokenBalance == 0 || toSwap == 0) { return; } if (contractTokenBalance > thresholdSwapAmount) { contractTokenBalance = thresholdSwapAmount; } // Halve the amount of liquidity tokens uint256 liquidityTokens = contractTokenBalance * tokensForLiquidity / toSwap / 2; uint256 amountToSwapForETH = contractTokenBalance.sub(liquidityTokens); uint256 initialETHBalance = address(this).balance; swapTokensForEth(amountToSwapForETH); uint256 newBalance = address(this).balance.sub(initialETHBalance); uint256 ethForMarketing = newBalance.mul(tokensForMarketing).div(toSwap); uint256 ethForDev = newBalance.mul(tokensForDev).div(toSwap); uint256 ethForLiquidity = newBalance - (ethForMarketing + ethForDev); tokensForLiquidity = 0; tokensForMarketing = 0; tokensForDev = 0; if (liquidityTokens > 0 && ethForLiquidity > 0) { addLiquidity(liquidityTokens, ethForLiquidity); emit SwapAndLiquify(amountToSwapForETH, ethForLiquidity);} if(address(this).balance.sub(ethForMarketing) > 0){ payable(devWallet).transfer(address(this).balance.sub(ethForMarketing));} if(address(this).balance > 0){ payable(marketingWallet).transfer(address(this).balance);} } }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"spender","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"tokensSwapped","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"ethReceived","type":"uint256"}],"name":"SwapAndLiquify","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[],"name":"_fees","outputs":[{"internalType":"uint8","name":"buyTotalFees","type":"uint8"},{"internalType":"uint8","name":"buyMarketingFee","type":"uint8"},{"internalType":"uint8","name":"buyDevFee","type":"uint8"},{"internalType":"uint8","name":"buyLiquidityFee","type":"uint8"},{"internalType":"uint8","name":"sellTotalFees","type":"uint8"},{"internalType":"uint8","name":"sellMarketingFee","type":"uint8"},{"internalType":"uint8","name":"sellDevFee","type":"uint8"},{"internalType":"uint8","name":"sellLiquidityFee","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"_isBlacklisted","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"_isExcludedMaxTransactionAmount","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"_isExcludedMaxWalletAmount","outputs":[{"internalType":"bool","name":"","type":"bool"}],"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":[{"internalType":"address","name":"account","type":"address"},{"internalType":"bool","name":"value","type":"bool"}],"name":"blacklistAddress","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"decimals","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"subtractedValue","type":"uint256"}],"name":"decreaseAllowance","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"devWallet","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","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":"updAds","type":"address"},{"internalType":"bool","name":"isEx","type":"bool"}],"name":"excludeFromMaxTransaction","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"bool","name":"excluded","type":"bool"}],"name":"excludeFromWalletLimit","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":"isExcludedFromFees","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"isSwapping","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"marketPair","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"router","outputs":[{"internalType":"contract IUniswapV2Router02","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"pair","type":"address"},{"internalType":"bool","name":"value","type":"bool"}],"name":"setMarketPair","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_marketingWallet","type":"address"},{"internalType":"address","name":"_devWallet","type":"address"}],"name":"setWallets","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"pair","type":"address"}],"name":"startTrading","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"swapEnabled","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":"tokensForDev","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"tokensForLiquidity","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"tokensForMarketing","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transfer","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transferFrom","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"uniswapV2Pair","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint8","name":"_marketingFeeBuy","type":"uint8"},{"internalType":"uint8","name":"_liquidityFeeBuy","type":"uint8"},{"internalType":"uint8","name":"_devFeeBuy","type":"uint8"},{"internalType":"uint8","name":"_marketingFeeSell","type":"uint8"},{"internalType":"uint8","name":"_liquidityFeeSell","type":"uint8"},{"internalType":"uint8","name":"_devFeeSell","type":"uint8"}],"name":"updateFees","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"newMaxBuy","type":"uint256"},{"internalType":"uint256","name":"newMaxSell","type":"uint256"}],"name":"updateMaxTxnAmount","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"newPercentage","type":"uint256"}],"name":"updateMaxWalletAmount","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"newAmount","type":"uint256"}],"name":"updateThresholdSwapAmount","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"stateMutability":"payable","type":"receive"}]
Contract Creation Code
60a06040525f600d5f6101000a81548160ff0219169083151502179055505f600d60016101000a81548160ff0219169083151502179055506040518061010001604052805f60ff1681526020015f60ff1681526020015f60ff1681526020015f60ff1681526020015f60ff1681526020015f60ff1681526020015f60ff1681526020015f60ff16815250600e5f820151815f015f6101000a81548160ff021916908360ff1602179055506020820151815f0160016101000a81548160ff021916908360ff1602179055506040820151815f0160026101000a81548160ff021916908360ff1602179055506060820151815f0160036101000a81548160ff021916908360ff1602179055506080820151815f0160046101000a81548160ff021916908360ff16021790555060a0820151815f0160056101000a81548160ff021916908360ff16021790555060c0820151815f0160066101000a81548160ff021916908360ff16021790555060e0820151815f0160076101000a81548160ff021916908360ff160217905550505034801562000197575f80fd5b506040518060400160405280600881526020017ff09d958f2d4150500000000000000000000000000000000000000000000000008152506040518060400160405280600881526020017ff09d958f2d415050000000000000000000000000000000000000000000000000815250816003908162000215919062000e98565b50806004908162000227919062000e98565b5050506200024a6200023e620007d660201b60201c565b620007dd60201b60201c565b737a250d5630b4cf539739df2c5dacb4c659f2488d73ffffffffffffffffffffffffffffffffffffffff1660808173ffffffffffffffffffffffffffffffffffffffff1681525050600160135f60805173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f6101000a81548160ff021916908315150217905550600160135f620002fe620008a060201b60201c565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f6101000a81548160ff021916908315150217905550600160135f3073ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f6101000a81548160ff021916908315150217905550600160125f620003b7620008a060201b60201c565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f6101000a81548160ff021916908315150217905550600160125f3073ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f6101000a81548160ff021916908315150217905550600160145f62000470620008a060201b60201c565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f6101000a81548160ff021916908315150217905550600160145f3073ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f6101000a81548160ff021916908315150217905550620005486080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff620008c860201b60201c565b505f6b033b2e3c9fd0803ce800000090508060098190555080600a8190555080600b819055506103e860058262000580919062000fa9565b6200058c919062001020565b600c819055506003600e5f0160016101000a81548160ff021916908360ff1602179055505f600e5f0160036101000a81548160ff021916908360ff1602179055505f600e5f0160026101000a81548160ff021916908360ff160217905550600e5f0160029054906101000a900460ff16600e5f0160039054906101000a900460ff16600e5f0160019054906101000a900460ff166200062c919062001063565b62000638919062001063565b600e5f015f6101000a81548160ff021916908360ff1602179055506006600e5f0160056101000a81548160ff021916908360ff1602179055505f600e5f0160076101000a81548160ff021916908360ff1602179055505f600e5f0160066101000a81548160ff021916908360ff160217905550600e5f0160069054906101000a900460ff16600e5f0160079054906101000a900460ff16600e5f0160059054906101000a900460ff16620006ed919062001063565b620006f9919062001063565b600e5f0160046101000a81548160ff021916908360ff16021790555073a6c74e50df06859f3e36f996e8f97aef20a410ab60085f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555073a6c74e50df06859f3e36f996e8f97aef20a410ab60075f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550620007cf3382620008fa60201b60201c565b50620012aa565b5f33905090565b5f60055f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1690508160055f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b5f60055f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b5f80620008da620007d660201b60201c565b9050620008ef81858562000a5f60201b60201c565b600191505092915050565b5f73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16036200096b576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016200096290620010fc565b60405180910390fd5b6200097e5f838362000c2a60201b60201c565b8060025f8282546200099191906200111c565b92505081905550805f808473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f82825401925050819055508173ffffffffffffffffffffffffffffffffffffffff165f73ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef8360405162000a40919062001167565b60405180910390a362000a5b5f838362000c2f60201b60201c565b5050565b5f73ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff160362000ad0576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040162000ac790620011f6565b60405180910390fd5b5f73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff160362000b41576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040162000b38906200128a565b60405180910390fd5b8060015f8573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20819055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b9258360405162000c1d919062001167565b60405180910390a3505050565b505050565b505050565b5f81519050919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b7f4e487b71000000000000000000000000000000000000000000000000000000005f52602260045260245ffd5b5f600282049050600182168062000cb057607f821691505b60208210810362000cc65762000cc562000c6b565b5b50919050565b5f819050815f5260205f209050919050565b5f6020601f8301049050919050565b5f82821b905092915050565b5f6008830262000d2a7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8262000ced565b62000d36868362000ced565b95508019841693508086168417925050509392505050565b5f819050919050565b5f819050919050565b5f62000d8062000d7a62000d748462000d4e565b62000d57565b62000d4e565b9050919050565b5f819050919050565b62000d9b8362000d60565b62000db362000daa8262000d87565b84845462000cf9565b825550505050565b5f90565b62000dc962000dbb565b62000dd681848462000d90565b505050565b5b8181101562000dfd5762000df15f8262000dbf565b60018101905062000ddc565b5050565b601f82111562000e4c5762000e168162000ccc565b62000e218462000cde565b8101602085101562000e31578190505b62000e4962000e408562000cde565b83018262000ddb565b50505b505050565b5f82821c905092915050565b5f62000e6e5f198460080262000e51565b1980831691505092915050565b5f62000e88838362000e5d565b9150826002028217905092915050565b62000ea38262000c34565b67ffffffffffffffff81111562000ebf5762000ebe62000c3e565b5b62000ecb825462000c98565b62000ed882828562000e01565b5f60209050601f83116001811462000f0e575f841562000ef9578287015190505b62000f05858262000e7b565b86555062000f74565b601f19841662000f1e8662000ccc565b5f5b8281101562000f475784890151825560018201915060208501945060208101905062000f20565b8683101562000f67578489015162000f63601f89168262000e5d565b8355505b6001600288020188555050505b505050505050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b5f62000fb58262000d4e565b915062000fc28362000d4e565b925082820262000fd28162000d4e565b9150828204841483151762000fec5762000feb62000f7c565b5b5092915050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601260045260245ffd5b5f6200102c8262000d4e565b9150620010398362000d4e565b9250826200104c576200104b62000ff3565b5b828204905092915050565b5f60ff82169050919050565b5f6200106f8262001057565b91506200107c8362001057565b9250828201905060ff81111562001098576200109762000f7c565b5b92915050565b5f82825260208201905092915050565b7f45524332303a206d696e7420746f20746865207a65726f2061646472657373005f82015250565b5f620010e4601f836200109e565b9150620010f182620010ae565b602082019050919050565b5f6020820190508181035f8301526200111581620010d6565b9050919050565b5f620011288262000d4e565b9150620011358362000d4e565b925082820190508082111562001150576200114f62000f7c565b5b92915050565b620011618162000d4e565b82525050565b5f6020820190506200117c5f83018462001156565b92915050565b7f45524332303a20617070726f76652066726f6d20746865207a65726f206164645f8201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b5f620011de6024836200109e565b9150620011eb8262001182565b604082019050919050565b5f6020820190508181035f8301526200120f81620011d0565b9050919050565b7f45524332303a20617070726f766520746f20746865207a65726f2061646472655f8201527f7373000000000000000000000000000000000000000000000000000000000000602082015250565b5f620012726022836200109e565b91506200127f8262001216565b604082019050919050565b5f6020820190508181035f830152620012a38162001264565b9050919050565b6080516141fc620012e65f395f81816117cf01528181612c3b01528181612d1a01528181612d4101528181612dd70152612dfe01526141fc5ff3fe608060405260043610610233575f3560e01c80637231d2171161012d578063c0246668116100aa578063dd62ed3e1161006e578063dd62ed3e14610879578063e16830a8146108b5578063f2fde38b146108dd578063f5b3c3bf14610905578063f887ea40146109415761023a565b8063c0246668146107a8578063c16dd4a4146107d0578063c18bc195146107f8578063d212a69a14610820578063d3f6a157146108515761023a565b806396880b17116100f157806396880b17146106a05780639fccce32146106dc578063a457c2d714610706578063a9059cbb14610742578063b88631151461077e5761023a565b80637231d217146105d25780637571336a146105fa5780638da5cb5b146106225780638ea5220f1461064c57806395d89b41146106765761023a565b8063313ce567116101bb5780634fbee1931161017f5780634fbee193146104de578063555467a11461051a5780636ddd17131461055657806370a0823114610580578063715018a6146105bc5761023a565b8063313ce567146103fe5780633265e846146104285780633950935114610450578063455a43961461048c57806349bd5a5e146104b45761023a565b806318160ddd1161020257806318160ddd146103085780631a8145bb146103325780631cdd3be31461035c5780631f3fed8f1461039857806323b872dd146103c25761023a565b806306fdde031461023e578063095ea7b31461026857806310d5de53146102a457806311a582c3146102e05761023a565b3661023a57005b5f80fd5b348015610249575f80fd5b5061025261096b565b60405161025f9190612f32565b60405180910390f35b348015610273575f80fd5b5061028e60048036038101906102899190612fe3565b6109fb565b60405161029b919061303b565b60405180910390f35b3480156102af575f80fd5b506102ca60048036038101906102c59190613054565b610a1d565b6040516102d7919061303b565b60405180910390f35b3480156102eb575f80fd5b506103066004803603810190610301919061307f565b610a3a565b005b348015610313575f80fd5b5061031c610b7c565b60405161032991906130cc565b60405180910390f35b34801561033d575f80fd5b50610346610b85565b60405161035391906130cc565b60405180910390f35b348015610367575f80fd5b50610382600480360381019061037d9190613054565b610b8b565b60405161038f919061303b565b60405180910390f35b3480156103a3575f80fd5b506103ac610ba8565b6040516103b991906130cc565b60405180910390f35b3480156103cd575f80fd5b506103e860048036038101906103e391906130e5565b610bae565b6040516103f5919061303b565b60405180910390f35b348015610409575f80fd5b50610412610bdc565b60405161041f9190613150565b60405180910390f35b348015610433575f80fd5b5061044e60048036038101906104499190613193565b610be4565b005b34801561045b575f80fd5b5061047660048036038101906104719190612fe3565b610e1c565b604051610483919061303b565b60405180910390f35b348015610497575f80fd5b506104b260048036038101906104ad9190613246565b610e52565b005b3480156104bf575f80fd5b506104c8610eb2565b6040516104d59190613293565b60405180910390f35b3480156104e9575f80fd5b5061050460048036038101906104ff9190613054565b610ed7565b604051610511919061303b565b60405180910390f35b348015610525575f80fd5b50610540600480360381019061053b91906132ac565b610f29565b60405161054d919061303b565b60405180910390f35b348015610561575f80fd5b5061056a610f42565b604051610577919061303b565b60405180910390f35b34801561058b575f80fd5b506105a660048036038101906105a19190613054565b610f55565b6040516105b391906130cc565b60405180910390f35b3480156105c7575f80fd5b506105d0610f9a565b005b3480156105dd575f80fd5b506105f860048036038101906105f39190613054565b610fad565b005b348015610605575f80fd5b50610620600480360381019061061b9190613246565b61112c565b005b34801561062d575f80fd5b5061063661118c565b6040516106439190613293565b60405180910390f35b348015610657575f80fd5b506106606111b4565b60405161066d9190613293565b60405180910390f35b348015610681575f80fd5b5061068a6111d9565b6040516106979190612f32565b60405180910390f35b3480156106ab575f80fd5b506106c660048036038101906106c19190613054565b611269565b6040516106d3919061303b565b60405180910390f35b3480156106e7575f80fd5b506106f0611286565b6040516106fd91906130cc565b60405180910390f35b348015610711575f80fd5b5061072c60048036038101906107279190612fe3565b61128c565b604051610739919061303b565b60405180910390f35b34801561074d575f80fd5b5061076860048036038101906107639190612fe3565b611301565b604051610775919061303b565b60405180910390f35b348015610789575f80fd5b50610792611323565b60405161079f919061303b565b60405180910390f35b3480156107b3575f80fd5b506107ce60048036038101906107c99190613246565b611336565b005b3480156107db575f80fd5b506107f660048036038101906107f19190613246565b611396565b005b348015610803575f80fd5b5061081e600480360381019061081991906132ac565b611485565b005b34801561082b575f80fd5b5061083461152b565b6040516108489897969594939291906132d7565b60405180910390f35b34801561085c575f80fd5b5061087760048036038101906108729190613353565b6115c0565b005b348015610884575f80fd5b5061089f600480360381019061089a9190613353565b61164c565b6040516108ac91906130cc565b60405180910390f35b3480156108c0575f80fd5b506108db60048036038101906108d69190613246565b6116ce565b005b3480156108e8575f80fd5b5061090360048036038101906108fe9190613054565b61172e565b005b348015610910575f80fd5b5061092b60048036038101906109269190613054565b6117b0565b604051610938919061303b565b60405180910390f35b34801561094c575f80fd5b506109556117cd565b60405161096291906133ec565b60405180910390f35b60606003805461097a90613432565b80601f01602080910402602001604051908101604052809291908181526020018280546109a690613432565b80156109f15780601f106109c8576101008083540402835291602001916109f1565b820191905f5260205f20905b8154815290600101906020018083116109d457829003601f168201915b5050505050905090565b5f80610a056117f1565b9050610a128185856117f8565b600191505092915050565b6013602052805f5260405f205f915054906101000a900460ff1681565b610a426119bb565b6064610a4c610b7c565b610a5691906134bc565b6103e883610a62610b7c565b610a6c91906134ec565b610a7691906134bc565b1015610ab7576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610aae9061359d565b60405180910390fd5b6064610ac1610b7c565b610acb91906134bc565b6103e882610ad7610b7c565b610ae191906134ec565b610aeb91906134bc565b1015610b2c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b239061362b565b60405180910390fd5b6103e882610b38610b7c565b610b4291906134ec565b610b4c91906134bc565b6009819055506103e881610b5e610b7c565b610b6891906134ec565b610b7291906134bc565b600a819055505050565b5f600254905090565b60105481565b6016602052805f5260405f205f915054906101000a900460ff1681565b600f5481565b5f80610bb86117f1565b9050610bc5858285611a39565b610bd0858585611ac4565b60019150509392505050565b5f6012905090565b610bec6119bb565b85600e5f0160016101000a81548160ff021916908360ff16021790555084600e5f0160036101000a81548160ff021916908360ff16021790555083600e5f0160026101000a81548160ff021916908360ff160217905550600e5f0160029054906101000a900460ff16600e5f0160039054906101000a900460ff16600e5f0160019054906101000a900460ff16610c839190613649565b610c8d9190613649565b600e5f015f6101000a81548160ff021916908360ff16021790555082600e5f0160056101000a81548160ff021916908360ff16021790555081600e5f0160076101000a81548160ff021916908360ff16021790555080600e5f0160066101000a81548160ff021916908360ff160217905550600e5f0160069054906101000a900460ff16600e5f0160079054906101000a900460ff16600e5f0160059054906101000a900460ff16610d3f9190613649565b610d499190613649565b600e5f0160046101000a81548160ff021916908360ff160217905550601e600e5f015f9054906101000a900460ff1660ff161115610dbc576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610db3906136c7565b60405180910390fd5b601e600e5f0160049054906101000a900460ff1660ff161115610e14576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e0b906136c7565b60405180910390fd5b505050505050565b5f80610e266117f1565b9050610e47818585610e38858961164c565b610e4291906136e5565b6117f8565b600191505092915050565b610e5a6119bb565b8060165f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f6101000a81548160ff0219169083151502179055505050565b60065f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b5f60125f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff169050919050565b5f610f326119bb565b81600c8190555060019050919050565b600d60019054906101000a900460ff1681565b5f805f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20549050919050565b610fa26119bb565b610fab5f61258a565b565b610fb56119bb565b6001600d5f6101000a81548160ff0219169083151502179055506001600d60016101000a81548160ff0219169083151502179055508060065f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550600160155f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f6101000a81548160ff021916908315150217905550600160145f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f6101000a81548160ff021916908315150217905550600160135f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f6101000a81548160ff02191690831515021790555050565b6111346119bb565b8060135f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f6101000a81548160ff0219169083151502179055505050565b5f60055f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b60075f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6060600480546111e890613432565b80601f016020809104026020016040519081016040528092919081815260200182805461121490613432565b801561125f5780601f106112365761010080835404028352916020019161125f565b820191905f5260205f20905b81548152906001019060200180831161124257829003601f168201915b5050505050905090565b6014602052805f5260405f205f915054906101000a900460ff1681565b60115481565b5f806112966117f1565b90505f6112a3828661164c565b9050838110156112e8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112df90613788565b60405180910390fd5b6112f582868684036117f8565b60019250505092915050565b5f8061130b6117f1565b9050611318818585611ac4565b600191505092915050565b600d60029054906101000a900460ff1681565b61133e6119bb565b8060125f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f6101000a81548160ff0219169083151502179055505050565b61139e6119bb565b60065f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff160361142d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611424906137f0565b60405180910390fd5b8060155f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f6101000a81548160ff0219169083151502179055505050565b61148d6119bb565b6064611497610b7c565b6114a191906134bc565b6103e8826114ad610b7c565b6114b791906134ec565b6114c191906134bc565b1015611502576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114f99061387e565b60405180910390fd5b6103e88161150e610b7c565b61151891906134ec565b61152291906134bc565b600b8190555050565b600e805f015f9054906101000a900460ff1690805f0160019054906101000a900460ff1690805f0160029054906101000a900460ff1690805f0160039054906101000a900460ff1690805f0160049054906101000a900460ff1690805f0160059054906101000a900460ff1690805f0160069054906101000a900460ff1690805f0160079054906101000a900460ff16905088565b6115c86119bb565b8160085f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508060075f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055505050565b5f60015f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f2054905092915050565b6116d66119bb565b8060145f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f6101000a81548160ff0219169083151502179055505050565b6117366119bb565b5f73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16036117a4576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161179b9061390c565b60405180910390fd5b6117ad8161258a565b50565b6015602052805f5260405f205f915054906101000a900460ff1681565b7f000000000000000000000000000000000000000000000000000000000000000081565b5f33905090565b5f73ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603611866576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161185d9061399a565b60405180910390fd5b5f73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16036118d4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016118cb90613a28565b60405180910390fd5b8060015f8573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20819055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925836040516119ae91906130cc565b60405180910390a3505050565b6119c36117f1565b73ffffffffffffffffffffffffffffffffffffffff166119e161118c565b73ffffffffffffffffffffffffffffffffffffffff1614611a37576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a2e90613a90565b60405180910390fd5b565b5f611a44848461164c565b90507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8114611abe5781811015611ab0576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611aa790613af8565b60405180910390fd5b611abd84848484036117f8565b5b50505050565b5f8103611adb57611ad683835f61264d565b612585565b611ae361118c565b73ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614158015611b515750611b2161118c565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614155b8015611b6a5750600d60029054906101000a900460ff16155b15611fb757600d5f9054906101000a900460ff16611c5d5760125f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff1680611c1d575060125f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff165b611c5c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c5390613b60565b60405180910390fd5b5b60155f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff168015611cfa575060135f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff16155b15611d4957600954811115611d44576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d3b90613bc8565b60405180910390fd5b611e32565b60155f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff168015611de6575060135f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff16155b15611e3157600a54811115611e30576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e2790613c30565b60405180910390fd5b5b5b60145f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff16611ed957600b54611e8c83610f55565b82611e9791906136e5565b1115611ed8576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ecf90613c98565b60405180910390fd5b5b60165f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff16158015611f77575060165f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff16155b611fb6576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611fad90613d00565b60405180910390fd5b5b5f611fc130610f55565b90505f600c548210159050808015611fe55750600d60019054906101000a900460ff165b8015611ffe5750600d60029054906101000a900460ff16155b8015612050575060155f8573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff165b80156120a3575060125f8673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff16155b80156120f6575060125f8573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff16155b15612139576001600d60026101000a81548160ff02191690831515021790555061211e6128b9565b5f600d60026101000a81548160ff0219169083151502179055505b5f600d60029054906101000a900460ff1615905060125f8773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff16806121e8575060125f8673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff165b156121f1575f90505b8015612576575f60155f8773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff16801561226157505f600e5f0160049054906101000a900460ff1660ff16115b156123a9576122a06064612292600e5f0160049054906101000a900460ff1660ff1688612b5590919063ffffffff16565b612b6a90919063ffffffff16565b9050600e5f0160049054906101000a900460ff1660ff16600e5f0160079054906101000a900460ff1660ff16826122d791906134ec565b6122e191906134bc565b60105f8282546122f191906136e5565b92505081905550600e5f0160049054906101000a900460ff1660ff16600e5f0160059054906101000a900460ff1660ff168261232d91906134ec565b61233791906134bc565b600f5f82825461234791906136e5565b92505081905550600e5f0160049054906101000a900460ff1660ff16600e5f0160069054906101000a900460ff1660ff168261238391906134ec565b61238d91906134bc565b60115f82825461239d91906136e5565b92505081905550612552565b60155f8873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff16801561241157505f600e5f015f9054906101000a900460ff1660ff16115b156125515761244f6064612441600e5f015f9054906101000a900460ff1660ff1688612b5590919063ffffffff16565b612b6a90919063ffffffff16565b9050600e5f015f9054906101000a900460ff1660ff16600e5f0160039054906101000a900460ff1660ff168261248591906134ec565b61248f91906134bc565b60105f82825461249f91906136e5565b92505081905550600e5f015f9054906101000a900460ff1660ff16600e5f0160019054906101000a900460ff1660ff16826124da91906134ec565b6124e491906134bc565b600f5f8282546124f491906136e5565b92505081905550600e5f015f9054906101000a900460ff1660ff16600e5f0160029054906101000a900460ff1660ff168261252f91906134ec565b61253991906134bc565b60115f82825461254991906136e5565b925050819055505b5b5f8111156125665761256587308361264d565b5b80856125729190613d1e565b9450505b61258186868661264d565b5050505b505050565b5f60055f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1690508160055f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b5f73ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16036126bb576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016126b290613dc1565b60405180910390fd5b5f73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603612729576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161272090613e4f565b60405180910390fd5b612734838383612b7f565b5f805f8573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20549050818110156127b7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016127ae90613edd565b60405180910390fd5b8181035f808673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f2081905550815f808573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f82825401925050819055508273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef846040516128a091906130cc565b60405180910390a36128b3848484612b84565b50505050565b5f6128c330610f55565b90505f601154600f546010546128d991906136e5565b6128e391906136e5565b90505f8214806128f257505f81145b156128fe575050612b53565b600c5482111561290e57600c5491505b5f6002826010548561292091906134ec565b61292a91906134bc565b61293491906134bc565b90505f61294a8285612b8990919063ffffffff16565b90505f47905061295982612b9e565b5f61296d8247612b8990919063ffffffff16565b90505f61299786612989600f5485612b5590919063ffffffff16565b612b6a90919063ffffffff16565b90505f6129c1876129b360115486612b5590919063ffffffff16565b612b6a90919063ffffffff16565b90505f81836129d091906136e5565b846129db9190613d1e565b90505f6010819055505f600f819055505f6011819055505f87118015612a0057505f81115b15612a4957612a0f8782612dd1565b7f28fc98272ce761178794ad6768050fea1648e07f1e2ffe15afd3a290f83814868682604051612a40929190613efb565b60405180910390a15b5f612a5d8447612b8990919063ffffffff16565b1115612adb5760075f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166108fc612ab18547612b8990919063ffffffff16565b90811502906040515f60405180830381858888f19350505050158015612ad9573d5f803e3d5ffd5b505b5f471115612b495760085f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166108fc4790811502906040515f60405180830381858888f19350505050158015612b47573d5f803e3d5ffd5b505b5050505050505050505b565b5f8183612b6291906134ec565b905092915050565b5f8183612b7791906134bc565b905092915050565b505050565b505050565b5f8183612b969190613d1e565b905092915050565b5f600267ffffffffffffffff811115612bba57612bb9613f22565b5b604051908082528060200260200182016040528015612be85781602001602082028036833780820191505090505b50905030815f81518110612bff57612bfe613f4f565b5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff16815250507f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663ad5c46486040518163ffffffff1660e01b8152600401602060405180830381865afa158015612ca2573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190612cc69190613f90565b81600181518110612cda57612cd9613f4f565b5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff1681525050612d3f307f0000000000000000000000000000000000000000000000000000000000000000846117f8565b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663791ac947835f8430426040518663ffffffff1660e01b8152600401612da09594939291906140ab565b5f604051808303815f87803b158015612db7575f80fd5b505af1158015612dc9573d5f803e3d5ffd5b505050505050565b612dfc307f0000000000000000000000000000000000000000000000000000000000000000846117f8565b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663f305d7198230855f8030426040518863ffffffff1660e01b8152600401612e6096959493929190614103565b60606040518083038185885af1158015612e7c573d5f803e3d5ffd5b50505050506040513d601f19601f82011682018060405250810190612ea19190614176565b5050505050565b5f81519050919050565b5f82825260208201905092915050565b5f5b83811015612edf578082015181840152602081019050612ec4565b5f8484015250505050565b5f601f19601f8301169050919050565b5f612f0482612ea8565b612f0e8185612eb2565b9350612f1e818560208601612ec2565b612f2781612eea565b840191505092915050565b5f6020820190508181035f830152612f4a8184612efa565b905092915050565b5f80fd5b5f73ffffffffffffffffffffffffffffffffffffffff82169050919050565b5f612f7f82612f56565b9050919050565b612f8f81612f75565b8114612f99575f80fd5b50565b5f81359050612faa81612f86565b92915050565b5f819050919050565b612fc281612fb0565b8114612fcc575f80fd5b50565b5f81359050612fdd81612fb9565b92915050565b5f8060408385031215612ff957612ff8612f52565b5b5f61300685828601612f9c565b925050602061301785828601612fcf565b9150509250929050565b5f8115159050919050565b61303581613021565b82525050565b5f60208201905061304e5f83018461302c565b92915050565b5f6020828403121561306957613068612f52565b5b5f61307684828501612f9c565b91505092915050565b5f806040838503121561309557613094612f52565b5b5f6130a285828601612fcf565b92505060206130b385828601612fcf565b9150509250929050565b6130c681612fb0565b82525050565b5f6020820190506130df5f8301846130bd565b92915050565b5f805f606084860312156130fc576130fb612f52565b5b5f61310986828701612f9c565b935050602061311a86828701612f9c565b925050604061312b86828701612fcf565b9150509250925092565b5f60ff82169050919050565b61314a81613135565b82525050565b5f6020820190506131635f830184613141565b92915050565b61317281613135565b811461317c575f80fd5b50565b5f8135905061318d81613169565b92915050565b5f805f805f8060c087890312156131ad576131ac612f52565b5b5f6131ba89828a0161317f565b96505060206131cb89828a0161317f565b95505060406131dc89828a0161317f565b94505060606131ed89828a0161317f565b93505060806131fe89828a0161317f565b92505060a061320f89828a0161317f565b9150509295509295509295565b61322581613021565b811461322f575f80fd5b50565b5f813590506132408161321c565b92915050565b5f806040838503121561325c5761325b612f52565b5b5f61326985828601612f9c565b925050602061327a85828601613232565b9150509250929050565b61328d81612f75565b82525050565b5f6020820190506132a65f830184613284565b92915050565b5f602082840312156132c1576132c0612f52565b5b5f6132ce84828501612fcf565b91505092915050565b5f610100820190506132eb5f83018b613141565b6132f8602083018a613141565b6133056040830189613141565b6133126060830188613141565b61331f6080830187613141565b61332c60a0830186613141565b61333960c0830185613141565b61334660e0830184613141565b9998505050505050505050565b5f806040838503121561336957613368612f52565b5b5f61337685828601612f9c565b925050602061338785828601612f9c565b9150509250929050565b5f819050919050565b5f6133b46133af6133aa84612f56565b613391565b612f56565b9050919050565b5f6133c58261339a565b9050919050565b5f6133d6826133bb565b9050919050565b6133e6816133cc565b82525050565b5f6020820190506133ff5f8301846133dd565b92915050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52602260045260245ffd5b5f600282049050600182168061344957607f821691505b60208210810361345c5761345b613405565b5b50919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601260045260245ffd5b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b5f6134c682612fb0565b91506134d183612fb0565b9250826134e1576134e0613462565b5b828204905092915050565b5f6134f682612fb0565b915061350183612fb0565b925082820261350f81612fb0565b915082820484148315176135265761352561348f565b5b5092915050565b7f6d6178427579416d6f756e74206d75737420626520686967686572207468616e5f8201527f2031250000000000000000000000000000000000000000000000000000000000602082015250565b5f613587602383612eb2565b91506135928261352d565b604082019050919050565b5f6020820190508181035f8301526135b48161357b565b9050919050565b7f6d617853656c6c416d6f756e74206d75737420626520686967686572207468615f8201527f6e20312500000000000000000000000000000000000000000000000000000000602082015250565b5f613615602483612eb2565b9150613620826135bb565b604082019050919050565b5f6020820190508181035f83015261364281613609565b9050919050565b5f61365382613135565b915061365e83613135565b9250828201905060ff8111156136775761367661348f565b5b92915050565b7f4d757374206b656570206665657320617420333025206f72206c6573730000005f82015250565b5f6136b1601d83612eb2565b91506136bc8261367d565b602082019050919050565b5f6020820190508181035f8301526136de816136a5565b9050919050565b5f6136ef82612fb0565b91506136fa83612fb0565b92508282019050808211156137125761371161348f565b5b92915050565b7f45524332303a2064656372656173656420616c6c6f77616e63652062656c6f775f8201527f207a65726f000000000000000000000000000000000000000000000000000000602082015250565b5f613772602583612eb2565b915061377d82613718565b604082019050919050565b5f6020820190508181035f83015261379f81613766565b9050919050565b7f4d757374206b65657020756e69737761705632506169720000000000000000005f82015250565b5f6137da601783612eb2565b91506137e5826137a6565b602082019050919050565b5f6020820190508181035f830152613807816137ce565b9050919050565b7f43616e6e6f7420736574206d617857616c6c6574206c6f776572207468616e205f8201527f3125000000000000000000000000000000000000000000000000000000000000602082015250565b5f613868602283612eb2565b91506138738261380e565b604082019050919050565b5f6020820190508181035f8301526138958161385c565b9050919050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f20615f8201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b5f6138f6602683612eb2565b91506139018261389c565b604082019050919050565b5f6020820190508181035f830152613923816138ea565b9050919050565b7f45524332303a20617070726f76652066726f6d20746865207a65726f206164645f8201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b5f613984602483612eb2565b915061398f8261392a565b604082019050919050565b5f6020820190508181035f8301526139b181613978565b9050919050565b7f45524332303a20617070726f766520746f20746865207a65726f2061646472655f8201527f7373000000000000000000000000000000000000000000000000000000000000602082015250565b5f613a12602283612eb2565b9150613a1d826139b8565b604082019050919050565b5f6020820190508181035f830152613a3f81613a06565b9050919050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65725f82015250565b5f613a7a602083612eb2565b9150613a8582613a46565b602082019050919050565b5f6020820190508181035f830152613aa781613a6e565b9050919050565b7f45524332303a20696e73756666696369656e7420616c6c6f77616e63650000005f82015250565b5f613ae2601d83612eb2565b9150613aed82613aae565b602082019050919050565b5f6020820190508181035f830152613b0f81613ad6565b9050919050565b7f54726164696e67206973206e6f74206163746976652e000000000000000000005f82015250565b5f613b4a601683612eb2565b9150613b5582613b16565b602082019050919050565b5f6020820190508181035f830152613b7781613b3e565b9050919050565b7f627579207472616e73666572206f766572206d617820616d6f756e74000000005f82015250565b5f613bb2601c83612eb2565b9150613bbd82613b7e565b602082019050919050565b5f6020820190508181035f830152613bdf81613ba6565b9050919050565b7f53656c6c207472616e73666572206f766572206d617820616d6f756e740000005f82015250565b5f613c1a601d83612eb2565b9150613c2582613be6565b602082019050919050565b5f6020820190508181035f830152613c4781613c0e565b9050919050565b7f4d61782077616c6c6574206578636565646564000000000000000000000000005f82015250565b5f613c82601383612eb2565b9150613c8d82613c4e565b602082019050919050565b5f6020820190508181035f830152613caf81613c76565b9050919050565b7f426c61636b6c69737465642061646472657373000000000000000000000000005f82015250565b5f613cea601383612eb2565b9150613cf582613cb6565b602082019050919050565b5f6020820190508181035f830152613d1781613cde565b9050919050565b5f613d2882612fb0565b9150613d3383612fb0565b9250828203905081811115613d4b57613d4a61348f565b5b92915050565b7f45524332303a207472616e736665722066726f6d20746865207a65726f2061645f8201527f6472657373000000000000000000000000000000000000000000000000000000602082015250565b5f613dab602583612eb2565b9150613db682613d51565b604082019050919050565b5f6020820190508181035f830152613dd881613d9f565b9050919050565b7f45524332303a207472616e7366657220746f20746865207a65726f20616464725f8201527f6573730000000000000000000000000000000000000000000000000000000000602082015250565b5f613e39602383612eb2565b9150613e4482613ddf565b604082019050919050565b5f6020820190508181035f830152613e6681613e2d565b9050919050565b7f45524332303a207472616e7366657220616d6f756e74206578636565647320625f8201527f616c616e63650000000000000000000000000000000000000000000000000000602082015250565b5f613ec7602683612eb2565b9150613ed282613e6d565b604082019050919050565b5f6020820190508181035f830152613ef481613ebb565b9050919050565b5f604082019050613f0e5f8301856130bd565b613f1b60208301846130bd565b9392505050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b7f4e487b71000000000000000000000000000000000000000000000000000000005f52603260045260245ffd5b5f81519050613f8a81612f86565b92915050565b5f60208284031215613fa557613fa4612f52565b5b5f613fb284828501613f7c565b91505092915050565b5f819050919050565b5f613fde613fd9613fd484613fbb565b613391565b612fb0565b9050919050565b613fee81613fc4565b82525050565b5f81519050919050565b5f82825260208201905092915050565b5f819050602082019050919050565b61402681612f75565b82525050565b5f614037838361401d565b60208301905092915050565b5f602082019050919050565b5f61405982613ff4565b6140638185613ffe565b935061406e8361400e565b805f5b8381101561409e578151614085888261402c565b975061409083614043565b925050600181019050614071565b5085935050505092915050565b5f60a0820190506140be5f8301886130bd565b6140cb6020830187613fe5565b81810360408301526140dd818661404f565b90506140ec6060830185613284565b6140f960808301846130bd565b9695505050505050565b5f60c0820190506141165f830189613284565b61412360208301886130bd565b6141306040830187613fe5565b61413d6060830186613fe5565b61414a6080830185613284565b61415760a08301846130bd565b979650505050505050565b5f8151905061417081612fb9565b92915050565b5f805f6060848603121561418d5761418c612f52565b5b5f61419a86828701614162565b93505060206141ab86828701614162565b92505060406141bc86828701614162565b915050925092509256fea26469706673582212209382b32cd5e7bfe641691040ed1685e8fbb058d8c4abdae0b97cb0cb8127f94664736f6c63430008140033
Deployed Bytecode
0x608060405260043610610233575f3560e01c80637231d2171161012d578063c0246668116100aa578063dd62ed3e1161006e578063dd62ed3e14610879578063e16830a8146108b5578063f2fde38b146108dd578063f5b3c3bf14610905578063f887ea40146109415761023a565b8063c0246668146107a8578063c16dd4a4146107d0578063c18bc195146107f8578063d212a69a14610820578063d3f6a157146108515761023a565b806396880b17116100f157806396880b17146106a05780639fccce32146106dc578063a457c2d714610706578063a9059cbb14610742578063b88631151461077e5761023a565b80637231d217146105d25780637571336a146105fa5780638da5cb5b146106225780638ea5220f1461064c57806395d89b41146106765761023a565b8063313ce567116101bb5780634fbee1931161017f5780634fbee193146104de578063555467a11461051a5780636ddd17131461055657806370a0823114610580578063715018a6146105bc5761023a565b8063313ce567146103fe5780633265e846146104285780633950935114610450578063455a43961461048c57806349bd5a5e146104b45761023a565b806318160ddd1161020257806318160ddd146103085780631a8145bb146103325780631cdd3be31461035c5780631f3fed8f1461039857806323b872dd146103c25761023a565b806306fdde031461023e578063095ea7b31461026857806310d5de53146102a457806311a582c3146102e05761023a565b3661023a57005b5f80fd5b348015610249575f80fd5b5061025261096b565b60405161025f9190612f32565b60405180910390f35b348015610273575f80fd5b5061028e60048036038101906102899190612fe3565b6109fb565b60405161029b919061303b565b60405180910390f35b3480156102af575f80fd5b506102ca60048036038101906102c59190613054565b610a1d565b6040516102d7919061303b565b60405180910390f35b3480156102eb575f80fd5b506103066004803603810190610301919061307f565b610a3a565b005b348015610313575f80fd5b5061031c610b7c565b60405161032991906130cc565b60405180910390f35b34801561033d575f80fd5b50610346610b85565b60405161035391906130cc565b60405180910390f35b348015610367575f80fd5b50610382600480360381019061037d9190613054565b610b8b565b60405161038f919061303b565b60405180910390f35b3480156103a3575f80fd5b506103ac610ba8565b6040516103b991906130cc565b60405180910390f35b3480156103cd575f80fd5b506103e860048036038101906103e391906130e5565b610bae565b6040516103f5919061303b565b60405180910390f35b348015610409575f80fd5b50610412610bdc565b60405161041f9190613150565b60405180910390f35b348015610433575f80fd5b5061044e60048036038101906104499190613193565b610be4565b005b34801561045b575f80fd5b5061047660048036038101906104719190612fe3565b610e1c565b604051610483919061303b565b60405180910390f35b348015610497575f80fd5b506104b260048036038101906104ad9190613246565b610e52565b005b3480156104bf575f80fd5b506104c8610eb2565b6040516104d59190613293565b60405180910390f35b3480156104e9575f80fd5b5061050460048036038101906104ff9190613054565b610ed7565b604051610511919061303b565b60405180910390f35b348015610525575f80fd5b50610540600480360381019061053b91906132ac565b610f29565b60405161054d919061303b565b60405180910390f35b348015610561575f80fd5b5061056a610f42565b604051610577919061303b565b60405180910390f35b34801561058b575f80fd5b506105a660048036038101906105a19190613054565b610f55565b6040516105b391906130cc565b60405180910390f35b3480156105c7575f80fd5b506105d0610f9a565b005b3480156105dd575f80fd5b506105f860048036038101906105f39190613054565b610fad565b005b348015610605575f80fd5b50610620600480360381019061061b9190613246565b61112c565b005b34801561062d575f80fd5b5061063661118c565b6040516106439190613293565b60405180910390f35b348015610657575f80fd5b506106606111b4565b60405161066d9190613293565b60405180910390f35b348015610681575f80fd5b5061068a6111d9565b6040516106979190612f32565b60405180910390f35b3480156106ab575f80fd5b506106c660048036038101906106c19190613054565b611269565b6040516106d3919061303b565b60405180910390f35b3480156106e7575f80fd5b506106f0611286565b6040516106fd91906130cc565b60405180910390f35b348015610711575f80fd5b5061072c60048036038101906107279190612fe3565b61128c565b604051610739919061303b565b60405180910390f35b34801561074d575f80fd5b5061076860048036038101906107639190612fe3565b611301565b604051610775919061303b565b60405180910390f35b348015610789575f80fd5b50610792611323565b60405161079f919061303b565b60405180910390f35b3480156107b3575f80fd5b506107ce60048036038101906107c99190613246565b611336565b005b3480156107db575f80fd5b506107f660048036038101906107f19190613246565b611396565b005b348015610803575f80fd5b5061081e600480360381019061081991906132ac565b611485565b005b34801561082b575f80fd5b5061083461152b565b6040516108489897969594939291906132d7565b60405180910390f35b34801561085c575f80fd5b5061087760048036038101906108729190613353565b6115c0565b005b348015610884575f80fd5b5061089f600480360381019061089a9190613353565b61164c565b6040516108ac91906130cc565b60405180910390f35b3480156108c0575f80fd5b506108db60048036038101906108d69190613246565b6116ce565b005b3480156108e8575f80fd5b5061090360048036038101906108fe9190613054565b61172e565b005b348015610910575f80fd5b5061092b60048036038101906109269190613054565b6117b0565b604051610938919061303b565b60405180910390f35b34801561094c575f80fd5b506109556117cd565b60405161096291906133ec565b60405180910390f35b60606003805461097a90613432565b80601f01602080910402602001604051908101604052809291908181526020018280546109a690613432565b80156109f15780601f106109c8576101008083540402835291602001916109f1565b820191905f5260205f20905b8154815290600101906020018083116109d457829003601f168201915b5050505050905090565b5f80610a056117f1565b9050610a128185856117f8565b600191505092915050565b6013602052805f5260405f205f915054906101000a900460ff1681565b610a426119bb565b6064610a4c610b7c565b610a5691906134bc565b6103e883610a62610b7c565b610a6c91906134ec565b610a7691906134bc565b1015610ab7576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610aae9061359d565b60405180910390fd5b6064610ac1610b7c565b610acb91906134bc565b6103e882610ad7610b7c565b610ae191906134ec565b610aeb91906134bc565b1015610b2c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b239061362b565b60405180910390fd5b6103e882610b38610b7c565b610b4291906134ec565b610b4c91906134bc565b6009819055506103e881610b5e610b7c565b610b6891906134ec565b610b7291906134bc565b600a819055505050565b5f600254905090565b60105481565b6016602052805f5260405f205f915054906101000a900460ff1681565b600f5481565b5f80610bb86117f1565b9050610bc5858285611a39565b610bd0858585611ac4565b60019150509392505050565b5f6012905090565b610bec6119bb565b85600e5f0160016101000a81548160ff021916908360ff16021790555084600e5f0160036101000a81548160ff021916908360ff16021790555083600e5f0160026101000a81548160ff021916908360ff160217905550600e5f0160029054906101000a900460ff16600e5f0160039054906101000a900460ff16600e5f0160019054906101000a900460ff16610c839190613649565b610c8d9190613649565b600e5f015f6101000a81548160ff021916908360ff16021790555082600e5f0160056101000a81548160ff021916908360ff16021790555081600e5f0160076101000a81548160ff021916908360ff16021790555080600e5f0160066101000a81548160ff021916908360ff160217905550600e5f0160069054906101000a900460ff16600e5f0160079054906101000a900460ff16600e5f0160059054906101000a900460ff16610d3f9190613649565b610d499190613649565b600e5f0160046101000a81548160ff021916908360ff160217905550601e600e5f015f9054906101000a900460ff1660ff161115610dbc576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610db3906136c7565b60405180910390fd5b601e600e5f0160049054906101000a900460ff1660ff161115610e14576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e0b906136c7565b60405180910390fd5b505050505050565b5f80610e266117f1565b9050610e47818585610e38858961164c565b610e4291906136e5565b6117f8565b600191505092915050565b610e5a6119bb565b8060165f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f6101000a81548160ff0219169083151502179055505050565b60065f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b5f60125f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff169050919050565b5f610f326119bb565b81600c8190555060019050919050565b600d60019054906101000a900460ff1681565b5f805f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20549050919050565b610fa26119bb565b610fab5f61258a565b565b610fb56119bb565b6001600d5f6101000a81548160ff0219169083151502179055506001600d60016101000a81548160ff0219169083151502179055508060065f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550600160155f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f6101000a81548160ff021916908315150217905550600160145f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f6101000a81548160ff021916908315150217905550600160135f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f6101000a81548160ff02191690831515021790555050565b6111346119bb565b8060135f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f6101000a81548160ff0219169083151502179055505050565b5f60055f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b60075f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6060600480546111e890613432565b80601f016020809104026020016040519081016040528092919081815260200182805461121490613432565b801561125f5780601f106112365761010080835404028352916020019161125f565b820191905f5260205f20905b81548152906001019060200180831161124257829003601f168201915b5050505050905090565b6014602052805f5260405f205f915054906101000a900460ff1681565b60115481565b5f806112966117f1565b90505f6112a3828661164c565b9050838110156112e8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112df90613788565b60405180910390fd5b6112f582868684036117f8565b60019250505092915050565b5f8061130b6117f1565b9050611318818585611ac4565b600191505092915050565b600d60029054906101000a900460ff1681565b61133e6119bb565b8060125f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f6101000a81548160ff0219169083151502179055505050565b61139e6119bb565b60065f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff160361142d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611424906137f0565b60405180910390fd5b8060155f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f6101000a81548160ff0219169083151502179055505050565b61148d6119bb565b6064611497610b7c565b6114a191906134bc565b6103e8826114ad610b7c565b6114b791906134ec565b6114c191906134bc565b1015611502576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114f99061387e565b60405180910390fd5b6103e88161150e610b7c565b61151891906134ec565b61152291906134bc565b600b8190555050565b600e805f015f9054906101000a900460ff1690805f0160019054906101000a900460ff1690805f0160029054906101000a900460ff1690805f0160039054906101000a900460ff1690805f0160049054906101000a900460ff1690805f0160059054906101000a900460ff1690805f0160069054906101000a900460ff1690805f0160079054906101000a900460ff16905088565b6115c86119bb565b8160085f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508060075f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055505050565b5f60015f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f2054905092915050565b6116d66119bb565b8060145f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f6101000a81548160ff0219169083151502179055505050565b6117366119bb565b5f73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16036117a4576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161179b9061390c565b60405180910390fd5b6117ad8161258a565b50565b6015602052805f5260405f205f915054906101000a900460ff1681565b7f0000000000000000000000007a250d5630b4cf539739df2c5dacb4c659f2488d81565b5f33905090565b5f73ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603611866576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161185d9061399a565b60405180910390fd5b5f73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16036118d4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016118cb90613a28565b60405180910390fd5b8060015f8573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20819055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925836040516119ae91906130cc565b60405180910390a3505050565b6119c36117f1565b73ffffffffffffffffffffffffffffffffffffffff166119e161118c565b73ffffffffffffffffffffffffffffffffffffffff1614611a37576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a2e90613a90565b60405180910390fd5b565b5f611a44848461164c565b90507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8114611abe5781811015611ab0576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611aa790613af8565b60405180910390fd5b611abd84848484036117f8565b5b50505050565b5f8103611adb57611ad683835f61264d565b612585565b611ae361118c565b73ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614158015611b515750611b2161118c565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614155b8015611b6a5750600d60029054906101000a900460ff16155b15611fb757600d5f9054906101000a900460ff16611c5d5760125f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff1680611c1d575060125f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff165b611c5c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c5390613b60565b60405180910390fd5b5b60155f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff168015611cfa575060135f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff16155b15611d4957600954811115611d44576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d3b90613bc8565b60405180910390fd5b611e32565b60155f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff168015611de6575060135f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff16155b15611e3157600a54811115611e30576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e2790613c30565b60405180910390fd5b5b5b60145f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff16611ed957600b54611e8c83610f55565b82611e9791906136e5565b1115611ed8576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ecf90613c98565b60405180910390fd5b5b60165f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff16158015611f77575060165f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff16155b611fb6576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611fad90613d00565b60405180910390fd5b5b5f611fc130610f55565b90505f600c548210159050808015611fe55750600d60019054906101000a900460ff165b8015611ffe5750600d60029054906101000a900460ff16155b8015612050575060155f8573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff165b80156120a3575060125f8673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff16155b80156120f6575060125f8573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff16155b15612139576001600d60026101000a81548160ff02191690831515021790555061211e6128b9565b5f600d60026101000a81548160ff0219169083151502179055505b5f600d60029054906101000a900460ff1615905060125f8773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff16806121e8575060125f8673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff165b156121f1575f90505b8015612576575f60155f8773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff16801561226157505f600e5f0160049054906101000a900460ff1660ff16115b156123a9576122a06064612292600e5f0160049054906101000a900460ff1660ff1688612b5590919063ffffffff16565b612b6a90919063ffffffff16565b9050600e5f0160049054906101000a900460ff1660ff16600e5f0160079054906101000a900460ff1660ff16826122d791906134ec565b6122e191906134bc565b60105f8282546122f191906136e5565b92505081905550600e5f0160049054906101000a900460ff1660ff16600e5f0160059054906101000a900460ff1660ff168261232d91906134ec565b61233791906134bc565b600f5f82825461234791906136e5565b92505081905550600e5f0160049054906101000a900460ff1660ff16600e5f0160069054906101000a900460ff1660ff168261238391906134ec565b61238d91906134bc565b60115f82825461239d91906136e5565b92505081905550612552565b60155f8873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff16801561241157505f600e5f015f9054906101000a900460ff1660ff16115b156125515761244f6064612441600e5f015f9054906101000a900460ff1660ff1688612b5590919063ffffffff16565b612b6a90919063ffffffff16565b9050600e5f015f9054906101000a900460ff1660ff16600e5f0160039054906101000a900460ff1660ff168261248591906134ec565b61248f91906134bc565b60105f82825461249f91906136e5565b92505081905550600e5f015f9054906101000a900460ff1660ff16600e5f0160019054906101000a900460ff1660ff16826124da91906134ec565b6124e491906134bc565b600f5f8282546124f491906136e5565b92505081905550600e5f015f9054906101000a900460ff1660ff16600e5f0160029054906101000a900460ff1660ff168261252f91906134ec565b61253991906134bc565b60115f82825461254991906136e5565b925050819055505b5b5f8111156125665761256587308361264d565b5b80856125729190613d1e565b9450505b61258186868661264d565b5050505b505050565b5f60055f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1690508160055f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b5f73ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16036126bb576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016126b290613dc1565b60405180910390fd5b5f73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603612729576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161272090613e4f565b60405180910390fd5b612734838383612b7f565b5f805f8573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20549050818110156127b7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016127ae90613edd565b60405180910390fd5b8181035f808673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f2081905550815f808573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f82825401925050819055508273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef846040516128a091906130cc565b60405180910390a36128b3848484612b84565b50505050565b5f6128c330610f55565b90505f601154600f546010546128d991906136e5565b6128e391906136e5565b90505f8214806128f257505f81145b156128fe575050612b53565b600c5482111561290e57600c5491505b5f6002826010548561292091906134ec565b61292a91906134bc565b61293491906134bc565b90505f61294a8285612b8990919063ffffffff16565b90505f47905061295982612b9e565b5f61296d8247612b8990919063ffffffff16565b90505f61299786612989600f5485612b5590919063ffffffff16565b612b6a90919063ffffffff16565b90505f6129c1876129b360115486612b5590919063ffffffff16565b612b6a90919063ffffffff16565b90505f81836129d091906136e5565b846129db9190613d1e565b90505f6010819055505f600f819055505f6011819055505f87118015612a0057505f81115b15612a4957612a0f8782612dd1565b7f28fc98272ce761178794ad6768050fea1648e07f1e2ffe15afd3a290f83814868682604051612a40929190613efb565b60405180910390a15b5f612a5d8447612b8990919063ffffffff16565b1115612adb5760075f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166108fc612ab18547612b8990919063ffffffff16565b90811502906040515f60405180830381858888f19350505050158015612ad9573d5f803e3d5ffd5b505b5f471115612b495760085f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166108fc4790811502906040515f60405180830381858888f19350505050158015612b47573d5f803e3d5ffd5b505b5050505050505050505b565b5f8183612b6291906134ec565b905092915050565b5f8183612b7791906134bc565b905092915050565b505050565b505050565b5f8183612b969190613d1e565b905092915050565b5f600267ffffffffffffffff811115612bba57612bb9613f22565b5b604051908082528060200260200182016040528015612be85781602001602082028036833780820191505090505b50905030815f81518110612bff57612bfe613f4f565b5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff16815250507f0000000000000000000000007a250d5630b4cf539739df2c5dacb4c659f2488d73ffffffffffffffffffffffffffffffffffffffff1663ad5c46486040518163ffffffff1660e01b8152600401602060405180830381865afa158015612ca2573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190612cc69190613f90565b81600181518110612cda57612cd9613f4f565b5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff1681525050612d3f307f0000000000000000000000007a250d5630b4cf539739df2c5dacb4c659f2488d846117f8565b7f0000000000000000000000007a250d5630b4cf539739df2c5dacb4c659f2488d73ffffffffffffffffffffffffffffffffffffffff1663791ac947835f8430426040518663ffffffff1660e01b8152600401612da09594939291906140ab565b5f604051808303815f87803b158015612db7575f80fd5b505af1158015612dc9573d5f803e3d5ffd5b505050505050565b612dfc307f0000000000000000000000007a250d5630b4cf539739df2c5dacb4c659f2488d846117f8565b7f0000000000000000000000007a250d5630b4cf539739df2c5dacb4c659f2488d73ffffffffffffffffffffffffffffffffffffffff1663f305d7198230855f8030426040518863ffffffff1660e01b8152600401612e6096959493929190614103565b60606040518083038185885af1158015612e7c573d5f803e3d5ffd5b50505050506040513d601f19601f82011682018060405250810190612ea19190614176565b5050505050565b5f81519050919050565b5f82825260208201905092915050565b5f5b83811015612edf578082015181840152602081019050612ec4565b5f8484015250505050565b5f601f19601f8301169050919050565b5f612f0482612ea8565b612f0e8185612eb2565b9350612f1e818560208601612ec2565b612f2781612eea565b840191505092915050565b5f6020820190508181035f830152612f4a8184612efa565b905092915050565b5f80fd5b5f73ffffffffffffffffffffffffffffffffffffffff82169050919050565b5f612f7f82612f56565b9050919050565b612f8f81612f75565b8114612f99575f80fd5b50565b5f81359050612faa81612f86565b92915050565b5f819050919050565b612fc281612fb0565b8114612fcc575f80fd5b50565b5f81359050612fdd81612fb9565b92915050565b5f8060408385031215612ff957612ff8612f52565b5b5f61300685828601612f9c565b925050602061301785828601612fcf565b9150509250929050565b5f8115159050919050565b61303581613021565b82525050565b5f60208201905061304e5f83018461302c565b92915050565b5f6020828403121561306957613068612f52565b5b5f61307684828501612f9c565b91505092915050565b5f806040838503121561309557613094612f52565b5b5f6130a285828601612fcf565b92505060206130b385828601612fcf565b9150509250929050565b6130c681612fb0565b82525050565b5f6020820190506130df5f8301846130bd565b92915050565b5f805f606084860312156130fc576130fb612f52565b5b5f61310986828701612f9c565b935050602061311a86828701612f9c565b925050604061312b86828701612fcf565b9150509250925092565b5f60ff82169050919050565b61314a81613135565b82525050565b5f6020820190506131635f830184613141565b92915050565b61317281613135565b811461317c575f80fd5b50565b5f8135905061318d81613169565b92915050565b5f805f805f8060c087890312156131ad576131ac612f52565b5b5f6131ba89828a0161317f565b96505060206131cb89828a0161317f565b95505060406131dc89828a0161317f565b94505060606131ed89828a0161317f565b93505060806131fe89828a0161317f565b92505060a061320f89828a0161317f565b9150509295509295509295565b61322581613021565b811461322f575f80fd5b50565b5f813590506132408161321c565b92915050565b5f806040838503121561325c5761325b612f52565b5b5f61326985828601612f9c565b925050602061327a85828601613232565b9150509250929050565b61328d81612f75565b82525050565b5f6020820190506132a65f830184613284565b92915050565b5f602082840312156132c1576132c0612f52565b5b5f6132ce84828501612fcf565b91505092915050565b5f610100820190506132eb5f83018b613141565b6132f8602083018a613141565b6133056040830189613141565b6133126060830188613141565b61331f6080830187613141565b61332c60a0830186613141565b61333960c0830185613141565b61334660e0830184613141565b9998505050505050505050565b5f806040838503121561336957613368612f52565b5b5f61337685828601612f9c565b925050602061338785828601612f9c565b9150509250929050565b5f819050919050565b5f6133b46133af6133aa84612f56565b613391565b612f56565b9050919050565b5f6133c58261339a565b9050919050565b5f6133d6826133bb565b9050919050565b6133e6816133cc565b82525050565b5f6020820190506133ff5f8301846133dd565b92915050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52602260045260245ffd5b5f600282049050600182168061344957607f821691505b60208210810361345c5761345b613405565b5b50919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601260045260245ffd5b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b5f6134c682612fb0565b91506134d183612fb0565b9250826134e1576134e0613462565b5b828204905092915050565b5f6134f682612fb0565b915061350183612fb0565b925082820261350f81612fb0565b915082820484148315176135265761352561348f565b5b5092915050565b7f6d6178427579416d6f756e74206d75737420626520686967686572207468616e5f8201527f2031250000000000000000000000000000000000000000000000000000000000602082015250565b5f613587602383612eb2565b91506135928261352d565b604082019050919050565b5f6020820190508181035f8301526135b48161357b565b9050919050565b7f6d617853656c6c416d6f756e74206d75737420626520686967686572207468615f8201527f6e20312500000000000000000000000000000000000000000000000000000000602082015250565b5f613615602483612eb2565b9150613620826135bb565b604082019050919050565b5f6020820190508181035f83015261364281613609565b9050919050565b5f61365382613135565b915061365e83613135565b9250828201905060ff8111156136775761367661348f565b5b92915050565b7f4d757374206b656570206665657320617420333025206f72206c6573730000005f82015250565b5f6136b1601d83612eb2565b91506136bc8261367d565b602082019050919050565b5f6020820190508181035f8301526136de816136a5565b9050919050565b5f6136ef82612fb0565b91506136fa83612fb0565b92508282019050808211156137125761371161348f565b5b92915050565b7f45524332303a2064656372656173656420616c6c6f77616e63652062656c6f775f8201527f207a65726f000000000000000000000000000000000000000000000000000000602082015250565b5f613772602583612eb2565b915061377d82613718565b604082019050919050565b5f6020820190508181035f83015261379f81613766565b9050919050565b7f4d757374206b65657020756e69737761705632506169720000000000000000005f82015250565b5f6137da601783612eb2565b91506137e5826137a6565b602082019050919050565b5f6020820190508181035f830152613807816137ce565b9050919050565b7f43616e6e6f7420736574206d617857616c6c6574206c6f776572207468616e205f8201527f3125000000000000000000000000000000000000000000000000000000000000602082015250565b5f613868602283612eb2565b91506138738261380e565b604082019050919050565b5f6020820190508181035f8301526138958161385c565b9050919050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f20615f8201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b5f6138f6602683612eb2565b91506139018261389c565b604082019050919050565b5f6020820190508181035f830152613923816138ea565b9050919050565b7f45524332303a20617070726f76652066726f6d20746865207a65726f206164645f8201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b5f613984602483612eb2565b915061398f8261392a565b604082019050919050565b5f6020820190508181035f8301526139b181613978565b9050919050565b7f45524332303a20617070726f766520746f20746865207a65726f2061646472655f8201527f7373000000000000000000000000000000000000000000000000000000000000602082015250565b5f613a12602283612eb2565b9150613a1d826139b8565b604082019050919050565b5f6020820190508181035f830152613a3f81613a06565b9050919050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65725f82015250565b5f613a7a602083612eb2565b9150613a8582613a46565b602082019050919050565b5f6020820190508181035f830152613aa781613a6e565b9050919050565b7f45524332303a20696e73756666696369656e7420616c6c6f77616e63650000005f82015250565b5f613ae2601d83612eb2565b9150613aed82613aae565b602082019050919050565b5f6020820190508181035f830152613b0f81613ad6565b9050919050565b7f54726164696e67206973206e6f74206163746976652e000000000000000000005f82015250565b5f613b4a601683612eb2565b9150613b5582613b16565b602082019050919050565b5f6020820190508181035f830152613b7781613b3e565b9050919050565b7f627579207472616e73666572206f766572206d617820616d6f756e74000000005f82015250565b5f613bb2601c83612eb2565b9150613bbd82613b7e565b602082019050919050565b5f6020820190508181035f830152613bdf81613ba6565b9050919050565b7f53656c6c207472616e73666572206f766572206d617820616d6f756e740000005f82015250565b5f613c1a601d83612eb2565b9150613c2582613be6565b602082019050919050565b5f6020820190508181035f830152613c4781613c0e565b9050919050565b7f4d61782077616c6c6574206578636565646564000000000000000000000000005f82015250565b5f613c82601383612eb2565b9150613c8d82613c4e565b602082019050919050565b5f6020820190508181035f830152613caf81613c76565b9050919050565b7f426c61636b6c69737465642061646472657373000000000000000000000000005f82015250565b5f613cea601383612eb2565b9150613cf582613cb6565b602082019050919050565b5f6020820190508181035f830152613d1781613cde565b9050919050565b5f613d2882612fb0565b9150613d3383612fb0565b9250828203905081811115613d4b57613d4a61348f565b5b92915050565b7f45524332303a207472616e736665722066726f6d20746865207a65726f2061645f8201527f6472657373000000000000000000000000000000000000000000000000000000602082015250565b5f613dab602583612eb2565b9150613db682613d51565b604082019050919050565b5f6020820190508181035f830152613dd881613d9f565b9050919050565b7f45524332303a207472616e7366657220746f20746865207a65726f20616464725f8201527f6573730000000000000000000000000000000000000000000000000000000000602082015250565b5f613e39602383612eb2565b9150613e4482613ddf565b604082019050919050565b5f6020820190508181035f830152613e6681613e2d565b9050919050565b7f45524332303a207472616e7366657220616d6f756e74206578636565647320625f8201527f616c616e63650000000000000000000000000000000000000000000000000000602082015250565b5f613ec7602683612eb2565b9150613ed282613e6d565b604082019050919050565b5f6020820190508181035f830152613ef481613ebb565b9050919050565b5f604082019050613f0e5f8301856130bd565b613f1b60208301846130bd565b9392505050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b7f4e487b71000000000000000000000000000000000000000000000000000000005f52603260045260245ffd5b5f81519050613f8a81612f86565b92915050565b5f60208284031215613fa557613fa4612f52565b5b5f613fb284828501613f7c565b91505092915050565b5f819050919050565b5f613fde613fd9613fd484613fbb565b613391565b612fb0565b9050919050565b613fee81613fc4565b82525050565b5f81519050919050565b5f82825260208201905092915050565b5f819050602082019050919050565b61402681612f75565b82525050565b5f614037838361401d565b60208301905092915050565b5f602082019050919050565b5f61405982613ff4565b6140638185613ffe565b935061406e8361400e565b805f5b8381101561409e578151614085888261402c565b975061409083614043565b925050600181019050614071565b5085935050505092915050565b5f60a0820190506140be5f8301886130bd565b6140cb6020830187613fe5565b81810360408301526140dd818661404f565b90506140ec6060830185613284565b6140f960808301846130bd565b9695505050505050565b5f60c0820190506141165f830189613284565b61412360208301886130bd565b6141306040830187613fe5565b61413d6060830186613fe5565b61414a6080830185613284565b61415760a08301846130bd565b979650505050505050565b5f8151905061417081612fb9565b92915050565b5f805f6060848603121561418d5761418c612f52565b5b5f61419a86828701614162565b93505060206141ab86828701614162565b92505060406141bc86828701614162565b915050925092509256fea26469706673582212209382b32cd5e7bfe641691040ed1685e8fbb058d8c4abdae0b97cb0cb8127f94664736f6c63430008140033
Deployed Bytecode Sourcemap
33401:12144:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;22333:100;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;24693:201;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;34707:63;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;37134:458;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;23462:108;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;34521:33;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;35042:46;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;34481:33;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;25474:261;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;23304:93;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;38011:882;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;26144:238;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;37879:124;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;33524:28;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;39711:126;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;36966:160;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;33878:31;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;23633:127;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;15639:103;;;;;;;;;;;;;:::i;:::-;;36642:316;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;39195:144;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;14998:87;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;33579:24;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;22552:104;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;34777:58;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;34561:27;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;26885:436;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;23966:193;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;33916:22;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;38901:132;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;39347:177;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;37600:271;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;34219:253;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;:::i;:::-;;;;;;;;39532:171;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;24222:151;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;39041:146;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;15897:201;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;34993:42;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;33475;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;22333:100;22387:13;22420:5;22413:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;22333:100;:::o;24693:201::-;24776:4;24793:13;24809:12;:10;:12::i;:::-;24793:28;;24832:32;24841:5;24848:7;24857:6;24832:8;:32::i;:::-;24882:4;24875:11;;;24693:201;;;;:::o;34707:63::-;;;;;;;;;;;;;;;;;;;;;;:::o;37134:458::-;14884:13;:11;:13::i;:::-;37296:3:::1;37280:13;:11;:13::i;:::-;:19;;;;:::i;:::-;37270:4;37257:9;37241:13;:11;:13::i;:::-;:25;;;;:::i;:::-;37240:34;;;;:::i;:::-;37239:61;;37231:109;;;;;;;;;;;;:::i;:::-;;;;;;;;;37417:3;37401:13;:11;:13::i;:::-;:19;;;;:::i;:::-;37391:4;37377:10;37361:13;:11;:13::i;:::-;:26;;;;:::i;:::-;37360:35;;;;:::i;:::-;37359:62;;37351:111;;;;;;;;;;;;:::i;:::-;;;;;;;;;37518:4;37505:9;37489:13;:11;:13::i;:::-;:25;;;;:::i;:::-;37488:34;;;;:::i;:::-;37473:12;:49;;;;37580:4;37566:10;37550:13;:11;:13::i;:::-;:26;;;;:::i;:::-;37549:35;;;;:::i;:::-;37533:13;:51;;;;37134:458:::0;;:::o;23462:108::-;23523:7;23550:12;;23543:19;;23462:108;:::o;34521:33::-;;;;:::o;35042:46::-;;;;;;;;;;;;;;;;;;;;;;:::o;34481:33::-;;;;:::o;25474:261::-;25571:4;25588:15;25606:12;:10;:12::i;:::-;25588:30;;25629:38;25645:4;25651:7;25660:6;25629:15;:38::i;:::-;25678:27;25688:4;25694:2;25698:6;25678:9;:27::i;:::-;25723:4;25716:11;;;25474:261;;;;;:::o;23304:93::-;23362:5;23387:2;23380:9;;23304:93;:::o;38011:882::-;14884:13;:11;:13::i;:::-;38281:16:::1;38257:5;:21;;;:40;;;;;;;;;;;;;;;;;;38332:16;38308:5;:21;;;:40;;;;;;;;;;;;;;;;;;38377:10;38359:5;:15;;;:28;;;;;;;;;;;;;;;;;;38467:5;:15;;;;;;;;;;;;38443:5;:21;;;;;;;;;;;;38419:5;:21;;;;;;;;;;;;:45;;;;:::i;:::-;:63;;;;:::i;:::-;38398:5;:18;;;:84;;;;;;;;;;;;;;;;;;38520:17;38495:5;:22;;;:42;;;;;;;;;;;;;;;;;;38573:17;38548:5;:22;;;:42;;;;;;;;;;;;;;;;;;38620:11;38601:5;:16;;;:30;;;;;;;;;;;;;;;;;;38714:5;:16;;;;;;;;;;;;38689:5;:22;;;;;;;;;;;;38664:5;:22;;;;;;;;;;;;:47;;;;:::i;:::-;:66;;;;:::i;:::-;38642:5;:19;;;:88;;;;;;;;;;;;;;;;;;38771:2;38749:5;:18;;;;;;;;;;;;:24;;;;38741:66;;;;;;;;;;;;:::i;:::-;;;;;;;;;38849:2;38826:5;:19;;;;;;;;;;;;:25;;;;38818:67;;;;;;;;;;;;:::i;:::-;;;;;;;;;38011:882:::0;;;;;;:::o;26144:238::-;26232:4;26249:13;26265:12;:10;:12::i;:::-;26249:28;;26288:64;26297:5;26304:7;26341:10;26313:25;26323:5;26330:7;26313:9;:25::i;:::-;:38;;;;:::i;:::-;26288:8;:64::i;:::-;26370:4;26363:11;;;26144:238;;;;:::o;37879:124::-;14884:13;:11;:13::i;:::-;37990:5:::1;37964:14;:23;37979:7;37964:23;;;;;;;;;;;;;;;;:31;;;;;;;;;;;;;;;;;;37879:124:::0;;:::o;33524:28::-;;;;;;;;;;;;;:::o;39711:126::-;39777:4;39801:19;:28;39821:7;39801:28;;;;;;;;;;;;;;;;;;;;;;;;;39794:35;;39711:126;;;:::o;36966:160::-;37048:4;14884:13;:11;:13::i;:::-;37087:9:::1;37065:19;:31;;;;37114:4;37107:11;;36966:160:::0;;;:::o;33878:31::-;;;;;;;;;;;;;:::o;23633:127::-;23707:7;23734:9;:18;23744:7;23734:18;;;;;;;;;;;;;;;;23727:25;;23633:127;;;:::o;15639:103::-;14884:13;:11;:13::i;:::-;15704:30:::1;15731:1;15704:18;:30::i;:::-;15639:103::o:0;36642:316::-;14884:13;:11;:13::i;:::-;36720:4:::1;36708:9;;:16;;;;;;;;;;;;;;;;;;36749:4;36735:11;;:18;;;;;;;;;;;;;;;;;;36780:4;36764:13;;:20;;;;;;;;;;;;;;;;;;36823:4;36795:10;:25;36814:4;36795:25;;;;;;;;;;;;;;;;:32;;;;;;;;;;;;;;;;;;36882:4;36838:26;:41;36873:4;36838:41;;;;;;;;;;;;;;;;:48;;;;;;;;;;;;;;;;;;36946:4;36897:31;:46;36937:4;36897:46;;;;;;;;;;;;;;;;:53;;;;;;;;;;;;;;;;;;36642:316:::0;:::o;39195:144::-;14884:13;:11;:13::i;:::-;39327:4:::1;39285:31;:39;39317:6;39285:39;;;;;;;;;;;;;;;;:46;;;;;;;;;;;;;;;;;;39195:144:::0;;:::o;14998:87::-;15044:7;15071:6;;;;;;;;;;;15064:13;;14998:87;:::o;33579:24::-;;;;;;;;;;;;;:::o;22552:104::-;22608:13;22641:7;22634:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;22552:104;:::o;34777:58::-;;;;;;;;;;;;;;;;;;;;;;:::o;34561:27::-;;;;:::o;26885:436::-;26978:4;26995:13;27011:12;:10;:12::i;:::-;26995:28;;27034:24;27061:25;27071:5;27078:7;27061:9;:25::i;:::-;27034:52;;27125:15;27105:16;:35;;27097:85;;;;;;;;;;;;:::i;:::-;;;;;;;;;27218:60;27227:5;27234:7;27262:15;27243:16;:34;27218:8;:60::i;:::-;27309:4;27302:11;;;;26885:436;;;;:::o;23966:193::-;24045:4;24062:13;24078:12;:10;:12::i;:::-;24062:28;;24101;24111:5;24118:2;24122:6;24101:9;:28::i;:::-;24147:4;24140:11;;;23966:193;;;;:::o;33916:22::-;;;;;;;;;;;;;:::o;38901:132::-;14884:13;:11;:13::i;:::-;39017:8:::1;38986:19;:28;39006:7;38986:28;;;;;;;;;;;;;;;;:39;;;;;;;;;;;;;;;;;;38901:132:::0;;:::o;39347:177::-;14884:13;:11;:13::i;:::-;39440::::1;;;;;;;;;;;39432:21;;:4;:21;;::::0;39424:57:::1;;;;;;;;;;;;:::i;:::-;;;;;;;;;39511:5;39492:10;:16;39503:4;39492:16;;;;;;;;;;;;;;;;:24;;;;;;;;;;;;;;;;;;39347:177:::0;;:::o;37600:271::-;14884:13;:11;:13::i;:::-;37753:3:::1;37737:13;:11;:13::i;:::-;:19;;;;:::i;:::-;37727:4;37710:13;37694;:11;:13::i;:::-;:29;;;;:::i;:::-;37693:38;;;;:::i;:::-;37692:65;;37684:112;;;;;;;;;;;;:::i;:::-;;;;;;;;;37859:4;37842:13;37826;:11;:13::i;:::-;:29;;;;:::i;:::-;37825:38;;;;:::i;:::-;37807:15;:56;;;;37600:271:::0;:::o;34219:253::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;39532:171::-;14884:13;:11;:13::i;:::-;39646:16:::1;39628:15;;:34;;;;;;;;;;;;;;;;;;39685:10;39673:9;;:22;;;;;;;;;;;;;;;;;;39532:171:::0;;:::o;24222:151::-;24311:7;24338:11;:18;24350:5;24338:18;;;;;;;;;;;;;;;:27;24357:7;24338:27;;;;;;;;;;;;;;;;24331:34;;24222:151;;;;:::o;39041:146::-;14884:13;:11;:13::i;:::-;39171:8:::1;39133:26;:35;39160:7;39133:35;;;;;;;;;;;;;;;;:46;;;;;;;;;;;;;;;;;;39041:146:::0;;:::o;15897:201::-;14884:13;:11;:13::i;:::-;16006:1:::1;15986:22;;:8;:22;;::::0;15978:73:::1;;;;;;;;;;;;:::i;:::-;;;;;;;;;16062:28;16081:8;16062:18;:28::i;:::-;15897:201:::0;:::o;34993:42::-;;;;;;;;;;;;;;;;;;;;;;:::o;33475:::-;;;:::o;13549:98::-;13602:7;13629:10;13622:17;;13549:98;:::o;30878:346::-;30997:1;30980:19;;:5;:19;;;30972:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;31078:1;31059:21;;:7;:21;;;31051:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;31162:6;31132:11;:18;31144:5;31132:18;;;;;;;;;;;;;;;:27;31151:7;31132:27;;;;;;;;;;;;;;;:36;;;;31200:7;31184:32;;31193:5;31184:32;;;31209:6;31184:32;;;;;;:::i;:::-;;;;;;;;30878:346;;;:::o;15163:132::-;15238:12;:10;:12::i;:::-;15227:23;;:7;:5;:7::i;:::-;:23;;;15219:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;15163:132::o;31515:419::-;31616:24;31643:25;31653:5;31660:7;31643:9;:25::i;:::-;31616:52;;31703:17;31683:16;:37;31679:248;;31765:6;31745:16;:26;;31737:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;31849:51;31858:5;31865:7;31893:6;31874:16;:25;31849:8;:51::i;:::-;31679:248;31605:329;31515:419;;;:::o;39845:3078::-;39992:1;39982:6;:11;39978:102;;40010:37;40026:6;40034:9;40045:1;40010:15;:37::i;:::-;40062:7;;39978:102;40120:7;:5;:7::i;:::-;40110:17;;:6;:17;;;;:54;;;;;40157:7;:5;:7::i;:::-;40144:20;;:9;:20;;;;40110:54;:82;;;;;40182:10;;;;;;;;;;;40181:11;40110:82;40092:920;;;40224:9;;;;;;;;;;;40219:147;;40262:19;:27;40282:6;40262:27;;;;;;;;;;;;;;;;;;;;;;;;;:61;;;;40293:19;:30;40313:9;40293:30;;;;;;;;;;;;;;;;;;;;;;;;;40262:61;40254:96;;;;;;;;;;;;:::i;:::-;;;;;;;;;40219:147;40384:10;:18;40395:6;40384:18;;;;;;;;;;;;;;;;;;;;;;;;;:65;;;;;40407:31;:42;40439:9;40407:42;;;;;;;;;;;;;;;;;;;;;;;;;40406:43;40384:65;40380:346;;;40488:12;;40478:6;:22;;40470:63;;;;;;;;;;;;:::i;:::-;;;;;;;;;40380:346;;;40559:10;:21;40570:9;40559:21;;;;;;;;;;;;;;;;;;;;;;;;;:65;;;;;40585:31;:39;40617:6;40585:39;;;;;;;;;;;;;;;;;;;;;;;;;40584:40;40559:65;40555:171;;;40663:13;;40653:6;:23;;40645:65;;;;;;;;;;;;:::i;:::-;;;;;;;;;40555:171;40380:346;40747:26;:37;40774:9;40747:37;;;;;;;;;;;;;;;;;;;;;;;;;40742:159;;40846:15;;40822:20;40832:9;40822;:20::i;:::-;40813:6;:29;;;;:::i;:::-;:48;;40805:80;;;;;;;;;;;;:::i;:::-;;;;;;;;;40742:159;40924:14;:22;40939:6;40924:22;;;;;;;;;;;;;;;;;;;;;;;;;40923:23;:53;;;;;40951:14;:25;40966:9;40951:25;;;;;;;;;;;;;;;;;;;;;;;;;40950:26;40923:53;40915:85;;;;;;;;;;;;:::i;:::-;;;;;;;;;40092:920;41024:28;41055:24;41073:4;41055:9;:24::i;:::-;41024:55;;41092:12;41131:19;;41107:20;:43;;41092:58;;41181:7;:35;;;;;41205:11;;;;;;;;;;;41181:35;:63;;;;;41234:10;;;;;;;;;;;41233:11;41181:63;:101;;;;;41261:10;:21;41272:9;41261:21;;;;;;;;;;;;;;;;;;;;;;;;;41181:101;:146;;;;;41300:19;:27;41320:6;41300:27;;;;;;;;;;;;;;;;;;;;;;;;;41299:28;41181:146;:194;;;;;41345:19;:30;41365:9;41345:30;;;;;;;;;;;;;;;;;;;;;;;;;41344:31;41181:194;41163:326;;;41415:4;41402:10;;:17;;;;;;;;;;;;;;;;;;41434:10;:8;:10::i;:::-;41472:5;41459:10;;:18;;;;;;;;;;;;;;;;;;41163:326;41501:12;41517:10;;;;;;;;;;;41516:11;41501:26;;41629:19;:27;41649:6;41629:27;;;;;;;;;;;;;;;;;;;;;;;;;:61;;;;41660:19;:30;41680:9;41660:30;;;;;;;;;;;;;;;;;;;;;;;;;41629:61;41625:109;;;41717:5;41707:15;;41625:109;41824:7;41820:1041;;;41848:12;41883:10;:21;41894:9;41883:21;;;;;;;;;;;;;;;;;;;;;;;;;:48;;;;;41930:1;41908:5;:19;;;;;;;;;;;;:23;;;41883:48;41879:831;;;41959:40;41995:3;41959:31;41970:5;:19;;;;;;;;;;;;41959:31;;:6;:10;;:31;;;;:::i;:::-;:35;;:40;;;;:::i;:::-;41952:47;;42072:5;:19;;;;;;;;;;;;42040:51;;42047:5;:22;;;;;;;;;;;;42040:29;;:4;:29;;;;:::i;:::-;:51;;;;:::i;:::-;42018:18;;:73;;;;;;;:::i;:::-;;;;;;;;42164:5;:19;;;;;;;;;;;;42132:51;;42139:5;:22;;;;;;;;;;;;42132:29;;:4;:29;;;;:::i;:::-;:51;;;;:::i;:::-;42110:18;;:73;;;;;;;:::i;:::-;;;;;;;;42244:5;:19;;;;;;;;;;;;42218:45;;42225:5;:16;;;;;;;;;;;;42218:23;;:4;:23;;;;:::i;:::-;:45;;;;:::i;:::-;42202:12;;:61;;;;;;;:::i;:::-;;;;;;;;41879:831;;;42325:10;:18;42336:6;42325:18;;;;;;;;;;;;;;;;;;;;;;;;;:44;;;;;42368:1;42347:5;:18;;;;;;;;;;;;:22;;;42325:44;42321:389;;;42397:39;42432:3;42397:30;42408:5;:18;;;;;;;;;;;;42397:30;;:6;:10;;:30;;;;:::i;:::-;:34;;:39;;;;:::i;:::-;42390:46;;42508:5;:18;;;;;;;;;;;;42477:49;;42484:5;:21;;;;;;;;;;;;42477:28;;:4;:28;;;;:::i;:::-;:49;;;;:::i;:::-;42455:18;;:71;;;;;;;:::i;:::-;;;;;;;;42598:5;:18;;;;;;;;;;;;42567:49;;42574:5;:21;;;;;;;;;;;;42567:28;;:4;:28;;;;:::i;:::-;:49;;;;:::i;:::-;42545:18;;:71;;;;;;;:::i;:::-;;;;;;;;42676:5;:18;;;;;;;;;;;;42651:43;;42658:5;:15;;;;;;;;;;;;42651:22;;:4;:22;;;;:::i;:::-;:43;;;;:::i;:::-;42635:12;;:59;;;;;;;:::i;:::-;;;;;;;;42321:389;41879:831;42737:1;42730:4;:8;42726:93;;;42759:44;42775:6;42791:4;42798;42759:15;:44::i;:::-;42726:93;42845:4;42835:14;;;;;:::i;:::-;;;41833:1028;41820:1041;42873:42;42889:6;42897:9;42908:6;42873:15;:42::i;:::-;39967:2956;;;39845:3078;;;;:::o;16258:191::-;16332:16;16351:6;;;;;;;;;;;16332:25;;16377:8;16368:6;;:17;;;;;;;;;;;;;;;;;;16432:8;16401:40;;16422:8;16401:40;;;;;;;;;;;;16321:128;16258:191;:::o;27791:806::-;27904:1;27888:18;;:4;:18;;;27880:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;27981:1;27967:16;;:2;:16;;;27959:64;;;;;;;;;;;;:::i;:::-;;;;;;;;;28036:38;28057:4;28063:2;28067:6;28036:20;:38::i;:::-;28087:19;28109:9;:15;28119:4;28109:15;;;;;;;;;;;;;;;;28087:37;;28158:6;28143:11;:21;;28135:72;;;;;;;;;;;;:::i;:::-;;;;;;;;;28275:6;28261:11;:20;28243:9;:15;28253:4;28243:15;;;;;;;;;;;;;;;:38;;;;28478:6;28461:9;:13;28471:2;28461:13;;;;;;;;;;;;;;;;:23;;;;;;;;;;;28528:2;28513:26;;28522:4;28513:26;;;28532:6;28513:26;;;;;;:::i;:::-;;;;;;;;28552:37;28572:4;28578:2;28582:6;28552:19;:37::i;:::-;27869:728;27791:806;;;:::o;43932:1610::-;43971:28;44002:24;44020:4;44002:9;:24::i;:::-;43971:55;;44037:14;44096:12;;44075:18;;44054;;:39;;;;:::i;:::-;:54;;;;:::i;:::-;44037:71;;44149:1;44125:20;:25;:40;;;;44164:1;44154:6;:11;44125:40;44121:79;;;44182:7;;;;44121:79;44239:19;;44216:20;:42;44212:117;;;44298:19;;44275:42;;44212:117;44390:23;44469:1;44460:6;44439:18;;44416:20;:41;;;;:::i;:::-;:50;;;;:::i;:::-;:54;;;;:::i;:::-;44390:80;;44481:26;44510:41;44535:15;44510:20;:24;;:41;;;;:::i;:::-;44481:70;;44564:25;44592:21;44564:49;;44626:36;44643:18;44626:16;:36::i;:::-;44675:18;44696:44;44722:17;44696:21;:25;;:44;;;;:::i;:::-;44675:65;;44753:23;44779:46;44818:6;44779:34;44794:18;;44779:10;:14;;:34;;;;:::i;:::-;:38;;:46;;;;:::i;:::-;44753:72;;44836:17;44856:40;44889:6;44856:28;44871:12;;44856:10;:14;;:28;;;;:::i;:::-;:32;;:40;;;;:::i;:::-;44836:60;;44907:23;44965:9;44947:15;:27;;;;:::i;:::-;44933:10;:42;;;;:::i;:::-;44907:68;;45009:1;44988:18;:22;;;;45042:1;45021:18;:22;;;;45069:1;45054:12;:16;;;;45105:1;45087:15;:19;:42;;;;;45128:1;45110:15;:19;45087:42;45083:182;;;45146:46;45159:15;45176;45146:12;:46::i;:::-;45212:51;45227:18;45247:15;45212:51;;;;;;;:::i;:::-;;;;;;;;45083:182;45333:1;45288:42;45314:15;45288:21;:25;;:42;;;;:::i;:::-;:46;45285:138;;;45358:9;;;;;;;;;;;45350:27;;:71;45378:42;45404:15;45378:21;:25;;:42;;;;:::i;:::-;45350:71;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;45285:138;45460:1;45436:21;:25;45433:102;;;45485:15;;;;;;;;;;;45477:33;;:56;45511:21;45477:56;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;45433:102;43960:1582;;;;;;;;;43932:1610;:::o;9545:98::-;9603:7;9634:1;9630;:5;;;;:::i;:::-;9623:12;;9545:98;;;;:::o;9944:::-;10002:7;10033:1;10029;:5;;;;:::i;:::-;10022:12;;9944:98;;;;:::o;32534:91::-;;;;:::o;33229:90::-;;;;:::o;9188:98::-;9246:7;9277:1;9273;:5;;;;:::i;:::-;9266:12;;9188:98;;;;:::o;42931:550::-;43053:21;43091:1;43077:16;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;43053:40;;43122:4;43104;43109:1;43104:7;;;;;;;;:::i;:::-;;;;;;;:23;;;;;;;;;;;43148:6;:11;;;:13;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;43138:4;43143:1;43138:7;;;;;;;;:::i;:::-;;;;;;;:23;;;;;;;;;;;43174:49;43191:4;43206:6;43215:7;43174:8;:49::i;:::-;43262:6;:57;;;43334:7;43356:1;43400:4;43427;43447:15;43262:211;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;42982:499;42931:550;:::o;43489:435::-;43633:49;43650:4;43665:6;43674:7;43633:8;:49::i;:::-;43725:6;:22;;;43755:9;43788:4;43808:7;43830:1;43846;43870:4;43890:15;43725:191;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;43489:435;;:::o;7:99:1:-;59:6;93:5;87:12;77:22;;7:99;;;:::o;112:169::-;196:11;230:6;225:3;218:19;270:4;265:3;261:14;246:29;;112:169;;;;:::o;287:246::-;368:1;378:113;392:6;389:1;386:13;378:113;;;477:1;472:3;468:11;462:18;458:1;453:3;449:11;442:39;414:2;411:1;407:10;402:15;;378:113;;;525:1;516:6;511:3;507:16;500:27;349:184;287:246;;;:::o;539:102::-;580:6;631:2;627:7;622:2;615:5;611:14;607:28;597:38;;539:102;;;:::o;647:377::-;735:3;763:39;796:5;763:39;:::i;:::-;818:71;882:6;877:3;818:71;:::i;:::-;811:78;;898:65;956:6;951:3;944:4;937:5;933:16;898:65;:::i;:::-;988:29;1010:6;988:29;:::i;:::-;983:3;979:39;972:46;;739:285;647:377;;;;:::o;1030:313::-;1143:4;1181:2;1170:9;1166:18;1158:26;;1230:9;1224:4;1220:20;1216:1;1205:9;1201:17;1194:47;1258:78;1331:4;1322:6;1258:78;:::i;:::-;1250:86;;1030:313;;;;:::o;1430:117::-;1539:1;1536;1529:12;1676:126;1713:7;1753:42;1746:5;1742:54;1731:65;;1676:126;;;:::o;1808:96::-;1845:7;1874:24;1892:5;1874:24;:::i;:::-;1863:35;;1808:96;;;:::o;1910:122::-;1983:24;2001:5;1983:24;:::i;:::-;1976:5;1973:35;1963:63;;2022:1;2019;2012:12;1963:63;1910:122;:::o;2038:139::-;2084:5;2122:6;2109:20;2100:29;;2138:33;2165:5;2138:33;:::i;:::-;2038:139;;;;:::o;2183:77::-;2220:7;2249:5;2238:16;;2183:77;;;:::o;2266:122::-;2339:24;2357:5;2339:24;:::i;:::-;2332:5;2329:35;2319:63;;2378:1;2375;2368:12;2319:63;2266:122;:::o;2394:139::-;2440:5;2478:6;2465:20;2456:29;;2494:33;2521:5;2494:33;:::i;:::-;2394:139;;;;:::o;2539:474::-;2607:6;2615;2664:2;2652:9;2643:7;2639:23;2635:32;2632:119;;;2670:79;;:::i;:::-;2632:119;2790:1;2815:53;2860:7;2851:6;2840:9;2836:22;2815:53;:::i;:::-;2805:63;;2761:117;2917:2;2943:53;2988:7;2979:6;2968:9;2964:22;2943:53;:::i;:::-;2933:63;;2888:118;2539:474;;;;;:::o;3019:90::-;3053:7;3096:5;3089:13;3082:21;3071:32;;3019:90;;;:::o;3115:109::-;3196:21;3211:5;3196:21;:::i;:::-;3191:3;3184:34;3115:109;;:::o;3230:210::-;3317:4;3355:2;3344:9;3340:18;3332:26;;3368:65;3430:1;3419:9;3415:17;3406:6;3368:65;:::i;:::-;3230:210;;;;:::o;3446:329::-;3505:6;3554:2;3542:9;3533:7;3529:23;3525:32;3522:119;;;3560:79;;:::i;:::-;3522:119;3680:1;3705:53;3750:7;3741:6;3730:9;3726:22;3705:53;:::i;:::-;3695:63;;3651:117;3446:329;;;;:::o;3781:474::-;3849:6;3857;3906:2;3894:9;3885:7;3881:23;3877:32;3874:119;;;3912:79;;:::i;:::-;3874:119;4032:1;4057:53;4102:7;4093:6;4082:9;4078:22;4057:53;:::i;:::-;4047:63;;4003:117;4159:2;4185:53;4230:7;4221:6;4210:9;4206:22;4185:53;:::i;:::-;4175:63;;4130:118;3781:474;;;;;:::o;4261:118::-;4348:24;4366:5;4348:24;:::i;:::-;4343:3;4336:37;4261:118;;:::o;4385:222::-;4478:4;4516:2;4505:9;4501:18;4493:26;;4529:71;4597:1;4586:9;4582:17;4573:6;4529:71;:::i;:::-;4385:222;;;;:::o;4613:619::-;4690:6;4698;4706;4755:2;4743:9;4734:7;4730:23;4726:32;4723:119;;;4761:79;;:::i;:::-;4723:119;4881:1;4906:53;4951:7;4942:6;4931:9;4927:22;4906:53;:::i;:::-;4896:63;;4852:117;5008:2;5034:53;5079:7;5070:6;5059:9;5055:22;5034:53;:::i;:::-;5024:63;;4979:118;5136:2;5162:53;5207:7;5198:6;5187:9;5183:22;5162:53;:::i;:::-;5152:63;;5107:118;4613:619;;;;;:::o;5238:86::-;5273:7;5313:4;5306:5;5302:16;5291:27;;5238:86;;;:::o;5330:112::-;5413:22;5429:5;5413:22;:::i;:::-;5408:3;5401:35;5330:112;;:::o;5448:214::-;5537:4;5575:2;5564:9;5560:18;5552:26;;5588:67;5652:1;5641:9;5637:17;5628:6;5588:67;:::i;:::-;5448:214;;;;:::o;5668:118::-;5739:22;5755:5;5739:22;:::i;:::-;5732:5;5729:33;5719:61;;5776:1;5773;5766:12;5719:61;5668:118;:::o;5792:135::-;5836:5;5874:6;5861:20;5852:29;;5890:31;5915:5;5890:31;:::i;:::-;5792:135;;;;:::o;5933:1033::-;6025:6;6033;6041;6049;6057;6065;6114:3;6102:9;6093:7;6089:23;6085:33;6082:120;;;6121:79;;:::i;:::-;6082:120;6241:1;6266:51;6309:7;6300:6;6289:9;6285:22;6266:51;:::i;:::-;6256:61;;6212:115;6366:2;6392:51;6435:7;6426:6;6415:9;6411:22;6392:51;:::i;:::-;6382:61;;6337:116;6492:2;6518:51;6561:7;6552:6;6541:9;6537:22;6518:51;:::i;:::-;6508:61;;6463:116;6618:2;6644:51;6687:7;6678:6;6667:9;6663:22;6644:51;:::i;:::-;6634:61;;6589:116;6744:3;6771:51;6814:7;6805:6;6794:9;6790:22;6771:51;:::i;:::-;6761:61;;6715:117;6871:3;6898:51;6941:7;6932:6;6921:9;6917:22;6898:51;:::i;:::-;6888:61;;6842:117;5933:1033;;;;;;;;:::o;6972:116::-;7042:21;7057:5;7042:21;:::i;:::-;7035:5;7032:32;7022:60;;7078:1;7075;7068:12;7022:60;6972:116;:::o;7094:133::-;7137:5;7175:6;7162:20;7153:29;;7191:30;7215:5;7191:30;:::i;:::-;7094:133;;;;:::o;7233:468::-;7298:6;7306;7355:2;7343:9;7334:7;7330:23;7326:32;7323:119;;;7361:79;;:::i;:::-;7323:119;7481:1;7506:53;7551:7;7542:6;7531:9;7527:22;7506:53;:::i;:::-;7496:63;;7452:117;7608:2;7634:50;7676:7;7667:6;7656:9;7652:22;7634:50;:::i;:::-;7624:60;;7579:115;7233:468;;;;;:::o;7707:118::-;7794:24;7812:5;7794:24;:::i;:::-;7789:3;7782:37;7707:118;;:::o;7831:222::-;7924:4;7962:2;7951:9;7947:18;7939:26;;7975:71;8043:1;8032:9;8028:17;8019:6;7975:71;:::i;:::-;7831:222;;;;:::o;8059:329::-;8118:6;8167:2;8155:9;8146:7;8142:23;8138:32;8135:119;;;8173:79;;:::i;:::-;8135:119;8293:1;8318:53;8363:7;8354:6;8343:9;8339:22;8318:53;:::i;:::-;8308:63;;8264:117;8059:329;;;;:::o;8394:933::-;8651:4;8689:3;8678:9;8674:19;8666:27;;8703:67;8767:1;8756:9;8752:17;8743:6;8703:67;:::i;:::-;8780:68;8844:2;8833:9;8829:18;8820:6;8780:68;:::i;:::-;8858;8922:2;8911:9;8907:18;8898:6;8858:68;:::i;:::-;8936;9000:2;8989:9;8985:18;8976:6;8936:68;:::i;:::-;9014:69;9078:3;9067:9;9063:19;9054:6;9014:69;:::i;:::-;9093;9157:3;9146:9;9142:19;9133:6;9093:69;:::i;:::-;9172;9236:3;9225:9;9221:19;9212:6;9172:69;:::i;:::-;9251;9315:3;9304:9;9300:19;9291:6;9251:69;:::i;:::-;8394:933;;;;;;;;;;;:::o;9333:474::-;9401:6;9409;9458:2;9446:9;9437:7;9433:23;9429:32;9426:119;;;9464:79;;:::i;:::-;9426:119;9584:1;9609:53;9654:7;9645:6;9634:9;9630:22;9609:53;:::i;:::-;9599:63;;9555:117;9711:2;9737:53;9782:7;9773:6;9762:9;9758:22;9737:53;:::i;:::-;9727:63;;9682:118;9333:474;;;;;:::o;9813:60::-;9841:3;9862:5;9855:12;;9813:60;;;:::o;9879:142::-;9929:9;9962:53;9980:34;9989:24;10007:5;9989:24;:::i;:::-;9980:34;:::i;:::-;9962:53;:::i;:::-;9949:66;;9879:142;;;:::o;10027:126::-;10077:9;10110:37;10141:5;10110:37;:::i;:::-;10097:50;;10027:126;;;:::o;10159:152::-;10235:9;10268:37;10299:5;10268:37;:::i;:::-;10255:50;;10159:152;;;:::o;10317:183::-;10430:63;10487:5;10430:63;:::i;:::-;10425:3;10418:76;10317:183;;:::o;10506:274::-;10625:4;10663:2;10652:9;10648:18;10640:26;;10676:97;10770:1;10759:9;10755:17;10746:6;10676:97;:::i;:::-;10506:274;;;;:::o;10786:180::-;10834:77;10831:1;10824:88;10931:4;10928:1;10921:15;10955:4;10952:1;10945:15;10972:320;11016:6;11053:1;11047:4;11043:12;11033:22;;11100:1;11094:4;11090:12;11121:18;11111:81;;11177:4;11169:6;11165:17;11155:27;;11111:81;11239:2;11231:6;11228:14;11208:18;11205:38;11202:84;;11258:18;;:::i;:::-;11202:84;11023:269;10972:320;;;:::o;11298:180::-;11346:77;11343:1;11336:88;11443:4;11440:1;11433:15;11467:4;11464:1;11457:15;11484:180;11532:77;11529:1;11522:88;11629:4;11626:1;11619:15;11653:4;11650:1;11643:15;11670:185;11710:1;11727:20;11745:1;11727:20;:::i;:::-;11722:25;;11761:20;11779:1;11761:20;:::i;:::-;11756:25;;11800:1;11790:35;;11805:18;;:::i;:::-;11790:35;11847:1;11844;11840:9;11835:14;;11670:185;;;;:::o;11861:410::-;11901:7;11924:20;11942:1;11924:20;:::i;:::-;11919:25;;11958:20;11976:1;11958:20;:::i;:::-;11953:25;;12013:1;12010;12006:9;12035:30;12053:11;12035:30;:::i;:::-;12024:41;;12214:1;12205:7;12201:15;12198:1;12195:22;12175:1;12168:9;12148:83;12125:139;;12244:18;;:::i;:::-;12125:139;11909:362;11861:410;;;;:::o;12277:222::-;12417:34;12413:1;12405:6;12401:14;12394:58;12486:5;12481:2;12473:6;12469:15;12462:30;12277:222;:::o;12505:366::-;12647:3;12668:67;12732:2;12727:3;12668:67;:::i;:::-;12661:74;;12744:93;12833:3;12744:93;:::i;:::-;12862:2;12857:3;12853:12;12846:19;;12505:366;;;:::o;12877:419::-;13043:4;13081:2;13070:9;13066:18;13058:26;;13130:9;13124:4;13120:20;13116:1;13105:9;13101:17;13094:47;13158:131;13284:4;13158:131;:::i;:::-;13150:139;;12877:419;;;:::o;13302:223::-;13442:34;13438:1;13430:6;13426:14;13419:58;13511:6;13506:2;13498:6;13494:15;13487:31;13302:223;:::o;13531:366::-;13673:3;13694:67;13758:2;13753:3;13694:67;:::i;:::-;13687:74;;13770:93;13859:3;13770:93;:::i;:::-;13888:2;13883:3;13879:12;13872:19;;13531:366;;;:::o;13903:419::-;14069:4;14107:2;14096:9;14092:18;14084:26;;14156:9;14150:4;14146:20;14142:1;14131:9;14127:17;14120:47;14184:131;14310:4;14184:131;:::i;:::-;14176:139;;13903:419;;;:::o;14328:188::-;14366:3;14385:18;14401:1;14385:18;:::i;:::-;14380:23;;14417:18;14433:1;14417:18;:::i;:::-;14412:23;;14458:1;14455;14451:9;14444:16;;14481:4;14476:3;14473:13;14470:39;;;14489:18;;:::i;:::-;14470:39;14328:188;;;;:::o;14522:179::-;14662:31;14658:1;14650:6;14646:14;14639:55;14522:179;:::o;14707:366::-;14849:3;14870:67;14934:2;14929:3;14870:67;:::i;:::-;14863:74;;14946:93;15035:3;14946:93;:::i;:::-;15064:2;15059:3;15055:12;15048:19;;14707:366;;;:::o;15079:419::-;15245:4;15283:2;15272:9;15268:18;15260:26;;15332:9;15326:4;15322:20;15318:1;15307:9;15303:17;15296:47;15360:131;15486:4;15360:131;:::i;:::-;15352:139;;15079:419;;;:::o;15504:191::-;15544:3;15563:20;15581:1;15563:20;:::i;:::-;15558:25;;15597:20;15615:1;15597:20;:::i;:::-;15592:25;;15640:1;15637;15633:9;15626:16;;15661:3;15658:1;15655:10;15652:36;;;15668:18;;:::i;:::-;15652:36;15504:191;;;;:::o;15701:224::-;15841:34;15837:1;15829:6;15825:14;15818:58;15910:7;15905:2;15897:6;15893:15;15886:32;15701:224;:::o;15931:366::-;16073:3;16094:67;16158:2;16153:3;16094:67;:::i;:::-;16087:74;;16170:93;16259:3;16170:93;:::i;:::-;16288:2;16283:3;16279:12;16272:19;;15931:366;;;:::o;16303:419::-;16469:4;16507:2;16496:9;16492:18;16484:26;;16556:9;16550:4;16546:20;16542:1;16531:9;16527:17;16520:47;16584:131;16710:4;16584:131;:::i;:::-;16576:139;;16303:419;;;:::o;16728:173::-;16868:25;16864:1;16856:6;16852:14;16845:49;16728:173;:::o;16907:366::-;17049:3;17070:67;17134:2;17129:3;17070:67;:::i;:::-;17063:74;;17146:93;17235:3;17146:93;:::i;:::-;17264:2;17259:3;17255:12;17248:19;;16907:366;;;:::o;17279:419::-;17445:4;17483:2;17472:9;17468:18;17460:26;;17532:9;17526:4;17522:20;17518:1;17507:9;17503:17;17496:47;17560:131;17686:4;17560:131;:::i;:::-;17552:139;;17279:419;;;:::o;17704:221::-;17844:34;17840:1;17832:6;17828:14;17821:58;17913:4;17908:2;17900:6;17896:15;17889:29;17704:221;:::o;17931:366::-;18073:3;18094:67;18158:2;18153:3;18094:67;:::i;:::-;18087:74;;18170:93;18259:3;18170:93;:::i;:::-;18288:2;18283:3;18279:12;18272:19;;17931:366;;;:::o;18303:419::-;18469:4;18507:2;18496:9;18492:18;18484:26;;18556:9;18550:4;18546:20;18542:1;18531:9;18527:17;18520:47;18584:131;18710:4;18584:131;:::i;:::-;18576:139;;18303:419;;;:::o;18728:225::-;18868:34;18864:1;18856:6;18852:14;18845:58;18937:8;18932:2;18924:6;18920:15;18913:33;18728:225;:::o;18959:366::-;19101:3;19122:67;19186:2;19181:3;19122:67;:::i;:::-;19115:74;;19198:93;19287:3;19198:93;:::i;:::-;19316:2;19311:3;19307:12;19300:19;;18959:366;;;:::o;19331:419::-;19497:4;19535:2;19524:9;19520:18;19512:26;;19584:9;19578:4;19574:20;19570:1;19559:9;19555:17;19548:47;19612:131;19738:4;19612:131;:::i;:::-;19604:139;;19331:419;;;:::o;19756:223::-;19896:34;19892:1;19884:6;19880:14;19873:58;19965:6;19960:2;19952:6;19948:15;19941:31;19756:223;:::o;19985:366::-;20127:3;20148:67;20212:2;20207:3;20148:67;:::i;:::-;20141:74;;20224:93;20313:3;20224:93;:::i;:::-;20342:2;20337:3;20333:12;20326:19;;19985:366;;;:::o;20357:419::-;20523:4;20561:2;20550:9;20546:18;20538:26;;20610:9;20604:4;20600:20;20596:1;20585:9;20581:17;20574:47;20638:131;20764:4;20638:131;:::i;:::-;20630:139;;20357:419;;;:::o;20782:221::-;20922:34;20918:1;20910:6;20906:14;20899:58;20991:4;20986:2;20978:6;20974:15;20967:29;20782:221;:::o;21009:366::-;21151:3;21172:67;21236:2;21231:3;21172:67;:::i;:::-;21165:74;;21248:93;21337:3;21248:93;:::i;:::-;21366:2;21361:3;21357:12;21350:19;;21009:366;;;:::o;21381:419::-;21547:4;21585:2;21574:9;21570:18;21562:26;;21634:9;21628:4;21624:20;21620:1;21609:9;21605:17;21598:47;21662:131;21788:4;21662:131;:::i;:::-;21654:139;;21381:419;;;:::o;21806:182::-;21946:34;21942:1;21934:6;21930:14;21923:58;21806:182;:::o;21994:366::-;22136:3;22157:67;22221:2;22216:3;22157:67;:::i;:::-;22150:74;;22233:93;22322:3;22233:93;:::i;:::-;22351:2;22346:3;22342:12;22335:19;;21994:366;;;:::o;22366:419::-;22532:4;22570:2;22559:9;22555:18;22547:26;;22619:9;22613:4;22609:20;22605:1;22594:9;22590:17;22583:47;22647:131;22773:4;22647:131;:::i;:::-;22639:139;;22366:419;;;:::o;22791:179::-;22931:31;22927:1;22919:6;22915:14;22908:55;22791:179;:::o;22976:366::-;23118:3;23139:67;23203:2;23198:3;23139:67;:::i;:::-;23132:74;;23215:93;23304:3;23215:93;:::i;:::-;23333:2;23328:3;23324:12;23317:19;;22976:366;;;:::o;23348:419::-;23514:4;23552:2;23541:9;23537:18;23529:26;;23601:9;23595:4;23591:20;23587:1;23576:9;23572:17;23565:47;23629:131;23755:4;23629:131;:::i;:::-;23621:139;;23348:419;;;:::o;23773:172::-;23913:24;23909:1;23901:6;23897:14;23890:48;23773:172;:::o;23951:366::-;24093:3;24114:67;24178:2;24173:3;24114:67;:::i;:::-;24107:74;;24190:93;24279:3;24190:93;:::i;:::-;24308:2;24303:3;24299:12;24292:19;;23951:366;;;:::o;24323:419::-;24489:4;24527:2;24516:9;24512:18;24504:26;;24576:9;24570:4;24566:20;24562:1;24551:9;24547:17;24540:47;24604:131;24730:4;24604:131;:::i;:::-;24596:139;;24323:419;;;:::o;24748:178::-;24888:30;24884:1;24876:6;24872:14;24865:54;24748:178;:::o;24932:366::-;25074:3;25095:67;25159:2;25154:3;25095:67;:::i;:::-;25088:74;;25171:93;25260:3;25171:93;:::i;:::-;25289:2;25284:3;25280:12;25273:19;;24932:366;;;:::o;25304:419::-;25470:4;25508:2;25497:9;25493:18;25485:26;;25557:9;25551:4;25547:20;25543:1;25532:9;25528:17;25521:47;25585:131;25711:4;25585:131;:::i;:::-;25577:139;;25304:419;;;:::o;25729:179::-;25869:31;25865:1;25857:6;25853:14;25846:55;25729:179;:::o;25914:366::-;26056:3;26077:67;26141:2;26136:3;26077:67;:::i;:::-;26070:74;;26153:93;26242:3;26153:93;:::i;:::-;26271:2;26266:3;26262:12;26255:19;;25914:366;;;:::o;26286:419::-;26452:4;26490:2;26479:9;26475:18;26467:26;;26539:9;26533:4;26529:20;26525:1;26514:9;26510:17;26503:47;26567:131;26693:4;26567:131;:::i;:::-;26559:139;;26286:419;;;:::o;26711:169::-;26851:21;26847:1;26839:6;26835:14;26828:45;26711:169;:::o;26886:366::-;27028:3;27049:67;27113:2;27108:3;27049:67;:::i;:::-;27042:74;;27125:93;27214:3;27125:93;:::i;:::-;27243:2;27238:3;27234:12;27227:19;;26886:366;;;:::o;27258:419::-;27424:4;27462:2;27451:9;27447:18;27439:26;;27511:9;27505:4;27501:20;27497:1;27486:9;27482:17;27475:47;27539:131;27665:4;27539:131;:::i;:::-;27531:139;;27258:419;;;:::o;27683:169::-;27823:21;27819:1;27811:6;27807:14;27800:45;27683:169;:::o;27858:366::-;28000:3;28021:67;28085:2;28080:3;28021:67;:::i;:::-;28014:74;;28097:93;28186:3;28097:93;:::i;:::-;28215:2;28210:3;28206:12;28199:19;;27858:366;;;:::o;28230:419::-;28396:4;28434:2;28423:9;28419:18;28411:26;;28483:9;28477:4;28473:20;28469:1;28458:9;28454:17;28447:47;28511:131;28637:4;28511:131;:::i;:::-;28503:139;;28230:419;;;:::o;28655:194::-;28695:4;28715:20;28733:1;28715:20;:::i;:::-;28710:25;;28749:20;28767:1;28749:20;:::i;:::-;28744:25;;28793:1;28790;28786:9;28778:17;;28817:1;28811:4;28808:11;28805:37;;;28822:18;;:::i;:::-;28805:37;28655:194;;;;:::o;28855:224::-;28995:34;28991:1;28983:6;28979:14;28972:58;29064:7;29059:2;29051:6;29047:15;29040:32;28855:224;:::o;29085:366::-;29227:3;29248:67;29312:2;29307:3;29248:67;:::i;:::-;29241:74;;29324:93;29413:3;29324:93;:::i;:::-;29442:2;29437:3;29433:12;29426:19;;29085:366;;;:::o;29457:419::-;29623:4;29661:2;29650:9;29646:18;29638:26;;29710:9;29704:4;29700:20;29696:1;29685:9;29681:17;29674:47;29738:131;29864:4;29738:131;:::i;:::-;29730:139;;29457:419;;;:::o;29882:222::-;30022:34;30018:1;30010:6;30006:14;29999:58;30091:5;30086:2;30078:6;30074:15;30067:30;29882:222;:::o;30110:366::-;30252:3;30273:67;30337:2;30332:3;30273:67;:::i;:::-;30266:74;;30349:93;30438:3;30349:93;:::i;:::-;30467:2;30462:3;30458:12;30451:19;;30110:366;;;:::o;30482:419::-;30648:4;30686:2;30675:9;30671:18;30663:26;;30735:9;30729:4;30725:20;30721:1;30710:9;30706:17;30699:47;30763:131;30889:4;30763:131;:::i;:::-;30755:139;;30482:419;;;:::o;30907:225::-;31047:34;31043:1;31035:6;31031:14;31024:58;31116:8;31111:2;31103:6;31099:15;31092:33;30907:225;:::o;31138:366::-;31280:3;31301:67;31365:2;31360:3;31301:67;:::i;:::-;31294:74;;31377:93;31466:3;31377:93;:::i;:::-;31495:2;31490:3;31486:12;31479:19;;31138:366;;;:::o;31510:419::-;31676:4;31714:2;31703:9;31699:18;31691:26;;31763:9;31757:4;31753:20;31749:1;31738:9;31734:17;31727:47;31791:131;31917:4;31791:131;:::i;:::-;31783:139;;31510:419;;;:::o;31935:332::-;32056:4;32094:2;32083:9;32079:18;32071:26;;32107:71;32175:1;32164:9;32160:17;32151:6;32107:71;:::i;:::-;32188:72;32256:2;32245:9;32241:18;32232:6;32188:72;:::i;:::-;31935:332;;;;;:::o;32273:180::-;32321:77;32318:1;32311:88;32418:4;32415:1;32408:15;32442:4;32439:1;32432:15;32459:180;32507:77;32504:1;32497:88;32604:4;32601:1;32594:15;32628:4;32625:1;32618:15;32645:143;32702:5;32733:6;32727:13;32718:22;;32749:33;32776:5;32749:33;:::i;:::-;32645:143;;;;:::o;32794:351::-;32864:6;32913:2;32901:9;32892:7;32888:23;32884:32;32881:119;;;32919:79;;:::i;:::-;32881:119;33039:1;33064:64;33120:7;33111:6;33100:9;33096:22;33064:64;:::i;:::-;33054:74;;33010:128;32794:351;;;;:::o;33151:85::-;33196:7;33225:5;33214:16;;33151:85;;;:::o;33242:158::-;33300:9;33333:61;33351:42;33360:32;33386:5;33360:32;:::i;:::-;33351:42;:::i;:::-;33333:61;:::i;:::-;33320:74;;33242:158;;;:::o;33406:147::-;33501:45;33540:5;33501:45;:::i;:::-;33496:3;33489:58;33406:147;;:::o;33559:114::-;33626:6;33660:5;33654:12;33644:22;;33559:114;;;:::o;33679:184::-;33778:11;33812:6;33807:3;33800:19;33852:4;33847:3;33843:14;33828:29;;33679:184;;;;:::o;33869:132::-;33936:4;33959:3;33951:11;;33989:4;33984:3;33980:14;33972:22;;33869:132;;;:::o;34007:108::-;34084:24;34102:5;34084:24;:::i;:::-;34079:3;34072:37;34007:108;;:::o;34121:179::-;34190:10;34211:46;34253:3;34245:6;34211:46;:::i;:::-;34289:4;34284:3;34280:14;34266:28;;34121:179;;;;:::o;34306:113::-;34376:4;34408;34403:3;34399:14;34391:22;;34306:113;;;:::o;34455:732::-;34574:3;34603:54;34651:5;34603:54;:::i;:::-;34673:86;34752:6;34747:3;34673:86;:::i;:::-;34666:93;;34783:56;34833:5;34783:56;:::i;:::-;34862:7;34893:1;34878:284;34903:6;34900:1;34897:13;34878:284;;;34979:6;34973:13;35006:63;35065:3;35050:13;35006:63;:::i;:::-;34999:70;;35092:60;35145:6;35092:60;:::i;:::-;35082:70;;34938:224;34925:1;34922;34918:9;34913:14;;34878:284;;;34882:14;35178:3;35171:10;;34579:608;;;34455:732;;;;:::o;35193:831::-;35456:4;35494:3;35483:9;35479:19;35471:27;;35508:71;35576:1;35565:9;35561:17;35552:6;35508:71;:::i;:::-;35589:80;35665:2;35654:9;35650:18;35641:6;35589:80;:::i;:::-;35716:9;35710:4;35706:20;35701:2;35690:9;35686:18;35679:48;35744:108;35847:4;35838:6;35744:108;:::i;:::-;35736:116;;35862:72;35930:2;35919:9;35915:18;35906:6;35862:72;:::i;:::-;35944:73;36012:3;36001:9;35997:19;35988:6;35944:73;:::i;:::-;35193:831;;;;;;;;:::o;36030:807::-;36279:4;36317:3;36306:9;36302:19;36294:27;;36331:71;36399:1;36388:9;36384:17;36375:6;36331:71;:::i;:::-;36412:72;36480:2;36469:9;36465:18;36456:6;36412:72;:::i;:::-;36494:80;36570:2;36559:9;36555:18;36546:6;36494:80;:::i;:::-;36584;36660:2;36649:9;36645:18;36636:6;36584:80;:::i;:::-;36674:73;36742:3;36731:9;36727:19;36718:6;36674:73;:::i;:::-;36757;36825:3;36814:9;36810:19;36801:6;36757:73;:::i;:::-;36030:807;;;;;;;;;:::o;36843:143::-;36900:5;36931:6;36925:13;36916:22;;36947:33;36974:5;36947:33;:::i;:::-;36843:143;;;;:::o;36992:663::-;37080:6;37088;37096;37145:2;37133:9;37124:7;37120:23;37116:32;37113:119;;;37151:79;;:::i;:::-;37113:119;37271:1;37296:64;37352:7;37343:6;37332:9;37328:22;37296:64;:::i;:::-;37286:74;;37242:128;37409:2;37435:64;37491:7;37482:6;37471:9;37467:22;37435:64;:::i;:::-;37425:74;;37380:129;37548:2;37574:64;37630:7;37621:6;37610:9;37606:22;37574:64;:::i;:::-;37564:74;;37519:129;36992:663;;;;;:::o
Swarm Source
ipfs://9382b32cd5e7bfe641691040ed1685e8fbb058d8c4abdae0b97cb0cb8127f946
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.