ERC-20
Overview
Max Total Supply
100,000,000 Pup
Holders
143
Market
Onchain Market Cap
$0.00
Circulating Supply Market Cap
-
Other Info
Token Contract (WITH 18 Decimals)
Balance
0.000000000052001954 PupValue
$0.00Loading...
Loading
Loading...
Loading
Loading...
Loading
# | Exchange | Pair | Price | 24H Volume | % Volume |
---|
Contract Name:
PupProtector
Compiler Version
v0.8.17+commit.8df45f5f
Contract Source Code (Solidity)
/** *Submitted for verification at Etherscan.io on 2023-03-09 */ /* Telegram: https://t.me/pupprotector Twitter: @PupProtector8 Website: https://www.pupprotector.charity */ // SPDX-License-Identifier: MIT pragma solidity >=0.8.16; pragma experimental ABIEncoderV2; ////// lib/openzeppelin-contracts/contracts/utils/Context.sol // OpenZeppelin Contracts v4.4.0 (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; } } ////// lib/openzeppelin-contracts/contracts/access/Ownable.sol // OpenZeppelin Contracts v4.4.0 (access/Ownable.sol) /* pragma solidity ^0.8.0; */ /* import "../utils/Context.sol"; */ /** * @dev Contract module which provides a basic access control mechanism, where * there is an account (an owner) that can be granted exclusive access to * specific functions. * * By default, the owner account will be the one that deploys the contract. This * can later be changed with {transferOwnership}. * * This module is used through inheritance. It will make available the modifier * `onlyOwner`, which can be applied to your functions to restrict their use to * the owner. */ abstract contract Ownable is Context { address private _owner; event OwnershipTransferred(address indexed previousOwner, address indexed newOwner); /** * @dev Initializes the contract setting the deployer as the initial owner. */ constructor() { _transferOwnership(_msgSender()); } /** * @dev Returns the address of the current owner. */ function owner() public view virtual returns (address) { return _owner; } /** * @dev Throws if called by any account other than the owner. */ modifier onlyOwner() { require(owner() == _msgSender(), "Ownable: caller is not the owner"); _; } /** * @dev Leaves the contract without owner. It will not be possible to call * `onlyOwner` functions anymore. Can only be called by the current owner. * * NOTE: Renouncing ownership will leave the contract without an owner, * thereby removing any functionality that is only available to the owner. */ function renounceOwnership() public virtual onlyOwner { _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); } } ////// lib/openzeppelin-contracts/contracts/token/ERC20/IERC20.sol // OpenZeppelin Contracts v4.4.0 (token/ERC20/IERC20.sol) /* pragma solidity ^0.8.0; */ /** * @dev Interface of the ERC20 standard as defined in the EIP. */ interface IERC20 { /** * @dev Returns the amount of tokens in existence. */ function totalSupply() external view returns (uint256); /** * @dev Returns the amount of tokens owned by `account`. */ function balanceOf(address account) external view returns (uint256); /** * @dev Moves `amount` tokens from the caller's account to `recipient`. * * Returns a boolean value indicating whether the operation succeeded. * * Emits a {Transfer} event. */ function transfer(address recipient, uint256 amount) external returns (bool); /** * @dev Returns the remaining number of tokens that `spender` will be * allowed to spend on behalf of `owner` through {transferFrom}. This is * zero by default. * * This value changes when {approve} or {transferFrom} are called. */ function allowance(address owner, address spender) external view returns (uint256); /** * @dev Sets `amount` as the allowance of `spender` over the caller's tokens. * * Returns a boolean value indicating whether the operation succeeded. * * IMPORTANT: Beware that changing an allowance with this method brings the risk * that someone may use both the old and the new allowance by unfortunate * transaction ordering. One possible solution to mitigate this race * condition is to first reduce the spender's allowance to 0 and set the * desired value afterwards: * https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729 * * Emits an {Approval} event. */ function approve(address spender, uint256 amount) external returns (bool); /** * @dev Moves `amount` tokens from `sender` to `recipient` using the * allowance mechanism. `amount` is then deducted from the caller's * allowance. * * Returns a boolean value indicating whether the operation succeeded. * * Emits a {Transfer} event. */ function transferFrom( address sender, address recipient, uint256 amount ) external returns (bool); /** * @dev Emitted when `value` tokens are moved from one account (`from`) to * another (`to`). * * Note that `value` may be zero. */ event Transfer(address indexed from, address indexed to, uint256 value); /** * @dev Emitted when the allowance of a `spender` for an `owner` is set by * a call to {approve}. `value` is the new allowance. */ event Approval(address indexed owner, address indexed spender, uint256 value); } ////// lib/openzeppelin-contracts/contracts/token/ERC20/extensions/IERC20Metadata.sol // OpenZeppelin Contracts v4.4.0 (token/ERC20/extensions/IERC20Metadata.sol) /* pragma solidity ^0.8.0; */ /* import "../IERC20.sol"; */ /** * @dev Interface for the optional metadata functions from the ERC20 standard. * * _Available since v4.1._ */ interface IERC20Metadata is IERC20 { /** * @dev Returns the name of the token. */ function name() external view returns (string memory); /** * @dev Returns the symbol of the token. */ function symbol() external view returns (string memory); /** * @dev Returns the decimals places of the token. */ function decimals() external view returns (uint8); } ////// lib/openzeppelin-contracts/contracts/token/ERC20/ERC20.sol // OpenZeppelin Contracts v4.4.0 (token/ERC20/ERC20.sol) /* pragma solidity ^0.8.0; */ /* import "./IERC20.sol"; */ /* import "./extensions/IERC20Metadata.sol"; */ /* import "../../utils/Context.sol"; */ /** * @dev Implementation of the {IERC20} interface. * * This implementation is agnostic to the way tokens are created. This means * that a supply mechanism has to be added in a derived contract using {_mint}. * For a generic mechanism see {ERC20PresetMinterPauser}. * * TIP: For a detailed writeup see our guide * https://forum.zeppelin.solutions/t/how-to-implement-erc20-supply-mechanisms/226[How * to implement supply mechanisms]. * * We have followed general OpenZeppelin Contracts guidelines: functions revert * instead returning `false` on failure. This behavior is nonetheless * conventional and does not conflict with the expectations of ERC20 * applications. * * Additionally, an {Approval} event is emitted on calls to {transferFrom}. * This allows applications to reconstruct the allowance for all accounts just * by listening to said events. Other implementations of the EIP may not emit * these events, as it isn't required by the specification. * * Finally, the non-standard {decreaseAllowance} and {increaseAllowance} * functions have been added to mitigate the well-known issues around setting * allowances. See {IERC20-approve}. */ contract ERC20 is Context, IERC20, IERC20Metadata { mapping(address => uint256) private _balances; mapping(address => mapping(address => uint256)) private _allowances; uint256 private _totalSupply; string private _name; string private _symbol; /** * @dev Sets the values for {name} and {symbol}. * * The default value of {decimals} is 18. To select a different value for * {decimals} you should overload it. * * All two of these values are immutable: they can only be set once during * construction. */ constructor(string memory name_, string memory symbol_) { _name = name_; _symbol = symbol_; } /** * @dev Returns the name of the token. */ function name() public view virtual override returns (string memory) { return _name; } /** * @dev Returns the symbol of the token, usually a shorter version of the * name. */ function symbol() public view virtual override returns (string memory) { return _symbol; } /** * @dev Returns the number of decimals used to get its user representation. * For example, if `decimals` equals `2`, a balance of `505` tokens should * be displayed to a user as `5.05` (`505 / 10 ** 2`). * * Tokens usually opt for a value of 18, imitating the relationship between * Ether and Wei. This is the value {ERC20} uses, unless this function is * overridden; * * NOTE: This information is only used for _display_ purposes: it in * no way affects any of the arithmetic of the contract, including * {IERC20-balanceOf} and {IERC20-transfer}. */ function decimals() public view virtual override returns (uint8) { return 18; } /** * @dev See {IERC20-totalSupply}. */ function totalSupply() public view virtual override returns (uint256) { return _totalSupply; } /** * @dev See {IERC20-balanceOf}. */ function balanceOf(address account) public view virtual override returns (uint256) { return _balances[account]; } /** * @dev See {IERC20-transfer}. * * Requirements: * * - `recipient` cannot be the zero address. * - the caller must have a balance of at least `amount`. */ function transfer(address recipient, uint256 amount) public virtual override returns (bool) { _transfer(_msgSender(), recipient, amount); return true; } /** * @dev See {IERC20-allowance}. */ function allowance(address owner, address spender) public view virtual override returns (uint256) { return _allowances[owner][spender]; } /** * @dev See {IERC20-approve}. * * Requirements: * * - `spender` cannot be the zero address. */ function approve(address spender, uint256 amount) public virtual override returns (bool) { _approve(_msgSender(), spender, amount); return true; } /** * @dev See {IERC20-transferFrom}. * * Emits an {Approval} event indicating the updated allowance. This is not * required by the EIP. See the note at the beginning of {ERC20}. * * Requirements: * * - `sender` and `recipient` cannot be the zero address. * - `sender` must have a balance of at least `amount`. * - the caller must have allowance for ``sender``'s tokens of at least * `amount`. */ function transferFrom( address sender, address recipient, uint256 amount ) public virtual override returns (bool) { _transfer(sender, recipient, amount); uint256 currentAllowance = _allowances[sender][_msgSender()]; if(currentAllowance != type(uint256).max){ require(currentAllowance >= amount, "ERC20: transfer amount exceeds allowance"); unchecked { _approve(sender, _msgSender(), currentAllowance - amount); } } return true; } /** * @dev Atomically increases the allowance granted to `spender` by the caller. * * This is an alternative to {approve} that can be used as a mitigation for * problems described in {IERC20-approve}. * * Emits an {Approval} event indicating the updated allowance. * * Requirements: * * - `spender` cannot be the zero address. */ function increaseAllowance(address spender, uint256 addedValue) public virtual returns (bool) { _approve(_msgSender(), spender, _allowances[_msgSender()][spender] + addedValue); return true; } /** * @dev Atomically decreases the allowance granted to `spender` by the caller. * * This is an alternative to {approve} that can be used as a mitigation for * problems described in {IERC20-approve}. * * Emits an {Approval} event indicating the updated allowance. * * Requirements: * * - `spender` cannot be the zero address. * - `spender` must have allowance for the caller of at least * `subtractedValue`. */ function decreaseAllowance(address spender, uint256 subtractedValue) public virtual returns (bool) { uint256 currentAllowance = _allowances[_msgSender()][spender]; require(currentAllowance >= subtractedValue, "ERC20: decreased allowance below zero"); unchecked { _approve(_msgSender(), spender, currentAllowance - subtractedValue); } return true; } /** * @dev Moves `amount` of tokens from `sender` to `recipient`. * * This internal function is equivalent to {transfer}, and can be used to * e.g. implement automatic token fees, slashing mechanisms, etc. * * Emits a {Transfer} event. * * Requirements: * * - `sender` cannot be the zero address. * - `recipient` cannot be the zero address. * - `sender` must have a balance of at least `amount`. */ function _transfer( address sender, address recipient, uint256 amount ) internal virtual { require(sender != address(0), "ERC20: transfer from the zero address"); require(recipient != address(0), "ERC20: transfer to the zero address"); _beforeTokenTransfer(sender, recipient, amount); uint256 senderBalance = _balances[sender]; require(senderBalance >= amount, "ERC20: transfer amount exceeds balance"); unchecked { _balances[sender] = senderBalance - amount; } _balances[recipient] += amount; emit Transfer(sender, recipient, amount); _afterTokenTransfer(sender, recipient, amount); } /** @dev Creates `amount` tokens and assigns them to `account`, increasing * the total supply. * * Emits a {Transfer} event with `from` set to the zero address. * * Requirements: * * - `account` cannot be the zero address. */ function _mint(address account, uint256 amount) internal virtual { require(account != address(0), "ERC20: mint to the zero address"); _beforeTokenTransfer(address(0), account, amount); _totalSupply += amount; _balances[account] += amount; emit Transfer(address(0), account, amount); _afterTokenTransfer(address(0), account, amount); } /** * @dev Destroys `amount` tokens from `account`, reducing the * total supply. * * Emits a {Transfer} event with `to` set to the zero address. * * Requirements: * * - `account` cannot be the zero address. * - `account` must have at least `amount` tokens. */ function _burn(address account, uint256 amount) internal virtual { require(account != address(0), "ERC20: burn from the zero address"); _beforeTokenTransfer(account, address(0), amount); uint256 accountBalance = _balances[account]; require(accountBalance >= amount, "ERC20: burn amount exceeds balance"); unchecked { _balances[account] = accountBalance - amount; } _totalSupply -= amount; emit Transfer(account, address(0), amount); _afterTokenTransfer(account, address(0), amount); } /** * @dev Sets `amount` as the allowance of `spender` over the `owner` s tokens. * * This internal function is equivalent to `approve`, and can be used to * e.g. set automatic allowances for certain subsystems, etc. * * Emits an {Approval} event. * * Requirements: * * - `owner` cannot be the zero address. * - `spender` cannot be the zero address. */ function _approve( address owner, address spender, uint256 amount ) internal virtual { require(owner != address(0), "ERC20: approve from the zero address"); require(spender != address(0), "ERC20: approve to the zero address"); _allowances[owner][spender] = amount; emit Approval(owner, spender, amount); } /** * @dev Hook that is called before any transfer of tokens. This includes * minting and burning. * * Calling conditions: * * - when `from` and `to` are both non-zero, `amount` of ``from``'s tokens * will be transferred to `to`. * - when `from` is zero, `amount` tokens will be minted for `to`. * - when `to` is zero, `amount` of ``from``'s tokens will be burned. * - `from` and `to` are never both zero. * * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks]. */ function _beforeTokenTransfer( address from, address to, uint256 amount ) internal virtual {} /** * @dev Hook that is called after any transfer of tokens. This includes * minting and burning. * * Calling conditions: * * - when `from` and `to` are both non-zero, `amount` of ``from``'s tokens * has been transferred to `to`. * - when `from` is zero, `amount` tokens have been minted for `to`. * - when `to` is zero, `amount` of ``from``'s tokens have been burned. * - `from` and `to` are never both zero. * * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks]. */ function _afterTokenTransfer( address from, address to, uint256 amount ) internal virtual {} } ////// lib/openzeppelin-contracts/contracts/utils/math/SafeMath.sol // OpenZeppelin Contracts v4.4.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 substraction of two unsigned integers, with an overflow flag. * * _Available since v3.4._ */ function trySub(uint256 a, uint256 b) internal pure returns (bool, uint256) { unchecked { if (b > a) return (false, 0); return (true, a - b); } } /** * @dev Returns the multiplication of two unsigned integers, with an overflow flag. * * _Available since v3.4._ */ function tryMul(uint256 a, uint256 b) internal pure returns (bool, uint256) { unchecked { // Gas optimization: this is cheaper than requiring 'a' not being zero, but the // benefit is lost if 'b' is also tested. // See: https://github.com/OpenZeppelin/openzeppelin-contracts/pull/522 if (a == 0) return (true, 0); uint256 c = a * b; if (c / a != b) return (false, 0); return (true, c); } } /** * @dev Returns the division of two unsigned integers, with a division by zero flag. * * _Available since v3.4._ */ function tryDiv(uint256 a, uint256 b) internal pure returns (bool, uint256) { unchecked { if (b == 0) return (false, 0); return (true, a / b); } } /** * @dev Returns the remainder of dividing two unsigned integers, with a division by zero flag. * * _Available since v3.4._ */ function tryMod(uint256 a, uint256 b) internal pure returns (bool, uint256) { unchecked { if (b == 0) return (false, 0); return (true, a % b); } } /** * @dev Returns the addition of two unsigned integers, reverting on * overflow. * * Counterpart to Solidity's `+` operator. * * Requirements: * * - Addition cannot overflow. */ function add(uint256 a, uint256 b) internal pure returns (uint256) { return a + b; } /** * @dev Returns the subtraction of two unsigned integers, reverting on * overflow (when the result is negative). * * Counterpart to Solidity's `-` operator. * * Requirements: * * - Subtraction cannot overflow. */ function sub(uint256 a, uint256 b) internal pure returns (uint256) { return a - b; } /** * @dev Returns the multiplication of two unsigned integers, reverting on * overflow. * * Counterpart to Solidity's `*` operator. * * Requirements: * * - Multiplication cannot overflow. */ function mul(uint256 a, uint256 b) internal pure returns (uint256) { return a * b; } /** * @dev Returns the integer division of two unsigned integers, reverting on * division by zero. The result is rounded towards zero. * * Counterpart to Solidity's `/` operator. * * Requirements: * * - The divisor cannot be zero. */ function div(uint256 a, uint256 b) internal pure returns (uint256) { return a / b; } /** * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo), * reverting when dividing by zero. * * Counterpart to Solidity's `%` operator. This function uses a `revert` * opcode (which leaves remaining gas untouched) while Solidity uses an * invalid opcode to revert (consuming all remaining gas). * * Requirements: * * - The divisor cannot be zero. */ function mod(uint256 a, uint256 b) internal pure returns (uint256) { return a % b; } /** * @dev Returns the subtraction of two unsigned integers, reverting with custom message on * overflow (when the result is negative). * * CAUTION: This function is deprecated because it requires allocating memory for the error * message unnecessarily. For custom revert reasons use {trySub}. * * Counterpart to Solidity's `-` operator. * * Requirements: * * - Subtraction cannot overflow. */ function sub( uint256 a, uint256 b, string memory errorMessage ) internal pure returns (uint256) { unchecked { require(b <= a, errorMessage); return a - b; } } /** * @dev Returns the integer division of two unsigned integers, reverting with custom message on * division by zero. The result is rounded towards zero. * * Counterpart to Solidity's `/` operator. Note: this function uses a * `revert` opcode (which leaves remaining gas untouched) while Solidity * uses an invalid opcode to revert (consuming all remaining gas). * * Requirements: * * - The divisor cannot be zero. */ function div( uint256 a, uint256 b, string memory errorMessage ) internal pure returns (uint256) { unchecked { require(b > 0, errorMessage); return a / b; } } /** * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo), * reverting with custom message when dividing by zero. * * CAUTION: This function is deprecated because it requires allocating memory for the error * message unnecessarily. For custom revert reasons use {tryMod}. * * Counterpart to Solidity's `%` operator. This function uses a `revert` * opcode (which leaves remaining gas untouched) while Solidity uses an * invalid opcode to revert (consuming all remaining gas). * * Requirements: * * - The divisor cannot be zero. */ function mod( uint256 a, uint256 b, string memory errorMessage ) internal pure returns (uint256) { unchecked { require(b > 0, errorMessage); return a % b; } } } ////// src/IUniswapV2Factory.sol /* pragma solidity 0.8.10; */ /* pragma experimental ABIEncoderV2; */ interface IUniswapV2Factory { event PairCreated( address indexed token0, address indexed token1, address pair, uint256 ); 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(uint256) external view returns (address pair); function allPairsLength() external view returns (uint256); function createPair(address tokenA, address tokenB) external returns (address pair); function setFeeTo(address) external; function setFeeToSetter(address) external; } ////// src/IUniswapV2Pair.sol /* pragma solidity 0.8.10; */ /* pragma experimental ABIEncoderV2; */ interface IUniswapV2Pair { event Approval( address indexed owner, address indexed spender, uint256 value ); event Transfer(address indexed from, address indexed to, uint256 value); function name() external pure returns (string memory); function symbol() external pure returns (string memory); function decimals() external pure returns (uint8); function totalSupply() external view returns (uint256); function balanceOf(address owner) external view returns (uint256); function allowance(address owner, address spender) external view returns (uint256); function approve(address spender, uint256 value) external returns (bool); function transfer(address to, uint256 value) external returns (bool); function transferFrom( address from, address to, uint256 value ) external returns (bool); function DOMAIN_SEPARATOR() external view returns (bytes32); function PERMIT_TYPEHASH() external pure returns (bytes32); function nonces(address owner) external view returns (uint256); function permit( address owner, address spender, uint256 value, uint256 deadline, uint8 v, bytes32 r, bytes32 s ) external; event Mint(address indexed sender, uint256 amount0, uint256 amount1); event Burn( address indexed sender, uint256 amount0, uint256 amount1, address indexed to ); event Swap( address indexed sender, uint256 amount0In, uint256 amount1In, uint256 amount0Out, uint256 amount1Out, address indexed to ); event Sync(uint112 reserve0, uint112 reserve1); function MINIMUM_LIQUIDITY() external pure returns (uint256); function factory() external view returns (address); function token0() external view returns (address); function token1() external view returns (address); function getReserves() external view returns ( uint112 reserve0, uint112 reserve1, uint32 blockTimestampLast ); function price0CumulativeLast() external view returns (uint256); function price1CumulativeLast() external view returns (uint256); function kLast() external view returns (uint256); function mint(address to) external returns (uint256 liquidity); function burn(address to) external returns (uint256 amount0, uint256 amount1); function swap( uint256 amount0Out, uint256 amount1Out, address to, bytes calldata data ) external; function skim(address to) external; function sync() external; function initialize(address, address) external; } ////// src/IUniswapV2Router02.sol /* pragma solidity 0.8.10; */ /* pragma experimental ABIEncoderV2; */ interface IUniswapV2Router02 { function factory() external pure returns (address); function WETH() external pure returns (address); function addLiquidity( address tokenA, address tokenB, uint256 amountADesired, uint256 amountBDesired, uint256 amountAMin, uint256 amountBMin, address to, uint256 deadline ) external returns ( uint256 amountA, uint256 amountB, uint256 liquidity ); function addLiquidityETH( address token, uint256 amountTokenDesired, uint256 amountTokenMin, uint256 amountETHMin, address to, uint256 deadline ) external payable returns ( uint256 amountToken, uint256 amountETH, uint256 liquidity ); function swapExactTokensForTokensSupportingFeeOnTransferTokens( uint256 amountIn, uint256 amountOutMin, address[] calldata path, address to, uint256 deadline ) external; function swapExactETHForTokensSupportingFeeOnTransferTokens( uint256 amountOutMin, address[] calldata path, address to, uint256 deadline ) external payable; function swapExactTokensForETHSupportingFeeOnTransferTokens( uint256 amountIn, uint256 amountOutMin, address[] calldata path, address to, uint256 deadline ) external; } library Address { function isContract(address account) internal view returns (bool) { return account.code.length > 0; } function sendValue(address payable recipient, uint256 amount) internal { require(address(this).balance >= amount, "Address: insufficient balance"); (bool success, ) = recipient.call{value: amount}(""); require(success, "Address: unable to send value, recipient may have reverted"); } function functionCall(address target, bytes memory data) internal returns (bytes memory) { return functionCallWithValue(target, data, 0, "Address: low-level call failed"); } function functionCall( address target, bytes memory data, string memory errorMessage ) internal returns (bytes memory) { return functionCallWithValue(target, data, 0, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but also transferring `value` wei to `target`. * * Requirements: * * - the calling contract must have an ETH balance of at least `value`. * - the called Solidity function must be `payable`. * * _Available since v3.1._ */ function functionCallWithValue( address target, bytes memory data, uint256 value ) internal returns (bytes memory) { return functionCallWithValue(target, data, value, "Address: low-level call with value failed"); } /** * @dev Same as {xref-Address-functionCallWithValue-address-bytes-uint256-}[`functionCallWithValue`], but * with `errorMessage` as a fallback revert reason when `target` reverts. * * _Available since v3.1._ */ function functionCallWithValue( address target, bytes memory data, uint256 value, string memory errorMessage ) internal returns (bytes memory) { require(address(this).balance >= value, "Address: insufficient balance for call"); (bool success, bytes memory returndata) = target.call{value: value}(data); return verifyCallResultFromTarget(target, success, returndata, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but performing a static call. * * _Available since v3.3._ */ function functionStaticCall(address target, bytes memory data) internal view returns (bytes memory) { return functionStaticCall(target, data, "Address: low-level static call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`], * but performing a static call. * * _Available since v3.3._ */ function functionStaticCall( address target, bytes memory data, string memory errorMessage ) internal view returns (bytes memory) { (bool success, bytes memory returndata) = target.staticcall(data); return verifyCallResultFromTarget(target, success, returndata, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but performing a delegate call. * * _Available since v3.4._ */ function functionDelegateCall(address target, bytes memory data) internal returns (bytes memory) { return functionDelegateCall(target, data, "Address: low-level delegate call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`], * but performing a delegate call. * * _Available since v3.4._ */ function functionDelegateCall( address target, bytes memory data, string memory errorMessage ) internal returns (bytes memory) { (bool success, bytes memory returndata) = target.delegatecall(data); return verifyCallResultFromTarget(target, success, returndata, errorMessage); } /** * @dev Tool to verify that a low level call to smart-contract was successful, and revert (either by bubbling * the revert reason or using the provided one) in case of unsuccessful call or if target was not a contract. * * _Available since v4.8._ */ function verifyCallResultFromTarget( address target, bool success, bytes memory returndata, string memory errorMessage ) internal view returns (bytes memory) { if (success) { if (returndata.length == 0) { // only check isContract if the call was successful and the return data is empty // otherwise we already know that it was a contract require(isContract(target), "Address: call to non-contract"); } return returndata; } else { _revert(returndata, errorMessage); } } /** * @dev Tool to verify that a low level call was successful, and revert if it wasn't, either by bubbling the * revert reason or using the provided one. * * _Available since v4.3._ */ function verifyCallResult( bool success, bytes memory returndata, string memory errorMessage ) internal pure returns (bytes memory) { if (success) { return returndata; } else { _revert(returndata, errorMessage); } } function _revert(bytes memory returndata, string memory errorMessage) private pure { // Look for revert reason and bubble it up if present if (returndata.length > 0) { // The easiest way to bubble the revert reason is using memory via assembly /// @solidity memory-safe-assembly assembly { let returndata_size := mload(returndata) revert(add(32, returndata), returndata_size) } } else { revert(errorMessage); } } } library SafeERC20 { using Address for address; function safeTransfer( IERC20 token, address to, uint256 value ) internal { _callOptionalReturn(token, abi.encodeWithSelector(token.transfer.selector, to, value)); } function _callOptionalReturn(IERC20 token, bytes memory data) private { bytes memory returndata = address(token).functionCall(data, "SafeERC20: low-level call failed"); if (returndata.length > 0) { require(abi.decode(returndata, (bool)), "SafeERC20: ERC20 operation did not succeed"); } } } contract PupProtector is ERC20, Ownable { IUniswapV2Router02 public immutable uniswapV2Router; address public immutable uniswapV2Pair; address public constant deadAddress = address(0xdead); bool private swapping; address public marketingWallet; address public stakingRewardsAddress; uint256 public maxTransactionAmount; uint256 public swapTokensAtAmount; uint256 public maxWallet; uint256 public amountSentToStakingRewardsAddress; uint256 public percentForLPBurn = 25; // 25 = .25% bool public lpBurnEnabled = false; uint256 public lpBurnFrequency = 3600 seconds; uint256 public lastLpBurnTime; uint256 public manualBurnFrequency = 30 minutes; uint256 public lastManualLpBurnTime; bool public limitsInEffect = true; bool public tradingActive = false; bool public swapEnabled = false; uint256 public tradingActiveBlock = 0; // Anti-bot and anti-whale mappings and variables mapping(address => uint256) private _holderLastTransferTimestamp; // to hold last Transfers temporarily during launch bool public transferDelayEnabled = true; uint256 public buyTotalFees; uint256 public buyMarketingFee; uint256 public buyLiquidityFee; uint256 public buyStakingRewardsFee; uint256 public sellTotalFees; uint256 public sellMarketingFee; uint256 public sellLiquidityFee; uint256 public sellStakingRewardsFee; uint256 public tokensForMarketing; uint256 public tokensForLiquidity; uint256 public tokensForStakingRewards; /******************/ // exlcude from fees and max transaction amount mapping(address => bool) private _isExcludedFromFees; mapping(address => bool) public _isExcludedMaxTransactionAmount; // 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 automatedMarketMakerPairs; event UpdateUniswapV2Router( address indexed newAddress, address indexed oldAddress ); event ExcludeFromFees(address indexed account, bool isExcluded); event SetAutomatedMarketMakerPair(address indexed pair, bool indexed value); event marketingWalletUpdated( address indexed newWallet, address indexed oldWallet ); event stakingRewardsAddressUpdated( address indexed newWallet, address indexed oldWallet ); event SwapAndLiquify( uint256 tokensSwapped, uint256 ethReceived, uint256 tokensIntoLiquidity ); event AutoNukeLP(); event ManualNukeLP(); constructor() ERC20("Pup Protector", "Pup") { IUniswapV2Router02 _uniswapV2Router = IUniswapV2Router02( 0x7a250d5630B4cF539739dF2C5dAcb4c659F2488D ); excludeFromMaxTransaction(address(_uniswapV2Router), true); uniswapV2Router = _uniswapV2Router; uniswapV2Pair = IUniswapV2Factory(_uniswapV2Router.factory()) .createPair(address(this), _uniswapV2Router.WETH()); excludeFromMaxTransaction(address(uniswapV2Pair), true); _setAutomatedMarketMakerPair(address(uniswapV2Pair), true); uint256 _buyMarketingFee = 2; uint256 _buyLiquidityFee = 1; uint256 _buyStakingRewardsFee = 2; uint256 _sellMarketingFee = 2; uint256 _sellLiquidityFee = 1; uint256 _sellStakingRewardsFee = 2; uint256 totalSupply = 100 * 1e6 * 1e18; maxTransactionAmount = totalSupply * 5 / 10000; maxWallet = totalSupply * 2 / 100; swapTokensAtAmount = totalSupply * 5 / 10000; // 0.05% swap wallet buyMarketingFee = _buyMarketingFee; buyLiquidityFee = _buyLiquidityFee; buyStakingRewardsFee = _buyStakingRewardsFee; buyTotalFees = buyMarketingFee + buyLiquidityFee + buyStakingRewardsFee; sellMarketingFee = _sellMarketingFee; sellLiquidityFee = _sellLiquidityFee; sellStakingRewardsFee = _sellStakingRewardsFee; sellTotalFees = sellMarketingFee + sellLiquidityFee + sellStakingRewardsFee; marketingWallet = address(0x3e9B5fBC70C38aFF4f65e03BDB6419F497feEcd1); stakingRewardsAddress = address(0xE1c8E49fF1828b97c25cd59AC57F14C854E9c38C); // exclude from paying fees or having max transaction amount excludeFromFees(owner(), true); excludeFromFees(address(this), true); excludeFromFees(address(0xdead), true); excludeFromFees(address(uniswapV2Router), true); excludeFromFees(address(marketingWallet), true); excludeFromFees(address(stakingRewardsAddress), true); excludeFromMaxTransaction(owner(), true); excludeFromMaxTransaction(address(this), true); excludeFromMaxTransaction(address(0xdead), true); excludeFromMaxTransaction(address(uniswapV2Router), true); excludeFromMaxTransaction(address(marketingWallet), true); excludeFromMaxTransaction(address(stakingRewardsAddress), true); /* _mint is an internal function in ERC20.sol that is only called here, and CANNOT be called ever again */ _mint(msg.sender, totalSupply); _approve(address(msg.sender), address(uniswapV2Router), totalSupply); _approve(address(this), address(uniswapV2Router), type(uint256).max); } receive() external payable {} // once enabled, can never be turned off function enableTrading() external onlyOwner { tradingActive = true; tradingActiveBlock = block.timestamp; swapEnabled = true; lastLpBurnTime = block.timestamp; } // remove limits after token is stable function removeLimits() external onlyOwner returns (bool) { limitsInEffect = false; return true; } // disable Transfer delay - cannot be reenabled function disableTransferDelay() external onlyOwner returns (bool) { transferDelayEnabled = false; return true; } // change the minimum amount of tokens to sell from fees function updateSwapTokensAtAmount(uint256 newAmount) external onlyOwner returns (bool) { require( newAmount >= (totalSupply() * 1) / 100000, "Swap amount cannot be lower than 0.001% total supply." ); require( newAmount <= (totalSupply() * 5) / 1000, "Swap amount cannot be higher than 0.5% total supply." ); swapTokensAtAmount = newAmount; return true; } function updateMaxTxnAmount(uint256 newNum) external onlyOwner { require( newNum >= ((totalSupply() * 1) / 100) / 1e18, "Cannot set maxTransactionAmount lower than 1%" ); maxTransactionAmount = newNum * (10**18); } function updateMaxWalletAmount(uint256 newNum) external onlyOwner { require( newNum >= ((totalSupply() * 2) / 100) / 1e18, "Cannot set maxWallet lower than 2%" ); maxWallet = newNum * (10**18); } function excludeFromMaxTransaction(address updAds, bool isEx) public onlyOwner { _isExcludedMaxTransactionAmount[updAds] = isEx; } // only use to disable contract sales if absolutely necessary (emergency use only) function updateSwapEnabled(bool enabled) external onlyOwner { swapEnabled = enabled; } function updateBuyFees( uint256 _marketingFee, uint256 _liquidityFee, uint256 _stakingRewardsFee ) external onlyOwner { buyMarketingFee = _marketingFee; buyLiquidityFee = _liquidityFee; buyStakingRewardsFee = _stakingRewardsFee; buyTotalFees = buyMarketingFee + buyLiquidityFee + buyStakingRewardsFee; require(buyTotalFees <= 5, "Must keep fees at 5% or less"); } function updateSellFees( uint256 _marketingFee, uint256 _liquidityFee, uint256 _stakingRewardsFee ) external onlyOwner { sellMarketingFee = _marketingFee; sellLiquidityFee = _liquidityFee; sellStakingRewardsFee = _stakingRewardsFee; sellTotalFees = sellMarketingFee + sellLiquidityFee + sellStakingRewardsFee; require(sellTotalFees <= 10, "Must keep fees at 10% or less"); } function excludeFromFees(address account, bool excluded) public onlyOwner { _isExcludedFromFees[account] = excluded; emit ExcludeFromFees(account, excluded); } function setAutomatedMarketMakerPair(address pair, bool value) public onlyOwner { require( pair != uniswapV2Pair, "The pair cannot be removed from automatedMarketMakerPairs" ); _setAutomatedMarketMakerPair(pair, value); } function _setAutomatedMarketMakerPair(address pair, bool value) private { automatedMarketMakerPairs[pair] = value; emit SetAutomatedMarketMakerPair(pair, value); } function updateMarketingWallet(address newMarketingWallet) external onlyOwner { emit marketingWalletUpdated(newMarketingWallet, marketingWallet); marketingWallet = newMarketingWallet; } function updateStakingRewardsAddress(address newWallet) external onlyOwner { emit stakingRewardsAddressUpdated(newWallet, stakingRewardsAddress); stakingRewardsAddress = newWallet; } function isExcludedFromFees(address account) public view returns (bool) { return _isExcludedFromFees[account]; } function _transfer( address from, address to, uint256 amount ) internal override { require(from != address(0), "ERC20: transfer from the zero address"); require(to != address(0), "ERC20: transfer to the zero address"); if (amount == 0) { super._transfer(from, to, 0); return; } if (!tradingActive) { require( _isExcludedFromFees[from] || _isExcludedFromFees[to], "Trading is not active." ); } if (limitsInEffect) { if ( from != owner() && to != owner() && to != address(0xdead) && !swapping && !_isExcludedFromFees[from] && !_isExcludedFromFees[to] ) { // at launch if the transfer delay is enabled, ensure the block timestamps for purchasers is set -- during launch. if (transferDelayEnabled) { if ( to != owner() && to != address(uniswapV2Router) && to != address(uniswapV2Pair) ) { require( _holderLastTransferTimestamp[tx.origin] < block.number, "_transfer:: Transfer Delay enabled. Only one purchase per block allowed." ); _holderLastTransferTimestamp[tx.origin] = block.number; } } // automatically increase max buy post-launch if (maxTransactionAmount < totalSupply() * 1 / 100 && block.number >= tradingActiveBlock + 3){ maxTransactionAmount = totalSupply() * 1 / 100; } //when buy if ( automatedMarketMakerPairs[from] && !_isExcludedMaxTransactionAmount[to] ) { require( amount <= maxTransactionAmount, "Buy transfer amount exceeds the maxTransactionAmount." ); require( amount + balanceOf(to) <= maxWallet, "Max wallet exceeded" ); } //when sell else if ( automatedMarketMakerPairs[to] && !_isExcludedMaxTransactionAmount[from] ) { require( amount <= maxTransactionAmount, "Sell transfer amount exceeds the maxTransactionAmount." ); } else if (!_isExcludedMaxTransactionAmount[to]) { require( amount + balanceOf(to) <= maxWallet, "Max wallet exceeded" ); } } } uint256 contractTokenBalance = balanceOf(address(this)); bool canSwap = contractTokenBalance >= swapTokensAtAmount; if ( canSwap && swapEnabled && !swapping && !automatedMarketMakerPairs[from] && !_isExcludedFromFees[from] && !_isExcludedFromFees[to] ) { swapping = true; swapBack(); swapping = false; } if ( !swapping && automatedMarketMakerPairs[to] && lpBurnEnabled && block.timestamp >= lastLpBurnTime + lpBurnFrequency && !_isExcludedFromFees[from] ) { autoBurnLiquidityPairTokens(); } bool takeFee = !swapping; // if any account belongs to _isExcludedFromFee account then remove the fee if (_isExcludedFromFees[from] || _isExcludedFromFees[to]) { takeFee = false; } uint256 fees = 0; // only take fees on buys/sells, do not take on wallet transfers if (takeFee) { // on sell if (automatedMarketMakerPairs[to] && sellTotalFees > 0) { fees = amount * sellTotalFees / 100; tokensForLiquidity += (fees * sellLiquidityFee) / sellTotalFees; tokensForStakingRewards += (fees * sellStakingRewardsFee) / sellTotalFees; tokensForMarketing += (fees * sellMarketingFee) / sellTotalFees; } // on buy else if (automatedMarketMakerPairs[from] && buyTotalFees > 0) { fees = amount * buyTotalFees / 100; tokensForLiquidity += (fees * buyLiquidityFee) / buyTotalFees; tokensForStakingRewards += (fees * buyStakingRewardsFee) / buyTotalFees; tokensForMarketing += (fees * buyMarketingFee) / buyTotalFees; } if (fees > 0) { super._transfer(from, address(this), fees); } amount -= fees; } super._transfer(from, to, amount); } function swapTokensForEth(uint256 tokenAmount) private { address[] memory path = new address[](2); path[0] = address(this); path[1] = uniswapV2Router.WETH(); uniswapV2Router.swapExactTokensForETHSupportingFeeOnTransferTokens( tokenAmount, 0, // accept any amount of ETH path, address(this), block.timestamp ); } function addLiquidity(uint256 tokenAmount, uint256 ethAmount) private { uniswapV2Router.addLiquidityETH{value: ethAmount}( address(this), tokenAmount, 0, // slippage is unavoidable 0, // slippage is unavoidable owner(), block.timestamp ); } function swapBack() private { uint256 contractBalance = balanceOf(address(this)); uint256 totalTokensToSwap = tokensForLiquidity + tokensForMarketing + tokensForStakingRewards; bool success; if (contractBalance == 0 || totalTokensToSwap == 0) { return; } if (contractBalance > swapTokensAtAmount * 40) { contractBalance = swapTokensAtAmount * 40; } // Halve the amount of liquidity tokens uint256 liquidityTokens = (contractBalance * tokensForLiquidity) / totalTokensToSwap / 2; uint256 amountToSwapForETH = contractBalance - liquidityTokens; uint256 initialETHBalance = address(this).balance; swapTokensForEth(amountToSwapForETH); uint256 ethBalance = address(this).balance - initialETHBalance; uint256 ethForMarketing = ethBalance * tokensForMarketing / (totalTokensToSwap - (tokensForLiquidity/2)); uint256 ethForStakingRewards = ethBalance * tokensForStakingRewards / (totalTokensToSwap - (tokensForLiquidity/2)); uint256 ethForLiquidity = ethBalance - ethForMarketing - ethForStakingRewards; tokensForLiquidity = 0; tokensForMarketing = 0; tokensForStakingRewards = 0; (success, ) = address(stakingRewardsAddress).call{value: ethForStakingRewards}(""); amountSentToStakingRewardsAddress += ethForStakingRewards; if (liquidityTokens > 0 && ethForLiquidity > 0) { addLiquidity(liquidityTokens, ethForLiquidity); emit SwapAndLiquify( amountToSwapForETH, ethForLiquidity, tokensForLiquidity ); } (success, ) = address(marketingWallet).call{ value: address(this).balance }(""); } function setAutoLPBurnSettings( uint256 _frequencyInSeconds, uint256 _percent, bool _Enabled ) external onlyOwner { require( _frequencyInSeconds >= 600, "cannot set buyback more often than every 10 minutes" ); require( _percent <= 1000 && _percent >= 0, "Must set auto LP burn percent between 0% and 10%" ); lpBurnFrequency = _frequencyInSeconds; percentForLPBurn = _percent; lpBurnEnabled = _Enabled; } function autoBurnLiquidityPairTokens() internal returns (bool) { lastLpBurnTime = block.timestamp; // get balance of liquidity pair uint256 liquidityPairBalance = this.balanceOf(uniswapV2Pair); // calculate amount to burn uint256 amountToBurn = liquidityPairBalance * percentForLPBurn / 10000; // pull tokens from pancakePair liquidity and move to dead address permanently if (amountToBurn > 0) { super._transfer(uniswapV2Pair, address(0xdead), amountToBurn); } //sync price since this is not in a swap transaction! IUniswapV2Pair pair = IUniswapV2Pair(uniswapV2Pair); pair.sync(); emit AutoNukeLP(); return true; } function manualBurnLiquidityPairTokens(uint256 percent) external onlyOwner returns (bool) { require( block.timestamp > lastManualLpBurnTime + manualBurnFrequency, "Must wait for cooldown to finish" ); require(percent <= 1000, "May not nuke more than 10% of tokens in LP"); lastManualLpBurnTime = block.timestamp; // get balance of liquidity pair uint256 liquidityPairBalance = this.balanceOf(uniswapV2Pair); // calculate amount to burn uint256 amountToBurn = liquidityPairBalance * percent / 10000; // pull tokens from pancakePair liquidity and move to dead address permanently if (amountToBurn > 0) { super._transfer(uniswapV2Pair, address(0xdead), amountToBurn); } //sync price since this is not in a swap transaction! IUniswapV2Pair pair = IUniswapV2Pair(uniswapV2Pair); pair.sync(); emit ManualNukeLP(); return true; } function sendEth() external onlyOwner { bool success; (success, ) = msg.sender.call{value: address(this).balance}(""); require(success, "withdraw unsuccessful"); } function transferForeignToken(address _token, address _to) external onlyOwner { require(_token != address(0), "_token address cannot be 0"); require(_token != address(this) || !tradingActive, "Can't withdraw native tokens while trading is active"); uint256 _contractBalance = IERC20(_token).balanceOf(address(this)); SafeERC20.safeTransfer(IERC20(_token),_to, _contractBalance); } }
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":[],"name":"AutoNukeLP","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"account","type":"address"},{"indexed":false,"internalType":"bool","name":"isExcluded","type":"bool"}],"name":"ExcludeFromFees","type":"event"},{"anonymous":false,"inputs":[],"name":"ManualNukeLP","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"pair","type":"address"},{"indexed":true,"internalType":"bool","name":"value","type":"bool"}],"name":"SetAutomatedMarketMakerPair","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"tokensSwapped","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"ethReceived","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"tokensIntoLiquidity","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"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"newAddress","type":"address"},{"indexed":true,"internalType":"address","name":"oldAddress","type":"address"}],"name":"UpdateUniswapV2Router","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"newWallet","type":"address"},{"indexed":true,"internalType":"address","name":"oldWallet","type":"address"}],"name":"marketingWalletUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"newWallet","type":"address"},{"indexed":true,"internalType":"address","name":"oldWallet","type":"address"}],"name":"stakingRewardsAddressUpdated","type":"event"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"_isExcludedMaxTransactionAmount","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":[],"name":"amountSentToStakingRewardsAddress","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":"","type":"address"}],"name":"automatedMarketMakerPairs","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"buyLiquidityFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"buyMarketingFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"buyStakingRewardsFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"buyTotalFees","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"deadAddress","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","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":"disableTransferDelay","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"enableTrading","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"bool","name":"excluded","type":"bool"}],"name":"excludeFromFees","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"updAds","type":"address"},{"internalType":"bool","name":"isEx","type":"bool"}],"name":"excludeFromMaxTransaction","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":"lastLpBurnTime","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"lastManualLpBurnTime","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"limitsInEffect","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"lpBurnEnabled","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"lpBurnFrequency","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"manualBurnFrequency","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"percent","type":"uint256"}],"name":"manualBurnLiquidityPairTokens","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"marketingWallet","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxTransactionAmount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxWallet","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"percentForLPBurn","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"removeLimits","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"sellLiquidityFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"sellMarketingFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"sellStakingRewardsFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"sellTotalFees","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"sendEth","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_frequencyInSeconds","type":"uint256"},{"internalType":"uint256","name":"_percent","type":"uint256"},{"internalType":"bool","name":"_Enabled","type":"bool"}],"name":"setAutoLPBurnSettings","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"pair","type":"address"},{"internalType":"bool","name":"value","type":"bool"}],"name":"setAutomatedMarketMakerPair","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"stakingRewardsAddress","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"swapEnabled","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"swapTokensAtAmount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"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":"tokensForStakingRewards","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"tradingActive","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"tradingActiveBlock","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"recipient","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transfer","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"transferDelayEnabled","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_token","type":"address"},{"internalType":"address","name":"_to","type":"address"}],"name":"transferForeignToken","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"sender","type":"address"},{"internalType":"address","name":"recipient","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transferFrom","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"uniswapV2Pair","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"uniswapV2Router","outputs":[{"internalType":"contract IUniswapV2Router02","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_marketingFee","type":"uint256"},{"internalType":"uint256","name":"_liquidityFee","type":"uint256"},{"internalType":"uint256","name":"_stakingRewardsFee","type":"uint256"}],"name":"updateBuyFees","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newMarketingWallet","type":"address"}],"name":"updateMarketingWallet","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"newNum","type":"uint256"}],"name":"updateMaxTxnAmount","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"newNum","type":"uint256"}],"name":"updateMaxWalletAmount","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_marketingFee","type":"uint256"},{"internalType":"uint256","name":"_liquidityFee","type":"uint256"},{"internalType":"uint256","name":"_stakingRewardsFee","type":"uint256"}],"name":"updateSellFees","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newWallet","type":"address"}],"name":"updateStakingRewardsAddress","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"enabled","type":"bool"}],"name":"updateSwapEnabled","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"newAmount","type":"uint256"}],"name":"updateSwapTokensAtAmount","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"stateMutability":"payable","type":"receive"}]
Contract Creation Code
60c06040526019600c55600d805460ff19908116909155610e10600e556107086010556012805462ffffff191660019081179091556000601355601580549092161790553480156200005057600080fd5b506040518060400160405280600d81526020016c283ab810283937ba32b1ba37b960991b8152506040518060400160405280600381526020016205075760ec1b8152508160039081620000a4919062000948565b506004620000b3828262000948565b505050620000d0620000ca620004c460201b60201c565b620004c8565b737a250d5630b4cf539739df2c5dacb4c659f2488d620000f28160016200051a565b6001600160a01b03811660808190526040805163c45a015560e01b8152905163c45a0155916004808201926020929091908290030181865afa1580156200013d573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019062000163919062000a14565b6001600160a01b031663c9c6539630836001600160a01b031663ad5c46486040518163ffffffff1660e01b8152600401602060405180830381865afa158015620001b1573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620001d7919062000a14565b6040516001600160e01b031960e085901b1681526001600160a01b039283166004820152911660248201526044016020604051808303816000875af115801562000225573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906200024b919062000a14565b6001600160a01b031660a0819052620002669060016200051a565b60a0516200027690600162000594565b60026001818082816a52b7d2dcc80cd2e40000006127106200029a82600562000a5c565b620002a6919062000a7c565b6008556064620002b882600262000a5c565b620002c4919062000a7c565b600a55612710620002d782600562000a5c565b620002e3919062000a7c565b6009556017879055601886905560198590558462000302878962000a9f565b6200030e919062000a9f565b601655601b849055601c839055601d829055816200032d848662000a9f565b62000339919062000a9f565b601a55600680546001600160a01b0319908116733e9b5fbc70c38aff4f65e03bdb6419f497feecd1179091556007805490911673e1c8e49ff1828b97c25cd59ac57f14c854e9c38c179055620003a36200039b6005546001600160a01b031690565b6001620005e8565b620003b0306001620005e8565b620003bf61dead6001620005e8565b608051620003cf906001620005e8565b600654620003e8906001600160a01b03166001620005e8565b60075462000401906001600160a01b03166001620005e8565b62000420620004186005546001600160a01b031690565b60016200051a565b6200042d3060016200051a565b6200043c61dead60016200051a565b6080516200044c9060016200051a565b60065462000465906001600160a01b031660016200051a565b6007546200047e906001600160a01b031660016200051a565b6200048a338262000692565b6200049f33608051836200077760201b60201c565b620004b6306080516000196200077760201b60201c565b505050505050505062000ab5565b3390565b600580546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b6005546001600160a01b03163314620005695760405162461bcd60e51b81526020600482018190526024820152600080516020620042a583398151915260448201526064015b60405180910390fd5b6001600160a01b03919091166000908152602260205260409020805460ff1916911515919091179055565b6001600160a01b038216600081815260236020526040808220805460ff191685151590811790915590519092917fffa9187bf1f18bf477bd0ea1bcbb64e93b6a98132473929edfce215cd9b16fab91a35050565b6005546001600160a01b03163314620006335760405162461bcd60e51b81526020600482018190526024820152600080516020620042a5833981519152604482015260640162000560565b6001600160a01b038216600081815260216020908152604091829020805460ff191685151590811790915591519182527f9d8f7706ea1113d1a167b526eca956215946dd36cc7df39eb16180222d8b5df7910160405180910390a25050565b6001600160a01b038216620006ea5760405162461bcd60e51b815260206004820152601f60248201527f45524332303a206d696e7420746f20746865207a65726f206164647265737300604482015260640162000560565b8060026000828254620006fe919062000a9f565b90915550506001600160a01b038216600090815260208190526040812080548392906200072d90849062000a9f565b90915550506040518181526001600160a01b038316906000907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9060200160405180910390a35050565b6001600160a01b038316620007db5760405162461bcd60e51b8152602060048201526024808201527f45524332303a20617070726f76652066726f6d20746865207a65726f206164646044820152637265737360e01b606482015260840162000560565b6001600160a01b0382166200083e5760405162461bcd60e51b815260206004820152602260248201527f45524332303a20617070726f766520746f20746865207a65726f206164647265604482015261737360f01b606482015260840162000560565b6001600160a01b0383811660008181526001602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925910160405180910390a3505050565b505050565b634e487b7160e01b600052604160045260246000fd5b600181811c90821680620008cf57607f821691505b602082108103620008f057634e487b7160e01b600052602260045260246000fd5b50919050565b601f8211156200089f57600081815260208120601f850160051c810160208610156200091f5750805b601f850160051c820191505b8181101562000940578281556001016200092b565b505050505050565b81516001600160401b03811115620009645762000964620008a4565b6200097c81620009758454620008ba565b84620008f6565b602080601f831160018114620009b457600084156200099b5750858301515b600019600386901b1c1916600185901b17855562000940565b600085815260208120601f198616915b82811015620009e557888601518255948401946001909101908401620009c4565b508582101562000a045787850151600019600388901b60f8161c191681555b5050505050600190811b01905550565b60006020828403121562000a2757600080fd5b81516001600160a01b038116811462000a3f57600080fd5b9392505050565b634e487b7160e01b600052601160045260246000fd5b808202811582820484141762000a765762000a7662000a46565b92915050565b60008262000a9a57634e487b7160e01b600052601260045260246000fd5b500490565b8082018082111562000a765762000a7662000a46565b60805160a05161377662000b2f6000396000818161065c0152818161146c01528181611b7901528181611c1501528181611c410152818161201701528181612c6c01528181612d0e0152612d3a0152600081816104e101528181611fd901528181612f0a01528181612fc2015261303a01526137766000f3fe6080604052600436106103dd5760003560e01c80637bce5a04116101fd578063bbc0c74211610118578063dd62ed3e116100ab578063f11a24d31161007a578063f11a24d314610b45578063f2fde38b14610b5b578063f637434214610b7b578063f8b45b0514610b91578063fe72b27a14610ba757600080fd5b8063dd62ed3e14610abe578063e2f4560514610b04578063e884f26014610b1a578063ee40166e14610b2f57600080fd5b8063c876d0b9116100e7578063c876d0b914610a58578063c8c8ebe414610a72578063d257b34f14610a88578063d85ba06314610aa857600080fd5b8063bbc0c742146109d9578063c0246668146109f8578063c17b5b8c14610a18578063c18bc19514610a3857600080fd5b806395d89b4111610190578063a4c82a001161015f578063a4c82a0014610953578063a9059cbb14610969578063aacebbe314610989578063b62496f5146109a957600080fd5b806395d89b41146108e85780639a7a23d6146108fd5780639ec22c0e1461091d578063a457c2d71461093357600080fd5b80638b7ace86116101cc5780638b7ace861461087e5780638da5cb5b1461089457806392136913146108b2578063924de9b7146108c857600080fd5b80637bce5a04146108135780638095d564146108295780638366e79a146108495780638a8c523c1461086957600080fd5b80632e82f1a0116102f85780636ddd17131161028b578063730c18881161025a578063730c18881461077e578063751039fc1461079e5780637571336a146107b357806375f0a874146107d3578063788bff68146107f357600080fd5b80636ddd1713146106fd57806370a082311461071d57806370fe578714610753578063715018a61461076957600080fd5b80634a62bb65116102c75780634a62bb651461067e5780634fbee1931461069857806356b0777c146106d15780636a486a8e146106e757600080fd5b80632e82f1a0146105f4578063313ce5671461060e578063395093511461062a57806349bd5a5e1461064a57600080fd5b8063184c16c511610370578063203e727e1161033f578063203e727e1461058857806323b872dd146105a857806327c8f835146105c85780632c3e486c146105de57600080fd5b8063184c16c514610530578063199ffc72146105465780631a8145bb1461055c5780631f3fed8f1461057257600080fd5b806312704eb4116103ac57806312704eb41461048b57806315209a2a146104af5780631694505e146104cf57806318160ddd1461051b57600080fd5b806306e99fef146103e957806306fdde0314610400578063095ea7b31461042b57806310d5de531461045b57600080fd5b366103e457005b600080fd5b3480156103f557600080fd5b506103fe610bc7565b005b34801561040c57600080fd5b50610415610c8f565b60405161042291906132c7565b60405180910390f35b34801561043757600080fd5b5061044b61044636600461330f565b610d21565b6040519015158152602001610422565b34801561046757600080fd5b5061044b61047636600461333b565b60226020526000908152604090205460ff1681565b34801561049757600080fd5b506104a1600b5481565b604051908152602001610422565b3480156104bb57600080fd5b506103fe6104ca36600461333b565b610d38565b3480156104db57600080fd5b506105037f000000000000000000000000000000000000000000000000000000000000000081565b6040516001600160a01b039091168152602001610422565b34801561052757600080fd5b506002546104a1565b34801561053c57600080fd5b506104a160105481565b34801561055257600080fd5b506104a1600c5481565b34801561056857600080fd5b506104a1601f5481565b34801561057e57600080fd5b506104a1601e5481565b34801561059457600080fd5b506103fe6105a336600461335f565b610dbf565b3480156105b457600080fd5b5061044b6105c3366004613378565b610e99565b3480156105d457600080fd5b5061050361dead81565b3480156105ea57600080fd5b506104a1600e5481565b34801561060057600080fd5b50600d5461044b9060ff1681565b34801561061a57600080fd5b5060405160128152602001610422565b34801561063657600080fd5b5061044b61064536600461330f565b610f4c565b34801561065657600080fd5b506105037f000000000000000000000000000000000000000000000000000000000000000081565b34801561068a57600080fd5b5060125461044b9060ff1681565b3480156106a457600080fd5b5061044b6106b336600461333b565b6001600160a01b031660009081526021602052604090205460ff1690565b3480156106dd57600080fd5b506104a160205481565b3480156106f357600080fd5b506104a1601a5481565b34801561070957600080fd5b5060125461044b9062010000900460ff1681565b34801561072957600080fd5b506104a161073836600461333b565b6001600160a01b031660009081526020819052604090205490565b34801561075f57600080fd5b506104a1601d5481565b34801561077557600080fd5b506103fe610f88565b34801561078a57600080fd5b506103fe6107993660046133c7565b610fbe565b3480156107aa57600080fd5b5061044b6110e7565b3480156107bf57600080fd5b506103fe6107ce366004613400565b611124565b3480156107df57600080fd5b50600654610503906001600160a01b031681565b3480156107ff57600080fd5b50600754610503906001600160a01b031681565b34801561081f57600080fd5b506104a160175481565b34801561083557600080fd5b506103fe610844366004613439565b611179565b34801561085557600080fd5b506103fe610864366004613465565b611221565b34801561087557600080fd5b506103fe6113a2565b34801561088a57600080fd5b506104a160195481565b3480156108a057600080fd5b506005546001600160a01b0316610503565b3480156108be57600080fd5b506104a1601b5481565b3480156108d457600080fd5b506103fe6108e3366004613493565b6113eb565b3480156108f457600080fd5b50610415611431565b34801561090957600080fd5b506103fe610918366004613400565b611440565b34801561092957600080fd5b506104a160115481565b34801561093f57600080fd5b5061044b61094e36600461330f565b61151f565b34801561095f57600080fd5b506104a1600f5481565b34801561097557600080fd5b5061044b61098436600461330f565b6115b8565b34801561099557600080fd5b506103fe6109a436600461333b565b6115c5565b3480156109b557600080fd5b5061044b6109c436600461333b565b60236020526000908152604090205460ff1681565b3480156109e557600080fd5b5060125461044b90610100900460ff1681565b348015610a0457600080fd5b506103fe610a13366004613400565b61164c565b348015610a2457600080fd5b506103fe610a33366004613439565b6116d5565b348015610a4457600080fd5b506103fe610a5336600461335f565b611778565b348015610a6457600080fd5b5060155461044b9060ff1681565b348015610a7e57600080fd5b506104a160085481565b348015610a9457600080fd5b5061044b610aa336600461335f565b611847565b348015610ab457600080fd5b506104a160165481565b348015610aca57600080fd5b506104a1610ad9366004613465565b6001600160a01b03918216600090815260016020908152604080832093909416825291909152205490565b348015610b1057600080fd5b506104a160095481565b348015610b2657600080fd5b5061044b611999565b348015610b3b57600080fd5b506104a160135481565b348015610b5157600080fd5b506104a160185481565b348015610b6757600080fd5b506103fe610b7636600461333b565b6119d6565b348015610b8757600080fd5b506104a1601c5481565b348015610b9d57600080fd5b506104a1600a5481565b348015610bb357600080fd5b5061044b610bc236600461335f565b611a6e565b6005546001600160a01b03163314610bfa5760405162461bcd60e51b8152600401610bf1906134b0565b60405180910390fd5b604051600090339047908381818185875af1925050503d8060008114610c3c576040519150601f19603f3d011682016040523d82523d6000602084013e610c41565b606091505b50508091505080610c8c5760405162461bcd60e51b81526020600482015260156024820152741dda5d1a191c985dc81d5b9cdd58d8d95cdcd99d5b605a1b6044820152606401610bf1565b50565b606060038054610c9e906134e5565b80601f0160208091040260200160405190810160405280929190818152602001828054610cca906134e5565b8015610d175780601f10610cec57610100808354040283529160200191610d17565b820191906000526020600020905b815481529060010190602001808311610cfa57829003601f168201915b5050505050905090565b6000610d2e338484611ce9565b5060015b92915050565b6005546001600160a01b03163314610d625760405162461bcd60e51b8152600401610bf1906134b0565b6007546040516001600160a01b03918216918316907fe5ee260fbc3f12eea3913e6e45ebe34f8b966ae78e1a1a8187f58b0e1e1daae490600090a3600780546001600160a01b0319166001600160a01b0392909216919091179055565b6005546001600160a01b03163314610de95760405162461bcd60e51b8152600401610bf1906134b0565b670de0b6b3a76400006064610dfd60025490565b610e08906001613535565b610e12919061354c565b610e1c919061354c565b811015610e815760405162461bcd60e51b815260206004820152602d60248201527f43616e6e6f7420736574206d61785472616e73616374696f6e416d6f756e742060448201526c6c6f776572207468616e20312560981b6064820152608401610bf1565b610e9381670de0b6b3a7640000613535565b60085550565b6000610ea6848484611e0d565b6001600160a01b03841660009081526001602090815260408083203384529091529020546000198114610f415782811015610f345760405162461bcd60e51b815260206004820152602860248201527f45524332303a207472616e7366657220616d6f756e74206578636565647320616044820152676c6c6f77616e636560c01b6064820152608401610bf1565b610f418533858403611ce9565b506001949350505050565b3360008181526001602090815260408083206001600160a01b03871684529091528120549091610d2e918590610f8390869061356e565b611ce9565b6005546001600160a01b03163314610fb25760405162461bcd60e51b8152600401610bf1906134b0565b610fbc6000612784565b565b6005546001600160a01b03163314610fe85760405162461bcd60e51b8152600401610bf1906134b0565b6102588310156110565760405162461bcd60e51b815260206004820152603360248201527f63616e6e6f7420736574206275796261636b206d6f7265206f6674656e207468604482015272616e206576657279203130206d696e7574657360681b6064820152608401610bf1565b6103e88211158015611066575060015b6110cb5760405162461bcd60e51b815260206004820152603060248201527f4d75737420736574206175746f204c50206275726e2070657263656e7420626560448201526f747765656e20302520616e642031302560801b6064820152608401610bf1565b600e92909255600c55600d805460ff1916911515919091179055565b6005546000906001600160a01b031633146111145760405162461bcd60e51b8152600401610bf1906134b0565b506012805460ff19169055600190565b6005546001600160a01b0316331461114e5760405162461bcd60e51b8152600401610bf1906134b0565b6001600160a01b03919091166000908152602260205260409020805460ff1916911515919091179055565b6005546001600160a01b031633146111a35760405162461bcd60e51b8152600401610bf1906134b0565b601783905560188290556019819055806111bd838561356e565b6111c7919061356e565b60168190556005101561121c5760405162461bcd60e51b815260206004820152601c60248201527f4d757374206b6565702066656573206174203525206f72206c657373000000006044820152606401610bf1565b505050565b6005546001600160a01b0316331461124b5760405162461bcd60e51b8152600401610bf1906134b0565b6001600160a01b0382166112a15760405162461bcd60e51b815260206004820152601a60248201527f5f746f6b656e20616464726573732063616e6e6f7420626520300000000000006044820152606401610bf1565b6001600160a01b038216301415806112c15750601254610100900460ff16155b61132a5760405162461bcd60e51b815260206004820152603460248201527f43616e2774207769746864726177206e617469766520746f6b656e73207768696044820152736c652074726164696e672069732061637469766560601b6064820152608401610bf1565b6040516370a0823160e01b81523060048201526000906001600160a01b038416906370a0823190602401602060405180830381865afa158015611371573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906113959190613581565b905061121c8383836127d6565b6005546001600160a01b031633146113cc5760405162461bcd60e51b8152600401610bf1906134b0565b6012805442601381905562ffff00199091166201010017909155600f55565b6005546001600160a01b031633146114155760405162461bcd60e51b8152600401610bf1906134b0565b60128054911515620100000262ff000019909216919091179055565b606060048054610c9e906134e5565b6005546001600160a01b0316331461146a5760405162461bcd60e51b8152600401610bf1906134b0565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316826001600160a01b0316036115115760405162461bcd60e51b815260206004820152603960248201527f54686520706169722063616e6e6f742062652072656d6f7665642066726f6d2060448201527f6175746f6d617465644d61726b65744d616b65725061697273000000000000006064820152608401610bf1565b61151b8282612828565b5050565b3360009081526001602090815260408083206001600160a01b0386168452909152812054828110156115a15760405162461bcd60e51b815260206004820152602560248201527f45524332303a2064656372656173656420616c6c6f77616e63652062656c6f77604482015264207a65726f60d81b6064820152608401610bf1565b6115ae3385858403611ce9565b5060019392505050565b6000610d2e338484611e0d565b6005546001600160a01b031633146115ef5760405162461bcd60e51b8152600401610bf1906134b0565b6006546040516001600160a01b03918216918316907fa751787977eeb3902e30e1d19ca00c6ad274a1f622c31a206e32366700b0567490600090a3600680546001600160a01b0319166001600160a01b0392909216919091179055565b6005546001600160a01b031633146116765760405162461bcd60e51b8152600401610bf1906134b0565b6001600160a01b038216600081815260216020908152604091829020805460ff191685151590811790915591519182527f9d8f7706ea1113d1a167b526eca956215946dd36cc7df39eb16180222d8b5df7910160405180910390a25050565b6005546001600160a01b031633146116ff5760405162461bcd60e51b8152600401610bf1906134b0565b601b839055601c829055601d81905580611719838561356e565b611723919061356e565b601a819055600a101561121c5760405162461bcd60e51b815260206004820152601d60248201527f4d757374206b656570206665657320617420313025206f72206c6573730000006044820152606401610bf1565b6005546001600160a01b031633146117a25760405162461bcd60e51b8152600401610bf1906134b0565b670de0b6b3a764000060646117b660025490565b6117c1906002613535565b6117cb919061354c565b6117d5919061354c565b81101561182f5760405162461bcd60e51b815260206004820152602260248201527f43616e6e6f7420736574206d617857616c6c6574206c6f776572207468616e20604482015261322560f01b6064820152608401610bf1565b61184181670de0b6b3a7640000613535565b600a5550565b6005546000906001600160a01b031633146118745760405162461bcd60e51b8152600401610bf1906134b0565b620186a061188160025490565b61188c906001613535565b611896919061354c565b8210156119035760405162461bcd60e51b815260206004820152603560248201527f5377617020616d6f756e742063616e6e6f74206265206c6f776572207468616e60448201527410181718181892903a37ba30b61039bab838363c9760591b6064820152608401610bf1565b6103e861190f60025490565b61191a906005613535565b611924919061354c565b8211156119905760405162461bcd60e51b815260206004820152603460248201527f5377617020616d6f756e742063616e6e6f742062652068696768657220746861604482015273371018171a92903a37ba30b61039bab838363c9760611b6064820152608401610bf1565b50600955600190565b6005546000906001600160a01b031633146119c65760405162461bcd60e51b8152600401610bf1906134b0565b506015805460ff19169055600190565b6005546001600160a01b03163314611a005760405162461bcd60e51b8152600401610bf1906134b0565b6001600160a01b038116611a655760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610bf1565b610c8c81612784565b6005546000906001600160a01b03163314611a9b5760405162461bcd60e51b8152600401610bf1906134b0565b601054601154611aab919061356e565b4211611af95760405162461bcd60e51b815260206004820181905260248201527f4d757374207761697420666f7220636f6f6c646f776e20746f2066696e6973686044820152606401610bf1565b6103e8821115611b5e5760405162461bcd60e51b815260206004820152602a60248201527f4d6179206e6f74206e756b65206d6f7265207468616e20313025206f6620746f60448201526906b656e7320696e204c560b41b6064820152608401610bf1565b426011556040516370a0823160e01b81526001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016600482015260009030906370a0823190602401602060405180830381865afa158015611bc9573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611bed9190613581565b90506000612710611bfe8584613535565b611c08919061354c565b90508015611c3d57611c3d7f000000000000000000000000000000000000000000000000000000000000000061dead8361287c565b60007f00000000000000000000000000000000000000000000000000000000000000009050806001600160a01b031663fff6cae96040518163ffffffff1660e01b8152600401600060405180830381600087803b158015611c9d57600080fd5b505af1158015611cb1573d6000803e3d6000fd5b50506040517f8462566617872a3fbab94534675218431ff9e204063ee3f4f43d965626a39abb925060009150a1506001949350505050565b6001600160a01b038316611d4b5760405162461bcd60e51b8152602060048201526024808201527f45524332303a20617070726f76652066726f6d20746865207a65726f206164646044820152637265737360e01b6064820152608401610bf1565b6001600160a01b038216611dac5760405162461bcd60e51b815260206004820152602260248201527f45524332303a20617070726f766520746f20746865207a65726f206164647265604482015261737360f01b6064820152608401610bf1565b6001600160a01b0383811660008181526001602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925910160405180910390a3505050565b6001600160a01b038316611e335760405162461bcd60e51b8152600401610bf19061359a565b6001600160a01b038216611e595760405162461bcd60e51b8152600401610bf1906135df565b80600003611e6d5761121c8383600061287c565b601254610100900460ff16611f00576001600160a01b03831660009081526021602052604090205460ff1680611ebb57506001600160a01b03821660009081526021602052604090205460ff165b611f005760405162461bcd60e51b81526020600482015260166024820152752a3930b234b7339034b9903737ba1030b1ba34bb329760511b6044820152606401610bf1565b60125460ff16156123c6576005546001600160a01b03848116911614801590611f3757506005546001600160a01b03838116911614155b8015611f4e57506001600160a01b03821661dead14155b8015611f645750600554600160a01b900460ff16155b8015611f8957506001600160a01b03831660009081526021602052604090205460ff16155b8015611fae57506001600160a01b03821660009081526021602052604090205460ff16155b156123c65760155460ff16156120fa576005546001600160a01b0383811691161480159061200e57507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316826001600160a01b031614155b801561204c57507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316826001600160a01b031614155b156120fa573260009081526014602052604090205443116120e75760405162461bcd60e51b815260206004820152604960248201527f5f7472616e736665723a3a205472616e736665722044656c617920656e61626c60448201527f65642e20204f6e6c79206f6e652070757263686173652070657220626c6f636b6064820152681030b63637bbb2b21760b91b608482015260a401610bf1565b3260009081526014602052604090204390555b606461210560025490565b612110906001613535565b61211a919061354c565b600854108015612137575060135461213390600361356e565b4310155b1561216057606461214760025490565b612152906001613535565b61215c919061354c565b6008555b6001600160a01b03831660009081526023602052604090205460ff1680156121a157506001600160a01b03821660009081526022602052604090205460ff16155b15612285576008548111156122165760405162461bcd60e51b815260206004820152603560248201527f427579207472616e7366657220616d6f756e742065786365656473207468652060448201527436b0bc2a3930b739b0b1ba34b7b720b6b7bab73a1760591b6064820152608401610bf1565b600a546001600160a01b03831660009081526020819052604090205461223c908361356e565b11156122805760405162461bcd60e51b815260206004820152601360248201527213585e081dd85b1b195d08195e18d959591959606a1b6044820152606401610bf1565b6123c6565b6001600160a01b03821660009081526023602052604090205460ff1680156122c657506001600160a01b03831660009081526022602052604090205460ff16155b1561233c576008548111156122805760405162461bcd60e51b815260206004820152603660248201527f53656c6c207472616e7366657220616d6f756e742065786365656473207468656044820152751036b0bc2a3930b739b0b1ba34b7b720b6b7bab73a1760511b6064820152608401610bf1565b6001600160a01b03821660009081526022602052604090205460ff166123c657600a546001600160a01b038316600090815260208190526040902054612382908361356e565b11156123c65760405162461bcd60e51b815260206004820152601360248201527213585e081dd85b1b195d08195e18d959591959606a1b6044820152606401610bf1565b30600090815260208190526040902054600954811080159081906123f2575060125462010000900460ff165b80156124085750600554600160a01b900460ff16155b801561242d57506001600160a01b03851660009081526023602052604090205460ff16155b801561245257506001600160a01b03851660009081526021602052604090205460ff16155b801561247757506001600160a01b03841660009081526021602052604090205460ff16155b156124a5576005805460ff60a01b1916600160a01b1790556124976129d1565b6005805460ff60a01b191690555b600554600160a01b900460ff161580156124d757506001600160a01b03841660009081526023602052604090205460ff165b80156124e55750600d5460ff165b80156125005750600e54600f546124fc919061356e565b4210155b801561252557506001600160a01b03851660009081526021602052604090205460ff16155b1561253457612532612c51565b505b6005546001600160a01b03861660009081526021602052604090205460ff600160a01b90920482161591168061258257506001600160a01b03851660009081526021602052604090205460ff165b1561258b575060005b60008115612770576001600160a01b03861660009081526023602052604090205460ff1680156125bd57506000601a54115b15612675576064601a54866125d29190613535565b6125dc919061354c565b9050601a54601c54826125ef9190613535565b6125f9919061354c565b601f600082825461260a919061356e565b9091555050601a54601d5461261f9083613535565b612629919061354c565b6020600082825461263a919061356e565b9091555050601a54601b5461264f9083613535565b612659919061354c565b601e600082825461266a919061356e565b909155506127529050565b6001600160a01b03871660009081526023602052604090205460ff16801561269f57506000601654115b15612752576064601654866126b49190613535565b6126be919061354c565b9050601654601854826126d19190613535565b6126db919061354c565b601f60008282546126ec919061356e565b90915550506016546019546127019083613535565b61270b919061354c565b6020600082825461271c919061356e565b90915550506016546017546127319083613535565b61273b919061354c565b601e600082825461274c919061356e565b90915550505b80156127635761276387308361287c565b61276d8186613622565b94505b61277b87878761287c565b50505050505050565b600580546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b604080516001600160a01b038416602482015260448082018490528251808303909101815260649091019091526020810180516001600160e01b031663a9059cbb60e01b17905261121c908490612de1565b6001600160a01b038216600081815260236020526040808220805460ff191685151590811790915590519092917fffa9187bf1f18bf477bd0ea1bcbb64e93b6a98132473929edfce215cd9b16fab91a35050565b6001600160a01b0383166128a25760405162461bcd60e51b8152600401610bf19061359a565b6001600160a01b0382166128c85760405162461bcd60e51b8152600401610bf1906135df565b6001600160a01b038316600090815260208190526040902054818110156129405760405162461bcd60e51b815260206004820152602660248201527f45524332303a207472616e7366657220616d6f756e7420657863656564732062604482015265616c616e636560d01b6064820152608401610bf1565b6001600160a01b0380851660009081526020819052604080822085850390559185168152908120805484929061297790849061356e565b92505081905550826001600160a01b0316846001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef846040516129c391815260200190565b60405180910390a350505050565b3060009081526020819052604081205490506000602054601e54601f546129f8919061356e565b612a02919061356e565b90506000821580612a11575081155b15612a1b57505050565b600954612a29906028613535565b831115612a4157600954612a3e906028613535565b92505b6000600283601f5486612a549190613535565b612a5e919061354c565b612a68919061354c565b90506000612a768286613622565b905047612a8282612eb3565b6000612a8e8247613622565b905060006002601f54612aa1919061354c565b612aab9088613622565b601e54612ab89084613535565b612ac2919061354c565b905060006002601f54612ad5919061354c565b612adf9089613622565b602054612aec9085613535565b612af6919061354c565b9050600081612b058486613622565b612b0f9190613622565b6000601f819055601e81905560208190556007546040519293506001600160a01b031691849181818185875af1925050503d8060008114612b6c576040519150601f19603f3d011682016040523d82523d6000602084013e612b71565b606091505b50508098505081600b6000828254612b89919061356e565b90915550508615801590612b9d5750600081115b15612bf057612bac8782613038565b601f54604080518881526020810184905280820192909252517f17bbfb9a6069321b6ded73bd96327c9e6b7212a5cd51ff219cd61370acafb5619181900360600190a15b6006546040516001600160a01b03909116904790600081818185875af1925050503d8060008114612c3d576040519150601f19603f3d011682016040523d82523d6000602084013e612c42565b606091505b50505050505050505050505050565b42600f556040516370a0823160e01b81526001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000166004820152600090819030906370a0823190602401602060405180830381865afa158015612cbe573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612ce29190613581565b90506000612710600c5483612cf79190613535565b612d01919061354c565b90508015612d3657612d367f000000000000000000000000000000000000000000000000000000000000000061dead8361287c565b60007f00000000000000000000000000000000000000000000000000000000000000009050806001600160a01b031663fff6cae96040518163ffffffff1660e01b8152600401600060405180830381600087803b158015612d9657600080fd5b505af1158015612daa573d6000803e3d6000fd5b50506040517f454c91ae84fcc766ddda0dcb289f26b3d0176efeacf4061fc219fa6ca8c3048d925060009150a16001935050505090565b6000612e36826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564815250856001600160a01b03166131139092919063ffffffff16565b80519091501561121c5780806020019051810190612e549190613635565b61121c5760405162461bcd60e51b815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e6044820152691bdd081cdd58d8d9595960b21b6064820152608401610bf1565b6040805160028082526060820183526000926020830190803683370190505090503081600081518110612ee857612ee8613652565b60200260200101906001600160a01b031690816001600160a01b0316815250507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663ad5c46486040518163ffffffff1660e01b8152600401602060405180830381865afa158015612f66573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612f8a9190613668565b81600181518110612f9d57612f9d613652565b6001600160a01b03928316602091820292909201015260405163791ac94760e01b81527f00000000000000000000000000000000000000000000000000000000000000009091169063791ac94790613002908590600090869030904290600401613685565b600060405180830381600087803b15801561301c57600080fd5b505af1158015613030573d6000803e3d6000fd5b505050505050565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663f305d71982308560008061307f6005546001600160a01b031690565b60405160e088901b6001600160e01b03191681526001600160a01b03958616600482015260248101949094526044840192909252606483015290911660848201524260a482015260c40160606040518083038185885af11580156130e7573d6000803e3d6000fd5b50505050506040513d601f19601f8201168201806040525081019061310c91906136f6565b5050505050565b6060613122848460008561312a565b949350505050565b60608247101561318b5760405162461bcd60e51b815260206004820152602660248201527f416464726573733a20696e73756666696369656e742062616c616e636520666f6044820152651c8818d85b1b60d21b6064820152608401610bf1565b600080866001600160a01b031685876040516131a79190613724565b60006040518083038185875af1925050503d80600081146131e4576040519150601f19603f3d011682016040523d82523d6000602084013e6131e9565b606091505b50915091506131fa87838387613205565b979650505050505050565b6060831561327457825160000361326d576001600160a01b0385163b61326d5760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e74726163740000006044820152606401610bf1565b5081613122565b61312283838151156132895781518083602001fd5b8060405162461bcd60e51b8152600401610bf191906132c7565b60005b838110156132be5781810151838201526020016132a6565b50506000910152565b60208152600082518060208401526132e68160408501602087016132a3565b601f01601f19169190910160400192915050565b6001600160a01b0381168114610c8c57600080fd5b6000806040838503121561332257600080fd5b823561332d816132fa565b946020939093013593505050565b60006020828403121561334d57600080fd5b8135613358816132fa565b9392505050565b60006020828403121561337157600080fd5b5035919050565b60008060006060848603121561338d57600080fd5b8335613398816132fa565b925060208401356133a8816132fa565b929592945050506040919091013590565b8015158114610c8c57600080fd5b6000806000606084860312156133dc57600080fd5b833592506020840135915060408401356133f5816133b9565b809150509250925092565b6000806040838503121561341357600080fd5b823561341e816132fa565b9150602083013561342e816133b9565b809150509250929050565b60008060006060848603121561344e57600080fd5b505081359360208301359350604090920135919050565b6000806040838503121561347857600080fd5b8235613483816132fa565b9150602083013561342e816132fa565b6000602082840312156134a557600080fd5b8135613358816133b9565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b600181811c908216806134f957607f821691505b60208210810361351957634e487b7160e01b600052602260045260246000fd5b50919050565b634e487b7160e01b600052601160045260246000fd5b8082028115828204841417610d3257610d3261351f565b60008261356957634e487b7160e01b600052601260045260246000fd5b500490565b80820180821115610d3257610d3261351f565b60006020828403121561359357600080fd5b5051919050565b60208082526025908201527f45524332303a207472616e736665722066726f6d20746865207a65726f206164604082015264647265737360d81b606082015260800190565b60208082526023908201527f45524332303a207472616e7366657220746f20746865207a65726f206164647260408201526265737360e81b606082015260800190565b81810381811115610d3257610d3261351f565b60006020828403121561364757600080fd5b8151613358816133b9565b634e487b7160e01b600052603260045260246000fd5b60006020828403121561367a57600080fd5b8151613358816132fa565b600060a082018783526020878185015260a0604085015281875180845260c086019150828901935060005b818110156136d55784516001600160a01b0316835293830193918301916001016136b0565b50506001600160a01b03969096166060850152505050608001529392505050565b60008060006060848603121561370b57600080fd5b8351925060208401519150604084015190509250925092565b600082516137368184602087016132a3565b919091019291505056fea2646970667358221220e308d3a691e7433981e1ad9fc35756b0887d9d28b537c92c7ca77d2949c51ee964736f6c634300081100334f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572
Deployed Bytecode
0x6080604052600436106103dd5760003560e01c80637bce5a04116101fd578063bbc0c74211610118578063dd62ed3e116100ab578063f11a24d31161007a578063f11a24d314610b45578063f2fde38b14610b5b578063f637434214610b7b578063f8b45b0514610b91578063fe72b27a14610ba757600080fd5b8063dd62ed3e14610abe578063e2f4560514610b04578063e884f26014610b1a578063ee40166e14610b2f57600080fd5b8063c876d0b9116100e7578063c876d0b914610a58578063c8c8ebe414610a72578063d257b34f14610a88578063d85ba06314610aa857600080fd5b8063bbc0c742146109d9578063c0246668146109f8578063c17b5b8c14610a18578063c18bc19514610a3857600080fd5b806395d89b4111610190578063a4c82a001161015f578063a4c82a0014610953578063a9059cbb14610969578063aacebbe314610989578063b62496f5146109a957600080fd5b806395d89b41146108e85780639a7a23d6146108fd5780639ec22c0e1461091d578063a457c2d71461093357600080fd5b80638b7ace86116101cc5780638b7ace861461087e5780638da5cb5b1461089457806392136913146108b2578063924de9b7146108c857600080fd5b80637bce5a04146108135780638095d564146108295780638366e79a146108495780638a8c523c1461086957600080fd5b80632e82f1a0116102f85780636ddd17131161028b578063730c18881161025a578063730c18881461077e578063751039fc1461079e5780637571336a146107b357806375f0a874146107d3578063788bff68146107f357600080fd5b80636ddd1713146106fd57806370a082311461071d57806370fe578714610753578063715018a61461076957600080fd5b80634a62bb65116102c75780634a62bb651461067e5780634fbee1931461069857806356b0777c146106d15780636a486a8e146106e757600080fd5b80632e82f1a0146105f4578063313ce5671461060e578063395093511461062a57806349bd5a5e1461064a57600080fd5b8063184c16c511610370578063203e727e1161033f578063203e727e1461058857806323b872dd146105a857806327c8f835146105c85780632c3e486c146105de57600080fd5b8063184c16c514610530578063199ffc72146105465780631a8145bb1461055c5780631f3fed8f1461057257600080fd5b806312704eb4116103ac57806312704eb41461048b57806315209a2a146104af5780631694505e146104cf57806318160ddd1461051b57600080fd5b806306e99fef146103e957806306fdde0314610400578063095ea7b31461042b57806310d5de531461045b57600080fd5b366103e457005b600080fd5b3480156103f557600080fd5b506103fe610bc7565b005b34801561040c57600080fd5b50610415610c8f565b60405161042291906132c7565b60405180910390f35b34801561043757600080fd5b5061044b61044636600461330f565b610d21565b6040519015158152602001610422565b34801561046757600080fd5b5061044b61047636600461333b565b60226020526000908152604090205460ff1681565b34801561049757600080fd5b506104a1600b5481565b604051908152602001610422565b3480156104bb57600080fd5b506103fe6104ca36600461333b565b610d38565b3480156104db57600080fd5b506105037f0000000000000000000000007a250d5630b4cf539739df2c5dacb4c659f2488d81565b6040516001600160a01b039091168152602001610422565b34801561052757600080fd5b506002546104a1565b34801561053c57600080fd5b506104a160105481565b34801561055257600080fd5b506104a1600c5481565b34801561056857600080fd5b506104a1601f5481565b34801561057e57600080fd5b506104a1601e5481565b34801561059457600080fd5b506103fe6105a336600461335f565b610dbf565b3480156105b457600080fd5b5061044b6105c3366004613378565b610e99565b3480156105d457600080fd5b5061050361dead81565b3480156105ea57600080fd5b506104a1600e5481565b34801561060057600080fd5b50600d5461044b9060ff1681565b34801561061a57600080fd5b5060405160128152602001610422565b34801561063657600080fd5b5061044b61064536600461330f565b610f4c565b34801561065657600080fd5b506105037f0000000000000000000000008fbffcd12d2e07f1c25497239ec696727cd947a581565b34801561068a57600080fd5b5060125461044b9060ff1681565b3480156106a457600080fd5b5061044b6106b336600461333b565b6001600160a01b031660009081526021602052604090205460ff1690565b3480156106dd57600080fd5b506104a160205481565b3480156106f357600080fd5b506104a1601a5481565b34801561070957600080fd5b5060125461044b9062010000900460ff1681565b34801561072957600080fd5b506104a161073836600461333b565b6001600160a01b031660009081526020819052604090205490565b34801561075f57600080fd5b506104a1601d5481565b34801561077557600080fd5b506103fe610f88565b34801561078a57600080fd5b506103fe6107993660046133c7565b610fbe565b3480156107aa57600080fd5b5061044b6110e7565b3480156107bf57600080fd5b506103fe6107ce366004613400565b611124565b3480156107df57600080fd5b50600654610503906001600160a01b031681565b3480156107ff57600080fd5b50600754610503906001600160a01b031681565b34801561081f57600080fd5b506104a160175481565b34801561083557600080fd5b506103fe610844366004613439565b611179565b34801561085557600080fd5b506103fe610864366004613465565b611221565b34801561087557600080fd5b506103fe6113a2565b34801561088a57600080fd5b506104a160195481565b3480156108a057600080fd5b506005546001600160a01b0316610503565b3480156108be57600080fd5b506104a1601b5481565b3480156108d457600080fd5b506103fe6108e3366004613493565b6113eb565b3480156108f457600080fd5b50610415611431565b34801561090957600080fd5b506103fe610918366004613400565b611440565b34801561092957600080fd5b506104a160115481565b34801561093f57600080fd5b5061044b61094e36600461330f565b61151f565b34801561095f57600080fd5b506104a1600f5481565b34801561097557600080fd5b5061044b61098436600461330f565b6115b8565b34801561099557600080fd5b506103fe6109a436600461333b565b6115c5565b3480156109b557600080fd5b5061044b6109c436600461333b565b60236020526000908152604090205460ff1681565b3480156109e557600080fd5b5060125461044b90610100900460ff1681565b348015610a0457600080fd5b506103fe610a13366004613400565b61164c565b348015610a2457600080fd5b506103fe610a33366004613439565b6116d5565b348015610a4457600080fd5b506103fe610a5336600461335f565b611778565b348015610a6457600080fd5b5060155461044b9060ff1681565b348015610a7e57600080fd5b506104a160085481565b348015610a9457600080fd5b5061044b610aa336600461335f565b611847565b348015610ab457600080fd5b506104a160165481565b348015610aca57600080fd5b506104a1610ad9366004613465565b6001600160a01b03918216600090815260016020908152604080832093909416825291909152205490565b348015610b1057600080fd5b506104a160095481565b348015610b2657600080fd5b5061044b611999565b348015610b3b57600080fd5b506104a160135481565b348015610b5157600080fd5b506104a160185481565b348015610b6757600080fd5b506103fe610b7636600461333b565b6119d6565b348015610b8757600080fd5b506104a1601c5481565b348015610b9d57600080fd5b506104a1600a5481565b348015610bb357600080fd5b5061044b610bc236600461335f565b611a6e565b6005546001600160a01b03163314610bfa5760405162461bcd60e51b8152600401610bf1906134b0565b60405180910390fd5b604051600090339047908381818185875af1925050503d8060008114610c3c576040519150601f19603f3d011682016040523d82523d6000602084013e610c41565b606091505b50508091505080610c8c5760405162461bcd60e51b81526020600482015260156024820152741dda5d1a191c985dc81d5b9cdd58d8d95cdcd99d5b605a1b6044820152606401610bf1565b50565b606060038054610c9e906134e5565b80601f0160208091040260200160405190810160405280929190818152602001828054610cca906134e5565b8015610d175780601f10610cec57610100808354040283529160200191610d17565b820191906000526020600020905b815481529060010190602001808311610cfa57829003601f168201915b5050505050905090565b6000610d2e338484611ce9565b5060015b92915050565b6005546001600160a01b03163314610d625760405162461bcd60e51b8152600401610bf1906134b0565b6007546040516001600160a01b03918216918316907fe5ee260fbc3f12eea3913e6e45ebe34f8b966ae78e1a1a8187f58b0e1e1daae490600090a3600780546001600160a01b0319166001600160a01b0392909216919091179055565b6005546001600160a01b03163314610de95760405162461bcd60e51b8152600401610bf1906134b0565b670de0b6b3a76400006064610dfd60025490565b610e08906001613535565b610e12919061354c565b610e1c919061354c565b811015610e815760405162461bcd60e51b815260206004820152602d60248201527f43616e6e6f7420736574206d61785472616e73616374696f6e416d6f756e742060448201526c6c6f776572207468616e20312560981b6064820152608401610bf1565b610e9381670de0b6b3a7640000613535565b60085550565b6000610ea6848484611e0d565b6001600160a01b03841660009081526001602090815260408083203384529091529020546000198114610f415782811015610f345760405162461bcd60e51b815260206004820152602860248201527f45524332303a207472616e7366657220616d6f756e74206578636565647320616044820152676c6c6f77616e636560c01b6064820152608401610bf1565b610f418533858403611ce9565b506001949350505050565b3360008181526001602090815260408083206001600160a01b03871684529091528120549091610d2e918590610f8390869061356e565b611ce9565b6005546001600160a01b03163314610fb25760405162461bcd60e51b8152600401610bf1906134b0565b610fbc6000612784565b565b6005546001600160a01b03163314610fe85760405162461bcd60e51b8152600401610bf1906134b0565b6102588310156110565760405162461bcd60e51b815260206004820152603360248201527f63616e6e6f7420736574206275796261636b206d6f7265206f6674656e207468604482015272616e206576657279203130206d696e7574657360681b6064820152608401610bf1565b6103e88211158015611066575060015b6110cb5760405162461bcd60e51b815260206004820152603060248201527f4d75737420736574206175746f204c50206275726e2070657263656e7420626560448201526f747765656e20302520616e642031302560801b6064820152608401610bf1565b600e92909255600c55600d805460ff1916911515919091179055565b6005546000906001600160a01b031633146111145760405162461bcd60e51b8152600401610bf1906134b0565b506012805460ff19169055600190565b6005546001600160a01b0316331461114e5760405162461bcd60e51b8152600401610bf1906134b0565b6001600160a01b03919091166000908152602260205260409020805460ff1916911515919091179055565b6005546001600160a01b031633146111a35760405162461bcd60e51b8152600401610bf1906134b0565b601783905560188290556019819055806111bd838561356e565b6111c7919061356e565b60168190556005101561121c5760405162461bcd60e51b815260206004820152601c60248201527f4d757374206b6565702066656573206174203525206f72206c657373000000006044820152606401610bf1565b505050565b6005546001600160a01b0316331461124b5760405162461bcd60e51b8152600401610bf1906134b0565b6001600160a01b0382166112a15760405162461bcd60e51b815260206004820152601a60248201527f5f746f6b656e20616464726573732063616e6e6f7420626520300000000000006044820152606401610bf1565b6001600160a01b038216301415806112c15750601254610100900460ff16155b61132a5760405162461bcd60e51b815260206004820152603460248201527f43616e2774207769746864726177206e617469766520746f6b656e73207768696044820152736c652074726164696e672069732061637469766560601b6064820152608401610bf1565b6040516370a0823160e01b81523060048201526000906001600160a01b038416906370a0823190602401602060405180830381865afa158015611371573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906113959190613581565b905061121c8383836127d6565b6005546001600160a01b031633146113cc5760405162461bcd60e51b8152600401610bf1906134b0565b6012805442601381905562ffff00199091166201010017909155600f55565b6005546001600160a01b031633146114155760405162461bcd60e51b8152600401610bf1906134b0565b60128054911515620100000262ff000019909216919091179055565b606060048054610c9e906134e5565b6005546001600160a01b0316331461146a5760405162461bcd60e51b8152600401610bf1906134b0565b7f0000000000000000000000008fbffcd12d2e07f1c25497239ec696727cd947a56001600160a01b0316826001600160a01b0316036115115760405162461bcd60e51b815260206004820152603960248201527f54686520706169722063616e6e6f742062652072656d6f7665642066726f6d2060448201527f6175746f6d617465644d61726b65744d616b65725061697273000000000000006064820152608401610bf1565b61151b8282612828565b5050565b3360009081526001602090815260408083206001600160a01b0386168452909152812054828110156115a15760405162461bcd60e51b815260206004820152602560248201527f45524332303a2064656372656173656420616c6c6f77616e63652062656c6f77604482015264207a65726f60d81b6064820152608401610bf1565b6115ae3385858403611ce9565b5060019392505050565b6000610d2e338484611e0d565b6005546001600160a01b031633146115ef5760405162461bcd60e51b8152600401610bf1906134b0565b6006546040516001600160a01b03918216918316907fa751787977eeb3902e30e1d19ca00c6ad274a1f622c31a206e32366700b0567490600090a3600680546001600160a01b0319166001600160a01b0392909216919091179055565b6005546001600160a01b031633146116765760405162461bcd60e51b8152600401610bf1906134b0565b6001600160a01b038216600081815260216020908152604091829020805460ff191685151590811790915591519182527f9d8f7706ea1113d1a167b526eca956215946dd36cc7df39eb16180222d8b5df7910160405180910390a25050565b6005546001600160a01b031633146116ff5760405162461bcd60e51b8152600401610bf1906134b0565b601b839055601c829055601d81905580611719838561356e565b611723919061356e565b601a819055600a101561121c5760405162461bcd60e51b815260206004820152601d60248201527f4d757374206b656570206665657320617420313025206f72206c6573730000006044820152606401610bf1565b6005546001600160a01b031633146117a25760405162461bcd60e51b8152600401610bf1906134b0565b670de0b6b3a764000060646117b660025490565b6117c1906002613535565b6117cb919061354c565b6117d5919061354c565b81101561182f5760405162461bcd60e51b815260206004820152602260248201527f43616e6e6f7420736574206d617857616c6c6574206c6f776572207468616e20604482015261322560f01b6064820152608401610bf1565b61184181670de0b6b3a7640000613535565b600a5550565b6005546000906001600160a01b031633146118745760405162461bcd60e51b8152600401610bf1906134b0565b620186a061188160025490565b61188c906001613535565b611896919061354c565b8210156119035760405162461bcd60e51b815260206004820152603560248201527f5377617020616d6f756e742063616e6e6f74206265206c6f776572207468616e60448201527410181718181892903a37ba30b61039bab838363c9760591b6064820152608401610bf1565b6103e861190f60025490565b61191a906005613535565b611924919061354c565b8211156119905760405162461bcd60e51b815260206004820152603460248201527f5377617020616d6f756e742063616e6e6f742062652068696768657220746861604482015273371018171a92903a37ba30b61039bab838363c9760611b6064820152608401610bf1565b50600955600190565b6005546000906001600160a01b031633146119c65760405162461bcd60e51b8152600401610bf1906134b0565b506015805460ff19169055600190565b6005546001600160a01b03163314611a005760405162461bcd60e51b8152600401610bf1906134b0565b6001600160a01b038116611a655760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610bf1565b610c8c81612784565b6005546000906001600160a01b03163314611a9b5760405162461bcd60e51b8152600401610bf1906134b0565b601054601154611aab919061356e565b4211611af95760405162461bcd60e51b815260206004820181905260248201527f4d757374207761697420666f7220636f6f6c646f776e20746f2066696e6973686044820152606401610bf1565b6103e8821115611b5e5760405162461bcd60e51b815260206004820152602a60248201527f4d6179206e6f74206e756b65206d6f7265207468616e20313025206f6620746f60448201526906b656e7320696e204c560b41b6064820152608401610bf1565b426011556040516370a0823160e01b81526001600160a01b037f0000000000000000000000008fbffcd12d2e07f1c25497239ec696727cd947a516600482015260009030906370a0823190602401602060405180830381865afa158015611bc9573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611bed9190613581565b90506000612710611bfe8584613535565b611c08919061354c565b90508015611c3d57611c3d7f0000000000000000000000008fbffcd12d2e07f1c25497239ec696727cd947a561dead8361287c565b60007f0000000000000000000000008fbffcd12d2e07f1c25497239ec696727cd947a59050806001600160a01b031663fff6cae96040518163ffffffff1660e01b8152600401600060405180830381600087803b158015611c9d57600080fd5b505af1158015611cb1573d6000803e3d6000fd5b50506040517f8462566617872a3fbab94534675218431ff9e204063ee3f4f43d965626a39abb925060009150a1506001949350505050565b6001600160a01b038316611d4b5760405162461bcd60e51b8152602060048201526024808201527f45524332303a20617070726f76652066726f6d20746865207a65726f206164646044820152637265737360e01b6064820152608401610bf1565b6001600160a01b038216611dac5760405162461bcd60e51b815260206004820152602260248201527f45524332303a20617070726f766520746f20746865207a65726f206164647265604482015261737360f01b6064820152608401610bf1565b6001600160a01b0383811660008181526001602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925910160405180910390a3505050565b6001600160a01b038316611e335760405162461bcd60e51b8152600401610bf19061359a565b6001600160a01b038216611e595760405162461bcd60e51b8152600401610bf1906135df565b80600003611e6d5761121c8383600061287c565b601254610100900460ff16611f00576001600160a01b03831660009081526021602052604090205460ff1680611ebb57506001600160a01b03821660009081526021602052604090205460ff165b611f005760405162461bcd60e51b81526020600482015260166024820152752a3930b234b7339034b9903737ba1030b1ba34bb329760511b6044820152606401610bf1565b60125460ff16156123c6576005546001600160a01b03848116911614801590611f3757506005546001600160a01b03838116911614155b8015611f4e57506001600160a01b03821661dead14155b8015611f645750600554600160a01b900460ff16155b8015611f8957506001600160a01b03831660009081526021602052604090205460ff16155b8015611fae57506001600160a01b03821660009081526021602052604090205460ff16155b156123c65760155460ff16156120fa576005546001600160a01b0383811691161480159061200e57507f0000000000000000000000007a250d5630b4cf539739df2c5dacb4c659f2488d6001600160a01b0316826001600160a01b031614155b801561204c57507f0000000000000000000000008fbffcd12d2e07f1c25497239ec696727cd947a56001600160a01b0316826001600160a01b031614155b156120fa573260009081526014602052604090205443116120e75760405162461bcd60e51b815260206004820152604960248201527f5f7472616e736665723a3a205472616e736665722044656c617920656e61626c60448201527f65642e20204f6e6c79206f6e652070757263686173652070657220626c6f636b6064820152681030b63637bbb2b21760b91b608482015260a401610bf1565b3260009081526014602052604090204390555b606461210560025490565b612110906001613535565b61211a919061354c565b600854108015612137575060135461213390600361356e565b4310155b1561216057606461214760025490565b612152906001613535565b61215c919061354c565b6008555b6001600160a01b03831660009081526023602052604090205460ff1680156121a157506001600160a01b03821660009081526022602052604090205460ff16155b15612285576008548111156122165760405162461bcd60e51b815260206004820152603560248201527f427579207472616e7366657220616d6f756e742065786365656473207468652060448201527436b0bc2a3930b739b0b1ba34b7b720b6b7bab73a1760591b6064820152608401610bf1565b600a546001600160a01b03831660009081526020819052604090205461223c908361356e565b11156122805760405162461bcd60e51b815260206004820152601360248201527213585e081dd85b1b195d08195e18d959591959606a1b6044820152606401610bf1565b6123c6565b6001600160a01b03821660009081526023602052604090205460ff1680156122c657506001600160a01b03831660009081526022602052604090205460ff16155b1561233c576008548111156122805760405162461bcd60e51b815260206004820152603660248201527f53656c6c207472616e7366657220616d6f756e742065786365656473207468656044820152751036b0bc2a3930b739b0b1ba34b7b720b6b7bab73a1760511b6064820152608401610bf1565b6001600160a01b03821660009081526022602052604090205460ff166123c657600a546001600160a01b038316600090815260208190526040902054612382908361356e565b11156123c65760405162461bcd60e51b815260206004820152601360248201527213585e081dd85b1b195d08195e18d959591959606a1b6044820152606401610bf1565b30600090815260208190526040902054600954811080159081906123f2575060125462010000900460ff165b80156124085750600554600160a01b900460ff16155b801561242d57506001600160a01b03851660009081526023602052604090205460ff16155b801561245257506001600160a01b03851660009081526021602052604090205460ff16155b801561247757506001600160a01b03841660009081526021602052604090205460ff16155b156124a5576005805460ff60a01b1916600160a01b1790556124976129d1565b6005805460ff60a01b191690555b600554600160a01b900460ff161580156124d757506001600160a01b03841660009081526023602052604090205460ff165b80156124e55750600d5460ff165b80156125005750600e54600f546124fc919061356e565b4210155b801561252557506001600160a01b03851660009081526021602052604090205460ff16155b1561253457612532612c51565b505b6005546001600160a01b03861660009081526021602052604090205460ff600160a01b90920482161591168061258257506001600160a01b03851660009081526021602052604090205460ff165b1561258b575060005b60008115612770576001600160a01b03861660009081526023602052604090205460ff1680156125bd57506000601a54115b15612675576064601a54866125d29190613535565b6125dc919061354c565b9050601a54601c54826125ef9190613535565b6125f9919061354c565b601f600082825461260a919061356e565b9091555050601a54601d5461261f9083613535565b612629919061354c565b6020600082825461263a919061356e565b9091555050601a54601b5461264f9083613535565b612659919061354c565b601e600082825461266a919061356e565b909155506127529050565b6001600160a01b03871660009081526023602052604090205460ff16801561269f57506000601654115b15612752576064601654866126b49190613535565b6126be919061354c565b9050601654601854826126d19190613535565b6126db919061354c565b601f60008282546126ec919061356e565b90915550506016546019546127019083613535565b61270b919061354c565b6020600082825461271c919061356e565b90915550506016546017546127319083613535565b61273b919061354c565b601e600082825461274c919061356e565b90915550505b80156127635761276387308361287c565b61276d8186613622565b94505b61277b87878761287c565b50505050505050565b600580546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b604080516001600160a01b038416602482015260448082018490528251808303909101815260649091019091526020810180516001600160e01b031663a9059cbb60e01b17905261121c908490612de1565b6001600160a01b038216600081815260236020526040808220805460ff191685151590811790915590519092917fffa9187bf1f18bf477bd0ea1bcbb64e93b6a98132473929edfce215cd9b16fab91a35050565b6001600160a01b0383166128a25760405162461bcd60e51b8152600401610bf19061359a565b6001600160a01b0382166128c85760405162461bcd60e51b8152600401610bf1906135df565b6001600160a01b038316600090815260208190526040902054818110156129405760405162461bcd60e51b815260206004820152602660248201527f45524332303a207472616e7366657220616d6f756e7420657863656564732062604482015265616c616e636560d01b6064820152608401610bf1565b6001600160a01b0380851660009081526020819052604080822085850390559185168152908120805484929061297790849061356e565b92505081905550826001600160a01b0316846001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef846040516129c391815260200190565b60405180910390a350505050565b3060009081526020819052604081205490506000602054601e54601f546129f8919061356e565b612a02919061356e565b90506000821580612a11575081155b15612a1b57505050565b600954612a29906028613535565b831115612a4157600954612a3e906028613535565b92505b6000600283601f5486612a549190613535565b612a5e919061354c565b612a68919061354c565b90506000612a768286613622565b905047612a8282612eb3565b6000612a8e8247613622565b905060006002601f54612aa1919061354c565b612aab9088613622565b601e54612ab89084613535565b612ac2919061354c565b905060006002601f54612ad5919061354c565b612adf9089613622565b602054612aec9085613535565b612af6919061354c565b9050600081612b058486613622565b612b0f9190613622565b6000601f819055601e81905560208190556007546040519293506001600160a01b031691849181818185875af1925050503d8060008114612b6c576040519150601f19603f3d011682016040523d82523d6000602084013e612b71565b606091505b50508098505081600b6000828254612b89919061356e565b90915550508615801590612b9d5750600081115b15612bf057612bac8782613038565b601f54604080518881526020810184905280820192909252517f17bbfb9a6069321b6ded73bd96327c9e6b7212a5cd51ff219cd61370acafb5619181900360600190a15b6006546040516001600160a01b03909116904790600081818185875af1925050503d8060008114612c3d576040519150601f19603f3d011682016040523d82523d6000602084013e612c42565b606091505b50505050505050505050505050565b42600f556040516370a0823160e01b81526001600160a01b037f0000000000000000000000008fbffcd12d2e07f1c25497239ec696727cd947a5166004820152600090819030906370a0823190602401602060405180830381865afa158015612cbe573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612ce29190613581565b90506000612710600c5483612cf79190613535565b612d01919061354c565b90508015612d3657612d367f0000000000000000000000008fbffcd12d2e07f1c25497239ec696727cd947a561dead8361287c565b60007f0000000000000000000000008fbffcd12d2e07f1c25497239ec696727cd947a59050806001600160a01b031663fff6cae96040518163ffffffff1660e01b8152600401600060405180830381600087803b158015612d9657600080fd5b505af1158015612daa573d6000803e3d6000fd5b50506040517f454c91ae84fcc766ddda0dcb289f26b3d0176efeacf4061fc219fa6ca8c3048d925060009150a16001935050505090565b6000612e36826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564815250856001600160a01b03166131139092919063ffffffff16565b80519091501561121c5780806020019051810190612e549190613635565b61121c5760405162461bcd60e51b815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e6044820152691bdd081cdd58d8d9595960b21b6064820152608401610bf1565b6040805160028082526060820183526000926020830190803683370190505090503081600081518110612ee857612ee8613652565b60200260200101906001600160a01b031690816001600160a01b0316815250507f0000000000000000000000007a250d5630b4cf539739df2c5dacb4c659f2488d6001600160a01b031663ad5c46486040518163ffffffff1660e01b8152600401602060405180830381865afa158015612f66573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612f8a9190613668565b81600181518110612f9d57612f9d613652565b6001600160a01b03928316602091820292909201015260405163791ac94760e01b81527f0000000000000000000000007a250d5630b4cf539739df2c5dacb4c659f2488d9091169063791ac94790613002908590600090869030904290600401613685565b600060405180830381600087803b15801561301c57600080fd5b505af1158015613030573d6000803e3d6000fd5b505050505050565b7f0000000000000000000000007a250d5630b4cf539739df2c5dacb4c659f2488d6001600160a01b031663f305d71982308560008061307f6005546001600160a01b031690565b60405160e088901b6001600160e01b03191681526001600160a01b03958616600482015260248101949094526044840192909252606483015290911660848201524260a482015260c40160606040518083038185885af11580156130e7573d6000803e3d6000fd5b50505050506040513d601f19601f8201168201806040525081019061310c91906136f6565b5050505050565b6060613122848460008561312a565b949350505050565b60608247101561318b5760405162461bcd60e51b815260206004820152602660248201527f416464726573733a20696e73756666696369656e742062616c616e636520666f6044820152651c8818d85b1b60d21b6064820152608401610bf1565b600080866001600160a01b031685876040516131a79190613724565b60006040518083038185875af1925050503d80600081146131e4576040519150601f19603f3d011682016040523d82523d6000602084013e6131e9565b606091505b50915091506131fa87838387613205565b979650505050505050565b6060831561327457825160000361326d576001600160a01b0385163b61326d5760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e74726163740000006044820152606401610bf1565b5081613122565b61312283838151156132895781518083602001fd5b8060405162461bcd60e51b8152600401610bf191906132c7565b60005b838110156132be5781810151838201526020016132a6565b50506000910152565b60208152600082518060208401526132e68160408501602087016132a3565b601f01601f19169190910160400192915050565b6001600160a01b0381168114610c8c57600080fd5b6000806040838503121561332257600080fd5b823561332d816132fa565b946020939093013593505050565b60006020828403121561334d57600080fd5b8135613358816132fa565b9392505050565b60006020828403121561337157600080fd5b5035919050565b60008060006060848603121561338d57600080fd5b8335613398816132fa565b925060208401356133a8816132fa565b929592945050506040919091013590565b8015158114610c8c57600080fd5b6000806000606084860312156133dc57600080fd5b833592506020840135915060408401356133f5816133b9565b809150509250925092565b6000806040838503121561341357600080fd5b823561341e816132fa565b9150602083013561342e816133b9565b809150509250929050565b60008060006060848603121561344e57600080fd5b505081359360208301359350604090920135919050565b6000806040838503121561347857600080fd5b8235613483816132fa565b9150602083013561342e816132fa565b6000602082840312156134a557600080fd5b8135613358816133b9565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b600181811c908216806134f957607f821691505b60208210810361351957634e487b7160e01b600052602260045260246000fd5b50919050565b634e487b7160e01b600052601160045260246000fd5b8082028115828204841417610d3257610d3261351f565b60008261356957634e487b7160e01b600052601260045260246000fd5b500490565b80820180821115610d3257610d3261351f565b60006020828403121561359357600080fd5b5051919050565b60208082526025908201527f45524332303a207472616e736665722066726f6d20746865207a65726f206164604082015264647265737360d81b606082015260800190565b60208082526023908201527f45524332303a207472616e7366657220746f20746865207a65726f206164647260408201526265737360e81b606082015260800190565b81810381811115610d3257610d3261351f565b60006020828403121561364757600080fd5b8151613358816133b9565b634e487b7160e01b600052603260045260246000fd5b60006020828403121561367a57600080fd5b8151613358816132fa565b600060a082018783526020878185015260a0604085015281875180845260c086019150828901935060005b818110156136d55784516001600160a01b0316835293830193918301916001016136b0565b50506001600160a01b03969096166060850152505050608001529392505050565b60008060006060848603121561370b57600080fd5b8351925060208401519150604084015190509250925092565b600082516137368184602087016132a3565b919091019291505056fea2646970667358221220e308d3a691e7433981e1ad9fc35756b0887d9d28b537c92c7ca77d2949c51ee964736f6c63430008110033
Deployed Bytecode Sourcemap
39035:20998:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;59406:195;;;;;;;;;;;;;:::i;:::-;;9655:100;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;11822:169;;;;;;;;;;-1:-1:-1;11822:169:0;;;;;:::i;:::-;;:::i;:::-;;;1291:14:1;;1284:22;1266:41;;1254:2;1239:18;11822:169:0;1126:187:1;40782:63:0;;;;;;;;;;-1:-1:-1;40782:63:0;;;;;:::i;:::-;;;;;;;;;;;;;;;;39476:48;;;;;;;;;;;;;;;;;;;1716:25:1;;;1704:2;1689:18;39476:48:0;1570:177:1;48591:205:0;;;;;;;;;;-1:-1:-1;48591:205:0;;;;;:::i;:::-;;:::i;39084:51::-;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;1943:32:1;;;1925:51;;1913:2;1898:18;39084:51:0;1752:230:1;10775:108:0;;;;;;;;;;-1:-1:-1;10863:12:0;;10775:108;;39719:47;;;;;;;;;;;;;;;;39533:36;;;;;;;;;;;;;;;;40555:33;;;;;;;;;;;;;;;;40515;;;;;;;;;;;;;;;;45825:272;;;;;;;;;;-1:-1:-1;45825:272:0;;;;;:::i;:::-;;:::i;12473:571::-;;;;;;;;;;-1:-1:-1;12473:571:0;;;;;:::i;:::-;;:::i;39187:53::-;;;;;;;;;;;;39233:6;39187:53;;39629:45;;;;;;;;;;;;;;;;39589:33;;;;;;;;;;-1:-1:-1;39589:33:0;;;;;;;;10617:93;;;;;;;;;;-1:-1:-1;10617:93:0;;10700:2;2983:36:1;;2971:2;2956:18;10617:93:0;2841:184:1;13453:215:0;;;;;;;;;;-1:-1:-1;13453:215:0;;;;;:::i;:::-;;:::i;39142:38::-;;;;;;;;;;;;;;;39817:33;;;;;;;;;;-1:-1:-1;39817:33:0;;;;;;;;48804:126;;;;;;;;;;-1:-1:-1;48804:126:0;;;;;:::i;:::-;-1:-1:-1;;;;;48894:28:0;48870:4;48894:28;;;:19;:28;;;;;;;;;48804:126;40595:38;;;;;;;;;;;;;;;;40359:28;;;;;;;;;;;;;;;;39897:31;;;;;;;;;;-1:-1:-1;39897:31:0;;;;;;;;;;;10946:127;;;;;;;;;;-1:-1:-1;10946:127:0;;;;;:::i;:::-;-1:-1:-1;;;;;11047:18:0;11020:7;11047:18;;;;;;;;;;;;10946:127;40470:36;;;;;;;;;;;;;;;;2890:103;;;;;;;;;;;;;:::i;57019:555::-;;;;;;;;;;-1:-1:-1;57019:555:0;;;;;:::i;:::-;;:::i;44933:121::-;;;;;;;;;;;;;:::i;46366:167::-;;;;;;;;;;-1:-1:-1;46366:167:0;;;;;:::i;:::-;;:::i;39279:30::-;;;;;;;;;;-1:-1:-1;39279:30:0;;;;-1:-1:-1;;;;;39279:30:0;;;39316:36;;;;;;;;;;-1:-1:-1;39316:36:0;;;;-1:-1:-1;;;;;39316:36:0;;;40241:30;;;;;;;;;;;;;;;;46737:445;;;;;;;;;;-1:-1:-1;46737:445:0;;;;;:::i;:::-;;:::i;59609:421::-;;;;;;;;;;-1:-1:-1;59609:421:0;;;;;:::i;:::-;;:::i;44679:202::-;;;;;;;;;;;;;:::i;40315:35::-;;;;;;;;;;;;;;;;2239:87;;;;;;;;;;-1:-1:-1;2312:6:0;;-1:-1:-1;;;;;2312:6:0;2239:87;;40394:31;;;;;;;;;;;;;;;;46629:100;;;;;;;;;;-1:-1:-1;46629:100:0;;;;;:::i;:::-;;:::i;9874:104::-;;;;;;;;;;;;;:::i;47844:304::-;;;;;;;;;;-1:-1:-1;47844:304:0;;;;;:::i;:::-;;:::i;39773:35::-;;;;;;;;;;;;;;;;14171:413;;;;;;;;;;-1:-1:-1;14171:413:0;;;;;:::i;:::-;;:::i;39681:29::-;;;;;;;;;;;;;;;;11286:175;;;;;;;;;;-1:-1:-1;11286:175:0;;;;;:::i;:::-;;:::i;48352:231::-;;;;;;;;;;-1:-1:-1;48352:231:0;;;;;:::i;:::-;;:::i;41003:57::-;;;;;;;;;;-1:-1:-1;41003:57:0;;;;;:::i;:::-;;;;;;;;;;;;;;;;39857:33;;;;;;;;;;-1:-1:-1;39857:33:0;;;;;;;;;;;47654:182;;;;;;;;;;-1:-1:-1;47654:182:0;;;;;:::i;:::-;;:::i;47190:456::-;;;;;;;;;;-1:-1:-1;47190:456:0;;;;;:::i;:::-;;:::i;46105:253::-;;;;;;;;;;-1:-1:-1;46105:253:0;;;;;:::i;:::-;;:::i;40159:39::-;;;;;;;;;;-1:-1:-1;40159:39:0;;;;;;;;39361:35;;;;;;;;;;;;;;;;45320:497;;;;;;;;;;-1:-1:-1;45320:497:0;;;;;:::i;:::-;;:::i;40207:27::-;;;;;;;;;;;;;;;;11524:151;;;;;;;;;;-1:-1:-1;11524:151:0;;;;;:::i;:::-;-1:-1:-1;;;;;11640:18:0;;;11613:7;11640:18;;;:11;:18;;;;;;;;:27;;;;;;;;;;;;;11524:151;39403:33;;;;;;;;;;;;;;;;45115:135;;;;;;;;;;;;;:::i;39935:37::-;;;;;;;;;;;;;;;;40278:30;;;;;;;;;;;;;;;;3148:201;;;;;;;;;;-1:-1:-1;3148:201:0;;;;;:::i;:::-;;:::i;40432:31::-;;;;;;;;;;;;;;;;39443:24;;;;;;;;;;;;;;;;58348:1050;;;;;;;;;;-1:-1:-1;58348:1050:0;;;;;:::i;:::-;;:::i;59406:195::-;2312:6;;-1:-1:-1;;;;;2312:6:0;992:10;2459:23;2451:68;;;;-1:-1:-1;;;2451:68:0;;;;;;;:::i;:::-;;;;;;;;;59492:49:::1;::::0;59455:12:::1;::::0;59492:10:::1;::::0;59515:21:::1;::::0;59455:12;59492:49;59455:12;59492:49;59515:21;59492:10;:49:::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;59478:63;;;;;59560:7;59552:41;;;::::0;-1:-1:-1;;;59552:41:0;;5655:2:1;59552:41:0::1;::::0;::::1;5637:21:1::0;5694:2;5674:18;;;5667:30;-1:-1:-1;;;5713:18:1;;;5706:51;5774:18;;59552:41:0::1;5453:345:1::0;59552:41:0::1;59444:157;59406:195::o:0;9655:100::-;9709:13;9742:5;9735:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;9655:100;:::o;11822:169::-;11905:4;11922:39;992:10;11945:7;11954:6;11922:8;:39::i;:::-;-1:-1:-1;11979:4:0;11822:169;;;;;:::o;48591:205::-;2312:6;;-1:-1:-1;;;;;2312:6:0;992:10;2459:23;2451:68;;;;-1:-1:-1;;;2451:68:0;;;;;;;:::i;:::-;48722:21:::1;::::0;48682:62:::1;::::0;-1:-1:-1;;;;;48722:21:0;;::::1;::::0;48682:62;::::1;::::0;::::1;::::0;48722:21:::1;::::0;48682:62:::1;48755:21;:33:::0;;-1:-1:-1;;;;;;48755:33:0::1;-1:-1:-1::0;;;;;48755:33:0;;;::::1;::::0;;;::::1;::::0;;48591:205::o;45825:272::-;2312:6;;-1:-1:-1;;;;;2312:6:0;992:10;2459:23;2451:68;;;;-1:-1:-1;;;2451:68:0;;;;;;;:::i;:::-;45961:4:::1;45954:3;45933:13;10863:12:::0;;;10775:108;45933:13:::1;:17;::::0;45949:1:::1;45933:17;:::i;:::-;45932:25;;;;:::i;:::-;45931:34;;;;:::i;:::-;45921:6;:44;;45899:139;;;::::0;-1:-1:-1;;;45899:139:0;;6917:2:1;45899:139:0::1;::::0;::::1;6899:21:1::0;6956:2;6936:18;;;6929:30;6995:34;6975:18;;;6968:62;-1:-1:-1;;;7046:18:1;;;7039:43;7099:19;;45899:139:0::1;6715:409:1::0;45899:139:0::1;46072:17;:6:::0;46082::::1;46072:17;:::i;:::-;46049:20;:40:::0;-1:-1:-1;45825:272:0:o;12473:571::-;12613:4;12630:36;12640:6;12648:9;12659:6;12630:9;:36::i;:::-;-1:-1:-1;;;;;12706:19:0;;12679:24;12706:19;;;:11;:19;;;;;;;;992:10;12706:33;;;;;;;;-1:-1:-1;;12753:37:0;;12750:263;;12834:6;12814:16;:26;;12806:79;;;;-1:-1:-1;;;12806:79:0;;7331:2:1;12806:79:0;;;7313:21:1;7370:2;7350:18;;;7343:30;7409:34;7389:18;;;7382:62;-1:-1:-1;;;7460:18:1;;;7453:38;7508:19;;12806:79:0;7129:404:1;12806:79:0;12929:57;12938:6;992:10;12979:6;12960:16;:25;12929:8;:57::i;:::-;-1:-1:-1;13032:4:0;;12473:571;-1:-1:-1;;;;12473:571:0:o;13453:215::-;992:10;13541:4;13590:25;;;:11;:25;;;;;;;;-1:-1:-1;;;;;13590:34:0;;;;;;;;;;13541:4;;13558:80;;13581:7;;13590:47;;13627:10;;13590:47;:::i;:::-;13558:8;:80::i;2890:103::-;2312:6;;-1:-1:-1;;;;;2312:6:0;992:10;2459:23;2451:68;;;;-1:-1:-1;;;2451:68:0;;;;;;;:::i;:::-;2955:30:::1;2982:1;2955:18;:30::i;:::-;2890:103::o:0;57019:555::-;2312:6;;-1:-1:-1;;;;;2312:6:0;992:10;2459:23;2451:68;;;;-1:-1:-1;;;2451:68:0;;;;;;;:::i;:::-;57221:3:::1;57198:19;:26;;57176:127;;;::::0;-1:-1:-1;;;57176:127:0;;7870:2:1;57176:127:0::1;::::0;::::1;7852:21:1::0;7909:2;7889:18;;;7882:30;7948:34;7928:18;;;7921:62;-1:-1:-1;;;7999:18:1;;;7992:49;8058:19;;57176:127:0::1;7668:415:1::0;57176:127:0::1;57348:4;57336:8;:16;;:33;;;;-1:-1:-1::0;57356:13:0;57336:33:::1;57314:131;;;::::0;-1:-1:-1;;;57314:131:0;;8290:2:1;57314:131:0::1;::::0;::::1;8272:21:1::0;8329:2;8309:18;;;8302:30;8368:34;8348:18;;;8341:62;-1:-1:-1;;;8419:18:1;;;8412:46;8475:19;;57314:131:0::1;8088:412:1::0;57314:131:0::1;57456:15;:37:::0;;;;57504:16:::1;:27:::0;57542:13:::1;:24:::0;;-1:-1:-1;;57542:24:0::1;::::0;::::1;;::::0;;;::::1;::::0;;57019:555::o;44933:121::-;2312:6;;44985:4;;-1:-1:-1;;;;;2312:6:0;992:10;2459:23;2451:68;;;;-1:-1:-1;;;2451:68:0;;;;;;;:::i;:::-;-1:-1:-1;45002:14:0::1;:22:::0;;-1:-1:-1;;45002:22:0::1;::::0;;;44933:121;:::o;46366:167::-;2312:6;;-1:-1:-1;;;;;2312:6:0;992:10;2459:23;2451:68;;;;-1:-1:-1;;;2451:68:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;46479:39:0;;;::::1;;::::0;;;:31:::1;:39;::::0;;;;:46;;-1:-1:-1;;46479:46:0::1;::::0;::::1;;::::0;;;::::1;::::0;;46366:167::o;46737:445::-;2312:6;;-1:-1:-1;;;;;2312:6:0;992:10;2459:23;2451:68;;;;-1:-1:-1;;;2451:68:0;;;;;;;:::i;:::-;46898:15:::1;:31:::0;;;46940:15:::1;:31:::0;;;46982:20:::1;:41:::0;;;47005:18;47049:33:::1;46958:13:::0;46916;47049:33:::1;:::i;:::-;:56;;;;:::i;:::-;47034:12;:71:::0;;;47140:1:::1;-1:-1:-1::0;47124:17:0::1;47116:58;;;::::0;-1:-1:-1;;;47116:58:0;;8707:2:1;47116:58:0::1;::::0;::::1;8689:21:1::0;8746:2;8726:18;;;8719:30;8785;8765:18;;;8758:58;8833:18;;47116:58:0::1;8505:352:1::0;47116:58:0::1;46737:445:::0;;;:::o;59609:421::-;2312:6;;-1:-1:-1;;;;;2312:6:0;992:10;2459:23;2451:68;;;;-1:-1:-1;;;2451:68:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;59706:20:0;::::1;59698:59;;;::::0;-1:-1:-1;;;59698:59:0;;9064:2:1;59698:59:0::1;::::0;::::1;9046:21:1::0;9103:2;9083:18;;;9076:30;9142:28;9122:18;;;9115:56;9188:18;;59698:59:0::1;8862:350:1::0;59698:59:0::1;-1:-1:-1::0;;;;;59776:23:0;::::1;59794:4;59776:23;;::::0;:41:::1;;-1:-1:-1::0;59804:13:0::1;::::0;::::1;::::0;::::1;;;59803:14;59776:41;59768:106;;;::::0;-1:-1:-1;;;59768:106:0;;9419:2:1;59768:106:0::1;::::0;::::1;9401:21:1::0;9458:2;9438:18;;;9431:30;9497:34;9477:18;;;9470:62;-1:-1:-1;;;9548:18:1;;;9541:50;9608:19;;59768:106:0::1;9217:416:1::0;59768:106:0::1;59912:39;::::0;-1:-1:-1;;;59912:39:0;;59945:4:::1;59912:39;::::0;::::1;1925:51:1::0;59885:24:0::1;::::0;-1:-1:-1;;;;;59912:24:0;::::1;::::0;::::1;::::0;1898:18:1;;59912:39:0::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;59885:66;;59962:60;59992:6;60000:3;60005:16;59962:22;:60::i;44679:202::-:0;2312:6;;-1:-1:-1;;;;;2312:6:0;992:10;2459:23;2451:68;;;;-1:-1:-1;;;2451:68:0;;;;;;;:::i;:::-;44734:13:::1;:20:::0;;44786:15:::1;44765:18;:36:::0;;;-1:-1:-1;;44812:18:0;;;;;;;;44841:14:::1;:32:::0;44679:202::o;46629:100::-;2312:6;;-1:-1:-1;;;;;2312:6:0;992:10;2459:23;2451:68;;;;-1:-1:-1;;;2451:68:0;;;;;;;:::i;:::-;46700:11:::1;:21:::0;;;::::1;;::::0;::::1;-1:-1:-1::0;;46700:21:0;;::::1;::::0;;;::::1;::::0;;46629:100::o;9874:104::-;9930:13;9963:7;9956:14;;;;;:::i;47844:304::-;2312:6;;-1:-1:-1;;;;;2312:6:0;992:10;2459:23;2451:68;;;;-1:-1:-1;;;2451:68:0;;;;;;;:::i;:::-;47988:13:::1;-1:-1:-1::0;;;;;47980:21:0::1;:4;-1:-1:-1::0;;;;;47980:21:0::1;::::0;47958:128:::1;;;::::0;-1:-1:-1;;;47958:128:0;;10029:2:1;47958:128:0::1;::::0;::::1;10011:21:1::0;10068:2;10048:18;;;10041:30;10107:34;10087:18;;;10080:62;10178:27;10158:18;;;10151:55;10223:19;;47958:128:0::1;9827:421:1::0;47958:128:0::1;48099:41;48128:4;48134:5;48099:28;:41::i;:::-;47844:304:::0;;:::o;14171:413::-;992:10;14264:4;14308:25;;;:11;:25;;;;;;;;-1:-1:-1;;;;;14308:34:0;;;;;;;;;;14361:35;;;;14353:85;;;;-1:-1:-1;;;14353:85:0;;10455:2:1;14353:85:0;;;10437:21:1;10494:2;10474:18;;;10467:30;10533:34;10513:18;;;10506:62;-1:-1:-1;;;10584:18:1;;;10577:35;10629:19;;14353:85:0;10253:401:1;14353:85:0;14474:67;992:10;14497:7;14525:15;14506:16;:34;14474:8;:67::i;:::-;-1:-1:-1;14572:4:0;;14171:413;-1:-1:-1;;;14171:413:0:o;11286:175::-;11372:4;11389:42;992:10;11413:9;11424:6;11389:9;:42::i;48352:231::-;2312:6;;-1:-1:-1;;;;;2312:6:0;992:10;2459:23;2451:68;;;;-1:-1:-1;;;2451:68:0;;;;;;;:::i;:::-;48512:15:::1;::::0;48469:59:::1;::::0;-1:-1:-1;;;;;48512:15:0;;::::1;::::0;48469:59;::::1;::::0;::::1;::::0;48512:15:::1;::::0;48469:59:::1;48539:15;:36:::0;;-1:-1:-1;;;;;;48539:36:0::1;-1:-1:-1::0;;;;;48539:36:0;;;::::1;::::0;;;::::1;::::0;;48352:231::o;47654:182::-;2312:6;;-1:-1:-1;;;;;2312:6:0;992:10;2459:23;2451:68;;;;-1:-1:-1;;;2451:68:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;47739:28:0;::::1;;::::0;;;:19:::1;:28;::::0;;;;;;;;:39;;-1:-1:-1;;47739:39:0::1;::::0;::::1;;::::0;;::::1;::::0;;;47794:34;;1266:41:1;;;47794:34:0::1;::::0;1239:18:1;47794:34:0::1;;;;;;;47654:182:::0;;:::o;47190:456::-;2312:6;;-1:-1:-1;;;;;2312:6:0;992:10;2459:23;2451:68;;;;-1:-1:-1;;;2451:68:0;;;;;;;:::i;:::-;47352:16:::1;:32:::0;;;47395:16:::1;:32:::0;;;47438:21:::1;:42:::0;;;47462:18;47507:35:::1;47414:13:::0;47371;47507:35:::1;:::i;:::-;:59;;;;:::i;:::-;47491:13;:75:::0;;;47602:2:::1;-1:-1:-1::0;47585:19:0::1;47577:61;;;::::0;-1:-1:-1;;;47577:61:0;;10861:2:1;47577:61:0::1;::::0;::::1;10843:21:1::0;10900:2;10880:18;;;10873:30;10939:31;10919:18;;;10912:59;10988:18;;47577:61:0::1;10659:353:1::0;46105:253:0;2312:6;;-1:-1:-1;;;;;2312:6:0;992:10;2459:23;2451:68;;;;-1:-1:-1;;;2451:68:0;;;;;;;:::i;:::-;46244:4:::1;46237:3;46216:13;10863:12:::0;;;10775:108;46216:13:::1;:17;::::0;46232:1:::1;46216:17;:::i;:::-;46215:25;;;;:::i;:::-;46214:34;;;;:::i;:::-;46204:6;:44;;46182:128;;;::::0;-1:-1:-1;;;46182:128:0;;11219:2:1;46182:128:0::1;::::0;::::1;11201:21:1::0;11258:2;11238:18;;;11231:30;11297:34;11277:18;;;11270:62;-1:-1:-1;;;11348:18:1;;;11341:32;11390:19;;46182:128:0::1;11017:398:1::0;46182:128:0::1;46333:17;:6:::0;46343::::1;46333:17;:::i;:::-;46321:9;:29:::0;-1:-1:-1;46105:253:0:o;45320:497::-;2312:6;;45428:4;;-1:-1:-1;;;;;2312:6:0;992:10;2459:23;2451:68;;;;-1:-1:-1;;;2451:68:0;;;;;;;:::i;:::-;45507:6:::1;45486:13;10863:12:::0;;;10775:108;45486:13:::1;:17;::::0;45502:1:::1;45486:17;:::i;:::-;45485:28;;;;:::i;:::-;45472:9;:41;;45450:144;;;::::0;-1:-1:-1;;;45450:144:0;;11622:2:1;45450:144:0::1;::::0;::::1;11604:21:1::0;11661:2;11641:18;;;11634:30;11700:34;11680:18;;;11673:62;-1:-1:-1;;;11751:18:1;;;11744:51;11812:19;;45450:144:0::1;11420:417:1::0;45450:144:0::1;45662:4;45641:13;10863:12:::0;;;10775:108;45641:13:::1;:17;::::0;45657:1:::1;45641:17;:::i;:::-;45640:26;;;;:::i;:::-;45627:9;:39;;45605:141;;;::::0;-1:-1:-1;;;45605:141:0;;12044:2:1;45605:141:0::1;::::0;::::1;12026:21:1::0;12083:2;12063:18;;;12056:30;12122:34;12102:18;;;12095:62;-1:-1:-1;;;12173:18:1;;;12166:50;12233:19;;45605:141:0::1;11842:416:1::0;45605:141:0::1;-1:-1:-1::0;45757:18:0::1;:30:::0;45805:4:::1;::::0;45320:497::o;45115:135::-;2312:6;;45175:4;;-1:-1:-1;;;;;2312:6:0;992:10;2459:23;2451:68;;;;-1:-1:-1;;;2451:68:0;;;;;;;:::i;:::-;-1:-1:-1;45192:20:0::1;:28:::0;;-1:-1:-1;;45192:28:0::1;::::0;;;45115:135;:::o;3148:201::-;2312:6;;-1:-1:-1;;;;;2312:6:0;992:10;2459:23;2451:68;;;;-1:-1:-1;;;2451:68:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;3237:22:0;::::1;3229:73;;;::::0;-1:-1:-1;;;3229:73:0;;12465:2:1;3229:73:0::1;::::0;::::1;12447:21:1::0;12504:2;12484:18;;;12477:30;12543:34;12523:18;;;12516:62;-1:-1:-1;;;12594:18:1;;;12587:36;12640:19;;3229:73:0::1;12263:402:1::0;3229:73:0::1;3313:28;3332:8;3313:18;:28::i;58348:1050::-:0;2312:6;;58459:4;;-1:-1:-1;;;;;2312:6:0;992:10;2459:23;2451:68;;;;-1:-1:-1;;;2451:68:0;;;;;;;:::i;:::-;58544:19:::1;;58521:20;;:42;;;;:::i;:::-;58503:15;:60;58481:142;;;::::0;-1:-1:-1;;;58481:142:0;;12872:2:1;58481:142:0::1;::::0;::::1;12854:21:1::0;;;12891:18;;;12884:30;12950:34;12930:18;;;12923:62;13002:18;;58481:142:0::1;12670:356:1::0;58481:142:0::1;58653:4;58642:7;:15;;58634:70;;;::::0;-1:-1:-1;;;58634:70:0;;13233:2:1;58634:70:0::1;::::0;::::1;13215:21:1::0;13272:2;13252:18;;;13245:30;13311:34;13291:18;;;13284:62;-1:-1:-1;;;13362:18:1;;;13355:40;13412:19;;58634:70:0::1;13031:406:1::0;58634:70:0::1;58738:15;58715:20;:38:::0;58839:29:::1;::::0;-1:-1:-1;;;58839:29:0;;-1:-1:-1;;;;;58854:13:0::1;1943:32:1::0;58839:29:0::1;::::0;::::1;1925:51:1::0;58808:28:0::1;::::0;58839:4:::1;::::0;:14:::1;::::0;1898:18:1;;58839:29:0::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;58808:60:::0;-1:-1:-1;58918:20:0::1;58974:5;58941:30;58964:7:::0;58808:60;58941:30:::1;:::i;:::-;:38;;;;:::i;:::-;58918:61:::0;-1:-1:-1;59084:16:0;;59080:110:::1;;59117:61;59133:13;59156:6;59165:12;59117:15;:61::i;:::-;59265:19;59302:13;59265:51;;59327:4;-1:-1:-1::0;;;;;59327:9:0::1;;:11;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;-1:-1:-1::0;;59354:14:0::1;::::0;::::1;::::0;-1:-1:-1;59354:14:0;;-1:-1:-1;59354:14:0::1;-1:-1:-1::0;59386:4:0::1;::::0;58348:1050;-1:-1:-1;;;;58348:1050:0:o;17855:380::-;-1:-1:-1;;;;;17991:19:0;;17983:68;;;;-1:-1:-1;;;17983:68:0;;13644:2:1;17983:68:0;;;13626:21:1;13683:2;13663:18;;;13656:30;13722:34;13702:18;;;13695:62;-1:-1:-1;;;13773:18:1;;;13766:34;13817:19;;17983:68:0;13442:400:1;17983:68:0;-1:-1:-1;;;;;18070:21:0;;18062:68;;;;-1:-1:-1;;;18062:68:0;;14049:2:1;18062:68:0;;;14031:21:1;14088:2;14068:18;;;14061:30;14127:34;14107:18;;;14100:62;-1:-1:-1;;;14178:18:1;;;14171:32;14220:19;;18062:68:0;13847:398:1;18062:68:0;-1:-1:-1;;;;;18143:18:0;;;;;;;:11;:18;;;;;;;;:27;;;;;;;;;;;;;:36;;;18195:32;;1716:25:1;;;18195:32:0;;1689:18:1;18195:32:0;;;;;;;17855:380;;;:::o;48938:5336::-;-1:-1:-1;;;;;49070:18:0;;49062:68;;;;-1:-1:-1;;;49062:68:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;49149:16:0;;49141:64;;;;-1:-1:-1;;;49141:64:0;;;;;;;:::i;:::-;49222:6;49232:1;49222:11;49218:93;;49250:28;49266:4;49272:2;49276:1;49250:15;:28::i;49218:93::-;49328:13;;;;;;;49323:183;;-1:-1:-1;;;;;49384:25:0;;;;;;:19;:25;;;;;;;;;:52;;-1:-1:-1;;;;;;49413:23:0;;;;;;:19;:23;;;;;;;;49384:52;49358:136;;;;-1:-1:-1;;;49358:136:0;;15262:2:1;49358:136:0;;;15244:21:1;15301:2;15281:18;;;15274:30;-1:-1:-1;;;15320:18:1;;;15313:52;15382:18;;49358:136:0;15060:346:1;49358:136:0;49522:14;;;;49518:2585;;;2312:6;;-1:-1:-1;;;;;49575:15:0;;;2312:6;;49575:15;;;;:49;;-1:-1:-1;2312:6:0;;-1:-1:-1;;;;;49611:13:0;;;2312:6;;49611:13;;49575:49;:91;;;;-1:-1:-1;;;;;;49645:21:0;;49659:6;49645:21;;49575:91;:121;;;;-1:-1:-1;49688:8:0;;-1:-1:-1;;;49688:8:0;;;;49687:9;49575:121;:168;;;;-1:-1:-1;;;;;;49718:25:0;;;;;;:19;:25;;;;;;;;49717:26;49575:168;:213;;;;-1:-1:-1;;;;;;49765:23:0;;;;;;:19;:23;;;;;;;;49764:24;49575:213;49553:2539;;;49979:20;;;;49975:641;;;2312:6;;-1:-1:-1;;;;;50054:13:0;;;2312:6;;50054:13;;;;:72;;;50110:15;-1:-1:-1;;;;;50096:30:0;:2;-1:-1:-1;;;;;50096:30:0;;;50054:72;:129;;;;;50169:13;-1:-1:-1;;;;;50155:28:0;:2;-1:-1:-1;;;;;50155:28:0;;;50054:129;50024:573;;;50301:9;50272:39;;;;:28;:39;;;;;;50347:12;-1:-1:-1;50234:258:0;;;;-1:-1:-1;;;50234:258:0;;15613:2:1;50234:258:0;;;15595:21:1;15652:2;15632:18;;;15625:30;15691:34;15671:18;;;15664:62;15762:34;15742:18;;;15735:62;-1:-1:-1;;;15813:19:1;;;15806:40;15863:19;;50234:258:0;15411:477:1;50234:258:0;50548:9;50519:39;;;;:28;:39;;;;;50561:12;50519:54;;50024:573;50746:3;50726:13;10863:12;;;10775:108;50726:13;:17;;50742:1;50726:17;:::i;:::-;:23;;;;:::i;:::-;50703:20;;:46;:88;;;;-1:-1:-1;50769:18:0;;:22;;50790:1;50769:22;:::i;:::-;50753:12;:38;;50703:88;50699:182;;;50858:3;50838:13;10863:12;;;10775:108;50838:13;:17;;50854:1;50838:17;:::i;:::-;:23;;;;:::i;:::-;50815:20;:46;50699:182;-1:-1:-1;;;;;50956:31:0;;;;;;:25;:31;;;;;;;;:92;;;;-1:-1:-1;;;;;;51013:35:0;;;;;;:31;:35;;;;;;;;51012:36;50956:92;50930:1147;;;51135:20;;51125:6;:30;;51091:169;;;;-1:-1:-1;;;51091:169:0;;16095:2:1;51091:169:0;;;16077:21:1;16134:2;16114:18;;;16107:30;16173:34;16153:18;;;16146:62;-1:-1:-1;;;16224:18:1;;;16217:51;16285:19;;51091:169:0;15893:417:1;51091:169:0;51343:9;;-1:-1:-1;;;;;11047:18:0;;11020:7;11047:18;;;;;;;;;;;51317:22;;:6;:22;:::i;:::-;:35;;51283:140;;;;-1:-1:-1;;;51283:140:0;;16517:2:1;51283:140:0;;;16499:21:1;16556:2;16536:18;;;16529:30;-1:-1:-1;;;16575:18:1;;;16568:49;16634:18;;51283:140:0;16315:343:1;51283:140:0;50930:1147;;;-1:-1:-1;;;;;51521:29:0;;;;;;:25;:29;;;;;;;;:92;;;;-1:-1:-1;;;;;;51576:37:0;;;;;;:31;:37;;;;;;;;51575:38;51521:92;51495:582;;;51700:20;;51690:6;:30;;51656:170;;;;-1:-1:-1;;;51656:170:0;;16865:2:1;51656:170:0;;;16847:21:1;16904:2;16884:18;;;16877:30;16943:34;16923:18;;;16916:62;-1:-1:-1;;;16994:18:1;;;16987:52;17056:19;;51656:170:0;16663:418:1;51495:582:0;-1:-1:-1;;;;;51857:35:0;;;;;;:31;:35;;;;;;;;51852:225;;51977:9;;-1:-1:-1;;;;;11047:18:0;;11020:7;11047:18;;;;;;;;;;;51951:22;;:6;:22;:::i;:::-;:35;;51917:140;;;;-1:-1:-1;;;51917:140:0;;16517:2:1;51917:140:0;;;16499:21:1;16556:2;16536:18;;;16529:30;-1:-1:-1;;;16575:18:1;;;16568:49;16634:18;;51917:140:0;16315:343:1;51917:140:0;52164:4;52115:28;11047:18;;;;;;;;;;;52222;;52198:42;;;;;;;52271:35;;-1:-1:-1;52295:11:0;;;;;;;52271:35;:61;;;;-1:-1:-1;52324:8:0;;-1:-1:-1;;;52324:8:0;;;;52323:9;52271:61;:110;;;;-1:-1:-1;;;;;;52350:31:0;;;;;;:25;:31;;;;;;;;52349:32;52271:110;:153;;;;-1:-1:-1;;;;;;52399:25:0;;;;;;:19;:25;;;;;;;;52398:26;52271:153;:194;;;;-1:-1:-1;;;;;;52442:23:0;;;;;;:19;:23;;;;;;;;52441:24;52271:194;52253:326;;;52492:8;:15;;-1:-1:-1;;;;52492:15:0;-1:-1:-1;;;52492:15:0;;;52524:10;:8;:10::i;:::-;52551:8;:16;;-1:-1:-1;;;;52551:16:0;;;52253:326;52610:8;;-1:-1:-1;;;52610:8:0;;;;52609:9;:55;;;;-1:-1:-1;;;;;;52635:29:0;;;;;;:25;:29;;;;;;;;52609:55;:85;;;;-1:-1:-1;52681:13:0;;;;52609:85;:153;;;;;52747:15;;52730:14;;:32;;;;:::i;:::-;52711:15;:51;;52609:153;:196;;;;-1:-1:-1;;;;;;52780:25:0;;;;;;:19;:25;;;;;;;;52779:26;52609:196;52591:282;;;52832:29;:27;:29::i;:::-;;52591:282;52901:8;;-1:-1:-1;;;;;53011:25:0;;52885:12;53011:25;;;:19;:25;;;;;;52901:8;-1:-1:-1;;;52901:8:0;;;;;52900:9;;53011:25;;:52;;-1:-1:-1;;;;;;53040:23:0;;;;;;:19;:23;;;;;;;;53011:52;53007:100;;;-1:-1:-1;53090:5:0;53007:100;53119:12;53224:7;53220:1001;;;-1:-1:-1;;;;;53276:29:0;;;;;;:25;:29;;;;;;;;:50;;;;;53325:1;53309:13;;:17;53276:50;53272:800;;;53379:3;53363:13;;53354:6;:22;;;;:::i;:::-;:28;;;;:::i;:::-;53347:35;;53451:13;;53431:16;;53424:4;:23;;;;:::i;:::-;53423:41;;;;:::i;:::-;53401:18;;:63;;;;;;;:::i;:::-;;;;-1:-1:-1;;53543:13:0;;53518:21;;53511:28;;:4;:28;:::i;:::-;53510:46;;;;:::i;:::-;53483:23;;:73;;;;;;;:::i;:::-;;;;-1:-1:-1;;53625:13:0;;53605:16;;53598:23;;:4;:23;:::i;:::-;53597:41;;;;:::i;:::-;53575:18;;:63;;;;;;;:::i;:::-;;;;-1:-1:-1;53272:800:0;;-1:-1:-1;53272:800:0;;-1:-1:-1;;;;;53700:31:0;;;;;;:25;:31;;;;;;;;:51;;;;;53750:1;53735:12;;:16;53700:51;53696:376;;;53803:3;53788:12;;53779:6;:21;;;;:::i;:::-;:27;;;;:::i;:::-;53772:34;;53874:12;;53855:15;;53848:4;:22;;;;:::i;:::-;53847:39;;;;:::i;:::-;53825:18;;:61;;;;;;;:::i;:::-;;;;-1:-1:-1;;53964:12:0;;53940:20;;53933:27;;:4;:27;:::i;:::-;53932:44;;;;:::i;:::-;53905:23;;:71;;;;;;;:::i;:::-;;;;-1:-1:-1;;54044:12:0;;54025:15;;54018:22;;:4;:22;:::i;:::-;54017:39;;;;:::i;:::-;53995:18;;:61;;;;;;;:::i;:::-;;;;-1:-1:-1;;53696:376:0;54092:8;;54088:91;;54121:42;54137:4;54151;54158;54121:15;:42::i;:::-;54195:14;54205:4;54195:14;;:::i;:::-;;;53220:1001;54233:33;54249:4;54255:2;54259:6;54233:15;:33::i;:::-;49051:5223;;;;48938:5336;;;:::o;3509:191::-;3602:6;;;-1:-1:-1;;;;;3619:17:0;;;-1:-1:-1;;;;;;3619:17:0;;;;;;;3652:40;;3602:6;;;3619:17;3602:6;;3652:40;;3583:16;;3652:40;3572:128;3509:191;:::o;38476:211::-;38620:58;;;-1:-1:-1;;;;;17411:32:1;;38620:58:0;;;17393:51:1;17460:18;;;;17453:34;;;38620:58:0;;;;;;;;;;17366:18:1;;;;38620:58:0;;;;;;;;-1:-1:-1;;;;;38620:58:0;-1:-1:-1;;;38620:58:0;;;38593:86;;38613:5;;38593:19;:86::i;48156:188::-;-1:-1:-1;;;;;48239:31:0;;;;;;:25;:31;;;;;;:39;;-1:-1:-1;;48239:39:0;;;;;;;;;;48296:40;;48239:39;;:31;48296:40;;;48156:188;;:::o;15074:733::-;-1:-1:-1;;;;;15214:20:0;;15206:70;;;;-1:-1:-1;;;15206:70:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;15295:23:0;;15287:71;;;;-1:-1:-1;;;15287:71:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;15455:17:0;;15431:21;15455:17;;;;;;;;;;;15491:23;;;;15483:74;;;;-1:-1:-1;;;15483:74:0;;17700:2:1;15483:74:0;;;17682:21:1;17739:2;17719:18;;;17712:30;17778:34;17758:18;;;17751:62;-1:-1:-1;;;17829:18:1;;;17822:36;17875:19;;15483:74:0;17498:402:1;15483:74:0;-1:-1:-1;;;;;15593:17:0;;;:9;:17;;;;;;;;;;;15613:22;;;15593:42;;15657:20;;;;;;;;:30;;15629:6;;15593:9;15657:30;;15629:6;;15657:30;:::i;:::-;;;;;;;;15722:9;-1:-1:-1;;;;;15705:35:0;15714:6;-1:-1:-1;;;;;15705:35:0;;15733:6;15705:35;;;;1716:25:1;;1704:2;1689:18;;1570:177;15705:35:0;;;;;;;;15195:612;15074:733;;;:::o;55067:1944::-;55150:4;55106:23;11047:18;;;;;;;;;;;55106:50;;55167:25;55263:23;;55229:18;;55195;;:52;;;;:::i;:::-;:91;;;;:::i;:::-;55167:119;-1:-1:-1;55297:12:0;55326:20;;;:46;;-1:-1:-1;55350:22:0;;55326:46;55322:85;;;55389:7;;;55067:1944::o;55322:85::-;55441:18;;:23;;55462:2;55441:23;:::i;:::-;55423:15;:41;55419:115;;;55499:18;;:23;;55520:2;55499:23;:::i;:::-;55481:41;;55419:115;55595:23;55708:1;55675:17;55640:18;;55622:15;:36;;;;:::i;:::-;55621:71;;;;:::i;:::-;:88;;;;:::i;:::-;55595:114;-1:-1:-1;55720:26:0;55749:33;55595:114;55749:15;:33;:::i;:::-;55720:62;-1:-1:-1;55823:21:0;55857:36;55720:62;55857:16;:36::i;:::-;55906:18;55927:41;55951:17;55927:21;:41;:::i;:::-;55906:62;;55981:23;56082:1;56063:18;;:20;;;;:::i;:::-;56042:42;;:17;:42;:::i;:::-;56020:18;;56007:31;;:10;:31;:::i;:::-;:78;;;;:::i;:::-;55981:104;;56106:28;56217:1;56198:18;;:20;;;;:::i;:::-;56177:42;;:17;:42;:::i;:::-;56150:23;;56137:36;;:10;:36;:::i;:::-;:83;;;;:::i;:::-;56106:114;-1:-1:-1;56243:23:0;56106:114;56269:28;56282:15;56269:10;:28;:::i;:::-;:51;;;;:::i;:::-;56354:1;56333:18;:22;;;56366:18;:22;;;56399:23;:27;;;56461:21;;56453:68;;56243:77;;-1:-1:-1;;;;;;56461:21:0;;56496:20;;56453:68;56354:1;56453:68;56496:20;56461:21;56453:68;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;56439:82;;;;;56579:20;56542:33;;:57;;;;;;;:::i;:::-;;;;-1:-1:-1;;56616:19:0;;;;;:42;;;56657:1;56639:15;:19;56616:42;56612:278;;;56675:46;56688:15;56705;56675:12;:46::i;:::-;56845:18;;56741:137;;;18107:25:1;;;18163:2;18148:18;;18141:34;;;18191:18;;;18184:34;;;;56741:137:0;;;;;;18095:2:1;56741:137:0;;;56612:278;56924:15;;56916:87;;-1:-1:-1;;;;;56924:15:0;;;;56967:21;;56916:87;;;;56967:21;56924:15;56916:87;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;;;55067:1944:0:o;57582:758::-;57673:15;57656:14;:32;57774:29;;-1:-1:-1;;;57774:29:0;;-1:-1:-1;;;;;57789:13:0;1943:32:1;57774:29:0;;;1925:51:1;57639:4:0;;;;57774;;:14;;1898:18:1;;57774:29:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;57743:60;;57853:20;57918:5;57899:16;;57876:20;:39;;;;:::i;:::-;:47;;;;:::i;:::-;57853:70;-1:-1:-1;58028:16:0;;58024:110;;58061:61;58077:13;58100:6;58109:12;58061:15;:61::i;:::-;58209:19;58246:13;58209:51;;58271:4;-1:-1:-1;;;;;58271:9:0;;:11;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;58298:12:0;;;;-1:-1:-1;58298:12:0;;-1:-1:-1;58298:12:0;58328:4;58321:11;;;;;57582:758;:::o;38695:333::-;38776:23;38802:69;38830:4;38802:69;;;;;;;;;;;;;;;;;38810:5;-1:-1:-1;;;;;38802:27:0;;;:69;;;;;:::i;:::-;38886:17;;38776:95;;-1:-1:-1;38886:21:0;38882:139;;38943:10;38932:30;;;;;;;;;;;;:::i;:::-;38924:85;;;;-1:-1:-1;;;38924:85:0;;18681:2:1;38924:85:0;;;18663:21:1;18720:2;18700:18;;;18693:30;18759:34;18739:18;;;18732:62;-1:-1:-1;;;18810:18:1;;;18803:40;18860:19;;38924:85:0;18479:406:1;54282:428:0;54372:16;;;54386:1;54372:16;;;;;;;;54348:21;;54372:16;;;;;;;;;;-1:-1:-1;54372:16:0;54348:40;;54417:4;54399;54404:1;54399:7;;;;;;;;:::i;:::-;;;;;;:23;-1:-1:-1;;;;;54399:23:0;;;-1:-1:-1;;;;;54399:23:0;;;;;54443:15;-1:-1:-1;;;;;54443:20:0;;:22;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;54433:4;54438:1;54433:7;;;;;;;;:::i;:::-;-1:-1:-1;;;;;54433:32:0;;;:7;;;;;;;;;:32;54478:224;;-1:-1:-1;;;54478:224:0;;:15;:66;;;;;;:224;;54559:11;;54585:1;;54629:4;;54656;;54676:15;;54478:224;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;54337:373;54282:428;:::o;54718:341::-;54799:15;-1:-1:-1;;;;;54799:31:0;;54838:9;54871:4;54891:11;54917:1;54960;55003:7;2312:6;;-1:-1:-1;;;;;2312:6:0;;2239:87;55003:7;54799:252;;;;;;-1:-1:-1;;;;;;54799:252:0;;;-1:-1:-1;;;;;20754:15:1;;;54799:252:0;;;20736:34:1;20786:18;;;20779:34;;;;20829:18;;;20822:34;;;;20872:18;;;20865:34;20936:15;;;20915:19;;;20908:44;55025:15:0;20968:19:1;;;20961:35;20670:19;;54799:252:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;54718:341;;:::o;32979:229::-;33116:12;33148:52;33170:6;33178:4;33184:1;33187:12;33148:21;:52::i;:::-;33141:59;32979:229;-1:-1:-1;;;;32979:229:0:o;34099:455::-;34269:12;34327:5;34302:21;:30;;34294:81;;;;-1:-1:-1;;;34294:81:0;;21520:2:1;34294:81:0;;;21502:21:1;21559:2;21539:18;;;21532:30;21598:34;21578:18;;;21571:62;-1:-1:-1;;;21649:18:1;;;21642:36;21695:19;;34294:81:0;21318:402:1;34294:81:0;34387:12;34401:23;34428:6;-1:-1:-1;;;;;34428:11:0;34447:5;34454:4;34428:31;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;34386:73;;;;34477:69;34504:6;34512:7;34521:10;34533:12;34477:26;:69::i;:::-;34470:76;34099:455;-1:-1:-1;;;;;;;34099:455:0:o;36672:644::-;36857:12;36886:7;36882:427;;;36914:10;:17;36935:1;36914:22;36910:290;;-1:-1:-1;;;;;32420:19:0;;;37124:60;;;;-1:-1:-1;;;37124:60:0;;22219:2:1;37124:60:0;;;22201:21:1;22258:2;22238:18;;;22231:30;22297:31;22277:18;;;22270:59;22346:18;;37124:60:0;22017:353:1;37124:60:0;-1:-1:-1;37221:10:0;37214:17;;36882:427;37264:33;37272:10;37284:12;38019:17;;:21;38015:388;;38251:10;38245:17;38308:15;38295:10;38291:2;38287:19;38280:44;38015:388;38378:12;38371:20;;-1:-1:-1;;;38371:20:0;;;;;;;;:::i;14:250:1:-;99:1;109:113;123:6;120:1;117:13;109:113;;;199:11;;;193:18;180:11;;;173:39;145:2;138:10;109:113;;;-1:-1:-1;;256:1:1;238:16;;231:27;14:250::o;269:396::-;418:2;407:9;400:21;381:4;450:6;444:13;493:6;488:2;477:9;473:18;466:34;509:79;581:6;576:2;565:9;561:18;556:2;548:6;544:15;509:79;:::i;:::-;649:2;628:15;-1:-1:-1;;624:29:1;609:45;;;;656:2;605:54;;269:396;-1:-1:-1;;269:396:1:o;670:131::-;-1:-1:-1;;;;;745:31:1;;735:42;;725:70;;791:1;788;781:12;806:315;874:6;882;935:2;923:9;914:7;910:23;906:32;903:52;;;951:1;948;941:12;903:52;990:9;977:23;1009:31;1034:5;1009:31;:::i;:::-;1059:5;1111:2;1096:18;;;;1083:32;;-1:-1:-1;;;806:315:1:o;1318:247::-;1377:6;1430:2;1418:9;1409:7;1405:23;1401:32;1398:52;;;1446:1;1443;1436:12;1398:52;1485:9;1472:23;1504:31;1529:5;1504:31;:::i;:::-;1554:5;1318:247;-1:-1:-1;;;1318:247:1:o;1987:180::-;2046:6;2099:2;2087:9;2078:7;2074:23;2070:32;2067:52;;;2115:1;2112;2105:12;2067:52;-1:-1:-1;2138:23:1;;1987:180;-1:-1:-1;1987:180:1:o;2172:456::-;2249:6;2257;2265;2318:2;2306:9;2297:7;2293:23;2289:32;2286:52;;;2334:1;2331;2324:12;2286:52;2373:9;2360:23;2392:31;2417:5;2392:31;:::i;:::-;2442:5;-1:-1:-1;2499:2:1;2484:18;;2471:32;2512:33;2471:32;2512:33;:::i;:::-;2172:456;;2564:7;;-1:-1:-1;;;2618:2:1;2603:18;;;;2590:32;;2172:456::o;3030:118::-;3116:5;3109:13;3102:21;3095:5;3092:32;3082:60;;3138:1;3135;3128:12;3153:377;3227:6;3235;3243;3296:2;3284:9;3275:7;3271:23;3267:32;3264:52;;;3312:1;3309;3302:12;3264:52;3348:9;3335:23;3325:33;;3405:2;3394:9;3390:18;3377:32;3367:42;;3459:2;3448:9;3444:18;3431:32;3472:28;3494:5;3472:28;:::i;:::-;3519:5;3509:15;;;3153:377;;;;;:::o;3535:382::-;3600:6;3608;3661:2;3649:9;3640:7;3636:23;3632:32;3629:52;;;3677:1;3674;3667:12;3629:52;3716:9;3703:23;3735:31;3760:5;3735:31;:::i;:::-;3785:5;-1:-1:-1;3842:2:1;3827:18;;3814:32;3855:30;3814:32;3855:30;:::i;:::-;3904:7;3894:17;;;3535:382;;;;;:::o;3922:316::-;3999:6;4007;4015;4068:2;4056:9;4047:7;4043:23;4039:32;4036:52;;;4084:1;4081;4074:12;4036:52;-1:-1:-1;;4107:23:1;;;4177:2;4162:18;;4149:32;;-1:-1:-1;4228:2:1;4213:18;;;4200:32;;3922:316;-1:-1:-1;3922:316:1:o;4243:388::-;4311:6;4319;4372:2;4360:9;4351:7;4347:23;4343:32;4340:52;;;4388:1;4385;4378:12;4340:52;4427:9;4414:23;4446:31;4471:5;4446:31;:::i;:::-;4496:5;-1:-1:-1;4553:2:1;4538:18;;4525:32;4566:33;4525:32;4566:33;:::i;4636:241::-;4692:6;4745:2;4733:9;4724:7;4720:23;4716:32;4713:52;;;4761:1;4758;4751:12;4713:52;4800:9;4787:23;4819:28;4841:5;4819:28;:::i;4882:356::-;5084:2;5066:21;;;5103:18;;;5096:30;5162:34;5157:2;5142:18;;5135:62;5229:2;5214:18;;4882:356::o;5803:380::-;5882:1;5878:12;;;;5925;;;5946:61;;6000:4;5992:6;5988:17;5978:27;;5946:61;6053:2;6045:6;6042:14;6022:18;6019:38;6016:161;;6099:10;6094:3;6090:20;6087:1;6080:31;6134:4;6131:1;6124:15;6162:4;6159:1;6152:15;6016:161;;5803:380;;;:::o;6188:127::-;6249:10;6244:3;6240:20;6237:1;6230:31;6280:4;6277:1;6270:15;6304:4;6301:1;6294:15;6320:168;6393:9;;;6424;;6441:15;;;6435:22;;6421:37;6411:71;;6462:18;;:::i;6493:217::-;6533:1;6559;6549:132;;6603:10;6598:3;6594:20;6591:1;6584:31;6638:4;6635:1;6628:15;6666:4;6663:1;6656:15;6549:132;-1:-1:-1;6695:9:1;;6493:217::o;7538:125::-;7603:9;;;7624:10;;;7621:36;;;7637:18;;:::i;9638:184::-;9708:6;9761:2;9749:9;9740:7;9736:23;9732:32;9729:52;;;9777:1;9774;9767:12;9729:52;-1:-1:-1;9800:16:1;;9638:184;-1:-1:-1;9638:184:1:o;14250:401::-;14452:2;14434:21;;;14491:2;14471:18;;;14464:30;14530:34;14525:2;14510:18;;14503:62;-1:-1:-1;;;14596:2:1;14581:18;;14574:35;14641:3;14626:19;;14250:401::o;14656:399::-;14858:2;14840:21;;;14897:2;14877:18;;;14870:30;14936:34;14931:2;14916:18;;14909:62;-1:-1:-1;;;15002:2:1;14987:18;;14980:33;15045:3;15030:19;;14656:399::o;17086:128::-;17153:9;;;17174:11;;;17171:37;;;17188:18;;:::i;18229:245::-;18296:6;18349:2;18337:9;18328:7;18324:23;18320:32;18317:52;;;18365:1;18362;18355:12;18317:52;18397:9;18391:16;18416:28;18438:5;18416:28;:::i;19022:127::-;19083:10;19078:3;19074:20;19071:1;19064:31;19114:4;19111:1;19104:15;19138:4;19135:1;19128:15;19154:251;19224:6;19277:2;19265:9;19256:7;19252:23;19248:32;19245:52;;;19293:1;19290;19283:12;19245:52;19325:9;19319:16;19344:31;19369:5;19344:31;:::i;19410:980::-;19672:4;19720:3;19709:9;19705:19;19751:6;19740:9;19733:25;19777:2;19815:6;19810:2;19799:9;19795:18;19788:34;19858:3;19853:2;19842:9;19838:18;19831:31;19882:6;19917;19911:13;19948:6;19940;19933:22;19986:3;19975:9;19971:19;19964:26;;20025:2;20017:6;20013:15;19999:29;;20046:1;20056:195;20070:6;20067:1;20064:13;20056:195;;;20135:13;;-1:-1:-1;;;;;20131:39:1;20119:52;;20226:15;;;;20191:12;;;;20167:1;20085:9;20056:195;;;-1:-1:-1;;;;;;;20307:32:1;;;;20302:2;20287:18;;20280:60;-1:-1:-1;;;20371:3:1;20356:19;20349:35;20268:3;19410:980;-1:-1:-1;;;19410:980:1:o;21007:306::-;21095:6;21103;21111;21164:2;21152:9;21143:7;21139:23;21135:32;21132:52;;;21180:1;21177;21170:12;21132:52;21209:9;21203:16;21193:26;;21259:2;21248:9;21244:18;21238:25;21228:35;;21303:2;21292:9;21288:18;21282:25;21272:35;;21007:306;;;;;:::o;21725:287::-;21854:3;21892:6;21886:13;21908:66;21967:6;21962:3;21955:4;21947:6;21943:17;21908:66;:::i;:::-;21990:16;;;;;21725:287;-1:-1:-1;;21725:287:1:o
Swarm Source
ipfs://e308d3a691e7433981e1ad9fc35756b0887d9d28b537c92c7ca77d2949c51ee9
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.