BscScan - Sponsored slots available. Book your slot here!
Latest 25 from a total of 12,885 transactions
| Transaction Hash |
|
Block
|
From
|
To
|
|||||
|---|---|---|---|---|---|---|---|---|---|
| Approve | 92585703 | 35 mins ago | IN | 0 BNB | 0.00000932 | ||||
| Approve | 92568136 | 2 hrs ago | IN | 0 BNB | 0.00000159 | ||||
| Transfer | 92498975 | 11 hrs ago | IN | 0 BNB | 0.00000653 | ||||
| Transfer | 92498460 | 11 hrs ago | IN | 0 BNB | 0.00000457 | ||||
| Transfer | 92495136 | 11 hrs ago | IN | 0 BNB | 0.00000762 | ||||
| Transfer | 92481413 | 13 hrs ago | IN | 0 BNB | 0.00000381 | ||||
| Transfer | 92470901 | 14 hrs ago | IN | 0 BNB | 0.00000762 | ||||
| Approve | 92457173 | 16 hrs ago | IN | 0 BNB | 0.00000466 | ||||
| Transfer | 92428989 | 20 hrs ago | IN | 0 BNB | 0.00000495 | ||||
| Transfer | 92374104 | 27 hrs ago | IN | 0 BNB | 0.00080971 | ||||
| Approve | 92274105 | 39 hrs ago | IN | 0 BNB | 0.00000932 | ||||
| Approve | 92192678 | 2 days ago | IN | 0 BNB | 0.00000231 | ||||
| Transfer | 92071311 | 2 days ago | IN | 0 BNB | 0.00000531 | ||||
| Transfer | 92070983 | 2 days ago | IN | 0 BNB | 0.00000421 | ||||
| Transfer | 92069315 | 2 days ago | IN | 0 BNB | 0.00000387 | ||||
| Transfer | 92069116 | 2 days ago | IN | 0 BNB | 0.0000038 | ||||
| Approve | 92058247 | 2 days ago | IN | 0 BNB | 0.00000243 | ||||
| Transfer | 91991035 | 3 days ago | IN | 0 BNB | 0.00000447 | ||||
| Approve | 91971856 | 3 days ago | IN | 0 BNB | 0.00000231 | ||||
| Approve | 91953840 | 3 days ago | IN | 0 BNB | 0.00000231 | ||||
| Transfer | 91918496 | 3 days ago | IN | 0 BNB | 0.00000429 | ||||
| Transfer | 91843607 | 3 days ago | IN | 0 BNB | 0.00007694 | ||||
| Approve | 91790534 | 4 days ago | IN | 0 BNB | 0.00000233 | ||||
| Transfer | 91779873 | 4 days ago | IN | 0 BNB | 0.00000303 | ||||
| Approve | 91669184 | 4 days ago | IN | 0 BNB | 0.00000233 |
Cross-Chain Transactions
Loading...
Loading
Contract Name:
LovePot
Compiler Version
v0.8.7+commit.e28d00a7
Contract Source Code (Solidity)
/**
*Submitted for verification at BscScan.com on 2021-09-13
*/
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.6;
// File: @uniswap/v2-core/contracts/interfaces/IUniswapV2Factory.sol
interface IUniswapV2Factory {
event PairCreated(address indexed token0, address indexed token1, address pair, uint);
function feeTo() external view returns (address);
function feeToSetter() external view returns (address);
function getPair(address tokenA, address tokenB) external view returns (address pair);
function allPairs(uint) external view returns (address pair);
function allPairsLength() external view returns (uint);
function createPair(address tokenA, address tokenB) external returns (address pair);
function setFeeTo(address) external;
function setFeeToSetter(address) external;
}
// File: @uniswap/v2-core/contracts/interfaces/IUniswapV2Pair.sol
interface IUniswapV2Pair {
event Approval(address indexed owner, address indexed spender, uint value);
event Transfer(address indexed from, address indexed to, uint value);
function name() external pure returns (string memory);
function symbol() external pure returns (string memory);
function decimals() external pure returns (uint8);
function totalSupply() external view returns (uint);
function balanceOf(address owner) external view returns (uint);
function allowance(address owner, address spender) external view returns (uint);
function approve(address spender, uint value) external returns (bool);
function transfer(address to, uint value) external returns (bool);
function transferFrom(address from, address to, uint value) external returns (bool);
function DOMAIN_SEPARATOR() external view returns (bytes32);
function PERMIT_TYPEHASH() external pure returns (bytes32);
function nonces(address owner) external view returns (uint);
function permit(address owner, address spender, uint value, uint deadline, uint8 v, bytes32 r, bytes32 s) external;
event Mint(address indexed sender, uint amount0, uint amount1);
event Burn(address indexed sender, uint amount0, uint amount1, address indexed to);
event Swap(
address indexed sender,
uint amount0In,
uint amount1In,
uint amount0Out,
uint amount1Out,
address indexed to
);
event Sync(uint112 reserve0, uint112 reserve1);
function MINIMUM_LIQUIDITY() external pure returns (uint);
function factory() external view returns (address);
function token0() external view returns (address);
function token1() external view returns (address);
function getReserves() external view returns (uint112 reserve0, uint112 reserve1, uint32 blockTimestampLast);
function price0CumulativeLast() external view returns (uint);
function price1CumulativeLast() external view returns (uint);
function kLast() external view returns (uint);
function mint(address to) external returns (uint liquidity);
function burn(address to) external returns (uint amount0, uint amount1);
function swap(uint amount0Out, uint amount1Out, address to, bytes calldata data) external;
function skim(address to) external;
function sync() external;
function initialize(address, address) external;
}
// File: @uniswap/v2-periphery/contracts/interfaces/IUniswapV2Router01.sol
interface IUniswapV2Router01 {
function factory() external pure returns (address);
function WETH() external pure returns (address);
function addLiquidity(
address tokenA,
address tokenB,
uint amountADesired,
uint amountBDesired,
uint amountAMin,
uint amountBMin,
address to,
uint deadline
) external returns (uint amountA, uint amountB, uint liquidity);
function addLiquidityETH(
address token,
uint amountTokenDesired,
uint amountTokenMin,
uint amountETHMin,
address to,
uint deadline
) external payable returns (uint amountToken, uint amountETH, uint liquidity);
function removeLiquidity(
address tokenA,
address tokenB,
uint liquidity,
uint amountAMin,
uint amountBMin,
address to,
uint deadline
) external returns (uint amountA, uint amountB);
function removeLiquidityETH(
address token,
uint liquidity,
uint amountTokenMin,
uint amountETHMin,
address to,
uint deadline
) external returns (uint amountToken, uint amountETH);
function removeLiquidityWithPermit(
address tokenA,
address tokenB,
uint liquidity,
uint amountAMin,
uint amountBMin,
address to,
uint deadline,
bool approveMax, uint8 v, bytes32 r, bytes32 s
) external returns (uint amountA, uint amountB);
function removeLiquidityETHWithPermit(
address token,
uint liquidity,
uint amountTokenMin,
uint amountETHMin,
address to,
uint deadline,
bool approveMax, uint8 v, bytes32 r, bytes32 s
) external returns (uint amountToken, uint amountETH);
function swapExactTokensForTokens(
uint amountIn,
uint amountOutMin,
address[] calldata path,
address to,
uint deadline
) external returns (uint[] memory amounts);
function swapTokensForExactTokens(
uint amountOut,
uint amountInMax,
address[] calldata path,
address to,
uint deadline
) external returns (uint[] memory amounts);
function swapExactETHForTokens(uint amountOutMin, address[] calldata path, address to, uint deadline)
external
payable
returns (uint[] memory amounts);
function swapTokensForExactETH(uint amountOut, uint amountInMax, address[] calldata path, address to, uint deadline)
external
returns (uint[] memory amounts);
function swapExactTokensForETH(uint amountIn, uint amountOutMin, address[] calldata path, address to, uint deadline)
external
returns (uint[] memory amounts);
function swapETHForExactTokens(uint amountOut, address[] calldata path, address to, uint deadline)
external
payable
returns (uint[] memory amounts);
function quote(uint amountA, uint reserveA, uint reserveB) external pure returns (uint amountB);
function getAmountOut(uint amountIn, uint reserveIn, uint reserveOut) external pure returns (uint amountOut);
function getAmountIn(uint amountOut, uint reserveIn, uint reserveOut) external pure returns (uint amountIn);
function getAmountsOut(uint amountIn, address[] calldata path) external view returns (uint[] memory amounts);
function getAmountsIn(uint amountOut, address[] calldata path) external view returns (uint[] memory amounts);
}
// File: @uniswap/v2-periphery/contracts/interfaces/IUniswapV2Router02.sol
interface IUniswapV2Router02 is IUniswapV2Router01 {
function removeLiquidityETHSupportingFeeOnTransferTokens(
address token,
uint liquidity,
uint amountTokenMin,
uint amountETHMin,
address to,
uint deadline
) external returns (uint amountETH);
function removeLiquidityETHWithPermitSupportingFeeOnTransferTokens(
address token,
uint liquidity,
uint amountTokenMin,
uint amountETHMin,
address to,
uint deadline,
bool approveMax, uint8 v, bytes32 r, bytes32 s
) external returns (uint amountETH);
function swapExactTokensForTokensSupportingFeeOnTransferTokens(
uint amountIn,
uint amountOutMin,
address[] calldata path,
address to,
uint deadline
) external;
function swapExactETHForTokensSupportingFeeOnTransferTokens(
uint amountOutMin,
address[] calldata path,
address to,
uint deadline
) external payable;
function swapExactTokensForETHSupportingFeeOnTransferTokens(
uint amountIn,
uint amountOutMin,
address[] calldata path,
address to,
uint deadline
) external;
}
// File: @openzeppelin/contracts/utils/Address.sol
/**
* @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);
}
}
}
}
// File: @openzeppelin/contracts/math/SafeMath.sol
/**
* @dev Wrappers over Solidity's arithmetic operations with added overflow
* checks.
*
* Arithmetic operations in Solidity wrap on overflow. This can easily result
* in bugs, because programmers usually assume that an overflow raises an
* error, which is the standard behavior in high level programming languages.
* `SafeMath` restores this intuition by reverting the transaction when an
* operation overflows.
*
* Using this library instead of the unchecked operations eliminates an entire
* class of bugs, so it's recommended to use it always.
*/
library SafeMath {
/**
* @dev Returns the addition of two unsigned integers, with an overflow flag.
*
* _Available since v3.4._
*/
function tryAdd(uint256 a, uint256 b) internal pure returns (bool, uint256) {
uint256 c = a + b;
if (c < a) return (false, 0);
return (true, c);
}
/**
* @dev Returns the substraction of two unsigned integers, with an overflow flag.
*
* _Available since v3.4._
*/
function trySub(uint256 a, uint256 b) internal pure returns (bool, uint256) {
if (b > a) return (false, 0);
return (true, a - b);
}
/**
* @dev Returns the multiplication of two unsigned integers, with an overflow flag.
*
* _Available since v3.4._
*/
function tryMul(uint256 a, uint256 b) internal pure returns (bool, uint256) {
// Gas optimization: this is cheaper than requiring 'a' not being zero, but the
// benefit is lost if 'b' is also tested.
// See: https://github.com/OpenZeppelin/openzeppelin-contracts/pull/522
if (a == 0) return (true, 0);
uint256 c = a * b;
if (c / a != b) return (false, 0);
return (true, c);
}
/**
* @dev Returns the division of two unsigned integers, with a division by zero flag.
*
* _Available since v3.4._
*/
function tryDiv(uint256 a, uint256 b) internal pure returns (bool, uint256) {
if (b == 0) return (false, 0);
return (true, a / b);
}
/**
* @dev Returns the remainder of dividing two unsigned integers, with a division by zero flag.
*
* _Available since v3.4._
*/
function tryMod(uint256 a, uint256 b) internal pure returns (bool, uint256) {
if (b == 0) return (false, 0);
return (true, a % b);
}
/**
* @dev Returns the addition of two unsigned integers, reverting on
* overflow.
*
* Counterpart to Solidity's `+` operator.
*
* Requirements:
*
* - Addition cannot overflow.
*/
function add(uint256 a, uint256 b) internal pure returns (uint256) {
uint256 c = a + b;
require(c >= a, "SafeMath: addition overflow");
return c;
}
/**
* @dev Returns the subtraction of two unsigned integers, reverting on
* overflow (when the result is negative).
*
* Counterpart to Solidity's `-` operator.
*
* Requirements:
*
* - Subtraction cannot overflow.
*/
function sub(uint256 a, uint256 b) internal pure returns (uint256) {
require(b <= a, "SafeMath: subtraction overflow");
return a - b;
}
/**
* @dev Returns the multiplication of two unsigned integers, reverting on
* overflow.
*
* Counterpart to Solidity's `*` operator.
*
* Requirements:
*
* - Multiplication cannot overflow.
*/
function mul(uint256 a, uint256 b) internal pure returns (uint256) {
if (a == 0) return 0;
uint256 c = a * b;
require(c / a == b, "SafeMath: multiplication overflow");
return c;
}
/**
* @dev Returns the integer division of two unsigned integers, reverting on
* division by zero. The result is rounded towards zero.
*
* Counterpart to Solidity's `/` operator. Note: this function uses a
* `revert` opcode (which leaves remaining gas untouched) while Solidity
* uses an invalid opcode to revert (consuming all remaining gas).
*
* Requirements:
*
* - The divisor cannot be zero.
*/
function div(uint256 a, uint256 b) internal pure returns (uint256) {
require(b > 0, "SafeMath: division by zero");
return a / b;
}
/**
* @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo),
* reverting when dividing by zero.
*
* Counterpart to Solidity's `%` operator. This function uses a `revert`
* opcode (which leaves remaining gas untouched) while Solidity uses an
* invalid opcode to revert (consuming all remaining gas).
*
* Requirements:
*
* - The divisor cannot be zero.
*/
function mod(uint256 a, uint256 b) internal pure returns (uint256) {
require(b > 0, "SafeMath: modulo by zero");
return a % b;
}
/**
* @dev Returns the subtraction of two unsigned integers, reverting with custom message on
* overflow (when the result is negative).
*
* CAUTION: This function is deprecated because it requires allocating memory for the error
* message unnecessarily. For custom revert reasons use {trySub}.
*
* Counterpart to Solidity's `-` operator.
*
* Requirements:
*
* - Subtraction cannot overflow.
*/
function sub(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) {
require(b <= a, errorMessage);
return a - b;
}
/**
* @dev Returns the integer division of two unsigned integers, reverting with custom message on
* division by zero. The result is rounded towards zero.
*
* CAUTION: This function is deprecated because it requires allocating memory for the error
* message unnecessarily. For custom revert reasons use {tryDiv}.
*
* Counterpart to Solidity's `/` operator. Note: this function uses a
* `revert` opcode (which leaves remaining gas untouched) while Solidity
* uses an invalid opcode to revert (consuming all remaining gas).
*
* Requirements:
*
* - The divisor cannot be zero.
*/
function div(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) {
require(b > 0, errorMessage);
return a / b;
}
/**
* @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo),
* reverting with custom message when dividing by zero.
*
* CAUTION: This function is deprecated because it requires allocating memory for the error
* message unnecessarily. For custom revert reasons use {tryMod}.
*
* Counterpart to Solidity's `%` operator. This function uses a `revert`
* opcode (which leaves remaining gas untouched) while Solidity uses an
* invalid opcode to revert (consuming all remaining gas).
*
* Requirements:
*
* - The divisor cannot be zero.
*/
function mod(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) {
require(b > 0, errorMessage);
return a % b;
}
}
interface IBEP20 {
/**
* @dev Returns the amount of tokens in existence.
*/
function totalSupply() external view returns (uint256);
/**
* @dev Returns the token decimals.
*/
function decimals() external view returns (uint8);
/**
* @dev Returns the token symbol.
*/
function symbol() external view returns (string memory);
/**
* @dev Returns the token name.
*/
function name() external view returns (string memory);
/**
* @dev Returns the bep token owner.
*/
function getOwner() external view returns (address);
/**
* @dev Returns the amount of tokens owned by `account`.
*/
function balanceOf(address account) external view returns (uint256);
/**
* @dev Moves `amount` tokens from the caller's account to `recipient`.
*
* Returns a boolean value indicating whether the operation succeeded.
*
* Emits a {Transfer} event.
*/
function transfer(address recipient, uint256 amount) external returns (bool);
/**
* @dev Returns the remaining number of tokens that `spender` will be
* allowed to spend on behalf of `owner` through {transferFrom}. This is
* zero by default.
*
* This value changes when {approve} or {transferFrom} are called.
*/
function allowance(address _owner, address spender) external view returns (uint256);
/**
* @dev Sets `amount` as the allowance of `spender` over the caller's tokens.
*
* Returns a boolean value indicating whether the operation succeeded.
*
* IMPORTANT: Beware that changing an allowance with this method brings the risk
* that someone may use both the old and the new allowance by unfortunate
* transaction ordering. One possible solution to mitigate this race
* condition is to first reduce the spender's allowance to 0 and set the
* desired value afterwards:
* https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729
*
* Emits an {Approval} event.
*/
function approve(address spender, uint256 amount) external returns (bool);
/**
* @dev Moves `amount` tokens from `sender` to `recipient` using the
* allowance mechanism. `amount` is then deducted from the caller's
* allowance.
*
* Returns a boolean value indicating whether the operation succeeded.
*
* Emits a {Transfer} event.
*/
function transferFrom(
address sender,
address recipient,
uint256 amount
) external returns (bool);
/**
* @dev Emitted when `value` tokens are moved from one account (`from`) to
* another (`to`).
*
* Note that `value` may be zero.
*/
event Transfer(address indexed from, address indexed to, uint256 value);
/**
* @dev Emitted when the allowance of a `spender` for an `owner` is set by
* a call to {approve}. `value` is the new allowance.
*/
event Approval(address indexed owner, address indexed spender, uint256 value);
}
// File: @openzeppelin/contracts/utils/Context.sol
/*
* @dev Provides information about the current execution context, including the
* sender of the transaction and its data. While these are generally available
* via msg.sender and msg.data, they should not be accessed in such a direct
* manner, since when dealing with GSN meta-transactions the account sending and
* paying for execution may not be the actual sender (as far as an application
* is concerned).
*
* This contract is only required for intermediate, library-like contracts.
*/
abstract contract Context {
function _msgSender() internal view virtual returns (address payable) {
return payable(msg.sender);
}
function _msgData() internal view virtual returns (bytes memory) {
this; // silence state mutability warning without generating bytecode - see https://github.com/ethereum/solidity/issues/2691
return msg.data;
}
}
// File: @openzeppelin/contracts/access/Ownable.sol
/**
* @dev Contract module which provides a basic access control mechanism, where
* there is an account (an owner) that can be granted exclusive access to
* specific functions.
*
* By default, the owner account will be the one that deploys the contract. This
* can later be changed with {transferOwnership}.
*
* This module is used through inheritance. It will make available the modifier
* `onlyOwner`, which can be applied to your functions to restrict their use to
* the owner.
*/
abstract contract Ownable is Context {
address private _owner;
event OwnershipTransferred(address indexed previousOwner, address indexed newOwner);
/**
* @dev Initializes the contract setting the deployer as the initial owner.
*/
constructor (){
address msgSender = _msgSender();
_owner = msgSender;
emit OwnershipTransferred(address(0), msgSender);
}
/**
* @dev Returns the address of the current owner.
*/
function owner() public view virtual returns (address) {
return _owner;
}
/**
* @dev Throws if called by any account other than the owner.
*/
modifier onlyOwner() {
require(owner() == _msgSender(), "Ownable: caller is not the owner");
_;
}
/**
* @dev Leaves the contract without owner. It will not be possible to call
* `onlyOwner` functions anymore. Can only be called by the current owner.
*
* NOTE: Renouncing ownership will leave the contract without an owner,
* thereby removing any functionality that is only available to the owner.
*/
function renounceOwnership() public virtual onlyOwner {
emit OwnershipTransferred(_owner, address(0));
_owner = address(0);
}
/**
* @dev Transfers ownership of the contract to a new account (`newOwner`).
* Can only be called by the current owner.
*/
function transferOwnership(address newOwner) public virtual onlyOwner {
require(newOwner != address(0), "Ownable: new owner is the zero address");
emit OwnershipTransferred(_owner, newOwner);
_owner = newOwner;
}
}
contract BEP20 is Context, IBEP20, Ownable {
using SafeMath for uint256;
using Address for address;
mapping(address => uint256) private _balances;
mapping(address => mapping(address => uint256)) private _allowances;
uint256 public _totalSupply;
string public _name;
string public _symbol;
uint8 public _decimals;
/**
* @dev Sets the values for {name} and {symbol}, initializes {decimals} with
* a default value of 18.
*
* To select a different value for {decimals}, use {_setupDecimals}.
*
* All three of these values are immutable: they can only be set once during
* construction.
*/
constructor(string memory Name, string memory Symbol){
_name = Name;
_symbol = Symbol;
_decimals = 18;
}
/**
* @dev Returns the bep token owner.
*/
function getOwner() external override view returns (address) {
return owner();
}
/**
* @dev Returns the token name.
*/
function name() public override view returns (string memory) {
return _name;
}
/**
* @dev Returns the token decimals.
*/
function decimals() public override view returns (uint8) {
return _decimals;
}
/**
* @dev Returns the token symbol.
*/
function symbol() public override view returns (string memory) {
return _symbol;
}
/**
* @dev See {BEP20-totalSupply}.
*/
function totalSupply() public override view returns (uint256) {
return _totalSupply;
}
/**
* @dev See {BEP20-balanceOf}.
*/
function balanceOf(address account) public override view returns (uint256) {
return _balances[account];
}
/**
* @dev See {BEP20-transfer}.
*
* Requirements:
*
* - `recipient` cannot be the zero address.
* - the caller must have a balance of at least `amount`.
*/
function transfer(address recipient, uint256 amount) public override returns (bool) {
_transfer(_msgSender(), recipient, amount);
return true;
}
/**
* @dev See {BEP20-allowance}.
*/
function allowance(address owner, address spender) public override view returns (uint256) {
return _allowances[owner][spender];
}
/**
* @dev See {BEP20-approve}.
*
* Requirements:
*
* - `spender` cannot be the zero address.
*/
function approve(address spender, uint256 amount) public override returns (bool) {
_approve(_msgSender(), spender, amount);
return true;
}
/**
* @dev See {BEP20-transferFrom}.
*
* Emits an {Approval} event indicating the updated allowance. This is not
* required by the EIP. See the note at the beginning of {BEP20};
*
* Requirements:
* - `sender` and `recipient` cannot be the zero address.
* - `sender` must have a balance of at least `amount`.
* - the caller must have allowance for `sender`'s tokens of at least
* `amount`.
*/
function transferFrom(
address sender,
address recipient,
uint256 amount
) public override returns (bool) {
_transfer(sender, recipient, amount);
_approve(
sender,
_msgSender(),
_allowances[sender][_msgSender()].sub(amount, "BEP20: transfer amount exceeds allowance")
);
return true;
}
/**
* @dev Atomically increases the allowance granted to `spender` by the caller.
*
* This is an alternative to {approve} that can be used as a mitigation for
* problems described in {BEP20-approve}.
*
* Emits an {Approval} event indicating the updated allowance.
*
* Requirements:
*
* - `spender` cannot be the zero address.
*/
function increaseAllowance(address spender, uint256 addedValue) public returns (bool) {
_approve(_msgSender(), spender, _allowances[_msgSender()][spender].add(addedValue));
return true;
}
/**
* @dev Atomically decreases the allowance granted to `spender` by the caller.
*
* This is an alternative to {approve} that can be used as a mitigation for
* problems described in {BEP20-approve}.
*
* Emits an {Approval} event indicating the updated allowance.
*
* Requirements:
*
* - `spender` cannot be the zero address.
* - `spender` must have allowance for the caller of at least
* `subtractedValue`.
*/
function decreaseAllowance(address spender, uint256 subtractedValue) public returns (bool) {
_approve(
_msgSender(),
spender,
_allowances[_msgSender()][spender].sub(subtractedValue, "BEP20: decreased allowance below zero")
);
return true;
}
/**
* @dev Creates `amount` tokens and assigns them to `msg.sender`, increasing
* the total supply.
*
* Requirements
*
* - `msg.sender` must be the token owner
*/
function mint(uint256 amount) public onlyOwner returns (bool) {
_mint(_msgSender(), amount);
return true;
}
/**
* @dev Moves tokens `amount` from `sender` to `recipient`.
*
* This is internal function is equivalent to {transfer}, and can be used to
* e.g. implement automatic token fees, slashing mechanisms, etc.
*
* Emits a {Transfer} event.
*
* Requirements:
*
* - `sender` cannot be the zero address.
* - `recipient` cannot be the zero address.
* - `sender` must have a balance of at least `amount`.
*/
function _transfer(
address sender,
address recipient,
uint256 amount
) internal virtual {
require(sender != address(0), "BEP20: transfer from the zero address");
require(recipient != address(0), "BEP20: transfer to the zero address");
_balances[sender] = _balances[sender].sub(amount, "BEP20: transfer amount exceeds balance");
_balances[recipient] = _balances[recipient].add(amount);
emit Transfer(sender, recipient, amount);
}
/** @dev Creates `amount` tokens and assigns them to `account`, increasing
* the total supply.
*
* Emits a {Transfer} event with `from` set to the zero address.
*
* Requirements
*
* - `to` cannot be the zero address.
*/
function _mint(address account, uint256 amount) internal {
require(account != address(0), "BEP20: mint to the zero address");
_totalSupply = _totalSupply.add(amount);
_balances[account] = _balances[account].add(amount);
emit Transfer(address(0), account, amount);
}
/**
* @dev Destroys `amount` tokens from `account`, reducing the
* total supply.
*
* Emits a {Transfer} event with `to` set to the zero address.
*
* Requirements
*
* - `account` cannot be the zero address.
* - `account` must have at least `amount` tokens.
*/
function _burn(address account, uint256 amount) internal {
require(account != address(0), "BEP20: burn from the zero address");
_balances[account] = _balances[account].sub(amount, "BEP20: burn amount exceeds balance");
_totalSupply = _totalSupply.sub(amount);
emit Transfer(account, address(0), amount);
}
/**
* @dev Sets `amount` as the allowance of `spender` over the `owner`s tokens.
*
* This is internal function is equivalent to `approve`, and can be used to
* e.g. set automatic allowances for certain subsystems, etc.
*
* Emits an {Approval} event.
*
* Requirements:
*
* - `owner` cannot be the zero address.
* - `spender` cannot be the zero address.
*/
function _approve(
address owner,
address spender,
uint256 amount
) internal {
require(owner != address(0), "BEP20: approve from the zero address");
require(spender != address(0), "BEP20: approve to the zero address");
_allowances[owner][spender] = amount;
emit Approval(owner, spender, amount);
}
/**
* @dev Destroys `amount` tokens from `account`.`amount` is then deducted
* from the caller's allowance.
*
* See {_burn} and {_approve}.
*/
function _burnFrom(address account, uint256 amount) internal {
_burn(account, amount);
_approve(
account,
_msgSender(),
_allowances[account][_msgSender()].sub(amount, "BEP20: burn amount exceeds allowance")
);
}
}
// LOVPTToken with Governance.
contract LovePot is BEP20 {
using SafeMath for uint256;
// Transfer tax rate in basis points. (default 1%)
uint16 public transferTaxRate = 100;
// Burn rate % of transfer tax. (default 20% x 5% = 1% of total amount).
uint16 public burnRate = 25;
// Max transfer tax rate: 10%.
uint16 public constant MAXIMUM_TRANSFER_TAX_RATE = 1000;
// Burn address
address public constant BURN_ADDRESS = 0x000000000000000000000000000000000000dEaD;
// Max transfer amount rate in basis points. (default is 0.5% of total supply)
uint16 public maxTransferAmountRate = 50;
// Addresses that excluded from antiWhale
mapping(address => bool) private _excludedFromAntiWhale;
// Automatic swap and liquify enabled
bool public swapAndLiquifyEnabled = false;
// Min amount to liquify. (default 500 LOVPTs)
uint256 public minAmountToLiquify = 500 ether;
// The swap router, modifiable. Will be changed to LOVPTSwap's router when our own AMM release
IUniswapV2Router02 public LOVPTSwapRouter;
// The trading pair
address public LOVPTSwapPair;
// In swap and liquify
bool private _inSwapAndLiquify;
// to control selling
bool public selling;
// to control buying
bool public buying;
// The operator can only update the transfer tax rate
address private _operator;
// Events
event OperatorTransferred(address indexed previousOperator, address indexed newOperator);
event TransferTaxRateUpdated(address indexed operator, uint256 previousRate, uint256 newRate);
event BurnRateUpdated(address indexed operator, uint256 previousRate, uint256 newRate);
event MaxTransferAmountRateUpdated(address indexed operator, uint256 previousRate, uint256 newRate);
event SwapAndLiquifyEnabledUpdated(address indexed operator, bool enabled);
event MinAmountToLiquifyUpdated(address indexed operator, uint256 previousAmount, uint256 newAmount);
event LOVPTSwapRouterUpdated(address indexed operator, address indexed router, address indexed pair);
event SwapAndLiquify(uint256 tokensSwapped, uint256 ethReceived, uint256 tokensIntoLiqudity);
modifier onlyOperator() {
require(_operator == msg.sender, "operator: caller is not the operator");
_;
}
modifier antiWhale(address sender, address recipient, uint256 amount) {
if (maxTransferAmount() > 0) {
if (
_excludedFromAntiWhale[sender] == false
&& _excludedFromAntiWhale[recipient] == false
) {
require(amount <= maxTransferAmount(), "LOVPT::antiWhale: Transfer amount exceeds the maxTransferAmount");
}
}
_;
}
modifier lockTheSwap {
_inSwapAndLiquify = true;
_;
_inSwapAndLiquify = false;
}
modifier transferTaxFree {
uint16 _transferTaxRate = transferTaxRate;
transferTaxRate = 0;
_;
transferTaxRate = _transferTaxRate;
}
/**
* @notice Constructs the LOVPTToken contract.
*/
constructor() BEP20("LovePot Token", "LOVE") {
_operator = _msgSender();
emit OperatorTransferred(address(0), _operator);
_excludedFromAntiWhale[msg.sender] = true;
_excludedFromAntiWhale[address(0)] = true;
_excludedFromAntiWhale[address(this)] = true;
_excludedFromAntiWhale[BURN_ADDRESS] = true;
}
/// @notice Creates `_amount` token to `_to`. Must only be called by the owner (MasterChef).
function mint(address _to, uint256 _amount) public onlyOwner {
_mint(_to, _amount);
_moveDelegates(address(0), _delegates[_to], _amount);
}
/// @notice Burns `_amount` token to `_to`. Must only be called by the operator.
function burn(address _to, uint256 _amount) public onlyOperator {
_burn(_to, _amount);
_moveDelegates(address(0), _delegates[_to], _amount);
}
/// @notice to enable or disable selling. Must only be called by the operator.
function setSelling(bool _state) public onlyOperator {
selling = _state;
}
/// @notice to enable or disable buying. Must only be called by the operator.
function setBuying(bool _state) public onlyOperator {
buying = _state;
}
/// @dev overrides transfer function to meet tokenomics of LOVPT
function _transfer(address sender, address recipient, uint256 amount) internal virtual override antiWhale(sender, recipient, amount) {
if(!selling && sender != owner()){
require(recipient != LOVPTSwapPair,"Selling disabled");
}
if(!buying && sender != owner()){
require(sender != LOVPTSwapPair,"Buying disabled");
}
// swap and liquify
if (
swapAndLiquifyEnabled == true
&& _inSwapAndLiquify == false
&& address(LOVPTSwapRouter) != address(0)
&& LOVPTSwapPair != address(0)
&& sender != LOVPTSwapPair
&& sender != owner()
) {
swapAndLiquify();
}
if (recipient == BURN_ADDRESS || transferTaxRate == 0) {
super._transfer(sender, recipient, amount);
} else {
// default tax is 1% of every transfer
uint256 taxAmount = amount.mul(transferTaxRate).div(10000);
uint256 burnAmount = taxAmount.mul(burnRate).div(100);
uint256 liquidityAmount = taxAmount.sub(burnAmount);
require(taxAmount == burnAmount + liquidityAmount, "LOVPT::transfer: Burn value invalid");
// default 99% of transfer sent to recipient
uint256 sendAmount = amount.sub(taxAmount);
require(amount == sendAmount + taxAmount, "LOVPT::transfer: Tax value invalid");
super._transfer(sender, BURN_ADDRESS, burnAmount);
super._transfer(sender, address(this), liquidityAmount);
super._transfer(sender, recipient, sendAmount);
amount = sendAmount;
}
}
/// @dev Swap and liquify
function swapAndLiquify() private lockTheSwap transferTaxFree {
uint256 contractTokenBalance = balanceOf(address(this));
uint256 _maxTransferAmount = maxTransferAmount();
contractTokenBalance = contractTokenBalance > _maxTransferAmount ? _maxTransferAmount : contractTokenBalance;
if (contractTokenBalance >= minAmountToLiquify) {
// only min amount to liquify
uint256 liquifyAmount = minAmountToLiquify;
// split the liquify amount into halves
uint256 half = liquifyAmount.div(2);
uint256 otherHalf = liquifyAmount.sub(half);
// capture the contract's current ETH balance.
// this is so that we can capture exactly the amount of ETH that the
// swap creates, and not make the liquidity event include any ETH that
// has been manually sent to the contract
uint256 initialBalance = address(this).balance;
// swap tokens for ETH
swapTokensForEth(half);
// how much ETH did we just swap into?
uint256 newBalance = address(this).balance.sub(initialBalance);
// add liquidity
addLiquidity(otherHalf, newBalance);
emit SwapAndLiquify(half, newBalance, otherHalf);
}
}
/// @dev Swap tokens for eth
function swapTokensForEth(uint256 tokenAmount) private {
// generate the LOVPTSwap pair path of token -> weth
address[] memory path = new address[](2);
path[0] = address(this);
path[1] = LOVPTSwapRouter.WETH();
_approve(address(this), address(LOVPTSwapRouter), tokenAmount);
// make the swap
LOVPTSwapRouter.swapExactTokensForETHSupportingFeeOnTransferTokens(
tokenAmount,
0, // accept any amount of ETH
path,
address(this),
block.timestamp
);
}
/// @dev Add liquidity
function addLiquidity(uint256 tokenAmount, uint256 ethAmount) private {
// approve token transfer to cover all possible scenarios
_approve(address(this), address(LOVPTSwapRouter), tokenAmount);
// add the liquidity
LOVPTSwapRouter.addLiquidityETH{value: ethAmount}(
address(this),
tokenAmount,
0, // slippage is unavoidable
0, // slippage is unavoidable
operator(),
block.timestamp
);
}
/**
* @dev Returns the max transfer amount.
*/
function maxTransferAmount() public view returns (uint256) {
return totalSupply().mul(maxTransferAmountRate).div(10000);
}
/**
* @dev Returns the address is excluded from antiWhale or not.
*/
function isExcludedFromAntiWhale(address _account) public view returns (bool) {
return _excludedFromAntiWhale[_account];
}
// To receive BNB from LOVPTSwapRouter when swapping
receive() external payable {}
/**
* @dev Update the transfer tax rate.
* Can only be called by the current operator.
*/
function updateTransferTaxRate(uint16 _transferTaxRate) public onlyOperator {
require(_transferTaxRate <= MAXIMUM_TRANSFER_TAX_RATE, "LOVPT::updateTransferTaxRate: Transfer tax rate must not exceed the maximum rate.");
emit TransferTaxRateUpdated(msg.sender, transferTaxRate, _transferTaxRate);
transferTaxRate = _transferTaxRate;
}
/**
* @dev Update the burn rate.
* Can only be called by the current operator.
*/
function updateBurnRate(uint16 _burnRate) public onlyOperator {
require(_burnRate <= 100, "LOVPT::updateBurnRate: Burn rate must not exceed the maximum rate.");
emit BurnRateUpdated(msg.sender, burnRate, _burnRate);
burnRate = _burnRate;
}
/**
* @dev Update the max transfer amount rate.
* Can only be called by the current operator.
*/
function updateMaxTransferAmountRate(uint16 _maxTransferAmountRate) public onlyOperator {
require(_maxTransferAmountRate <= 10000, "LOVPT::updateMaxTransferAmountRate: Max transfer amount rate must not exceed the maximum rate.");
emit MaxTransferAmountRateUpdated(msg.sender, maxTransferAmountRate, _maxTransferAmountRate);
maxTransferAmountRate = _maxTransferAmountRate;
}
/**
* @dev Update the min amount to liquify.
* Can only be called by the current operator.
*/
function updateMinAmountToLiquify(uint256 _minAmount) public onlyOperator {
emit MinAmountToLiquifyUpdated(msg.sender, minAmountToLiquify, _minAmount);
minAmountToLiquify = _minAmount;
}
/**
* @dev Exclude or include an address from antiWhale.
* Can only be called by the current operator.
*/
function setExcludedFromAntiWhale(address _account, bool _excluded) public onlyOperator {
_excludedFromAntiWhale[_account] = _excluded;
}
/**
* @dev Update the swapAndLiquifyEnabled.
* Can only be called by the current operator.
*/
function updateSwapAndLiquifyEnabled(bool _enabled) public onlyOperator {
emit SwapAndLiquifyEnabledUpdated(msg.sender, _enabled);
swapAndLiquifyEnabled = _enabled;
}
/**
* @dev Update the swap router.
* Can only be called by the current operator.
*/
function updateLOVPTSwapRouter(address _router) public onlyOperator {
LOVPTSwapRouter = IUniswapV2Router02(_router);
LOVPTSwapPair = IUniswapV2Factory(LOVPTSwapRouter.factory()).getPair(address(this), LOVPTSwapRouter.WETH());
require(LOVPTSwapPair != address(0), "LOVPT::updateLOVPTSwapRouter: Invalid pair address.");
emit LOVPTSwapRouterUpdated(msg.sender, address(LOVPTSwapRouter), LOVPTSwapPair);
}
/**
* @dev Returns the address of the current operator.
*/
function operator() public view returns (address) {
return _operator;
}
/**
* @dev Transfers operator of the contract to a new account (`newOperator`).
* Can only be called by the current operator.
*/
function transferOperator(address newOperator) public onlyOperator {
require(newOperator != address(0), "LOVPT::transferOperator: new operator is the zero address");
emit OperatorTransferred(_operator, newOperator);
_operator = newOperator;
}
// Copied and modified from YAM code:
// https://github.com/yam-finance/yam-protocol/blob/master/contracts/token/YAMGovernanceStorage.sol
// https://github.com/yam-finance/yam-protocol/blob/master/contracts/token/YAMGovernance.sol
// Which is copied and modified from COMPOUND:
// https://github.com/compound-finance/compound-protocol/blob/master/contracts/Governance/Comp.sol
/// @dev A record of each accounts delegate
mapping (address => address) internal _delegates;
/// @notice A checkpoint for marking number of votes from a given block
struct Checkpoint {
uint32 fromBlock;
uint256 votes;
}
/// @notice A record of votes checkpoints for each account, by index
mapping (address => mapping (uint32 => Checkpoint)) public checkpoints;
/// @notice The number of checkpoints for each account
mapping (address => uint32) public numCheckpoints;
/// @notice The EIP-712 typehash for the contract's domain
bytes32 public constant DOMAIN_TYPEHASH = keccak256("EIP712Domain(string name,uint256 chainId,address verifyingContract)");
/// @notice The EIP-712 typehash for the delegation struct used by the contract
bytes32 public constant DELEGATION_TYPEHASH = keccak256("Delegation(address delegatee,uint256 nonce,uint256 expiry)");
/// @notice A record of states for signing / validating signatures
mapping (address => uint) public nonces;
/// @notice An event thats emitted when an account changes its delegate
event DelegateChanged(address indexed delegator, address indexed fromDelegate, address indexed toDelegate);
/// @notice An event thats emitted when a delegate account's vote balance changes
event DelegateVotesChanged(address indexed delegate, uint previousBalance, uint newBalance);
/**
* @notice Delegate votes from `msg.sender` to `delegatee`
* @param delegator The address to get delegatee for
*/
function delegates(address delegator)
external
view
returns (address)
{
return _delegates[delegator];
}
/**
* @notice Delegate votes from `msg.sender` to `delegatee`
* @param delegatee The address to delegate votes to
*/
function delegate(address delegatee) external {
return _delegate(msg.sender, delegatee);
}
/**
* @notice Delegates votes from signatory to `delegatee`
* @param delegatee The address to delegate votes to
* @param nonce The contract state required to match the signature
* @param expiry The time at which to expire the signature
* @param v The recovery byte of the signature
* @param r Half of the ECDSA signature pair
* @param s Half of the ECDSA signature pair
*/
function delegateBySig(
address delegatee,
uint nonce,
uint expiry,
uint8 v,
bytes32 r,
bytes32 s
)
external
{
bytes32 domainSeparator = keccak256(
abi.encode(
DOMAIN_TYPEHASH,
keccak256(bytes(name())),
getChainId(),
address(this)
)
);
bytes32 structHash = keccak256(
abi.encode(
DELEGATION_TYPEHASH,
delegatee,
nonce,
expiry
)
);
bytes32 digest = keccak256(
abi.encodePacked(
"\x19\x01",
domainSeparator,
structHash
)
);
address signatory = ecrecover(digest, v, r, s);
require(signatory != address(0), "LOVPT::delegateBySig: invalid signature");
require(nonce == nonces[signatory]++, "LOVPT::delegateBySig: invalid nonce");
require(block.timestamp <= expiry, "LOVPT::delegateBySig: signature expired");
return _delegate(signatory, delegatee);
}
/**
* @notice Gets the current votes balance for `account`
* @param account The address to get votes balance
* @return The number of current votes for `account`
*/
function getCurrentVotes(address account)
external
view
returns (uint256)
{
uint32 nCheckpoints = numCheckpoints[account];
return nCheckpoints > 0 ? checkpoints[account][nCheckpoints - 1].votes : 0;
}
/**
* @notice Determine the prior number of votes for an account as of a block number
* @dev Block number must be a finalized block or else this function will revert to prevent misinformation.
* @param account The address of the account to check
* @param blockNumber The block number to get the vote balance at
* @return The number of votes the account had as of the given block
*/
function getPriorVotes(address account, uint blockNumber)
external
view
returns (uint256)
{
require(blockNumber < block.number, "LOVPT::getPriorVotes: not yet determined");
uint32 nCheckpoints = numCheckpoints[account];
if (nCheckpoints == 0) {
return 0;
}
// First check most recent balance
if (checkpoints[account][nCheckpoints - 1].fromBlock <= blockNumber) {
return checkpoints[account][nCheckpoints - 1].votes;
}
// Next check implicit zero balance
if (checkpoints[account][0].fromBlock > blockNumber) {
return 0;
}
uint32 lower = 0;
uint32 upper = nCheckpoints - 1;
while (upper > lower) {
uint32 center = upper - (upper - lower) / 2; // ceil, avoiding overflow
Checkpoint memory cp = checkpoints[account][center];
if (cp.fromBlock == blockNumber) {
return cp.votes;
} else if (cp.fromBlock < blockNumber) {
lower = center;
} else {
upper = center - 1;
}
}
return checkpoints[account][lower].votes;
}
function _delegate(address delegator, address delegatee)
internal
{
address currentDelegate = _delegates[delegator];
uint256 delegatorBalance = balanceOf(delegator); // balance of underlying LOVPTs (not scaled);
_delegates[delegator] = delegatee;
emit DelegateChanged(delegator, currentDelegate, delegatee);
_moveDelegates(currentDelegate, delegatee, delegatorBalance);
}
function _moveDelegates(address srcRep, address dstRep, uint256 amount) internal {
if (srcRep != dstRep && amount > 0) {
if (srcRep != address(0)) {
// decrease old representative
uint32 srcRepNum = numCheckpoints[srcRep];
uint256 srcRepOld = srcRepNum > 0 ? checkpoints[srcRep][srcRepNum - 1].votes : 0;
uint256 srcRepNew = srcRepOld.sub(amount);
_writeCheckpoint(srcRep, srcRepNum, srcRepOld, srcRepNew);
}
if (dstRep != address(0)) {
// increase new representative
uint32 dstRepNum = numCheckpoints[dstRep];
uint256 dstRepOld = dstRepNum > 0 ? checkpoints[dstRep][dstRepNum - 1].votes : 0;
uint256 dstRepNew = dstRepOld.add(amount);
_writeCheckpoint(dstRep, dstRepNum, dstRepOld, dstRepNew);
}
}
}
function _writeCheckpoint(
address delegatee,
uint32 nCheckpoints,
uint256 oldVotes,
uint256 newVotes
)
internal
{
uint32 blockNumber = safe32(block.number, "LOVPT::_writeCheckpoint: block number exceeds 32 bits");
if (nCheckpoints > 0 && checkpoints[delegatee][nCheckpoints - 1].fromBlock == blockNumber) {
checkpoints[delegatee][nCheckpoints - 1].votes = newVotes;
} else {
checkpoints[delegatee][nCheckpoints] = Checkpoint(blockNumber, newVotes);
numCheckpoints[delegatee] = nCheckpoints + 1;
}
emit DelegateVotesChanged(delegatee, oldVotes, newVotes);
}
function safe32(uint n, string memory errorMessage) internal pure returns (uint32) {
require(n < 2**32, errorMessage);
return uint32(n);
}
function getChainId() internal view returns (uint) {
uint256 chainId;
assembly { chainId := chainid() }
return chainId;
}
}Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
Contract ABI
API[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"spender","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":false,"internalType":"uint256","name":"previousRate","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"newRate","type":"uint256"}],"name":"BurnRateUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"delegator","type":"address"},{"indexed":true,"internalType":"address","name":"fromDelegate","type":"address"},{"indexed":true,"internalType":"address","name":"toDelegate","type":"address"}],"name":"DelegateChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"delegate","type":"address"},{"indexed":false,"internalType":"uint256","name":"previousBalance","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"newBalance","type":"uint256"}],"name":"DelegateVotesChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":true,"internalType":"address","name":"router","type":"address"},{"indexed":true,"internalType":"address","name":"pair","type":"address"}],"name":"LOVPTSwapRouterUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":false,"internalType":"uint256","name":"previousRate","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"newRate","type":"uint256"}],"name":"MaxTransferAmountRateUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":false,"internalType":"uint256","name":"previousAmount","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"newAmount","type":"uint256"}],"name":"MinAmountToLiquifyUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOperator","type":"address"},{"indexed":true,"internalType":"address","name":"newOperator","type":"address"}],"name":"OperatorTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"tokensSwapped","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"ethReceived","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"tokensIntoLiqudity","type":"uint256"}],"name":"SwapAndLiquify","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":false,"internalType":"bool","name":"enabled","type":"bool"}],"name":"SwapAndLiquifyEnabledUpdated","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":"operator","type":"address"},{"indexed":false,"internalType":"uint256","name":"previousRate","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"newRate","type":"uint256"}],"name":"TransferTaxRateUpdated","type":"event"},{"inputs":[],"name":"BURN_ADDRESS","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"DELEGATION_TYPEHASH","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"DOMAIN_TYPEHASH","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"LOVPTSwapPair","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"LOVPTSwapRouter","outputs":[{"internalType":"contract IUniswapV2Router02","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MAXIMUM_TRANSFER_TAX_RATE","outputs":[{"internalType":"uint16","name":"","type":"uint16"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"_decimals","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":"_symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"_totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"spender","type":"address"}],"name":"allowance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"approve","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_to","type":"address"},{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"burn","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"burnRate","outputs":[{"internalType":"uint16","name":"","type":"uint16"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"buying","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"uint32","name":"","type":"uint32"}],"name":"checkpoints","outputs":[{"internalType":"uint32","name":"fromBlock","type":"uint32"},{"internalType":"uint256","name":"votes","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"decimals","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"subtractedValue","type":"uint256"}],"name":"decreaseAllowance","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"delegatee","type":"address"}],"name":"delegate","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"delegatee","type":"address"},{"internalType":"uint256","name":"nonce","type":"uint256"},{"internalType":"uint256","name":"expiry","type":"uint256"},{"internalType":"uint8","name":"v","type":"uint8"},{"internalType":"bytes32","name":"r","type":"bytes32"},{"internalType":"bytes32","name":"s","type":"bytes32"}],"name":"delegateBySig","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"delegator","type":"address"}],"name":"delegates","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"getCurrentVotes","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getOwner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"uint256","name":"blockNumber","type":"uint256"}],"name":"getPriorVotes","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":"_account","type":"address"}],"name":"isExcludedFromAntiWhale","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxTransferAmount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxTransferAmountRate","outputs":[{"internalType":"uint16","name":"","type":"uint16"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"minAmountToLiquify","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_to","type":"address"},{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"mint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"mint","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"nonces","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"numCheckpoints","outputs":[{"internalType":"uint32","name":"","type":"uint32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"operator","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"selling","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bool","name":"_state","type":"bool"}],"name":"setBuying","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_account","type":"address"},{"internalType":"bool","name":"_excluded","type":"bool"}],"name":"setExcludedFromAntiWhale","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"_state","type":"bool"}],"name":"setSelling","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"swapAndLiquifyEnabled","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"recipient","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transfer","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"sender","type":"address"},{"internalType":"address","name":"recipient","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transferFrom","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOperator","type":"address"}],"name":"transferOperator","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"transferTaxRate","outputs":[{"internalType":"uint16","name":"","type":"uint16"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint16","name":"_burnRate","type":"uint16"}],"name":"updateBurnRate","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_router","type":"address"}],"name":"updateLOVPTSwapRouter","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint16","name":"_maxTransferAmountRate","type":"uint16"}],"name":"updateMaxTransferAmountRate","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_minAmount","type":"uint256"}],"name":"updateMinAmountToLiquify","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"_enabled","type":"bool"}],"name":"updateSwapAndLiquifyEnabled","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint16","name":"_transferTaxRate","type":"uint16"}],"name":"updateTransferTaxRate","outputs":[],"stateMutability":"nonpayable","type":"function"},{"stateMutability":"payable","type":"receive"}]Contract Creation Code
60806040526006805466ffffffffffff001916653200190064001790556008805460ff19169055681b1ae4d6e2ef5000006009553480156200004057600080fd5b506040518060400160405280600d81526020016c2637bb32a837ba102a37b5b2b760991b815250604051806040016040528060048152602001634c4f564560e01b815250600062000096620001fa60201b60201c565b600080546001600160a01b0319166001600160a01b0383169081178255604051929350917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908290a3508151620000f5906004906020850190620001fe565b5080516200010b906005906020840190620001fe565b50506006805460ff1916601217905550620001233390565b600c80546001600160a01b0319166001600160a01b039290921691821790556040516000907f74da04524d50c64947f5dd5381ef1a4dca5cba8ed1d816243f9e48aa0b5617ed908290a3336000908152600760205260408082208054600160ff1991821681179092557f6d5257204ebe7d88fd91ae87941cb2dd9d8062b64ae5a2bd2d28ec40b9fbf6df8054821683179055308452918320805483168217905561dead9092527fb0c2646e02af70b79e3fe9277b98373379f54150e4e26b2b5650139f7a75a65d80549091169091179055620002e1565b3390565b8280546200020c90620002a4565b90600052602060002090601f0160209004810192826200023057600085556200027b565b82601f106200024b57805160ff19168380011785556200027b565b828001600101855582156200027b579182015b828111156200027b5782518255916020019190600101906200025e565b50620002899291506200028d565b5090565b5b808211156200028957600081556001016200028e565b600181811c90821680620002b957607f821691505b60208210811415620002db57634e487b7160e01b600052602260045260246000fd5b50919050565b6135f880620002f16000396000f3fe60806040526004361061036f5760003560e01c8063893d20e8116101c6578063bed99850116100f7578063f1127ed811610095578063f62228071161006f578063f622280714610ad4578063fb37ef5714610af4578063fccc281314610b14578063fce3bbb514610b2a57600080fd5b8063f1127ed814610a30578063f2fde38b14610a94578063f607f2b414610ab457600080fd5b8063d28d8852116100d1578063d28d88521461098b578063d8248358146109a0578063dd62ed3e146109b6578063e7a324dc146109fc57600080fd5b8063bed9985014610929578063c3cda5201461094b578063c7f59a671461096b57600080fd5b8063a392e67411610164578063a9e757231161013e578063a9e75723146108bf578063b09f1266146108d4578063b4b5ea57146108e9578063b65d08b01461090957600080fd5b8063a392e6741461085f578063a457c2d71461087f578063a9059cbb1461089f57600080fd5b806395d89b41116101a057806395d89b41146107ea5780639dc29fac146107ff5780639f9a4e7f1461081f578063a0712d681461083f57600080fd5b8063893d20e8146107ab5780638da5cb5b146107ab578063928bc6a0146107c957600080fd5b80633ff8bf2e116102a05780636a141e2c1161023e578063715018a611610218578063715018a614610729578063782d6fe11461073e5780637b895dfc1461075e5780637ecebe001461077e57600080fd5b80636a141e2c1461068b5780636fcfff45146106ab57806370a08231146106f357600080fd5b8063570ca7351161027a578063570ca735146105e0578063587cde1e146106125780635c19a95c1461064b5780635d2a4fdd1461066b57600080fd5b80633ff8bf2e1461058457806340c10f19146105a65780634a74bb02146105c657600080fd5b8063269f534c1161030d57806332424aa3116102e757806332424aa314610514578063376c23911461052e578063395093511461054e5780633eaaf86b1461056e57600080fd5b8063269f534c1461049357806329605e77146104cc578063313ce567146104ee57600080fd5b80631ad9339a116103495780631ad9339a146103f557806320606b701461041e57806323aed2281461045257806323b872dd1461047357600080fd5b806306fdde031461037b578063095ea7b3146103a657806318160ddd146103d657600080fd5b3661037657005b600080fd5b34801561038757600080fd5b50610390610b4a565b60405161039d919061323a565b60405180910390f35b3480156103b257600080fd5b506103c66103c13660046130ef565b610bdc565b604051901515815260200161039d565b3480156103e257600080fd5b506003545b60405190815260200161039d565b34801561040157600080fd5b5061040b6103e881565b60405161ffff909116815260200161039d565b34801561042a57600080fd5b506103e77f8cad95687ba82c2ce50e74f7b754645e5117c3a5bec8151c0726d5857980a86681565b34801561045e57600080fd5b50600b546103c690600160a81b900460ff1681565b34801561047f57600080fd5b506103c661048e366004613079565b610bf3565b34801561049f57600080fd5b506103c66104ae366004613006565b6001600160a01b031660009081526007602052604090205460ff1690565b3480156104d857600080fd5b506104ec6104e7366004613006565b610c5c565b005b3480156104fa57600080fd5b5060065460ff165b60405160ff909116815260200161039d565b34801561052057600080fd5b506006546105029060ff1681565b34801561053a57600080fd5b506104ec6105493660046131cf565b610d67565b34801561055a57600080fd5b506103c66105693660046130ef565b610e8e565b34801561057a57600080fd5b506103e760035481565b34801561059057600080fd5b5060065461040b90600160281b900461ffff1681565b3480156105b257600080fd5b506104ec6105c13660046130ef565b610ec4565b3480156105d257600080fd5b506008546103c69060ff1681565b3480156105ec57600080fd5b50600c546001600160a01b03165b6040516001600160a01b03909116815260200161039d565b34801561061e57600080fd5b506105fa61062d366004613006565b6001600160a01b039081166000908152600d60205260409020541690565b34801561065757600080fd5b506104ec610666366004613006565b610f21565b34801561067757600080fd5b50600b546105fa906001600160a01b031681565b34801561069757600080fd5b506104ec6106a63660046131cf565b610f2e565b3480156106b757600080fd5b506106de6106c6366004613006565b600f6020526000908152604090205463ffffffff1681565b60405163ffffffff909116815260200161039d565b3480156106ff57600080fd5b506103e761070e366004613006565b6001600160a01b031660009081526001602052604090205490565b34801561073557600080fd5b506104ec611069565b34801561074a57600080fd5b506103e76107593660046130ef565b6110dd565b34801561076a57600080fd5b50600a546105fa906001600160a01b031681565b34801561078a57600080fd5b506103e7610799366004613006565b60106020526000908152604090205481565b3480156107b757600080fd5b506000546001600160a01b03166105fa565b3480156107d557600080fd5b50600b546103c690600160b01b900460ff1681565b3480156107f657600080fd5b50610390611348565b34801561080b57600080fd5b506104ec61081a3660046130ef565b611357565b34801561082b57600080fd5b506104ec61083a3660046131b4565b61138b565b34801561084b57600080fd5b506103c661085a3660046131f3565b6113ff565b34801561086b57600080fd5b506104ec61087a3660046131f3565b61143d565b34801561088b57600080fd5b506103c661089a3660046130ef565b6114aa565b3480156108ab57600080fd5b506103c66108ba3660046130ef565b6114f9565b3480156108cb57600080fd5b506103e7611506565b3480156108e057600080fd5b50610390611539565b3480156108f557600080fd5b506103e7610904366004613006565b6115c7565b34801561091557600080fd5b5060065461040b90610100900461ffff1681565b34801561093557600080fd5b5060065461040b906301000000900461ffff1681565b34801561095757600080fd5b506104ec61096636600461311b565b61163c565b34801561097757600080fd5b506104ec6109863660046130ba565b61190d565b34801561099757600080fd5b50610390611962565b3480156109ac57600080fd5b506103e760095481565b3480156109c257600080fd5b506103e76109d1366004613040565b6001600160a01b03918216600090815260026020908152604080832093909416825291909152205490565b348015610a0857600080fd5b506103e77fe48329057bfd03d55e49b547132e39cffd9c1820ad7b9d4c5307691425d15adf81565b348015610a3c57600080fd5b50610a78610a4b36600461317d565b600e6020908152600092835260408084209091529082529020805460019091015463ffffffff9091169082565b6040805163ffffffff909316835260208301919091520161039d565b348015610aa057600080fd5b506104ec610aaf366004613006565b61196f565b348015610ac057600080fd5b506104ec610acf3660046131cf565b611a59565b348015610ae057600080fd5b506104ec610aef3660046131b4565b611b76565b348015610b0057600080fd5b506104ec610b0f366004613006565b611bbe565b348015610b2057600080fd5b506105fa61dead81565b348015610b3657600080fd5b506104ec610b453660046131b4565b611e52565b606060048054610b599061344b565b80601f0160208091040260200160405190810160405280929190818152602001828054610b859061344b565b8015610bd25780601f10610ba757610100808354040283529160200191610bd2565b820191906000526020600020905b815481529060010190602001808311610bb557829003601f168201915b5050505050905090565b6000610be9338484611e9a565b5060015b92915050565b6000610c00848484611fbf565b610c528433610c4d856040518060600160405280602881526020016134f9602891396001600160a01b038a16600090815260026020908152604080832033845290915290205491906123a6565b611e9a565b5060019392505050565b600c546001600160a01b03163314610c8f5760405162461bcd60e51b8152600401610c86906132c4565b60405180910390fd5b6001600160a01b038116610d0b5760405162461bcd60e51b815260206004820152603960248201527f4c4f5650543a3a7472616e736665724f70657261746f723a206e6577206f706560448201527f7261746f7220697320746865207a65726f2061646472657373000000000000006064820152608401610c86565b600c546040516001600160a01b038084169216907f74da04524d50c64947f5dd5381ef1a4dca5cba8ed1d816243f9e48aa0b5617ed90600090a3600c80546001600160a01b0319166001600160a01b0392909216919091179055565b600c546001600160a01b03163314610d915760405162461bcd60e51b8152600401610c86906132c4565b6103e861ffff82161115610e275760405162461bcd60e51b815260206004820152605160248201527f4c4f5650543a3a7570646174655472616e73666572546178526174653a20547260448201527f616e73666572207461782072617465206d757374206e6f7420657863656564206064820152703a34329036b0bc34b6bab6903930ba329760791b608482015260a401610c86565b6006546040805161010090920461ffff90811683528316602083015233917fe9d5c8ee2a65d4fb859c680669d8f902172d53e3f15f9f11108a31bbada4b70b910160405180910390a26006805461ffff9092166101000262ffff0019909216919091179055565b3360008181526002602090815260408083206001600160a01b03871684529091528120549091610be9918590610c4d90866123dd565b6000546001600160a01b03163314610eee5760405162461bcd60e51b8152600401610c869061328f565b610ef8828261243c565b6001600160a01b038083166000908152600d6020526040812054610f1d921683612522565b5050565b610f2b3382612686565b50565b600c546001600160a01b03163314610f585760405162461bcd60e51b8152600401610c86906132c4565b6127108161ffff161115610ffa5760405162461bcd60e51b815260206004820152605e60248201527f4c4f5650543a3a7570646174654d61785472616e73666572416d6f756e74526160448201527f74653a204d6178207472616e7366657220616d6f756e742072617465206d757360648201527f74206e6f742065786365656420746865206d6178696d756d20726174652e0000608482015260a401610c86565b60065460408051600160281b90920461ffff90811683528316602083015233917fb62a50fc861a770636e85357becb3b82a32e911106609d4985871eaf29011e08910160405180910390a26006805461ffff909216600160281b0266ffff000000000019909216919091179055565b6000546001600160a01b031633146110935760405162461bcd60e51b8152600401610c869061328f565b600080546040516001600160a01b03909116907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908390a3600080546001600160a01b0319169055565b600043821061113f5760405162461bcd60e51b815260206004820152602860248201527f4c4f5650543a3a6765745072696f72566f7465733a206e6f74207965742064656044820152671d195c9b5a5b995960c21b6064820152608401610c86565b6001600160a01b0383166000908152600f602052604090205463ffffffff168061116d576000915050610bed565b6001600160a01b0384166000908152600e602052604081208491611192600185613426565b63ffffffff908116825260208201929092526040016000205416116111fb576001600160a01b0384166000908152600e60205260408120906111d5600184613426565b63ffffffff1663ffffffff16815260200190815260200160002060010154915050610bed565b6001600160a01b0384166000908152600e6020908152604080832083805290915290205463ffffffff16831015611236576000915050610bed565b600080611244600184613426565b90505b8163ffffffff168163ffffffff16111561130c57600060026112698484613426565b61127391906133cd565b61127d9083613426565b6001600160a01b0388166000908152600e6020908152604080832063ffffffff80861685529083529281902081518083019092528054909316808252600190930154918101919091529192508714156112e057602001519450610bed9350505050565b805163ffffffff168711156112f757819350611305565b611302600183613426565b92505b5050611247565b506001600160a01b0385166000908152600e6020908152604080832063ffffffff9094168352929052206001015491505092915050565b905090565b606060058054610b599061344b565b600c546001600160a01b031633146113815760405162461bcd60e51b8152600401610c86906132c4565b610ef88282612706565b600c546001600160a01b031633146113b55760405162461bcd60e51b8152600401610c86906132c4565b604051811515815233907f3ca65588b29182880283bc8778fea5f01b351e01d874839a39a99e1c281a21139060200160405180910390a26008805460ff1916911515919091179055565b600080546001600160a01b0316331461142a5760405162461bcd60e51b8152600401610c869061328f565b611434338361243c565b5060015b919050565b600c546001600160a01b031633146114675760405162461bcd60e51b8152600401610c86906132c4565b600954604080519182526020820183905233917f54c7a13ff01698e4ed3550a23216585f8472c7b1515a932eac98c9a6d48990c5910160405180910390a2600955565b6000610be93384610c4d8560405180606001604052806025815260200161357c602591393360009081526002602090815260408083206001600160a01b038d16845290915290205491906123a6565b6000610be9338484611fbf565b60065460009061134390612710906115339061ffff600160281b9091041661152d60035490565b9061280a565b90612889565b600580546115469061344b565b80601f01602080910402602001604051908101604052809291908181526020018280546115729061344b565b80156115bf5780601f10611594576101008083540402835291602001916115bf565b820191906000526020600020905b8154815290600101906020018083116115a257829003601f168201915b505050505081565b6001600160a01b0381166000908152600f602052604081205463ffffffff16806115f2576000611635565b6001600160a01b0383166000908152600e6020526040812090611616600184613426565b63ffffffff1663ffffffff168152602001908152602001600020600101545b9392505050565b60007f8cad95687ba82c2ce50e74f7b754645e5117c3a5bec8151c0726d5857980a866611667610b4a565b805190602001206116754690565b60408051602080820195909552808201939093526060830191909152306080808401919091528151808403909101815260a0830182528051908401207fe48329057bfd03d55e49b547132e39cffd9c1820ad7b9d4c5307691425d15adf60c08401526001600160a01b038b1660e084015261010083018a90526101208084018a90528251808503909101815261014084019092528151919093012061190160f01b610160830152610162820183905261018282018190529192506000906101a20160408051601f198184030181528282528051602091820120600080855291840180845281905260ff8a169284019290925260608301889052608083018790529092509060019060a0016020604051602081039080840390855afa1580156117a1573d6000803e3d6000fd5b5050604051601f1901519150506001600160a01b0381166118145760405162461bcd60e51b815260206004820152602760248201527f4c4f5650543a3a64656c656761746542795369673a20696e76616c6964207369604482015266676e617475726560c81b6064820152608401610c86565b6001600160a01b038116600090815260106020526040812080549161183883613486565b9190505589146118965760405162461bcd60e51b815260206004820152602360248201527f4c4f5650543a3a64656c656761746542795369673a20696e76616c6964206e6f6044820152626e636560e81b6064820152608401610c86565b874211156118f65760405162461bcd60e51b815260206004820152602760248201527f4c4f5650543a3a64656c656761746542795369673a207369676e617475726520604482015266195e1c1a5c995960ca1b6064820152608401610c86565b611900818b612686565b505050505b505050505050565b600c546001600160a01b031633146119375760405162461bcd60e51b8152600401610c86906132c4565b6001600160a01b03919091166000908152600760205260409020805460ff1916911515919091179055565b600480546115469061344b565b6000546001600160a01b031633146119995760405162461bcd60e51b8152600401610c869061328f565b6001600160a01b0381166119fe5760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610c86565b600080546040516001600160a01b03808516939216917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e091a3600080546001600160a01b0319166001600160a01b0392909216919091179055565b600c546001600160a01b03163314611a835760405162461bcd60e51b8152600401610c86906132c4565b60648161ffff161115611b095760405162461bcd60e51b815260206004820152604260248201527f4c4f5650543a3a7570646174654275726e526174653a204275726e207261746560448201527f206d757374206e6f742065786365656420746865206d6178696d756d20726174606482015261329760f11b608482015260a401610c86565b60065460408051630100000090920461ffff90811683528316602083015233917f3eec69630b6f49d4e10eec296fce4baddec5f34c5430fb2cd72f8c4218f63fd0910160405180910390a26006805461ffff90921663010000000264ffff00000019909216919091179055565b600c546001600160a01b03163314611ba05760405162461bcd60e51b8152600401610c86906132c4565b600b8054911515600160b01b0260ff60b01b19909216919091179055565b600c546001600160a01b03163314611be85760405162461bcd60e51b8152600401610c86906132c4565b600a80546001600160a01b0319166001600160a01b0383169081179091556040805163c45a015560e01b8152905163c45a015591600480820192602092909190829003018186803b158015611c3c57600080fd5b505afa158015611c50573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611c749190613023565b6001600160a01b031663e6a4390530600a60009054906101000a90046001600160a01b03166001600160a01b031663ad5c46486040518163ffffffff1660e01b815260040160206040518083038186803b158015611cd157600080fd5b505afa158015611ce5573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611d099190613023565b6040516001600160e01b031960e085901b1681526001600160a01b0392831660048201529116602482015260440160206040518083038186803b158015611d4f57600080fd5b505afa158015611d63573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611d879190613023565b600b80546001600160a01b0319166001600160a01b03929092169182179055611e0e5760405162461bcd60e51b815260206004820152603360248201527f4c4f5650543a3a7570646174654c4f56505453776170526f757465723a20496e6044820152723b30b634b2103830b4b91030b2323932b9b99760691b6064820152608401610c86565b600b54600a546040516001600160a01b03928316929091169033907f75709e8ce9f0a0e0171733889f70ea73353173af8478036a28b898bff335e8e690600090a450565b600c546001600160a01b03163314611e7c5760405162461bcd60e51b8152600401610c86906132c4565b600b8054911515600160a81b0260ff60a81b19909216919091179055565b6001600160a01b038316611efc5760405162461bcd60e51b8152602060048201526024808201527f42455032303a20617070726f76652066726f6d20746865207a65726f206164646044820152637265737360e01b6064820152608401610c86565b6001600160a01b038216611f5d5760405162461bcd60e51b815260206004820152602260248201527f42455032303a20617070726f766520746f20746865207a65726f206164647265604482015261737360f01b6064820152608401610c86565b6001600160a01b0383811660008181526002602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92591015b60405180910390a3505050565b8282826000611fcc611506565b1115612096576001600160a01b03831660009081526007602052604090205460ff1615801561201457506001600160a01b03821660009081526007602052604090205460ff16155b1561209657612021611506565b8111156120965760405162461bcd60e51b815260206004820152603f60248201527f4c4f5650543a3a616e74695768616c653a205472616e7366657220616d6f756e60448201527f74206578636565647320746865206d61785472616e73666572416d6f756e74006064820152608401610c86565b600b54600160a81b900460ff161580156120be57506000546001600160a01b03878116911614155b1561211457600b546001600160a01b03868116911614156121145760405162461bcd60e51b815260206004820152601060248201526f14d95b1b1a5b99c8191a5cd8589b195960821b6044820152606401610c86565b600b54600160b01b900460ff1615801561213c57506000546001600160a01b03878116911614155b1561219157600b546001600160a01b03878116911614156121915760405162461bcd60e51b815260206004820152600f60248201526e109d5e5a5b99c8191a5cd8589b1959608a1b6044820152606401610c86565b60085460ff16151560011480156121b25750600b54600160a01b900460ff16155b80156121c85750600a546001600160a01b031615155b80156121de5750600b546001600160a01b031615155b80156121f85750600b546001600160a01b03878116911614155b801561221257506000546001600160a01b03878116911614155b1561221f5761221f6128e4565b6001600160a01b03851661dead14806122415750600654610100900461ffff16155b15612256576122518686866129fd565b611905565b6006546000906122789061271090611533908890610100900461ffff1661280a565b60065490915060009061229e906064906115339085906301000000900461ffff1661280a565b905060006122ac8383612b83565b90506122b88183613379565b83146123125760405162461bcd60e51b815260206004820152602360248201527f4c4f5650543a3a7472616e736665723a204275726e2076616c756520696e76616044820152621b1a5960ea1b6064820152608401610c86565b600061231e8885612b83565b905061232a8482613379565b88146123835760405162461bcd60e51b815260206004820152602260248201527f4c4f5650543a3a7472616e736665723a205461782076616c756520696e76616c6044820152611a5960f21b6064820152608401610c86565b6123908a61dead856129fd565b61239b8a30846129fd565b6119008a8a836129fd565b600081848411156123ca5760405162461bcd60e51b8152600401610c86919061323a565b506123d5838561340f565b949350505050565b6000806123ea8385613379565b9050838110156116355760405162461bcd60e51b815260206004820152601b60248201527f536166654d6174683a206164646974696f6e206f766572666c6f7700000000006044820152606401610c86565b6001600160a01b0382166124925760405162461bcd60e51b815260206004820152601f60248201527f42455032303a206d696e7420746f20746865207a65726f2061646472657373006044820152606401610c86565b60035461249f90826123dd565b6003556001600160a01b0382166000908152600160205260409020546124c590826123dd565b6001600160a01b0383166000818152600160205260408082209390935591519091907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef906125169085815260200190565b60405180910390a35050565b816001600160a01b0316836001600160a01b0316141580156125445750600081115b15612681576001600160a01b038316156125e7576001600160a01b0383166000908152600f602052604081205463ffffffff1690816125845760006125c7565b6001600160a01b0385166000908152600e60205260408120906125a8600185613426565b63ffffffff1663ffffffff168152602001908152602001600020600101545b905060006125d58285612b83565b90506125e386848484612bdf565b5050505b6001600160a01b03821615612681576001600160a01b0382166000908152600f602052604081205463ffffffff169081612622576000612665565b6001600160a01b0384166000908152600e6020526040812090612646600185613426565b63ffffffff1663ffffffff168152602001908152602001600020600101545b9050600061267382856123dd565b905061190585848484612bdf565b505050565b6001600160a01b038281166000818152600d6020818152604080842080546001845282862054949093528787166001600160a01b03198416811790915590519190951694919391928592917f3134e8a2e6d97e929a7e54011ea5485d7d196dd5f0ba4d4ef95803e8e3fc257f9190a4612700828483612522565b50505050565b6001600160a01b0382166127665760405162461bcd60e51b815260206004820152602160248201527f42455032303a206275726e2066726f6d20746865207a65726f206164647265736044820152607360f81b6064820152608401610c86565b6127a3816040518060600160405280602281526020016135a1602291396001600160a01b03851660009081526001602052604090205491906123a6565b6001600160a01b0383166000908152600160205260409020556003546127c99082612b83565b6003556040518181526000906001600160a01b038416907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef90602001612516565b60008261281957506000610bed565b600061282583856133f0565b90508261283285836133b9565b146116355760405162461bcd60e51b815260206004820152602160248201527f536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f6044820152607760f81b6064820152608401610c86565b60008082116128da5760405162461bcd60e51b815260206004820152601a60248201527f536166654d6174683a206469766973696f6e206279207a65726f0000000000006044820152606401610c86565b61163582846133b9565b600b8054600160a01b60ff60a01b199091161790556006805462ffff001981169091553060009081526001602052604081205461010090920461ffff16919061292b611506565b905080821161293a578161293c565b805b915060095482106129d0576009546000612957826002612889565b905060006129658383612b83565b90504761297183612d81565b600061297d4783612b83565b90506129898382612ee2565b60408051858152602081018390529081018490527f17bbfb9a6069321b6ded73bd96327c9e6b7212a5cd51ff219cd61370acafb5619060600160405180910390a150505050505b50506006805461ffff9092166101000262ffff0019909216919091179055600b805460ff60a01b19169055565b6001600160a01b038316612a615760405162461bcd60e51b815260206004820152602560248201527f42455032303a207472616e736665722066726f6d20746865207a65726f206164604482015264647265737360d81b6064820152608401610c86565b6001600160a01b038216612ac35760405162461bcd60e51b815260206004820152602360248201527f42455032303a207472616e7366657220746f20746865207a65726f206164647260448201526265737360e81b6064820152608401610c86565b612b0081604051806060016040528060268152602001613556602691396001600160a01b03861660009081526001602052604090205491906123a6565b6001600160a01b038085166000908152600160205260408082209390935590841681522054612b2f90826123dd565b6001600160a01b0380841660008181526001602052604090819020939093559151908516907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef90611fb29085815260200190565b600082821115612bd55760405162461bcd60e51b815260206004820152601e60248201527f536166654d6174683a207375627472616374696f6e206f766572666c6f7700006044820152606401610c86565b611635828461340f565b6000612c034360405180606001604052806035815260200161352160359139612fc6565b905060008463ffffffff16118015612c5d57506001600160a01b0385166000908152600e6020526040812063ffffffff831691612c41600188613426565b63ffffffff908116825260208201929092526040016000205416145b15612ca6576001600160a01b0385166000908152600e602052604081208391612c87600188613426565b63ffffffff168152602081019190915260400160002060010155612d36565b60408051808201825263ffffffff838116825260208083018681526001600160a01b038a166000908152600e83528581208a851682529092529390209151825463ffffffff191691161781559051600191820155612d05908590613391565b6001600160a01b0386166000908152600f60205260409020805463ffffffff191663ffffffff929092169190911790555b60408051848152602081018490526001600160a01b038716917fdec2bacdd2f05b59de34da9b523dff8be42e5e38e818c82fdb0bae774387a724910160405180910390a25050505050565b6040805160028082526060820183526000926020830190803683370190505090503081600081518110612db657612db66134cd565b6001600160a01b03928316602091820292909201810191909152600a54604080516315ab88c960e31b81529051919093169263ad5c4648926004808301939192829003018186803b158015612e0a57600080fd5b505afa158015612e1e573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612e429190613023565b81600181518110612e5557612e556134cd565b6001600160a01b039283166020918202929092010152600a54612e7b9130911684611e9a565b600a5460405163791ac94760e01b81526001600160a01b039091169063791ac94790612eb4908590600090869030904290600401613308565b600060405180830381600087803b158015612ece57600080fd5b505af1158015611905573d6000803e3d6000fd5b600a54612efa9030906001600160a01b031684611e9a565b600a546001600160a01b031663f305d719823085600080612f23600c546001600160a01b031690565b60405160e088901b6001600160e01b03191681526001600160a01b03958616600482015260248101949094526044840192909252606483015290911660848201524260a482015260c4016060604051808303818588803b158015612f8657600080fd5b505af1158015612f9a573d6000803e3d6000fd5b50505050506040513d601f19601f82011682018060405250810190612fbf919061320c565b5050505050565b6000816401000000008410612fee5760405162461bcd60e51b8152600401610c86919061323a565b509192915050565b8035801515811461143857600080fd5b60006020828403121561301857600080fd5b8135611635816134e3565b60006020828403121561303557600080fd5b8151611635816134e3565b6000806040838503121561305357600080fd5b823561305e816134e3565b9150602083013561306e816134e3565b809150509250929050565b60008060006060848603121561308e57600080fd5b8335613099816134e3565b925060208401356130a9816134e3565b929592945050506040919091013590565b600080604083850312156130cd57600080fd5b82356130d8816134e3565b91506130e660208401612ff6565b90509250929050565b6000806040838503121561310257600080fd5b823561310d816134e3565b946020939093013593505050565b60008060008060008060c0878903121561313457600080fd5b863561313f816134e3565b95506020870135945060408701359350606087013560ff8116811461316357600080fd5b9598949750929560808101359460a0909101359350915050565b6000806040838503121561319057600080fd5b823561319b816134e3565b9150602083013563ffffffff8116811461306e57600080fd5b6000602082840312156131c657600080fd5b61163582612ff6565b6000602082840312156131e157600080fd5b813561ffff8116811461163557600080fd5b60006020828403121561320557600080fd5b5035919050565b60008060006060848603121561322157600080fd5b8351925060208401519150604084015190509250925092565b600060208083528351808285015260005b818110156132675785810183015185820160400152820161324b565b81811115613279576000604083870101525b50601f01601f1916929092016040019392505050565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b60208082526024908201527f6f70657261746f723a2063616c6c6572206973206e6f7420746865206f70657260408201526330ba37b960e11b606082015260800190565b600060a082018783526020878185015260a0604085015281875180845260c086019150828901935060005b818110156133585784516001600160a01b031683529383019391830191600101613333565b50506001600160a01b03969096166060850152505050608001529392505050565b6000821982111561338c5761338c6134a1565b500190565b600063ffffffff8083168185168083038211156133b0576133b06134a1565b01949350505050565b6000826133c8576133c86134b7565b500490565b600063ffffffff808416806133e4576133e46134b7565b92169190910492915050565b600081600019048311821515161561340a5761340a6134a1565b500290565b600082821015613421576134216134a1565b500390565b600063ffffffff83811690831681811015613443576134436134a1565b039392505050565b600181811c9082168061345f57607f821691505b6020821081141561348057634e487b7160e01b600052602260045260246000fd5b50919050565b600060001982141561349a5761349a6134a1565b5060010190565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052601260045260246000fd5b634e487b7160e01b600052603260045260246000fd5b6001600160a01b0381168114610f2b57600080fdfe42455032303a207472616e7366657220616d6f756e74206578636565647320616c6c6f77616e63654c4f5650543a3a5f7772697465436865636b706f696e743a20626c6f636b206e756d6265722065786365656473203332206269747342455032303a207472616e7366657220616d6f756e7420657863656564732062616c616e636542455032303a2064656372656173656420616c6c6f77616e63652062656c6f77207a65726f42455032303a206275726e20616d6f756e7420657863656564732062616c616e6365a2646970667358221220c9c18ded56748ea31b690985ee4282628fa481e89772cc8f6472753e14adb06464736f6c63430008070033
Deployed Bytecode
0x60806040526004361061036f5760003560e01c8063893d20e8116101c6578063bed99850116100f7578063f1127ed811610095578063f62228071161006f578063f622280714610ad4578063fb37ef5714610af4578063fccc281314610b14578063fce3bbb514610b2a57600080fd5b8063f1127ed814610a30578063f2fde38b14610a94578063f607f2b414610ab457600080fd5b8063d28d8852116100d1578063d28d88521461098b578063d8248358146109a0578063dd62ed3e146109b6578063e7a324dc146109fc57600080fd5b8063bed9985014610929578063c3cda5201461094b578063c7f59a671461096b57600080fd5b8063a392e67411610164578063a9e757231161013e578063a9e75723146108bf578063b09f1266146108d4578063b4b5ea57146108e9578063b65d08b01461090957600080fd5b8063a392e6741461085f578063a457c2d71461087f578063a9059cbb1461089f57600080fd5b806395d89b41116101a057806395d89b41146107ea5780639dc29fac146107ff5780639f9a4e7f1461081f578063a0712d681461083f57600080fd5b8063893d20e8146107ab5780638da5cb5b146107ab578063928bc6a0146107c957600080fd5b80633ff8bf2e116102a05780636a141e2c1161023e578063715018a611610218578063715018a614610729578063782d6fe11461073e5780637b895dfc1461075e5780637ecebe001461077e57600080fd5b80636a141e2c1461068b5780636fcfff45146106ab57806370a08231146106f357600080fd5b8063570ca7351161027a578063570ca735146105e0578063587cde1e146106125780635c19a95c1461064b5780635d2a4fdd1461066b57600080fd5b80633ff8bf2e1461058457806340c10f19146105a65780634a74bb02146105c657600080fd5b8063269f534c1161030d57806332424aa3116102e757806332424aa314610514578063376c23911461052e578063395093511461054e5780633eaaf86b1461056e57600080fd5b8063269f534c1461049357806329605e77146104cc578063313ce567146104ee57600080fd5b80631ad9339a116103495780631ad9339a146103f557806320606b701461041e57806323aed2281461045257806323b872dd1461047357600080fd5b806306fdde031461037b578063095ea7b3146103a657806318160ddd146103d657600080fd5b3661037657005b600080fd5b34801561038757600080fd5b50610390610b4a565b60405161039d919061323a565b60405180910390f35b3480156103b257600080fd5b506103c66103c13660046130ef565b610bdc565b604051901515815260200161039d565b3480156103e257600080fd5b506003545b60405190815260200161039d565b34801561040157600080fd5b5061040b6103e881565b60405161ffff909116815260200161039d565b34801561042a57600080fd5b506103e77f8cad95687ba82c2ce50e74f7b754645e5117c3a5bec8151c0726d5857980a86681565b34801561045e57600080fd5b50600b546103c690600160a81b900460ff1681565b34801561047f57600080fd5b506103c661048e366004613079565b610bf3565b34801561049f57600080fd5b506103c66104ae366004613006565b6001600160a01b031660009081526007602052604090205460ff1690565b3480156104d857600080fd5b506104ec6104e7366004613006565b610c5c565b005b3480156104fa57600080fd5b5060065460ff165b60405160ff909116815260200161039d565b34801561052057600080fd5b506006546105029060ff1681565b34801561053a57600080fd5b506104ec6105493660046131cf565b610d67565b34801561055a57600080fd5b506103c66105693660046130ef565b610e8e565b34801561057a57600080fd5b506103e760035481565b34801561059057600080fd5b5060065461040b90600160281b900461ffff1681565b3480156105b257600080fd5b506104ec6105c13660046130ef565b610ec4565b3480156105d257600080fd5b506008546103c69060ff1681565b3480156105ec57600080fd5b50600c546001600160a01b03165b6040516001600160a01b03909116815260200161039d565b34801561061e57600080fd5b506105fa61062d366004613006565b6001600160a01b039081166000908152600d60205260409020541690565b34801561065757600080fd5b506104ec610666366004613006565b610f21565b34801561067757600080fd5b50600b546105fa906001600160a01b031681565b34801561069757600080fd5b506104ec6106a63660046131cf565b610f2e565b3480156106b757600080fd5b506106de6106c6366004613006565b600f6020526000908152604090205463ffffffff1681565b60405163ffffffff909116815260200161039d565b3480156106ff57600080fd5b506103e761070e366004613006565b6001600160a01b031660009081526001602052604090205490565b34801561073557600080fd5b506104ec611069565b34801561074a57600080fd5b506103e76107593660046130ef565b6110dd565b34801561076a57600080fd5b50600a546105fa906001600160a01b031681565b34801561078a57600080fd5b506103e7610799366004613006565b60106020526000908152604090205481565b3480156107b757600080fd5b506000546001600160a01b03166105fa565b3480156107d557600080fd5b50600b546103c690600160b01b900460ff1681565b3480156107f657600080fd5b50610390611348565b34801561080b57600080fd5b506104ec61081a3660046130ef565b611357565b34801561082b57600080fd5b506104ec61083a3660046131b4565b61138b565b34801561084b57600080fd5b506103c661085a3660046131f3565b6113ff565b34801561086b57600080fd5b506104ec61087a3660046131f3565b61143d565b34801561088b57600080fd5b506103c661089a3660046130ef565b6114aa565b3480156108ab57600080fd5b506103c66108ba3660046130ef565b6114f9565b3480156108cb57600080fd5b506103e7611506565b3480156108e057600080fd5b50610390611539565b3480156108f557600080fd5b506103e7610904366004613006565b6115c7565b34801561091557600080fd5b5060065461040b90610100900461ffff1681565b34801561093557600080fd5b5060065461040b906301000000900461ffff1681565b34801561095757600080fd5b506104ec61096636600461311b565b61163c565b34801561097757600080fd5b506104ec6109863660046130ba565b61190d565b34801561099757600080fd5b50610390611962565b3480156109ac57600080fd5b506103e760095481565b3480156109c257600080fd5b506103e76109d1366004613040565b6001600160a01b03918216600090815260026020908152604080832093909416825291909152205490565b348015610a0857600080fd5b506103e77fe48329057bfd03d55e49b547132e39cffd9c1820ad7b9d4c5307691425d15adf81565b348015610a3c57600080fd5b50610a78610a4b36600461317d565b600e6020908152600092835260408084209091529082529020805460019091015463ffffffff9091169082565b6040805163ffffffff909316835260208301919091520161039d565b348015610aa057600080fd5b506104ec610aaf366004613006565b61196f565b348015610ac057600080fd5b506104ec610acf3660046131cf565b611a59565b348015610ae057600080fd5b506104ec610aef3660046131b4565b611b76565b348015610b0057600080fd5b506104ec610b0f366004613006565b611bbe565b348015610b2057600080fd5b506105fa61dead81565b348015610b3657600080fd5b506104ec610b453660046131b4565b611e52565b606060048054610b599061344b565b80601f0160208091040260200160405190810160405280929190818152602001828054610b859061344b565b8015610bd25780601f10610ba757610100808354040283529160200191610bd2565b820191906000526020600020905b815481529060010190602001808311610bb557829003601f168201915b5050505050905090565b6000610be9338484611e9a565b5060015b92915050565b6000610c00848484611fbf565b610c528433610c4d856040518060600160405280602881526020016134f9602891396001600160a01b038a16600090815260026020908152604080832033845290915290205491906123a6565b611e9a565b5060019392505050565b600c546001600160a01b03163314610c8f5760405162461bcd60e51b8152600401610c86906132c4565b60405180910390fd5b6001600160a01b038116610d0b5760405162461bcd60e51b815260206004820152603960248201527f4c4f5650543a3a7472616e736665724f70657261746f723a206e6577206f706560448201527f7261746f7220697320746865207a65726f2061646472657373000000000000006064820152608401610c86565b600c546040516001600160a01b038084169216907f74da04524d50c64947f5dd5381ef1a4dca5cba8ed1d816243f9e48aa0b5617ed90600090a3600c80546001600160a01b0319166001600160a01b0392909216919091179055565b600c546001600160a01b03163314610d915760405162461bcd60e51b8152600401610c86906132c4565b6103e861ffff82161115610e275760405162461bcd60e51b815260206004820152605160248201527f4c4f5650543a3a7570646174655472616e73666572546178526174653a20547260448201527f616e73666572207461782072617465206d757374206e6f7420657863656564206064820152703a34329036b0bc34b6bab6903930ba329760791b608482015260a401610c86565b6006546040805161010090920461ffff90811683528316602083015233917fe9d5c8ee2a65d4fb859c680669d8f902172d53e3f15f9f11108a31bbada4b70b910160405180910390a26006805461ffff9092166101000262ffff0019909216919091179055565b3360008181526002602090815260408083206001600160a01b03871684529091528120549091610be9918590610c4d90866123dd565b6000546001600160a01b03163314610eee5760405162461bcd60e51b8152600401610c869061328f565b610ef8828261243c565b6001600160a01b038083166000908152600d6020526040812054610f1d921683612522565b5050565b610f2b3382612686565b50565b600c546001600160a01b03163314610f585760405162461bcd60e51b8152600401610c86906132c4565b6127108161ffff161115610ffa5760405162461bcd60e51b815260206004820152605e60248201527f4c4f5650543a3a7570646174654d61785472616e73666572416d6f756e74526160448201527f74653a204d6178207472616e7366657220616d6f756e742072617465206d757360648201527f74206e6f742065786365656420746865206d6178696d756d20726174652e0000608482015260a401610c86565b60065460408051600160281b90920461ffff90811683528316602083015233917fb62a50fc861a770636e85357becb3b82a32e911106609d4985871eaf29011e08910160405180910390a26006805461ffff909216600160281b0266ffff000000000019909216919091179055565b6000546001600160a01b031633146110935760405162461bcd60e51b8152600401610c869061328f565b600080546040516001600160a01b03909116907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908390a3600080546001600160a01b0319169055565b600043821061113f5760405162461bcd60e51b815260206004820152602860248201527f4c4f5650543a3a6765745072696f72566f7465733a206e6f74207965742064656044820152671d195c9b5a5b995960c21b6064820152608401610c86565b6001600160a01b0383166000908152600f602052604090205463ffffffff168061116d576000915050610bed565b6001600160a01b0384166000908152600e602052604081208491611192600185613426565b63ffffffff908116825260208201929092526040016000205416116111fb576001600160a01b0384166000908152600e60205260408120906111d5600184613426565b63ffffffff1663ffffffff16815260200190815260200160002060010154915050610bed565b6001600160a01b0384166000908152600e6020908152604080832083805290915290205463ffffffff16831015611236576000915050610bed565b600080611244600184613426565b90505b8163ffffffff168163ffffffff16111561130c57600060026112698484613426565b61127391906133cd565b61127d9083613426565b6001600160a01b0388166000908152600e6020908152604080832063ffffffff80861685529083529281902081518083019092528054909316808252600190930154918101919091529192508714156112e057602001519450610bed9350505050565b805163ffffffff168711156112f757819350611305565b611302600183613426565b92505b5050611247565b506001600160a01b0385166000908152600e6020908152604080832063ffffffff9094168352929052206001015491505092915050565b905090565b606060058054610b599061344b565b600c546001600160a01b031633146113815760405162461bcd60e51b8152600401610c86906132c4565b610ef88282612706565b600c546001600160a01b031633146113b55760405162461bcd60e51b8152600401610c86906132c4565b604051811515815233907f3ca65588b29182880283bc8778fea5f01b351e01d874839a39a99e1c281a21139060200160405180910390a26008805460ff1916911515919091179055565b600080546001600160a01b0316331461142a5760405162461bcd60e51b8152600401610c869061328f565b611434338361243c565b5060015b919050565b600c546001600160a01b031633146114675760405162461bcd60e51b8152600401610c86906132c4565b600954604080519182526020820183905233917f54c7a13ff01698e4ed3550a23216585f8472c7b1515a932eac98c9a6d48990c5910160405180910390a2600955565b6000610be93384610c4d8560405180606001604052806025815260200161357c602591393360009081526002602090815260408083206001600160a01b038d16845290915290205491906123a6565b6000610be9338484611fbf565b60065460009061134390612710906115339061ffff600160281b9091041661152d60035490565b9061280a565b90612889565b600580546115469061344b565b80601f01602080910402602001604051908101604052809291908181526020018280546115729061344b565b80156115bf5780601f10611594576101008083540402835291602001916115bf565b820191906000526020600020905b8154815290600101906020018083116115a257829003601f168201915b505050505081565b6001600160a01b0381166000908152600f602052604081205463ffffffff16806115f2576000611635565b6001600160a01b0383166000908152600e6020526040812090611616600184613426565b63ffffffff1663ffffffff168152602001908152602001600020600101545b9392505050565b60007f8cad95687ba82c2ce50e74f7b754645e5117c3a5bec8151c0726d5857980a866611667610b4a565b805190602001206116754690565b60408051602080820195909552808201939093526060830191909152306080808401919091528151808403909101815260a0830182528051908401207fe48329057bfd03d55e49b547132e39cffd9c1820ad7b9d4c5307691425d15adf60c08401526001600160a01b038b1660e084015261010083018a90526101208084018a90528251808503909101815261014084019092528151919093012061190160f01b610160830152610162820183905261018282018190529192506000906101a20160408051601f198184030181528282528051602091820120600080855291840180845281905260ff8a169284019290925260608301889052608083018790529092509060019060a0016020604051602081039080840390855afa1580156117a1573d6000803e3d6000fd5b5050604051601f1901519150506001600160a01b0381166118145760405162461bcd60e51b815260206004820152602760248201527f4c4f5650543a3a64656c656761746542795369673a20696e76616c6964207369604482015266676e617475726560c81b6064820152608401610c86565b6001600160a01b038116600090815260106020526040812080549161183883613486565b9190505589146118965760405162461bcd60e51b815260206004820152602360248201527f4c4f5650543a3a64656c656761746542795369673a20696e76616c6964206e6f6044820152626e636560e81b6064820152608401610c86565b874211156118f65760405162461bcd60e51b815260206004820152602760248201527f4c4f5650543a3a64656c656761746542795369673a207369676e617475726520604482015266195e1c1a5c995960ca1b6064820152608401610c86565b611900818b612686565b505050505b505050505050565b600c546001600160a01b031633146119375760405162461bcd60e51b8152600401610c86906132c4565b6001600160a01b03919091166000908152600760205260409020805460ff1916911515919091179055565b600480546115469061344b565b6000546001600160a01b031633146119995760405162461bcd60e51b8152600401610c869061328f565b6001600160a01b0381166119fe5760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610c86565b600080546040516001600160a01b03808516939216917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e091a3600080546001600160a01b0319166001600160a01b0392909216919091179055565b600c546001600160a01b03163314611a835760405162461bcd60e51b8152600401610c86906132c4565b60648161ffff161115611b095760405162461bcd60e51b815260206004820152604260248201527f4c4f5650543a3a7570646174654275726e526174653a204275726e207261746560448201527f206d757374206e6f742065786365656420746865206d6178696d756d20726174606482015261329760f11b608482015260a401610c86565b60065460408051630100000090920461ffff90811683528316602083015233917f3eec69630b6f49d4e10eec296fce4baddec5f34c5430fb2cd72f8c4218f63fd0910160405180910390a26006805461ffff90921663010000000264ffff00000019909216919091179055565b600c546001600160a01b03163314611ba05760405162461bcd60e51b8152600401610c86906132c4565b600b8054911515600160b01b0260ff60b01b19909216919091179055565b600c546001600160a01b03163314611be85760405162461bcd60e51b8152600401610c86906132c4565b600a80546001600160a01b0319166001600160a01b0383169081179091556040805163c45a015560e01b8152905163c45a015591600480820192602092909190829003018186803b158015611c3c57600080fd5b505afa158015611c50573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611c749190613023565b6001600160a01b031663e6a4390530600a60009054906101000a90046001600160a01b03166001600160a01b031663ad5c46486040518163ffffffff1660e01b815260040160206040518083038186803b158015611cd157600080fd5b505afa158015611ce5573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611d099190613023565b6040516001600160e01b031960e085901b1681526001600160a01b0392831660048201529116602482015260440160206040518083038186803b158015611d4f57600080fd5b505afa158015611d63573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611d879190613023565b600b80546001600160a01b0319166001600160a01b03929092169182179055611e0e5760405162461bcd60e51b815260206004820152603360248201527f4c4f5650543a3a7570646174654c4f56505453776170526f757465723a20496e6044820152723b30b634b2103830b4b91030b2323932b9b99760691b6064820152608401610c86565b600b54600a546040516001600160a01b03928316929091169033907f75709e8ce9f0a0e0171733889f70ea73353173af8478036a28b898bff335e8e690600090a450565b600c546001600160a01b03163314611e7c5760405162461bcd60e51b8152600401610c86906132c4565b600b8054911515600160a81b0260ff60a81b19909216919091179055565b6001600160a01b038316611efc5760405162461bcd60e51b8152602060048201526024808201527f42455032303a20617070726f76652066726f6d20746865207a65726f206164646044820152637265737360e01b6064820152608401610c86565b6001600160a01b038216611f5d5760405162461bcd60e51b815260206004820152602260248201527f42455032303a20617070726f766520746f20746865207a65726f206164647265604482015261737360f01b6064820152608401610c86565b6001600160a01b0383811660008181526002602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92591015b60405180910390a3505050565b8282826000611fcc611506565b1115612096576001600160a01b03831660009081526007602052604090205460ff1615801561201457506001600160a01b03821660009081526007602052604090205460ff16155b1561209657612021611506565b8111156120965760405162461bcd60e51b815260206004820152603f60248201527f4c4f5650543a3a616e74695768616c653a205472616e7366657220616d6f756e60448201527f74206578636565647320746865206d61785472616e73666572416d6f756e74006064820152608401610c86565b600b54600160a81b900460ff161580156120be57506000546001600160a01b03878116911614155b1561211457600b546001600160a01b03868116911614156121145760405162461bcd60e51b815260206004820152601060248201526f14d95b1b1a5b99c8191a5cd8589b195960821b6044820152606401610c86565b600b54600160b01b900460ff1615801561213c57506000546001600160a01b03878116911614155b1561219157600b546001600160a01b03878116911614156121915760405162461bcd60e51b815260206004820152600f60248201526e109d5e5a5b99c8191a5cd8589b1959608a1b6044820152606401610c86565b60085460ff16151560011480156121b25750600b54600160a01b900460ff16155b80156121c85750600a546001600160a01b031615155b80156121de5750600b546001600160a01b031615155b80156121f85750600b546001600160a01b03878116911614155b801561221257506000546001600160a01b03878116911614155b1561221f5761221f6128e4565b6001600160a01b03851661dead14806122415750600654610100900461ffff16155b15612256576122518686866129fd565b611905565b6006546000906122789061271090611533908890610100900461ffff1661280a565b60065490915060009061229e906064906115339085906301000000900461ffff1661280a565b905060006122ac8383612b83565b90506122b88183613379565b83146123125760405162461bcd60e51b815260206004820152602360248201527f4c4f5650543a3a7472616e736665723a204275726e2076616c756520696e76616044820152621b1a5960ea1b6064820152608401610c86565b600061231e8885612b83565b905061232a8482613379565b88146123835760405162461bcd60e51b815260206004820152602260248201527f4c4f5650543a3a7472616e736665723a205461782076616c756520696e76616c6044820152611a5960f21b6064820152608401610c86565b6123908a61dead856129fd565b61239b8a30846129fd565b6119008a8a836129fd565b600081848411156123ca5760405162461bcd60e51b8152600401610c86919061323a565b506123d5838561340f565b949350505050565b6000806123ea8385613379565b9050838110156116355760405162461bcd60e51b815260206004820152601b60248201527f536166654d6174683a206164646974696f6e206f766572666c6f7700000000006044820152606401610c86565b6001600160a01b0382166124925760405162461bcd60e51b815260206004820152601f60248201527f42455032303a206d696e7420746f20746865207a65726f2061646472657373006044820152606401610c86565b60035461249f90826123dd565b6003556001600160a01b0382166000908152600160205260409020546124c590826123dd565b6001600160a01b0383166000818152600160205260408082209390935591519091907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef906125169085815260200190565b60405180910390a35050565b816001600160a01b0316836001600160a01b0316141580156125445750600081115b15612681576001600160a01b038316156125e7576001600160a01b0383166000908152600f602052604081205463ffffffff1690816125845760006125c7565b6001600160a01b0385166000908152600e60205260408120906125a8600185613426565b63ffffffff1663ffffffff168152602001908152602001600020600101545b905060006125d58285612b83565b90506125e386848484612bdf565b5050505b6001600160a01b03821615612681576001600160a01b0382166000908152600f602052604081205463ffffffff169081612622576000612665565b6001600160a01b0384166000908152600e6020526040812090612646600185613426565b63ffffffff1663ffffffff168152602001908152602001600020600101545b9050600061267382856123dd565b905061190585848484612bdf565b505050565b6001600160a01b038281166000818152600d6020818152604080842080546001845282862054949093528787166001600160a01b03198416811790915590519190951694919391928592917f3134e8a2e6d97e929a7e54011ea5485d7d196dd5f0ba4d4ef95803e8e3fc257f9190a4612700828483612522565b50505050565b6001600160a01b0382166127665760405162461bcd60e51b815260206004820152602160248201527f42455032303a206275726e2066726f6d20746865207a65726f206164647265736044820152607360f81b6064820152608401610c86565b6127a3816040518060600160405280602281526020016135a1602291396001600160a01b03851660009081526001602052604090205491906123a6565b6001600160a01b0383166000908152600160205260409020556003546127c99082612b83565b6003556040518181526000906001600160a01b038416907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef90602001612516565b60008261281957506000610bed565b600061282583856133f0565b90508261283285836133b9565b146116355760405162461bcd60e51b815260206004820152602160248201527f536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f6044820152607760f81b6064820152608401610c86565b60008082116128da5760405162461bcd60e51b815260206004820152601a60248201527f536166654d6174683a206469766973696f6e206279207a65726f0000000000006044820152606401610c86565b61163582846133b9565b600b8054600160a01b60ff60a01b199091161790556006805462ffff001981169091553060009081526001602052604081205461010090920461ffff16919061292b611506565b905080821161293a578161293c565b805b915060095482106129d0576009546000612957826002612889565b905060006129658383612b83565b90504761297183612d81565b600061297d4783612b83565b90506129898382612ee2565b60408051858152602081018390529081018490527f17bbfb9a6069321b6ded73bd96327c9e6b7212a5cd51ff219cd61370acafb5619060600160405180910390a150505050505b50506006805461ffff9092166101000262ffff0019909216919091179055600b805460ff60a01b19169055565b6001600160a01b038316612a615760405162461bcd60e51b815260206004820152602560248201527f42455032303a207472616e736665722066726f6d20746865207a65726f206164604482015264647265737360d81b6064820152608401610c86565b6001600160a01b038216612ac35760405162461bcd60e51b815260206004820152602360248201527f42455032303a207472616e7366657220746f20746865207a65726f206164647260448201526265737360e81b6064820152608401610c86565b612b0081604051806060016040528060268152602001613556602691396001600160a01b03861660009081526001602052604090205491906123a6565b6001600160a01b038085166000908152600160205260408082209390935590841681522054612b2f90826123dd565b6001600160a01b0380841660008181526001602052604090819020939093559151908516907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef90611fb29085815260200190565b600082821115612bd55760405162461bcd60e51b815260206004820152601e60248201527f536166654d6174683a207375627472616374696f6e206f766572666c6f7700006044820152606401610c86565b611635828461340f565b6000612c034360405180606001604052806035815260200161352160359139612fc6565b905060008463ffffffff16118015612c5d57506001600160a01b0385166000908152600e6020526040812063ffffffff831691612c41600188613426565b63ffffffff908116825260208201929092526040016000205416145b15612ca6576001600160a01b0385166000908152600e602052604081208391612c87600188613426565b63ffffffff168152602081019190915260400160002060010155612d36565b60408051808201825263ffffffff838116825260208083018681526001600160a01b038a166000908152600e83528581208a851682529092529390209151825463ffffffff191691161781559051600191820155612d05908590613391565b6001600160a01b0386166000908152600f60205260409020805463ffffffff191663ffffffff929092169190911790555b60408051848152602081018490526001600160a01b038716917fdec2bacdd2f05b59de34da9b523dff8be42e5e38e818c82fdb0bae774387a724910160405180910390a25050505050565b6040805160028082526060820183526000926020830190803683370190505090503081600081518110612db657612db66134cd565b6001600160a01b03928316602091820292909201810191909152600a54604080516315ab88c960e31b81529051919093169263ad5c4648926004808301939192829003018186803b158015612e0a57600080fd5b505afa158015612e1e573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612e429190613023565b81600181518110612e5557612e556134cd565b6001600160a01b039283166020918202929092010152600a54612e7b9130911684611e9a565b600a5460405163791ac94760e01b81526001600160a01b039091169063791ac94790612eb4908590600090869030904290600401613308565b600060405180830381600087803b158015612ece57600080fd5b505af1158015611905573d6000803e3d6000fd5b600a54612efa9030906001600160a01b031684611e9a565b600a546001600160a01b031663f305d719823085600080612f23600c546001600160a01b031690565b60405160e088901b6001600160e01b03191681526001600160a01b03958616600482015260248101949094526044840192909252606483015290911660848201524260a482015260c4016060604051808303818588803b158015612f8657600080fd5b505af1158015612f9a573d6000803e3d6000fd5b50505050506040513d601f19601f82011682018060405250810190612fbf919061320c565b5050505050565b6000816401000000008410612fee5760405162461bcd60e51b8152600401610c86919061323a565b509192915050565b8035801515811461143857600080fd5b60006020828403121561301857600080fd5b8135611635816134e3565b60006020828403121561303557600080fd5b8151611635816134e3565b6000806040838503121561305357600080fd5b823561305e816134e3565b9150602083013561306e816134e3565b809150509250929050565b60008060006060848603121561308e57600080fd5b8335613099816134e3565b925060208401356130a9816134e3565b929592945050506040919091013590565b600080604083850312156130cd57600080fd5b82356130d8816134e3565b91506130e660208401612ff6565b90509250929050565b6000806040838503121561310257600080fd5b823561310d816134e3565b946020939093013593505050565b60008060008060008060c0878903121561313457600080fd5b863561313f816134e3565b95506020870135945060408701359350606087013560ff8116811461316357600080fd5b9598949750929560808101359460a0909101359350915050565b6000806040838503121561319057600080fd5b823561319b816134e3565b9150602083013563ffffffff8116811461306e57600080fd5b6000602082840312156131c657600080fd5b61163582612ff6565b6000602082840312156131e157600080fd5b813561ffff8116811461163557600080fd5b60006020828403121561320557600080fd5b5035919050565b60008060006060848603121561322157600080fd5b8351925060208401519150604084015190509250925092565b600060208083528351808285015260005b818110156132675785810183015185820160400152820161324b565b81811115613279576000604083870101525b50601f01601f1916929092016040019392505050565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b60208082526024908201527f6f70657261746f723a2063616c6c6572206973206e6f7420746865206f70657260408201526330ba37b960e11b606082015260800190565b600060a082018783526020878185015260a0604085015281875180845260c086019150828901935060005b818110156133585784516001600160a01b031683529383019391830191600101613333565b50506001600160a01b03969096166060850152505050608001529392505050565b6000821982111561338c5761338c6134a1565b500190565b600063ffffffff8083168185168083038211156133b0576133b06134a1565b01949350505050565b6000826133c8576133c86134b7565b500490565b600063ffffffff808416806133e4576133e46134b7565b92169190910492915050565b600081600019048311821515161561340a5761340a6134a1565b500290565b600082821015613421576134216134a1565b500390565b600063ffffffff83811690831681811015613443576134436134a1565b039392505050565b600181811c9082168061345f57607f821691505b6020821081141561348057634e487b7160e01b600052602260045260246000fd5b50919050565b600060001982141561349a5761349a6134a1565b5060010190565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052601260045260246000fd5b634e487b7160e01b600052603260045260246000fd5b6001600160a01b0381168114610f2b57600080fdfe42455032303a207472616e7366657220616d6f756e74206578636565647320616c6c6f77616e63654c4f5650543a3a5f7772697465436865636b706f696e743a20626c6f636b206e756d6265722065786365656473203332206269747342455032303a207472616e7366657220616d6f756e7420657863656564732062616c616e636542455032303a2064656372656173656420616c6c6f77616e63652062656c6f77207a65726f42455032303a206275726e20616d6f756e7420657863656564732062616c616e6365a2646970667358221220c9c18ded56748ea31b690985ee4282628fa481e89772cc8f6472753e14adb06464736f6c63430008070033
Deployed Bytecode Sourcemap
39102:21404:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;31205:92;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;32692:161;;;;;;;;;;-1:-1:-1;32692:161:0;;;;;:::i;:::-;;:::i;:::-;;;5946:14:1;;5939:22;5921:41;;5909:2;5894:18;32692:161:0;5781:187:1;31681:100:0;;;;;;;;;;-1:-1:-1;31761:12:0;;31681:100;;;6119:25:1;;;6107:2;6092:18;31681:100:0;5973:177:1;39414:55:0;;;;;;;;;;;;39465:4;39414:55;;;;;19308:6:1;19296:19;;;19278:38;;19266:2;19251:18;39414:55:0;19134:188:1;52910:122:0;;;;;;;;;;;;52952:80;52910:122;;40322:19;;;;;;;;;;-1:-1:-1;40322:19:0;;;;-1:-1:-1;;;40322:19:0;;;;;;33324:397;;;;;;;;;;-1:-1:-1;33324:397:0;;;;;:::i;:::-;;:::i;48165:136::-;;;;;;;;;;-1:-1:-1;48165:136:0;;;;;:::i;:::-;-1:-1:-1;;;;;48261:32:0;48237:4;48261:32;;;:22;:32;;;;;;;;;48165:136;51621:274;;;;;;;;;;-1:-1:-1;51621:274:0;;;;;:::i;:::-;;:::i;:::-;;31364:92;;;;;;;;;;-1:-1:-1;31439:9:0;;;;31364:92;;;22002:4:1;21990:17;;;21972:36;;21960:2;21945:18;31364:92:0;21830:184:1;30488:22:0;;;;;;;;;;-1:-1:-1;30488:22:0;;;;;;;;48517:364;;;;;;;;;;-1:-1:-1;48517:364:0;;;;;:::i;:::-;;:::i;34129:210::-;;;;;;;;;;-1:-1:-1;34129:210:0;;;;;:::i;:::-;;:::i;30398:27::-;;;;;;;;;;;;;;;;39671:40;;;;;;;;;;-1:-1:-1;39671:40:0;;;;-1:-1:-1;;;39671:40:0;;;;;;42715:162;;;;;;;;;;-1:-1:-1;42715:162:0;;;;;:::i;:::-;;:::i;39870:41::-;;;;;;;;;;-1:-1:-1;39870:41:0;;;;;;;;51376:85;;;;;;;;;;-1:-1:-1;51444:9:0;;-1:-1:-1;;;;;51444:9:0;51376:85;;;-1:-1:-1;;;;;4816:32:1;;;4798:51;;4786:2;4771:18;51376:85:0;4652:203:1;53893:149:0;;;;;;;;;;-1:-1:-1;53893:149:0;;;;;:::i;:::-;-1:-1:-1;;;;;54013:21:0;;;53981:7;54013:21;;;:10;:21;;;;;;;;53893:149;54186:104;;;;;;;;;;-1:-1:-1;54186:104:0;;;;;:::i;:::-;;:::i;40195:28::-;;;;;;;;;;-1:-1:-1;40195:28:0;;;;-1:-1:-1;;;;;40195:28:0;;;49393:405;;;;;;;;;;-1:-1:-1;49393:405:0;;;;;:::i;:::-;;:::i;52788:49::-;;;;;;;;;;-1:-1:-1;52788:49:0;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;21539:10:1;21527:23;;;21509:42;;21497:2;21482:18;52788:49:0;21365:192:1;31843:119:0;;;;;;;;;;-1:-1:-1;31843:119:0;;;;;:::i;:::-;-1:-1:-1;;;;;31936:18:0;31909:7;31936:18;;;:9;:18;;;;;;;31843:119;29591:148;;;;;;;;;;;;;:::i;56804:1254::-;;;;;;;;;;-1:-1:-1;56804:1254:0;;;;;:::i;:::-;;:::i;40122:41::-;;;;;;;;;;-1:-1:-1;40122:41:0;;;;-1:-1:-1;;;;;40122:41:0;;;53324:39;;;;;;;;;;-1:-1:-1;53324:39:0;;;;;:::i;:::-;;;;;;;;;;;;;;31048:94;;;;;;;;;;-1:-1:-1;31100:7:0;29013:6;-1:-1:-1;;;;;29013:6:0;31048:94;;40374:18;;;;;;;;;;-1:-1:-1;40374:18:0;;;;-1:-1:-1;;;40374:18:0;;;;;;31521:96;;;;;;;;;;;;;:::i;42975:165::-;;;;;;;;;;-1:-1:-1;42975:165:0;;;;;:::i;:::-;;:::i;50545:189::-;;;;;;;;;;-1:-1:-1;50545:189:0;;;;;:::i;:::-;;:::i;35370:130::-;;;;;;;;;;-1:-1:-1;35370:130:0;;;;;:::i;:::-;;:::i;49923:209::-;;;;;;;;;;-1:-1:-1;49923:209:0;;;;;:::i;:::-;;:::i;34841:311::-;;;;;;;;;;-1:-1:-1;34841:311:0;;;;;:::i;:::-;;:::i;32174:167::-;;;;;;;;;;-1:-1:-1;32174:167:0;;;;;:::i;:::-;;:::i;47935:136::-;;;;;;;;;;;;;:::i;30460:21::-;;;;;;;;;;;;;:::i;56118:255::-;;;;;;;;;;-1:-1:-1;56118:255:0;;;;;:::i;:::-;;:::i;39224:35::-;;;;;;;;;;-1:-1:-1;39224:35:0;;;;;;;;;;;39344:27;;;;;;;;;;-1:-1:-1;39344:27:0;;;;;;;;;;;54724:1193;;;;;;;;;;-1:-1:-1;54724:1193:0;;;;;:::i;:::-;;:::i;50269:151::-;;;;;;;;;;-1:-1:-1;50269:151:0;;;;;:::i;:::-;;:::i;30434:19::-;;;;;;;;;;;;;:::i;39970:45::-;;;;;;;;;;;;;;;;32403:143;;;;;;;;;;-1:-1:-1;32403:143:0;;;;;:::i;:::-;-1:-1:-1;;;;;32511:18:0;;;32484:7;32511:18;;;:11;:18;;;;;;;;:27;;;;;;;;;;;;;32403:143;53126:117;;;;;;;;;;;;53172:71;53126:117;;52649:70;;;;;;;;;;-1:-1:-1;52649:70:0;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;21764:10:1;21752:23;;;21734:42;;21807:2;21792:18;;21785:34;;;;21707:18;52649:70:0;21562:263:1;29894:244:0;;;;;;;;;;-1:-1:-1;29894:244:0;;;;;:::i;:::-;;:::i;48994:271::-;;;;;;;;;;-1:-1:-1;48994:271:0;;;;;:::i;:::-;;:::i;43419:86::-;;;;;;;;;;-1:-1:-1;43419:86:0;;;;;:::i;:::-;;:::i;50849:443::-;;;;;;;;;;-1:-1:-1;50849:443:0;;;;;:::i;:::-;;:::i;39497:81::-;;;;;;;;;;;;39536:42;39497:81;;43236:88;;;;;;;;;;-1:-1:-1;43236:88:0;;;;;:::i;:::-;;:::i;31205:92::-;31251:13;31284:5;31277:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;31205:92;:::o;32692:161::-;32767:4;32784:39;27608:10;32807:7;32816:6;32784:8;:39::i;:::-;-1:-1:-1;32841:4:0;32692:161;;;;;:::o;33324:397::-;33456:4;33473:36;33483:6;33491:9;33502:6;33473:9;:36::i;:::-;33520:171;33543:6;27608:10;33591:89;33629:6;33591:89;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;33591:19:0;;;;;;:11;:19;;;;;;;;27608:10;33591:33;;;;;;;;;;:37;:89::i;:::-;33520:8;:171::i;:::-;-1:-1:-1;33709:4:0;33324:397;;;;;:::o;51621:274::-;41342:9;;-1:-1:-1;;;;;41342:9:0;41355:10;41342:23;41334:72;;;;-1:-1:-1;;;41334:72:0;;;;;;;:::i;:::-;;;;;;;;;-1:-1:-1;;;;;51707:25:0;::::1;51699:95;;;::::0;-1:-1:-1;;;51699:95:0;;17755:2:1;51699:95:0::1;::::0;::::1;17737:21:1::0;17794:2;17774:18;;;17767:30;17833:34;17813:18;;;17806:62;17904:27;17884:18;;;17877:55;17949:19;;51699:95:0::1;17553:421:1::0;51699:95:0::1;51830:9;::::0;51810:43:::1;::::0;-1:-1:-1;;;;;51810:43:0;;::::1;::::0;51830:9:::1;::::0;51810:43:::1;::::0;51830:9:::1;::::0;51810:43:::1;51864:9;:23:::0;;-1:-1:-1;;;;;;51864:23:0::1;-1:-1:-1::0;;;;;51864:23:0;;;::::1;::::0;;;::::1;::::0;;51621:274::o;48517:364::-;41342:9;;-1:-1:-1;;;;;41342:9:0;41355:10;41342:23;41334:72;;;;-1:-1:-1;;;41334:72:0;;;;;;;:::i;:::-;39465:4:::1;48612:45;::::0;::::1;;;48604:139;;;::::0;-1:-1:-1;;;48604:139:0;;12470:2:1;48604:139:0::1;::::0;::::1;12452:21:1::0;12509:2;12489:18;;;12482:30;12548:34;12528:18;;;12521:62;12619:34;12599:18;;;12592:62;-1:-1:-1;;;12670:19:1;;;12663:48;12728:19;;48604:139:0::1;12268:485:1::0;48604:139:0::1;48794:15;::::0;48759:69:::1;::::0;;48794:15:::1;::::0;;::::1;;::::0;;::::1;19524:34:1::0;;19594:15;;19589:2;19574:18;;19567:43;48782:10:0::1;::::0;48759:69:::1;::::0;19472:18:1;48759:69:0::1;;;;;;;48839:15;:34:::0;;::::1;::::0;;::::1;;;-1:-1:-1::0;;48839:34:0;;::::1;::::0;;;::::1;::::0;;48517:364::o;34129:210::-;27608:10;34209:4;34258:25;;;:11;:25;;;;;;;;-1:-1:-1;;;;;34258:34:0;;;;;;;;;;34209:4;;34226:83;;34249:7;;34258:50;;34297:10;34258:38;:50::i;42715:162::-;28986:7;29013:6;-1:-1:-1;;;;;29013:6:0;27608:10;29160:23;29152:68;;;;-1:-1:-1;;;29152:68:0;;;;;;;:::i;:::-;42787:19:::1;42793:3;42798:7;42787:5;:19::i;:::-;-1:-1:-1::0;;;;;42844:15:0;;::::1;42840:1;42844:15:::0;;;:10:::1;:15;::::0;;;;;42817:52:::1;::::0;42844:15:::1;42861:7:::0;42817:14:::1;:52::i;:::-;42715:162:::0;;:::o;54186:104::-;54250:32;54260:10;54272:9;54250;:32::i;:::-;54186:104;:::o;49393:405::-;41342:9;;-1:-1:-1;;;;;41342:9:0;41355:10;41342:23;41334:72;;;;-1:-1:-1;;;41334:72:0;;;;;;;:::i;:::-;49526:5:::1;49500:22;:31;;;;49492:138;;;::::0;-1:-1:-1;;;49492:138:0;;13319:2:1;49492:138:0::1;::::0;::::1;13301:21:1::0;13358:2;13338:18;;;13331:30;13397:34;13377:18;;;13370:62;13468:34;13448:18;;;13441:62;13540:32;13519:19;;;13512:61;13590:19;;49492:138:0::1;13117:498:1::0;49492:138:0::1;49687:21;::::0;49646:87:::1;::::0;;-1:-1:-1;;;49687:21:0;;::::1;;::::0;;::::1;19524:34:1::0;;19594:15;;19589:2;19574:18;;19567:43;49675:10:0::1;::::0;49646:87:::1;::::0;19472:18:1;49646:87:0::1;;;;;;;49744:21;:46:::0;;::::1;::::0;;::::1;-1:-1:-1::0;;;49744:46:0::1;-1:-1:-1::0;;49744:46:0;;::::1;::::0;;;::::1;::::0;;49393:405::o;29591:148::-;28986:7;29013:6;-1:-1:-1;;;;;29013:6:0;27608:10;29160:23;29152:68;;;;-1:-1:-1;;;29152:68:0;;;;;;;:::i;:::-;29698:1:::1;29682:6:::0;;29661:40:::1;::::0;-1:-1:-1;;;;;29682:6:0;;::::1;::::0;29661:40:::1;::::0;29698:1;;29661:40:::1;29729:1;29712:19:::0;;-1:-1:-1;;;;;;29712:19:0::1;::::0;;29591:148::o;56804:1254::-;56912:7;56959:12;56945:11;:26;56937:79;;;;-1:-1:-1;;;56937:79:0;;11360:2:1;56937:79:0;;;11342:21:1;11399:2;11379:18;;;11372:30;11438:34;11418:18;;;11411:62;-1:-1:-1;;;11489:18:1;;;11482:38;11537:19;;56937:79:0;11158:404:1;56937:79:0;-1:-1:-1;;;;;57051:23:0;;57029:19;57051:23;;;:14;:23;;;;;;;;57089:17;57085:58;;57130:1;57123:8;;;;;57085:58;-1:-1:-1;;;;;57203:20:0;;;;;;:11;:20;;;;;57255:11;;57224:16;57239:1;57224:12;:16;:::i;:::-;57203:38;;;;;;;;;;;;;;;-1:-1:-1;57203:38:0;:48;;:63;57199:147;;-1:-1:-1;;;;;57290:20:0;;;;;;:11;:20;;;;;;57311:16;57326:1;57311:12;:16;:::i;:::-;57290:38;;;;;;;;;;;;;;;:44;;;57283:51;;;;;57199:147;-1:-1:-1;;;;;57407:20:0;;;;;;:11;:20;;;;;;;;:23;;;;;;;;:33;:23;:33;:47;-1:-1:-1;57403:88:0;;;57478:1;57471:8;;;;;57403:88;57503:12;;57545:16;57560:1;57545:12;:16;:::i;:::-;57530:31;;57572:428;57587:5;57579:13;;:5;:13;;;57572:428;;;57609:13;57651:1;57634:13;57642:5;57634;:13;:::i;:::-;57633:19;;;;:::i;:::-;57625:27;;:5;:27;:::i;:::-;-1:-1:-1;;;;;57717:20:0;;57694;57717;;;:11;:20;;;;;;;;:28;;;;;;;;;;;;;57694:51;;;;;;;;;;;;;;;;;;;;;;;;;;;;57609:43;;-1:-1:-1;57764:27:0;;57760:229;;;57819:8;;;;-1:-1:-1;57812:15:0;;-1:-1:-1;;;;57812:15:0;57760:229;57853:12;;:26;;;-1:-1:-1;57849:140:0;;;57908:6;57900:14;;57849:140;;;57963:10;57972:1;57963:6;:10;:::i;:::-;57955:18;;57849:140;57594:406;;57572:428;;;-1:-1:-1;;;;;;58017:20:0;;;;;;:11;:20;;;;;;;;:27;;;;;;;;;;:33;;;;-1:-1:-1;;56804:1254:0;;;;:::o;31127:7::-;31120:14;;31048:94;:::o;31521:96::-;31569:13;31602:7;31595:14;;;;;:::i;42975:165::-;41342:9;;-1:-1:-1;;;;;41342:9:0;41355:10;41342:23;41334:72;;;;-1:-1:-1;;;41334:72:0;;;;;;;:::i;:::-;43050:19:::1;43056:3;43061:7;43050:5;:19::i;50545:189::-:0;41342:9;;-1:-1:-1;;;;;41342:9:0;41355:10;41342:23;41334:72;;;;-1:-1:-1;;;41334:72:0;;;;;;;:::i;:::-;50633:50:::1;::::0;5946:14:1;;5939:22;5921:41;;50662:10:0::1;::::0;50633:50:::1;::::0;5909:2:1;5894:18;50633:50:0::1;;;;;;;50694:21;:32:::0;;-1:-1:-1;;50694:32:0::1;::::0;::::1;;::::0;;;::::1;::::0;;50545:189::o;35370:130::-;35426:4;29013:6;;-1:-1:-1;;;;;29013:6:0;27608:10;29160:23;29152:68;;;;-1:-1:-1;;;29152:68:0;;;;;;;:::i;:::-;35443:27:::1;27608:10:::0;35463:6:::1;35443:5;:27::i;:::-;-1:-1:-1::0;35488:4:0::1;29231:1;35370:130:::0;;;:::o;49923:209::-;41342:9;;-1:-1:-1;;;;;41342:9:0;41355:10;41342:23;41334:72;;;;-1:-1:-1;;;41334:72:0;;;;;;;:::i;:::-;50051:18:::1;::::0;50013:69:::1;::::0;;20962:25:1;;;21018:2;21003:18;;20996:34;;;50039:10:0::1;::::0;50013:69:::1;::::0;20935:18:1;50013:69:0::1;;;;;;;50093:18;:31:::0;49923:209::o;34841:311::-;34926:4;34943:179;27608:10;34993:7;35015:96;35054:15;35015:96;;;;;;;;;;;;;;;;;27608:10;35015:25;;;;:11;:25;;;;;;;;-1:-1:-1;;;;;35015:34:0;;;;;;;;;;;;:38;:96::i;32174:167::-;32252:4;32269:42;27608:10;32293:9;32304:6;32269:9;:42::i;47935:136::-;48030:21;;47985:7;;48012:51;;48057:5;;48012:40;;48030:21;-1:-1:-1;;;48030:21:0;;;;48012:13;31761:12;;;31681:100;48012:13;:17;;:40::i;:::-;:44;;:51::i;30460:21::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;56118:255::-;-1:-1:-1;;;;;56257:23:0;;56210:7;56257:23;;;:14;:23;;;;;;;;56298:16;:67;;56364:1;56298:67;;;-1:-1:-1;;;;;56317:20:0;;;;;;:11;:20;;;;;;56338:16;56353:1;56338:12;:16;:::i;:::-;56317:38;;;;;;;;;;;;;;;:44;;;56298:67;56291:74;56118:255;-1:-1:-1;;;56118:255:0:o;54724:1193::-;54917:23;52952:80;55046:6;:4;:6::i;:::-;55030:24;;;;;;55073:12;60460:9;;60350:153;55073:12;54967:165;;;;;;;6808:25:1;;;;6849:18;;;6842:34;;;;6892:18;;;6885:34;;;;55112:4:0;6935:18:1;;;;6928:60;;;;54967:165:0;;;;;;;;;;6780:19:1;;;54967:165:0;;54943:200;;;;;;53172:71;55201:140;;;6386:25:1;-1:-1:-1;;;;;6447:32:1;;6427:18;;;6420:60;6496:18;;;6489:34;;;6539:18;;;;6532:34;;;55201:140:0;;;;;;;;;;6358:19:1;;;55201:140:0;;;55177:175;;;;;;;-1:-1:-1;;;55406:123:0;;;4513:27:1;4556:11;;;4549:27;;;4592:12;;;4585:28;;;54943:200:0;;-1:-1:-1;;;4629:12:1;;55406:123:0;;;-1:-1:-1;;55406:123:0;;;;;;;;;55382:158;;55406:123;55382:158;;;;55553:17;55573:26;;;;;;;;;7226:25:1;;;7299:4;7287:17;;7267:18;;;7260:45;;;;7321:18;;;7314:34;;;7364:18;;;7357:34;;;55382:158:0;;-1:-1:-1;55553:17:0;55573:26;;7198:19:1;;55573:26:0;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;55573:26:0;;-1:-1:-1;;55573:26:0;;;-1:-1:-1;;;;;;;55618:23:0;;55610:75;;;;-1:-1:-1;;;55610:75:0;;14581:2:1;55610:75:0;;;14563:21:1;14620:2;14600:18;;;14593:30;14659:34;14639:18;;;14632:62;-1:-1:-1;;;14710:18:1;;;14703:37;14757:19;;55610:75:0;14379:403:1;55610:75:0;-1:-1:-1;;;;;55713:17:0;;;;;;:6;:17;;;;;:19;;;;;;:::i;:::-;;;;;55704:5;:28;55696:76;;;;-1:-1:-1;;;55696:76:0;;8915:2:1;55696:76:0;;;8897:21:1;8954:2;8934:18;;;8927:30;8993:34;8973:18;;;8966:62;-1:-1:-1;;;9044:18:1;;;9037:33;9087:19;;55696:76:0;8713:399:1;55696:76:0;55810:6;55791:15;:25;;55783:77;;;;-1:-1:-1;;;55783:77:0;;18181:2:1;55783:77:0;;;18163:21:1;18220:2;18200:18;;;18193:30;18259:34;18239:18;;;18232:62;-1:-1:-1;;;18310:18:1;;;18303:37;18357:19;;55783:77:0;17979:403:1;55783:77:0;55878:31;55888:9;55899;55878;:31::i;:::-;55871:38;;;;54724:1193;;;;;;;:::o;50269:151::-;41342:9;;-1:-1:-1;;;;;41342:9:0;41355:10;41342:23;41334:72;;;;-1:-1:-1;;;41334:72:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;50368:32:0;;;::::1;;::::0;;;:22:::1;:32;::::0;;;;:44;;-1:-1:-1;;50368:44:0::1;::::0;::::1;;::::0;;;::::1;::::0;;50269:151::o;30434:19::-;;;;;;;:::i;29894:244::-;28986:7;29013:6;-1:-1:-1;;;;;29013:6:0;27608:10;29160:23;29152:68;;;;-1:-1:-1;;;29152:68:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;29983:22:0;::::1;29975:73;;;::::0;-1:-1:-1;;;29975:73:0;;10533:2:1;29975:73:0::1;::::0;::::1;10515:21:1::0;10572:2;10552:18;;;10545:30;10611:34;10591:18;;;10584:62;-1:-1:-1;;;10662:18:1;;;10655:36;10708:19;;29975:73:0::1;10331:402:1::0;29975:73:0::1;30085:6;::::0;;30064:38:::1;::::0;-1:-1:-1;;;;;30064:38:0;;::::1;::::0;30085:6;::::1;::::0;30064:38:::1;::::0;::::1;30113:6;:17:::0;;-1:-1:-1;;;;;;30113:17:0::1;-1:-1:-1::0;;;;;30113:17:0;;;::::1;::::0;;;::::1;::::0;;29894:244::o;48994:271::-;41342:9;;-1:-1:-1;;;;;41342:9:0;41355:10;41342:23;41334:72;;;;-1:-1:-1;;;41334:72:0;;;;;;;:::i;:::-;49088:3:::1;49075:9;:16;;;;49067:95;;;::::0;-1:-1:-1;;;49067:95:0;;8440:2:1;49067:95:0::1;::::0;::::1;8422:21:1::0;8479:2;8459:18;;;8452:30;8518:34;8498:18;;;8491:62;8589:34;8569:18;;;8562:62;-1:-1:-1;;;8640:19:1;;;8633:33;8683:19;;49067:95:0::1;8238:470:1::0;49067:95:0::1;49206:8;::::0;49178:48:::1;::::0;;49206:8;;;::::1;;::::0;;::::1;19524:34:1::0;;19594:15;;19589:2;19574:18;;19567:43;49194:10:0::1;::::0;49178:48:::1;::::0;19472:18:1;49178:48:0::1;;;;;;;49237:8;:20:::0;;::::1;::::0;;::::1;::::0;::::1;-1:-1:-1::0;;49237:20:0;;::::1;::::0;;;::::1;::::0;;48994:271::o;43419:86::-;41342:9;;-1:-1:-1;;;;;41342:9:0;41355:10;41342:23;41334:72;;;;-1:-1:-1;;;41334:72:0;;;;;;;:::i;:::-;43482:6:::1;:15:::0;;;::::1;;-1:-1:-1::0;;;43482:15:0::1;-1:-1:-1::0;;;;43482:15:0;;::::1;::::0;;;::::1;::::0;;43419:86::o;50849:443::-;41342:9;;-1:-1:-1;;;;;41342:9:0;41355:10;41342:23;41334:72;;;;-1:-1:-1;;;41334:72:0;;;;;;;:::i;:::-;50928:15:::1;:45:::0;;-1:-1:-1;;;;;;50928:45:0::1;-1:-1:-1::0;;;;;50928:45:0;::::1;::::0;;::::1;::::0;;;51018:25:::1;::::0;;-1:-1:-1;;;51018:25:0;;;;:23:::1;::::0;:25:::1;::::0;;::::1;::::0;::::1;::::0;;;;;;;;;50928:45;51018:25;::::1;;::::0;::::1;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1::0;;;;;51000:52:0::1;;51061:4;51068:15;;;;;;;;;-1:-1:-1::0;;;;;51068:15:0::1;-1:-1:-1::0;;;;;51068:20:0::1;;:22;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;51000:91;::::0;-1:-1:-1;;;;;;51000:91:0::1;::::0;;;;;;-1:-1:-1;;;;;5090:15:1;;;51000:91:0::1;::::0;::::1;5072:34:1::0;5142:15;;5122:18;;;5115:43;5007:18;;51000:91:0::1;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;50984:13;:107:::0;;-1:-1:-1;;;;;;50984:107:0::1;-1:-1:-1::0;;;;;50984:107:0;;;::::1;::::0;;::::1;::::0;;51102:91:::1;;;::::0;-1:-1:-1;;;51102:91:0;;10940:2:1;51102:91:0::1;::::0;::::1;10922:21:1::0;10979:2;10959:18;;;10952:30;11018:34;10998:18;;;10991:62;-1:-1:-1;;;11069:18:1;;;11062:49;11128:19;;51102:91:0::1;10738:415:1::0;51102:91:0::1;51270:13;::::0;51252:15:::1;::::0;51209:75:::1;::::0;-1:-1:-1;;;;;51270:13:0;;::::1;::::0;51252:15;;::::1;::::0;51232:10:::1;::::0;51209:75:::1;::::0;51270:13:::1;::::0;51209:75:::1;50849:443:::0;:::o;43236:88::-;41342:9;;-1:-1:-1;;;;;41342:9:0;41355:10;41342:23;41334:72;;;;-1:-1:-1;;;41334:72:0;;;;;;;:::i;:::-;43300:7:::1;:16:::0;;;::::1;;-1:-1:-1::0;;;43300:16:0::1;-1:-1:-1::0;;;;43300:16:0;;::::1;::::0;;;::::1;::::0;;43236:88::o;38212:372::-;-1:-1:-1;;;;;38340:19:0;;38332:68;;;;-1:-1:-1;;;38332:68:0;;10128:2:1;38332:68:0;;;10110:21:1;10167:2;10147:18;;;10140:30;10206:34;10186:18;;;10179:62;-1:-1:-1;;;10257:18:1;;;10250:34;10301:19;;38332:68:0;9926:400:1;38332:68:0;-1:-1:-1;;;;;38419:21:0;;38411:68;;;;-1:-1:-1;;;38411:68:0;;18589:2:1;38411:68:0;;;18571:21:1;18628:2;18608:18;;;18601:30;18667:34;18647:18;;;18640:62;-1:-1:-1;;;18718:18:1;;;18711:32;18760:19;;38411:68:0;18387:398:1;38411:68:0;-1:-1:-1;;;;;38492:18:0;;;;;;;:11;:18;;;;;;;;:27;;;;;;;;;;;;;:36;;;38544:32;;6119:25:1;;;38544:32:0;;6092:18:1;38544:32:0;;;;;;;;38212:372;;;:::o;43583:1710::-;43689:6;43697:9;43708:6;41541:1;41519:19;:17;:19::i;:::-;:23;41515:335;;;-1:-1:-1;;;;;41581:30:0;;;;;;:22;:30;;;;;;;;:39;;;:102;;-1:-1:-1;;;;;;41641:33:0;;;;;;:22;:33;;;;;;;;:42;41581:102;41559:280;;;41736:19;:17;:19::i;:::-;41726:6;:29;;41718:105;;;;-1:-1:-1;;;41718:105:0;;14989:2:1;41718:105:0;;;14971:21:1;15028:2;15008:18;;;15001:30;15067:34;15047:18;;;15040:62;15138:33;15118:18;;;15111:61;15189:19;;41718:105:0;14787:427:1;41718:105:0;43731:7:::1;::::0;-1:-1:-1;;;43731:7:0;::::1;;;43730:8;:29:::0;::::1;;;-1:-1:-1::0;28986:7:0;29013:6;-1:-1:-1;;;;;43742:17:0;;::::1;29013:6:::0;;43742:17:::1;;43730:29;43727:114;;;43796:13;::::0;-1:-1:-1;;;;;43783:26:0;;::::1;43796:13:::0;::::1;43783:26;;43775:54;;;::::0;-1:-1:-1;;;43775:54:0;;12125:2:1;43775:54:0::1;::::0;::::1;12107:21:1::0;12164:2;12144:18;;;12137:30;-1:-1:-1;;;12183:18:1;;;12176:46;12239:18;;43775:54:0::1;11923:340:1::0;43775:54:0::1;43855:6;::::0;-1:-1:-1;;;43855:6:0;::::1;;;43854:7;:28:::0;::::1;;;-1:-1:-1::0;28986:7:0;29013:6;-1:-1:-1;;;;;43865:17:0;;::::1;29013:6:::0;;43865:17:::1;;43854:28;43851:109;;;43916:13;::::0;-1:-1:-1;;;;;43906:23:0;;::::1;43916:13:::0;::::1;43906:23;;43898:50;;;::::0;-1:-1:-1;;;43898:50:0;;18992:2:1;43898:50:0::1;::::0;::::1;18974:21:1::0;19031:2;19011:18;;;19004:30;-1:-1:-1;;;19050:18:1;;;19043:45;19105:18;;43898:50:0::1;18790:339:1::0;43898:50:0::1;44027:21;::::0;::::1;;:29;;:21:::0;:29:::1;:72:::0;::::1;;;-1:-1:-1::0;44073:17:0::1;::::0;-1:-1:-1;;;44073:17:0;::::1;;;:26;44027:72;:127;;;;-1:-1:-1::0;44124:15:0::1;::::0;-1:-1:-1;;;;;44124:15:0::1;44116:38:::0;::::1;44027:127;:171;;;;-1:-1:-1::0;44171:13:0::1;::::0;-1:-1:-1;;;;;44171:13:0::1;:27:::0;::::1;44027:171;:211;;;;-1:-1:-1::0;44225:13:0::1;::::0;-1:-1:-1;;;;;44215:23:0;;::::1;44225:13:::0;::::1;44215:23;;44027:211;:245;;;;-1:-1:-1::0;28986:7:0;29013:6;-1:-1:-1;;;;;44255:17:0;;::::1;29013:6:::0;;44255:17:::1;;44027:245;44009:318;;;44299:16;:14;:16::i;:::-;-1:-1:-1::0;;;;;44343:25:0;::::1;39536:42;44343:25;::::0;:49:::1;;-1:-1:-1::0;44372:15:0::1;::::0;::::1;::::0;::::1;;;:20:::0;44343:49:::1;44339:947;;;44409:42;44425:6;44433:9;44444:6;44409:15;:42::i;:::-;44339:947;;;44567:15;::::0;44536:17:::1;::::0;44556:38:::1;::::0;44588:5:::1;::::0;44556:27:::1;::::0;:6;;44567:15:::1;::::0;::::1;;;44556:10;:27::i;:38::-;44644:8;::::0;44536:58;;-1:-1:-1;44609:18:0::1;::::0;44630:32:::1;::::0;44658:3:::1;::::0;44630:23:::1;::::0;44536:58;;44644:8;;::::1;;;44630:13;:23::i;:32::-;44609:53:::0;-1:-1:-1;44677:23:0::1;44703:25;:9:::0;44609:53;44703:13:::1;:25::i;:::-;44677:51:::0;-1:-1:-1;44764:28:0::1;44677:51:::0;44764:10;:28:::1;:::i;:::-;44751:9;:41;44743:89;;;::::0;-1:-1:-1;;;44743:89:0;;13822:2:1;44743:89:0::1;::::0;::::1;13804:21:1::0;13861:2;13841:18;;;13834:30;13900:34;13880:18;;;13873:62;-1:-1:-1;;;13951:18:1;;;13944:33;13994:19;;44743:89:0::1;13620:399:1::0;44743:89:0::1;44907:18;44928:21;:6:::0;44939:9;44928:10:::1;:21::i;:::-;44907:42:::0;-1:-1:-1;44982:22:0::1;44995:9:::0;44907:42;44982:22:::1;:::i;:::-;44972:6;:32;44964:79;;;::::0;-1:-1:-1;;;44964:79:0;;9725:2:1;44964:79:0::1;::::0;::::1;9707:21:1::0;9764:2;9744:18;;;9737:30;9803:34;9783:18;;;9776:62;-1:-1:-1;;;9854:18:1;;;9847:32;9896:19;;44964:79:0::1;9523:398:1::0;44964:79:0::1;45060:49;45076:6;39536:42;45098:10;45060:15;:49::i;:::-;45124:55;45140:6;45156:4;45163:15;45124;:55::i;:::-;45194:46;45210:6;45218:9;45229:10;45194:15;:46::i;21920:166::-:0;22006:7;22042:12;22034:6;;;;22026:29;;;;-1:-1:-1;;;22026:29:0;;;;;;;;:::i;:::-;-1:-1:-1;22073:5:0;22077:1;22073;:5;:::i;:::-;22066:12;21920:166;-1:-1:-1;;;;21920:166:0:o;19093:179::-;19151:7;;19183:5;19187:1;19183;:5;:::i;:::-;19171:17;;19212:1;19207;:6;;19199:46;;;;-1:-1:-1;;;19199:46:0;;11769:2:1;19199:46:0;;;11751:21:1;11808:2;11788:18;;;11781:30;11847:29;11827:18;;;11820:57;11894:18;;19199:46:0;11567:351:1;36784:308:0;-1:-1:-1;;;;;36860:21:0;;36852:65;;;;-1:-1:-1;;;36852:65:0;;15823:2:1;36852:65:0;;;15805:21:1;15862:2;15842:18;;;15835:30;15901:33;15881:18;;;15874:61;15952:18;;36852:65:0;15621:355:1;36852:65:0;36945:12;;:24;;36962:6;36945:16;:24::i;:::-;36930:12;:39;-1:-1:-1;;;;;37001:18:0;;;;;;:9;:18;;;;;;:30;;37024:6;37001:22;:30::i;:::-;-1:-1:-1;;;;;36980:18:0;;;;;;:9;:18;;;;;;:51;;;;37047:37;;36980:18;;;37047:37;;;;37077:6;6119:25:1;;6107:2;6092:18;;5973:177;37047:37:0;;;;;;;;36784:308;;:::o;58513:947::-;58619:6;-1:-1:-1;;;;;58609:16:0;:6;-1:-1:-1;;;;;58609:16:0;;;:30;;;;;58638:1;58629:6;:10;58609:30;58605:848;;;-1:-1:-1;;;;;58660:20:0;;;58656:385;;-1:-1:-1;;;;;58768:22:0;;58749:16;58768:22;;;:14;:22;;;;;;;;;58829:13;:60;;58888:1;58829:60;;;-1:-1:-1;;;;;58845:19:0;;;;;;:11;:19;;;;;;58865:13;58877:1;58865:9;:13;:::i;:::-;58845:34;;;;;;;;;;;;;;;:40;;;58829:60;58809:80;-1:-1:-1;58908:17:0;58928:21;58809:80;58942:6;58928:13;:21::i;:::-;58908:41;;58968:57;58985:6;58993:9;59004;59015;58968:16;:57::i;:::-;58682:359;;;58656:385;-1:-1:-1;;;;;59061:20:0;;;59057:385;;-1:-1:-1;;;;;59169:22:0;;59150:16;59169:22;;;:14;:22;;;;;;;;;59230:13;:60;;59289:1;59230:60;;;-1:-1:-1;;;;;59246:19:0;;;;;;:11;:19;;;;;;59266:13;59278:1;59266:9;:13;:::i;:::-;59246:34;;;;;;;;;;;;;;;:40;;;59230:60;59210:80;-1:-1:-1;59309:17:0;59329:21;59210:80;59343:6;59329:13;:21::i;:::-;59309:41;;59369:57;59386:6;59394:9;59405;59416;59369:16;:57::i;59057:385::-;58513:947;;;:::o;58066:439::-;-1:-1:-1;;;;;58183:21:0;;;58157:23;58183:21;;;:10;:21;;;;;;;;;;31936:9;:18;;;;;;58319:21;;;;:33;;;-1:-1:-1;;;;;;58319:33:0;;;;;;;58370:54;;58183:21;;;;;31936:18;;58319:33;;58183:21;;;58370:54;;58157:23;58370:54;58437:60;58452:15;58469:9;58480:16;58437:14;:60::i;:::-;58146:359;;58066:439;;:::o;37424:348::-;-1:-1:-1;;;;;37500:21:0;;37492:67;;;;-1:-1:-1;;;37492:67:0;;17353:2:1;37492:67:0;;;17335:21:1;17392:2;17372:18;;;17365:30;17431:34;17411:18;;;17404:62;-1:-1:-1;;;17482:18:1;;;17475:31;17523:19;;37492:67:0;17151:397:1;37492:67:0;37593:68;37616:6;37593:68;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;37593:18:0;;;;;;:9;:18;;;;;;;:68;:22;:68::i;:::-;-1:-1:-1;;;;;37572:18:0;;;;;;:9;:18;;;;;:89;37687:12;;:24;;37704:6;37687:16;:24::i;:::-;37672:12;:39;37727:37;;6119:25:1;;;37753:1:0;;-1:-1:-1;;;;;37727:37:0;;;;;6107:2:1;6092:18;37727:37:0;5973:177:1;19972:220:0;20030:7;20054:6;20050:20;;-1:-1:-1;20069:1:0;20062:8;;20050:20;20081:9;20093:5;20097:1;20093;:5;:::i;:::-;20081:17;-1:-1:-1;20126:1:0;20117:5;20121:1;20081:17;20117:5;:::i;:::-;:10;20109:56;;;;-1:-1:-1;;;20109:56:0;;15421:2:1;20109:56:0;;;15403:21:1;15460:2;15440:18;;;15433:30;15499:34;15479:18;;;15472:62;-1:-1:-1;;;15550:18:1;;;15543:31;15591:19;;20109:56:0;15219:397:1;20670:153:0;20728:7;20760:1;20756;:5;20748:44;;;;-1:-1:-1;;;20748:44:0;;14226:2:1;20748:44:0;;;14208:21:1;14265:2;14245:18;;;14238:30;14304:28;14284:18;;;14277:56;14350:18;;20748:44:0;14024:350:1;20748:44:0;20810:5;20814:1;20810;:5;:::i;45332:1346::-;41909:17;:24;;-1:-1:-1;;;;;;;41909:24:0;;;;;;42059:15:::1;::::0;;-1:-1:-1;;42085:19:0;::::1;::::0;;;45454:4:::2;-1:-1:-1::0;31936:18:0;;;-1:-1:-1;31936:18:0;;;;;;41909:24;42059:15;;::::1;;;::::0;31936:18;45500:19:::2;:17;:19::i;:::-;45471:48;;45576:18;45553:20;:41;:85;;45618:20;45553:85;;;45597:18;45553:85;45530:108;;45679:18;;45655:20;:42;45651:1020;;45781:18;::::0;45757:21:::2;45884:20;45781:18:::0;45902:1:::2;45884:17;:20::i;:::-;45869:35:::0;-1:-1:-1;45919:17:0::2;45939:23;:13:::0;45869:35;45939:17:::2;:23::i;:::-;45919:43:::0;-1:-1:-1;46285:21:0::2;46359:22;46376:4:::0;46359:16:::2;:22::i;:::-;46450:18;46471:41;:21;46497:14:::0;46471:25:::2;:41::i;:::-;46450:62;;46559:35;46572:9;46583:10;46559:12;:35::i;:::-;46616:43;::::0;;21243:25:1;;;21299:2;21284:18;;21277:34;;;21327:18;;;21320:34;;;46616:43:0::2;::::0;21231:2:1;21216:18;46616:43:0::2;;;;;;;45699:972;;;;;45651:1020;-1:-1:-1::0;;42127:15:0::1;:34:::0;;::::1;::::0;;::::1;;;-1:-1:-1::0;;42127:34:0;;::::1;::::0;;;::::1;::::0;;41956:17;:25;;-1:-1:-1;;;;41956:25:0;;;45332:1346::o;35990:513::-;-1:-1:-1;;;;;36130:20:0;;36122:70;;;;-1:-1:-1;;;36122:70:0;;9319:2:1;36122:70:0;;;9301:21:1;9358:2;9338:18;;;9331:30;9397:34;9377:18;;;9370:62;-1:-1:-1;;;9448:18:1;;;9441:35;9493:19;;36122:70:0;9117:401:1;36122:70:0;-1:-1:-1;;;;;36211:23:0;;36203:71;;;;-1:-1:-1;;;36203:71:0;;16949:2:1;36203:71:0;;;16931:21:1;16988:2;16968:18;;;16961:30;17027:34;17007:18;;;17000:62;-1:-1:-1;;;17078:18:1;;;17071:33;17121:19;;36203:71:0;16747:399:1;36203:71:0;36307;36329:6;36307:71;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;36307:17:0;;;;;;:9;:17;;;;;;;:71;:21;:71::i;:::-;-1:-1:-1;;;;;36287:17:0;;;;;;;:9;:17;;;;;;:91;;;;36412:20;;;;;;;:32;;36437:6;36412:24;:32::i;:::-;-1:-1:-1;;;;;36389:20:0;;;;;;;:9;:20;;;;;;;:55;;;;36460:35;;;;;;;;;;36488:6;6119:25:1;;6107:2;6092:18;;5973:177;19555:158:0;19613:7;19646:1;19641;:6;;19633:49;;;;-1:-1:-1;;;19633:49:0;;12960:2:1;19633:49:0;;;12942:21:1;12999:2;12979:18;;;12972:30;13038:32;13018:18;;;13011:60;13088:18;;19633:49:0;12758:354:1;19633:49:0;19700:5;19704:1;19700;:5;:::i;59468:705::-;59647:18;59668:77;59675:12;59668:77;;;;;;;;;;;;;;;;;:6;:77::i;:::-;59647:98;;59777:1;59762:12;:16;;;:85;;;;-1:-1:-1;;;;;;59782:22:0;;;;;;:11;:22;;;;;:65;;;;59805:16;59820:1;59805:12;:16;:::i;:::-;59782:40;;;;;;;;;;;;;;;-1:-1:-1;59782:40:0;:50;;:65;59762:85;59758:339;;;-1:-1:-1;;;;;59864:22:0;;;;;;:11;:22;;;;;59913:8;;59887:16;59902:1;59887:12;:16;:::i;:::-;59864:40;;;;;;;;;;;;;-1:-1:-1;59864:40:0;:46;;:57;59758:339;;;59993:33;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;59954:22:0;;-1:-1:-1;59954:22:0;;;:11;:22;;;;;:36;;;;;;;;;;;:72;;;;-1:-1:-1;;59954:72:0;;;;;;;;-1:-1:-1;59954:72:0;;;;60069:16;;59954:36;;60069:16;:::i;:::-;-1:-1:-1;;;;;60041:25:0;;;;;;:14;:25;;;;;:44;;-1:-1:-1;;60041:44:0;;;;;;;;;;;;59758:339;60114:51;;;20962:25:1;;;21018:2;21003:18;;20996:34;;;-1:-1:-1;;;;;60114:51:0;;;;;20935:18:1;60114:51:0;;;;;;;59636:537;59468:705;;;;:::o;46720:591::-;46872:16;;;46886:1;46872:16;;;;;;;;46848:21;;46872:16;;;;;;;;;;-1:-1:-1;46872:16:0;46848:40;;46917:4;46899;46904:1;46899:7;;;;;;;;:::i;:::-;-1:-1:-1;;;;;46899:23:0;;;:7;;;;;;;;;;:23;;;;46943:15;;:22;;;-1:-1:-1;;;46943:22:0;;;;:15;;;;;:20;;:22;;;;;46899:7;;46943:22;;;;;:15;:22;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;46933:4;46938:1;46933:7;;;;;;;;:::i;:::-;-1:-1:-1;;;;;46933:32:0;;;:7;;;;;;;;;:32;47010:15;;46978:62;;46995:4;;47010:15;47028:11;46978:8;:62::i;:::-;47079:15;;:224;;-1:-1:-1;;;47079:224:0;;-1:-1:-1;;;;;47079:15:0;;;;:66;;:224;;47160:11;;47079:15;;47230:4;;47257;;47277:15;;47079:224;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;47347:516;47527:15;;47495:62;;47512:4;;-1:-1:-1;;;;;47527:15:0;47545:11;47495:8;:62::i;:::-;47600:15;;-1:-1:-1;;;;;47600:15:0;:31;47639:9;47672:4;47692:11;47600:15;;47804:10;51444:9;;-1:-1:-1;;;;;51444:9:0;;51376:85;47804:10;47600:255;;;;;;-1:-1:-1;;;;;;47600:255:0;;;-1:-1:-1;;;;;5528:15:1;;;47600:255:0;;;5510:34:1;5560:18;;;5553:34;;;;5603:18;;;5596:34;;;;5646:18;;;5639:34;5710:15;;;5689:19;;;5682:44;47829:15:0;5742:19:1;;;5735:35;5444:19;;47600:255:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;47347:516;;:::o;60181:161::-;60256:6;60294:12;60287:5;60283:9;;60275:32;;;;-1:-1:-1;;;60275:32:0;;;;;;;;:::i;:::-;-1:-1:-1;60332:1:0;;60181:161;-1:-1:-1;;60181:161:0:o;14:160:1:-;79:20;;135:13;;128:21;118:32;;108:60;;164:1;161;154:12;179:247;238:6;291:2;279:9;270:7;266:23;262:32;259:52;;;307:1;304;297:12;259:52;346:9;333:23;365:31;390:5;365:31;:::i;431:251::-;501:6;554:2;542:9;533:7;529:23;525:32;522:52;;;570:1;567;560:12;522:52;602:9;596:16;621:31;646:5;621:31;:::i;687:388::-;755:6;763;816:2;804:9;795:7;791:23;787:32;784:52;;;832:1;829;822:12;784:52;871:9;858:23;890:31;915:5;890:31;:::i;:::-;940:5;-1:-1:-1;997:2:1;982:18;;969:32;1010:33;969:32;1010:33;:::i;:::-;1062:7;1052:17;;;687:388;;;;;:::o;1080:456::-;1157:6;1165;1173;1226:2;1214:9;1205:7;1201:23;1197:32;1194:52;;;1242:1;1239;1232:12;1194:52;1281:9;1268:23;1300:31;1325:5;1300:31;:::i;:::-;1350:5;-1:-1:-1;1407:2:1;1392:18;;1379:32;1420:33;1379:32;1420:33;:::i;:::-;1080:456;;1472:7;;-1:-1:-1;;;1526:2:1;1511:18;;;;1498:32;;1080:456::o;1541:315::-;1606:6;1614;1667:2;1655:9;1646:7;1642:23;1638:32;1635:52;;;1683:1;1680;1673:12;1635:52;1722:9;1709:23;1741:31;1766:5;1741:31;:::i;:::-;1791:5;-1:-1:-1;1815:35:1;1846:2;1831:18;;1815:35;:::i;:::-;1805:45;;1541:315;;;;;:::o;1861:::-;1929:6;1937;1990:2;1978:9;1969:7;1965:23;1961:32;1958:52;;;2006:1;2003;1996:12;1958:52;2045:9;2032:23;2064:31;2089:5;2064:31;:::i;:::-;2114:5;2166:2;2151:18;;;;2138:32;;-1:-1:-1;;;1861:315:1:o;2181:687::-;2283:6;2291;2299;2307;2315;2323;2376:3;2364:9;2355:7;2351:23;2347:33;2344:53;;;2393:1;2390;2383:12;2344:53;2432:9;2419:23;2451:31;2476:5;2451:31;:::i;:::-;2501:5;-1:-1:-1;2553:2:1;2538:18;;2525:32;;-1:-1:-1;2604:2:1;2589:18;;2576:32;;-1:-1:-1;2660:2:1;2645:18;;2632:32;2708:4;2695:18;;2683:31;;2673:59;;2728:1;2725;2718:12;2673:59;2181:687;;;;-1:-1:-1;2181:687:1;;2805:3;2790:19;;2777:33;;2857:3;2842:19;;;2829:33;;-1:-1:-1;2181:687:1;-1:-1:-1;;2181:687:1:o;2873:419::-;2940:6;2948;3001:2;2989:9;2980:7;2976:23;2972:32;2969:52;;;3017:1;3014;3007:12;2969:52;3056:9;3043:23;3075:31;3100:5;3075:31;:::i;:::-;3125:5;-1:-1:-1;3182:2:1;3167:18;;3154:32;3230:10;3217:24;;3205:37;;3195:65;;3256:1;3253;3246:12;3297:180;3353:6;3406:2;3394:9;3385:7;3381:23;3377:32;3374:52;;;3422:1;3419;3412:12;3374:52;3445:26;3461:9;3445:26;:::i;3482:272::-;3540:6;3593:2;3581:9;3572:7;3568:23;3564:32;3561:52;;;3609:1;3606;3599:12;3561:52;3648:9;3635:23;3698:6;3691:5;3687:18;3680:5;3677:29;3667:57;;3720:1;3717;3710:12;3759:180;3818:6;3871:2;3859:9;3850:7;3846:23;3842:32;3839:52;;;3887:1;3884;3877:12;3839:52;-1:-1:-1;3910:23:1;;3759:180;-1:-1:-1;3759:180:1:o;3944:306::-;4032:6;4040;4048;4101:2;4089:9;4080:7;4076:23;4072:32;4069:52;;;4117:1;4114;4107:12;4069:52;4146:9;4140:16;4130:26;;4196:2;4185:9;4181:18;4175:25;4165:35;;4240:2;4229:9;4225:18;4219:25;4209:35;;3944:306;;;;;:::o;7636:597::-;7748:4;7777:2;7806;7795:9;7788:21;7838:6;7832:13;7881:6;7876:2;7865:9;7861:18;7854:34;7906:1;7916:140;7930:6;7927:1;7924:13;7916:140;;;8025:14;;;8021:23;;8015:30;7991:17;;;8010:2;7987:26;7980:66;7945:10;;7916:140;;;8074:6;8071:1;8068:13;8065:91;;;8144:1;8139:2;8130:6;8119:9;8115:22;8111:31;8104:42;8065:91;-1:-1:-1;8217:2:1;8196:15;-1:-1:-1;;8192:29:1;8177:45;;;;8224:2;8173:54;;7636:597;-1:-1:-1;;;7636:597:1:o;15981:356::-;16183:2;16165:21;;;16202:18;;;16195:30;16261:34;16256:2;16241:18;;16234:62;16328:2;16313:18;;15981:356::o;16342:400::-;16544:2;16526:21;;;16583:2;16563:18;;;16556:30;16622:34;16617:2;16602:18;;16595:62;-1:-1:-1;;;16688:2:1;16673:18;;16666:34;16732:3;16717:19;;16342:400::o;19803:980::-;20065:4;20113:3;20102:9;20098:19;20144:6;20133:9;20126:25;20170:2;20208:6;20203:2;20192:9;20188:18;20181:34;20251:3;20246:2;20235:9;20231:18;20224:31;20275:6;20310;20304:13;20341:6;20333;20326:22;20379:3;20368:9;20364:19;20357:26;;20418:2;20410:6;20406:15;20392:29;;20439:1;20449:195;20463:6;20460:1;20457:13;20449:195;;;20528:13;;-1:-1:-1;;;;;20524:39:1;20512:52;;20619:15;;;;20584:12;;;;20560:1;20478:9;20449:195;;;-1:-1:-1;;;;;;;20700:32:1;;;;20695:2;20680:18;;20673:60;-1:-1:-1;;;20764:3:1;20749:19;20742:35;20661:3;19803:980;-1:-1:-1;;;19803:980:1:o;22019:128::-;22059:3;22090:1;22086:6;22083:1;22080:13;22077:39;;;22096:18;;:::i;:::-;-1:-1:-1;22132:9:1;;22019:128::o;22152:228::-;22191:3;22219:10;22256:2;22253:1;22249:10;22286:2;22283:1;22279:10;22317:3;22313:2;22309:12;22304:3;22301:21;22298:47;;;22325:18;;:::i;:::-;22361:13;;22152:228;-1:-1:-1;;;;22152:228:1:o;22385:120::-;22425:1;22451;22441:35;;22456:18;;:::i;:::-;-1:-1:-1;22490:9:1;;22385:120::o;22510:191::-;22549:1;22575:10;22612:2;22609:1;22605:10;22634:3;22624:37;;22641:18;;:::i;:::-;22679:10;;22675:20;;;;;22510:191;-1:-1:-1;;22510:191:1:o;22706:168::-;22746:7;22812:1;22808;22804:6;22800:14;22797:1;22794:21;22789:1;22782:9;22775:17;22771:45;22768:71;;;22819:18;;:::i;:::-;-1:-1:-1;22859:9:1;;22706:168::o;22879:125::-;22919:4;22947:1;22944;22941:8;22938:34;;;22952:18;;:::i;:::-;-1:-1:-1;22989:9:1;;22879:125::o;23009:221::-;23048:4;23077:10;23137;;;;23107;;23159:12;;;23156:38;;;23174:18;;:::i;:::-;23211:13;;23009:221;-1:-1:-1;;;23009:221:1:o;23235:380::-;23314:1;23310:12;;;;23357;;;23378:61;;23432:4;23424:6;23420:17;23410:27;;23378:61;23485:2;23477:6;23474:14;23454:18;23451:38;23448:161;;;23531:10;23526:3;23522:20;23519:1;23512:31;23566:4;23563:1;23556:15;23594:4;23591:1;23584:15;23448:161;;23235:380;;;:::o;23620:135::-;23659:3;-1:-1:-1;;23680:17:1;;23677:43;;;23700:18;;:::i;:::-;-1:-1:-1;23747:1:1;23736:13;;23620:135::o;23760:127::-;23821:10;23816:3;23812:20;23809:1;23802:31;23852:4;23849:1;23842:15;23876:4;23873:1;23866:15;23892:127;23953:10;23948:3;23944:20;23941:1;23934:31;23984:4;23981:1;23974:15;24008:4;24005:1;23998:15;24024:127;24085:10;24080:3;24076:20;24073:1;24066:31;24116:4;24113:1;24106:15;24140:4;24137:1;24130:15;24288:131;-1:-1:-1;;;;;24363:31:1;;24353:42;;24343:70;;24409:1;24406;24399:12
Swarm Source
ipfs://c9c18ded56748ea31b690985ee4282628fa481e89772cc8f6472753e14adb064
Loading...
Loading
OVERVIEW
The LovePot is developing no-loss “jackpot” pool, built on binance Smart Chain technology specifically dedicated to decentralized financial applications.Loading...
Loading
Net Worth in USD
$20,715.57
Net Worth in BNB
Token Allocations
LOVE
77.62%
BNB
20.36%
BSC-USD
2.02%
Multichain Portfolio | 32 Chains
Loading...
Loading
Loading...
Loading
Loading...
Loading
[ Download: CSV Export ]
A contract address hosts a smart contract, which is a set of code stored on the blockchain that runs when predetermined conditions are met. Learn more about addresses in our Knowledge Base.