ERC-20
Overview
Max Total Supply
987,222.71284049 $ZINU
Holders
41
Market
Onchain Market Cap
$0.00
Circulating Supply Market Cap
-
Other Info
Token Contract (WITH 9 Decimals)
Balance
1,269.954598602 $ZINUValue
$0.00Loading...
Loading
Loading...
Loading
Loading...
Loading
# | Exchange | Pair | Price | 24H Volume | % Volume |
---|
Contract Name:
ZeroInu
Compiler Version
v0.8.15+commit.e14f2714
Contract Source Code (Solidity)
/** *Submitted for verification at Etherscan.io on 2022-07-27 */ /** Zero Inu https://https://zeroinuofficial.com/ https://t.me/ZeroInu /** Total Supply: 1,000,000 Max Wallet: 4% (40,000 Tokens) Max Buy: 4% (40,000 Tokens) Max Sell: 4% (40,000 Tokens) Buy / Sell Tax: 7% - 4% Marketing - 2% LP - 1% Burn */ pragma solidity ^0.8.15; // SPDX-License-Identifier: Unlicensed interface IERC20 { function totalSupply() external view returns (uint256); function decimals() external view returns (uint8); function symbol() external view returns (string memory); function name() external view returns (string memory); function getOwner() external view returns (address); function balanceOf(address account) external view returns (uint256); function transfer(address recipient, uint256 amount) external returns (bool); function allowance(address _owner, address spender) external view returns (uint256); function approve(address spender, uint256 amount) external returns (bool); function transferFrom(address sender, address recipient, uint256 amount) external returns (bool); event Transfer(address indexed from, address indexed to, uint256 value); event Approval(address indexed owner, address indexed spender, uint256 value); } interface IUniswapV2ERC20 { event Approval(address indexed owner, address indexed spender, uint value); event Transfer(address indexed from, address indexed to, uint value); function name() external pure returns (string memory); function symbol() external pure returns (string memory); function decimals() external pure returns (uint8); function totalSupply() external view returns (uint); function balanceOf(address owner) external view returns (uint); function allowance(address owner, address spender) external view returns (uint); function approve(address spender, uint value) external returns (bool); function transfer(address to, uint value) external returns (bool); function transferFrom(address from, address to, uint value) external returns (bool); function DOMAIN_SEPARATOR() external view returns (bytes32); function PERMIT_TYPEHASH() external pure returns (bytes32); function nonces(address owner) external view returns (uint); function permit(address owner, address spender, uint value, uint deadline, uint8 v, bytes32 r, bytes32 s) external; } interface IUniswapV2Factory { event PairCreated(address indexed token0, address indexed token1, address pair, uint); function feeTo() external view returns (address); function feeToSetter() external view returns (address); function getPair(address tokenA, address tokenB) external view returns (address pair); function allPairs(uint) external view returns (address pair); function allPairsLength() external view returns (uint); function createPair(address tokenA, address tokenB) external returns (address pair); function setFeeTo(address) external; function setFeeToSetter(address) external; } interface IUniswapV2Router01 { function addLiquidity( address tokenA, address tokenB, uint amountADesired, uint amountBDesired, uint amountAMin, uint amountBMin, address to, uint deadline ) external returns (uint amountA, uint amountB, uint liquidity); function addLiquidityETH( address token, uint amountTokenDesired, uint amountTokenMin, uint amountETHMin, address to, uint deadline ) external payable returns (uint amountToken, uint amountETH, uint liquidity); function removeLiquidity( address tokenA, address tokenB, uint liquidity, uint amountAMin, uint amountBMin, address to, uint deadline ) external returns (uint amountA, uint amountB); function removeLiquidityETH( address token, uint liquidity, uint amountTokenMin, uint amountETHMin, address to, uint deadline ) external returns (uint amountToken, uint amountETH); function removeLiquidityWithPermit( address tokenA, address tokenB, uint liquidity, uint amountAMin, uint amountBMin, address to, uint deadline, bool approveMax, uint8 v, bytes32 r, bytes32 s ) external returns (uint amountA, uint amountB); function removeLiquidityETHWithPermit( address token, uint liquidity, uint amountTokenMin, uint amountETHMin, address to, uint deadline, bool approveMax, uint8 v, bytes32 r, bytes32 s ) external returns (uint amountToken, uint amountETH); function swapExactTokensForTokens( uint amountIn, uint amountOutMin, address[] calldata path, address to, uint deadline ) external returns (uint[] memory amounts); function swapTokensForExactTokens( uint amountOut, uint amountInMax, address[] calldata path, address to, uint deadline ) external returns (uint[] memory amounts); function swapExactETHForTokens(uint amountOutMin, address[] calldata path, address to, uint deadline) external payable returns (uint[] memory amounts); function swapTokensForExactETH(uint amountOut, uint amountInMax, address[] calldata path, address to, uint deadline) external returns (uint[] memory amounts); function swapExactTokensForETH(uint amountIn, uint amountOutMin, address[] calldata path, address to, uint deadline) external returns (uint[] memory amounts); function swapETHForExactTokens(uint amountOut, address[] calldata path, address to, uint deadline) external payable returns (uint[] memory amounts); function factory() external pure returns (address); function WETH() external pure returns (address); function quote(uint amountA, uint reserveA, uint reserveB) external pure returns (uint amountB); function getamountOut(uint amountIn, uint reserveIn, uint reserveOut) external pure returns (uint amountOut); function getamountIn(uint amountOut, uint reserveIn, uint reserveOut) external pure returns (uint amountIn); function getamountsOut(uint amountIn, address[] calldata path) external view returns (uint[] memory amounts); function getamountsIn(uint amountOut, address[] calldata path) external view returns (uint[] memory amounts); } interface IUniswapV2Router02 is IUniswapV2Router01 { function removeLiquidityETHSupportingFeeOnTransferTokens( address token, uint liquidity, uint amountTokenMin, uint amountETHMin, address to, uint deadline ) external returns (uint amountETH); function removeLiquidityETHWithPermitSupportingFeeOnTransferTokens( address token, uint liquidity, uint amountTokenMin, uint amountETHMin, address to, uint deadline, bool approveMax, uint8 v, bytes32 r, bytes32 s ) external returns (uint amountETH); function swapExactTokensForTokensSupportingFeeOnTransferTokens( uint amountIn, uint amountOutMin, address[] calldata path, address to, uint deadline ) external; function swapExactETHForTokensSupportingFeeOnTransferTokens( uint amountOutMin, address[] calldata path, address to, uint deadline ) external payable; function swapExactTokensForETHSupportingFeeOnTransferTokens( uint amountIn, uint amountOutMin, address[] calldata path, address to, uint deadline ) external; } /** * @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 { address private _owner; event OwnershipTransferred(address indexed previousOwner, address indexed newOwner); /** * @dev Initializes the contract setting the deployer as the initial owner. */ constructor () { address msgSender = msg.sender; _owner = msgSender; emit OwnershipTransferred(address(0), msgSender); } /** * @dev Returns the address of the current owner. */ function owner() public view returns (address) { return _owner; } /** * @dev Throws if called by any account other than the owner. */ modifier onlyOwner() { require(owner() == msg.sender, "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 onlyOwner { emit OwnershipTransferred(_owner, address(0)); _owner = address(0); } /** * @dev Transfers ownership of the contract to a new account (`newOwner`). * Can only be called by the current owner. */ function transferOwnership(address newOwner) public onlyOwner { require(newOwner != address(0), "Ownable: new owner is the zero address"); emit OwnershipTransferred(_owner, newOwner); _owner = newOwner; } } /** * @dev Collection of functions related to the address type */ library Address { /** * @dev Returns true if `account` is a contract. * * [IMPORTANT] * ==== * It is unsafe to assume that an address for which this function returns * false is an externally-owned account (EOA) and not a contract. * * Among others, `isContract` will return false for the following * types of addresses: * * - an externally-owned account * - a contract in construction * - an address where a contract will be created * - an address where a contract lived, but was destroyed * ==== */ function isContract(address account) internal view returns (bool) { // This method relies on extcodesize, which returns 0 for contracts in // construction, since the code is only stored at the end of the // constructor execution. uint256 size; // solhint-disable-next-line no-inline-assembly assembly { size := extcodesize(account) } return size > 0; } /** * @dev Replacement for Solidity's `transfer`: sends `amount` wei to * `recipient`, forwarding all available gas and reverting on errors. * * https://eips.ethereum.org/EIPS/eip-1884[EIP1884] increases the gas cost * of certain opcodes, possibly making contracts go over the 2300 gas limit * imposed by `transfer`, making them unable to receive funds via * `transfer`. {sendValue} removes this limitation. * * https://diligence.consensys.net/posts/2019/09/stop-using-soliditys-transfer-now/[Learn more]. * * IMPORTANT: because control is transferred to `recipient`, care must be * taken to not create reentrancy vulnerabilities. Consider using * {ReentrancyGuard} or the * https://solidity.readthedocs.io/en/v0.5.11/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern]. */ function sendValue(address payable recipient, uint256 amount) internal { require(address(this).balance >= amount, "Address: insufficient balance"); // solhint-disable-next-line avoid-low-level-calls, avoid-call-value (bool success, ) = recipient.call{ value: amount }(""); require(success, "Address: unable to send value, recipient may have reverted"); } /** * @dev Performs a Solidity function call using a low level `call`. A * plain`call` is an unsafe replacement for a function call: use this * function instead. * * If `target` reverts with a revert reason, it is bubbled up by this * function (like regular Solidity function calls). * * Returns the raw returned data. To convert to the expected return value, * use https://solidity.readthedocs.io/en/latest/units-and-global-variables.html?highlight=abi.decode#abi-encoding-and-decoding-functions[`abi.decode`]. * * Requirements: * * - `target` must be a contract. * - calling `target` with `data` must not revert. * * _Available since v3.1._ */ function functionCall(address target, bytes memory data) internal returns (bytes memory) { return functionCall(target, data, "Address: low-level call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], but with * `errorMessage` as a fallback revert reason when `target` reverts. * * _Available since v3.1._ */ 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"); require(isContract(target), "Address: call to non-contract"); // solhint-disable-next-line avoid-low-level-calls (bool success, bytes memory returndata) = target.call{ value: value }(data); return _verifyCallResult(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) { require(isContract(target), "Address: static call to non-contract"); // solhint-disable-next-line avoid-low-level-calls (bool success, bytes memory returndata) = target.staticcall(data); return _verifyCallResult(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) { require(isContract(target), "Address: delegate call to non-contract"); // solhint-disable-next-line avoid-low-level-calls (bool success, bytes memory returndata) = target.delegatecall(data); return _verifyCallResult(success, returndata, errorMessage); } function _verifyCallResult(bool success, bytes memory returndata, string memory errorMessage) private pure returns(bytes memory) { if (success) { return returndata; } else { // 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 // solhint-disable-next-line no-inline-assembly assembly { let returndata_size := mload(returndata) revert(add(32, returndata), returndata_size) } } else { revert(errorMessage); } } } } /** * @dev Library for managing * https://en.wikipedia.org/wiki/Set_(abstract_data_type)[sets] of primitive * types. * * Sets have the following properties: * * - Elements are added, removed, and checked for existence in constant time * (O(1)). * - Elements are enumerated in O(n). No guarantees are made on the ordering. * * ``` * contract Example { * // Add the library methods * using EnumerableSet for EnumerableSet.AddressSet; * * // Declare a set state variable * EnumerableSet.AddressSet private mySet; * } * ``` * * As of v3.3.0, sets of type `bytes32` (`Bytes32Set`), `address` (`AddressSet`) * and `uint256` (`UintSet`) are supported. */ library EnumerableSet { // To implement this library for multiple types with as little code // repetition as possible, we write it in terms of a generic Set type with // bytes32 values. // The Set implementation uses private functions, and user-facing // implementations (such as AddressSet) are just wrappers around the // underlying Set. // This means that we can only create new EnumerableSets for types that fit // in bytes32. struct Set { // Storage of set values bytes32[] _values; // Position of the value in the `values` array, plus 1 because index 0 // means a value is not in the set. mapping (bytes32 => uint256) _indexes; } /** * @dev Add a value to a set. O(1). * * Returns true if the value was added to the set, that is if it was not * already present. */ function _add(Set storage set, bytes32 value) private returns (bool) { if (!_contains(set, value)) { set._values.push(value); // The value is stored at length-1, but we add 1 to all indexes // and use 0 as a sentinel value set._indexes[value] = set._values.length; return true; } else { return false; } } /** * @dev Removes a value from a set. O(1). * * Returns true if the value was removed from the set, that is if it was * present. */ function _remove(Set storage set, bytes32 value) private returns (bool) { // We read and store the value's index to prevent multiple reads from the same storage slot uint256 valueIndex = set._indexes[value]; if (valueIndex != 0) { // Equivalent to contains(set, value) // To delete an element from the _values array in O(1), we swap the element to delete with the last one in // the array, and then remove the last element (sometimes called as 'swap and pop'). // This modifies the order of the array, as noted in {at}. uint256 toDeleteIndex = valueIndex - 1; uint256 lastIndex = set._values.length - 1; // When the value to delete is the last one, the swap operation is unnecessary. However, since this occurs // so rarely, we still do the swap anyway to avoid the gas cost of adding an 'if' statement. bytes32 lastvalue = set._values[lastIndex]; // Move the last value to the index where the value to delete is set._values[toDeleteIndex] = lastvalue; // Update the index for the moved value set._indexes[lastvalue] = valueIndex; // Replace lastvalue's index to valueIndex // Delete the slot where the moved value was stored set._values.pop(); // Delete the index for the deleted slot delete set._indexes[value]; return true; } else { return false; } } /** * @dev Returns true if the value is in the set. O(1). */ function _contains(Set storage set, bytes32 value) private view returns (bool) { return set._indexes[value] != 0; } /** * @dev Returns the number of values on the set. O(1). */ function _length(Set storage set) private view returns (uint256) { return set._values.length; } /** * @dev Returns the value stored at position `index` in the set. O(1). * * Note that there are no guarantees on the ordering of values inside the * array, and it may change when more values are added or removed. * * Requirements: * * - `index` must be strictly less than {length}. */ function _at(Set storage set, uint256 index) private view returns (bytes32) { require(set._values.length > index, "EnumerableSet: index out of bounds"); return set._values[index]; } // Bytes32Set struct Bytes32Set { Set _inner; } /** * @dev Add a value to a set. O(1). * * Returns true if the value was added to the set, that is if it was not * already present. */ function add(Bytes32Set storage set, bytes32 value) internal returns (bool) { return _add(set._inner, value); } /** * @dev Removes a value from a set. O(1). * * Returns true if the value was removed from the set, that is if it was * present. */ function remove(Bytes32Set storage set, bytes32 value) internal returns (bool) { return _remove(set._inner, value); } /** * @dev Returns true if the value is in the set. O(1). */ function contains(Bytes32Set storage set, bytes32 value) internal view returns (bool) { return _contains(set._inner, value); } /** * @dev Returns the number of values in the set. O(1). */ function length(Bytes32Set storage set) internal view returns (uint256) { return _length(set._inner); } /** * @dev Returns the value stored at position `index` in the set. O(1). * * Note that there are no guarantees on the ordering of values inside the * array, and it may change when more values are added or removed. * * Requirements: * * - `index` must be strictly less than {length}. */ function at(Bytes32Set storage set, uint256 index) internal view returns (bytes32) { return _at(set._inner, index); } // AddressSet struct AddressSet { Set _inner; } /** * @dev Add a value to a set. O(1). * * Returns true if the value was added to the set, that is if it was not * already present. */ function add(AddressSet storage set, address value) internal returns (bool) { return _add(set._inner, bytes32(uint256(uint160(value)))); } /** * @dev Removes a value from a set. O(1). * * Returns true if the value was removed from the set, that is if it was * present. */ function remove(AddressSet storage set, address value) internal returns (bool) { return _remove(set._inner, bytes32(uint256(uint160(value)))); } /** * @dev Returns true if the value is in the set. O(1). */ function contains(AddressSet storage set, address value) internal view returns (bool) { return _contains(set._inner, bytes32(uint256(uint160(value)))); } /** * @dev Returns the number of values in the set. O(1). */ function length(AddressSet storage set) internal view returns (uint256) { return _length(set._inner); } /** * @dev Returns the value stored at position `index` in the set. O(1). * * Note that there are no guarantees on the ordering of values inside the * array, and it may change when more values are added or removed. * * Requirements: * * - `index` must be strictly less than {length}. */ function at(AddressSet storage set, uint256 index) internal view returns (address) { return address(uint160(uint256(_at(set._inner, index)))); } // UintSet struct UintSet { Set _inner; } /** * @dev Add a value to a set. O(1). * * Returns true if the value was added to the set, that is if it was not * already present. */ function add(UintSet storage set, uint256 value) internal returns (bool) { return _add(set._inner, bytes32(value)); } /** * @dev Removes a value from a set. O(1). * * Returns true if the value was removed from the set, that is if it was * present. */ function remove(UintSet storage set, uint256 value) internal returns (bool) { return _remove(set._inner, bytes32(value)); } /** * @dev Returns true if the value is in the set. O(1). */ function contains(UintSet storage set, uint256 value) internal view returns (bool) { return _contains(set._inner, bytes32(value)); } /** * @dev Returns the number of values on the set. O(1). */ function length(UintSet storage set) internal view returns (uint256) { return _length(set._inner); } /** * @dev Returns the value stored at position `index` in the set. O(1). * * Note that there are no guarantees on the ordering of values inside the * array, and it may change when more values are added or removed. * * Requirements: * * - `index` must be strictly less than {length}. */ function at(UintSet storage set, uint256 index) internal view returns (uint256) { return uint256(_at(set._inner, index)); } } ////////// Contract ///////////// contract ZeroInu is IERC20, Ownable { using Address for address; using EnumerableSet for EnumerableSet.AddressSet; event antiBotBan(address indexed value); mapping (address => uint256) private _balances; mapping (address => mapping (address => uint256)) private _allowances; mapping (address => uint256) private _sellLock; mapping (address => uint256) private _buyLock; EnumerableSet.AddressSet private _excluded; EnumerableSet.AddressSet private _excludedFromSellLock; EnumerableSet.AddressSet private _excludedFromBuyLock; EnumerableSet.AddressSet private _excludedFromStaking; EnumerableSet.AddressSet private _isBlacklisted; //Token Info string public _name = "ZeroInu"; string public _symbol = "$ZINU"; uint8 private constant _decimals = 9; uint256 public constant InitialSupply= 1000000 * 10**_decimals;//equals 1,000,000 tokens 1000000 //Used for anti-bot autoblacklist uint256 private tradingEnabledAt; //DO NOT CHANGE, THIS IS FOR HOLDING A TIMESTAMP uint256 public autoBanTime = 20; // Set to the amount of time in seconds after enable trading you want addresses to be auto blacklisted if they buy/sell/transfer in this time. uint256 public enableAutoBlacklist = 0; //Leave 1 if using, set to 0 if not using. //Divider for the MaxBalance based on circulating Supply (4%) uint8 public constant BalanceLimitDivider=24; //Divider for sellLimit based on circulating Supply (4%)) uint16 public constant SellLimitDivider=24; //Sellers get locked for MaxSellLockTime (put in seconds, works better especially if changing later) so they can't dump repeatedly uint16 public constant MaxSellLockTime= 0 seconds; //Buyers get locked for MaxBuyLockTime (put in seconds, works better especially if changing later) so they can't buy repeatedly uint16 public constant MaxBuyLockTime= 0 seconds; //The time Liquidity gets locked at start and prolonged once it gets released uint256 private constant DefaultLiquidityLockTime= 1800; //DevWallets address public Marketing2=payable(0xBD42Fe678e65aC914D9bC380ab8e492107c17b5b); address public Marketing=payable(0xd02d752E31ED204CF43624cE8E84ACfdFbe9c928); //MainNet address private constant UniswapV2Router=0x7a250d5630B4cF539739dF2C5dAcb4c659F2488D; //variables that track balanceLimit and sellLimit, //can be updated based on circulating supply and Sell- and BalanceLimitDividers uint256 private _circulatingSupply =InitialSupply; uint256 public balanceLimit = _circulatingSupply; uint256 public sellLimit = _circulatingSupply; uint256 private MaxBuy = 40000 * 10**_decimals; // 40,000 tokens //Tracks the current Taxes, different Taxes can be applied for buy/sell/transfer uint8 private _buyTax; uint8 private _sellTax; uint8 private _transferTax; uint8 private _burnTax; uint8 private _liquidityTax; uint8 private _stakingTax; address private _uniswapv2PairAddress; IUniswapV2Router02 private _uniswapv2Router; //Checks if address is in Team, is needed to give Team access even if contract is renounced //Team doesn't have access to critical Functions that could turn this into a Rugpull(Exept liquidity unlocks) function _isTeam(address addr) private view returns (bool){ return addr==owner()||addr==Marketing2||addr==Marketing; } //Constructor/////////// constructor () { //contract creator gets 90% of the token to create LP-Pair uint256 deployerBalance=_circulatingSupply; _balances[msg.sender] = deployerBalance; emit Transfer(address(0), msg.sender, deployerBalance); // UniswapV2 Router _uniswapv2Router = IUniswapV2Router02(UniswapV2Router); //Creates a UniswapV2 Pair _uniswapv2PairAddress = IUniswapV2Factory(_uniswapv2Router.factory()).createPair(address(this), _uniswapv2Router.WETH()); //Sets Buy/Sell limits balanceLimit=InitialSupply/BalanceLimitDivider; sellLimit=InitialSupply/SellLimitDivider; //Sets sellLockTime sellLockTime=0; //Sets buyLockTime buyLockTime=0; //Set Starting Tax _buyTax=7; _sellTax=7; _transferTax=7; _burnTax=10; _liquidityTax=10; _stakingTax=70; //Team wallets and deployer are excluded from Taxes _excluded.add(Marketing2); _excluded.add(Marketing); _excluded.add(msg.sender); //excludes UniswapV2 Router, pair, contract and burn address from staking _excludedFromStaking.add(address(_uniswapv2Router)); _excludedFromStaking.add(_uniswapv2PairAddress); _excludedFromStaking.add(address(this)); _excludedFromStaking.add(0x000000000000000000000000000000000000dEaD); } //Transfer functionality/// //transfer function, every transfer runs through this function function _transfer(address sender, address recipient, uint256 amount) private{ require(sender != address(0), "Transfer from zero"); require(recipient != address(0), "Transfer to zero"); //Manually Excluded adresses are transfering tax and lock free bool isExcluded = (_excluded.contains(sender) || _excluded.contains(recipient)); //Transactions from and to the contract are always tax and lock free bool isContractTransfer=(sender==address(this) || recipient==address(this)); //transfers between UniswapV2Router and UniswapV2Pair are tax and lock free address uniswapv2Router=address(_uniswapv2Router); bool isLiquidityTransfer = ((sender == _uniswapv2PairAddress && recipient == uniswapv2Router) || (recipient == _uniswapv2PairAddress && sender == uniswapv2Router)); //differentiate between buy/sell/transfer to apply different taxes/restrictions bool isBuy=sender==_uniswapv2PairAddress|| sender == uniswapv2Router; bool isSell=recipient==_uniswapv2PairAddress|| recipient == uniswapv2Router; //Pick transfer if(isContractTransfer || isLiquidityTransfer || isExcluded){ _feelessTransfer(sender, recipient, amount); } else{ //once trading is enabled, it can't be turned off again require(tradingEnabled,"trading not yet enabled"); _taxedTransfer(sender,recipient,amount,isBuy,isSell); } } //applies taxes, checks for limits, locks generates autoLP and stakingETH, and autostakes function _taxedTransfer(address sender, address recipient, uint256 amount,bool isBuy,bool isSell) private{ uint256 recipientBalance = _balances[recipient]; uint256 senderBalance = _balances[sender]; require(senderBalance >= amount, "Transfer exceeds balance"); uint8 tax; if(isSell){ if(!_excludedFromSellLock.contains(sender)){ //If seller sold less than sellLockTime(2h 50m) ago, sell is declined, can be disabled by Team require(_sellLock[sender]<=block.timestamp||sellLockDisabled,"Seller in sellLock"); //Sets the time sellers get locked(2 hours 50 mins by default) _sellLock[sender]=block.timestamp+sellLockTime; } //Sells can't exceed the sell limit(21,000 Tokens at start, can be updated to circulating supply) require(amount<=sellLimit,"Dump protection"); require(_isBlacklisted.contains(sender) == false, "Address blacklisted!"); if (block.timestamp <= tradingEnabledAt + autoBanTime && enableAutoBlacklist == 1) { _isBlacklisted.add(sender); emit antiBotBan(sender); } tax=_sellTax; } else if(isBuy){ if(!_excludedFromBuyLock.contains(recipient)){ //If buyer bought less than buyLockTime(2h 50m) ago, buy is declined, can be disabled by Team require(_buyLock[recipient]<=block.timestamp||buyLockDisabled,"Buyer in buyLock"); //Sets the time buyers get locked(2 hours 50 mins by default) _buyLock[recipient]=block.timestamp+buyLockTime; } //Checks If the recipient balance(excluding Taxes) would exceed Balance Limit require(recipientBalance+amount<=balanceLimit,"whale protection"); require(amount <= MaxBuy,"Tx amount exceeding max buy amount"); require(_isBlacklisted.contains(recipient) == false, "Address blacklisted!"); if (block.timestamp <= tradingEnabledAt + autoBanTime && enableAutoBlacklist == 1) { _isBlacklisted.add(recipient); emit antiBotBan(recipient); } tax=_buyTax; } else {//Transfer //withdraws ETH when sending less or equal to 1 Token //that way you can withdraw without connecting to any dApp. //might needs higher gas limit if(amount<=10**(_decimals)) claimETH(sender); //Checks If the recipient balance(excluding Taxes) would exceed Balance Limit require(recipientBalance+amount<=balanceLimit,"whale protection"); //Transfers are disabled in sell lock, this doesn't stop someone from transfering before //selling, but there is no satisfying solution for that, and you would need to pax additional tax if(!_excludedFromSellLock.contains(sender)) require(_sellLock[sender]<=block.timestamp||sellLockDisabled,"Sender in Lock"); require(_isBlacklisted.contains(sender) == false, "Sender address blacklisted!"); require(_isBlacklisted.contains(recipient) == false, "Recipient address blacklisted!"); if (block.timestamp <= tradingEnabledAt + autoBanTime && enableAutoBlacklist == 1) { _isBlacklisted.add(sender); emit antiBotBan(sender); } tax=_transferTax; } //Swapping AutoLP and MarketingETH is only possible if sender is not uniswapv2 pair, //if its not manually disabled, if its not already swapping and if its a Sell to avoid // people from causing a large price impact from repeatedly transfering when theres a large backlog of Tokens if((sender!=_uniswapv2PairAddress)&&(!manualConversion)&&(!_isSwappingContractModifier)&&isSell) _swapContractToken(); //Calculates the exact token amount for each tax uint256 tokensToBeBurnt=_calculateFee(amount, tax, _burnTax); //staking and liquidity Tax get treated the same, only during conversion they get split uint256 contractToken=_calculateFee(amount, tax, _stakingTax+_liquidityTax); //Subtract the Taxed Tokens from the amount uint256 taxedAmount=amount-(tokensToBeBurnt + contractToken); //Removes token and handles staking _removeToken(sender,amount); //Adds the taxed tokens to the contract wallet _balances[address(this)] += contractToken; //Burns tokens _circulatingSupply-=tokensToBeBurnt; //Adds token and handles staking _addToken(recipient, taxedAmount); emit Transfer(sender,recipient,taxedAmount); } //Feeless transfer only transfers and autostakes function _feelessTransfer(address sender, address recipient, uint256 amount) private{ uint256 senderBalance = _balances[sender]; require(senderBalance >= amount, "Transfer exceeds balance"); //Removes token and handles staking _removeToken(sender,amount); //Adds token and handles staking _addToken(recipient, amount); emit Transfer(sender,recipient,amount); } //Calculates the token that should be taxed function _calculateFee(uint256 amount, uint8 tax, uint8 taxPercent) private pure returns (uint256) { return (amount*tax*taxPercent) / 10000; } //ETH Autostake///////////////////////////////////////////////////////////////////////////////////////// //Autostake uses the balances of each holder to redistribute auto generated ETH. //Each transaction _addToken and _removeToken gets called for the transaction amount //WithdrawETH can be used for any holder to withdraw ETH at any time, like true Staking, //so unlike MRAT clones you can leave and forget your Token and claim after a while //lock for the withdraw bool private _isWithdrawing; //Multiplier to add some accuracy to profitPerShare uint256 private constant DistributionMultiplier = 2**64; //profit for each share a holder holds, a share equals a token. uint256 public profitPerShare; //the total reward distributed through staking, for tracking purposes uint256 public totalStakingReward; //the total payout through staking, for tracking purposes uint256 public totalPayouts; uint8 public marketingShare=100; //balance that is claimable by the team uint256 public marketingBalance; //Mapping of the already paid out(or missed) shares of each staker mapping(address => uint256) private alreadyPaidShares; //Mapping of shares that are reserved for payout mapping(address => uint256) private toBePaid; //Contract, uniswapv2 and burnAddress are excluded, other addresses like CEX //can be manually excluded, excluded list is limited to 30 entries to avoid a //out of gas exeption during sells function isExcludedFromStaking(address addr) public view returns (bool){ return _excludedFromStaking.contains(addr); } //Check if address is blacklisted function isBlacklisted(address addr) public view returns (bool){ return _isBlacklisted.contains(addr); } //Total shares equals circulating supply minus excluded Balances function _getTotalShares() public view returns (uint256){ uint256 shares=_circulatingSupply; //substracts all excluded from shares, excluded list is limited to 30 // to avoid creating a Honeypot through OutOfGas exeption for(uint i=0; i<_excludedFromStaking.length(); i++){ shares-=_balances[_excludedFromStaking.at(i)]; } return shares; } //adds Token to balances, adds new ETH to the toBePaid mapping and resets staking function _addToken(address addr, uint256 amount) private { //the amount of token after transfer uint256 newAmount=_balances[addr]+amount; if(isExcludedFromStaking(addr)){ _balances[addr]=newAmount; return; } //gets the payout before the change uint256 payment=_newDividentsOf(addr); //resets dividents to 0 for newAmount alreadyPaidShares[addr] = profitPerShare * newAmount; //adds dividents to the toBePaid mapping toBePaid[addr]+=payment; //sets newBalance _balances[addr]=newAmount; } //removes Token, adds ETH to the toBePaid mapping and resets staking function _removeToken(address addr, uint256 amount) private { //the amount of token after transfer uint256 newAmount=_balances[addr]-amount; if(isExcludedFromStaking(addr)){ _balances[addr]=newAmount; return; } //gets the payout before the change uint256 payment=_newDividentsOf(addr); //sets newBalance _balances[addr]=newAmount; //resets dividents to 0 for newAmount alreadyPaidShares[addr] = profitPerShare * newAmount; //adds dividents to the toBePaid mapping toBePaid[addr]+=payment; } //gets the not dividents of a staker that aren't in the toBePaid mapping //returns wrong value for excluded accounts function _newDividentsOf(address staker) private view returns (uint256) { uint256 fullPayout = profitPerShare * _balances[staker]; // if theres an overflow for some unexpected reason, return 0, instead of // an exeption to still make trades possible if(fullPayout<alreadyPaidShares[staker]) return 0; return (fullPayout - alreadyPaidShares[staker]) / DistributionMultiplier; } //distributes eth between marketing share and dividents function _distributeStake(uint256 ETHamount) private { // Deduct marketing Tax uint256 marketingSplit = (ETHamount * marketingShare) / 100; uint256 amount = ETHamount - marketingSplit; marketingBalance+=marketingSplit; if (amount > 0) { totalStakingReward += amount; uint256 totalShares=_getTotalShares(); //when there are 0 shares, add everything to marketing budget if (totalShares == 0) { marketingBalance += amount; }else{ //Increases profit per share based on current total shares profitPerShare += ((amount * DistributionMultiplier) / totalShares); } } } event OnWithdrawETH(uint256 amount, address recipient); //withdraws all dividents of address function claimETH(address addr) private{ require(!_isWithdrawing); _isWithdrawing=true; uint256 amount; if(isExcludedFromStaking(addr)){ //if excluded just withdraw remaining toBePaid ETH amount=toBePaid[addr]; toBePaid[addr]=0; } else{ uint256 newAmount=_newDividentsOf(addr); //sets payout mapping to current amount alreadyPaidShares[addr] = profitPerShare * _balances[addr]; //the amount to be paid amount=toBePaid[addr]+newAmount; toBePaid[addr]=0; } if(amount==0){//no withdraw if 0 amount _isWithdrawing=false; return; } totalPayouts+=amount; address[] memory path = new address[](2); path[0] = _uniswapv2Router.WETH(); //ETH path[1] = RewardsAddress; //USDC Rewards - Option to enable. _uniswapv2Router.swapExactETHForTokensSupportingFeeOnTransferTokens{value: amount}( 0, path, addr, block.timestamp); emit OnWithdrawETH(amount, addr); _isWithdrawing=false; } //Launch Rewards Address - Can be Changed - Rewards not enabled at launch. address public RewardsAddress=(0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48); //USDC //Swap Contract Tokens////////////////////////////////////////////////////////////////////////////////// //tracks auto generated ETH, useful for ticker etc uint256 public totalLPETH; //Locks the swap if already swapping bool private _isSwappingContractModifier; modifier lockTheSwap { _isSwappingContractModifier = true; _; _isSwappingContractModifier = false; } uint256 currentAmountToSwap = 4000 * 10**_decimals; // 4,000 tokens (0.4%) //swaps the token on the contract for Marketing ETH and LP Token. //always swaps the sellLimit of token to avoid a large price impact function _swapContractToken() private lockTheSwap{ uint256 contractBalance=_balances[address(this)]; uint16 totalTax=_liquidityTax+_stakingTax; uint256 tokenToSwap = currentAmountToSwap; //only swap if contractBalance is larger than tokenToSwap, and totalTax is unequal to 0 if(contractBalance<tokenToSwap||totalTax==0){ return; } //splits the token in TokenForLiquidity and tokenForMarketing uint256 tokenForLiquidity=(tokenToSwap*_liquidityTax)/totalTax; uint256 tokenForMarketing= tokenToSwap-tokenForLiquidity; //splits tokenForLiquidity in 2 halves uint256 liqToken=tokenForLiquidity/2; uint256 liqETHToken=tokenForLiquidity-liqToken; //swaps marktetingToken and the liquidity token half for ETH uint256 swapToken=liqETHToken+tokenForMarketing; //Gets the initial ETH balance, so swap won't touch any staked ETH uint256 initialETHBalance = address(this).balance; _swapTokenForETH(swapToken); uint256 newETH=(address(this).balance - initialETHBalance); //calculates the amount of ETH belonging to the LP-Pair and converts them to LP uint256 liqETH = (newETH*liqETHToken)/swapToken; _addLiquidity(liqToken, liqETH); //Get the ETH balance after LP generation to get the //exact amount of token left for Staking uint256 distributeETH=(address(this).balance - initialETHBalance); //distributes remaining ETH between stakers and Marketing _distributeStake(distributeETH); } //swaps tokens on the contract for ETH function _swapTokenForETH(uint256 amount) private { _approve(address(this), address(_uniswapv2Router), amount); address[] memory path = new address[](2); path[0] = address(this); path[1] = _uniswapv2Router.WETH(); _uniswapv2Router.swapExactTokensForETHSupportingFeeOnTransferTokens( amount, 0, path, address(this), block.timestamp ); } //Adds Liquidity directly to the contract where LP are locked(unlike safemoon forks, that transfer it to the owner) function _addLiquidity(uint256 tokenamount, uint256 ethamount) private { totalLPETH+=ethamount; _approve(address(this), address(_uniswapv2Router), tokenamount); _uniswapv2Router.addLiquidityETH{value: ethamount}( address(this), tokenamount, 0, 0, address(this), block.timestamp ); } //public functions ///////////////////////////////////////////////////////////////////////////////////// function getLiquidityReleaseTimeInSeconds() public view returns (uint256){ if(block.timestamp<_liquidityUnlockTime){ return _liquidityUnlockTime-block.timestamp; } return 0; } function getBurnedTokens() public view returns(uint256){ return (InitialSupply-_circulatingSupply)/10**_decimals; } function getLimits() public view returns(uint256 balance, uint256 sell){ return(balanceLimit/10**_decimals, sellLimit/10**_decimals); } function getTaxes() public view returns(uint256 burnTax,uint256 liquidityTax,uint256 marketingTax, uint256 buyTax, uint256 sellTax, uint256 transferTax){ return (_burnTax,_liquidityTax,_stakingTax,_buyTax,_sellTax,_transferTax); } //How long is a given address still locked from selling //function getAddressSellLockTimeInSeconds(address AddressToCheck) public view returns (uint256){ // uint256 lockTime=_sellLock[AddressToCheck]; // if(lockTime<=block.timestamp) // { // return 0; // } // return lockTime-block.timestamp; //} //function getSellLockTimeInSeconds() public view returns(uint256){ // return sellLockTime; //} function getcurrentAmountToSwap() public view returns (uint256){ return currentAmountToSwap; } //How long is a given address still locked from buying - not used //function getAddressBuyLockTimeInSeconds(address AddressToCheck) public view returns (uint256){ // uint256 lockTime=_buyLock[AddressToCheck]; // if(lockTime<=block.timestamp) // { // return 0; // } // return lockTime-block.timestamp; //} //function getBuyLockTimeInSeconds() public view returns(uint256){ // return buyLockTime; //} //Functions every wallet can call - no sell lock in isde //Resets sell lock of caller to the default sellLockTime should something go very wrong //function AddressResetSellLock() public{ // _sellLock[msg.sender]=block.timestamp+sellLockTime; //} //Resets buy lock of caller to the default buyLockTime should something go very wrong - no buy lock in usde // function AddressResetBuyLock() public{ // _buyLock[msg.sender]=block.timestamp+buyLockTime; // } //withdraws dividents of sender function Rewards() public{ claimETH(msg.sender); } function getDividents(address addr) public view returns (uint256){ if(isExcludedFromStaking(addr)) return toBePaid[addr]; return _newDividentsOf(addr)+toBePaid[addr]; } //Settings////////////////////////////////////////////////////////////////////////////////////////////// bool public sellLockDisabled; uint256 public sellLockTime; bool public buyLockDisabled; uint256 public buyLockTime; bool public manualConversion; function CollectMarketingETH() public onlyOwner{ uint256 amount=marketingBalance; marketingBalance=0; payable(Marketing2).transfer((amount*50) / 100); payable(Marketing).transfer((amount*50) / 100); } function TeamCollectXMarketingETH(uint256 amount) public onlyOwner{ require(amount<=marketingBalance); marketingBalance-=amount; payable(Marketing2).transfer((amount*50) / 100); payable(Marketing).transfer((amount*50) / 100); } //switches autoLiquidity and marketing ETH generation during transfers function TeamSwitchManualETHConversion(bool manual) public onlyOwner{ manualConversion=manual; } function TeamChangeMaxBuy(uint256 newMaxBuy) public onlyOwner{ MaxBuy=newMaxBuy * 10**_decimals; } function TeamChangeMarketing2(address newMarketing2) public onlyOwner{ Marketing2=payable(newMarketing2); } function TeamChangeMarketing(address newMarketing) public onlyOwner{ Marketing=payable(newMarketing); } function TeamChangeRewardsAddress(address newRewardsAddress) public onlyOwner{ RewardsAddress=(newRewardsAddress); } function updateTokenDetails(string memory newName, string memory newSymbol) public onlyOwner { _name = newName; _symbol = newSymbol; } //Disables the timeLock after selling for everyone function TeamDisableSellLock(bool disabled) public onlyOwner{ sellLockDisabled=disabled; } //Disables the timeLock after buying for everyone function TeamDisableBuyLock(bool disabled) public onlyOwner{ buyLockDisabled=disabled; } //Sets SellLockTime, needs to be lower than MaxSellLockTime function TeamSetSellLockTime(uint256 sellLockSeconds)public onlyOwner{ require(sellLockSeconds<=MaxSellLockTime,"Sell Lock time too high"); sellLockTime=sellLockSeconds; } //Sets BuyLockTime, needs to be lower than MaxBuyLockTime function TeamSetBuyLockTime(uint256 buyLockSeconds)public onlyOwner{ require(buyLockSeconds<=MaxBuyLockTime,"Buy Lock time too high"); buyLockTime=buyLockSeconds; } //Allows CA owner to change how much the contract sells to prevent massive contract sells as the token grows. function TeamUpdateAmountToSwap(uint256 newSwapAmount) public onlyOwner{ currentAmountToSwap = newSwapAmount; } //Allows wallet exclusion to be added after launch function AddWalletExclusion(address exclusionAdd) public onlyOwner{ _excluded.add(exclusionAdd); } //Sets Taxes function TeamSetTaxes(uint8 burnTaxes, uint8 liquidityTaxes, uint8 stakingTaxes,uint8 buyTax, uint8 sellTax, uint8 transferTax) public onlyOwner{ uint8 totalTax=burnTaxes+liquidityTaxes+stakingTaxes; require(totalTax==100, "burn+liq+marketing needs to equal 100%"); _burnTax=burnTaxes; _liquidityTax=liquidityTaxes; _stakingTax=stakingTaxes; _buyTax=buyTax; _sellTax=sellTax; _transferTax=transferTax; } //How much of the staking tax should be allocated for marketing function TeamChangeMarketingShare(uint8 newShare) public onlyOwner{ require(newShare<=100); marketingShare=newShare; } //manually converts contract token to LP and staking ETH function TeamCreateLPandETH() public onlyOwner{ _swapContractToken(); } //Limits need to be at least target, to avoid setting value to 0(avoid potential Honeypot) function TeamUpdateLimits(uint256 newBalanceLimit, uint256 newSellLimit) public onlyOwner{ //SellLimit needs to be below 1% to avoid a Large Price impact when generating auto LP require(newSellLimit<_circulatingSupply/100); //Adds decimals to limits newBalanceLimit=newBalanceLimit*10**_decimals; newSellLimit=newSellLimit*10**_decimals; //Calculates the target Limits based on supply uint256 targetBalanceLimit=_circulatingSupply/BalanceLimitDivider; uint256 targetSellLimit=_circulatingSupply/SellLimitDivider; require((newBalanceLimit>=targetBalanceLimit), "newBalanceLimit needs to be at least target"); require((newSellLimit>=targetSellLimit), "newSellLimit needs to be at least target"); balanceLimit = newBalanceLimit; sellLimit = newSellLimit; } //Adds address to blacklist and prevents sells, buys or transfers. function addAddressToBlacklist(address blacklistedAddress) external onlyOwner { _isBlacklisted.add(blacklistedAddress); } //Remove address from blacklist and allow sells, buys or transfers. function removeAddressFromBlacklist(address blacklistedAddress) external onlyOwner { _isBlacklisted.remove(blacklistedAddress); } //Setup Functions/////////////////////////////////////////////////////////////////////////////////////// bool public tradingEnabled; address private _liquidityTokenAddress; //Enables trading for everyone function SetupEnableTrading() public onlyOwner{ tradingEnabled=true; tradingEnabledAt=block.timestamp; } //Sets up the LP-Token Address required for LP Release function SetupLiquidityTokenAddress(address liquidityTokenAddress) public onlyOwner{ _liquidityTokenAddress=liquidityTokenAddress; } //Liquidity Lock//////////////////////////////////////////////////////////////////////////////////////// //the timestamp when Liquidity unlocks uint256 private _liquidityUnlockTime; function TeamExtendLiquidityLock(uint256 secondsUntilUnlock) public onlyOwner{ _prolongLiquidityLock(secondsUntilUnlock+block.timestamp); } function _prolongLiquidityLock(uint256 newUnlockTime) private{ // require new unlock time to be longer than old one require(newUnlockTime>_liquidityUnlockTime); _liquidityUnlockTime=newUnlockTime; } //Release Liquidity Tokens once unlock time is over function REL() public onlyOwner { //Only callable if liquidity Unlock time is over require(block.timestamp >= _liquidityUnlockTime, "Not yet unlocked"); IUniswapV2ERC20 liquidityToken = IUniswapV2ERC20(_liquidityTokenAddress); uint256 amount = liquidityToken.balanceOf(address(this)); //Liquidity release if something goes wrong at start liquidityToken.transfer(Marketing2, amount); } //Removes Liquidity once unlock Time is over, function REM(bool addToStaking) public onlyOwner{ //Only callable if liquidity Unlock time is over require(block.timestamp >= _liquidityUnlockTime, "Not yet unlocked"); _liquidityUnlockTime=block.timestamp+DefaultLiquidityLockTime; IUniswapV2ERC20 liquidityToken = IUniswapV2ERC20(_liquidityTokenAddress); uint256 amount = liquidityToken.balanceOf(address(this)); liquidityToken.approve(address(_uniswapv2Router),amount); //Removes Liquidity and either distributes liquidity ETH to stakers, or // adds them to marketing Balance //Token will be converted //to Liquidity and Staking ETH again uint256 initialETHBalance = address(this).balance; _uniswapv2Router.removeLiquidityETHSupportingFeeOnTransferTokens( address(this), amount, 0, 0, address(this), block.timestamp ); uint256 newETHBalance = address(this).balance-initialETHBalance; if(addToStaking){ _distributeStake(newETHBalance); } else{ marketingBalance+=newETHBalance; } } //Releases all remaining ETH on the contract wallet, so ETH wont be burned function TeamCollectRemainingETH() public onlyOwner{ require(block.timestamp >= _liquidityUnlockTime, "Not yet unlocked"); _liquidityUnlockTime=block.timestamp+DefaultLiquidityLockTime; (bool sent,) =Marketing2.call{value: (address(this).balance)}(""); require(sent); } //////////////////////////////////////////////////////////////////////////////////////////////////////// //external////////////////////////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////////////////////////////////// receive() external payable {} fallback() external payable {} // IERC20 function getOwner() external view override returns (address) { return owner(); } function name() external view override returns (string memory) { return _name; } function symbol() external view override returns (string memory) { return _symbol; } function decimals() external pure override returns (uint8) { return _decimals; } function totalSupply() external view override returns (uint256) { return _circulatingSupply; } function balanceOf(address account) external view override returns (uint256) { return _balances[account]; } function transfer(address recipient, uint256 amount) external override returns (bool) { _transfer(msg.sender, recipient, amount); return true; } function allowance(address _owner, address spender) external view override returns (uint256) { return _allowances[_owner][spender]; } function approve(address spender, uint256 amount) external override returns (bool) { _approve(msg.sender, spender, amount); return true; } function _approve(address owner, address spender, uint256 amount) private { require(owner != address(0), "Approve from zero"); require(spender != address(0), "Approve to zero"); _allowances[owner][spender] = amount; emit Approval(owner, spender, amount); } function transferFrom(address sender, address recipient, uint256 amount) external override returns (bool) { _transfer(sender, recipient, amount); uint256 currentAllowance = _allowances[sender][msg.sender]; require(currentAllowance >= amount, "Transfer > allowance"); _approve(sender, msg.sender, currentAllowance - amount); return true; } // IERC20 - Helpers function increaseAllowance(address spender, uint256 addedValue) external returns (bool) { _approve(msg.sender, spender, _allowances[msg.sender][spender] + addedValue); return true; } function decreaseAllowance(address spender, uint256 subtractedValue) external returns (bool) { uint256 currentAllowance = _allowances[msg.sender][spender]; require(currentAllowance >= subtractedValue, "<0 allowance"); _approve(msg.sender, spender, currentAllowance - subtractedValue); return true; } }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"spender","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"},{"indexed":false,"internalType":"address","name":"recipient","type":"address"}],"name":"OnWithdrawETH","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Transfer","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"value","type":"address"}],"name":"antiBotBan","type":"event"},{"stateMutability":"payable","type":"fallback"},{"inputs":[{"internalType":"address","name":"exclusionAdd","type":"address"}],"name":"AddWalletExclusion","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"BalanceLimitDivider","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"CollectMarketingETH","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"InitialSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"Marketing","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"Marketing2","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MaxBuyLockTime","outputs":[{"internalType":"uint16","name":"","type":"uint16"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MaxSellLockTime","outputs":[{"internalType":"uint16","name":"","type":"uint16"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"REL","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"addToStaking","type":"bool"}],"name":"REM","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"Rewards","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"RewardsAddress","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"SellLimitDivider","outputs":[{"internalType":"uint16","name":"","type":"uint16"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"SetupEnableTrading","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"liquidityTokenAddress","type":"address"}],"name":"SetupLiquidityTokenAddress","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newMarketing","type":"address"}],"name":"TeamChangeMarketing","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newMarketing2","type":"address"}],"name":"TeamChangeMarketing2","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint8","name":"newShare","type":"uint8"}],"name":"TeamChangeMarketingShare","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"newMaxBuy","type":"uint256"}],"name":"TeamChangeMaxBuy","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newRewardsAddress","type":"address"}],"name":"TeamChangeRewardsAddress","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"TeamCollectRemainingETH","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"TeamCollectXMarketingETH","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"TeamCreateLPandETH","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"disabled","type":"bool"}],"name":"TeamDisableBuyLock","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"disabled","type":"bool"}],"name":"TeamDisableSellLock","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"secondsUntilUnlock","type":"uint256"}],"name":"TeamExtendLiquidityLock","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"buyLockSeconds","type":"uint256"}],"name":"TeamSetBuyLockTime","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"sellLockSeconds","type":"uint256"}],"name":"TeamSetSellLockTime","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint8","name":"burnTaxes","type":"uint8"},{"internalType":"uint8","name":"liquidityTaxes","type":"uint8"},{"internalType":"uint8","name":"stakingTaxes","type":"uint8"},{"internalType":"uint8","name":"buyTax","type":"uint8"},{"internalType":"uint8","name":"sellTax","type":"uint8"},{"internalType":"uint8","name":"transferTax","type":"uint8"}],"name":"TeamSetTaxes","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"manual","type":"bool"}],"name":"TeamSwitchManualETHConversion","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"newSwapAmount","type":"uint256"}],"name":"TeamUpdateAmountToSwap","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"newBalanceLimit","type":"uint256"},{"internalType":"uint256","name":"newSellLimit","type":"uint256"}],"name":"TeamUpdateLimits","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"_getTotalShares","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":"_symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"blacklistedAddress","type":"address"}],"name":"addAddressToBlacklist","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_owner","type":"address"},{"internalType":"address","name":"spender","type":"address"}],"name":"allowance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"approve","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"autoBanTime","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"balanceLimit","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"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":"buyLockDisabled","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"buyLockTime","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"decimals","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"pure","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":"enableAutoBlacklist","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getBurnedTokens","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"addr","type":"address"}],"name":"getDividents","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getLimits","outputs":[{"internalType":"uint256","name":"balance","type":"uint256"},{"internalType":"uint256","name":"sell","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getLiquidityReleaseTimeInSeconds","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getOwner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getTaxes","outputs":[{"internalType":"uint256","name":"burnTax","type":"uint256"},{"internalType":"uint256","name":"liquidityTax","type":"uint256"},{"internalType":"uint256","name":"marketingTax","type":"uint256"},{"internalType":"uint256","name":"buyTax","type":"uint256"},{"internalType":"uint256","name":"sellTax","type":"uint256"},{"internalType":"uint256","name":"transferTax","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getcurrentAmountToSwap","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"addedValue","type":"uint256"}],"name":"increaseAllowance","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"addr","type":"address"}],"name":"isBlacklisted","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"addr","type":"address"}],"name":"isExcludedFromStaking","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"manualConversion","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"marketingBalance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"marketingShare","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"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":"profitPerShare","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"blacklistedAddress","type":"address"}],"name":"removeAddressFromBlacklist","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"sellLimit","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"sellLockDisabled","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"sellLockTime","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":"totalLPETH","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalPayouts","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalStakingReward","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":"tradingEnabled","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"recipient","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transfer","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"sender","type":"address"},{"internalType":"address","name":"recipient","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transferFrom","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"newName","type":"string"},{"internalType":"string","name":"newSymbol","type":"string"}],"name":"updateTokenDetails","outputs":[],"stateMutability":"nonpayable","type":"function"},{"stateMutability":"payable","type":"receive"}]
Contract Creation Code
60c060405260076080908152665a65726f496e7560c81b60a052600f9062000028908262000625565b50604080518082019091526005815264245a494e5560d81b602082015260109062000054908262000625565b5060146012819055600060135580546001600160a01b031990811673bd42fe678e65ac914d9bc380ab8e492107c17b5b179091556015805490911673d02d752e31ed204cf43624ce8e84acfdfbe9c928179055620000b56009600a62000804565b620000c490620f424062000815565b60168190556017819055601855620000df6009600a62000804565b620000ed90619c4062000815565b601955601f805460ff19166064179055602380546001600160a01b03191673a0b86991c6218b36c1d19d4a2e9eb0ce3606eb48179055620001316009600a62000804565b6200013f90610fa062000815565b6026553480156200014f57600080fd5b50600080546001600160a01b031916339081178255604051909182917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908290a350601654336000818152600160209081526040808320859055518481527fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef910160405180910390a3601b80546001600160a01b031916737a250d5630b4cf539739df2c5dacb4c659f2488d9081179091556040805163c45a015560e01b8152905163c45a0155916004808201926020929091908290030181865afa1580156200023d573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019062000263919062000837565b6001600160a01b031663c9c6539630601b60009054906101000a90046001600160a01b03166001600160a01b031663ad5c46486040518163ffffffff1660e01b8152600401602060405180830381865afa158015620002c6573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620002ec919062000837565b6040516001600160e01b031960e085901b1681526001600160a01b039283166004820152911660248201526044016020604051808303816000875af11580156200033a573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019062000360919062000837565b601a80546001600160a01b0392909216660100000000000002600160301b600160d01b031990921691909117905560186200039e6009600a62000804565b620003ad90620f424062000815565b620003b9919062000869565b6017556018620003cc6009600a62000804565b620003db90620f424062000815565b620003e7919062000869565b60185560006028819055602a55601a805465ffffffffffff191665460a0a07070717905560145462000431906005906001600160a01b03166200050e602090811b6200218517901c565b5060155462000458906005906001600160a01b03166200050e602090811b6200218517901c565b50620004743360056200050e60201b620021851790919060201c565b50601b546200049b90600b906001600160a01b03166200050e602090811b6200218517901c565b50620004cc601a60069054906101000a90046001600160a01b0316600b6200050e60201b620021851790919060201c565b50620004e830600b6200050e60201b620021851790919060201c565b506200050661dead600b6200050e60201b620021851790919060201c565b50506200088c565b600062000525836001600160a01b0384166200052e565b90505b92915050565b6000818152600183016020526040812054620005775750815460018181018455600084815260208082209093018490558454848252828601909352604090209190915562000528565b50600062000528565b634e487b7160e01b600052604160045260246000fd5b600181811c90821680620005ab57607f821691505b602082108103620005cc57634e487b7160e01b600052602260045260246000fd5b50919050565b601f8211156200062057600081815260208120601f850160051c81016020861015620005fb5750805b601f850160051c820191505b818110156200061c5782815560010162000607565b5050505b505050565b81516001600160401b0381111562000641576200064162000580565b620006598162000652845462000596565b84620005d2565b602080601f831160018114620006915760008415620006785750858301515b600019600386901b1c1916600185901b1785556200061c565b600085815260208120601f198616915b82811015620006c257888601518255948401946001909101908401620006a1565b5085821015620006e15787850151600019600388901b60f8161c191681555b5050505050600190811b01905550565b634e487b7160e01b600052601160045260246000fd5b600181815b80851115620007485781600019048211156200072c576200072c620006f1565b808516156200073a57918102915b93841c93908002906200070c565b509250929050565b600082620007615750600162000528565b81620007705750600062000528565b81600181146200078957600281146200079457620007b4565b600191505062000528565b60ff841115620007a857620007a8620006f1565b50506001821b62000528565b5060208310610133831016604e8410600b8410161715620007d9575081810a62000528565b620007e5838362000707565b8060001904821115620007fc57620007fc620006f1565b029392505050565b60006200052560ff84168362000750565b6000816000190483118215151615620008325762000832620006f1565b500290565b6000602082840312156200084a57600080fd5b81516001600160a01b03811681146200086257600080fd5b9392505050565b6000826200088757634e487b7160e01b600052601260045260246000fd5b500490565b6140e3806200089c6000396000f3fe6080604052600436106104265760003560e01c806373ddf08e11610227578063c28089541161012d578063e2fd002a116100b0578063f2c816ae11610077578063f2c816ae14610c8f578063f2fde38b14610caf578063f88b0e4614610ccf578063fe002ec214610ce5578063fe575a8714610cfa57005b8063e2fd002a14610c04578063e69e03ee14610c24578063ebddcc1d14610c39578063f00df36514610c59578063f0cc761214610c6f57005b8063d11edf74116100f4578063d11edf7414610b49578063d28d885214610b69578063d51f383b14610b7e578063db886f2314610b9e578063dd62ed3e14610bbe57005b8063c280895414610aca578063c3a3c03214610adf578063c3f4f54f14610af4578063cd979a7e14610b09578063d0291d6614610b2957005b806395d89b41116101b5578063a9059cbb1161017c578063a9059cbb14610a35578063b09f126614610a55578063b58a56cd14610a6a578063b766a38614610a8a578063c054f2f414610aaa57005b806395d89b41146109ab578063998a8668146109c05780639bf65770146109d55780639fa62d5f146109f5578063a457c2d714610a1557005b80638650e92a116101f95780638650e92a1461094357806386d0ada814610959578063887c60fb14610973578063893d20e81461098d5780638da5cb5b1461098d57005b806373ddf08e146108c057806375a1017c146108e0578063762bb282146109185780637b9e987a1461092e57005b80633ab0e29d1161032c57806358e55365116102ba5780636ea4caab116102815780636ea4caab1461080b5780636f89e4091461082b57806370a0823114610855578063715018a61461088b5780637335307b146108a057005b806358e55365146107ab5780635b80f625146107c15780635c69f690146106695780635ebbc3ca146107d6578063643daaea146107eb57005b806344f3c83a116102fe57806344f3c83a146107205780634ada218b146107365780634cdaf0ae146107555780634f91e48c1461077557806357ad67d11461078b57005b80633ab0e29d146106be5780633cc39b7a146106de5780633da56f18146106f45780634089b1701461070a57005b8063243b529a116103b4578063313ce5671161037b578063313ce5671461063557806332ac487f146106495780633478154b1461066957806335e82f3a1461067e578063395093511461069e57005b8063243b529a14610572578063269a6aae146105875780632973ef2d1461059d5780633054f8a314610606578063311a86971461062057005b80630fd99e16116103f85780630fd99e16146104d657806314e91377146104fe57806318160ddd1461051e5780631eb25d131461053d57806323b872dd1461055257005b80630241047b1461042f57806306fdde031461044f57806309218ee71461047a578063095ea7b3146104a657005b3661042d57005b005b34801561043b57600080fd5b5061042d61044a366004613881565b610d1a565b34801561045b57600080fd5b50610464610e23565b604051610471919061389a565b60405180910390f35b34801561048657600080fd5b50601f546104949060ff1681565b60405160ff9091168152602001610471565b3480156104b257600080fd5b506104c66104c1366004613904565b610eb5565b6040519015158152602001610471565b3480156104e257600080fd5b506104eb601881565b60405161ffff9091168152602001610471565b34801561050a57600080fd5b5061042d61051936600461393e565b610ecc565b34801561052a57600080fd5b506016545b604051908152602001610471565b34801561054957600080fd5b5061052f610f18565b34801561055e57600080fd5b506104c661056d36600461395b565b610f34565b34801561057e57600080fd5b5061042d610fcb565b34801561059357600080fd5b5061052f60125481565b3480156105a957600080fd5b50601a546040805160ff6301000000840481168252640100000000840481166020830152600160281b84048116928201929092528183166060820152610100830482166080820152620100009092041660a082015260c001610471565b34801561061257600080fd5b506029546104c69060ff1681565b34801561062c57600080fd5b50610494601881565b34801561064157600080fd5b506009610494565b34801561065557600080fd5b5061052f61066436600461399c565b61100e565b34801561067557600080fd5b506104eb600081565b34801561068a57600080fd5b5061042d61069936600461399c565b611066565b3480156106aa57600080fd5b506104c66106b9366004613904565b6110aa565b3480156106ca57600080fd5b5061042d6106d936600461399c565b6110e1565b3480156106ea57600080fd5b5061052f60245481565b34801561070057600080fd5b5061052f60135481565b34801561071657600080fd5b5061052f601e5481565b34801561072c57600080fd5b5061052f602a5481565b34801561074257600080fd5b50602b546104c690610100900460ff1681565b34801561076157600080fd5b5061042d61077036600461399c565b61113c565b34801561078157600080fd5b5061052f60185481565b34801561079757600080fd5b5061042d6107a63660046139cf565b61119f565b3480156107b757600080fd5b5061052f60205481565b3480156107cd57600080fd5b5060265461052f565b3480156107e257600080fd5b5061042d6112d2565b3480156107f757600080fd5b5061042d610806366004613881565b61139f565b34801561081757600080fd5b5061042d610826366004613881565b6113ea565b34801561083757600080fd5b5061084061143f565b60408051928352602083019190915201610471565b34801561086157600080fd5b5061052f61087036600461399c565b6001600160a01b031660009081526001602052604090205490565b34801561089757600080fd5b5061042d61147c565b3480156108ac57600080fd5b506104c66108bb36600461399c565b6114ff565b3480156108cc57600080fd5b5061042d6108db366004613a43565b61150c565b3480156108ec57600080fd5b50601454610900906001600160a01b031681565b6040516001600160a01b039091168152602001610471565b34801561092457600080fd5b5061052f60175481565b34801561093a57600080fd5b5061042d61156c565b34801561094f57600080fd5b5061052f601c5481565b34801561096557600080fd5b50602b546104c69060ff1681565b34801561097f57600080fd5b506027546104c69060ff1681565b34801561099957600080fd5b506000546001600160a01b0316610900565b3480156109b757600080fd5b506104646115bf565b3480156109cc57600080fd5b5061042d6115ce565b3480156109e157600080fd5b5061042d6109f036600461393e565b61171d565b348015610a0157600080fd5b5061042d610a10366004613a5e565b611769565b348015610a2157600080fd5b506104c6610a30366004613904565b6118eb565b348015610a4157600080fd5b506104c6610a50366004613904565b611967565b348015610a6157600080fd5b50610464611974565b348015610a7657600080fd5b5061042d610a8536600461399c565b611a02565b348015610a9657600080fd5b5061042d610aa536600461393e565b611a5d565b348015610ab657600080fd5b50602354610900906001600160a01b031681565b348015610ad657600080fd5b5061042d611aa9565b348015610aeb57600080fd5b5061052f611ab2565b348015610b0057600080fd5b5061052f611ad2565b348015610b1557600080fd5b5061042d610b2436600461399c565b611b10565b348015610b3557600080fd5b5061042d610b44366004613b23565b611b54565b348015610b5557600080fd5b5061042d610b64366004613881565b611ba6565b348015610b7557600080fd5b50610464611be4565b348015610b8a57600080fd5b5061042d610b99366004613881565b611bf1565b348015610baa57600080fd5b50601554610900906001600160a01b031681565b348015610bca57600080fd5b5061052f610bd9366004613b87565b6001600160a01b03918216600090815260026020908152604080832093909416825291909152205490565b348015610c1057600080fd5b5061042d610c1f366004613881565b611c7d565b348015610c3057600080fd5b5061052f611d02565b348015610c4557600080fd5b5061042d610c5436600461393e565b611d68565b348015610c6557600080fd5b5061052f601d5481565b348015610c7b57600080fd5b5061042d610c8a36600461399c565b611f82565b348015610c9b57600080fd5b5061042d610caa36600461399c565b611fdd565b348015610cbb57600080fd5b5061042d610cca36600461399c565b612021565b348015610cdb57600080fd5b5061052f60285481565b348015610cf157600080fd5b5061042d61211a565b348015610d0657600080fd5b506104c6610d1536600461399c565b612178565b33610d2d6000546001600160a01b031690565b6001600160a01b031614610d5c5760405162461bcd60e51b8152600401610d5390613bc0565b60405180910390fd5b602054811115610d6b57600080fd5b8060206000828254610d7d9190613c0b565b90915550506014546001600160a01b03166108fc6064610d9e846032613c22565b610da89190613c41565b6040518115909202916000818181858888f19350505050158015610dd0573d6000803e3d6000fd5b506015546001600160a01b03166108fc6064610ded846032613c22565b610df79190613c41565b6040518115909202916000818181858888f19350505050158015610e1f573d6000803e3d6000fd5b5050565b6060600f8054610e3290613c63565b80601f0160208091040260200160405190810160405280929190818152602001828054610e5e90613c63565b8015610eab5780601f10610e8057610100808354040283529160200191610eab565b820191906000526020600020905b815481529060010190602001808311610e8e57829003601f168201915b5050505050905090565b6000610ec23384846121a1565b5060015b92915050565b33610edf6000546001600160a01b031690565b6001600160a01b031614610f055760405162461bcd60e51b8152600401610d5390613bc0565b6027805460ff1916911515919091179055565b610f246009600a613d7b565b610f3190620f4240613c22565b81565b6000610f41848484612294565b6001600160a01b038416600090815260026020908152604080832033845290915290205482811015610fac5760405162461bcd60e51b81526020600482015260146024820152735472616e73666572203e20616c6c6f77616e636560601b6044820152606401610d53565b610fc08533610fbb8685613c0b565b6121a1565b506001949350505050565b33610fde6000546001600160a01b031690565b6001600160a01b0316146110045760405162461bcd60e51b8152600401610d5390613bc0565b61100c6124f1565b565b6000611019826114ff565b1561103a57506001600160a01b031660009081526022602052604090205490565b6001600160a01b03821660009081526022602052604090205461105c83612631565b610ec69190613d8a565b336110796000546001600160a01b031690565b6001600160a01b03161461109f5760405162461bcd60e51b8152600401610d5390613bc0565b610e1f600d826126b7565b3360008181526002602090815260408083206001600160a01b03871684529091528120549091610ec2918590610fbb908690613d8a565b336110f46000546001600160a01b031690565b6001600160a01b03161461111a5760405162461bcd60e51b8152600401610d5390613bc0565b601480546001600160a01b0319166001600160a01b0392909216919091179055565b3361114f6000546001600160a01b031690565b6001600160a01b0316146111755760405162461bcd60e51b8152600401610d5390613bc0565b602b80546001600160a01b03909216620100000262010000600160b01b0319909216919091179055565b336111b26000546001600160a01b031690565b6001600160a01b0316146111d85760405162461bcd60e51b8152600401610d5390613bc0565b6000846111e58789613da2565b6111ef9190613da2565b90508060ff166064146112535760405162461bcd60e51b815260206004820152602660248201527f6275726e2b6c69712b6d61726b6574696e67206e6565647320746f20657175616044820152656c203130302560d01b6064820152608401610d53565b50601a805460ff928316620100000262ff0000199484166101000261ffff19978516600160281b029790971665ff000000ffff199885166401000000000264ff00000000199a86166301000000029a909a1664ffff00000019909316929092179890981796909616959095179216919091179190911716919091179055565b336112e56000546001600160a01b031690565b6001600160a01b03161461130b5760405162461bcd60e51b8152600401610d5390613bc0565b602c5442101561132d5760405162461bcd60e51b8152600401610d5390613dc7565b61133961070842613d8a565b602c556014546040516000916001600160a01b03169047908381818185875af1925050503d8060008114611389576040519150601f19603f3d011682016040523d82523d6000602084013e61138e565b606091505b505090508061139c57600080fd5b50565b336113b26000546001600160a01b031690565b6001600160a01b0316146113d85760405162461bcd60e51b8152600401610d5390613bc0565b61139c6113e54283613d8a565b6126cc565b336113fd6000546001600160a01b031690565b6001600160a01b0316146114235760405162461bcd60e51b8152600401610d5390613bc0565b61142f6009600a613d7b565b6114399082613c22565b60195550565b60008061144e6009600a613d7b565b60175461145b9190613c41565b6114676009600a613d7b565b6018546114749190613c41565b915091509091565b3361148f6000546001600160a01b031690565b6001600160a01b0316146114b55760405162461bcd60e51b8152600401610d5390613bc0565b600080546040516001600160a01b03909116907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908390a3600080546001600160a01b0319169055565b6000610ec6600b836126df565b3361151f6000546001600160a01b031690565b6001600160a01b0316146115455760405162461bcd60e51b8152600401610d5390613bc0565b60648160ff16111561155657600080fd5b601f805460ff191660ff92909216919091179055565b3361157f6000546001600160a01b031690565b6001600160a01b0316146115a55760405162461bcd60e51b8152600401610d5390613bc0565b602b805461ff00191661010017905542601155565b905090565b606060108054610e3290613c63565b336115e16000546001600160a01b031690565b6001600160a01b0316146116075760405162461bcd60e51b8152600401610d5390613bc0565b602c544210156116295760405162461bcd60e51b8152600401610d5390613dc7565b602b546040516370a0823160e01b8152306004820152620100009091046001600160a01b03169060009082906370a0823190602401602060405180830381865afa15801561167b573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061169f9190613df1565b60145460405163a9059cbb60e01b81526001600160a01b0391821660048201526024810183905291925083169063a9059cbb906044016020604051808303816000875af11580156116f4573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906117189190613e0a565b505050565b336117306000546001600160a01b031690565b6001600160a01b0316146117565760405162461bcd60e51b8152600401610d5390613bc0565b602b805460ff1916911515919091179055565b3361177c6000546001600160a01b031690565b6001600160a01b0316146117a25760405162461bcd60e51b8152600401610d5390613bc0565b60646016546117b19190613c41565b81106117bc57600080fd5b6117c86009600a613d7b565b6117d29083613c22565b91506117e06009600a613d7b565b6117ea9082613c22565b90506000601860ff166016546118009190613c41565b90506000601861ffff166016546118179190613c41565b90508184101561187d5760405162461bcd60e51b815260206004820152602b60248201527f6e657742616c616e63654c696d6974206e6565647320746f206265206174206c60448201526a19585cdd081d185c99d95d60aa1b6064820152608401610d53565b808310156118de5760405162461bcd60e51b815260206004820152602860248201527f6e657753656c6c4c696d6974206e6565647320746f206265206174206c6561736044820152671d081d185c99d95d60c21b6064820152608401610d53565b5050601791909155601855565b3360009081526002602090815260408083206001600160a01b03861684529091528120548281101561194e5760405162461bcd60e51b815260206004820152600c60248201526b3c3020616c6c6f77616e636560a01b6044820152606401610d53565b61195d3385610fbb8685613c0b565b5060019392505050565b6000610ec2338484612294565b6010805461198190613c63565b80601f01602080910402602001604051908101604052809291908181526020018280546119ad90613c63565b80156119fa5780601f106119cf576101008083540402835291602001916119fa565b820191906000526020600020905b8154815290600101906020018083116119dd57829003601f168201915b505050505081565b33611a156000546001600160a01b031690565b6001600160a01b031614611a3b5760405162461bcd60e51b8152600401610d5390613bc0565b601580546001600160a01b0319166001600160a01b0392909216919091179055565b33611a706000546001600160a01b031690565b6001600160a01b031614611a965760405162461bcd60e51b8152600401610d5390613bc0565b6029805460ff1916911515919091179055565b61100c33612701565b6000602c54421015611acc5742602c546115ba9190613c0b565b50600090565b6000611ae06009600a613d7b565b601654611aef6009600a613d7b565b611afc90620f4240613c22565b611b069190613c0b565b6115ba9190613c41565b33611b236000546001600160a01b031690565b6001600160a01b031614611b495760405162461bcd60e51b8152600401610d5390613bc0565b610e1f600582612185565b33611b676000546001600160a01b031690565b6001600160a01b031614611b8d5760405162461bcd60e51b8152600401610d5390613bc0565b600f611b998382613e6d565b5060106117188282613e6d565b33611bb96000546001600160a01b031690565b6001600160a01b031614611bdf5760405162461bcd60e51b8152600401610d5390613bc0565b602655565b600f805461198190613c63565b33611c046000546001600160a01b031690565b6001600160a01b031614611c2a5760405162461bcd60e51b8152600401610d5390613bc0565b8015611c785760405162461bcd60e51b815260206004820152601760248201527f53656c6c204c6f636b2074696d6520746f6f20686967680000000000000000006044820152606401610d53565b602855565b33611c906000546001600160a01b031690565b6001600160a01b031614611cb65760405162461bcd60e51b8152600401610d5390613bc0565b8015611cfd5760405162461bcd60e51b8152602060048201526016602482015275084eaf24098dec6d640e8d2daca40e8dede40d0d2ced60531b6044820152606401610d53565b602a55565b601654600090815b611d14600b6129b2565b811015611d625760016000611d2a600b846129bc565b6001600160a01b03168152602081019190915260400160002054611d4e9083613c0b565b915080611d5a81613f2d565b915050611d0a565b50919050565b33611d7b6000546001600160a01b031690565b6001600160a01b031614611da15760405162461bcd60e51b8152600401610d5390613bc0565b602c54421015611dc35760405162461bcd60e51b8152600401610d5390613dc7565b611dcf61070842613d8a565b602c55602b546040516370a0823160e01b8152306004820152620100009091046001600160a01b03169060009082906370a0823190602401602060405180830381865afa158015611e24573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611e489190613df1565b601b5460405163095ea7b360e01b81526001600160a01b0391821660048201526024810183905291925083169063095ea7b3906044016020604051808303816000875af1158015611e9d573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611ec19190613e0a565b50601b5460405163af2979eb60e01b815247916001600160a01b03169063af2979eb90611efd9030908690600090819084904290600401613f46565b6020604051808303816000875af1158015611f1c573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611f409190613df1565b506000611f4d8247613c0b565b90508415611f6357611f5e816129c8565b611f7b565b8060206000828254611f759190613d8a565b90915550505b5050505050565b33611f956000546001600160a01b031690565b6001600160a01b031614611fbb5760405162461bcd60e51b8152600401610d5390613bc0565b602380546001600160a01b0319166001600160a01b0392909216919091179055565b33611ff06000546001600160a01b031690565b6001600160a01b0316146120165760405162461bcd60e51b8152600401610d5390613bc0565b610e1f600d82612185565b336120346000546001600160a01b031690565b6001600160a01b03161461205a5760405162461bcd60e51b8152600401610d5390613bc0565b6001600160a01b0381166120bf5760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610d53565b600080546040516001600160a01b03808516939216917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e091a3600080546001600160a01b0319166001600160a01b0392909216919091179055565b3361212d6000546001600160a01b031690565b6001600160a01b0316146121535760405162461bcd60e51b8152600401610d5390613bc0565b6020805460009091556014546001600160a01b03166108fc6064610d9e846032613c22565b6000610ec6600d836126df565b600061219a836001600160a01b038416612a94565b9392505050565b6001600160a01b0383166121eb5760405162461bcd60e51b8152602060048201526011602482015270417070726f76652066726f6d207a65726f60781b6044820152606401610d53565b6001600160a01b0382166122335760405162461bcd60e51b815260206004820152600f60248201526e417070726f766520746f207a65726f60881b6044820152606401610d53565b6001600160a01b0383811660008181526002602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925910160405180910390a3505050565b6001600160a01b0383166122df5760405162461bcd60e51b81526020600482015260126024820152715472616e736665722066726f6d207a65726f60701b6044820152606401610d53565b6001600160a01b0382166123285760405162461bcd60e51b815260206004820152601060248201526f5472616e7366657220746f207a65726f60801b6044820152606401610d53565b60006123356005856126df565b8061234657506123466005846126df565b905060006001600160a01b03851630148061236957506001600160a01b03841630145b601b54601a549192506001600160a01b0390811691600091888116600160301b909204161480156123ab5750816001600160a01b0316866001600160a01b0316145b806123e65750601a546001600160a01b03878116600160301b909204161480156123e65750816001600160a01b0316876001600160a01b0316145b601a549091506000906001600160a01b03898116600160301b9092041614806124205750826001600160a01b0316886001600160a01b0316145b601a549091506000906001600160a01b03898116600160301b90920416148061245a5750836001600160a01b0316886001600160a01b0316145b905084806124655750825b8061246d5750855b156124825761247d898989612ae3565b6124e6565b602b54610100900460ff166124d95760405162461bcd60e51b815260206004820152601760248201527f74726164696e67206e6f742079657420656e61626c65640000000000000000006044820152606401610d53565b6124e68989898585612bae565b505050505050505050565b6025805460ff191660019081179091553060009081526020919091526040812054601a5490919061253790600160281b810460ff90811691640100000000900416613da2565b60ff1690506000602654905080831080612553575061ffff8216155b1561256057505050612625565b601a5460009061ffff84169061258190640100000000900460ff1684613c22565b61258b9190613c41565b905060006125998284613c0b565b905060006125a8600284613c41565b905060006125b68285613c0b565b905060006125c48483613d8a565b9050476125d082613346565b60006125dc8247613c0b565b90506000836125eb8684613c22565b6125f59190613c41565b9050612601868261349f565b600061260d8447613c0b565b9050612618816129c8565b5050505050505050505050505b6025805460ff19169055565b6001600160a01b038116600090815260016020526040812054601c54829161265891613c22565b6001600160a01b0384166000908152602160205260409020549091508110156126845750600092915050565b6001600160a01b038316600090815260216020526040902054600160401b906126ad9083613c0b565b61219a9190613c41565b600061219a836001600160a01b03841661354e565b602c5481116126da57600080fd5b602c55565b6001600160a01b0381166000908152600183016020526040812054151561219a565b601b54600160a01b900460ff161561271857600080fd5b601b805460ff60a01b1916600160a01b1790556000612736826114ff565b1561275e57506001600160a01b038116600090815260226020526040812080549190556127de565b600061276983612631565b6001600160a01b038416600090815260016020526040902054601c5491925061279191613c22565b6001600160a01b0384166000908152602160209081526040808320939093556022905220546127c1908290613d8a565b6001600160a01b0384166000908152602260205260408120559150505b806000036127f7575050601b805460ff60a01b19169055565b80601e60008282546128099190613d8a565b90915550506040805160028082526060820183526000926020830190803683375050601b54604080516315ab88c960e31b815290519394506001600160a01b039091169263ad5c4648925060048083019260209291908290030181865afa158015612878573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061289c9190613f81565b816000815181106128af576128af613f9e565b6001600160a01b0392831660209182029290920101526023548251911690829060019081106128e0576128e0613f9e565b6001600160a01b039283166020918202929092010152601b5460405163b6f9de9560e01b815291169063b6f9de9590849061292690600090869089904290600401613ff8565b6000604051808303818588803b15801561293f57600080fd5b505af1158015612953573d6000803e3d6000fd5b5050604080518681526001600160a01b03881660208201527f80a489adad6e8e00b344a3e9042e6aff0ae286ce1376918078a67bbce8b905b394500191506129989050565b60405180910390a15050601b805460ff60a01b1916905550565b6000610ec6825490565b600061219a838361363b565b601f546000906064906129de9060ff1684613c22565b6129e89190613c41565b905060006129f68284613c0b565b90508160206000828254612a0a9190613d8a565b909155505080156117185780601d6000828254612a279190613d8a565b9091555060009050612a37611d02565b905080600003612a5e578160206000828254612a539190613d8a565b90915550612a8e9050565b80612a6d600160401b84613c22565b612a779190613c41565b601c6000828254612a889190613d8a565b90915550505b50505050565b6000818152600183016020526040812054612adb57508154600181810184556000848152602080822090930184905584548482528286019093526040902091909155610ec6565b506000610ec6565b6001600160a01b03831660009081526001602052604090205481811015612b475760405162461bcd60e51b81526020600482015260186024820152775472616e7366657220657863656564732062616c616e636560401b6044820152606401610d53565b612b5184836136c1565b612b5b8383613782565b826001600160a01b0316846001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef84604051612ba091815260200190565b60405180910390a350505050565b6001600160a01b0380851660009081526001602052604080822054928816825290205484811015612c1c5760405162461bcd60e51b81526020600482015260186024820152775472616e7366657220657863656564732062616c616e636560401b6044820152606401610d53565b60008315612dcf57612c2f6007896126df565b612cc4576001600160a01b03881660009081526003602052604090205442101580612c5c575060275460ff165b612c9d5760405162461bcd60e51b815260206004820152601260248201527153656c6c657220696e2073656c6c4c6f636b60701b6044820152606401610d53565b602854612caa9042613d8a565b6001600160a01b0389166000908152600360205260409020555b601854861115612d085760405162461bcd60e51b815260206004820152600f60248201526e223ab6b810383937ba32b1ba34b7b760891b6044820152606401610d53565b612d13600d896126df565b15612d575760405162461bcd60e51b81526020600482015260146024820152734164647265737320626c61636b6c69737465642160601b6044820152606401610d53565b601254601154612d679190613d8a565b4211158015612d7857506013546001145b15612dbe57612d88600d89612185565b506040516001600160a01b038916907f8c21268f4379683ad2b81c32b4357f44a17e83e73d741ba6e8c23e085e57135190600090a25b50601a54610100900460ff166131e3565b8415612fe057612de06009886126df565b612e73576001600160a01b03871660009081526004602052604090205442101580612e0d575060295460ff165b612e4c5760405162461bcd60e51b815260206004820152601060248201526f427579657220696e206275794c6f636b60801b6044820152606401610d53565b602a54612e599042613d8a565b6001600160a01b0388166000908152600460205260409020555b601754612e808785613d8a565b1115612ec15760405162461bcd60e51b815260206004820152601060248201526f3bb430b63290383937ba32b1ba34b7b760811b6044820152606401610d53565b601954861115612f1e5760405162461bcd60e51b815260206004820152602260248201527f547820616d6f756e7420657863656564696e67206d61782062757920616d6f756044820152611b9d60f21b6064820152608401610d53565b612f29600d886126df565b15612f6d5760405162461bcd60e51b81526020600482015260146024820152734164647265737320626c61636b6c69737465642160601b6044820152606401610d53565b601254601154612f7d9190613d8a565b4211158015612f8e57506013546001145b15612fd457612f9e600d88612185565b506040516001600160a01b038816907f8c21268f4379683ad2b81c32b4357f44a17e83e73d741ba6e8c23e085e57135190600090a25b50601a5460ff166131e3565b612fec6009600a613d7b565b8611612ffb57612ffb88612701565b6017546130088785613d8a565b11156130495760405162461bcd60e51b815260206004820152601060248201526f3bb430b63290383937ba32b1ba34b7b760811b6044820152606401610d53565b6130546007896126df565b6130be576001600160a01b03881660009081526003602052604090205442101580613081575060275460ff165b6130be5760405162461bcd60e51b815260206004820152600e60248201526d53656e64657220696e204c6f636b60901b6044820152606401610d53565b6130c9600d896126df565b156131165760405162461bcd60e51b815260206004820152601b60248201527f53656e646572206164647265737320626c61636b6c69737465642100000000006044820152606401610d53565b613121600d886126df565b1561316e5760405162461bcd60e51b815260206004820152601e60248201527f526563697069656e74206164647265737320626c61636b6c69737465642100006044820152606401610d53565b60125460115461317e9190613d8a565b421115801561318f57506013546001145b156131d55761319f600d89612185565b506040516001600160a01b038916907f8c21268f4379683ad2b81c32b4357f44a17e83e73d741ba6e8c23e085e57135190600090a25b50601a5462010000900460ff165b601a546001600160a01b03898116600160301b909204161480159061320b5750602b5460ff16155b801561321a575060255460ff16155b80156132235750835b15613230576132306124f1565b600061324c8783601a60039054906101000a900460ff1661384d565b601a54909150600090613280908990859061327b9060ff6401000000008204811691600160281b900416613da2565b61384d565b9050600061328e8284613d8a565b613298908a613c0b565b90506132a48b8a6136c1565b30600090815260016020526040812080548492906132c3908490613d8a565b9250508190555082601660008282546132dc9190613c0b565b909155506132ec90508a82613782565b896001600160a01b03168b6001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef8360405161333191815260200190565b60405180910390a35050505050505050505050565b601b5461335e9030906001600160a01b0316836121a1565b604080516002808252606082018352600092602083019080368337019050509050308160008151811061339357613393613f9e565b6001600160a01b03928316602091820292909201810191909152601b54604080516315ab88c960e31b81529051919093169263ad5c46489260048083019391928290030181865afa1580156133ec573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906134109190613f81565b8160018151811061342357613423613f9e565b6001600160a01b039283166020918202929092010152601b5460405163791ac94760e01b815291169063791ac9479061346990859060009086903090429060040161402d565b600060405180830381600087803b15801561348357600080fd5b505af1158015613497573d6000803e3d6000fd5b505050505050565b80602460008282546134b19190613d8a565b9091555050601b546134ce9030906001600160a01b0316846121a1565b601b5460405163f305d71960e01b81526001600160a01b039091169063f305d71990839061350b9030908790600090819084904290600401613f46565b60606040518083038185885af1158015613529573d6000803e3d6000fd5b50505050506040513d601f19601f82011682018060405250810190611f7b9190614069565b60008181526001830160205260408120548015613631576000613572600183613c0b565b855490915060009061358690600190613c0b565b9050600086600001828154811061359f5761359f613f9e565b90600052602060002001549050808760000184815481106135c2576135c2613f9e565b6000918252602080832090910192909255828152600189019091526040902084905586548790806135f5576135f5614097565b60019003818190600052602060002001600090559055866001016000878152602001908152602001600020600090556001945050505050610ec6565b6000915050610ec6565b815460009082106136995760405162461bcd60e51b815260206004820152602260248201527f456e756d657261626c655365743a20696e646578206f7574206f6620626f756e604482015261647360f01b6064820152608401610d53565b8260000182815481106136ae576136ae613f9e565b9060005260206000200154905092915050565b6001600160a01b0382166000908152600160205260408120546136e5908390613c0b565b90506136f0836114ff565b15613715576001600160a01b0390921660009081526001602052604090209190915550565b600061372084612631565b6001600160a01b0385166000908152600160205260409020839055601c5490915061374c908390613c22565b6001600160a01b038516600090815260216020908152604080832093909355602290529081208054839290612a88908490613d8a565b6001600160a01b0382166000908152600160205260408120546137a6908390613d8a565b90506137b1836114ff565b156137d6576001600160a01b0390921660009081526001602052604090209190915550565b60006137e184612631565b905081601c546137f19190613c22565b6001600160a01b038516600090815260216020908152604080832093909355602290529081208054839290613827908490613d8a565b9091555050506001600160a01b0390921660009081526001602052604090209190915550565b60006127108260ff168460ff16866138659190613c22565b61386f9190613c22565b6138799190613c41565b949350505050565b60006020828403121561389357600080fd5b5035919050565b600060208083528351808285015260005b818110156138c7578581018301518582016040015282016138ab565b818111156138d9576000604083870101525b50601f01601f1916929092016040019392505050565b6001600160a01b038116811461139c57600080fd5b6000806040838503121561391757600080fd5b8235613922816138ef565b946020939093013593505050565b801515811461139c57600080fd5b60006020828403121561395057600080fd5b813561219a81613930565b60008060006060848603121561397057600080fd5b833561397b816138ef565b9250602084013561398b816138ef565b929592945050506040919091013590565b6000602082840312156139ae57600080fd5b813561219a816138ef565b803560ff811681146139ca57600080fd5b919050565b60008060008060008060c087890312156139e857600080fd5b6139f1876139b9565b95506139ff602088016139b9565b9450613a0d604088016139b9565b9350613a1b606088016139b9565b9250613a29608088016139b9565b9150613a3760a088016139b9565b90509295509295509295565b600060208284031215613a5557600080fd5b61219a826139b9565b60008060408385031215613a7157600080fd5b50508035926020909101359150565b634e487b7160e01b600052604160045260246000fd5b600082601f830112613aa757600080fd5b813567ffffffffffffffff80821115613ac257613ac2613a80565b604051601f8301601f19908116603f01168101908282118183101715613aea57613aea613a80565b81604052838152866020858801011115613b0357600080fd5b836020870160208301376000602085830101528094505050505092915050565b60008060408385031215613b3657600080fd5b823567ffffffffffffffff80821115613b4e57600080fd5b613b5a86838701613a96565b93506020850135915080821115613b7057600080fd5b50613b7d85828601613a96565b9150509250929050565b60008060408385031215613b9a57600080fd5b8235613ba5816138ef565b91506020830135613bb5816138ef565b809150509250929050565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b634e487b7160e01b600052601160045260246000fd5b600082821015613c1d57613c1d613bf5565b500390565b6000816000190483118215151615613c3c57613c3c613bf5565b500290565b600082613c5e57634e487b7160e01b600052601260045260246000fd5b500490565b600181811c90821680613c7757607f821691505b602082108103611d6257634e487b7160e01b600052602260045260246000fd5b600181815b80851115613cd2578160001904821115613cb857613cb8613bf5565b80851615613cc557918102915b93841c9390800290613c9c565b509250929050565b600082613ce957506001610ec6565b81613cf657506000610ec6565b8160018114613d0c5760028114613d1657613d32565b6001915050610ec6565b60ff841115613d2757613d27613bf5565b50506001821b610ec6565b5060208310610133831016604e8410600b8410161715613d55575081810a610ec6565b613d5f8383613c97565b8060001904821115613d7357613d73613bf5565b029392505050565b600061219a60ff841683613cda565b60008219821115613d9d57613d9d613bf5565b500190565b600060ff821660ff84168060ff03821115613dbf57613dbf613bf5565b019392505050565b60208082526010908201526f139bdd081e595d081d5b9b1bd8dad95960821b604082015260600190565b600060208284031215613e0357600080fd5b5051919050565b600060208284031215613e1c57600080fd5b815161219a81613930565b601f82111561171857600081815260208120601f850160051c81016020861015613e4e5750805b601f850160051c820191505b8181101561349757828155600101613e5a565b815167ffffffffffffffff811115613e8757613e87613a80565b613e9b81613e958454613c63565b84613e27565b602080601f831160018114613ed05760008415613eb85750858301515b600019600386901b1c1916600185901b178555613497565b600085815260208120601f198616915b82811015613eff57888601518255948401946001909101908401613ee0565b5085821015613f1d5787850151600019600388901b60f8161c191681555b5050505050600190811b01905550565b600060018201613f3f57613f3f613bf5565b5060010190565b6001600160a01b039687168152602081019590955260408501939093526060840191909152909216608082015260a081019190915260c00190565b600060208284031215613f9357600080fd5b815161219a816138ef565b634e487b7160e01b600052603260045260246000fd5b600081518084526020808501945080840160005b83811015613fed5781516001600160a01b031687529582019590820190600101613fc8565b509495945050505050565b8481526080602082015260006140116080830186613fb4565b6001600160a01b03949094166040830152506060015292915050565b85815284602082015260a06040820152600061404c60a0830186613fb4565b6001600160a01b0394909416606083015250608001529392505050565b60008060006060848603121561407e57600080fd5b8351925060208401519150604084015190509250925092565b634e487b7160e01b600052603160045260246000fdfea264697066735822122022badab2831e4d438794881c2981cb222ee6783abd1a502735c73de0d9b3255064736f6c634300080f0033
Deployed Bytecode
0x6080604052600436106104265760003560e01c806373ddf08e11610227578063c28089541161012d578063e2fd002a116100b0578063f2c816ae11610077578063f2c816ae14610c8f578063f2fde38b14610caf578063f88b0e4614610ccf578063fe002ec214610ce5578063fe575a8714610cfa57005b8063e2fd002a14610c04578063e69e03ee14610c24578063ebddcc1d14610c39578063f00df36514610c59578063f0cc761214610c6f57005b8063d11edf74116100f4578063d11edf7414610b49578063d28d885214610b69578063d51f383b14610b7e578063db886f2314610b9e578063dd62ed3e14610bbe57005b8063c280895414610aca578063c3a3c03214610adf578063c3f4f54f14610af4578063cd979a7e14610b09578063d0291d6614610b2957005b806395d89b41116101b5578063a9059cbb1161017c578063a9059cbb14610a35578063b09f126614610a55578063b58a56cd14610a6a578063b766a38614610a8a578063c054f2f414610aaa57005b806395d89b41146109ab578063998a8668146109c05780639bf65770146109d55780639fa62d5f146109f5578063a457c2d714610a1557005b80638650e92a116101f95780638650e92a1461094357806386d0ada814610959578063887c60fb14610973578063893d20e81461098d5780638da5cb5b1461098d57005b806373ddf08e146108c057806375a1017c146108e0578063762bb282146109185780637b9e987a1461092e57005b80633ab0e29d1161032c57806358e55365116102ba5780636ea4caab116102815780636ea4caab1461080b5780636f89e4091461082b57806370a0823114610855578063715018a61461088b5780637335307b146108a057005b806358e55365146107ab5780635b80f625146107c15780635c69f690146106695780635ebbc3ca146107d6578063643daaea146107eb57005b806344f3c83a116102fe57806344f3c83a146107205780634ada218b146107365780634cdaf0ae146107555780634f91e48c1461077557806357ad67d11461078b57005b80633ab0e29d146106be5780633cc39b7a146106de5780633da56f18146106f45780634089b1701461070a57005b8063243b529a116103b4578063313ce5671161037b578063313ce5671461063557806332ac487f146106495780633478154b1461066957806335e82f3a1461067e578063395093511461069e57005b8063243b529a14610572578063269a6aae146105875780632973ef2d1461059d5780633054f8a314610606578063311a86971461062057005b80630fd99e16116103f85780630fd99e16146104d657806314e91377146104fe57806318160ddd1461051e5780631eb25d131461053d57806323b872dd1461055257005b80630241047b1461042f57806306fdde031461044f57806309218ee71461047a578063095ea7b3146104a657005b3661042d57005b005b34801561043b57600080fd5b5061042d61044a366004613881565b610d1a565b34801561045b57600080fd5b50610464610e23565b604051610471919061389a565b60405180910390f35b34801561048657600080fd5b50601f546104949060ff1681565b60405160ff9091168152602001610471565b3480156104b257600080fd5b506104c66104c1366004613904565b610eb5565b6040519015158152602001610471565b3480156104e257600080fd5b506104eb601881565b60405161ffff9091168152602001610471565b34801561050a57600080fd5b5061042d61051936600461393e565b610ecc565b34801561052a57600080fd5b506016545b604051908152602001610471565b34801561054957600080fd5b5061052f610f18565b34801561055e57600080fd5b506104c661056d36600461395b565b610f34565b34801561057e57600080fd5b5061042d610fcb565b34801561059357600080fd5b5061052f60125481565b3480156105a957600080fd5b50601a546040805160ff6301000000840481168252640100000000840481166020830152600160281b84048116928201929092528183166060820152610100830482166080820152620100009092041660a082015260c001610471565b34801561061257600080fd5b506029546104c69060ff1681565b34801561062c57600080fd5b50610494601881565b34801561064157600080fd5b506009610494565b34801561065557600080fd5b5061052f61066436600461399c565b61100e565b34801561067557600080fd5b506104eb600081565b34801561068a57600080fd5b5061042d61069936600461399c565b611066565b3480156106aa57600080fd5b506104c66106b9366004613904565b6110aa565b3480156106ca57600080fd5b5061042d6106d936600461399c565b6110e1565b3480156106ea57600080fd5b5061052f60245481565b34801561070057600080fd5b5061052f60135481565b34801561071657600080fd5b5061052f601e5481565b34801561072c57600080fd5b5061052f602a5481565b34801561074257600080fd5b50602b546104c690610100900460ff1681565b34801561076157600080fd5b5061042d61077036600461399c565b61113c565b34801561078157600080fd5b5061052f60185481565b34801561079757600080fd5b5061042d6107a63660046139cf565b61119f565b3480156107b757600080fd5b5061052f60205481565b3480156107cd57600080fd5b5060265461052f565b3480156107e257600080fd5b5061042d6112d2565b3480156107f757600080fd5b5061042d610806366004613881565b61139f565b34801561081757600080fd5b5061042d610826366004613881565b6113ea565b34801561083757600080fd5b5061084061143f565b60408051928352602083019190915201610471565b34801561086157600080fd5b5061052f61087036600461399c565b6001600160a01b031660009081526001602052604090205490565b34801561089757600080fd5b5061042d61147c565b3480156108ac57600080fd5b506104c66108bb36600461399c565b6114ff565b3480156108cc57600080fd5b5061042d6108db366004613a43565b61150c565b3480156108ec57600080fd5b50601454610900906001600160a01b031681565b6040516001600160a01b039091168152602001610471565b34801561092457600080fd5b5061052f60175481565b34801561093a57600080fd5b5061042d61156c565b34801561094f57600080fd5b5061052f601c5481565b34801561096557600080fd5b50602b546104c69060ff1681565b34801561097f57600080fd5b506027546104c69060ff1681565b34801561099957600080fd5b506000546001600160a01b0316610900565b3480156109b757600080fd5b506104646115bf565b3480156109cc57600080fd5b5061042d6115ce565b3480156109e157600080fd5b5061042d6109f036600461393e565b61171d565b348015610a0157600080fd5b5061042d610a10366004613a5e565b611769565b348015610a2157600080fd5b506104c6610a30366004613904565b6118eb565b348015610a4157600080fd5b506104c6610a50366004613904565b611967565b348015610a6157600080fd5b50610464611974565b348015610a7657600080fd5b5061042d610a8536600461399c565b611a02565b348015610a9657600080fd5b5061042d610aa536600461393e565b611a5d565b348015610ab657600080fd5b50602354610900906001600160a01b031681565b348015610ad657600080fd5b5061042d611aa9565b348015610aeb57600080fd5b5061052f611ab2565b348015610b0057600080fd5b5061052f611ad2565b348015610b1557600080fd5b5061042d610b2436600461399c565b611b10565b348015610b3557600080fd5b5061042d610b44366004613b23565b611b54565b348015610b5557600080fd5b5061042d610b64366004613881565b611ba6565b348015610b7557600080fd5b50610464611be4565b348015610b8a57600080fd5b5061042d610b99366004613881565b611bf1565b348015610baa57600080fd5b50601554610900906001600160a01b031681565b348015610bca57600080fd5b5061052f610bd9366004613b87565b6001600160a01b03918216600090815260026020908152604080832093909416825291909152205490565b348015610c1057600080fd5b5061042d610c1f366004613881565b611c7d565b348015610c3057600080fd5b5061052f611d02565b348015610c4557600080fd5b5061042d610c5436600461393e565b611d68565b348015610c6557600080fd5b5061052f601d5481565b348015610c7b57600080fd5b5061042d610c8a36600461399c565b611f82565b348015610c9b57600080fd5b5061042d610caa36600461399c565b611fdd565b348015610cbb57600080fd5b5061042d610cca36600461399c565b612021565b348015610cdb57600080fd5b5061052f60285481565b348015610cf157600080fd5b5061042d61211a565b348015610d0657600080fd5b506104c6610d1536600461399c565b612178565b33610d2d6000546001600160a01b031690565b6001600160a01b031614610d5c5760405162461bcd60e51b8152600401610d5390613bc0565b60405180910390fd5b602054811115610d6b57600080fd5b8060206000828254610d7d9190613c0b565b90915550506014546001600160a01b03166108fc6064610d9e846032613c22565b610da89190613c41565b6040518115909202916000818181858888f19350505050158015610dd0573d6000803e3d6000fd5b506015546001600160a01b03166108fc6064610ded846032613c22565b610df79190613c41565b6040518115909202916000818181858888f19350505050158015610e1f573d6000803e3d6000fd5b5050565b6060600f8054610e3290613c63565b80601f0160208091040260200160405190810160405280929190818152602001828054610e5e90613c63565b8015610eab5780601f10610e8057610100808354040283529160200191610eab565b820191906000526020600020905b815481529060010190602001808311610e8e57829003601f168201915b5050505050905090565b6000610ec23384846121a1565b5060015b92915050565b33610edf6000546001600160a01b031690565b6001600160a01b031614610f055760405162461bcd60e51b8152600401610d5390613bc0565b6027805460ff1916911515919091179055565b610f246009600a613d7b565b610f3190620f4240613c22565b81565b6000610f41848484612294565b6001600160a01b038416600090815260026020908152604080832033845290915290205482811015610fac5760405162461bcd60e51b81526020600482015260146024820152735472616e73666572203e20616c6c6f77616e636560601b6044820152606401610d53565b610fc08533610fbb8685613c0b565b6121a1565b506001949350505050565b33610fde6000546001600160a01b031690565b6001600160a01b0316146110045760405162461bcd60e51b8152600401610d5390613bc0565b61100c6124f1565b565b6000611019826114ff565b1561103a57506001600160a01b031660009081526022602052604090205490565b6001600160a01b03821660009081526022602052604090205461105c83612631565b610ec69190613d8a565b336110796000546001600160a01b031690565b6001600160a01b03161461109f5760405162461bcd60e51b8152600401610d5390613bc0565b610e1f600d826126b7565b3360008181526002602090815260408083206001600160a01b03871684529091528120549091610ec2918590610fbb908690613d8a565b336110f46000546001600160a01b031690565b6001600160a01b03161461111a5760405162461bcd60e51b8152600401610d5390613bc0565b601480546001600160a01b0319166001600160a01b0392909216919091179055565b3361114f6000546001600160a01b031690565b6001600160a01b0316146111755760405162461bcd60e51b8152600401610d5390613bc0565b602b80546001600160a01b03909216620100000262010000600160b01b0319909216919091179055565b336111b26000546001600160a01b031690565b6001600160a01b0316146111d85760405162461bcd60e51b8152600401610d5390613bc0565b6000846111e58789613da2565b6111ef9190613da2565b90508060ff166064146112535760405162461bcd60e51b815260206004820152602660248201527f6275726e2b6c69712b6d61726b6574696e67206e6565647320746f20657175616044820152656c203130302560d01b6064820152608401610d53565b50601a805460ff928316620100000262ff0000199484166101000261ffff19978516600160281b029790971665ff000000ffff199885166401000000000264ff00000000199a86166301000000029a909a1664ffff00000019909316929092179890981796909616959095179216919091179190911716919091179055565b336112e56000546001600160a01b031690565b6001600160a01b03161461130b5760405162461bcd60e51b8152600401610d5390613bc0565b602c5442101561132d5760405162461bcd60e51b8152600401610d5390613dc7565b61133961070842613d8a565b602c556014546040516000916001600160a01b03169047908381818185875af1925050503d8060008114611389576040519150601f19603f3d011682016040523d82523d6000602084013e61138e565b606091505b505090508061139c57600080fd5b50565b336113b26000546001600160a01b031690565b6001600160a01b0316146113d85760405162461bcd60e51b8152600401610d5390613bc0565b61139c6113e54283613d8a565b6126cc565b336113fd6000546001600160a01b031690565b6001600160a01b0316146114235760405162461bcd60e51b8152600401610d5390613bc0565b61142f6009600a613d7b565b6114399082613c22565b60195550565b60008061144e6009600a613d7b565b60175461145b9190613c41565b6114676009600a613d7b565b6018546114749190613c41565b915091509091565b3361148f6000546001600160a01b031690565b6001600160a01b0316146114b55760405162461bcd60e51b8152600401610d5390613bc0565b600080546040516001600160a01b03909116907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908390a3600080546001600160a01b0319169055565b6000610ec6600b836126df565b3361151f6000546001600160a01b031690565b6001600160a01b0316146115455760405162461bcd60e51b8152600401610d5390613bc0565b60648160ff16111561155657600080fd5b601f805460ff191660ff92909216919091179055565b3361157f6000546001600160a01b031690565b6001600160a01b0316146115a55760405162461bcd60e51b8152600401610d5390613bc0565b602b805461ff00191661010017905542601155565b905090565b606060108054610e3290613c63565b336115e16000546001600160a01b031690565b6001600160a01b0316146116075760405162461bcd60e51b8152600401610d5390613bc0565b602c544210156116295760405162461bcd60e51b8152600401610d5390613dc7565b602b546040516370a0823160e01b8152306004820152620100009091046001600160a01b03169060009082906370a0823190602401602060405180830381865afa15801561167b573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061169f9190613df1565b60145460405163a9059cbb60e01b81526001600160a01b0391821660048201526024810183905291925083169063a9059cbb906044016020604051808303816000875af11580156116f4573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906117189190613e0a565b505050565b336117306000546001600160a01b031690565b6001600160a01b0316146117565760405162461bcd60e51b8152600401610d5390613bc0565b602b805460ff1916911515919091179055565b3361177c6000546001600160a01b031690565b6001600160a01b0316146117a25760405162461bcd60e51b8152600401610d5390613bc0565b60646016546117b19190613c41565b81106117bc57600080fd5b6117c86009600a613d7b565b6117d29083613c22565b91506117e06009600a613d7b565b6117ea9082613c22565b90506000601860ff166016546118009190613c41565b90506000601861ffff166016546118179190613c41565b90508184101561187d5760405162461bcd60e51b815260206004820152602b60248201527f6e657742616c616e63654c696d6974206e6565647320746f206265206174206c60448201526a19585cdd081d185c99d95d60aa1b6064820152608401610d53565b808310156118de5760405162461bcd60e51b815260206004820152602860248201527f6e657753656c6c4c696d6974206e6565647320746f206265206174206c6561736044820152671d081d185c99d95d60c21b6064820152608401610d53565b5050601791909155601855565b3360009081526002602090815260408083206001600160a01b03861684529091528120548281101561194e5760405162461bcd60e51b815260206004820152600c60248201526b3c3020616c6c6f77616e636560a01b6044820152606401610d53565b61195d3385610fbb8685613c0b565b5060019392505050565b6000610ec2338484612294565b6010805461198190613c63565b80601f01602080910402602001604051908101604052809291908181526020018280546119ad90613c63565b80156119fa5780601f106119cf576101008083540402835291602001916119fa565b820191906000526020600020905b8154815290600101906020018083116119dd57829003601f168201915b505050505081565b33611a156000546001600160a01b031690565b6001600160a01b031614611a3b5760405162461bcd60e51b8152600401610d5390613bc0565b601580546001600160a01b0319166001600160a01b0392909216919091179055565b33611a706000546001600160a01b031690565b6001600160a01b031614611a965760405162461bcd60e51b8152600401610d5390613bc0565b6029805460ff1916911515919091179055565b61100c33612701565b6000602c54421015611acc5742602c546115ba9190613c0b565b50600090565b6000611ae06009600a613d7b565b601654611aef6009600a613d7b565b611afc90620f4240613c22565b611b069190613c0b565b6115ba9190613c41565b33611b236000546001600160a01b031690565b6001600160a01b031614611b495760405162461bcd60e51b8152600401610d5390613bc0565b610e1f600582612185565b33611b676000546001600160a01b031690565b6001600160a01b031614611b8d5760405162461bcd60e51b8152600401610d5390613bc0565b600f611b998382613e6d565b5060106117188282613e6d565b33611bb96000546001600160a01b031690565b6001600160a01b031614611bdf5760405162461bcd60e51b8152600401610d5390613bc0565b602655565b600f805461198190613c63565b33611c046000546001600160a01b031690565b6001600160a01b031614611c2a5760405162461bcd60e51b8152600401610d5390613bc0565b8015611c785760405162461bcd60e51b815260206004820152601760248201527f53656c6c204c6f636b2074696d6520746f6f20686967680000000000000000006044820152606401610d53565b602855565b33611c906000546001600160a01b031690565b6001600160a01b031614611cb65760405162461bcd60e51b8152600401610d5390613bc0565b8015611cfd5760405162461bcd60e51b8152602060048201526016602482015275084eaf24098dec6d640e8d2daca40e8dede40d0d2ced60531b6044820152606401610d53565b602a55565b601654600090815b611d14600b6129b2565b811015611d625760016000611d2a600b846129bc565b6001600160a01b03168152602081019190915260400160002054611d4e9083613c0b565b915080611d5a81613f2d565b915050611d0a565b50919050565b33611d7b6000546001600160a01b031690565b6001600160a01b031614611da15760405162461bcd60e51b8152600401610d5390613bc0565b602c54421015611dc35760405162461bcd60e51b8152600401610d5390613dc7565b611dcf61070842613d8a565b602c55602b546040516370a0823160e01b8152306004820152620100009091046001600160a01b03169060009082906370a0823190602401602060405180830381865afa158015611e24573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611e489190613df1565b601b5460405163095ea7b360e01b81526001600160a01b0391821660048201526024810183905291925083169063095ea7b3906044016020604051808303816000875af1158015611e9d573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611ec19190613e0a565b50601b5460405163af2979eb60e01b815247916001600160a01b03169063af2979eb90611efd9030908690600090819084904290600401613f46565b6020604051808303816000875af1158015611f1c573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611f409190613df1565b506000611f4d8247613c0b565b90508415611f6357611f5e816129c8565b611f7b565b8060206000828254611f759190613d8a565b90915550505b5050505050565b33611f956000546001600160a01b031690565b6001600160a01b031614611fbb5760405162461bcd60e51b8152600401610d5390613bc0565b602380546001600160a01b0319166001600160a01b0392909216919091179055565b33611ff06000546001600160a01b031690565b6001600160a01b0316146120165760405162461bcd60e51b8152600401610d5390613bc0565b610e1f600d82612185565b336120346000546001600160a01b031690565b6001600160a01b03161461205a5760405162461bcd60e51b8152600401610d5390613bc0565b6001600160a01b0381166120bf5760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610d53565b600080546040516001600160a01b03808516939216917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e091a3600080546001600160a01b0319166001600160a01b0392909216919091179055565b3361212d6000546001600160a01b031690565b6001600160a01b0316146121535760405162461bcd60e51b8152600401610d5390613bc0565b6020805460009091556014546001600160a01b03166108fc6064610d9e846032613c22565b6000610ec6600d836126df565b600061219a836001600160a01b038416612a94565b9392505050565b6001600160a01b0383166121eb5760405162461bcd60e51b8152602060048201526011602482015270417070726f76652066726f6d207a65726f60781b6044820152606401610d53565b6001600160a01b0382166122335760405162461bcd60e51b815260206004820152600f60248201526e417070726f766520746f207a65726f60881b6044820152606401610d53565b6001600160a01b0383811660008181526002602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925910160405180910390a3505050565b6001600160a01b0383166122df5760405162461bcd60e51b81526020600482015260126024820152715472616e736665722066726f6d207a65726f60701b6044820152606401610d53565b6001600160a01b0382166123285760405162461bcd60e51b815260206004820152601060248201526f5472616e7366657220746f207a65726f60801b6044820152606401610d53565b60006123356005856126df565b8061234657506123466005846126df565b905060006001600160a01b03851630148061236957506001600160a01b03841630145b601b54601a549192506001600160a01b0390811691600091888116600160301b909204161480156123ab5750816001600160a01b0316866001600160a01b0316145b806123e65750601a546001600160a01b03878116600160301b909204161480156123e65750816001600160a01b0316876001600160a01b0316145b601a549091506000906001600160a01b03898116600160301b9092041614806124205750826001600160a01b0316886001600160a01b0316145b601a549091506000906001600160a01b03898116600160301b90920416148061245a5750836001600160a01b0316886001600160a01b0316145b905084806124655750825b8061246d5750855b156124825761247d898989612ae3565b6124e6565b602b54610100900460ff166124d95760405162461bcd60e51b815260206004820152601760248201527f74726164696e67206e6f742079657420656e61626c65640000000000000000006044820152606401610d53565b6124e68989898585612bae565b505050505050505050565b6025805460ff191660019081179091553060009081526020919091526040812054601a5490919061253790600160281b810460ff90811691640100000000900416613da2565b60ff1690506000602654905080831080612553575061ffff8216155b1561256057505050612625565b601a5460009061ffff84169061258190640100000000900460ff1684613c22565b61258b9190613c41565b905060006125998284613c0b565b905060006125a8600284613c41565b905060006125b68285613c0b565b905060006125c48483613d8a565b9050476125d082613346565b60006125dc8247613c0b565b90506000836125eb8684613c22565b6125f59190613c41565b9050612601868261349f565b600061260d8447613c0b565b9050612618816129c8565b5050505050505050505050505b6025805460ff19169055565b6001600160a01b038116600090815260016020526040812054601c54829161265891613c22565b6001600160a01b0384166000908152602160205260409020549091508110156126845750600092915050565b6001600160a01b038316600090815260216020526040902054600160401b906126ad9083613c0b565b61219a9190613c41565b600061219a836001600160a01b03841661354e565b602c5481116126da57600080fd5b602c55565b6001600160a01b0381166000908152600183016020526040812054151561219a565b601b54600160a01b900460ff161561271857600080fd5b601b805460ff60a01b1916600160a01b1790556000612736826114ff565b1561275e57506001600160a01b038116600090815260226020526040812080549190556127de565b600061276983612631565b6001600160a01b038416600090815260016020526040902054601c5491925061279191613c22565b6001600160a01b0384166000908152602160209081526040808320939093556022905220546127c1908290613d8a565b6001600160a01b0384166000908152602260205260408120559150505b806000036127f7575050601b805460ff60a01b19169055565b80601e60008282546128099190613d8a565b90915550506040805160028082526060820183526000926020830190803683375050601b54604080516315ab88c960e31b815290519394506001600160a01b039091169263ad5c4648925060048083019260209291908290030181865afa158015612878573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061289c9190613f81565b816000815181106128af576128af613f9e565b6001600160a01b0392831660209182029290920101526023548251911690829060019081106128e0576128e0613f9e565b6001600160a01b039283166020918202929092010152601b5460405163b6f9de9560e01b815291169063b6f9de9590849061292690600090869089904290600401613ff8565b6000604051808303818588803b15801561293f57600080fd5b505af1158015612953573d6000803e3d6000fd5b5050604080518681526001600160a01b03881660208201527f80a489adad6e8e00b344a3e9042e6aff0ae286ce1376918078a67bbce8b905b394500191506129989050565b60405180910390a15050601b805460ff60a01b1916905550565b6000610ec6825490565b600061219a838361363b565b601f546000906064906129de9060ff1684613c22565b6129e89190613c41565b905060006129f68284613c0b565b90508160206000828254612a0a9190613d8a565b909155505080156117185780601d6000828254612a279190613d8a565b9091555060009050612a37611d02565b905080600003612a5e578160206000828254612a539190613d8a565b90915550612a8e9050565b80612a6d600160401b84613c22565b612a779190613c41565b601c6000828254612a889190613d8a565b90915550505b50505050565b6000818152600183016020526040812054612adb57508154600181810184556000848152602080822090930184905584548482528286019093526040902091909155610ec6565b506000610ec6565b6001600160a01b03831660009081526001602052604090205481811015612b475760405162461bcd60e51b81526020600482015260186024820152775472616e7366657220657863656564732062616c616e636560401b6044820152606401610d53565b612b5184836136c1565b612b5b8383613782565b826001600160a01b0316846001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef84604051612ba091815260200190565b60405180910390a350505050565b6001600160a01b0380851660009081526001602052604080822054928816825290205484811015612c1c5760405162461bcd60e51b81526020600482015260186024820152775472616e7366657220657863656564732062616c616e636560401b6044820152606401610d53565b60008315612dcf57612c2f6007896126df565b612cc4576001600160a01b03881660009081526003602052604090205442101580612c5c575060275460ff165b612c9d5760405162461bcd60e51b815260206004820152601260248201527153656c6c657220696e2073656c6c4c6f636b60701b6044820152606401610d53565b602854612caa9042613d8a565b6001600160a01b0389166000908152600360205260409020555b601854861115612d085760405162461bcd60e51b815260206004820152600f60248201526e223ab6b810383937ba32b1ba34b7b760891b6044820152606401610d53565b612d13600d896126df565b15612d575760405162461bcd60e51b81526020600482015260146024820152734164647265737320626c61636b6c69737465642160601b6044820152606401610d53565b601254601154612d679190613d8a565b4211158015612d7857506013546001145b15612dbe57612d88600d89612185565b506040516001600160a01b038916907f8c21268f4379683ad2b81c32b4357f44a17e83e73d741ba6e8c23e085e57135190600090a25b50601a54610100900460ff166131e3565b8415612fe057612de06009886126df565b612e73576001600160a01b03871660009081526004602052604090205442101580612e0d575060295460ff165b612e4c5760405162461bcd60e51b815260206004820152601060248201526f427579657220696e206275794c6f636b60801b6044820152606401610d53565b602a54612e599042613d8a565b6001600160a01b0388166000908152600460205260409020555b601754612e808785613d8a565b1115612ec15760405162461bcd60e51b815260206004820152601060248201526f3bb430b63290383937ba32b1ba34b7b760811b6044820152606401610d53565b601954861115612f1e5760405162461bcd60e51b815260206004820152602260248201527f547820616d6f756e7420657863656564696e67206d61782062757920616d6f756044820152611b9d60f21b6064820152608401610d53565b612f29600d886126df565b15612f6d5760405162461bcd60e51b81526020600482015260146024820152734164647265737320626c61636b6c69737465642160601b6044820152606401610d53565b601254601154612f7d9190613d8a565b4211158015612f8e57506013546001145b15612fd457612f9e600d88612185565b506040516001600160a01b038816907f8c21268f4379683ad2b81c32b4357f44a17e83e73d741ba6e8c23e085e57135190600090a25b50601a5460ff166131e3565b612fec6009600a613d7b565b8611612ffb57612ffb88612701565b6017546130088785613d8a565b11156130495760405162461bcd60e51b815260206004820152601060248201526f3bb430b63290383937ba32b1ba34b7b760811b6044820152606401610d53565b6130546007896126df565b6130be576001600160a01b03881660009081526003602052604090205442101580613081575060275460ff165b6130be5760405162461bcd60e51b815260206004820152600e60248201526d53656e64657220696e204c6f636b60901b6044820152606401610d53565b6130c9600d896126df565b156131165760405162461bcd60e51b815260206004820152601b60248201527f53656e646572206164647265737320626c61636b6c69737465642100000000006044820152606401610d53565b613121600d886126df565b1561316e5760405162461bcd60e51b815260206004820152601e60248201527f526563697069656e74206164647265737320626c61636b6c69737465642100006044820152606401610d53565b60125460115461317e9190613d8a565b421115801561318f57506013546001145b156131d55761319f600d89612185565b506040516001600160a01b038916907f8c21268f4379683ad2b81c32b4357f44a17e83e73d741ba6e8c23e085e57135190600090a25b50601a5462010000900460ff165b601a546001600160a01b03898116600160301b909204161480159061320b5750602b5460ff16155b801561321a575060255460ff16155b80156132235750835b15613230576132306124f1565b600061324c8783601a60039054906101000a900460ff1661384d565b601a54909150600090613280908990859061327b9060ff6401000000008204811691600160281b900416613da2565b61384d565b9050600061328e8284613d8a565b613298908a613c0b565b90506132a48b8a6136c1565b30600090815260016020526040812080548492906132c3908490613d8a565b9250508190555082601660008282546132dc9190613c0b565b909155506132ec90508a82613782565b896001600160a01b03168b6001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef8360405161333191815260200190565b60405180910390a35050505050505050505050565b601b5461335e9030906001600160a01b0316836121a1565b604080516002808252606082018352600092602083019080368337019050509050308160008151811061339357613393613f9e565b6001600160a01b03928316602091820292909201810191909152601b54604080516315ab88c960e31b81529051919093169263ad5c46489260048083019391928290030181865afa1580156133ec573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906134109190613f81565b8160018151811061342357613423613f9e565b6001600160a01b039283166020918202929092010152601b5460405163791ac94760e01b815291169063791ac9479061346990859060009086903090429060040161402d565b600060405180830381600087803b15801561348357600080fd5b505af1158015613497573d6000803e3d6000fd5b505050505050565b80602460008282546134b19190613d8a565b9091555050601b546134ce9030906001600160a01b0316846121a1565b601b5460405163f305d71960e01b81526001600160a01b039091169063f305d71990839061350b9030908790600090819084904290600401613f46565b60606040518083038185885af1158015613529573d6000803e3d6000fd5b50505050506040513d601f19601f82011682018060405250810190611f7b9190614069565b60008181526001830160205260408120548015613631576000613572600183613c0b565b855490915060009061358690600190613c0b565b9050600086600001828154811061359f5761359f613f9e565b90600052602060002001549050808760000184815481106135c2576135c2613f9e565b6000918252602080832090910192909255828152600189019091526040902084905586548790806135f5576135f5614097565b60019003818190600052602060002001600090559055866001016000878152602001908152602001600020600090556001945050505050610ec6565b6000915050610ec6565b815460009082106136995760405162461bcd60e51b815260206004820152602260248201527f456e756d657261626c655365743a20696e646578206f7574206f6620626f756e604482015261647360f01b6064820152608401610d53565b8260000182815481106136ae576136ae613f9e565b9060005260206000200154905092915050565b6001600160a01b0382166000908152600160205260408120546136e5908390613c0b565b90506136f0836114ff565b15613715576001600160a01b0390921660009081526001602052604090209190915550565b600061372084612631565b6001600160a01b0385166000908152600160205260409020839055601c5490915061374c908390613c22565b6001600160a01b038516600090815260216020908152604080832093909355602290529081208054839290612a88908490613d8a565b6001600160a01b0382166000908152600160205260408120546137a6908390613d8a565b90506137b1836114ff565b156137d6576001600160a01b0390921660009081526001602052604090209190915550565b60006137e184612631565b905081601c546137f19190613c22565b6001600160a01b038516600090815260216020908152604080832093909355602290529081208054839290613827908490613d8a565b9091555050506001600160a01b0390921660009081526001602052604090209190915550565b60006127108260ff168460ff16866138659190613c22565b61386f9190613c22565b6138799190613c41565b949350505050565b60006020828403121561389357600080fd5b5035919050565b600060208083528351808285015260005b818110156138c7578581018301518582016040015282016138ab565b818111156138d9576000604083870101525b50601f01601f1916929092016040019392505050565b6001600160a01b038116811461139c57600080fd5b6000806040838503121561391757600080fd5b8235613922816138ef565b946020939093013593505050565b801515811461139c57600080fd5b60006020828403121561395057600080fd5b813561219a81613930565b60008060006060848603121561397057600080fd5b833561397b816138ef565b9250602084013561398b816138ef565b929592945050506040919091013590565b6000602082840312156139ae57600080fd5b813561219a816138ef565b803560ff811681146139ca57600080fd5b919050565b60008060008060008060c087890312156139e857600080fd5b6139f1876139b9565b95506139ff602088016139b9565b9450613a0d604088016139b9565b9350613a1b606088016139b9565b9250613a29608088016139b9565b9150613a3760a088016139b9565b90509295509295509295565b600060208284031215613a5557600080fd5b61219a826139b9565b60008060408385031215613a7157600080fd5b50508035926020909101359150565b634e487b7160e01b600052604160045260246000fd5b600082601f830112613aa757600080fd5b813567ffffffffffffffff80821115613ac257613ac2613a80565b604051601f8301601f19908116603f01168101908282118183101715613aea57613aea613a80565b81604052838152866020858801011115613b0357600080fd5b836020870160208301376000602085830101528094505050505092915050565b60008060408385031215613b3657600080fd5b823567ffffffffffffffff80821115613b4e57600080fd5b613b5a86838701613a96565b93506020850135915080821115613b7057600080fd5b50613b7d85828601613a96565b9150509250929050565b60008060408385031215613b9a57600080fd5b8235613ba5816138ef565b91506020830135613bb5816138ef565b809150509250929050565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b634e487b7160e01b600052601160045260246000fd5b600082821015613c1d57613c1d613bf5565b500390565b6000816000190483118215151615613c3c57613c3c613bf5565b500290565b600082613c5e57634e487b7160e01b600052601260045260246000fd5b500490565b600181811c90821680613c7757607f821691505b602082108103611d6257634e487b7160e01b600052602260045260246000fd5b600181815b80851115613cd2578160001904821115613cb857613cb8613bf5565b80851615613cc557918102915b93841c9390800290613c9c565b509250929050565b600082613ce957506001610ec6565b81613cf657506000610ec6565b8160018114613d0c5760028114613d1657613d32565b6001915050610ec6565b60ff841115613d2757613d27613bf5565b50506001821b610ec6565b5060208310610133831016604e8410600b8410161715613d55575081810a610ec6565b613d5f8383613c97565b8060001904821115613d7357613d73613bf5565b029392505050565b600061219a60ff841683613cda565b60008219821115613d9d57613d9d613bf5565b500190565b600060ff821660ff84168060ff03821115613dbf57613dbf613bf5565b019392505050565b60208082526010908201526f139bdd081e595d081d5b9b1bd8dad95960821b604082015260600190565b600060208284031215613e0357600080fd5b5051919050565b600060208284031215613e1c57600080fd5b815161219a81613930565b601f82111561171857600081815260208120601f850160051c81016020861015613e4e5750805b601f850160051c820191505b8181101561349757828155600101613e5a565b815167ffffffffffffffff811115613e8757613e87613a80565b613e9b81613e958454613c63565b84613e27565b602080601f831160018114613ed05760008415613eb85750858301515b600019600386901b1c1916600185901b178555613497565b600085815260208120601f198616915b82811015613eff57888601518255948401946001909101908401613ee0565b5085821015613f1d5787850151600019600388901b60f8161c191681555b5050505050600190811b01905550565b600060018201613f3f57613f3f613bf5565b5060010190565b6001600160a01b039687168152602081019590955260408501939093526060840191909152909216608082015260a081019190915260c00190565b600060208284031215613f9357600080fd5b815161219a816138ef565b634e487b7160e01b600052603260045260246000fd5b600081518084526020808501945080840160005b83811015613fed5781516001600160a01b031687529582019590820190600101613fc8565b509495945050505050565b8481526080602082015260006140116080830186613fb4565b6001600160a01b03949094166040830152506060015292915050565b85815284602082015260a06040820152600061404c60a0830186613fb4565b6001600160a01b0394909416606083015250608001529392505050565b60008060006060848603121561407e57600080fd5b8351925060208401519150604084015190509250925092565b634e487b7160e01b600052603160045260246000fdfea264697066735822122022badab2831e4d438794881c2981cb222ee6783abd1a502735c73de0d9b3255064736f6c634300080f0033
Deployed Bytecode Sourcemap
27658:36818:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;53443:268;;;;;;;;;;-1:-1:-1;53443:268:0;;;;;:::i;:::-;;:::i;62134:96::-;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;41045:31;;;;;;;;;;-1:-1:-1;41045:31:0;;;;;;;;;;;973:4:1;961:17;;;943:36;;931:2;916:18;41045:31:0;801:184:1;63015:161:0;;;;;;;;;;-1:-1:-1;63015:161:0;;;;;:::i;:::-;;:::i;:::-;;;1611:14:1;;1604:22;1586:41;;1574:2;1559:18;63015:161:0;1446:187:1;29185:42:0;;;;;;;;;;;;29225:2;29185:42;;;;;1812:6:1;1800:19;;;1782:38;;1770:2;1755:18;29185:42:0;1638:188:1;54651:104:0;;;;;;;;;;-1:-1:-1;54651:104:0;;;;;:::i;:::-;;:::i;62440:108::-;;;;;;;;;;-1:-1:-1;62522:18:0;;62440:108;;;2346:25:1;;;2334:2;2319:18;62440:108:0;2200:177:1;28504:62:0;;;;;;;;;;;;;:::i;63489:392::-;;;;;;;;;;-1:-1:-1;63489:392:0;;;;;:::i;:::-;;:::i;56708:81::-;;;;;;;;;;;;;:::i;28735:31::-;;;;;;;;;;;;;;;;50747:244;;;;;;;;;;-1:-1:-1;50918:8:0;;50747:244;;;50918:8;;;;;;3130:25:1;;50927:13:0;;;;;3186:2:1;3171:18;;3164:34;-1:-1:-1;;;50941:11:0;;;;3214:18:1;;;3207:34;;;;50953:7:0;;;3272:2:1;3257:18;;3250:34;50918:8:0;50961;;;;3315:3:1;3300:19;;3293:35;50970:12:0;;;;;3359:3:1;3344:19;;3337:35;3117:3;3102:19;50747:244:0;2843:535:1;53090:27:0;;;;;;;;;;-1:-1:-1;53090:27:0;;;;;;;;29071:44;;;;;;;;;;;;29113:2;29071:44;;62338:94;;;;;;;;;;-1:-1:-1;28496:1:0;62338:94;;52709:191;;;;;;;;;;-1:-1:-1;52709:191:0;;;;;:::i;:::-;;:::i;29370:49::-;;;;;;;;;;;;29410:9;29370:49;;58089:143;;;;;;;;;;-1:-1:-1;58089:143:0;;;;;:::i;:::-;;:::i;63916:205::-;;;;;;;;;;-1:-1:-1;63916:205:0;;;;;:::i;:::-;;:::i;54040:119::-;;;;;;;;;;-1:-1:-1;54040:119:0;;;;;:::i;:::-;;:::i;46954:25::-;;;;;;;;;;;;;;;;28916:38;;;;;;;;;;;;;;;;41001:27;;;;;;;;;;;;;;;;53124:26;;;;;;;;;;;;;;;;58360;;;;;;;;;;-1:-1:-1;58360:26:0;;;;;;;;;;;58669:146;;;;;;;;;;-1:-1:-1;58669:146:0;;;;;:::i;:::-;;:::i;30304:46::-;;;;;;;;;;;;;;;;55929:492;;;;;;;;;;-1:-1:-1;55929:492:0;;;;;:::i;:::-;;:::i;41128:31::-;;;;;;;;;;;;;;;;51477:110;;;;;;;;;;-1:-1:-1;51560:19:0;;51477:110;;61296:310;;;;;;;;;;;;;:::i;59022:153::-;;;;;;;;;;-1:-1:-1;59022:153:0;;;;;:::i;:::-;;:::i;53918:110::-;;;;;;;;;;-1:-1:-1;53918:110:0;;;;;:::i;:::-;;:::i;50590:149::-;;;;;;;;;;;;;:::i;:::-;;;;4510:25:1;;;4566:2;4551:18;;4544:34;;;;4483:18;50590:149:0;4336:248:1;62556:121:0;;;;;;;;;;-1:-1:-1;62556:121:0;;;;;:::i;:::-;-1:-1:-1;;;;;62651:18:0;62624:7;62651:18;;;:9;:18;;;;;;;62556:121;9519:140;;;;;;;;;;;;;:::i;41612:132::-;;;;;;;;;;-1:-1:-1;41612:132:0;;;;;:::i;:::-;;:::i;56498:142::-;;;;;;;;;;-1:-1:-1;56498:142:0;;;;;:::i;:::-;;:::i;29777:77::-;;;;;;;;;;-1:-1:-1;29777:77:0;;;;-1:-1:-1;;;;;29777:77:0;;;;;;-1:-1:-1;;;;;4940:32:1;;;4922:51;;4910:2;4895:18;29777:77:0;4776:203:1;30248:49:0;;;;;;;;;;;;;;;;58474:127;;;;;;;;;;;;;:::i;40787:29::-;;;;;;;;;;;;;;;;53157:28;;;;;;;;;;-1:-1:-1;53157:28:0;;;;;;;;53021;;;;;;;;;;-1:-1:-1;53021:28:0;;;;;;;;62032:94;;;;;;;;;;-1:-1:-1;62084:7:0;8943:6;-1:-1:-1;;;;;8943:6:0;62032:94;;62236:96;;;;;;;;;;;;;:::i;59476:465::-;;;;;;;;;;;;;:::i;53796:110::-;;;;;;;;;;-1:-1:-1;53796:110:0;;;;;:::i;:::-;;:::i;56898:895::-;;;;;;;;;;-1:-1:-1;56898:895:0;;;;;:::i;:::-;;:::i;64129:342::-;;;;;;;;;;-1:-1:-1;64129:342:0;;;;;:::i;:::-;;:::i;62685:167::-;;;;;;;;;;-1:-1:-1;62685:167:0;;;;;:::i;:::-;;:::i;28423:31::-;;;;;;;;;;;;;:::i;54167:115::-;;;;;;;;;;-1:-1:-1;54167:115:0;;;;;:::i;:::-;;:::i;54822:102::-;;;;;;;;;;-1:-1:-1;54822:102:0;;;;;:::i;:::-;;:::i;46694:74::-;;;;;;;;;;-1:-1:-1;46694:74:0;;;;-1:-1:-1;;;;;46694:74:0;;;52637:64;;;;;;;;;;;;;:::i;50225:220::-;;;;;;;;;;;;;:::i;50453:129::-;;;;;;;;;;;;;:::i;55787:112::-;;;;;;;;;;-1:-1:-1;55787:112:0;;;;;:::i;:::-;;:::i;54426:157::-;;;;;;;;;;-1:-1:-1;54426:157:0;;;;;:::i;:::-;;:::i;55594:125::-;;;;;;;;;;-1:-1:-1;55594:125:0;;;;;:::i;:::-;;:::i;28385:31::-;;;;;;;;;;;;;:::i;54997:202::-;;;;;;;;;;-1:-1:-1;54997:202:0;;;;;:::i;:::-;;:::i;29861:76::-;;;;;;;;;;-1:-1:-1;29861:76:0;;;;-1:-1:-1;;;;;29861:76:0;;;62860:147;;;;;;;;;;-1:-1:-1;62860:147:0;;;;;:::i;:::-;-1:-1:-1;;;;;62971:19:0;;;62944:7;62971:19;;;:11;:19;;;;;;;;:28;;;;;;;;;;;;;62860:147;55275:195;;;;;;;;;;-1:-1:-1;55275:195:0;;;;;:::i;:::-;;:::i;41985:411::-;;;;;;;;;;;;;:::i;59999:1211::-;;;;;;;;;;-1:-1:-1;59999:1211:0;;;;;:::i;:::-;;:::i;40898:33::-;;;;;;;;;;;;;;;;54290:128;;;;;;;;;;-1:-1:-1;54290:128:0;;;;;:::i;:::-;;:::i;57873:135::-;;;;;;;;;;-1:-1:-1;57873:135:0;;;;;:::i;:::-;;:::i;9814:236::-;;;;;;;;;;-1:-1:-1;9814:236:0;;;;;:::i;:::-;;:::i;53056:27::-;;;;;;;;;;;;;;;;53195:241;;;;;;;;;;;;;:::i;41791:118::-;;;;;;;;;;-1:-1:-1;41791:118:0;;;;;:::i;:::-;;:::i;53443:268::-;9101:10;9090:7;8916;8943:6;-1:-1:-1;;;;;8943:6:0;;8878:79;9090:7;-1:-1:-1;;;;;9090:21:0;;9082:66;;;;-1:-1:-1;;;9082:66:0;;;;;;;:::i;:::-;;;;;;;;;53536:16:::1;;53528:6;:24;;53520:33;;;::::0;::::1;;53582:6;53564:16;;:24;;;;;;;:::i;:::-;::::0;;;-1:-1:-1;;53607:10:0::1;::::0;-1:-1:-1;;;;;53607:10:0::1;53599:47;53642:3;53629:9;:6:::0;53636:2:::1;53629:9;:::i;:::-;53628:17;;;;:::i;:::-;53599:47;::::0;;::::1;::::0;;::::1;::::0;::::1;::::0;;;;;;::::1;;;;;;;;;;;;;::::0;::::1;;;;;-1:-1:-1::0;53665:9:0::1;::::0;-1:-1:-1;;;;;53665:9:0::1;53657:46;53699:3;53686:9;:6:::0;53693:2:::1;53686:9;:::i;:::-;53685:17;;;;:::i;:::-;53657:46;::::0;;::::1;::::0;;::::1;::::0;::::1;::::0;;;;;;::::1;;;;;;;;;;;;;::::0;::::1;;;;;;53443:268:::0;:::o;62134:96::-;62182:13;62216:5;62209:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;62134:96;:::o;63015:161::-;63092:4;63109:37;63118:10;63130:7;63139:6;63109:8;:37::i;:::-;-1:-1:-1;63164:4:0;63015:161;;;;;:::o;54651:104::-;9101:10;9090:7;8916;8943:6;-1:-1:-1;;;;;8943:6:0;;8878:79;9090:7;-1:-1:-1;;;;;9090:21:0;;9082:66;;;;-1:-1:-1;;;9082:66:0;;;;;;;:::i;:::-;54722:16:::1;:25:::0;;-1:-1:-1;;54722:25:0::1;::::0;::::1;;::::0;;;::::1;::::0;;54651:104::o;28504:62::-;28553:13;28496:1;28553:2;:13;:::i;:::-;28543:23;;:7;:23;:::i;:::-;28504:62;:::o;63489:392::-;63589:4;63606:36;63616:6;63624:9;63635:6;63606:9;:36::i;:::-;-1:-1:-1;;;;;63682:19:0;;63655:24;63682:19;;;:11;:19;;;;;;;;63702:10;63682:31;;;;;;;;63732:26;;;;63724:59;;;;-1:-1:-1;;;63724:59:0;;10022:2:1;63724:59:0;;;10004:21:1;10061:2;10041:18;;;10034:30;-1:-1:-1;;;10080:18:1;;;10073:50;10140:18;;63724:59:0;9820:344:1;63724:59:0;63796:55;63805:6;63813:10;63825:25;63844:6;63825:16;:25;:::i;:::-;63796:8;:55::i;:::-;-1:-1:-1;63869:4:0;;63489:392;-1:-1:-1;;;;63489:392:0:o;56708:81::-;9101:10;9090:7;8916;8943:6;-1:-1:-1;;;;;8943:6:0;;8878:79;9090:7;-1:-1:-1;;;;;9090:21:0;;9082:66;;;;-1:-1:-1;;;9082:66:0;;;;;;;:::i;:::-;56761:20:::1;:18;:20::i;:::-;56708:81::o:0;52709:191::-;52766:7;52788:27;52810:4;52788:21;:27::i;:::-;52785:53;;;-1:-1:-1;;;;;;52824:14:0;;;;;:8;:14;;;;;;;52709:191::o;52785:53::-;-1:-1:-1;;;;;52878:14:0;;;;;;:8;:14;;;;;;52856:21;52887:4;52856:15;:21::i;:::-;:36;;;;:::i;58089:143::-;9101:10;9090:7;8916;8943:6;-1:-1:-1;;;;;8943:6:0;;8878:79;9090:7;-1:-1:-1;;;;;9090:21:0;;9082:66;;;;-1:-1:-1;;;9082:66:0;;;;;;;:::i;:::-;58183:41:::1;:14;58205:18:::0;58183:21:::1;:41::i;63916:205::-:0;64024:10;63998:4;64045:23;;;:11;:23;;;;;;;;-1:-1:-1;;;;;64045:32:0;;;;;;;;;;63998:4;;64015:76;;64036:7;;64045:45;;64080:10;;64045:45;:::i;54040:119::-;9101:10;9090:7;8916;8943:6;-1:-1:-1;;;;;8943:6:0;;8878:79;9090:7;-1:-1:-1;;;;;9090:21:0;;9082:66;;;;-1:-1:-1;;;9082:66:0;;;;;;;:::i;:::-;54118:10:::1;:33:::0;;-1:-1:-1;;;;;;54118:33:0::1;-1:-1:-1::0;;;;;54118:33:0;;;::::1;::::0;;;::::1;::::0;;54040:119::o;58669:146::-;9101:10;9090:7;8916;8943:6;-1:-1:-1;;;;;8943:6:0;;8878:79;9090:7;-1:-1:-1;;;;;9090:21:0;;9082:66;;;;-1:-1:-1;;;9082:66:0;;;;;;;:::i;:::-;58763:22:::1;:44:::0;;-1:-1:-1;;;;;58763:44:0;;::::1;::::0;::::1;-1:-1:-1::0;;;;;;58763:44:0;;::::1;::::0;;;::::1;::::0;;58669:146::o;55929:492::-;9101:10;9090:7;8916;8943:6;-1:-1:-1;;;;;8943:6:0;;8878:79;9090:7;-1:-1:-1;;;;;9090:21:0;;9082:66;;;;-1:-1:-1;;;9082:66:0;;;;;;;:::i;:::-;56084:14:::1;56124:12:::0;56099:24:::1;56109:14:::0;56099:9;:24:::1;:::i;:::-;:37;;;;:::i;:::-;56084:52;;56155:8;:13;;56165:3;56155:13;56147:64;;;::::0;-1:-1:-1;;;56147:64:0;;10713:2:1;56147:64:0::1;::::0;::::1;10695:21:1::0;10752:2;10732:18;;;10725:30;10791:34;10771:18;;;10764:62;-1:-1:-1;;;10842:18:1;;;10835:36;10888:19;;56147:64:0::1;10511:402:1::0;56147:64:0::1;-1:-1:-1::0;56224:8:0::1;:18:::0;;::::1;56389:24:::0;;::::1;::::0;::::1;-1:-1:-1::0;;56362:16:0;;::::1;56224:18;56362:16;-1:-1:-1::0;;56292:24:0;;::::1;-1:-1:-1::0;;;56292:24:0::1;56362:16:::0;;;;-1:-1:-1;;56253:28:0;;::::1;::::0;::::1;-1:-1:-1::0;;56224:18:0;;::::1;::::0;::::1;56253:28:::0;;;;-1:-1:-1;;56253:28:0;;;;;;;;;;::::1;56362:16:::0;;;;;;;;56337:14;::::1;56362:16:::0;;;;;;;::::1;56389:24;::::0;;;::::1;::::0;;55929:492::o;61296:310::-;9101:10;9090:7;8916;8943:6;-1:-1:-1;;;;;8943:6:0;;8878:79;9090:7;-1:-1:-1;;;;;9090:21:0;;9082:66;;;;-1:-1:-1;;;9082:66:0;;;;;;;:::i;:::-;61385:20:::1;;61366:15;:39;;61358:68;;;;-1:-1:-1::0;;;61358:68:0::1;;;;;;;:::i;:::-;61458:40;29748:4;61458:15;:40;:::i;:::-;61437:20;:61:::0;61523:10:::1;::::0;:51:::1;::::0;61510:9:::1;::::0;-1:-1:-1;;;;;61523:10:0::1;::::0;61547:21:::1;::::0;61510:9;61523:51;61510:9;61523:51;61547:21;61523:10;:51:::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;61509:65;;;61593:4;61585:13;;;::::0;::::1;;61347:259;61296:310::o:0;59022:153::-;9101:10;9090:7;8916;8943:6;-1:-1:-1;;;;;8943:6:0;;8878:79;9090:7;-1:-1:-1;;;;;9090:21:0;;9082:66;;;;-1:-1:-1;;;9082:66:0;;;;;;;:::i;:::-;59110:57:::1;59132:34;59151:15;59132:18:::0;:34:::1;:::i;:::-;59110:21;:57::i;53918:110::-:0;9101:10;9090:7;8916;8943:6;-1:-1:-1;;;;;8943:6:0;;8878:79;9090:7;-1:-1:-1;;;;;9090:21:0;;9082:66;;;;-1:-1:-1;;;9082:66:0;;;;;;;:::i;:::-;54007:13:::1;28496:1;54007:2;:13;:::i;:::-;53995:25;::::0;:9;:25:::1;:::i;:::-;53988:6;:32:::0;-1:-1:-1;53918:110:0:o;50590:149::-;50631:15;;50692:13;28496:1;50692:2;:13;:::i;:::-;50679:12;;:26;;;;:::i;:::-;50717:13;28496:1;50717:2;:13;:::i;:::-;50707:9;;:23;;;;:::i;:::-;50672:59;;;;50590:149;;:::o;9519:140::-;9101:10;9090:7;8916;8943:6;-1:-1:-1;;;;;8943:6:0;;8878:79;9090:7;-1:-1:-1;;;;;9090:21:0;;9082:66;;;;-1:-1:-1;;;9082:66:0;;;;;;;:::i;:::-;9618:1:::1;9602:6:::0;;9581:40:::1;::::0;-1:-1:-1;;;;;9602:6:0;;::::1;::::0;9581:40:::1;::::0;9618:1;;9581:40:::1;9649:1;9632:19:::0;;-1:-1:-1;;;;;;9632:19:0::1;::::0;;9519:140::o;41612:132::-;41678:4;41701:35;:20;41731:4;41701:29;:35::i;56498:142::-;9101:10;9090:7;8916;8943:6;-1:-1:-1;;;;;8943:6:0;;8878:79;9090:7;-1:-1:-1;;;;;9090:21:0;;9082:66;;;;-1:-1:-1;;;9082:66:0;;;;;;;:::i;:::-;56593:3:::1;56583:8;:13;;;;56575:22;;;::::0;::::1;;56609:14;:23:::0;;-1:-1:-1;;56609:23:0::1;;::::0;;;::::1;::::0;;;::::1;::::0;;56498:142::o;58474:127::-;9101:10;9090:7;8916;8943:6;-1:-1:-1;;;;;8943:6:0;;8878:79;9090:7;-1:-1:-1;;;;;9090:21:0;;9082:66;;;;-1:-1:-1;;;9082:66:0;;;;;;;:::i;:::-;58531:14:::1;:19:::0;;-1:-1:-1;;58531:19:0::1;;;::::0;;58578:15:::1;58561:16;:32:::0;58474:127::o;62111:7::-;62104:14;;62032:94;:::o;62236:96::-;62286:13;62316:7;62309:14;;;;;:::i;59476:465::-;9101:10;9090:7;8916;8943:6;-1:-1:-1;;;;;8943:6:0;;8878:79;9090:7;-1:-1:-1;;;;;9090:21:0;;9082:66;;;;-1:-1:-1;;;9082:66:0;;;;;;;:::i;:::-;59604:20:::1;;59585:15;:39;;59577:68;;;;-1:-1:-1::0;;;59577:68:0::1;;;;;;;:::i;:::-;59715:22;::::0;59766:39:::1;::::0;-1:-1:-1;;;59766:39:0;;59799:4:::1;59766:39;::::0;::::1;4922:51:1::0;59715:22:0;;;::::1;-1:-1:-1::0;;;;;59715:22:0::1;::::0;59666:30:::1;::::0;59715:22;;59766:24:::1;::::0;4895:18:1;;59766:39:0::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;59904:10;::::0;59880:43:::1;::::0;-1:-1:-1;;;59880:43:0;;-1:-1:-1;;;;;59904:10:0;;::::1;59880:43;::::0;::::1;11836:51:1::0;11903:18;;;11896:34;;;59749:56:0;;-1:-1:-1;59880:23:0;::::1;::::0;::::1;::::0;11809:18:1;;59880:43:0::1;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;59508:433;;59476:465::o:0;53796:110::-;9101:10;9090:7;8916;8943:6;-1:-1:-1;;;;;8943:6:0;;8878:79;9090:7;-1:-1:-1;;;;;9090:21:0;;9082:66;;;;-1:-1:-1;;;9082:66:0;;;;;;;:::i;:::-;53875:16:::1;:23:::0;;-1:-1:-1;;53875:23:0::1;::::0;::::1;;::::0;;;::::1;::::0;;53796:110::o;56898:895::-;9101:10;9090:7;8916;8943:6;-1:-1:-1;;;;;8943:6:0;;8878:79;9090:7;-1:-1:-1;;;;;9090:21:0;;9082:66;;;;-1:-1:-1;;;9082:66:0;;;;;;;:::i;:::-;57134:3:::1;57115:18;;:22;;;;:::i;:::-;57102:12;:35;57094:44;;;::::0;::::1;;57216:13;28496:1;57216:2;:13;:::i;:::-;57200:29;::::0;:15;:29:::1;:::i;:::-;57184:45:::0;-1:-1:-1;57266:13:0::1;28496:1;57266:2;:13;:::i;:::-;57253:26;::::0;:12;:26:::1;:::i;:::-;57240:39;;57346:26;29113:2;57373:38;;:18;;:38;;;;:::i;:::-;57346:65;;57422:23;29225:2;57446:35;;:18;;:35;;;;:::i;:::-;57422:59;;57520:18;57503:15;:35;;57494:103;;;::::0;-1:-1:-1;;;57494:103:0;;12393:2:1;57494:103:0::1;::::0;::::1;12375:21:1::0;12432:2;12412:18;;;12405:30;12471:34;12451:18;;;12444:62;-1:-1:-1;;;12522:18:1;;;12515:41;12573:19;;57494:103:0::1;12191:407:1::0;57494:103:0::1;57631:15;57617:12;:29;;57608:94;;;::::0;-1:-1:-1;;;57608:94:0;;12805:2:1;57608:94:0::1;::::0;::::1;12787:21:1::0;12844:2;12824:18;;;12817:30;12883:34;12863:18;;;12856:62;-1:-1:-1;;;12934:18:1;;;12927:38;12982:19;;57608:94:0::1;12603:404:1::0;57608:94:0::1;-1:-1:-1::0;;57715:12:0::1;:30:::0;;;;57756:9:::1;:24:::0;56898:895::o;64129:342::-;64272:10;64216:4;64260:23;;;:11;:23;;;;;;;;-1:-1:-1;;;;;64260:32:0;;;;;;;;;;64311:35;;;;64303:60;;;;-1:-1:-1;;;64303:60:0;;13214:2:1;64303:60:0;;;13196:21:1;13253:2;13233:18;;;13226:30;-1:-1:-1;;;13272:18:1;;;13265:42;13324:18;;64303:60:0;13012:336:1;64303:60:0;64376:65;64385:10;64397:7;64406:34;64425:15;64406:16;:34;:::i;64376:65::-;-1:-1:-1;64459:4:0;;64129:342;-1:-1:-1;;;64129:342:0:o;62685:167::-;62765:4;62782:40;62792:10;62804:9;62815:6;62782:9;:40::i;28423:31::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;54167:115::-;9101:10;9090:7;8916;8943:6;-1:-1:-1;;;;;8943:6:0;;8878:79;9090:7;-1:-1:-1;;;;;9090:21:0;;9082:66;;;;-1:-1:-1;;;9082:66:0;;;;;;;:::i;:::-;54243:9:::1;:31:::0;;-1:-1:-1;;;;;;54243:31:0::1;-1:-1:-1::0;;;;;54243:31:0;;;::::1;::::0;;;::::1;::::0;;54167:115::o;54822:102::-;9101:10;9090:7;8916;8943:6;-1:-1:-1;;;;;8943:6:0;;8878:79;9090:7;-1:-1:-1;;;;;9090:21:0;;9082:66;;;;-1:-1:-1;;;9082:66:0;;;;;;;:::i;:::-;54892:15:::1;:24:::0;;-1:-1:-1;;54892:24:0::1;::::0;::::1;;::::0;;;::::1;::::0;;54822:102::o;52637:64::-;52673:20;52682:10;52673:8;:20::i;50225:220::-;50290:7;50328:20;;50312:15;:36;50309:110;;;50392:15;50371:20;;:36;;;;:::i;50309:110::-;-1:-1:-1;50436:1:0;;50225:220::o;50453:129::-;50500:7;50561:13;28496:1;50561:2;:13;:::i;:::-;50541:18;;28553:13;28496:1;28553:2;:13;:::i;:::-;28543:23;;:7;:23;:::i;:::-;50527:32;;;;:::i;:::-;50526:48;;;;:::i;55787:112::-;9101:10;9090:7;8916;8943:6;-1:-1:-1;;;;;8943:6:0;;8878:79;9090:7;-1:-1:-1;;;;;9090:21:0;;9082:66;;;;-1:-1:-1;;;9082:66:0;;;;;;;:::i;:::-;55864:27:::1;:9;55878:12:::0;55864:13:::1;:27::i;54426:157::-:0;9101:10;9090:7;8916;8943:6;-1:-1:-1;;;;;8943:6:0;;8878:79;9090:7;-1:-1:-1;;;;;9090:21:0;;9082:66;;;;-1:-1:-1;;;9082:66:0;;;;;;;:::i;:::-;54530:5:::1;:15;54538:7:::0;54530:5;:15:::1;:::i;:::-;-1:-1:-1::0;54556:7:0::1;:19;54566:9:::0;54556:7;:19:::1;:::i;55594:125::-:0;9101:10;9090:7;8916;8943:6;-1:-1:-1;;;;;8943:6:0;;8878:79;9090:7;-1:-1:-1;;;;;9090:21:0;;9082:66;;;;-1:-1:-1;;;9082:66:0;;;;;;;:::i;:::-;55676:19:::1;:35:::0;55594:125::o;28385:31::-;;;;;;;:::i;54997:202::-;9101:10;9090:7;8916;8943:6;-1:-1:-1;;;;;8943:6:0;;8878:79;9090:7;-1:-1:-1;;;;;9090:21:0;;9082:66;;;;-1:-1:-1;;;9082:66:0;;;;;;;:::i;:::-;55089:32;;55081:67:::1;;;::::0;-1:-1:-1;;;55081:67:0;;15759:2:1;55081:67:0::1;::::0;::::1;15741:21:1::0;15798:2;15778:18;;;15771:30;15837:25;15817:18;;;15810:53;15880:18;;55081:67:0::1;15557:347:1::0;55081:67:0::1;55163:12;:28:::0;54997:202::o;55275:195::-;9101:10;9090:7;8916;8943:6;-1:-1:-1;;;;;8943:6:0;;8878:79;9090:7;-1:-1:-1;;;;;9090:21:0;;9082:66;;;;-1:-1:-1;;;9082:66:0;;;;;;;:::i;:::-;55365:30;;55357:64:::1;;;::::0;-1:-1:-1;;;55357:64:0;;16111:2:1;55357:64:0::1;::::0;::::1;16093:21:1::0;16150:2;16130:18;;;16123:30;-1:-1:-1;;;16169:18:1;;;16162:52;16231:18;;55357:64:0::1;15909:346:1::0;55357:64:0::1;55436:11;:26:::0;55275:195::o;41985:411::-;42067:18;;42033:7;;;42242:123;42258:29;:20;:27;:29::i;:::-;42256:1;:31;42242:123;;;42316:9;:37;42326:26;:20;42350:1;42326:23;:26::i;:::-;-1:-1:-1;;;;;42316:37:0;;;;;;;;;;;;-1:-1:-1;42316:37:0;;42308:45;;;;:::i;:::-;;-1:-1:-1;42289:3:0;;;;:::i;:::-;;;;42242:123;;;-1:-1:-1;42382:6:0;41985:411;-1:-1:-1;41985:411:0:o;59999:1211::-;9101:10;9090:7;8916;8943:6;-1:-1:-1;;;;;8943:6:0;;8878:79;9090:7;-1:-1:-1;;;;;9090:21:0;;9082:66;;;;-1:-1:-1;;;9082:66:0;;;;;;;:::i;:::-;60143:20:::1;;60124:15;:39;;60116:68;;;;-1:-1:-1::0;;;60116:68:0::1;;;;;;;:::i;:::-;60216:40;29748:4;60216:15;:40;:::i;:::-;60195:20;:61:::0;60316:22:::1;::::0;60367:39:::1;::::0;-1:-1:-1;;;60367:39:0;;60400:4:::1;60367:39;::::0;::::1;4922:51:1::0;60316:22:0;;;::::1;-1:-1:-1::0;;;;;60316:22:0::1;::::0;60267:30:::1;::::0;60316:22;;60367:24:::1;::::0;4895:18:1;;60367:39:0::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;60450:16;::::0;60419:56:::1;::::0;-1:-1:-1;;;60419:56:0;;-1:-1:-1;;;;;60450:16:0;;::::1;60419:56;::::0;::::1;11836:51:1::0;11903:18;;;11896:34;;;60350:56:0;;-1:-1:-1;60419:22:0;::::1;::::0;::::1;::::0;11809:18:1;;60419:56:0::1;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1::0;60752:16:0::1;::::0;:218:::1;::::0;-1:-1:-1;;;60752:218:0;;60720:21:::1;::::0;-1:-1:-1;;;;;60752:16:0::1;::::0;:64:::1;::::0;:218:::1;::::0;60839:4:::1;::::0;60859:6;;60692:25:::1;::::0;;;60839:4;;60940:15:::1;::::0;60752:218:::1;;;:::i;:::-;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1::0;60981:21:0::1;61005:39;61027:17:::0;61005:21:::1;:39;:::i;:::-;60981:63;;61058:12;61055:146;;;61086:31;61103:13;61086:16;:31::i;:::-;61055:146;;;61176:13;61158:16;;:31;;;;;;;:::i;:::-;::::0;;;-1:-1:-1;;61055:146:0::1;60047:1163;;;;59999:1211:::0;:::o;54290:128::-;9101:10;9090:7;8916;8943:6;-1:-1:-1;;;;;8943:6:0;;8878:79;9090:7;-1:-1:-1;;;;;9090:21:0;;9082:66;;;;-1:-1:-1;;;9082:66:0;;;;;;;:::i;:::-;54376:14:::1;:34:::0;;-1:-1:-1;;;;;;54376:34:0::1;-1:-1:-1::0;;;;;54376:34:0;;;::::1;::::0;;;::::1;::::0;;54290:128::o;57873:135::-;9101:10;9090:7;8916;8943:6;-1:-1:-1;;;;;8943:6:0;;8878:79;9090:7;-1:-1:-1;;;;;9090:21:0;;9082:66;;;;-1:-1:-1;;;9082:66:0;;;;;;;:::i;:::-;57962:38:::1;:14;57981:18:::0;57962::::1;:38::i;9814:236::-:0;9101:10;9090:7;8916;8943:6;-1:-1:-1;;;;;8943:6:0;;8878:79;9090:7;-1:-1:-1;;;;;9090:21:0;;9082:66;;;;-1:-1:-1;;;9082:66:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;9895:22:0;::::1;9887:73;;;::::0;-1:-1:-1;;;9887:73:0;;17214:2:1;9887:73:0::1;::::0;::::1;17196:21:1::0;17253:2;17233:18;;;17226:30;17292:34;17272:18;;;17265:62;-1:-1:-1;;;17343:18:1;;;17336:36;17389:19;;9887:73:0::1;17012:402:1::0;9887:73:0::1;9997:6;::::0;;9976:38:::1;::::0;-1:-1:-1;;;;;9976:38:0;;::::1;::::0;9997:6;::::1;::::0;9976:38:::1;::::0;::::1;10025:6;:17:::0;;-1:-1:-1;;;;;;10025:17:0::1;-1:-1:-1::0;;;;;10025:17:0;;;::::1;::::0;;;::::1;::::0;;9814:236::o;53195:241::-;9101:10;9090:7;8916;8943:6;-1:-1:-1;;;;;8943:6:0;;8878:79;9090:7;-1:-1:-1;;;;;9090:21:0;;9082:66;;;;-1:-1:-1;;;9082:66:0;;;;;;;:::i;:::-;53268:16:::1;::::0;;53253:14:::1;53295:18:::0;;;53332:10:::1;::::0;-1:-1:-1;;;;;53332:10:0::1;53324:47;53367:3;53354:9;53268:16:::0;53361:2:::1;53354:9;:::i;41791:118::-:0;41849:4;41872:29;:14;41896:4;41872:23;:29::i;24565:152::-;24635:4;24659:50;24664:3;-1:-1:-1;;;;;24684:23:0;;24659:4;:50::i;:::-;24652:57;24565:152;-1:-1:-1;;;24565:152:0:o;63182:299::-;-1:-1:-1;;;;;63275:19:0;;63267:49;;;;-1:-1:-1;;;63267:49:0;;17621:2:1;63267:49:0;;;17603:21:1;17660:2;17640:18;;;17633:30;-1:-1:-1;;;17679:18:1;;;17672:47;17736:18;;63267:49:0;17419:341:1;63267:49:0;-1:-1:-1;;;;;63335:21:0;;63327:49;;;;-1:-1:-1;;;63327:49:0;;17967:2:1;63327:49:0;;;17949:21:1;18006:2;17986:18;;;17979:30;-1:-1:-1;;;18025:18:1;;;18018:45;18080:18;;63327:49:0;17765:339:1;63327:49:0;-1:-1:-1;;;;;63389:18:0;;;;;;;:11;:18;;;;;;;;:27;;;;;;;;;;;;;:36;;;63441:32;;2346:25:1;;;63441:32:0;;2319:18:1;63441:32:0;;;;;;;63182:299;;;:::o;32793:1544::-;-1:-1:-1;;;;;32889:20:0;;32881:51;;;;-1:-1:-1;;;32881:51:0;;18311:2:1;32881:51:0;;;18293:21:1;18350:2;18330:18;;;18323:30;-1:-1:-1;;;18369:18:1;;;18362:48;18427:18;;32881:51:0;18109:342:1;32881:51:0;-1:-1:-1;;;;;32951:23:0;;32943:52;;;;-1:-1:-1;;;32943:52:0;;18658:2:1;32943:52:0;;;18640:21:1;18697:2;18677:18;;;18670:30;-1:-1:-1;;;18716:18:1;;;18709:46;18772:18;;32943:52:0;18456:340:1;32943:52:0;33088:15;33107:26;:9;33126:6;33107:18;:26::i;:::-;:59;;;-1:-1:-1;33137:29:0;:9;33156;33137:18;:29::i;:::-;33088:79;-1:-1:-1;33266:23:0;-1:-1:-1;;;;;33291:21:0;;33307:4;33291:21;;:49;;-1:-1:-1;;;;;;33316:24:0;;33335:4;33316:24;33291:49;33479:16;;33546:21;;33266:75;;-1:-1:-1;;;;;;33479:16:0;;;;33447:23;;33536:31;;;-1:-1:-1;;;33546:21:0;;;;33536:31;:63;;;;;33584:15;-1:-1:-1;;;;;33571:28:0;:9;-1:-1:-1;;;;;33571:28:0;;33536:63;33535:144;;;-1:-1:-1;33628:21:0;;-1:-1:-1;;;;;33615:34:0;;;-1:-1:-1;;;33628:21:0;;;;33615:34;:63;;;;;33663:15;-1:-1:-1;;;;;33653:25:0;:6;-1:-1:-1;;;;;33653:25:0;;33615:63;33801:21;;33507:173;;-1:-1:-1;33782:10:0;;-1:-1:-1;;;;;33793:29:0;;;-1:-1:-1;;;33801:21:0;;;;33793:29;;:57;;;33835:15;-1:-1:-1;;;;;33825:25:0;:6;-1:-1:-1;;;;;33825:25:0;;33793:57;33884:21;;33782:68;;-1:-1:-1;33861:11:0;;-1:-1:-1;;;;;33873:32:0;;;-1:-1:-1;;;33884:21:0;;;;33873:32;;:63;;;33921:15;-1:-1:-1;;;;;33908:28:0;:9;-1:-1:-1;;;;;33908:28:0;;33873:63;33861:75;;33977:18;:41;;;;33999:19;33977:41;:55;;;;34022:10;33977:55;33974:356;;;34048:43;34065:6;34073:9;34084:6;34048:16;:43::i;:::-;33974:356;;;34210:14;;;;;;;34202:49;;;;-1:-1:-1;;;34202:49:0;;19003:2:1;34202:49:0;;;18985:21:1;19042:2;19022:18;;;19015:30;19081:25;19061:18;;;19054:53;19124:18;;34202:49:0;18801:347:1;34202:49:0;34266:52;34281:6;34288:9;34298:6;34305:5;34311:6;34266:14;:52::i;:::-;32870:1467;;;;;;32793:1544;;;:::o;47438:1628::-;47107:27;:34;;-1:-1:-1;;47107:34:0;47137:4;47107:34;;;;;;47540:4:::1;47107:27:::0;47522:24;;;::::1;::::0;;;;;;;;47587:11:::1;::::0;47522:24;;47107:27;47573:25:::1;::::0;-1:-1:-1;;;47587:11:0;::::1;47107:34:::0;47587:11;;::::1;::::0;47573:13;;::::1;;:25;:::i;:::-;47557:41;;;;47609:19;47631;;47609:41;;47777:11;47761:15;:27;:40;;;-1:-1:-1::0;47790:11:0::1;::::0;::::1;::::0;47761:40:::1;47758:77;;;47817:7;;;;;47758:77;47955:13;::::0;47916:25:::1;::::0;47942:36:::1;::::0;::::1;::::0;47943:25:::1;::::0;47955:13;;::::1;;;47943:11:::0;:25:::1;:::i;:::-;47942:36;;;;:::i;:::-;47916:62:::0;-1:-1:-1;47989:25:0::1;48016:29;47916:62:::0;48016:11;:29:::1;:::i;:::-;47989:56:::0;-1:-1:-1;48106:16:0::1;48123:19;48141:1;48123:17:::0;:19:::1;:::i;:::-;48106:36:::0;-1:-1:-1;48153:19:0::1;48173:26;48106:36:::0;48173:17;:26:::1;:::i;:::-;48153:46:::0;-1:-1:-1;48282:17:0::1;48300:29;48312:17:::0;48153:46;48300:29:::1;:::i;:::-;48282:47:::0;-1:-1:-1;48444:21:0::1;48476:27;48282:47:::0;48476:16:::1;:27::i;:::-;48514:14;48530:41;48554:17:::0;48530:21:::1;:41;:::i;:::-;48514:58:::0;-1:-1:-1;48672:14:0::1;48710:9:::0;48690:18:::1;48697:11:::0;48514:58;48690:18:::1;:::i;:::-;48689:30;;;;:::i;:::-;48672:47;;48730:31;48744:8;48754:6;48730:13;:31::i;:::-;48884:21;48907:41;48931:17:::0;48907:21:::1;:41;:::i;:::-;48884:65;;49027:31;49044:13;49027:16;:31::i;:::-;47487:1579;;;;;;;;;;;;47152:1;47164:27:::0;:35;;-1:-1:-1;;47164:35:0;;;47438:1628::o;44022:427::-;-1:-1:-1;;;;;44143:17:0;;44085:7;44143:17;;;:9;:17;;;;;;44126:14;;44085:7;;44126:34;;;:::i;:::-;-1:-1:-1;;;;;44323:25:0;;;;;;:17;:25;;;;;;44105:55;;-1:-1:-1;44312:36:0;;44309:49;;;-1:-1:-1;44357:1:0;;44022:427;-1:-1:-1;;44022:427:0:o;44309:49::-;-1:-1:-1;;;;;44390:25:0;;;;;;:17;:25;;;;;;-1:-1:-1;;;40706:5:0;44377:38;;:10;:38;:::i;:::-;44376:65;;;;:::i;24893:158::-;24966:4;24990:53;24998:3;-1:-1:-1;;;;;25018:23:0;;24990:7;:53::i;59181:230::-;59337:20;;59323:13;:34;59315:43;;;;;;59369:20;:34;59181:230::o;25137:167::-;-1:-1:-1;;;;;25271:23:0;;25217:4;21946:19;;;:12;;;:19;;;;;;:24;;25241:55;21849:129;45392:1212;45451:14;;-1:-1:-1;;;45451:14:0;;;;45450:15;45442:24;;;;;;45477:14;:19;;-1:-1:-1;;;;45477:19:0;-1:-1:-1;;;45477:19:0;;;;45535:27;45557:4;45535:21;:27::i;:::-;45532:495;;;-1:-1:-1;;;;;;45649:14:0;;;;;;:8;:14;;;;;;;45678:16;;;45532:495;;;45735:17;45753:21;45769:4;45753:15;:21::i;:::-;-1:-1:-1;;;;;45885:15:0;;;;;;:9;:15;;;;;;45868:14;;45735:39;;-1:-1:-1;45868:32:0;;;:::i;:::-;-1:-1:-1;;;;;45842:23:0;;;;;;:17;:23;;;;;;;;:58;;;;45960:8;:14;;;;:24;;45975:9;;45960:24;:::i;:::-;-1:-1:-1;;;;;45999:14:0;;46014:1;45999:14;;;:8;:14;;;;;:16;45953:31;-1:-1:-1;;45532:495:0;46040:6;46048:1;46040:9;46037:106;;-1:-1:-1;;46090:14:0;:20;;-1:-1:-1;;;;46090:20:0;;;45392:1212::o;46037:106::-;46171:6;46157:12;;:20;;;;;;;:::i;:::-;;;;-1:-1:-1;;46212:16:0;;;46226:1;46212:16;;;;;;;;46188:21;;46212:16;;;;;;;;-1:-1:-1;;46249:16:0;;:23;;;-1:-1:-1;;;46249:23:0;;;;46188:40;;-1:-1:-1;;;;;;46249:16:0;;;;:21;;-1:-1:-1;46249:23:0;;;;;;;;;;;;;;:16;:23;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;46239:4;46244:1;46239:7;;;;;;;;:::i;:::-;-1:-1:-1;;;;;46239:33:0;;;:7;;;;;;;;;:33;46299:14;;46289:7;;46299:14;;;46289:4;;46299:14;;46289:7;;;;;;:::i;:::-;-1:-1:-1;;;;;46289:24:0;;;:7;;;;;;;;;:24;46361:16;;:151;;-1:-1:-1;;;46361:151:0;;:16;;;:67;;46436:6;;46361:151;;:16;;46466:4;;46481;;46496:15;;46361:151;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;46538:27:0;;;20696:25:1;;;-1:-1:-1;;;;;20757:32:1;;20752:2;20737:18;;20730:60;46538:27:0;;-1:-1:-1;20669:18:1;;-1:-1:-1;46538:27:0;;-1:-1:-1;20522:274:1;46538:27:0;;;;;;;;-1:-1:-1;;46576:14:0;:20;;-1:-1:-1;;;;46576:20:0;;;-1:-1:-1;45392:1212:0:o;25390:117::-;25453:7;25480:19;25488:3;22147:18;;22064:109;25851:158;25925:7;25976:22;25980:3;25992:5;25976:3;:22::i;44519:758::-;44654:14;;44616:22;;44672:3;;44642:26;;44654:14;;44642:9;:26;:::i;:::-;44641:34;;;;:::i;:::-;44616:59;-1:-1:-1;44686:14:0;44703:26;44616:59;44703:9;:26;:::i;:::-;44686:43;;44759:14;44741:16;;:32;;;;;;;:::i;:::-;;;;-1:-1:-1;;44797:10:0;;44793:477;;44846:6;44824:18;;:28;;;;;;;:::i;:::-;;;;-1:-1:-1;44867:19:0;;-1:-1:-1;44887:17:0;:15;:17::i;:::-;44867:37;;44998:11;45013:1;44998:16;44994:265;;45055:6;45035:16;;:26;;;;;;;:::i;:::-;;;;-1:-1:-1;44994:265:0;;-1:-1:-1;44994:265:0;;45231:11;45196:31;-1:-1:-1;;;45196:6:0;:31;:::i;:::-;45195:47;;;;:::i;:::-;45176:14;;:67;;;;;;;:::i;:::-;;;;-1:-1:-1;;44994:265:0;44809:461;44572:705;;44519:758;:::o;19620:414::-;19683:4;21946:19;;;:12;;;:19;;;;;;19700:327;;-1:-1:-1;19743:23:0;;;;;;;;:11;:23;;;;;;;;;;;;;19926:18;;19904:19;;;:12;;;:19;;;;;;:40;;;;19959:11;;19700:327;-1:-1:-1;20010:5:0;20003:12;;39402:440;-1:-1:-1;;;;;39521:17:0;;39497:21;39521:17;;;:9;:17;;;;;;39557:23;;;;39549:60;;;;-1:-1:-1;;;39549:60:0;;21003:2:1;39549:60:0;;;20985:21:1;21042:2;21022:18;;;21015:30;-1:-1:-1;;;21061:18:1;;;21054:54;21125:18;;39549:60:0;20801:348:1;39549:60:0;39665:27;39678:6;39685;39665:12;:27::i;:::-;39745:28;39755:9;39766:6;39745:9;:28::i;:::-;39815:9;-1:-1:-1;;;;;39799:33:0;39808:6;-1:-1:-1;;;;;39799:33:0;;39825:6;39799:33;;;;2346:25:1;;2334:2;2319:18;;2200:177;39799:33:0;;;;;;;;39486:356;39402:440;;;:::o;34438:4902::-;-1:-1:-1;;;;;34581:20:0;;;34554:24;34581:20;;;:9;:20;;;;;;;34636:17;;;;;;;;34672:23;;;;34664:60;;;;-1:-1:-1;;;34664:60:0;;21003:2:1;34664:60:0;;;20985:21:1;21042:2;21022:18;;;21015:30;-1:-1:-1;;;21061:18:1;;;21054:54;21125:18;;34664:60:0;20801:348:1;34664:60:0;34737:9;34760:6;34757:3257;;;34786:38;:21;34817:6;34786:30;:38::i;:::-;34782:427;;-1:-1:-1;;;;;34974:17:0;;;;;;:9;:17;;;;;;34993:15;-1:-1:-1;34974:34:0;;:52;;-1:-1:-1;35010:16:0;;;;34974:52;34966:82;;;;-1:-1:-1;;;34966:82:0;;21356:2:1;34966:82:0;;;21338:21:1;21395:2;21375:18;;;21368:30;-1:-1:-1;;;21414:18:1;;;21407:48;21472:18;;34966:82:0;21154:342:1;34966:82:0;35181:12;;35165:28;;:15;:28;:::i;:::-;-1:-1:-1;;;;;35147:17:0;;;;;;:9;:17;;;;;:46;34782:427;35350:9;;35342:6;:17;;35334:44;;;;-1:-1:-1;;;35334:44:0;;21703:2:1;35334:44:0;;;21685:21:1;21742:2;21722:18;;;21715:30;-1:-1:-1;;;21761:18:1;;;21754:45;21816:18;;35334:44:0;21501:339:1;35334:44:0;35401:31;:14;35425:6;35401:23;:31::i;:::-;:40;35393:73;;;;-1:-1:-1;;;35393:73:0;;22047:2:1;35393:73:0;;;22029:21:1;22086:2;22066:18;;;22059:30;-1:-1:-1;;;22105:18:1;;;22098:50;22165:18;;35393:73:0;21845:344:1;35393:73:0;35525:11;;35506:16;;:30;;;;:::i;:::-;35487:15;:49;;:77;;;;;35540:19;;35563:1;35540:24;35487:77;35483:186;;;35585:26;:14;35604:6;35585:18;:26::i;:::-;-1:-1:-1;35635:18:0;;-1:-1:-1;;;;;35635:18:0;;;;;;;;35483:186;-1:-1:-1;35689:8:0;;;;;;;34757:3257;;;35722:5;35719:2295;;;35747:40;:20;35777:9;35747:29;:40::i;:::-;35743:427;;-1:-1:-1;;;;;35936:19:0;;;;;;:8;:19;;;;;;35957:15;-1:-1:-1;35936:36:0;;:53;;-1:-1:-1;35974:15:0;;;;35936:53;35928:81;;;;-1:-1:-1;;;35928:81:0;;22396:2:1;35928:81:0;;;22378:21:1;22435:2;22415:18;;;22408:30;-1:-1:-1;;;22454:18:1;;;22447:46;22510:18;;35928:81:0;22194:340:1;35928:81:0;36143:11;;36127:27;;:15;:27;:::i;:::-;-1:-1:-1;;;;;36107:19:0;;;;;;:8;:19;;;;;:47;35743:427;36308:12;;36283:23;36300:6;36283:16;:23;:::i;:::-;:37;;36275:65;;;;-1:-1:-1;;;36275:65:0;;22741:2:1;36275:65:0;;;22723:21:1;22780:2;22760:18;;;22753:30;-1:-1:-1;;;22799:18:1;;;22792:46;22855:18;;36275:65:0;22539:340:1;36275:65:0;36373:6;;36363;:16;;36355:62;;;;-1:-1:-1;;;36355:62:0;;23086:2:1;36355:62:0;;;23068:21:1;23125:2;23105:18;;;23098:30;23164:34;23144:18;;;23137:62;-1:-1:-1;;;23215:18:1;;;23208:32;23257:19;;36355:62:0;22884:398:1;36355:62:0;36440:34;:14;36464:9;36440:23;:34::i;:::-;:43;36432:76;;;;-1:-1:-1;;;36432:76:0;;22047:2:1;36432:76:0;;;22029:21:1;22086:2;22066:18;;;22059:30;-1:-1:-1;;;22105:18:1;;;22098:50;22165:18;;36432:76:0;21845:344:1;36432:76:0;36567:11;;36548:16;;:30;;;;:::i;:::-;36529:15;:49;;:77;;;;;36582:19;;36605:1;36582:24;36529:77;36525:192;;;36627:29;:14;36646:9;36627:18;:29::i;:::-;-1:-1:-1;36680:21:0;;-1:-1:-1;;;;;36680:21:0;;;;;;;;36525:192;-1:-1:-1;36737:7:0;;;;35719:2295;;;36984:15;28496:1;36984:2;:15;:::i;:::-;36976:6;:23;36973:44;;37001:16;37010:6;37001:8;:16::i;:::-;37156:12;;37131:23;37148:6;37131:16;:23;:::i;:::-;:37;;37123:65;;;;-1:-1:-1;;;37123:65:0;;22741:2:1;37123:65:0;;;22723:21:1;22780:2;22760:18;;;22753:30;-1:-1:-1;;;22799:18:1;;;22792:46;22855:18;;37123:65:0;22539:340:1;37123:65:0;37420:38;:21;37451:6;37420:30;:38::i;:::-;37416:139;;-1:-1:-1;;;;;37485:17:0;;;;;;:9;:17;;;;;;37504:15;-1:-1:-1;37485:34:0;;:52;;-1:-1:-1;37521:16:0;;;;37485:52;37477:78;;;;-1:-1:-1;;;37477:78:0;;23489:2:1;37477:78:0;;;23471:21:1;23528:2;23508:18;;;23501:30;-1:-1:-1;;;23547:18:1;;;23540:44;23601:18;;37477:78:0;23287:338:1;37477:78:0;37592:31;:14;37616:6;37592:23;:31::i;:::-;:40;37584:80;;;;-1:-1:-1;;;37584:80:0;;23832:2:1;37584:80:0;;;23814:21:1;23871:2;23851:18;;;23844:30;23910:29;23890:18;;;23883:57;23957:18;;37584:80:0;23630:351:1;37584:80:0;37687:34;:14;37711:9;37687:23;:34::i;:::-;:43;37679:86;;;;-1:-1:-1;;;37679:86:0;;24188:2:1;37679:86:0;;;24170:21:1;24227:2;24207:18;;;24200:30;24266:32;24246:18;;;24239:60;24316:18;;37679:86:0;23986:354:1;37679:86:0;37824:11;;37805:16;;:30;;;;:::i;:::-;37786:15;:49;;:77;;;;;37839:19;;37862:1;37839:24;37786:77;37782:186;;;37884:26;:14;37903:6;37884:18;:26::i;:::-;-1:-1:-1;37934:18:0;;-1:-1:-1;;;;;37934:18:0;;;;;;;;37782:186;-1:-1:-1;37988:12:0;;;;;;;35719:2295;38351:21;;-1:-1:-1;;;;;38343:29:0;;;-1:-1:-1;;;38351:21:0;;;;38343:29;;;;38342:52;;-1:-1:-1;38377:16:0;;;;38376:17;38342:52;:84;;;;-1:-1:-1;38398:27:0;;;;38397:28;38342:84;:92;;;;;38428:6;38342:92;38339:130;;;38449:20;:18;:20::i;:::-;38538:23;38562:36;38576:6;38584:3;38589:8;;;;;;;;;;;38562:13;:36::i;:::-;38767:13;;38538:60;;-1:-1:-1;38706:21:0;;38728:53;;38742:6;;38750:3;;38755:25;;38767:13;;;;;;;-1:-1:-1;;;38755:11:0;;;:25;:::i;:::-;38728:13;:53::i;:::-;38706:75;-1:-1:-1;38845:19:0;38873:31;38706:75;38873:15;:31;:::i;:::-;38865:40;;:6;:40;:::i;:::-;38845:60;;38963:27;38976:6;38983;38963:12;:27::i;:::-;39085:4;39067:24;;;;:9;:24;;;;;:41;;39095:13;;39067:24;:41;;39095:13;;39067:41;:::i;:::-;;;;;;;;39163:15;39143:18;;:35;;;;;;;:::i;:::-;;;;-1:-1:-1;39233:33:0;;-1:-1:-1;39243:9:0;39254:11;39233:9;:33::i;:::-;39308:9;-1:-1:-1;;;;;39292:38:0;39301:6;-1:-1:-1;;;;;39292:38:0;;39318:11;39292:38;;;;2346:25:1;;2334:2;2319:18;;2200:177;39292:38:0;;;;;;;;34543:4797;;;;;;34438:4902;;;;;:::o;49116:461::-;49209:16;;49177:58;;49194:4;;-1:-1:-1;;;;;49209:16:0;49228:6;49177:8;:58::i;:::-;49270:16;;;49284:1;49270:16;;;;;;;;49246:21;;49270:16;;;;;;;;;;-1:-1:-1;49270:16:0;49246:40;;49315:4;49297;49302:1;49297:7;;;;;;;;:::i;:::-;-1:-1:-1;;;;;49297:23:0;;;:7;;;;;;;;;;:23;;;;49341:16;;:23;;;-1:-1:-1;;;49341:23:0;;;;:16;;;;;:21;;:23;;;;;49297:7;;49341:23;;;;;:16;:23;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;49331:4;49336:1;49331:7;;;;;;;;:::i;:::-;-1:-1:-1;;;;;49331:33:0;;;:7;;;;;;;;;:33;49377:16;;:192;;-1:-1:-1;;;49377:192:0;;:16;;;:67;;:192;;49459:6;;49377:16;;49496:4;;49523;;49543:15;;49377:192;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;49166:411;49116:461;:::o;49704:401::-;49798:9;49786:10;;:21;;;;;;;:::i;:::-;;;;-1:-1:-1;;49850:16:0;;49818:63;;49835:4;;-1:-1:-1;;;;;49850:16:0;49869:11;49818:8;:63::i;:::-;49892:16;;:205;;-1:-1:-1;;;49892:205:0;;-1:-1:-1;;;;;49892:16:0;;;;:32;;49932:9;;49892:205;;49965:4;;49985:11;;49892:16;;;;49965:4;;50071:15;;49892:205;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;20210:1553::-;20276:4;20415:19;;;:12;;;:19;;;;;;20451:15;;20447:1309;;20813:21;20837:14;20850:1;20837:10;:14;:::i;:::-;20886:18;;20813:38;;-1:-1:-1;20866:17:0;;20886:22;;20907:1;;20886:22;:::i;:::-;20866:42;;21153:17;21173:3;:11;;21185:9;21173:22;;;;;;;;:::i;:::-;;;;;;;;;21153:42;;21319:9;21290:3;:11;;21302:13;21290:26;;;;;;;;:::i;:::-;;;;;;;;;;;;:38;;;;21396:23;;;:12;;;:23;;;;;;:36;;;21557:17;;21396:3;;21557:17;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;21652:3;:12;;:19;21665:5;21652:19;;;;;;;;;;;21645:26;;;21695:4;21688:11;;;;;;;;20447:1309;21739:5;21732:12;;;;;22517:204;22612:18;;22584:7;;22612:26;-1:-1:-1;22604:73:0;;;;-1:-1:-1;;;22604:73:0;;25577:2:1;22604:73:0;;;25559:21:1;25616:2;25596:18;;;25589:30;25655:34;25635:18;;;25628:62;-1:-1:-1;;;25706:18:1;;;25699:32;25748:19;;22604:73:0;25375:398:1;22604:73:0;22695:3;:11;;22707:5;22695:18;;;;;;;;:::i;:::-;;;;;;;;;22688:25;;22517:204;;;;:::o;43228:648::-;-1:-1:-1;;;;;43363:15:0;;43345:17;43363:15;;;:9;:15;;;;;;:22;;43379:6;;43363:22;:::i;:::-;43345:40;;43409:27;43431:4;43409:21;:27::i;:::-;43406:102;;;-1:-1:-1;;;;;43451:15:0;;;;;;;:9;:15;;;;;:25;;;;-1:-1:-1;43228:648:0:o;43406:102::-;43573:15;43589:21;43605:4;43589:15;:21::i;:::-;-1:-1:-1;;;;;43648:15:0;;;;;;:9;:15;;;;;:25;;;43757:14;;43573:37;;-1:-1:-1;43757:26:0;;43664:9;;43757:26;:::i;:::-;-1:-1:-1;;;;;43731:23:0;;;;;;:17;:23;;;;;;;;:52;;;;43844:8;:14;;;;;:23;;43860:7;;43731:23;43844;;43860:7;;43844:23;:::i;42491:645::-;-1:-1:-1;;;;;42623:15:0;;42605:17;42623:15;;;:9;:15;;;;;;:22;;42639:6;;42623:22;:::i;:::-;42605:40;;42669:27;42691:4;42669:21;:27::i;:::-;42666:102;;;-1:-1:-1;;;;;42711:15:0;;;;;;;:9;:15;;;;;:25;;;;-1:-1:-1;42491:645:0:o;42666:102::-;42833:15;42849:21;42865:4;42849:15;:21::i;:::-;42833:37;;42971:9;42954:14;;:26;;;;:::i;:::-;-1:-1:-1;;;;;42928:23:0;;;;;;:17;:23;;;;;;;;:52;;;;43041:8;:14;;;;;:23;;43057:7;;42928:23;43041;;43057:7;;43041:23;:::i;:::-;;;;-1:-1:-1;;;;;;;;43103:15:0;;;;;;;:9;:15;;;;;:25;;;;-1:-1:-1;42491:645:0:o;39897:156::-;39987:7;40040:5;40026:10;40015:21;;40022:3;40015:10;;:6;:10;;;;:::i;:::-;:21;;;;:::i;:::-;40014:31;;;;:::i;:::-;40007:38;39897:156;-1:-1:-1;;;;39897:156:0:o;14:180:1:-;73:6;126:2;114:9;105:7;101:23;97:32;94:52;;;142:1;139;132:12;94:52;-1:-1:-1;165:23:1;;14:180;-1:-1:-1;14:180:1:o;199:597::-;311:4;340:2;369;358:9;351:21;401:6;395:13;444:6;439:2;428:9;424:18;417:34;469:1;479:140;493:6;490:1;487:13;479:140;;;588:14;;;584:23;;578:30;554:17;;;573:2;550:26;543:66;508:10;;479:140;;;637:6;634:1;631:13;628:91;;;707:1;702:2;693:6;682:9;678:22;674:31;667:42;628:91;-1:-1:-1;780:2:1;759:15;-1:-1:-1;;755:29:1;740:45;;;;787:2;736:54;;199:597;-1:-1:-1;;;199:597:1:o;990:131::-;-1:-1:-1;;;;;1065:31:1;;1055:42;;1045:70;;1111:1;1108;1101:12;1126:315;1194:6;1202;1255:2;1243:9;1234:7;1230:23;1226:32;1223:52;;;1271:1;1268;1261:12;1223:52;1310:9;1297:23;1329:31;1354:5;1329:31;:::i;:::-;1379:5;1431:2;1416:18;;;;1403:32;;-1:-1:-1;;;1126:315:1:o;1831:118::-;1917:5;1910:13;1903:21;1896:5;1893:32;1883:60;;1939:1;1936;1929:12;1954:241;2010:6;2063:2;2051:9;2042:7;2038:23;2034:32;2031:52;;;2079:1;2076;2069:12;2031:52;2118:9;2105:23;2137:28;2159:5;2137:28;:::i;2382:456::-;2459:6;2467;2475;2528:2;2516:9;2507:7;2503:23;2499:32;2496:52;;;2544:1;2541;2534:12;2496:52;2583:9;2570:23;2602:31;2627:5;2602:31;:::i;:::-;2652:5;-1:-1:-1;2709:2:1;2694:18;;2681:32;2722:33;2681:32;2722:33;:::i;:::-;2382:456;;2774:7;;-1:-1:-1;;;2828:2:1;2813:18;;;;2800:32;;2382:456::o;3383:247::-;3442:6;3495:2;3483:9;3474:7;3470:23;3466:32;3463:52;;;3511:1;3508;3501:12;3463:52;3550:9;3537:23;3569:31;3594:5;3569:31;:::i;3635:156::-;3701:20;;3761:4;3750:16;;3740:27;;3730:55;;3781:1;3778;3771:12;3730:55;3635:156;;;:::o;3796:535::-;3888:6;3896;3904;3912;3920;3928;3981:3;3969:9;3960:7;3956:23;3952:33;3949:53;;;3998:1;3995;3988:12;3949:53;4021:27;4038:9;4021:27;:::i;:::-;4011:37;;4067:36;4099:2;4088:9;4084:18;4067:36;:::i;:::-;4057:46;;4122:36;4154:2;4143:9;4139:18;4122:36;:::i;:::-;4112:46;;4177:36;4209:2;4198:9;4194:18;4177:36;:::i;:::-;4167:46;;4232:37;4264:3;4253:9;4249:19;4232:37;:::i;:::-;4222:47;;4288:37;4320:3;4309:9;4305:19;4288:37;:::i;:::-;4278:47;;3796:535;;;;;;;;:::o;4589:182::-;4646:6;4699:2;4687:9;4678:7;4674:23;4670:32;4667:52;;;4715:1;4712;4705:12;4667:52;4738:27;4755:9;4738:27;:::i;4984:248::-;5052:6;5060;5113:2;5101:9;5092:7;5088:23;5084:32;5081:52;;;5129:1;5126;5119:12;5081:52;-1:-1:-1;;5152:23:1;;;5222:2;5207:18;;;5194:32;;-1:-1:-1;4984:248:1:o;5237:127::-;5298:10;5293:3;5289:20;5286:1;5279:31;5329:4;5326:1;5319:15;5353:4;5350:1;5343:15;5369:719;5412:5;5465:3;5458:4;5450:6;5446:17;5442:27;5432:55;;5483:1;5480;5473:12;5432:55;5519:6;5506:20;5545:18;5582:2;5578;5575:10;5572:36;;;5588:18;;:::i;:::-;5663:2;5657:9;5631:2;5717:13;;-1:-1:-1;;5713:22:1;;;5737:2;5709:31;5705:40;5693:53;;;5761:18;;;5781:22;;;5758:46;5755:72;;;5807:18;;:::i;:::-;5847:10;5843:2;5836:22;5882:2;5874:6;5867:18;5928:3;5921:4;5916:2;5908:6;5904:15;5900:26;5897:35;5894:55;;;5945:1;5942;5935:12;5894:55;6009:2;6002:4;5994:6;5990:17;5983:4;5975:6;5971:17;5958:54;6056:1;6049:4;6044:2;6036:6;6032:15;6028:26;6021:37;6076:6;6067:15;;;;;;5369:719;;;;:::o;6093:543::-;6181:6;6189;6242:2;6230:9;6221:7;6217:23;6213:32;6210:52;;;6258:1;6255;6248:12;6210:52;6298:9;6285:23;6327:18;6368:2;6360:6;6357:14;6354:34;;;6384:1;6381;6374:12;6354:34;6407:50;6449:7;6440:6;6429:9;6425:22;6407:50;:::i;:::-;6397:60;;6510:2;6499:9;6495:18;6482:32;6466:48;;6539:2;6529:8;6526:16;6523:36;;;6555:1;6552;6545:12;6523:36;;6578:52;6622:7;6611:8;6600:9;6596:24;6578:52;:::i;:::-;6568:62;;;6093:543;;;;;:::o;6641:388::-;6709:6;6717;6770:2;6758:9;6749:7;6745:23;6741:32;6738:52;;;6786:1;6783;6776:12;6738:52;6825:9;6812:23;6844:31;6869:5;6844:31;:::i;:::-;6894:5;-1:-1:-1;6951:2:1;6936:18;;6923:32;6964:33;6923:32;6964:33;:::i;:::-;7016:7;7006:17;;;6641:388;;;;;:::o;7034:356::-;7236:2;7218:21;;;7255:18;;;7248:30;7314:34;7309:2;7294:18;;7287:62;7381:2;7366:18;;7034:356::o;7395:127::-;7456:10;7451:3;7447:20;7444:1;7437:31;7487:4;7484:1;7477:15;7511:4;7508:1;7501:15;7527:125;7567:4;7595:1;7592;7589:8;7586:34;;;7600:18;;:::i;:::-;-1:-1:-1;7637:9:1;;7527:125::o;7657:168::-;7697:7;7763:1;7759;7755:6;7751:14;7748:1;7745:21;7740:1;7733:9;7726:17;7722:45;7719:71;;;7770:18;;:::i;:::-;-1:-1:-1;7810:9:1;;7657:168::o;7830:217::-;7870:1;7896;7886:132;;7940:10;7935:3;7931:20;7928:1;7921:31;7975:4;7972:1;7965:15;8003:4;8000:1;7993:15;7886:132;-1:-1:-1;8032:9:1;;7830:217::o;8052:380::-;8131:1;8127:12;;;;8174;;;8195:61;;8249:4;8241:6;8237:17;8227:27;;8195:61;8302:2;8294:6;8291:14;8271:18;8268:38;8265:161;;8348:10;8343:3;8339:20;8336:1;8329:31;8383:4;8380:1;8373:15;8411:4;8408:1;8401:15;8437:422;8526:1;8569:5;8526:1;8583:270;8604:7;8594:8;8591:21;8583:270;;;8663:4;8659:1;8655:6;8651:17;8645:4;8642:27;8639:53;;;8672:18;;:::i;:::-;8722:7;8712:8;8708:22;8705:55;;;8742:16;;;;8705:55;8821:22;;;;8781:15;;;;8583:270;;;8587:3;8437:422;;;;;:::o;8864:806::-;8913:5;8943:8;8933:80;;-1:-1:-1;8984:1:1;8998:5;;8933:80;9032:4;9022:76;;-1:-1:-1;9069:1:1;9083:5;;9022:76;9114:4;9132:1;9127:59;;;;9200:1;9195:130;;;;9107:218;;9127:59;9157:1;9148:10;;9171:5;;;9195:130;9232:3;9222:8;9219:17;9216:43;;;9239:18;;:::i;:::-;-1:-1:-1;;9295:1:1;9281:16;;9310:5;;9107:218;;9409:2;9399:8;9396:16;9390:3;9384:4;9381:13;9377:36;9371:2;9361:8;9358:16;9353:2;9347:4;9344:12;9340:35;9337:77;9334:159;;;-1:-1:-1;9446:19:1;;;9478:5;;9334:159;9525:34;9550:8;9544:4;9525:34;:::i;:::-;9595:6;9591:1;9587:6;9583:19;9574:7;9571:32;9568:58;;;9606:18;;:::i;:::-;9644:20;;8864:806;-1:-1:-1;;;8864:806:1:o;9675:140::-;9733:5;9762:47;9803:4;9793:8;9789:19;9783:4;9762:47;:::i;10169:128::-;10209:3;10240:1;10236:6;10233:1;10230:13;10227:39;;;10246:18;;:::i;:::-;-1:-1:-1;10282:9:1;;10169:128::o;10302:204::-;10340:3;10376:4;10373:1;10369:12;10408:4;10405:1;10401:12;10443:3;10437:4;10433:14;10428:3;10425:23;10422:49;;;10451:18;;:::i;:::-;10487:13;;10302:204;-1:-1:-1;;;10302:204:1:o;10918:340::-;11120:2;11102:21;;;11159:2;11139:18;;;11132:30;-1:-1:-1;;;11193:2:1;11178:18;;11171:46;11249:2;11234:18;;10918:340::o;11473:184::-;11543:6;11596:2;11584:9;11575:7;11571:23;11567:32;11564:52;;;11612:1;11609;11602:12;11564:52;-1:-1:-1;11635:16:1;;11473:184;-1:-1:-1;11473:184:1:o;11941:245::-;12008:6;12061:2;12049:9;12040:7;12036:23;12032:32;12029:52;;;12077:1;12074;12067:12;12029:52;12109:9;12103:16;12128:28;12150:5;12128:28;:::i;13479:545::-;13581:2;13576:3;13573:11;13570:448;;;13617:1;13642:5;13638:2;13631:17;13687:4;13683:2;13673:19;13757:2;13745:10;13741:19;13738:1;13734:27;13728:4;13724:38;13793:4;13781:10;13778:20;13775:47;;;-1:-1:-1;13816:4:1;13775:47;13871:2;13866:3;13862:12;13859:1;13855:20;13849:4;13845:31;13835:41;;13926:82;13944:2;13937:5;13934:13;13926:82;;;13989:17;;;13970:1;13959:13;13926:82;;14200:1352;14326:3;14320:10;14353:18;14345:6;14342:30;14339:56;;;14375:18;;:::i;:::-;14404:97;14494:6;14454:38;14486:4;14480:11;14454:38;:::i;:::-;14448:4;14404:97;:::i;:::-;14556:4;;14620:2;14609:14;;14637:1;14632:663;;;;15339:1;15356:6;15353:89;;;-1:-1:-1;15408:19:1;;;15402:26;15353:89;-1:-1:-1;;14157:1:1;14153:11;;;14149:24;14145:29;14135:40;14181:1;14177:11;;;14132:57;15455:81;;14602:944;;14632:663;13426:1;13419:14;;;13463:4;13450:18;;-1:-1:-1;;14668:20:1;;;14786:236;14800:7;14797:1;14794:14;14786:236;;;14889:19;;;14883:26;14868:42;;14981:27;;;;14949:1;14937:14;;;;14816:19;;14786:236;;;14790:3;15050:6;15041:7;15038:19;15035:201;;;15111:19;;;15105:26;-1:-1:-1;;15194:1:1;15190:14;;;15206:3;15186:24;15182:37;15178:42;15163:58;15148:74;;15035:201;-1:-1:-1;;;;;15282:1:1;15266:14;;;15262:22;15249:36;;-1:-1:-1;14200:1352:1:o;16260:135::-;16299:3;16320:17;;;16317:43;;16340:18;;:::i;:::-;-1:-1:-1;16387:1:1;16376:13;;16260:135::o;16400:607::-;-1:-1:-1;;;;;16759:15:1;;;16741:34;;16806:2;16791:18;;16784:34;;;;16849:2;16834:18;;16827:34;;;;16892:2;16877:18;;16870:34;;;;16941:15;;;16935:3;16920:19;;16913:44;16721:3;16973:19;;16966:35;;;;16690:3;16675:19;;16400:607::o;19153:251::-;19223:6;19276:2;19264:9;19255:7;19251:23;19247:32;19244:52;;;19292:1;19289;19282:12;19244:52;19324:9;19318:16;19343:31;19368:5;19343:31;:::i;19409:127::-;19470:10;19465:3;19461:20;19458:1;19451:31;19501:4;19498:1;19491:15;19525:4;19522:1;19515:15;19541:461;19594:3;19632:5;19626:12;19659:6;19654:3;19647:19;19685:4;19714:2;19709:3;19705:12;19698:19;;19751:2;19744:5;19740:14;19772:1;19782:195;19796:6;19793:1;19790:13;19782:195;;;19861:13;;-1:-1:-1;;;;;19857:39:1;19845:52;;19917:12;;;;19952:15;;;;19893:1;19811:9;19782:195;;;-1:-1:-1;19993:3:1;;19541:461;-1:-1:-1;;;;;19541:461:1:o;20007:510::-;20278:6;20267:9;20260:25;20321:3;20316:2;20305:9;20301:18;20294:31;20241:4;20342:57;20394:3;20383:9;20379:19;20371:6;20342:57;:::i;:::-;-1:-1:-1;;;;;20435:32:1;;;;20430:2;20415:18;;20408:60;-1:-1:-1;20499:2:1;20484:18;20477:34;20334:65;20007:510;-1:-1:-1;;20007:510:1:o;24345:582::-;24644:6;24633:9;24626:25;24687:6;24682:2;24671:9;24667:18;24660:34;24730:3;24725:2;24714:9;24710:18;24703:31;24607:4;24751:57;24803:3;24792:9;24788:19;24780:6;24751:57;:::i;:::-;-1:-1:-1;;;;;24844:32:1;;;;24839:2;24824:18;;24817:60;-1:-1:-1;24908:3:1;24893:19;24886:35;24743:65;24345:582;-1:-1:-1;;;24345:582:1:o;24932:306::-;25020:6;25028;25036;25089:2;25077:9;25068:7;25064:23;25060:32;25057:52;;;25105:1;25102;25095:12;25057:52;25134:9;25128:16;25118:26;;25184:2;25173:9;25169:18;25163:25;25153:35;;25228:2;25217:9;25213:18;25207:25;25197:35;;24932:306;;;;;:::o;25243:127::-;25304:10;25299:3;25295:20;25292:1;25285:31;25335:4;25332:1;25325:15;25359:4;25356:1;25349:15
Swarm Source
ipfs://22badab2831e4d438794881c2981cb222ee6783abd1a502735c73de0d9b32550
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.