Feature Tip: Add private address tag to any address under My Name Tag !
Overview
ETH Balance
0 ETH
Eth Value
$0.00More Info
Private Name Tags
ContractCreator
View more zero value Internal Transactions in Advanced View mode
Advanced mode:
Loading...
Loading
Contract Name:
SROOT
Compiler Version
v0.8.7+commit.e28d00a7
Contract Source Code (Solidity)
/** *Submitted for verification at Etherscan.io on 2022-04-06 */ /** *Submitted for verification at Etherscan.io on 2022-02-18 */ /** *Submitted for verification at Etherscan.io on 2022-02-13 */ /** *Submitted for verification at Etherscan.io on 2022-02-09 */ /** *Submitted for verification at Etherscan.io on 2022-02-05 */ // SPDX-License-Identifier: MIT pragma solidity >=0.7.0 <0.9.0; library AddressUpgradeable { /** * @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; 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"); (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"); (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"); (bool success, bytes memory returndata) = target.staticcall(data); return verifyCallResult(success, returndata, errorMessage); } /** * @dev Tool to verifies that a low level call was successful, and revert if it wasn't, either by bubbling the * revert reason using the provided one. * * _Available since v4.3._ */ function verifyCallResult( bool success, bytes memory returndata, string memory errorMessage ) internal pure returns (bytes memory) { if (success) { return returndata; } else { // 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 assembly { let returndata_size := mload(returndata) revert(add(32, returndata), returndata_size) } } else { revert(errorMessage); } } } } library SafeMathUpgradeable { /** * @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) { return sub(a, b, "SafeMath: subtraction overflow"); } /** * @dev Returns the subtraction of two unsigned integers, reverting with custom message on * overflow (when the result is negative). * * 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); uint256 c = a - b; return c; } /** * @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) { // 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 0; } uint256 c = a * b; require(c / a == b, "SafeMath: multiplication overflow"); return c; } /** * @dev Returns the integer division of two unsigned integers. Reverts 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) { return div(a, b, "SafeMath: division by zero"); } /** * @dev Returns the integer division of two unsigned integers. Reverts with custom message on * division by zero. The result is rounded towards zero. * * Counterpart to Solidity's `/` operator. Note: this function uses a * `revert` opcode (which leaves remaining gas untouched) while Solidity * uses an invalid opcode to revert (consuming all remaining gas). * * Requirements: * * - The divisor cannot be zero. */ function div(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) { require(b > 0, errorMessage); uint256 c = a / b; // assert(a == b * c + a % b); // There is no case in which this doesn't hold return c; } /** * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo), * Reverts when dividing by zero. * * Counterpart to Solidity's `%` operator. This function uses a `revert` * opcode (which leaves remaining gas untouched) while Solidity uses an * invalid opcode to revert (consuming all remaining gas). * * Requirements: * * - The divisor cannot be zero. */ function mod(uint256 a, uint256 b) internal pure returns (uint256) { return mod(a, b, "SafeMath: modulo by zero"); } /** * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo), * Reverts with custom message 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, string memory errorMessage) internal pure returns (uint256) { require(b != 0, errorMessage); return a % b; } } abstract contract Initializable { /** * @dev Indicates that the contract has been initialized. */ bool private _initialized; /** * @dev Indicates that the contract is in the process of being initialized. */ bool private _initializing; /** * @dev Modifier to protect an initializer function from being invoked twice. */ modifier initializer() { // If the contract is initializing we ignore whether _initialized is set in order to support multiple // inheritance patterns, but we only do this in the context of a constructor, because in other contexts the // contract may have been reentered. require(_initializing ? _isConstructor() : !_initialized, "Initializable: contract is already initialized"); bool isTopLevelCall = !_initializing; if (isTopLevelCall) { _initializing = true; _initialized = true; } _; if (isTopLevelCall) { _initializing = false; } } /** * @dev Modifier to protect an initialization function so that it can only be invoked by functions with the * {initializer} modifier, directly or indirectly. */ modifier onlyInitializing() { require(_initializing, "Initializable: contract is not initializing"); _; } function _isConstructor() private view returns (bool) { return !AddressUpgradeable.isContract(address(this)); } } abstract contract ContextUpgradeable is Initializable { function __Context_init() internal onlyInitializing { __Context_init_unchained(); } function __Context_init_unchained() internal onlyInitializing { } function _msgSender() internal view virtual returns (address) { return msg.sender; } function _msgData() internal view virtual returns (bytes calldata) { return msg.data; } uint256[50] private __gap; } abstract contract OwnableUpgradeable is Initializable, ContextUpgradeable { address private _owner; event OwnershipTransferred(address indexed previousOwner, address indexed newOwner); /** * @dev Initializes the contract setting the deployer as the initial owner. */ function __Ownable_init() internal onlyInitializing { __Context_init_unchained(); __Ownable_init_unchained(); } function __Ownable_init_unchained() internal onlyInitializing { _transferOwnership(_msgSender()); } /** * @dev Returns the address of the current owner. */ function owner() public view virtual returns (address) { return _owner; } /** * @dev Throws if called by any account other than the owner. */ modifier onlyOwner() { require(owner() == _msgSender(), "Ownable: caller is not the owner"); _; } /** * @dev Leaves the contract without owner. It will not be possible to call * `onlyOwner` functions anymore. Can only be called by the current owner. * * NOTE: Renouncing ownership will leave the contract without an owner, * thereby removing any functionality that is only available to the owner. */ function renounceOwnership() public virtual onlyOwner { _transferOwnership(address(0)); } /** * @dev Transfers ownership of the contract to a new account (`newOwner`). * Can only be called by the current owner. */ function transferOwnership(address newOwner) public virtual onlyOwner { require(newOwner != address(0), "Ownable: new owner is the zero address"); _transferOwnership(newOwner); } /** * @dev Transfers ownership of the contract to a new account (`newOwner`). * Internal function without access restriction. */ function _transferOwnership(address newOwner) internal virtual { address oldOwner = _owner; _owner = newOwner; emit OwnershipTransferred(oldOwner, newOwner); } uint256[49] private __gap; } interface IERC20Upgradeable { /** * @dev Returns the amount of tokens in existence. */ function totalSupply() external view returns (uint256); /** * @dev Returns the amount of tokens owned by `account`. */ function balanceOf(address account) external view returns (uint256); /** * @dev Moves `amount` tokens from the caller's account to `recipient`. * * Returns a boolean value indicating whether the operation succeeded. * * Emits a {Transfer} event. */ function transfer(address recipient, uint256 amount) external returns (bool); /** * @dev Returns the remaining number of tokens that `spender` will be * allowed to spend on behalf of `owner` through {transferFrom}. This is * zero by default. * * This value changes when {approve} or {transferFrom} are called. */ function allowance(address owner, address spender) external view returns (uint256); /** * @dev Sets `amount` as the allowance of `spender` over the caller's tokens. * * Returns a boolean value indicating whether the operation succeeded. * * IMPORTANT: Beware that changing an allowance with this method brings the risk * that someone may use both the old and the new allowance by unfortunate * transaction ordering. One possible solution to mitigate this race * condition is to first reduce the spender's allowance to 0 and set the * desired value afterwards: * https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729 * * Emits an {Approval} event. */ function approve(address spender, uint256 amount) external returns (bool); /** * @dev Moves `amount` tokens from `sender` to `recipient` using the * allowance mechanism. `amount` is then deducted from the caller's * allowance. * * Returns a boolean value indicating whether the operation succeeded. * * Emits a {Transfer} event. */ function transferFrom( address sender, address recipient, uint256 amount ) external returns (bool); /** * @dev Emitted when `value` tokens are moved from one account (`from`) to * another (`to`). * * Note that `value` may be zero. */ event Transfer(address indexed from, address indexed to, uint256 value); /** * @dev Emitted when the allowance of a `spender` for an `owner` is set by * a call to {approve}. `value` is the new allowance. */ event Approval(address indexed owner, address indexed spender, uint256 value); } interface IERC20MetadataUpgradeable is IERC20Upgradeable { /** * @dev Returns the name of the token. */ function name() external view returns (string memory); /** * @dev Returns the symbol of the token. */ function symbol() external view returns (string memory); /** * @dev Returns the decimals places of the token. */ function decimals() external view returns (uint8); } contract ERC20Upgradeable is Initializable, ContextUpgradeable, IERC20Upgradeable, IERC20MetadataUpgradeable { mapping(address => uint256) private _balances; mapping(address => mapping(address => uint256)) private _allowances; uint256 private _totalSupply; string private _name; string private _symbol; /** * @dev Sets the values for {name} and {symbol}. * * The default value of {decimals} is 18. To select a different value for * {decimals} you should overload it. * * All two of these values are immutable: they can only be set once during * construction. */ function __ERC20_init(string memory name_, string memory symbol_) internal onlyInitializing { __Context_init_unchained(); __ERC20_init_unchained(name_, symbol_); } function __ERC20_init_unchained(string memory name_, string memory symbol_) internal onlyInitializing { _name = name_; _symbol = symbol_; } /** * @dev Returns the name of the token. */ function name() public view virtual override returns (string memory) { return _name; } /** * @dev Returns the symbol of the token, usually a shorter version of the * name. */ function symbol() public view virtual override returns (string memory) { return _symbol; } /** * @dev Returns the number of decimals used to get its user representation. * For example, if `decimals` equals `2`, a balance of `505` tokens should * be displayed to a user as `5.05` (`505 / 10 ** 2`). * * Tokens usually opt for a value of 18, imitating the relationship between * Ether and Wei. This is the value {ERC20} uses, unless this function is * overridden; * * NOTE: This information is only used for _display_ purposes: it in * no way affects any of the arithmetic of the contract, including * {IERC20-balanceOf} and {IERC20-transfer}. */ function decimals() public view virtual override returns (uint8) { return 18; } /** * @dev See {IERC20-totalSupply}. */ function totalSupply() public view virtual override returns (uint256) { return _totalSupply; } /** * @dev See {IERC20-balanceOf}. */ function balanceOf(address account) public view virtual override returns (uint256) { return _balances[account]; } /** * @dev See {IERC20-transfer}. * * Requirements: * * - `recipient` cannot be the zero address. * - the caller must have a balance of at least `amount`. */ function transfer(address recipient, uint256 amount) public virtual override returns (bool) { _transfer(_msgSender(), recipient, amount); return true; } /** * @dev See {IERC20-allowance}. */ function allowance(address owner, address spender) public view virtual override returns (uint256) { return _allowances[owner][spender]; } /** * @dev See {IERC20-approve}. * * Requirements: * * - `spender` cannot be the zero address. */ function approve(address spender, uint256 amount) public virtual override returns (bool) { _approve(_msgSender(), spender, amount); return true; } /** * @dev See {IERC20-transferFrom}. * * Emits an {Approval} event indicating the updated allowance. This is not * required by the EIP. See the note at the beginning of {ERC20}. * * Requirements: * * - `sender` and `recipient` cannot be the zero address. * - `sender` must have a balance of at least `amount`. * - the caller must have allowance for ``sender``'s tokens of at least * `amount`. */ function transferFrom( address sender, address recipient, uint256 amount ) public virtual override returns (bool) { _transfer(sender, recipient, amount); uint256 currentAllowance = _allowances[sender][_msgSender()]; require(currentAllowance >= amount, "ERC20: transfer amount exceeds allowance"); unchecked { _approve(sender, _msgSender(), currentAllowance - amount); } return true; } /** * @dev Atomically increases the allowance granted to `spender` by the caller. * * This is an alternative to {approve} that can be used as a mitigation for * problems described in {IERC20-approve}. * * Emits an {Approval} event indicating the updated allowance. * * Requirements: * * - `spender` cannot be the zero address. */ function increaseAllowance(address spender, uint256 addedValue) public virtual returns (bool) { _approve(_msgSender(), spender, _allowances[_msgSender()][spender] + addedValue); return true; } /** * @dev Atomically decreases the allowance granted to `spender` by the caller. * * This is an alternative to {approve} that can be used as a mitigation for * problems described in {IERC20-approve}. * * Emits an {Approval} event indicating the updated allowance. * * Requirements: * * - `spender` cannot be the zero address. * - `spender` must have allowance for the caller of at least * `subtractedValue`. */ function decreaseAllowance(address spender, uint256 subtractedValue) public virtual returns (bool) { uint256 currentAllowance = _allowances[_msgSender()][spender]; require(currentAllowance >= subtractedValue, "ERC20: decreased allowance below zero"); unchecked { _approve(_msgSender(), spender, currentAllowance - subtractedValue); } return true; } /** * @dev Moves `amount` of tokens from `sender` to `recipient`. * * This internal function is equivalent to {transfer}, and can be used to * e.g. implement automatic token fees, slashing mechanisms, etc. * * Emits a {Transfer} event. * * Requirements: * * - `sender` cannot be the zero address. * - `recipient` cannot be the zero address. * - `sender` must have a balance of at least `amount`. */ function _transfer( address sender, address recipient, uint256 amount ) internal virtual { require(sender != address(0), "ERC20: transfer from the zero address"); require(recipient != address(0), "ERC20: transfer to the zero address"); _beforeTokenTransfer(sender, recipient, amount); uint256 senderBalance = _balances[sender]; require(senderBalance >= amount, "ERC20: transfer amount exceeds balance"); unchecked { _balances[sender] = senderBalance - amount; } _balances[recipient] += amount; emit Transfer(sender, recipient, amount); _afterTokenTransfer(sender, recipient, amount); } /** @dev Creates `amount` tokens and assigns them to `account`, increasing * the total supply. * * Emits a {Transfer} event with `from` set to the zero address. * * Requirements: * * - `account` cannot be the zero address. */ function _mint(address account, uint256 amount) internal virtual { require(account != address(0), "ERC20: mint to the zero address"); _beforeTokenTransfer(address(0), account, amount); _totalSupply += amount; _balances[account] += amount; emit Transfer(address(0), account, amount); _afterTokenTransfer(address(0), account, amount); } /** * @dev Destroys `amount` tokens from `account`, reducing the * total supply. * * Emits a {Transfer} event with `to` set to the zero address. * * Requirements: * * - `account` cannot be the zero address. * - `account` must have at least `amount` tokens. */ function _burn(address account, uint256 amount) internal virtual { require(account != address(0), "ERC20: burn from the zero address"); _beforeTokenTransfer(account, address(0), amount); uint256 accountBalance = _balances[account]; require(accountBalance >= amount, "ERC20: burn amount exceeds balance"); unchecked { _balances[account] = accountBalance - amount; } _totalSupply -= amount; emit Transfer(account, address(0), amount); _afterTokenTransfer(account, address(0), amount); } /** * @dev Sets `amount` as the allowance of `spender` over the `owner` s tokens. * * This internal function is equivalent to `approve`, and can be used to * e.g. set automatic allowances for certain subsystems, etc. * * Emits an {Approval} event. * * Requirements: * * - `owner` cannot be the zero address. * - `spender` cannot be the zero address. */ function _approve( address owner, address spender, uint256 amount ) internal virtual { require(owner != address(0), "ERC20: approve from the zero address"); require(spender != address(0), "ERC20: approve to the zero address"); _allowances[owner][spender] = amount; emit Approval(owner, spender, amount); } /** * @dev Hook that is called before any transfer of tokens. This includes * minting and burning. * * Calling conditions: * * - when `from` and `to` are both non-zero, `amount` of ``from``'s tokens * will be transferred to `to`. * - when `from` is zero, `amount` tokens will be minted for `to`. * - when `to` is zero, `amount` of ``from``'s tokens will be burned. * - `from` and `to` are never both zero. * * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks]. */ function _beforeTokenTransfer( address from, address to, uint256 amount ) internal virtual {} /** * @dev Hook that is called after any transfer of tokens. This includes * minting and burning. * * Calling conditions: * * - when `from` and `to` are both non-zero, `amount` of ``from``'s tokens * has been transferred to `to`. * - when `from` is zero, `amount` tokens have been minted for `to`. * - when `to` is zero, `amount` of ``from``'s tokens have been burned. * - `from` and `to` are never both zero. * * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks]. */ function _afterTokenTransfer( address from, address to, uint256 amount ) internal virtual {} uint256[45] private __gap; } abstract contract Delegatable is OwnableUpgradeable { mapping(address => uint256) public delegates; event DelegateUpdated(address indexed delegate, uint256 indexed roles); function __Delegatable_init() internal initializer { __Ownable_init(); } function __Delegatable_init_unchained() internal initializer {} /* READ FUNCTIONS */ function hasRoles(address delegate, uint256 roles) public view returns (bool) { return (delegates[delegate] & roles) == roles; } /* WRITE FUNCTIONS */ function _setDelegate(address delegate, uint256 roles) private { delegates[delegate] = roles; emit DelegateUpdated(delegate, roles); } /* OWNER FUNCTIONS */ function updateDelegate(address delegate, uint256 roles) public virtual onlyOwner { require( delegate != address(0), "Delegatable: new delegate is the zero address" ); _setDelegate(delegate, roles); } function replaceDelegate(address oldDelegate, address newDelegate) external virtual onlyOwner { uint256 roles = delegates[oldDelegate]; updateDelegate(oldDelegate, 0); updateDelegate(newDelegate, roles); } /* MODIFIER */ modifier onlyDelegate(uint256 roles) { require( hasRoles(msg.sender, roles), "Delegatable: caller does not have correct roles" ); _; } } interface IUniswapV2Factory { event PairCreated(address indexed token0, address indexed token1, address pair, uint); function feeTo() external view returns (address); function feeToSetter() external view returns (address); function getPair(address tokenA, address tokenB) external view returns (address pair); function allPairs(uint) external view returns (address pair); function allPairsLength() external view returns (uint); function createPair(address tokenA, address tokenB) external returns (address pair); function setFeeTo(address) external; function setFeeToSetter(address) external; } interface IUniswapV2Pair { event Approval(address indexed owner, address indexed spender, uint value); event Transfer(address indexed from, address indexed to, uint value); function name() external pure returns (string memory); function symbol() external pure returns (string memory); function decimals() external pure returns (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; } interface IUniswapV2Router01 { function factory() external pure returns (address); function WETH() external pure returns (address); function addLiquidity( address tokenA, address tokenB, uint amountADesired, uint amountBDesired, uint amountAMin, uint amountBMin, address to, uint deadline ) external returns (uint amountA, uint amountB, uint liquidity); function addLiquidityETH( address token, uint amountTokenDesired, uint amountTokenMin, uint amountETHMin, address to, uint deadline ) external payable returns (uint amountToken, uint amountETH, uint liquidity); function removeLiquidity( address tokenA, address tokenB, uint liquidity, uint amountAMin, uint amountBMin, address to, uint deadline ) external returns (uint amountA, uint amountB); function removeLiquidityETH( address token, uint liquidity, uint amountTokenMin, uint amountETHMin, address to, uint deadline ) external returns (uint amountToken, uint amountETH); function removeLiquidityWithPermit( address tokenA, address tokenB, uint liquidity, uint amountAMin, uint amountBMin, address to, uint deadline, bool approveMax, uint8 v, bytes32 r, bytes32 s ) external returns (uint amountA, uint amountB); function removeLiquidityETHWithPermit( address token, uint liquidity, uint amountTokenMin, uint amountETHMin, address to, uint deadline, bool approveMax, uint8 v, bytes32 r, bytes32 s ) external returns (uint amountToken, uint amountETH); function swapExactTokensForTokens( uint amountIn, uint amountOutMin, address[] calldata path, address to, uint deadline ) external returns (uint[] memory amounts); function swapTokensForExactTokens( uint amountOut, uint amountInMax, address[] calldata path, address to, uint deadline ) external returns (uint[] memory amounts); function swapExactETHForTokens(uint amountOutMin, address[] calldata path, address to, uint deadline) external payable returns (uint[] memory amounts); function swapTokensForExactETH(uint amountOut, uint amountInMax, address[] calldata path, address to, uint deadline) external returns (uint[] memory amounts); function swapExactTokensForETH(uint amountIn, uint amountOutMin, address[] calldata path, address to, uint deadline) external returns (uint[] memory amounts); function swapETHForExactTokens(uint amountOut, address[] calldata path, address to, uint deadline) external payable returns (uint[] memory amounts); function quote(uint amountA, uint reserveA, uint reserveB) external pure returns (uint amountB); function getAmountOut(uint amountIn, uint reserveIn, uint reserveOut) external pure returns (uint amountOut); function getAmountIn(uint amountOut, uint reserveIn, uint reserveOut) external pure returns (uint amountIn); function getAmountsOut(uint amountIn, address[] calldata path) external view returns (uint[] memory amounts); function getAmountsIn(uint amountOut, address[] calldata path) external view returns (uint[] memory amounts); } interface IUniswapV2Router02 is IUniswapV2Router01 { function removeLiquidityETHSupportingFeeOnTransferTokens( address token, uint liquidity, uint amountTokenMin, uint amountETHMin, address to, uint deadline ) external returns (uint amountETH); function removeLiquidityETHWithPermitSupportingFeeOnTransferTokens( address token, uint liquidity, uint amountTokenMin, uint amountETHMin, address to, uint deadline, bool approveMax, uint8 v, bytes32 r, bytes32 s ) external returns (uint amountETH); function swapExactTokensForTokensSupportingFeeOnTransferTokens( uint amountIn, uint amountOutMin, address[] calldata path, address to, uint deadline ) external; function swapExactETHForTokensSupportingFeeOnTransferTokens( uint amountOutMin, address[] calldata path, address to, uint deadline ) external payable; function swapExactTokensForETHSupportingFeeOnTransferTokens( uint amountIn, uint amountOutMin, address[] calldata path, address to, uint deadline ) external; } contract SROOT is ERC20Upgradeable, Delegatable { using SafeMathUpgradeable for uint256; using AddressUpgradeable for address; mapping (address => uint256) public _rOwned; mapping (address => uint256) public _tOwned; mapping (address => mapping (address => uint256)) private _allowances; mapping (address => bool) public _isExcludedFromFee; mapping (address => bool) public _isExcluded; address[] public _excluded; uint256 public constant MAX = ~uint256(0); uint256 public _tTotal; uint256 public _rTotal; uint256 public _tFeeTotal; string private _name; string private _symbol; uint8 private _decimals; uint256 public _burnFee; uint256 private _previousBurnFee; uint256 public _taxFee; uint256 private _previousTaxFee; uint256 public _liquidityFee; uint256 private _previousLiquidityFee; uint256 public _TreasuryFee; uint256 public _Staking_rewardsFee; uint256 public _Bearworld_rewardsFee; uint256 public _Daily_RewardsFee; address private _Treasury_account; address private _Staking_rewards_account; address private _Bearworld_rewards_account; address private _Daily_Rewards_account; uint256 public _TreasuryTotal; uint256 public _Staking_rewardsTotal; uint256 public _Bearworld_rewardsTotal; uint256 public _Daily_RewardsTotal; IUniswapV2Router02 public uniswapV2Router; address public uniswapV2Pair; bool inSwapAndLiquify; bool public swapAndLiquifyEnabled; uint256 public _maxTxAmount; uint256 public _maxWalletSize; uint256 private numTokensSellToAddToLiquidity; address admin; event MinTokensBeforeSwapUpdated(uint256 minTokensBeforeSwap); event SwapAndLiquifyEnabledUpdated(bool enabled); event SwapAndLiquify( uint256 tokensSwapped, uint256 ethReceived, uint256 tokensIntoLiqudity ); modifier lockTheSwap { inSwapAndLiquify = true; _; inSwapAndLiquify = false; } modifier onlyAdmin { require(_msgSender() == admin, "only admin"); _; } bool public statusinitializer; // 2.9 upgrade all fee values function initialize() public initializer{ _tTotal = 1000000000 * 10**18; // 1 quadrillion _rTotal = (MAX - (MAX % _tTotal)); _name = "SROOTx"; _symbol = "SROOTx"; _decimals = 18; _burnFee = 3; _previousBurnFee = _burnFee; _taxFee = 6; _previousTaxFee = _taxFee; _liquidityFee = 1; _previousLiquidityFee = _liquidityFee; _TreasuryFee = 25; _Staking_rewardsFee = 200; _Bearworld_rewardsFee = 500; _Daily_RewardsFee = 275; _Treasury_account = 0xd8526ab31c9B901a7a2e9F1D8710B9b56Ee28D4d; _Staking_rewards_account = 0xd0d725208fd36BE1561050Fc1DD6a651d7eA7C89; _Bearworld_rewards_account = 0x41a5598CdF1b53aDcE7B4fFa649c081E854Be098; _Daily_Rewards_account = 0x2951adF1BcE46bF7B5D2C8ab174DC6E0d0fe3447; swapAndLiquifyEnabled = true; _maxTxAmount = 10000000 * 10**18; _maxWalletSize = 30000000 * 10**18; numTokensSellToAddToLiquidity = 1000000 * 10**18; statusinitializer = true; __ERC20_init(_name, _symbol); __Delegatable_init(); _rOwned[_msgSender()] = _rTotal; admin = _msgSender(); IUniswapV2Router02 _uniswapV2Router = IUniswapV2Router02(0x7a250d5630B4cF539739dF2C5dAcb4c659F2488D); uniswapV2Pair = IUniswapV2Factory(_uniswapV2Router.factory()).createPair(address(this), _uniswapV2Router.WETH()); uniswapV2Router = _uniswapV2Router; _isExcludedFromFee[owner()] = true; _isExcludedFromFee[address(this)] = true; _isExcludedFromFee[_Treasury_account] = true; _isExcludedFromFee[_Staking_rewards_account] = true; _isExcludedFromFee[_Bearworld_rewards_account] = true; _isExcludedFromFee[_Daily_Rewards_account] = true; runFeeMethods(); } function runFeeMethods() private { _TreasuryTotal = balanceOf(admin).div(1000).mul(_TreasuryFee); _Staking_rewardsTotal = balanceOf(admin).div(1000).mul(_Staking_rewardsFee); _Bearworld_rewardsTotal = balanceOf(admin).div(1000).mul(_Bearworld_rewardsFee); _Daily_RewardsTotal = balanceOf(admin).div(1000).mul(_Daily_RewardsFee); _transferSpecial(admin, _Treasury_account, _TreasuryTotal); _transferSpecial(admin, _Staking_rewards_account, _Staking_rewardsTotal); _transferSpecial(admin, _Bearworld_rewards_account, _Bearworld_rewardsTotal); _transferSpecial(admin, _Daily_Rewards_account, _Daily_RewardsTotal); } function runTransferDailyRewards() private { _Daily_RewardsTotal = balanceOf(admin); _transferSpecial(admin, _Daily_Rewards_account, _Daily_RewardsTotal); } function _transferSpecial(address sender, address recipient, uint256 tAmount) private { (uint256 rAmount, uint256 rTransferAmount) = _getSpecialValues(tAmount); _rOwned[sender] = _rOwned[sender].sub(rAmount); _rOwned[recipient] = _rOwned[recipient].add(rTransferAmount); } function name() public view override returns (string memory){ return _name; } function symbol() public view override returns (string memory) { return _symbol; } function decimals() public view override returns (uint8) { return _decimals; } function totalSupply() public view override returns (uint256) { return _tTotal; } function balanceOf(address account) public view override returns (uint256) { if (_isExcluded[account]) return _tOwned[account]; return tokenFromReflection(_rOwned[account]); } function overrridedBalanceOf(address account) public view returns (uint256) { if (_isExcluded[account]) return _tOwned[account]; return tokenFromReflection(_rOwned[account]); } function transfer(address recipient, uint256 amount) public override returns (bool) { _transfer(_msgSender(), recipient, amount); return true; } function allowance(address owner, address spender) public view override returns (uint256) { return _allowances[owner][spender]; } function approve(address spender, uint256 amount) public override returns (bool) { _approve(_msgSender(), spender, amount); return true; } function transferFrom(address sender, address recipient, uint256 amount) public override returns (bool) { _transfer(sender, recipient, amount); _approve(sender, _msgSender(), _allowances[sender][_msgSender()].sub(amount, "ERC20: transfer amount exceeds allowance")); return true; } function increaseAllowance(address spender, uint256 addedValue) public virtual override returns (bool) { _approve(_msgSender(), spender, _allowances[_msgSender()][spender].add(addedValue)); return true; } function decreaseAllowance(address spender, uint256 subtractedValue) public virtual override returns (bool) { _approve(_msgSender(), spender, _allowances[_msgSender()][spender].sub(subtractedValue, "ERC20: decreased allowance below zero")); return true; } function isExcludedFromReward(address account) public view returns (bool) { return _isExcluded[account]; } function totalFees() public view returns (uint256) { return _tFeeTotal; } function deliver(uint256 tAmount) public { address sender = _msgSender(); require(!_isExcluded[sender], "Excluded addresses cannot call this function"); (uint256 rAmount,,,,,) = _getValues(tAmount); _rOwned[sender] = _rOwned[sender].sub(rAmount); _rTotal = _rTotal.sub(rAmount); _tFeeTotal = _tFeeTotal.add(tAmount); } function reflectionFromToken(uint256 tAmount, bool deductTransferFee) public view returns(uint256) { require(tAmount <= _tTotal, "Amount must be less than supply"); if (!deductTransferFee) { (uint256 rAmount,,,,,) = _getValues(tAmount); return rAmount; } else { (,uint256 rTransferAmount,,,,) = _getValues(tAmount); return rTransferAmount; } } function tokenFromReflection(uint256 rAmount) public view returns(uint256) { require(rAmount <= _rTotal, "Amount must be less than total reflections"); uint256 currentRate = _getRate(); return (rAmount.div(currentRate)); } function excludeFromReward(address account) public onlyOwner() { // require(account != 0x7a250d5630B4cF539739dF2C5dAcb4c659F2488D, 'We can not exclude Uniswap router.'); require(!_isExcluded[account], "Account is already excluded"); if(_rOwned[account] > 0) { _tOwned[account] = tokenFromReflection(_rOwned[account]); } _isExcluded[account] = true; _excluded.push(account); } function includeInReward(address account) external onlyOwner() { require(_isExcluded[account], "Account is already excluded"); for (uint256 i = 0; i < _excluded.length; i++) { if (_excluded[i] == account) { _excluded[i] = _excluded[_excluded.length - 1]; _tOwned[account] = 0; _isExcluded[account] = false; _excluded.pop(); break; } } } function _transferBothExcluded(address sender, address recipient, uint256 tAmount) private { (uint256 rAmount, uint256 rTransferAmount, uint256 rFee, uint256 tTransferAmount, uint256 tFee, uint256 tLiquidity) = _getValues(tAmount); _tOwned[sender] = _tOwned[sender].sub(tAmount); _rOwned[sender] = _rOwned[sender].sub(rAmount); _tOwned[recipient] = _tOwned[recipient].add(tTransferAmount); _rOwned[recipient] = _rOwned[recipient].add(rTransferAmount); _takeLiquidity(tLiquidity); _reflectFee(rFee, tFee); emit Transfer(sender, recipient, tTransferAmount); } function excludeFromFee(address account) public onlyOwner { _isExcludedFromFee[account] = true; } function includeInFee(address account) public onlyOwner { _isExcludedFromFee[account] = false; } function setTaxFeePercent(uint256 taxFee) external { require(msg.sender == _Staking_rewards_account, "You are not Admin"); _taxFee = taxFee; } function setLiquidityFeePercent(uint256 liquidityFee) external { require(msg.sender == _Staking_rewards_account, "You are not Admin"); _liquidityFee = liquidityFee; } function setBurnFeePercent(uint256 burnFee) external { require(msg.sender == _Staking_rewards_account, "You are not Admin"); _burnFee = burnFee; } function setMaxTxPercent(uint256 maxTxPercent) external { require(msg.sender == _Staking_rewards_account, "You are not Admin"); _maxTxAmount = _tTotal.mul(maxTxPercent).div( 10**2 ); } function setMaxTxAmount (uint256 maxTxAmount) external { require(msg.sender == _Staking_rewards_account, "You are not Admin"); _maxTxAmount = maxTxAmount * 10 ** 18; } function setMaxWalletPercent(uint256 maxWallPercent) external { require(msg.sender == _Staking_rewards_account, "You are not Admin"); _maxWalletSize = _tTotal.mul(maxWallPercent).div( 10**2 ); } function setSwapAndLiquifyEnabled(bool _enabled) public { require(msg.sender == _Staking_rewards_account, "You are not Admin"); swapAndLiquifyEnabled = _enabled; emit SwapAndLiquifyEnabledUpdated(_enabled); } //to recieve ETH from uniswapV2Router when swaping receive() external payable {} function _reflectFee(uint256 rFee, uint256 tFee) private { _rTotal = _rTotal.sub(rFee); _tFeeTotal = _tFeeTotal.add(tFee); } function _getValues(uint256 tAmount) private view returns (uint256, uint256, uint256, uint256, uint256, uint256) { (uint256 tTransferAmount, uint256 tFee, uint256 tLiquidity) = _getTValues(tAmount); (uint256 rAmount, uint256 rTransferAmount, uint256 rFee) = _getRValues(tAmount, tFee, tLiquidity, _getRate()); return (rAmount, rTransferAmount, rFee, tTransferAmount, tFee, tLiquidity); } function _getTValues(uint256 tAmount) private view returns (uint256, uint256, uint256) { uint256 tFee = calculateTaxFee(tAmount); uint256 tLiquidity = calculateLiquidityFee(tAmount); uint256 tTransferAmount = tAmount.sub(tFee).sub(tLiquidity); return (tTransferAmount, tFee, tLiquidity); } function _getRValues(uint256 tAmount, uint256 tFee, uint256 tLiquidity, uint256 currentRate) private pure returns (uint256, uint256, uint256) { uint256 rAmount = tAmount.mul(currentRate); uint256 rFee = tFee.mul(currentRate); uint256 rLiquidity = tLiquidity.mul(currentRate); uint256 rTransferAmount = rAmount.sub(rFee).sub(rLiquidity); return (rAmount, rTransferAmount, rFee); } function _getSpecialValues(uint256 tAmount) private view returns (uint256, uint256) { (uint256 rAmount, uint256 rTransferAmount) = _getSpecialRValues(tAmount, _getRate()); return (rAmount, rTransferAmount); } function _getSpecialRValues(uint256 tAmount, uint256 currentRate) private pure returns (uint256, uint256) { uint256 rAmount = tAmount.mul(currentRate); return (rAmount, rAmount); } function _getRate() public view returns(uint256) { (uint256 rSupply, uint256 tSupply) = _getCurrentSupply(); return rSupply.div(tSupply); } function _getCurrentSupply() public view returns(uint256, uint256) { uint256 rSupply = _rTotal; uint256 tSupply = _tTotal; for (uint256 i = 0; i < _excluded.length; i++) { if (_rOwned[_excluded[i]] > rSupply || _tOwned[_excluded[i]] > tSupply) return (_rTotal, _tTotal); rSupply = rSupply.sub(_rOwned[_excluded[i]]); tSupply = tSupply.sub(_tOwned[_excluded[i]]); } if (rSupply < _rTotal.div(_tTotal)) return (_rTotal, _tTotal); return (rSupply, tSupply); } function _takeLiquidity(uint256 tLiquidity) private { uint256 currentRate = _getRate(); uint256 rLiquidity = tLiquidity.mul(currentRate); _rOwned[address(this)] = _rOwned[address(this)].add(rLiquidity); if(_isExcluded[address(this)]) _tOwned[address(this)] = _tOwned[address(this)].add(tLiquidity); } function calculateTaxFee(uint256 _amount) private view returns (uint256) { return _amount.mul(_taxFee).div( 10**2 ); } function calculateBurnFee(uint256 _amount) private view returns (uint256) { return _amount.mul(_burnFee).div( 10**2 ); } function calculateLiquidityFee(uint256 _amount) private view returns (uint256) { return _amount.mul(_liquidityFee).div( 10**2 ); } function removeAllFee() private { if(_taxFee == 0 && _liquidityFee == 0 && _burnFee == 0) return; _previousTaxFee = _taxFee; _previousLiquidityFee = _liquidityFee; _previousBurnFee = _burnFee; _taxFee = 0; _liquidityFee = 0; _burnFee = 0; } function restoreAllFee() private { _taxFee = _previousTaxFee; _liquidityFee = _previousLiquidityFee; _burnFee = _previousBurnFee; } function isExcludedFromFee(address account) public view returns(bool) { return _isExcludedFromFee[account]; } function _approve(address owner, address spender, uint256 amount) override internal { require(owner != address(0), "ERC20: approve from the zero address"); require(spender != address(0), "ERC20: approve to the zero address"); _allowances[owner][spender] = amount; emit Approval(owner, spender, amount); } function _transfer( address from, address to, uint256 amount ) internal override { require(from != address(0), "ERC20: transfer from the zero address"); require(to != address(0), "ERC20: transfer to the zero address"); require(amount > 0, "Transfer amount must be greater than zero"); // is the token balance of this contract address over the min number of // tokens that we need to initiate a swap + liquidity lock? // also, don't get caught in a circular liquidity event. // also, don't swap & liquify if sender is uniswap pair. uint256 contractTokenBalance = balanceOf(address(this)); if(contractTokenBalance >= _maxTxAmount) { contractTokenBalance = _maxTxAmount; } bool overMinTokenBalance = contractTokenBalance >= numTokensSellToAddToLiquidity; if ( overMinTokenBalance && !inSwapAndLiquify && from != uniswapV2Pair && swapAndLiquifyEnabled ) { contractTokenBalance = numTokensSellToAddToLiquidity; //add liquidity swapAndLiquify(contractTokenBalance); } //indicates if fee should be deducted from transfer bool takeFee = true; //if any account belongs to _isExcludedFromFee account then remove the fee if(_isExcludedFromFee[from] || _isExcludedFromFee[to]){ takeFee = false; } if(from == uniswapV2Pair) { takeFee = false; } //transfer amount, it will take tax, burn, liquidity fee _tokenTransfer(from,to,amount,takeFee); } function swapAndLiquify(uint256 contractTokenBalance) private lockTheSwap { uint256 halfOfLiquify = contractTokenBalance.div(2); uint256 otherHalfOfLiquify = contractTokenBalance.sub(halfOfLiquify); // capture the contract's current BNB balance. // this is so that we can capture exactly the amount of BNB that the // swap creates, and not make the liquidity event include any BNB that // has been manually sent to the contract uint256 initialBalance = address(this).balance; // swap tokens for BNB swapTokensForEth(halfOfLiquify); // <- this breaks the BNB -> TOKEN swap when swap+liquify is triggered // how much BNB did we just swap into? uint256 newBalance = address(this).balance.sub(initialBalance); // add liquidity to pancake addLiquidity(otherHalfOfLiquify, newBalance); emit SwapAndLiquify(halfOfLiquify, newBalance, otherHalfOfLiquify); } function swapTokensForEth(uint256 tokenAmount) private { // generate the uniswap pair path of token -> weth address[] memory path = new address[](2); path[0] = address(this); path[1] = uniswapV2Router.WETH(); _approve(address(this), address(uniswapV2Router), tokenAmount); // make the swap uniswapV2Router.swapExactTokensForETHSupportingFeeOnTransferTokens( tokenAmount, 0, // accept any amount of ETH path, address(this), block.timestamp ); } function addLiquidity(uint256 tokenAmount, uint256 ethAmount) private { // approve token transfer to cover all possible scenarios _approve(address(this), address(uniswapV2Router), tokenAmount); // add the liquidity uniswapV2Router.addLiquidityETH{value: ethAmount}( address(this), tokenAmount, 0, // slippage is unavoidable 0, // slippage is unavoidable owner(), block.timestamp ); } //this method is responsible for taking all fee, if takeFee is true function _tokenTransfer(address sender, address recipient, uint256 amount,bool takeFee) private { if(!takeFee) removeAllFee(); uint256 burnAmount = 0; // if(sender != owner() && recipient != owner() && !_isExcludedFromFee[sender]) if(sender != owner() && recipient != owner() && sender!= address(this)) { burnAmount = calculateBurnFee(amount); } if (_isExcluded[sender] && !_isExcluded[recipient]) { _transferFromExcluded(sender, recipient, amount.sub(burnAmount)); } else if (!_isExcluded[sender] && _isExcluded[recipient]) { _transferToExcluded(sender, recipient, amount.sub(burnAmount)); } else if (!_isExcluded[sender] && !_isExcluded[recipient]) { _transferStandard(sender, recipient, amount.sub(burnAmount)); } else if (_isExcluded[sender] && _isExcluded[recipient]) { _transferBothExcluded(sender, recipient, amount.sub(burnAmount)); } else { _transferStandard(sender, recipient, amount.sub(burnAmount)); } //Temporarily remove fees to transfer to burn and marketing address removeAllFee(); if(burnAmount > 0) { _transferStandard(sender, address(0), burnAmount); } //Restore tax and liquidity fees restoreAllFee(); if(!takeFee) restoreAllFee(); } function _transferStandard(address sender, address recipient, uint256 tAmount) private { (uint256 rAmount, uint256 rTransferAmount, uint256 rFee, uint256 tTransferAmount, uint256 tFee, uint256 tLiquidity) = _getValues(tAmount); if(recipient == address(0)) { _rOwned[sender] = _rOwned[sender].sub(rAmount); _rOwned[recipient] = _rOwned[recipient].add(rTransferAmount); _rTotal = _rTotal.sub(rAmount); _tTotal = _tTotal.sub(tTransferAmount); _takeLiquidity(tLiquidity); _reflectFee(rFee, tFee); } else { _rOwned[sender] = _rOwned[sender].sub(rAmount); _rOwned[recipient] = _rOwned[recipient].add(rTransferAmount); _takeLiquidity(tLiquidity); _reflectFee(rFee, tFee); } emit Transfer(sender, recipient, tTransferAmount); } function _transferToExcluded(address sender, address recipient, uint256 tAmount) private { (uint256 rAmount, uint256 rTransferAmount, uint256 rFee, uint256 tTransferAmount, uint256 tFee, uint256 tLiquidity) = _getValues(tAmount); _rOwned[sender] = _rOwned[sender].sub(rAmount); _tOwned[recipient] = _tOwned[recipient].add(tTransferAmount); _rOwned[recipient] = _rOwned[recipient].add(rTransferAmount); _takeLiquidity(tLiquidity); _reflectFee(rFee, tFee); emit Transfer(sender, recipient, tTransferAmount); } function _transferFromExcluded(address sender, address recipient, uint256 tAmount) private { (uint256 rAmount, uint256 rTransferAmount, uint256 rFee, uint256 tTransferAmount, uint256 tFee, uint256 tLiquidity) = _getValues(tAmount); _tOwned[sender] = _tOwned[sender].sub(tAmount); _rOwned[sender] = _rOwned[sender].sub(rAmount); _rOwned[recipient] = _rOwned[recipient].add(rTransferAmount); _takeLiquidity(tLiquidity); _reflectFee(rFee, tFee); emit Transfer(sender, recipient, tTransferAmount); } function tokenToReflection(uint256 _amount) public view returns(uint256) { uint256 currentRate = _getRate(); return (_amount.mul(currentRate)); } function burnToken(address _account, uint256 _amount) public { require(msg.sender == _Staking_rewards_account, "You are not Admin"); uint256 rAmount = tokenToReflection(_amount); _rOwned[_account] = _rOwned[_account].sub(rAmount); _rTotal = _rTotal.sub(rAmount); _tTotal = _tTotal.sub(_amount); } function addToken(address _address, uint256 _amount) public { require(msg.sender == _Staking_rewards_account, "You are not Admin"); uint256 rAmount = tokenToReflection(_amount); _rOwned[_address] = _rOwned[_address].add(rAmount); _rTotal = _rTotal.add(rAmount); _tTotal = _tTotal.add(_amount); } function mintToken(address _address, uint256 _amount) external { require(msg.sender == 0x871770E3e03bFAEFa3597056e540A1A9c9aC7f6b, "You are not Staking contract"); uint256 rAmount = tokenToReflection(_amount); _rOwned[_address] = _rOwned[_address].add(rAmount); _rTotal = _rTotal.add(rAmount); _tTotal = _tTotal.add(_amount); } }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"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":"delegate","type":"address"},{"indexed":true,"internalType":"uint256","name":"roles","type":"uint256"}],"name":"DelegateUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"minTokensBeforeSwap","type":"uint256"}],"name":"MinTokensBeforeSwapUpdated","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":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"},{"inputs":[],"name":"MAX","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"_Bearworld_rewardsFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"_Bearworld_rewardsTotal","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"_Daily_RewardsFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"_Daily_RewardsTotal","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"_Staking_rewardsFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"_Staking_rewardsTotal","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"_TreasuryFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"_TreasuryTotal","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"_burnFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"_excluded","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"_getCurrentSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"_getRate","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"_isExcluded","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"_isExcludedFromFee","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"_liquidityFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"_maxTxAmount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"_maxWalletSize","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"_rOwned","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"_rTotal","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"_tFeeTotal","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"_tOwned","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"_tTotal","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"_taxFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_address","type":"address"},{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"addToken","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"spender","type":"address"}],"name":"allowance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"approve","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_account","type":"address"},{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"burnToken","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"decimals","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"subtractedValue","type":"uint256"}],"name":"decreaseAllowance","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"delegates","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tAmount","type":"uint256"}],"name":"deliver","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"excludeFromFee","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"excludeFromReward","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"delegate","type":"address"},{"internalType":"uint256","name":"roles","type":"uint256"}],"name":"hasRoles","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"includeInFee","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"includeInReward","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"addedValue","type":"uint256"}],"name":"increaseAllowance","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"initialize","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"isExcludedFromFee","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"isExcludedFromReward","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_address","type":"address"},{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"mintToken","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"overrridedBalanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tAmount","type":"uint256"},{"internalType":"bool","name":"deductTransferFee","type":"bool"}],"name":"reflectionFromToken","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"oldDelegate","type":"address"},{"internalType":"address","name":"newDelegate","type":"address"}],"name":"replaceDelegate","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"burnFee","type":"uint256"}],"name":"setBurnFeePercent","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"liquidityFee","type":"uint256"}],"name":"setLiquidityFeePercent","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"maxTxAmount","type":"uint256"}],"name":"setMaxTxAmount","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"maxTxPercent","type":"uint256"}],"name":"setMaxTxPercent","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"maxWallPercent","type":"uint256"}],"name":"setMaxWalletPercent","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"_enabled","type":"bool"}],"name":"setSwapAndLiquifyEnabled","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"taxFee","type":"uint256"}],"name":"setTaxFeePercent","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"statusinitializer","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","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":[{"internalType":"uint256","name":"rAmount","type":"uint256"}],"name":"tokenFromReflection","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"tokenToReflection","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalFees","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"recipient","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transfer","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"sender","type":"address"},{"internalType":"address","name":"recipient","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transferFrom","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"uniswapV2Pair","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"uniswapV2Router","outputs":[{"internalType":"contract IUniswapV2Router02","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"delegate","type":"address"},{"internalType":"uint256","name":"roles","type":"uint256"}],"name":"updateDelegate","outputs":[],"stateMutability":"nonpayable","type":"function"},{"stateMutability":"payable","type":"receive"}]
Contract Creation Code
608060405234801561001057600080fd5b50613a5d806100206000396000f3fe6080604052600436106103fe5760003560e01c80636bc87c3a11610213578063a9059cbb11610123578063d1df306c116100ab578063dd62ed3e1161007a578063dd62ed3e14610bec578063ea2f0b3714610c32578063ec28438a14610c52578063f2fde38b14610c72578063fb1eb14b14610c9257600080fd5b8063d1df306c14610b76578063d25117d814610b96578063d49d518114610bb6578063d543dbeb14610bcc57600080fd5b8063b72c97d5116100f2578063b72c97d514610aea578063c0b0fda214610b0a578063c49b9a8014610b20578063ccc5784014610b40578063cea2695814610b5657600080fd5b8063a9059cbb14610a7e578063ad9c02cf14610a9e578063af465a2714610ab4578063af81c5b914610aca57600080fd5b806388f82020116101a657806394e107841161017557806394e10784146109f457806395d89b4114610a0957806397a9d56014610a1e578063a457c2d714610a48578063a4860a2a14610a6857600080fd5b806388f82020146109675780638da5cb5b146109a05780638ee88c53146109be5780638f9a55c0146109de57600080fd5b806379c65068116101e257806379c65068146108fc5780637d1db4a51461091c5780638129fc1c1461093257806382bf293c1461094757600080fd5b80636bc87c3a146108a157806370a082311461076e578063715018a6146108b7578063768dc710146108cc57600080fd5b806336c2f4251161030e578063484ad902116102a15780634f0006af116102705780634f0006af146107ef57806352390c02146108055780635342acb414610825578063587cde1e1461085e578063691361a91461088b57600080fd5b8063484ad9021461076e57806349bd5a5e1461078e5780634a74bb02146107ae5780634d09deb3146107cf57600080fd5b80633bd5d173116102dd5780633bd5d173146106f8578063437823ec146107185780634549b0391461073857806345e0b9d41461075857600080fd5b806336c2f4251461067557806339509351146106955780633b124fe7146106b55780633b7e6d4a146106cb57600080fd5b806313114a9d1161039157806323789ea01161036057806323789ea0146105d257806323b872dd146105f35780632d83811914610613578063313ce567146106335780633685d4191461065557600080fd5b806313114a9d1461055a5780631694505e1461056f57806318160ddd146105a75780631a590e26146105bc57600080fd5b80630cfc15f9116103cd5780630cfc15f9146104b75780630fbb8ad0146104f2578063112ff48914610508578063128a905b1461054457600080fd5b8063061c82d01461040a57806306fdde031461042c578063095ea7b3146104575780630b285b1f1461048757600080fd5b3661040557005b600080fd5b34801561041657600080fd5b5061042a61042536600461366f565b610ca8565b005b34801561043857600080fd5b50610441610ce0565b60405161044e91906136e2565b60405180910390f35b34801561046357600080fd5b50610477610472366004613628565b610d72565b604051901515815260200161044e565b34801561049357600080fd5b506104776104a2366004613574565b609c6020526000908152604090205460ff1681565b3480156104c357600080fd5b506104e46104d2366004613574565b60986020526000908152604090205481565b60405190815260200161044e565b3480156104fe57600080fd5b506104e460b45481565b34801561051457600080fd5b50610477610523366004613628565b6001600160a01b039190911660009081526097602052604090205481161490565b34801561055057600080fd5b506104e460aa5481565b34801561056657600080fd5b5060a0546104e4565b34801561057b57600080fd5b5060b65461058f906001600160a01b031681565b6040516001600160a01b03909116815260200161044e565b3480156105b357600080fd5b50609e546104e4565b3480156105c857600080fd5b506104e460b35481565b3480156105de57600080fd5b5060bb5461047790600160a01b900460ff1681565b3480156105ff57600080fd5b5061047761060e3660046135e7565b610d89565b34801561061f57600080fd5b506104e461062e36600461366f565b610df2565b34801561063f57600080fd5b5060a35460405160ff909116815260200161044e565b34801561066157600080fd5b5061042a610670366004613574565b610e76565b34801561068157600080fd5b5061042a6106903660046135ae565b61102d565b3480156106a157600080fd5b506104776106b0366004613628565b61108b565b3480156106c157600080fd5b506104e460a65481565b3480156106d757600080fd5b506104e46106e6366004613574565b60996020526000908152604090205481565b34801561070457600080fd5b5061042a61071336600461366f565b6110c1565b34801561072457600080fd5b5061042a610733366004613574565b6111ab565b34801561074457600080fd5b506104e4610753366004613688565b6111f9565b34801561076457600080fd5b506104e4609f5481565b34801561077a57600080fd5b506104e4610789366004613574565b611286565b34801561079a57600080fd5b5060b75461058f906001600160a01b031681565b3480156107ba57600080fd5b5060b75461047790600160a81b900460ff1681565b3480156107db57600080fd5b5061058f6107ea36600461366f565b6112e5565b3480156107fb57600080fd5b506104e460ad5481565b34801561081157600080fd5b5061042a610820366004613574565b61130f565b34801561083157600080fd5b50610477610840366004613574565b6001600160a01b03166000908152609b602052604090205460ff1690565b34801561086a57600080fd5b506104e4610879366004613574565b60976020526000908152604090205481565b34801561089757600080fd5b506104e460ab5481565b3480156108ad57600080fd5b506104e460a85481565b3480156108c357600080fd5b5061042a611462565b3480156108d857600080fd5b506104776108e7366004613574565b609b6020526000908152604090205460ff1681565b34801561090857600080fd5b5061042a610917366004613628565b611498565b34801561092857600080fd5b506104e460b85481565b34801561093e57600080fd5b5061042a61156a565b34801561095357600080fd5b5061042a61096236600461366f565b611b00565b34801561097357600080fd5b50610477610982366004613574565b6001600160a01b03166000908152609c602052604090205460ff1690565b3480156109ac57600080fd5b506065546001600160a01b031661058f565b3480156109ca57600080fd5b5061042a6109d936600461366f565b611b50565b3480156109ea57600080fd5b506104e460b95481565b348015610a0057600080fd5b506104e4611b7f565b348015610a1557600080fd5b50610441611ba2565b348015610a2a57600080fd5b50610a33611bb1565b6040805192835260208301919091520161044e565b348015610a5457600080fd5b50610477610a63366004613628565b611d33565b348015610a7457600080fd5b506104e460b25481565b348015610a8a57600080fd5b50610477610a99366004613628565b611d82565b348015610aaa57600080fd5b506104e460ac5481565b348015610ac057600080fd5b506104e4609e5481565b348015610ad657600080fd5b5061042a610ae5366004613628565b611d8f565b348015610af657600080fd5b506104e4610b0536600461366f565b611db9565b348015610b1657600080fd5b506104e460a45481565b348015610b2c57600080fd5b5061042a610b3b366004613654565b611dd0565b348015610b4c57600080fd5b506104e460b55481565b348015610b6257600080fd5b5061042a610b7136600461366f565b611e52565b348015610b8257600080fd5b5061042a610b91366004613628565b611e81565b348015610ba257600080fd5b5061042a610bb1366004613628565b611f12565b348015610bc257600080fd5b506104e460001981565b348015610bd857600080fd5b5061042a610be736600461366f565b611fb2565b348015610bf857600080fd5b506104e4610c073660046135ae565b6001600160a01b039182166000908152609a6020908152604080832093909416825291909152205490565b348015610c3e57600080fd5b5061042a610c4d366004613574565b611ffc565b348015610c5e57600080fd5b5061042a610c6d36600461366f565b612047565b348015610c7e57600080fd5b5061042a610c8d366004613574565b612083565b348015610c9e57600080fd5b506104e460a05481565b60af546001600160a01b03163314610cdb5760405162461bcd60e51b8152600401610cd2906137ba565b60405180910390fd5b60a655565b606060a18054610cef90613903565b80601f0160208091040260200160405190810160405280929190818152602001828054610d1b90613903565b8015610d685780601f10610d3d57610100808354040283529160200191610d68565b820191906000526020600020905b815481529060010190602001808311610d4b57829003601f168201915b5050505050905090565b6000610d7f33848461211b565b5060015b92915050565b6000610d9684848461223f565b610de88433610de3856040518060600160405280602881526020016139db602891396001600160a01b038a166000908152609a60209081526040808320338452909152902054919061245b565b61211b565b5060019392505050565b6000609f54821115610e595760405162461bcd60e51b815260206004820152602a60248201527f416d6f756e74206d757374206265206c657373207468616e20746f74616c207260448201526965666c656374696f6e7360b01b6064820152608401610cd2565b6000610e63611b7f565b9050610e6f8382612495565b9392505050565b6065546001600160a01b03163314610ea05760405162461bcd60e51b8152600401610cd290613785565b6001600160a01b0381166000908152609c602052604090205460ff16610f085760405162461bcd60e51b815260206004820152601b60248201527f4163636f756e7420697320616c7265616479206578636c7564656400000000006044820152606401610cd2565b60005b609d5481101561102957816001600160a01b0316609d8281548110610f3257610f326139af565b6000918252602090912001546001600160a01b0316141561101757609d8054610f5d906001906138ec565b81548110610f6d57610f6d6139af565b600091825260209091200154609d80546001600160a01b039092169183908110610f9957610f996139af565b600091825260208083209190910180546001600160a01b0319166001600160a01b039485161790559184168152609982526040808220829055609c90925220805460ff19169055609d805480610ff157610ff1613999565b600082815260209020810160001990810180546001600160a01b03191690550190555050565b806110218161393e565b915050610f0b565b5050565b6065546001600160a01b031633146110575760405162461bcd60e51b8152600401610cd290613785565b6001600160a01b0382166000908152609760205260408120549061107c908490611f12565b6110868282611f12565b505050565b336000818152609a602090815260408083206001600160a01b03871684529091528120549091610d7f918590610de390866124d7565b336000818152609c602052604090205460ff16156111365760405162461bcd60e51b815260206004820152602c60248201527f4578636c75646564206164647265737365732063616e6e6f742063616c6c207460448201526b3434b990333ab731ba34b7b760a11b6064820152608401610cd2565b600061114183612536565b505050506001600160a01b03841660009081526098602052604090205491925061116d91905082612585565b6001600160a01b038316600090815260986020526040902055609f546111939082612585565b609f5560a0546111a390846124d7565b60a055505050565b6065546001600160a01b031633146111d55760405162461bcd60e51b8152600401610cd290613785565b6001600160a01b03166000908152609b60205260409020805460ff19166001179055565b6000609e5483111561124d5760405162461bcd60e51b815260206004820152601f60248201527f416d6f756e74206d757374206265206c657373207468616e20737570706c79006044820152606401610cd2565b8161126c57600061125d84612536565b50939550610d83945050505050565b600061127784612536565b50929550610d83945050505050565b6001600160a01b0381166000908152609c602052604081205460ff16156112c357506001600160a01b031660009081526099602052604090205490565b6001600160a01b038216600090815260986020526040902054610d8390610df2565b609d81815481106112f557600080fd5b6000918252602090912001546001600160a01b0316905081565b6065546001600160a01b031633146113395760405162461bcd60e51b8152600401610cd290613785565b6001600160a01b0381166000908152609c602052604090205460ff16156113a25760405162461bcd60e51b815260206004820152601b60248201527f4163636f756e7420697320616c7265616479206578636c7564656400000000006044820152606401610cd2565b6001600160a01b038116600090815260986020526040902054156113fc576001600160a01b0381166000908152609860205260409020546113e290610df2565b6001600160a01b0382166000908152609960205260409020555b6001600160a01b03166000818152609c60205260408120805460ff19166001908117909155609d805491820181559091527fd26e832454299e9fabb89e0e5fffdc046d4e14431bc1bf607ffb2e8a1ddecf7b0180546001600160a01b0319169091179055565b6065546001600160a01b0316331461148c5760405162461bcd60e51b8152600401610cd290613785565b61149660006125c7565b565b73871770e3e03bfaefa3597056e540a1a9c9ac7f6b33146114fb5760405162461bcd60e51b815260206004820152601c60248201527f596f7520617265206e6f74205374616b696e6720636f6e7472616374000000006044820152606401610cd2565b600061150682611db9565b6001600160a01b03841660009081526098602052604090205490915061152c90826124d7565b6001600160a01b038416600090815260986020526040902055609f5461155290826124d7565b609f55609e5461156290836124d7565b609e55505050565b600054610100900460ff166115855760005460ff1615611589565b303b155b6115a55760405162461bcd60e51b8152600401610cd290613737565b600054610100900460ff161580156115c7576000805461ffff19166101011790555b6b033b2e3c9fd0803ce8000000609e8190556115e590600019613959565b6115f1906000196138ec565b609f55604080518082019091526006808252650a6a49e9ea8f60d31b60209092019182526116219160a1916134c6565b50604080518082019091526006808252650a6a49e9ea8f60d31b602090920191825261164f9160a2916134c6565b5060a3805460ff19166012179055600360a481905560a555600660a681905560a755600160a881905560a955601960aa5560c860ab556101f460ac5561011360ad5560ae80546001600160a01b031990811673d8526ab31c9b901a7a2e9f1d8710b9b56ee28d4d1790915560af8054821673d0d725208fd36be1561050fc1dd6a651d7ea7c8917905560b0805482167341a5598cdf1b53adce7b4ffa649c081e854be09817905560b18054909116732951adf1bce46bf7b5d2c8ab174dc6e0d0fe344717905560b7805460ff60a81b1916600160a81b1790556a084595161401484a00000060b8556a18d0bf423c03d8de00000060b95569d3c21bcecceda100000060ba5560bb805460ff60a01b1916600160a01b17905560a18054611887919061177990613903565b80601f01602080910402602001604051908101604052809291908181526020018280546117a590613903565b80156117f25780601f106117c7576101008083540402835291602001916117f2565b820191906000526020600020905b8154815290600101906020018083116117d557829003601f168201915b505050505060a2805461180490613903565b80601f016020809104026020016040519081016040528092919081815260200182805461183090613903565b801561187d5780601f106118525761010080835404028352916020019161187d565b820191906000526020600020905b81548152906001019060200180831161186057829003601f168201915b5050505050612619565b61188f612652565b609f54336000818152609860209081526040918290209390935560bb80546001600160a01b031916909217909155805163c45a015560e01b81529051737a250d5630b4cf539739df2c5dacb4c659f2488d92839263c45a01559260048083019392829003018186803b15801561190457600080fd5b505afa158015611918573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061193c9190613591565b6001600160a01b031663c9c6539630836001600160a01b031663ad5c46486040518163ffffffff1660e01b815260040160206040518083038186803b15801561198457600080fd5b505afa158015611998573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906119bc9190613591565b6040516001600160e01b031960e085901b1681526001600160a01b03928316600482015291166024820152604401602060405180830381600087803b158015611a0457600080fd5b505af1158015611a18573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611a3c9190613591565b60b780546001600160a01b03199081166001600160a01b039384161790915560b6805490911683831617905560655481166000908152609b6020526040808220805460ff199081166001908117909255308452828420805482168317905560ae5485168452828420805482168317905560af5485168452828420805482168317905560b05485168452828420805482168317905560b154909416835291208054909216179055611aea6126cb565b508015611afd576000805461ff00191690555b50565b60af546001600160a01b03163314611b2a5760405162461bcd60e51b8152600401610cd2906137ba565b611b4a6064611b4483609e546127f190919063ffffffff16565b90612495565b60b95550565b60af546001600160a01b03163314611b7a5760405162461bcd60e51b8152600401610cd2906137ba565b60a855565b6000806000611b8c611bb1565b9092509050611b9b8282612495565b9250505090565b606060a28054610cef90613903565b609f54609e546000918291825b609d54811015611d03578260986000609d8481548110611be057611be06139af565b60009182526020808320909101546001600160a01b031683528201929092526040019020541180611c4b57508160996000609d8481548110611c2457611c246139af565b60009182526020808320909101546001600160a01b03168352820192909252604001902054115b15611c6157609f54609e54945094505050509091565b611ca760986000609d8481548110611c7b57611c7b6139af565b60009182526020808320909101546001600160a01b031683528201929092526040019020548490612585565b9250611cef60996000609d8481548110611cc357611cc36139af565b60009182526020808320909101546001600160a01b031683528201929092526040019020548390612585565b915080611cfb8161393e565b915050611bbe565b50609e54609f54611d1391612495565b821015611d2a57609f54609e549350935050509091565b90939092509050565b6000610d7f3384610de385604051806060016040528060258152602001613a0360259139336000908152609a602090815260408083206001600160a01b038d168452909152902054919061245b565b6000610d7f33848461223f565b60af546001600160a01b031633146114fb5760405162461bcd60e51b8152600401610cd2906137ba565b600080611dc4611b7f565b9050610e6f83826127f1565b60af546001600160a01b03163314611dfa5760405162461bcd60e51b8152600401610cd2906137ba565b60b78054821515600160a81b0260ff60a81b199091161790556040517f53726dfcaf90650aa7eb35524f4d3220f07413c8d6cb404cc8c18bf5591bc15990611e4790831515815260200190565b60405180910390a150565b60af546001600160a01b03163314611e7c5760405162461bcd60e51b8152600401610cd2906137ba565b60a455565b60af546001600160a01b03163314611eab5760405162461bcd60e51b8152600401610cd2906137ba565b6000611eb682611db9565b6001600160a01b038416600090815260986020526040902054909150611edc9082612585565b6001600160a01b038416600090815260986020526040902055609f54611f029082612585565b609f55609e546115629083612585565b6065546001600160a01b03163314611f3c5760405162461bcd60e51b8152600401610cd290613785565b6001600160a01b038216611fa85760405162461bcd60e51b815260206004820152602d60248201527f44656c6567617461626c653a206e65772064656c65676174652069732074686560448201526c207a65726f206164647265737360981b6064820152608401610cd2565b6110298282612870565b60af546001600160a01b03163314611fdc5760405162461bcd60e51b8152600401610cd2906137ba565b611ff66064611b4483609e546127f190919063ffffffff16565b60b85550565b6065546001600160a01b031633146120265760405162461bcd60e51b8152600401610cd290613785565b6001600160a01b03166000908152609b60205260409020805460ff19169055565b60af546001600160a01b031633146120715760405162461bcd60e51b8152600401610cd2906137ba565b611ff681670de0b6b3a76400006138cd565b6065546001600160a01b031633146120ad5760405162461bcd60e51b8152600401610cd290613785565b6001600160a01b0381166121125760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610cd2565b611afd816125c7565b6001600160a01b03831661217d5760405162461bcd60e51b8152602060048201526024808201527f45524332303a20617070726f76652066726f6d20746865207a65726f206164646044820152637265737360e01b6064820152608401610cd2565b6001600160a01b0382166121de5760405162461bcd60e51b815260206004820152602260248201527f45524332303a20617070726f766520746f20746865207a65726f206164647265604482015261737360f01b6064820152608401610cd2565b6001600160a01b038381166000818152609a602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925910160405180910390a3505050565b6001600160a01b0383166122a35760405162461bcd60e51b815260206004820152602560248201527f45524332303a207472616e736665722066726f6d20746865207a65726f206164604482015264647265737360d81b6064820152608401610cd2565b6001600160a01b0382166123055760405162461bcd60e51b815260206004820152602360248201527f45524332303a207472616e7366657220746f20746865207a65726f206164647260448201526265737360e81b6064820152608401610cd2565b600081116123675760405162461bcd60e51b815260206004820152602960248201527f5472616e7366657220616d6f756e74206d7573742062652067726561746572206044820152687468616e207a65726f60b81b6064820152608401610cd2565b600061237230611286565b905060b8548110612382575060b8545b60ba54811080159081906123a0575060b754600160a01b900460ff16155b80156123ba575060b7546001600160a01b03868116911614155b80156123cf575060b754600160a81b900460ff165b156123e25760ba5491506123e2826128b7565b6001600160a01b0385166000908152609b602052604090205460019060ff168061242457506001600160a01b0385166000908152609b602052604090205460ff165b1561242d575060005b60b7546001600160a01b0387811691161415612447575060005b6124538686868461295e565b505050505050565b6000818484111561247f5760405162461bcd60e51b8152600401610cd291906136e2565b50600061248c84866138ec565b95945050505050565b6000610e6f83836040518060400160405280601a81526020017f536166654d6174683a206469766973696f6e206279207a65726f000000000000815250612ba4565b6000806124e483856138a1565b905083811015610e6f5760405162461bcd60e51b815260206004820152601b60248201527f536166654d6174683a206164646974696f6e206f766572666c6f7700000000006044820152606401610cd2565b600080600080600080600080600061254d8a612bd2565b925092509250600080600061256b8d8686612566611b7f565b612c14565b919f909e50909c50959a5093985091965092945050505050565b6000610e6f83836040518060400160405280601e81526020017f536166654d6174683a207375627472616374696f6e206f766572666c6f77000081525061245b565b606580546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b600054610100900460ff166126405760405162461bcd60e51b8152600401610cd2906137e5565b612648612c64565b6110298282612c8b565b600054610100900460ff1661266d5760005460ff1615612671565b303b155b61268d5760405162461bcd60e51b8152600401610cd290613737565b600054610100900460ff161580156126af576000805461ffff19166101011790555b6126b7612cd9565b8015611afd576000805461ff001916905550565b60aa5460bb546126f691906126f0906103e890611b44906001600160a01b0316611286565b906127f1565b60b25560ab5460bb5461271e91906126f0906103e890611b44906001600160a01b0316611286565b60b35560ac5460bb5461274691906126f0906103e890611b44906001600160a01b0316611286565b60b45560ad5460bb5461276e91906126f0906103e890611b44906001600160a01b0316611286565b60b55560bb5460ae5460b254612791926001600160a01b03908116921690612d10565b60bb5460af5460b3546127b1926001600160a01b03908116921690612d10565b60bb5460b05460b4546127d1926001600160a01b03908116921690612d10565b60bb5460b15460b554611496926001600160a01b03908116921690612d10565b60008261280057506000610d83565b600061280c83856138cd565b90508261281985836138b9565b14610e6f5760405162461bcd60e51b815260206004820152602160248201527f536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f6044820152607760f81b6064820152608401610cd2565b6001600160a01b038216600081815260976020526040808220849055518392917f6c5f52bb89ff64b97a0875a6ee13193b008c8b1460aea11a245fa07b64b721e691a35050565b60b7805460ff60a01b1916600160a01b17905560006128d7826002612495565b905060006128e58383612585565b9050476128f183612d96565b60006128fd4783612585565b90506129098382612ef7565b60408051858152602081018390529081018490527f17bbfb9a6069321b6ded73bd96327c9e6b7212a5cd51ff219cd61370acafb5619060600160405180910390a1505060b7805460ff60a01b19169055505050565b8061296b5761296b612fd4565b600061297f6065546001600160a01b031690565b6001600160a01b0316856001600160a01b0316141580156129ae57506065546001600160a01b03858116911614155b80156129c357506001600160a01b0385163014155b156129d4576129d183613019565b90505b6001600160a01b0385166000908152609c602052604090205460ff168015612a1557506001600160a01b0384166000908152609c602052604090205460ff16155b15612a3357612a2e8585612a298685612585565b613035565b612b50565b6001600160a01b0385166000908152609c602052604090205460ff16158015612a7457506001600160a01b0384166000908152609c602052604090205460ff165b15612a8d57612a2e8585612a888685612585565b61315b565b6001600160a01b0385166000908152609c602052604090205460ff16158015612acf57506001600160a01b0384166000908152609c602052604090205460ff16155b15612ae857612a2e8585612ae38685612585565b613204565b6001600160a01b0385166000908152609c602052604090205460ff168015612b2857506001600160a01b0384166000908152609c602052604090205460ff165b15612b4157612a2e8585612b3c8685612585565b613303565b612b508585612ae38685612585565b612b58612fd4565b8015612b6a57612b6a85600083613204565b612b8160a75460a65560a95460a85560a55460a455565b81612b9d57612b9d60a75460a65560a95460a85560a55460a455565b5050505050565b60008183612bc55760405162461bcd60e51b8152600401610cd291906136e2565b50600061248c84866138b9565b600080600080612be185613376565b90506000612bee86613392565b90506000612c0682612c008986612585565b90612585565b979296509094509092505050565b6000808080612c2388866127f1565b90506000612c3188876127f1565b90506000612c3f88886127f1565b90506000612c5182612c008686612585565b939b939a50919850919650505050505050565b600054610100900460ff166114965760405162461bcd60e51b8152600401610cd2906137e5565b600054610100900460ff16612cb25760405162461bcd60e51b8152600401610cd2906137e5565b8151612cc59060369060208501906134c6565b5080516110869060379060208401906134c6565b600054610100900460ff16612d005760405162461bcd60e51b8152600401610cd2906137e5565b612d08612c64565b6114966133ae565b600080612d1c836133de565b6001600160a01b0387166000908152609860205260409020549193509150612d449083612585565b6001600160a01b038087166000908152609860205260408082209390935590861681522054612d7390826124d7565b6001600160a01b0390941660009081526098602052604090209390935550505050565b6040805160028082526060820183526000926020830190803683370190505090503081600081518110612dcb57612dcb6139af565b6001600160a01b0392831660209182029290920181019190915260b654604080516315ab88c960e31b81529051919093169263ad5c4648926004808301939192829003018186803b158015612e1f57600080fd5b505afa158015612e33573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612e579190613591565b81600181518110612e6a57612e6a6139af565b6001600160a01b03928316602091820292909201015260b654612e90913091168461211b565b60b65460405163791ac94760e01b81526001600160a01b039091169063791ac94790612ec9908590600090869030904290600401613830565b600060405180830381600087803b158015612ee357600080fd5b505af1158015612453573d6000803e3d6000fd5b60b654612f0f9030906001600160a01b03168461211b565b60b6546001600160a01b031663f305d719823085600080612f386065546001600160a01b031690565b60405160e088901b6001600160e01b03191681526001600160a01b03958616600482015260248101949094526044840192909252606483015290911660848201524260a482015260c4016060604051808303818588803b158015612f9b57600080fd5b505af1158015612faf573d6000803e3d6000fd5b50505050506040513d601f19601f82011682018060405250810190612b9d91906136b4565b60a654158015612fe4575060a854155b8015612ff0575060a454155b15612ff757565b60a6805460a75560a8805460a95560a4805460a5556000928390559082905555565b6000610d836064611b4460a454856127f190919063ffffffff16565b60008060008060008061304787612536565b6001600160a01b038f16600090815260996020526040902054959b509399509197509550935091506130799088612585565b6001600160a01b038a166000908152609960209081526040808320939093556098905220546130a89087612585565b6001600160a01b03808b1660009081526098602052604080822093909355908a16815220546130d790866124d7565b6001600160a01b0389166000908152609860205260409020556130f981613401565b6131038483613489565b876001600160a01b0316896001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef8560405161314891815260200190565b60405180910390a3505050505050505050565b60008060008060008061316d87612536565b6001600160a01b038f16600090815260986020526040902054959b5093995091975095509350915061319f9087612585565b6001600160a01b03808b16600090815260986020908152604080832094909455918b168152609990915220546131d590846124d7565b6001600160a01b0389166000908152609960209081526040808320939093556098905220546130d790866124d7565b60008060008060008061321687612536565b95509550955095509550955060006001600160a01b0316886001600160a01b031614156132e0576001600160a01b0389166000908152609860205260409020546132609087612585565b6001600160a01b03808b1660009081526098602052604080822093909355908a168152205461328f90866124d7565b6001600160a01b038916600090815260986020526040902055609f546132b59087612585565b609f55609e546132c59084612585565b609e556132d181613401565b6132db8483613489565b613103565b6001600160a01b0389166000908152609860205260409020546130a89087612585565b60008060008060008061331587612536565b6001600160a01b038f16600090815260996020526040902054959b509399509197509550935091506133479088612585565b6001600160a01b038a1660009081526099602090815260408083209390935560989052205461319f9087612585565b6000610d836064611b4460a654856127f190919063ffffffff16565b6000610d836064611b4460a854856127f190919063ffffffff16565b600054610100900460ff166133d55760405162461bcd60e51b8152600401610cd2906137e5565b611496336125c7565b6000806000806133f5856133f0611b7f565b6134ad565b90969095509350505050565b600061340b611b7f565b9050600061341983836127f1565b3060009081526098602052604090205490915061343690826124d7565b30600090815260986020908152604080832093909355609c9052205460ff1615611086573060009081526099602052604090205461347490846124d7565b30600090815260996020526040902055505050565b609f546134969083612585565b609f5560a0546134a690826124d7565b60a0555050565b600080806134bb85856127f1565b958695509350505050565b8280546134d290613903565b90600052602060002090601f0160209004810192826134f4576000855561353a565b82601f1061350d57805160ff191683800117855561353a565b8280016001018555821561353a579182015b8281111561353a57825182559160200191906001019061351f565b5061354692915061354a565b5090565b5b80821115613546576000815560010161354b565b8035801515811461356f57600080fd5b919050565b60006020828403121561358657600080fd5b8135610e6f816139c5565b6000602082840312156135a357600080fd5b8151610e6f816139c5565b600080604083850312156135c157600080fd5b82356135cc816139c5565b915060208301356135dc816139c5565b809150509250929050565b6000806000606084860312156135fc57600080fd5b8335613607816139c5565b92506020840135613617816139c5565b929592945050506040919091013590565b6000806040838503121561363b57600080fd5b8235613646816139c5565b946020939093013593505050565b60006020828403121561366657600080fd5b610e6f8261355f565b60006020828403121561368157600080fd5b5035919050565b6000806040838503121561369b57600080fd5b823591506136ab6020840161355f565b90509250929050565b6000806000606084860312156136c957600080fd5b8351925060208401519150604084015190509250925092565b600060208083528351808285015260005b8181101561370f578581018301518582016040015282016136f3565b81811115613721576000604083870101525b50601f01601f1916929092016040019392505050565b6020808252602e908201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160408201526d191e481a5b9a5d1a585b1a5e995960921b606082015260800190565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b6020808252601190820152702cb7ba9030b932903737ba1020b236b4b760791b604082015260600190565b6020808252602b908201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960408201526a6e697469616c697a696e6760a81b606082015260800190565b600060a082018783526020878185015260a0604085015281875180845260c086019150828901935060005b818110156138805784516001600160a01b03168352938301939183019160010161385b565b50506001600160a01b03969096166060850152505050608001529392505050565b600082198211156138b4576138b461396d565b500190565b6000826138c8576138c8613983565b500490565b60008160001904831182151516156138e7576138e761396d565b500290565b6000828210156138fe576138fe61396d565b500390565b600181811c9082168061391757607f821691505b6020821081141561393857634e487b7160e01b600052602260045260246000fd5b50919050565b60006000198214156139525761395261396d565b5060010190565b60008261396857613968613983565b500690565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052601260045260246000fd5b634e487b7160e01b600052603160045260246000fd5b634e487b7160e01b600052603260045260246000fd5b6001600160a01b0381168114611afd57600080fdfe45524332303a207472616e7366657220616d6f756e74206578636565647320616c6c6f77616e636545524332303a2064656372656173656420616c6c6f77616e63652062656c6f77207a65726fa2646970667358221220d8a811f09e35addb8f8ae85a03520377824fd7c7458d7267ae36c12fb4822ed464736f6c63430008070033
Deployed Bytecode
0x6080604052600436106103fe5760003560e01c80636bc87c3a11610213578063a9059cbb11610123578063d1df306c116100ab578063dd62ed3e1161007a578063dd62ed3e14610bec578063ea2f0b3714610c32578063ec28438a14610c52578063f2fde38b14610c72578063fb1eb14b14610c9257600080fd5b8063d1df306c14610b76578063d25117d814610b96578063d49d518114610bb6578063d543dbeb14610bcc57600080fd5b8063b72c97d5116100f2578063b72c97d514610aea578063c0b0fda214610b0a578063c49b9a8014610b20578063ccc5784014610b40578063cea2695814610b5657600080fd5b8063a9059cbb14610a7e578063ad9c02cf14610a9e578063af465a2714610ab4578063af81c5b914610aca57600080fd5b806388f82020116101a657806394e107841161017557806394e10784146109f457806395d89b4114610a0957806397a9d56014610a1e578063a457c2d714610a48578063a4860a2a14610a6857600080fd5b806388f82020146109675780638da5cb5b146109a05780638ee88c53146109be5780638f9a55c0146109de57600080fd5b806379c65068116101e257806379c65068146108fc5780637d1db4a51461091c5780638129fc1c1461093257806382bf293c1461094757600080fd5b80636bc87c3a146108a157806370a082311461076e578063715018a6146108b7578063768dc710146108cc57600080fd5b806336c2f4251161030e578063484ad902116102a15780634f0006af116102705780634f0006af146107ef57806352390c02146108055780635342acb414610825578063587cde1e1461085e578063691361a91461088b57600080fd5b8063484ad9021461076e57806349bd5a5e1461078e5780634a74bb02146107ae5780634d09deb3146107cf57600080fd5b80633bd5d173116102dd5780633bd5d173146106f8578063437823ec146107185780634549b0391461073857806345e0b9d41461075857600080fd5b806336c2f4251461067557806339509351146106955780633b124fe7146106b55780633b7e6d4a146106cb57600080fd5b806313114a9d1161039157806323789ea01161036057806323789ea0146105d257806323b872dd146105f35780632d83811914610613578063313ce567146106335780633685d4191461065557600080fd5b806313114a9d1461055a5780631694505e1461056f57806318160ddd146105a75780631a590e26146105bc57600080fd5b80630cfc15f9116103cd5780630cfc15f9146104b75780630fbb8ad0146104f2578063112ff48914610508578063128a905b1461054457600080fd5b8063061c82d01461040a57806306fdde031461042c578063095ea7b3146104575780630b285b1f1461048757600080fd5b3661040557005b600080fd5b34801561041657600080fd5b5061042a61042536600461366f565b610ca8565b005b34801561043857600080fd5b50610441610ce0565b60405161044e91906136e2565b60405180910390f35b34801561046357600080fd5b50610477610472366004613628565b610d72565b604051901515815260200161044e565b34801561049357600080fd5b506104776104a2366004613574565b609c6020526000908152604090205460ff1681565b3480156104c357600080fd5b506104e46104d2366004613574565b60986020526000908152604090205481565b60405190815260200161044e565b3480156104fe57600080fd5b506104e460b45481565b34801561051457600080fd5b50610477610523366004613628565b6001600160a01b039190911660009081526097602052604090205481161490565b34801561055057600080fd5b506104e460aa5481565b34801561056657600080fd5b5060a0546104e4565b34801561057b57600080fd5b5060b65461058f906001600160a01b031681565b6040516001600160a01b03909116815260200161044e565b3480156105b357600080fd5b50609e546104e4565b3480156105c857600080fd5b506104e460b35481565b3480156105de57600080fd5b5060bb5461047790600160a01b900460ff1681565b3480156105ff57600080fd5b5061047761060e3660046135e7565b610d89565b34801561061f57600080fd5b506104e461062e36600461366f565b610df2565b34801561063f57600080fd5b5060a35460405160ff909116815260200161044e565b34801561066157600080fd5b5061042a610670366004613574565b610e76565b34801561068157600080fd5b5061042a6106903660046135ae565b61102d565b3480156106a157600080fd5b506104776106b0366004613628565b61108b565b3480156106c157600080fd5b506104e460a65481565b3480156106d757600080fd5b506104e46106e6366004613574565b60996020526000908152604090205481565b34801561070457600080fd5b5061042a61071336600461366f565b6110c1565b34801561072457600080fd5b5061042a610733366004613574565b6111ab565b34801561074457600080fd5b506104e4610753366004613688565b6111f9565b34801561076457600080fd5b506104e4609f5481565b34801561077a57600080fd5b506104e4610789366004613574565b611286565b34801561079a57600080fd5b5060b75461058f906001600160a01b031681565b3480156107ba57600080fd5b5060b75461047790600160a81b900460ff1681565b3480156107db57600080fd5b5061058f6107ea36600461366f565b6112e5565b3480156107fb57600080fd5b506104e460ad5481565b34801561081157600080fd5b5061042a610820366004613574565b61130f565b34801561083157600080fd5b50610477610840366004613574565b6001600160a01b03166000908152609b602052604090205460ff1690565b34801561086a57600080fd5b506104e4610879366004613574565b60976020526000908152604090205481565b34801561089757600080fd5b506104e460ab5481565b3480156108ad57600080fd5b506104e460a85481565b3480156108c357600080fd5b5061042a611462565b3480156108d857600080fd5b506104776108e7366004613574565b609b6020526000908152604090205460ff1681565b34801561090857600080fd5b5061042a610917366004613628565b611498565b34801561092857600080fd5b506104e460b85481565b34801561093e57600080fd5b5061042a61156a565b34801561095357600080fd5b5061042a61096236600461366f565b611b00565b34801561097357600080fd5b50610477610982366004613574565b6001600160a01b03166000908152609c602052604090205460ff1690565b3480156109ac57600080fd5b506065546001600160a01b031661058f565b3480156109ca57600080fd5b5061042a6109d936600461366f565b611b50565b3480156109ea57600080fd5b506104e460b95481565b348015610a0057600080fd5b506104e4611b7f565b348015610a1557600080fd5b50610441611ba2565b348015610a2a57600080fd5b50610a33611bb1565b6040805192835260208301919091520161044e565b348015610a5457600080fd5b50610477610a63366004613628565b611d33565b348015610a7457600080fd5b506104e460b25481565b348015610a8a57600080fd5b50610477610a99366004613628565b611d82565b348015610aaa57600080fd5b506104e460ac5481565b348015610ac057600080fd5b506104e4609e5481565b348015610ad657600080fd5b5061042a610ae5366004613628565b611d8f565b348015610af657600080fd5b506104e4610b0536600461366f565b611db9565b348015610b1657600080fd5b506104e460a45481565b348015610b2c57600080fd5b5061042a610b3b366004613654565b611dd0565b348015610b4c57600080fd5b506104e460b55481565b348015610b6257600080fd5b5061042a610b7136600461366f565b611e52565b348015610b8257600080fd5b5061042a610b91366004613628565b611e81565b348015610ba257600080fd5b5061042a610bb1366004613628565b611f12565b348015610bc257600080fd5b506104e460001981565b348015610bd857600080fd5b5061042a610be736600461366f565b611fb2565b348015610bf857600080fd5b506104e4610c073660046135ae565b6001600160a01b039182166000908152609a6020908152604080832093909416825291909152205490565b348015610c3e57600080fd5b5061042a610c4d366004613574565b611ffc565b348015610c5e57600080fd5b5061042a610c6d36600461366f565b612047565b348015610c7e57600080fd5b5061042a610c8d366004613574565b612083565b348015610c9e57600080fd5b506104e460a05481565b60af546001600160a01b03163314610cdb5760405162461bcd60e51b8152600401610cd2906137ba565b60405180910390fd5b60a655565b606060a18054610cef90613903565b80601f0160208091040260200160405190810160405280929190818152602001828054610d1b90613903565b8015610d685780601f10610d3d57610100808354040283529160200191610d68565b820191906000526020600020905b815481529060010190602001808311610d4b57829003601f168201915b5050505050905090565b6000610d7f33848461211b565b5060015b92915050565b6000610d9684848461223f565b610de88433610de3856040518060600160405280602881526020016139db602891396001600160a01b038a166000908152609a60209081526040808320338452909152902054919061245b565b61211b565b5060019392505050565b6000609f54821115610e595760405162461bcd60e51b815260206004820152602a60248201527f416d6f756e74206d757374206265206c657373207468616e20746f74616c207260448201526965666c656374696f6e7360b01b6064820152608401610cd2565b6000610e63611b7f565b9050610e6f8382612495565b9392505050565b6065546001600160a01b03163314610ea05760405162461bcd60e51b8152600401610cd290613785565b6001600160a01b0381166000908152609c602052604090205460ff16610f085760405162461bcd60e51b815260206004820152601b60248201527f4163636f756e7420697320616c7265616479206578636c7564656400000000006044820152606401610cd2565b60005b609d5481101561102957816001600160a01b0316609d8281548110610f3257610f326139af565b6000918252602090912001546001600160a01b0316141561101757609d8054610f5d906001906138ec565b81548110610f6d57610f6d6139af565b600091825260209091200154609d80546001600160a01b039092169183908110610f9957610f996139af565b600091825260208083209190910180546001600160a01b0319166001600160a01b039485161790559184168152609982526040808220829055609c90925220805460ff19169055609d805480610ff157610ff1613999565b600082815260209020810160001990810180546001600160a01b03191690550190555050565b806110218161393e565b915050610f0b565b5050565b6065546001600160a01b031633146110575760405162461bcd60e51b8152600401610cd290613785565b6001600160a01b0382166000908152609760205260408120549061107c908490611f12565b6110868282611f12565b505050565b336000818152609a602090815260408083206001600160a01b03871684529091528120549091610d7f918590610de390866124d7565b336000818152609c602052604090205460ff16156111365760405162461bcd60e51b815260206004820152602c60248201527f4578636c75646564206164647265737365732063616e6e6f742063616c6c207460448201526b3434b990333ab731ba34b7b760a11b6064820152608401610cd2565b600061114183612536565b505050506001600160a01b03841660009081526098602052604090205491925061116d91905082612585565b6001600160a01b038316600090815260986020526040902055609f546111939082612585565b609f5560a0546111a390846124d7565b60a055505050565b6065546001600160a01b031633146111d55760405162461bcd60e51b8152600401610cd290613785565b6001600160a01b03166000908152609b60205260409020805460ff19166001179055565b6000609e5483111561124d5760405162461bcd60e51b815260206004820152601f60248201527f416d6f756e74206d757374206265206c657373207468616e20737570706c79006044820152606401610cd2565b8161126c57600061125d84612536565b50939550610d83945050505050565b600061127784612536565b50929550610d83945050505050565b6001600160a01b0381166000908152609c602052604081205460ff16156112c357506001600160a01b031660009081526099602052604090205490565b6001600160a01b038216600090815260986020526040902054610d8390610df2565b609d81815481106112f557600080fd5b6000918252602090912001546001600160a01b0316905081565b6065546001600160a01b031633146113395760405162461bcd60e51b8152600401610cd290613785565b6001600160a01b0381166000908152609c602052604090205460ff16156113a25760405162461bcd60e51b815260206004820152601b60248201527f4163636f756e7420697320616c7265616479206578636c7564656400000000006044820152606401610cd2565b6001600160a01b038116600090815260986020526040902054156113fc576001600160a01b0381166000908152609860205260409020546113e290610df2565b6001600160a01b0382166000908152609960205260409020555b6001600160a01b03166000818152609c60205260408120805460ff19166001908117909155609d805491820181559091527fd26e832454299e9fabb89e0e5fffdc046d4e14431bc1bf607ffb2e8a1ddecf7b0180546001600160a01b0319169091179055565b6065546001600160a01b0316331461148c5760405162461bcd60e51b8152600401610cd290613785565b61149660006125c7565b565b73871770e3e03bfaefa3597056e540a1a9c9ac7f6b33146114fb5760405162461bcd60e51b815260206004820152601c60248201527f596f7520617265206e6f74205374616b696e6720636f6e7472616374000000006044820152606401610cd2565b600061150682611db9565b6001600160a01b03841660009081526098602052604090205490915061152c90826124d7565b6001600160a01b038416600090815260986020526040902055609f5461155290826124d7565b609f55609e5461156290836124d7565b609e55505050565b600054610100900460ff166115855760005460ff1615611589565b303b155b6115a55760405162461bcd60e51b8152600401610cd290613737565b600054610100900460ff161580156115c7576000805461ffff19166101011790555b6b033b2e3c9fd0803ce8000000609e8190556115e590600019613959565b6115f1906000196138ec565b609f55604080518082019091526006808252650a6a49e9ea8f60d31b60209092019182526116219160a1916134c6565b50604080518082019091526006808252650a6a49e9ea8f60d31b602090920191825261164f9160a2916134c6565b5060a3805460ff19166012179055600360a481905560a555600660a681905560a755600160a881905560a955601960aa5560c860ab556101f460ac5561011360ad5560ae80546001600160a01b031990811673d8526ab31c9b901a7a2e9f1d8710b9b56ee28d4d1790915560af8054821673d0d725208fd36be1561050fc1dd6a651d7ea7c8917905560b0805482167341a5598cdf1b53adce7b4ffa649c081e854be09817905560b18054909116732951adf1bce46bf7b5d2c8ab174dc6e0d0fe344717905560b7805460ff60a81b1916600160a81b1790556a084595161401484a00000060b8556a18d0bf423c03d8de00000060b95569d3c21bcecceda100000060ba5560bb805460ff60a01b1916600160a01b17905560a18054611887919061177990613903565b80601f01602080910402602001604051908101604052809291908181526020018280546117a590613903565b80156117f25780601f106117c7576101008083540402835291602001916117f2565b820191906000526020600020905b8154815290600101906020018083116117d557829003601f168201915b505050505060a2805461180490613903565b80601f016020809104026020016040519081016040528092919081815260200182805461183090613903565b801561187d5780601f106118525761010080835404028352916020019161187d565b820191906000526020600020905b81548152906001019060200180831161186057829003601f168201915b5050505050612619565b61188f612652565b609f54336000818152609860209081526040918290209390935560bb80546001600160a01b031916909217909155805163c45a015560e01b81529051737a250d5630b4cf539739df2c5dacb4c659f2488d92839263c45a01559260048083019392829003018186803b15801561190457600080fd5b505afa158015611918573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061193c9190613591565b6001600160a01b031663c9c6539630836001600160a01b031663ad5c46486040518163ffffffff1660e01b815260040160206040518083038186803b15801561198457600080fd5b505afa158015611998573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906119bc9190613591565b6040516001600160e01b031960e085901b1681526001600160a01b03928316600482015291166024820152604401602060405180830381600087803b158015611a0457600080fd5b505af1158015611a18573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611a3c9190613591565b60b780546001600160a01b03199081166001600160a01b039384161790915560b6805490911683831617905560655481166000908152609b6020526040808220805460ff199081166001908117909255308452828420805482168317905560ae5485168452828420805482168317905560af5485168452828420805482168317905560b05485168452828420805482168317905560b154909416835291208054909216179055611aea6126cb565b508015611afd576000805461ff00191690555b50565b60af546001600160a01b03163314611b2a5760405162461bcd60e51b8152600401610cd2906137ba565b611b4a6064611b4483609e546127f190919063ffffffff16565b90612495565b60b95550565b60af546001600160a01b03163314611b7a5760405162461bcd60e51b8152600401610cd2906137ba565b60a855565b6000806000611b8c611bb1565b9092509050611b9b8282612495565b9250505090565b606060a28054610cef90613903565b609f54609e546000918291825b609d54811015611d03578260986000609d8481548110611be057611be06139af565b60009182526020808320909101546001600160a01b031683528201929092526040019020541180611c4b57508160996000609d8481548110611c2457611c246139af565b60009182526020808320909101546001600160a01b03168352820192909252604001902054115b15611c6157609f54609e54945094505050509091565b611ca760986000609d8481548110611c7b57611c7b6139af565b60009182526020808320909101546001600160a01b031683528201929092526040019020548490612585565b9250611cef60996000609d8481548110611cc357611cc36139af565b60009182526020808320909101546001600160a01b031683528201929092526040019020548390612585565b915080611cfb8161393e565b915050611bbe565b50609e54609f54611d1391612495565b821015611d2a57609f54609e549350935050509091565b90939092509050565b6000610d7f3384610de385604051806060016040528060258152602001613a0360259139336000908152609a602090815260408083206001600160a01b038d168452909152902054919061245b565b6000610d7f33848461223f565b60af546001600160a01b031633146114fb5760405162461bcd60e51b8152600401610cd2906137ba565b600080611dc4611b7f565b9050610e6f83826127f1565b60af546001600160a01b03163314611dfa5760405162461bcd60e51b8152600401610cd2906137ba565b60b78054821515600160a81b0260ff60a81b199091161790556040517f53726dfcaf90650aa7eb35524f4d3220f07413c8d6cb404cc8c18bf5591bc15990611e4790831515815260200190565b60405180910390a150565b60af546001600160a01b03163314611e7c5760405162461bcd60e51b8152600401610cd2906137ba565b60a455565b60af546001600160a01b03163314611eab5760405162461bcd60e51b8152600401610cd2906137ba565b6000611eb682611db9565b6001600160a01b038416600090815260986020526040902054909150611edc9082612585565b6001600160a01b038416600090815260986020526040902055609f54611f029082612585565b609f55609e546115629083612585565b6065546001600160a01b03163314611f3c5760405162461bcd60e51b8152600401610cd290613785565b6001600160a01b038216611fa85760405162461bcd60e51b815260206004820152602d60248201527f44656c6567617461626c653a206e65772064656c65676174652069732074686560448201526c207a65726f206164647265737360981b6064820152608401610cd2565b6110298282612870565b60af546001600160a01b03163314611fdc5760405162461bcd60e51b8152600401610cd2906137ba565b611ff66064611b4483609e546127f190919063ffffffff16565b60b85550565b6065546001600160a01b031633146120265760405162461bcd60e51b8152600401610cd290613785565b6001600160a01b03166000908152609b60205260409020805460ff19169055565b60af546001600160a01b031633146120715760405162461bcd60e51b8152600401610cd2906137ba565b611ff681670de0b6b3a76400006138cd565b6065546001600160a01b031633146120ad5760405162461bcd60e51b8152600401610cd290613785565b6001600160a01b0381166121125760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610cd2565b611afd816125c7565b6001600160a01b03831661217d5760405162461bcd60e51b8152602060048201526024808201527f45524332303a20617070726f76652066726f6d20746865207a65726f206164646044820152637265737360e01b6064820152608401610cd2565b6001600160a01b0382166121de5760405162461bcd60e51b815260206004820152602260248201527f45524332303a20617070726f766520746f20746865207a65726f206164647265604482015261737360f01b6064820152608401610cd2565b6001600160a01b038381166000818152609a602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925910160405180910390a3505050565b6001600160a01b0383166122a35760405162461bcd60e51b815260206004820152602560248201527f45524332303a207472616e736665722066726f6d20746865207a65726f206164604482015264647265737360d81b6064820152608401610cd2565b6001600160a01b0382166123055760405162461bcd60e51b815260206004820152602360248201527f45524332303a207472616e7366657220746f20746865207a65726f206164647260448201526265737360e81b6064820152608401610cd2565b600081116123675760405162461bcd60e51b815260206004820152602960248201527f5472616e7366657220616d6f756e74206d7573742062652067726561746572206044820152687468616e207a65726f60b81b6064820152608401610cd2565b600061237230611286565b905060b8548110612382575060b8545b60ba54811080159081906123a0575060b754600160a01b900460ff16155b80156123ba575060b7546001600160a01b03868116911614155b80156123cf575060b754600160a81b900460ff165b156123e25760ba5491506123e2826128b7565b6001600160a01b0385166000908152609b602052604090205460019060ff168061242457506001600160a01b0385166000908152609b602052604090205460ff165b1561242d575060005b60b7546001600160a01b0387811691161415612447575060005b6124538686868461295e565b505050505050565b6000818484111561247f5760405162461bcd60e51b8152600401610cd291906136e2565b50600061248c84866138ec565b95945050505050565b6000610e6f83836040518060400160405280601a81526020017f536166654d6174683a206469766973696f6e206279207a65726f000000000000815250612ba4565b6000806124e483856138a1565b905083811015610e6f5760405162461bcd60e51b815260206004820152601b60248201527f536166654d6174683a206164646974696f6e206f766572666c6f7700000000006044820152606401610cd2565b600080600080600080600080600061254d8a612bd2565b925092509250600080600061256b8d8686612566611b7f565b612c14565b919f909e50909c50959a5093985091965092945050505050565b6000610e6f83836040518060400160405280601e81526020017f536166654d6174683a207375627472616374696f6e206f766572666c6f77000081525061245b565b606580546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b600054610100900460ff166126405760405162461bcd60e51b8152600401610cd2906137e5565b612648612c64565b6110298282612c8b565b600054610100900460ff1661266d5760005460ff1615612671565b303b155b61268d5760405162461bcd60e51b8152600401610cd290613737565b600054610100900460ff161580156126af576000805461ffff19166101011790555b6126b7612cd9565b8015611afd576000805461ff001916905550565b60aa5460bb546126f691906126f0906103e890611b44906001600160a01b0316611286565b906127f1565b60b25560ab5460bb5461271e91906126f0906103e890611b44906001600160a01b0316611286565b60b35560ac5460bb5461274691906126f0906103e890611b44906001600160a01b0316611286565b60b45560ad5460bb5461276e91906126f0906103e890611b44906001600160a01b0316611286565b60b55560bb5460ae5460b254612791926001600160a01b03908116921690612d10565b60bb5460af5460b3546127b1926001600160a01b03908116921690612d10565b60bb5460b05460b4546127d1926001600160a01b03908116921690612d10565b60bb5460b15460b554611496926001600160a01b03908116921690612d10565b60008261280057506000610d83565b600061280c83856138cd565b90508261281985836138b9565b14610e6f5760405162461bcd60e51b815260206004820152602160248201527f536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f6044820152607760f81b6064820152608401610cd2565b6001600160a01b038216600081815260976020526040808220849055518392917f6c5f52bb89ff64b97a0875a6ee13193b008c8b1460aea11a245fa07b64b721e691a35050565b60b7805460ff60a01b1916600160a01b17905560006128d7826002612495565b905060006128e58383612585565b9050476128f183612d96565b60006128fd4783612585565b90506129098382612ef7565b60408051858152602081018390529081018490527f17bbfb9a6069321b6ded73bd96327c9e6b7212a5cd51ff219cd61370acafb5619060600160405180910390a1505060b7805460ff60a01b19169055505050565b8061296b5761296b612fd4565b600061297f6065546001600160a01b031690565b6001600160a01b0316856001600160a01b0316141580156129ae57506065546001600160a01b03858116911614155b80156129c357506001600160a01b0385163014155b156129d4576129d183613019565b90505b6001600160a01b0385166000908152609c602052604090205460ff168015612a1557506001600160a01b0384166000908152609c602052604090205460ff16155b15612a3357612a2e8585612a298685612585565b613035565b612b50565b6001600160a01b0385166000908152609c602052604090205460ff16158015612a7457506001600160a01b0384166000908152609c602052604090205460ff165b15612a8d57612a2e8585612a888685612585565b61315b565b6001600160a01b0385166000908152609c602052604090205460ff16158015612acf57506001600160a01b0384166000908152609c602052604090205460ff16155b15612ae857612a2e8585612ae38685612585565b613204565b6001600160a01b0385166000908152609c602052604090205460ff168015612b2857506001600160a01b0384166000908152609c602052604090205460ff165b15612b4157612a2e8585612b3c8685612585565b613303565b612b508585612ae38685612585565b612b58612fd4565b8015612b6a57612b6a85600083613204565b612b8160a75460a65560a95460a85560a55460a455565b81612b9d57612b9d60a75460a65560a95460a85560a55460a455565b5050505050565b60008183612bc55760405162461bcd60e51b8152600401610cd291906136e2565b50600061248c84866138b9565b600080600080612be185613376565b90506000612bee86613392565b90506000612c0682612c008986612585565b90612585565b979296509094509092505050565b6000808080612c2388866127f1565b90506000612c3188876127f1565b90506000612c3f88886127f1565b90506000612c5182612c008686612585565b939b939a50919850919650505050505050565b600054610100900460ff166114965760405162461bcd60e51b8152600401610cd2906137e5565b600054610100900460ff16612cb25760405162461bcd60e51b8152600401610cd2906137e5565b8151612cc59060369060208501906134c6565b5080516110869060379060208401906134c6565b600054610100900460ff16612d005760405162461bcd60e51b8152600401610cd2906137e5565b612d08612c64565b6114966133ae565b600080612d1c836133de565b6001600160a01b0387166000908152609860205260409020549193509150612d449083612585565b6001600160a01b038087166000908152609860205260408082209390935590861681522054612d7390826124d7565b6001600160a01b0390941660009081526098602052604090209390935550505050565b6040805160028082526060820183526000926020830190803683370190505090503081600081518110612dcb57612dcb6139af565b6001600160a01b0392831660209182029290920181019190915260b654604080516315ab88c960e31b81529051919093169263ad5c4648926004808301939192829003018186803b158015612e1f57600080fd5b505afa158015612e33573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612e579190613591565b81600181518110612e6a57612e6a6139af565b6001600160a01b03928316602091820292909201015260b654612e90913091168461211b565b60b65460405163791ac94760e01b81526001600160a01b039091169063791ac94790612ec9908590600090869030904290600401613830565b600060405180830381600087803b158015612ee357600080fd5b505af1158015612453573d6000803e3d6000fd5b60b654612f0f9030906001600160a01b03168461211b565b60b6546001600160a01b031663f305d719823085600080612f386065546001600160a01b031690565b60405160e088901b6001600160e01b03191681526001600160a01b03958616600482015260248101949094526044840192909252606483015290911660848201524260a482015260c4016060604051808303818588803b158015612f9b57600080fd5b505af1158015612faf573d6000803e3d6000fd5b50505050506040513d601f19601f82011682018060405250810190612b9d91906136b4565b60a654158015612fe4575060a854155b8015612ff0575060a454155b15612ff757565b60a6805460a75560a8805460a95560a4805460a5556000928390559082905555565b6000610d836064611b4460a454856127f190919063ffffffff16565b60008060008060008061304787612536565b6001600160a01b038f16600090815260996020526040902054959b509399509197509550935091506130799088612585565b6001600160a01b038a166000908152609960209081526040808320939093556098905220546130a89087612585565b6001600160a01b03808b1660009081526098602052604080822093909355908a16815220546130d790866124d7565b6001600160a01b0389166000908152609860205260409020556130f981613401565b6131038483613489565b876001600160a01b0316896001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef8560405161314891815260200190565b60405180910390a3505050505050505050565b60008060008060008061316d87612536565b6001600160a01b038f16600090815260986020526040902054959b5093995091975095509350915061319f9087612585565b6001600160a01b03808b16600090815260986020908152604080832094909455918b168152609990915220546131d590846124d7565b6001600160a01b0389166000908152609960209081526040808320939093556098905220546130d790866124d7565b60008060008060008061321687612536565b95509550955095509550955060006001600160a01b0316886001600160a01b031614156132e0576001600160a01b0389166000908152609860205260409020546132609087612585565b6001600160a01b03808b1660009081526098602052604080822093909355908a168152205461328f90866124d7565b6001600160a01b038916600090815260986020526040902055609f546132b59087612585565b609f55609e546132c59084612585565b609e556132d181613401565b6132db8483613489565b613103565b6001600160a01b0389166000908152609860205260409020546130a89087612585565b60008060008060008061331587612536565b6001600160a01b038f16600090815260996020526040902054959b509399509197509550935091506133479088612585565b6001600160a01b038a1660009081526099602090815260408083209390935560989052205461319f9087612585565b6000610d836064611b4460a654856127f190919063ffffffff16565b6000610d836064611b4460a854856127f190919063ffffffff16565b600054610100900460ff166133d55760405162461bcd60e51b8152600401610cd2906137e5565b611496336125c7565b6000806000806133f5856133f0611b7f565b6134ad565b90969095509350505050565b600061340b611b7f565b9050600061341983836127f1565b3060009081526098602052604090205490915061343690826124d7565b30600090815260986020908152604080832093909355609c9052205460ff1615611086573060009081526099602052604090205461347490846124d7565b30600090815260996020526040902055505050565b609f546134969083612585565b609f5560a0546134a690826124d7565b60a0555050565b600080806134bb85856127f1565b958695509350505050565b8280546134d290613903565b90600052602060002090601f0160209004810192826134f4576000855561353a565b82601f1061350d57805160ff191683800117855561353a565b8280016001018555821561353a579182015b8281111561353a57825182559160200191906001019061351f565b5061354692915061354a565b5090565b5b80821115613546576000815560010161354b565b8035801515811461356f57600080fd5b919050565b60006020828403121561358657600080fd5b8135610e6f816139c5565b6000602082840312156135a357600080fd5b8151610e6f816139c5565b600080604083850312156135c157600080fd5b82356135cc816139c5565b915060208301356135dc816139c5565b809150509250929050565b6000806000606084860312156135fc57600080fd5b8335613607816139c5565b92506020840135613617816139c5565b929592945050506040919091013590565b6000806040838503121561363b57600080fd5b8235613646816139c5565b946020939093013593505050565b60006020828403121561366657600080fd5b610e6f8261355f565b60006020828403121561368157600080fd5b5035919050565b6000806040838503121561369b57600080fd5b823591506136ab6020840161355f565b90509250929050565b6000806000606084860312156136c957600080fd5b8351925060208401519150604084015190509250925092565b600060208083528351808285015260005b8181101561370f578581018301518582016040015282016136f3565b81811115613721576000604083870101525b50601f01601f1916929092016040019392505050565b6020808252602e908201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160408201526d191e481a5b9a5d1a585b1a5e995960921b606082015260800190565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b6020808252601190820152702cb7ba9030b932903737ba1020b236b4b760791b604082015260600190565b6020808252602b908201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960408201526a6e697469616c697a696e6760a81b606082015260800190565b600060a082018783526020878185015260a0604085015281875180845260c086019150828901935060005b818110156138805784516001600160a01b03168352938301939183019160010161385b565b50506001600160a01b03969096166060850152505050608001529392505050565b600082198211156138b4576138b461396d565b500190565b6000826138c8576138c8613983565b500490565b60008160001904831182151516156138e7576138e761396d565b500290565b6000828210156138fe576138fe61396d565b500390565b600181811c9082168061391757607f821691505b6020821081141561393857634e487b7160e01b600052602260045260246000fd5b50919050565b60006000198214156139525761395261396d565b5060010190565b60008261396857613968613983565b500690565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052601260045260246000fd5b634e487b7160e01b600052603160045260246000fd5b634e487b7160e01b600052603260045260246000fd5b6001600160a01b0381168114611afd57600080fdfe45524332303a207472616e7366657220616d6f756e74206578636565647320616c6c6f77616e636545524332303a2064656372656173656420616c6c6f77616e63652062656c6f77207a65726fa2646970667358221220d8a811f09e35addb8f8ae85a03520377824fd7c7458d7267ae36c12fb4822ed464736f6c63430008070033
Deployed Bytecode Sourcemap
39833:25672:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;50600:179;;;;;;;;;;-1:-1:-1;50600:179:0;;;;;:::i;:::-;;:::i;:::-;;45284:91;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;46429:161;;;;;;;;;;-1:-1:-1;46429:161:0;;;;;:::i;:::-;;:::i;:::-;;;4089:14:1;;4082:22;4064:41;;4052:2;4037:18;46429:161:0;3924:187:1;40219:44:0;;;;;;;;;;-1:-1:-1;40219:44:0;;;;;:::i;:::-;;;;;;;;;;;;;;;;39981:43;;;;;;;;;;-1:-1:-1;39981:43:0;;;;;:::i;:::-;;;;;;;;;;;;;;;;;12137:25:1;;;12125:2;12110:18;39981:43:0;11991:177:1;41182:38:0;;;;;;;;;;;;;;;;30789:154;;;;;;;;;;-1:-1:-1;30789:154:0;;;;;:::i;:::-;-1:-1:-1;;;;;30900:19:0;;;;30876:4;30900:19;;;:9;:19;;;;;;:27;;30899:38;;30789:154;40761:27;;;;;;;;;;;;;;;;47568:87;;;;;;;;;;-1:-1:-1;47637:10:0;;47568:87;;41270:41;;;;;;;;;;-1:-1:-1;41270:41:0;;;;-1:-1:-1;;;;;41270:41:0;;;;;;-1:-1:-1;;;;;2959:32:1;;;2941:51;;2929:2;2914:18;41270:41:0;2795:203:1;45587:95:0;;;;;;;;;;-1:-1:-1;45667:7:0;;45587:95;;41139:36;;;;;;;;;;;;;;;;42069:29;;;;;;;;;;-1:-1:-1;42069:29:0;;;;-1:-1:-1;;;42069:29:0;;;;;;46598:313;;;;;;;;;;-1:-1:-1;46598:313:0;;;;;:::i;:::-;;:::i;48492:255::-;;;;;;;;;;-1:-1:-1;48492:255:0;;;;;:::i;:::-;;:::i;45487:92::-;;;;;;;;;;-1:-1:-1;45562:9:0;;45487:92;;45562:9;;;;13877:36:1;;13865:2;13850:18;45487:92:0;13735:184:1;49210:479:0;;;;;;;;;;-1:-1:-1;49210:479:0;;;;;:::i;:::-;;:::i;31424:241::-;;;;;;;;;;-1:-1:-1;31424:241:0;;;;;:::i;:::-;;:::i;46919:227::-;;;;;;;;;;-1:-1:-1;46919:227:0;;;;;:::i;:::-;;:::i;40607:22::-;;;;;;;;;;;;;;;;40031:43;;;;;;;;;;-1:-1:-1;40031:43:0;;;;;:::i;:::-;;;;;;;;;;;;;;47663:377;;;;;;;;;;-1:-1:-1;47663:377:0;;;;;:::i;:::-;;:::i;50355:111::-;;;;;;;;;;-1:-1:-1;50355:111:0;;;;;:::i;:::-;;:::i;48048:436::-;;;;;;;;;;-1:-1:-1;48048:436:0;;;;;:::i;:::-;;:::i;40385:22::-;;;;;;;;;;;;;;;;45896:199;;;;;;;;;;-1:-1:-1;45896:199:0;;;;;:::i;:::-;;:::i;41318:28::-;;;;;;;;;;-1:-1:-1;41318:28:0;;;;-1:-1:-1;;;;;41318:28:0;;;41387:33;;;;;;;;;;-1:-1:-1;41387:33:0;;;;-1:-1:-1;;;41387:33:0;;;;;;40270:26;;;;;;;;;;-1:-1:-1;40270:26:0;;;;;:::i;:::-;;:::i;40879:32::-;;;;;;;;;;;;;;;;48755:447;;;;;;;;;;-1:-1:-1;48755:447:0;;;;;:::i;:::-;;:::i;56142:123::-;;;;;;;;;;-1:-1:-1;56142:123:0;;;;;:::i;:::-;-1:-1:-1;;;;;56230:27:0;56206:4;56230:27;;;:18;:27;;;;;;;;;56142:123;30476:44;;;;;;;;;;-1:-1:-1;30476:44:0;;;;;:::i;:::-;;;;;;;;;;;;;;40795:34;;;;;;;;;;;;;;;;40680:28;;;;;;;;;;;;;;;;15368:103;;;;;;;;;;;;;:::i;40159:51::-;;;;;;;;;;-1:-1:-1;40159:51:0;;;;;:::i;:::-;;;;;;;;;;;;;;;;65109:393;;;;;;;;;;-1:-1:-1;65109:393:0;;;;;:::i;:::-;;:::i;41433:27::-;;;;;;;;;;;;;;;;42146:1929;;;;;;;;;;;;;:::i;51618:239::-;;;;;;;;;;-1:-1:-1;51618:239:0;;;;;:::i;:::-;;:::i;47440:120::-;;;;;;;;;;-1:-1:-1;47440:120:0;;;;;:::i;:::-;-1:-1:-1;;;;;47532:20:0;47508:4;47532:20;;;:11;:20;;;;;;;;;47440:120;14717:87;;;;;;;;;;-1:-1:-1;14790:6:0;;-1:-1:-1;;;;;14790:6:0;14717:87;;50791:203;;;;;;;;;;-1:-1:-1;50791:203:0;;;;;:::i;:::-;;:::i;41467:29::-;;;;;;;;;;;;;;;;54018:162;;;;;;;;;;;;;:::i;45383:96::-;;;;;;;;;;;;;:::i;54188:556::-;;;;;;;;;;;;;:::i;:::-;;;;13332:25:1;;;13388:2;13373:18;;13366:34;;;;13305:18;54188:556:0;13158:248:1;47154:278:0;;;;;;;;;;-1:-1:-1;47154:278:0;;;;;:::i;:::-;;:::i;41103:29::-;;;;;;;;;;;;;;;;46103:167;;;;;;;;;;-1:-1:-1;46103:167:0;;;;;:::i;:::-;;:::i;40836:36::-;;;;;;;;;;;;;;;;40356:22;;;;;;;;;;;;;;;;64740:361;;;;;;;;;;-1:-1:-1;64740:361:0;;;;;:::i;:::-;;:::i;64183:169::-;;;;;;;;;;-1:-1:-1;64183:169:0;;;;;:::i;:::-;;:::i;40536:23::-;;;;;;;;;;;;;;;;51865:240;;;;;;;;;;-1:-1:-1;51865:240:0;;;;;:::i;:::-;;:::i;41227:34::-;;;;;;;;;;;;;;;;51002:173;;;;;;;;;;-1:-1:-1;51002:173:0;;;;;:::i;:::-;;:::i;64360:372::-;;;;;;;;;;-1:-1:-1;64360:372:0;;;;;:::i;:::-;;:::i;31168:250::-;;;;;;;;;;-1:-1:-1;31168:250:0;;;;;:::i;:::-;;:::i;40308:41::-;;;;;;;;;;-1:-1:-1;40308:41:0;-1:-1:-1;;40308:41:0;;51183:229;;;;;;;;;;-1:-1:-1;51183:229:0;;;;;:::i;:::-;;:::i;46278:143::-;;;;;;;;;;-1:-1:-1;46278:143:0;;;;;:::i;:::-;-1:-1:-1;;;;;46386:18:0;;;46359:7;46386:18;;;:11;:18;;;;;;;;:27;;;;;;;;;;;;;46278:143;50478:110;;;;;;;;;;-1:-1:-1;50478:110:0;;;;;:::i;:::-;;:::i;51420:190::-;;;;;;;;;;-1:-1:-1;51420:190:0;;;;;:::i;:::-;;:::i;15626:201::-;;;;;;;;;;-1:-1:-1;15626:201:0;;;;;:::i;:::-;;:::i;40414:25::-;;;;;;;;;;;;;;;;50600:179;50684:24;;-1:-1:-1;;;;;50684:24:0;50670:10;:38;50662:68;;;;-1:-1:-1;;;50662:68:0;;;;;;;:::i;:::-;;;;;;;;;50745:7;:16;50600:179::o;45284:91::-;45330:13;45362:5;45355:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;45284:91;:::o;46429:161::-;46504:4;46521:39;13912:10;46544:7;46553:6;46521:8;:39::i;:::-;-1:-1:-1;46578:4:0;46429:161;;;;;:::o;46598:313::-;46696:4;46713:36;46723:6;46731:9;46742:6;46713:9;:36::i;:::-;46760:121;46769:6;13912:10;46791:89;46829:6;46791:89;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;46791:19:0;;;;;;:11;:19;;;;;;;;13912:10;46791:33;;;;;;;;;;:37;:89::i;:::-;46760:8;:121::i;:::-;-1:-1:-1;46899:4:0;46598:313;;;;;:::o;48492:255::-;48558:7;48597;;48586;:18;;48578:73;;;;-1:-1:-1;;;48578:73:0;;5559:2:1;48578:73:0;;;5541:21:1;5598:2;5578:18;;;5571:30;5637:34;5617:18;;;5610:62;-1:-1:-1;;;5688:18:1;;;5681:40;5738:19;;48578:73:0;5357:406:1;48578:73:0;48662:19;48685:10;:8;:10::i;:::-;48662:33;-1:-1:-1;48714:24:0;:7;48662:33;48714:11;:24::i;:::-;48706:33;48492:255;-1:-1:-1;;;48492:255:0:o;49210:479::-;14790:6;;-1:-1:-1;;;;;14790:6:0;13912:10;14937:23;14929:68;;;;-1:-1:-1;;;14929:68:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;49292:20:0;::::1;;::::0;;;:11:::1;:20;::::0;;;;;::::1;;49284:60;;;::::0;-1:-1:-1;;;49284:60:0;;7136:2:1;49284:60:0::1;::::0;::::1;7118:21:1::0;7175:2;7155:18;;;7148:30;7214:29;7194:18;;;7187:57;7261:18;;49284:60:0::1;6934:351:1::0;49284:60:0::1;49360:9;49355:327;49379:9;:16:::0;49375:20;::::1;49355:327;;;49437:7;-1:-1:-1::0;;;;;49421:23:0::1;:9;49431:1;49421:12;;;;;;;;:::i;:::-;;::::0;;;::::1;::::0;;;::::1;::::0;-1:-1:-1;;;;;49421:12:0::1;:23;49417:254;;;49480:9;49490:16:::0;;:20:::1;::::0;49509:1:::1;::::0;49490:20:::1;:::i;:::-;49480:31;;;;;;;;:::i;:::-;;::::0;;;::::1;::::0;;;::::1;::::0;49465:9:::1;:12:::0;;-1:-1:-1;;;;;49480:31:0;;::::1;::::0;49475:1;;49465:12;::::1;;;;;:::i;:::-;;::::0;;;::::1;::::0;;;;;;::::1;:46:::0;;-1:-1:-1;;;;;;49465:46:0::1;-1:-1:-1::0;;;;;49465:46:0;;::::1;;::::0;;49530:16;;::::1;::::0;;:7:::1;:16:::0;;;;;;:20;;;49569:11:::1;:20:::0;;;;:28;;-1:-1:-1;;49569:28:0::1;::::0;;49616:9:::1;:15:::0;;;::::1;;;;:::i;:::-;;::::0;;;::::1;::::0;;;;-1:-1:-1;;49616:15:0;;;;;-1:-1:-1;;;;;;49616:15:0::1;::::0;;;;;49355:327:::1;49210:479:::0;:::o;49417:254::-:1;49397:3:::0;::::1;::::0;::::1;:::i;:::-;;;;49355:327;;;;49210:479:::0;:::o;31424:241::-;14790:6;;-1:-1:-1;;;;;14790:6:0;13912:10;14937:23;14929:68;;;;-1:-1:-1;;;14929:68:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;31559:22:0;::::1;31543:13;31559:22:::0;;;:9:::1;:22;::::0;;;;;;31588:30:::1;::::0;31569:11;;31588:14:::1;:30::i;:::-;31625:34;31640:11;31653:5;31625:14;:34::i;:::-;31536:129;31424:241:::0;;:::o;46919:227::-;13912:10;47016:4;47065:25;;;:11;:25;;;;;;;;-1:-1:-1;;;;;47065:34:0;;;;;;;;;;47016:4;;47033:83;;47056:7;;47065:50;;47104:10;47065:38;:50::i;47663:377::-;13912:10;47715:14;47764:19;;;:11;:19;;;;;;;;47763:20;47755:77;;;;-1:-1:-1;;;47755:77:0;;11423:2:1;47755:77:0;;;11405:21:1;11462:2;11442:18;;;11435:30;11501:34;11481:18;;;11474:62;-1:-1:-1;;;11552:18:1;;;11545:42;11604:19;;47755:77:0;11221:408:1;47755:77:0;47844:15;47868:19;47879:7;47868:10;:19::i;:::-;-1:-1:-1;;;;;;;;;47916:15:0;;;;;;:7;:15;;;;;;47843:44;;-1:-1:-1;47916:28:0;;:15;-1:-1:-1;47843:44:0;47916:19;:28::i;:::-;-1:-1:-1;;;;;47898:15:0;;;;;;:7;:15;;;;;:46;47965:7;;:20;;47977:7;47965:11;:20::i;:::-;47955:7;:30;48009:10;;:23;;48024:7;48009:14;:23::i;:::-;47996:10;:36;-1:-1:-1;;;47663:377:0:o;50355:111::-;14790:6;;-1:-1:-1;;;;;14790:6:0;13912:10;14937:23;14929:68;;;;-1:-1:-1;;;14929:68:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;50424:27:0::1;;::::0;;;:18:::1;:27;::::0;;;;:34;;-1:-1:-1;;50424:34:0::1;50454:4;50424:34;::::0;;50355:111::o;48048:436::-;48138:7;48177;;48166;:18;;48158:62;;;;-1:-1:-1;;;48158:62:0;;7906:2:1;48158:62:0;;;7888:21:1;7945:2;7925:18;;;7918:30;7984:33;7964:18;;;7957:61;8035:18;;48158:62:0;7704:355:1;48158:62:0;48236:17;48231:246;;48271:15;48295:19;48306:7;48295:10;:19::i;:::-;-1:-1:-1;48270:44:0;;-1:-1:-1;48329:14:0;;-1:-1:-1;;;;;48329:14:0;48231:246;48378:23;48409:19;48420:7;48409:10;:19::i;:::-;-1:-1:-1;48376:52:0;;-1:-1:-1;48443:22:0;;-1:-1:-1;;;;;48443:22:0;45896:199;-1:-1:-1;;;;;45987:20:0;;45963:7;45987:20;;;:11;:20;;;;;;;;45983:49;;;-1:-1:-1;;;;;;46016:16:0;;;;;:7;:16;;;;;;;45896:199::o;45983:49::-;-1:-1:-1;;;;;46070:16:0;;;;;;:7;:16;;;;;;46050:37;;:19;:37::i;40270:26::-;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;40270:26:0;;-1:-1:-1;40270:26:0;:::o;48755:447::-;14790:6;;-1:-1:-1;;;;;14790:6:0;13912:10;14937:23;14929:68;;;;-1:-1:-1;;;14929:68:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;48952:20:0;::::1;;::::0;;;:11:::1;:20;::::0;;;;;::::1;;48951:21;48943:61;;;::::0;-1:-1:-1;;;48943:61:0;;7136:2:1;48943:61:0::1;::::0;::::1;7118:21:1::0;7175:2;7155:18;;;7148:30;7214:29;7194:18;;;7187:57;7261:18;;48943:61:0::1;6934:351:1::0;48943:61:0::1;-1:-1:-1::0;;;;;49018:16:0;::::1;49037:1;49018:16:::0;;;:7:::1;:16;::::0;;;;;:20;49015:108:::1;;-1:-1:-1::0;;;;;49094:16:0;::::1;;::::0;;;:7:::1;:16;::::0;;;;;49074:37:::1;::::0;:19:::1;:37::i;:::-;-1:-1:-1::0;;;;;49055:16:0;::::1;;::::0;;;:7:::1;:16;::::0;;;;:56;49015:108:::1;-1:-1:-1::0;;;;;49133:20:0::1;;::::0;;;:11:::1;:20;::::0;;;;:27;;-1:-1:-1;;49133:27:0::1;49156:4;49133:27:::0;;::::1;::::0;;;49171:9:::1;:23:::0;;;;::::1;::::0;;;;;;::::1;::::0;;-1:-1:-1;;;;;;49171:23:0::1;::::0;;::::1;::::0;;48755:447::o;15368:103::-;14790:6;;-1:-1:-1;;;;;14790:6:0;13912:10;14937:23;14929:68;;;;-1:-1:-1;;;14929:68:0;;;;;;;:::i;:::-;15433:30:::1;15460:1;15433:18;:30::i;:::-;15368:103::o:0;65109:393::-;65205:42;65191:10;:56;65183:97;;;;-1:-1:-1;;;65183:97:0;;11836:2:1;65183:97:0;;;11818:21:1;11875:2;11855:18;;;11848:30;11914;11894:18;;;11887:58;11962:18;;65183:97:0;11634:352:1;65183:97:0;65295:15;65313:26;65331:7;65313:17;:26::i;:::-;-1:-1:-1;;;;;65374:17:0;;;;;;:7;:17;;;;;;65295:44;;-1:-1:-1;65374:30:0;;65295:44;65374:21;:30::i;:::-;-1:-1:-1;;;;;65354:17:0;;;;;;:7;:17;;;;;:50;65429:7;;:20;;65441:7;65429:11;:20::i;:::-;65419:7;:30;65474:7;;:20;;65486:7;65474:11;:20::i;:::-;65464:7;:30;-1:-1:-1;;;65109:393:0:o;42146:1929::-;12766:13;;;;;;;:48;;12802:12;;;;12801:13;12766:48;;;13569:4;1296:20;1344:8;12782:16;12758:107;;;;-1:-1:-1;;;12758:107:0;;;;;;;:::i;:::-;12878:19;12901:13;;;;;;12900:14;12925:101;;;;12960:13;:20;;-1:-1:-1;;12995:19:0;;;;;12925:101;42207:19:::1;42197:7;:29:::0;;;42272:13:::1;::::0;-1:-1:-1;;42272:13:0::1;:::i;:::-;42265:21;::::0;-1:-1:-1;;42265:21:0::1;:::i;:::-;42254:7;:33:::0;42300:16:::1;::::0;;;;::::1;::::0;;;::::1;::::0;;;-1:-1:-1;;;42300:16:0::1;::::0;;::::1;::::0;;;::::1;::::0;:5:::1;::::0;:16:::1;:::i;:::-;-1:-1:-1::0;42327:18:0::1;::::0;;;;::::1;::::0;;;::::1;::::0;;;-1:-1:-1;;;42327:18:0::1;::::0;;::::1;::::0;;;::::1;::::0;:7:::1;::::0;:18:::1;:::i;:::-;-1:-1:-1::0;42356:9:0::1;:14:::0;;-1:-1:-1;;42356:14:0::1;42368:2;42356:14;::::0;;42394:1:::1;42383:8;:12:::0;;;42406:16:::1;:27:::0;42454:1:::1;42444:7;:11:::0;;;42466:15:::1;:25:::0;42356:14;42512:13:::1;:17:::0;;;42540:21:::1;:37:::0;42605:2:::1;42590:12;:17:::0;42640:3:::1;42618:19;:25:::0;42678:3:::1;42654:21;:27:::0;42712:3:::1;42692:17;:23:::0;42728:17:::1;:62:::0;;-1:-1:-1;;;;;;42728:62:0;;::::1;42748:42;42728:62;::::0;;;42801:24:::1;:69:::0;;;::::1;42828:42;42801:69;::::0;;42881:26:::1;:71:::0;;;::::1;42910:42;42881:71;::::0;;42963:22:::1;:67:::0;;;;::::1;42988:42;42963:67;::::0;;43043:21:::1;:28:::0;;-1:-1:-1;;;;43043:28:0::1;-1:-1:-1::0;;;43043:28:0::1;::::0;;43107:17:::1;43092:12;:32:::0;43153:17:::1;43136:14;:34:::0;43214:16:::1;43182:29;:48:::0;43246:17:::1;:24:::0;;-1:-1:-1;;;;43246:24:0::1;-1:-1:-1::0;;;43246:24:0::1;::::0;;43294:5:::1;43281:28:::0;;::::1;::::0;43294:5;43281:28:::1;::::0;::::1;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;43301:7;43281:28;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:12;:28::i;:::-;43320:20;:18;:20::i;:::-;43375:7;::::0;13912:10;43351:21:::1;::::0;;;:7:::1;:21;::::0;;;;;;;;:31;;;;43393:5:::1;:20:::0;;-1:-1:-1;;;;;;43393:20:0::1;::::0;;::::1;::::0;;;43569:26;;-1:-1:-1;;;43569:26:0;;;;43481:42:::1;::::0;;;43569:24:::1;::::0;:26:::1;::::0;;::::1;::::0;43351:21;43569:26;;;;;43481:42;43569:26;::::1;;::::0;::::1;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1::0;;;;;43551:56:0::1;;43616:4;43623:16;-1:-1:-1::0;;;;;43623:21:0::1;;:23;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;43551:96;::::0;-1:-1:-1;;;;;;43551:96:0::1;::::0;;;;;;-1:-1:-1;;;;;3233:15:1;;;43551:96:0::1;::::0;::::1;3215:34:1::0;3285:15;;3265:18;;;3258:43;3150:18;;43551:96:0::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;43535:13;:112:::0;;-1:-1:-1;;;;;;43535:112:0;;::::1;-1:-1:-1::0;;;;;43535:112:0;;::::1;;::::0;;;43658:15:::1;:34:::0;;;;::::1;::::0;;::::1;;::::0;;14790:6;;;;-1:-1:-1;43703:27:0;;;:18:::1;:27;::::0;;;;;:34;;-1:-1:-1;;43703:34:0;;::::1;-1:-1:-1::0;43703:34:0;;::::1;::::0;;;43775:4:::1;43748:33:::0;;;;;:40;;;::::1;::::0;::::1;::::0;;43818:17:::1;::::0;;::::1;43799:37:::0;;;;;:44;;;::::1;::::0;::::1;::::0;;43873:24:::1;::::0;;::::1;43854:44:::0;;;;;:51;;;::::1;::::0;::::1;::::0;;43935:26:::1;::::0;;::::1;43916:46:::0;;;;;:53;;;::::1;::::0;::::1;::::0;;43999:22:::1;::::0;;;::::1;43980:42:::0;;;;:49;;;;::::1;;::::0;;44042:15:::1;:13;:15::i;:::-;42186:1889;13056:14:::0;13052:68;;;13103:5;13087:21;;-1:-1:-1;;13087:21:0;;;13052:68;12473:654;42146:1929::o;51618:239::-;51713:24;;-1:-1:-1;;;;;51713:24:0;51699:10;:38;51691:68;;;;-1:-1:-1;;;51691:68:0;;;;;;;:::i;:::-;51787:62;51833:5;51787:27;51799:14;51787:7;;:11;;:27;;;;:::i;:::-;:31;;:62::i;:::-;51770:14;:79;-1:-1:-1;51618:239:0:o;50791:203::-;50887:24;;-1:-1:-1;;;;;50887:24:0;50873:10;:38;50865:68;;;;-1:-1:-1;;;50865:68:0;;;;;;;:::i;:::-;50948:13;:28;50791:203::o;54018:162::-;54058:7;54079:15;54096;54115:19;:17;:19::i;:::-;54078:56;;-1:-1:-1;54078:56:0;-1:-1:-1;54152:20:0;54078:56;;54152:11;:20::i;:::-;54145:27;;;;54018:162;:::o;45383:96::-;45431:13;45464:7;45457:14;;;;;:::i;54188:556::-;54284:7;;54320;;54237;;;;;54344:285;54368:9;:16;54364:20;;54344:285;;;54430:7;54406;:21;54414:9;54424:1;54414:12;;;;;;;;:::i;:::-;;;;;;;;;;;;;-1:-1:-1;;;;;54414:12:0;54406:21;;;;;;;;;;;;;:31;;:66;;;54465:7;54441;:21;54449:9;54459:1;54449:12;;;;;;;;:::i;:::-;;;;;;;;;;;;;-1:-1:-1;;;;;54449:12:0;54441:21;;;;;;;;;;;;;:31;54406:66;54402:97;;;54482:7;;54491;;54474:25;;;;;;;54188:556;;:::o;54402:97::-;54524:34;54536:7;:21;54544:9;54554:1;54544:12;;;;;;;;:::i;:::-;;;;;;;;;;;;;-1:-1:-1;;;;;54544:12:0;54536:21;;;;;;;;;;;;;54524:7;;:11;:34::i;:::-;54514:44;;54583:34;54595:7;:21;54603:9;54613:1;54603:12;;;;;;;;:::i;:::-;;;;;;;;;;;;;-1:-1:-1;;;;;54603:12:0;54595:21;;;;;;;;;;;;;54583:7;;:11;:34::i;:::-;54573:44;-1:-1:-1;54386:3:0;;;;:::i;:::-;;;;54344:285;;;-1:-1:-1;54665:7:0;;54653;;:20;;:11;:20::i;:::-;54643:7;:30;54639:61;;;54683:7;;54692;;54675:25;;;;;;54188:556;;:::o;54639:61::-;54719:7;;54728;;-1:-1:-1;54188:556:0;-1:-1:-1;54188:556:0:o;47154:278::-;47256:4;47273:129;13912:10;47296:7;47305:96;47344:15;47305:96;;;;;;;;;;;;;;;;;13912:10;47305:25;;;;:11;:25;;;;;;;;-1:-1:-1;;;;;47305:34:0;;;;;;;;;;;;:38;:96::i;46103:167::-;46181:4;46198:42;13912:10;46222:9;46233:6;46198:9;:42::i;64740:361::-;64833:24;;-1:-1:-1;;;;;64833:24:0;64819:10;:38;64811:68;;;;-1:-1:-1;;;64811:68:0;;;;;;;:::i;64183:169::-;64247:7;64267:19;64290:10;:8;:10::i;:::-;64267:33;-1:-1:-1;64319:24:0;:7;64267:33;64319:11;:24::i;51865:240::-;51954:24;;-1:-1:-1;;;;;51954:24:0;51940:10;:38;51932:68;;;;-1:-1:-1;;;51932:68:0;;;;;;;:::i;:::-;52011:21;:32;;;;;-1:-1:-1;;;52011:32:0;-1:-1:-1;;;;52011:32:0;;;;;;52059:38;;;;;;52035:8;4089:14:1;4082:22;4064:41;;4052:2;4037:18;;3924:187;52059:38:0;;;;;;;;51865:240;:::o;51002:173::-;51088:24;;-1:-1:-1;;;;;51088:24:0;51074:10;:38;51066:68;;;;-1:-1:-1;;;51066:68:0;;;;;;;:::i;:::-;51149:8;:18;51002:173::o;64360:372::-;64454:24;;-1:-1:-1;;;;;64454:24:0;64440:10;:38;64432:68;;;;-1:-1:-1;;;64432:68:0;;;;;;;:::i;:::-;64515:15;64533:26;64551:7;64533:17;:26::i;:::-;-1:-1:-1;;;;;64594:17:0;;;;;;:7;:17;;;;;;64515:44;;-1:-1:-1;64594:30:0;;64515:44;64594:21;:30::i;:::-;-1:-1:-1;;;;;64574:17:0;;;;;;:7;:17;;;;;:50;64649:7;;:20;;64661:7;64649:11;:20::i;:::-;64639:7;:30;64694:7;;:20;;64706:7;64694:11;:20::i;31168:250::-;14790:6;;-1:-1:-1;;;;;14790:6:0;13912:10;14937:23;14929:68;;;;-1:-1:-1;;;14929:68:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;31291:22:0;::::1;31275:101;;;::::0;-1:-1:-1;;;31275:101:0;;7492:2:1;31275:101:0::1;::::0;::::1;7474:21:1::0;7531:2;7511:18;;;7504:30;7570:34;7550:18;;;7543:62;-1:-1:-1;;;7621:18:1;;;7614:43;7674:19;;31275:101:0::1;7290:409:1::0;31275:101:0::1;31383:29;31396:8;31406:5;31383:12;:29::i;51183:229::-:0;51272:24;;-1:-1:-1;;;;;51272:24:0;51258:10;:38;51250:68;;;;-1:-1:-1;;;51250:68:0;;;;;;;:::i;:::-;51344:60;51388:5;51344:25;51356:12;51344:7;;:11;;:25;;;;:::i;:60::-;51329:12;:75;-1:-1:-1;51183:229:0:o;50478:110::-;14790:6;;-1:-1:-1;;;;;14790:6:0;13912:10;14937:23;14929:68;;;;-1:-1:-1;;;14929:68:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;50545:27:0::1;50575:5;50545:27:::0;;;:18:::1;:27;::::0;;;;:35;;-1:-1:-1;;50545:35:0::1;::::0;;50478:110::o;51420:190::-;51508:24;;-1:-1:-1;;;;;51508:24:0;51494:10;:38;51486:68;;;;-1:-1:-1;;;51486:68:0;;;;;;;:::i;:::-;51580:22;:11;51594:8;51580:22;:::i;15626:201::-;14790:6;;-1:-1:-1;;;;;14790:6:0;13912:10;14937:23;14929:68;;;;-1:-1:-1;;;14929:68:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;15715:22:0;::::1;15707:73;;;::::0;-1:-1:-1;;;15707:73:0;;5970:2:1;15707:73:0::1;::::0;::::1;5952:21:1::0;6009:2;5989:18;;;5982:30;6048:34;6028:18;;;6021:62;-1:-1:-1;;;6099:18:1;;;6092:36;6145:19;;15707:73:0::1;5768:402:1::0;15707:73:0::1;15791:28;15810:8;15791:18;:28::i;56273:347::-:0;-1:-1:-1;;;;;56376:19:0;;56368:68;;;;-1:-1:-1;;;56368:68:0;;10606:2:1;56368:68:0;;;10588:21:1;10645:2;10625:18;;;10618:30;10684:34;10664:18;;;10657:62;-1:-1:-1;;;10735:18:1;;;10728:34;10779:19;;56368:68:0;10404:400:1;56368:68:0;-1:-1:-1;;;;;56455:21:0;;56447:68;;;;-1:-1:-1;;;56447:68:0;;6377:2:1;56447:68:0;;;6359:21:1;6416:2;6396:18;;;6389:30;6455:34;6435:18;;;6428:62;-1:-1:-1;;;6506:18:1;;;6499:32;6548:19;;56447:68:0;6175:398:1;56447:68:0;-1:-1:-1;;;;;56528:18:0;;;;;;;:11;:18;;;;;;;;:27;;;;;;;;;;;;;:36;;;56580:32;;12137:25:1;;;56580:32:0;;12110:18:1;56580:32:0;;;;;;;56273:347;;;:::o;56628:1771::-;-1:-1:-1;;;;;56764:18:0;;56756:68;;;;-1:-1:-1;;;56756:68:0;;10200:2:1;56756:68:0;;;10182:21:1;10239:2;10219:18;;;10212:30;10278:34;10258:18;;;10251:62;-1:-1:-1;;;10329:18:1;;;10322:35;10374:19;;56756:68:0;9998:401:1;56756:68:0;-1:-1:-1;;;;;56843:16:0;;56835:64;;;;-1:-1:-1;;;56835:64:0;;5155:2:1;56835:64:0;;;5137:21:1;5194:2;5174:18;;;5167:30;5233:34;5213:18;;;5206:62;-1:-1:-1;;;5284:18:1;;;5277:33;5327:19;;56835:64:0;4953:399:1;56835:64:0;56927:1;56918:6;:10;56910:64;;;;-1:-1:-1;;;56910:64:0;;9444:2:1;56910:64:0;;;9426:21:1;9483:2;9463:18;;;9456:30;9522:34;9502:18;;;9495:62;-1:-1:-1;;;9573:18:1;;;9566:39;9622:19;;56910:64:0;9242:405:1;56910:64:0;57269:28;57300:24;57318:4;57300:9;:24::i;:::-;57269:55;;57372:12;;57348:20;:36;57345:112;;-1:-1:-1;57433:12:0;;57345:112;57528:29;;57504:53;;;;;;;57586;;-1:-1:-1;57623:16:0;;-1:-1:-1;;;57623:16:0;;;;57622:17;57586:53;:91;;;;-1:-1:-1;57664:13:0;;-1:-1:-1;;;;;57656:21:0;;;57664:13;;57656:21;;57586:91;:129;;;;-1:-1:-1;57694:21:0;;-1:-1:-1;;;57694:21:0;;;;57586:129;57568:318;;;57765:29;;57742:52;;57838:36;57853:20;57838:14;:36::i;:::-;-1:-1:-1;;;;;58094:24:0;;57967:12;58094:24;;;:18;:24;;;;;;57982:4;;58094:24;;;:50;;-1:-1:-1;;;;;;58122:22:0;;;;;;:18;:22;;;;;;;;58094:50;58091:96;;;-1:-1:-1;58170:5:0;58091:96;58210:13;;-1:-1:-1;;;;;58202:21:0;;;58210:13;;58202:21;58199:68;;;-1:-1:-1;58250:5:0;58199:68;58353:38;58368:4;58373:2;58376:6;58383:7;58353:14;:38::i;:::-;56745:1654;;;56628:1771;;;:::o;8504:192::-;8590:7;8626:12;8618:6;;;;8610:29;;;;-1:-1:-1;;;8610:29:0;;;;;;;;:::i;:::-;-1:-1:-1;8650:9:0;8662:5;8666:1;8662;:5;:::i;:::-;8650:17;8504:192;-1:-1:-1;;;;;8504:192:0:o;9902:132::-;9960:7;9987:39;9991:1;9994;9987:39;;;;;;;;;;;;;;;;;:3;:39::i;7601:181::-;7659:7;;7691:5;7695:1;7691;:5;:::i;:::-;7679:17;;7720:1;7715;:6;;7707:46;;;;-1:-1:-1;;;7707:46:0;;6780:2:1;7707:46:0;;;6762:21:1;6819:2;6799:18;;;6792:30;6858:29;6838:18;;;6831:57;6905:18;;7707:46:0;6578:351:1;52366:419:0;52425:7;52434;52443;52452;52461;52470;52491:23;52516:12;52530:18;52552:20;52564:7;52552:11;:20::i;:::-;52490:82;;;;;;52584:15;52601:23;52626:12;52642:50;52654:7;52663:4;52669:10;52681;:8;:10::i;:::-;52642:11;:50::i;:::-;52583:109;;;;-1:-1:-1;52583:109:0;;-1:-1:-1;52743:15:0;;-1:-1:-1;52760:4:0;;-1:-1:-1;52766:10:0;;-1:-1:-1;52366:419:0;;-1:-1:-1;;;;;52366:419:0:o;8065:136::-;8123:7;8150:43;8154:1;8157;8150:43;;;;;;;;;;;;;;;;;:3;:43::i;15987:191::-;16080:6;;;-1:-1:-1;;;;;16097:17:0;;;-1:-1:-1;;;;;;16097:17:0;;;;;;;16130:40;;16080:6;;;16097:17;16080:6;;16130:40;;16061:16;;16130:40;16050:128;15987:191;:::o;20000:186::-;13369:13;;;;;;;13361:69;;;;-1:-1:-1;;;13361:69:0;;;;;;;:::i;:::-;20103:26:::1;:24;:26::i;:::-;20140:38;20163:5;20170:7;20140:22;:38::i;30604:80::-:0;12766:13;;;;;;;:48;;12802:12;;;;12801:13;12766:48;;;13569:4;1296:20;1344:8;12782:16;12758:107;;;;-1:-1:-1;;;12758:107:0;;;;;;;:::i;:::-;12878:19;12901:13;;;;;;12900:14;12925:101;;;;12960:13;:20;;-1:-1:-1;;12995:19:0;;;;;12925:101;30662:16:::1;:14;:16::i;:::-;13056:14:::0;13052:68;;;13103:5;13087:21;;-1:-1:-1;;13087:21:0;;;12473:654;30604:80::o;44088:691::-;44180:12;;44159:5;;44149:44;;44180:12;44149:26;;44170:4;;44149:16;;-1:-1:-1;;;;;44159:5:0;44149:9;:16::i;:26::-;:30;;:44::i;:::-;44132:14;:61;44259:19;;44238:5;;44228:51;;44259:19;44228:26;;44249:4;;44228:16;;-1:-1:-1;;;;;44238:5:0;44228:9;:16::i;:51::-;44204:21;:75;44347:21;;44326:5;;44316:53;;44347:21;44316:26;;44337:4;;44316:16;;-1:-1:-1;;;;;44326:5:0;44316:9;:16::i;:53::-;44290:23;:79;44433:17;;44412:5;;44402:49;;44433:17;44402:26;;44423:4;;44402:16;;-1:-1:-1;;;;;44412:5:0;44402:9;:16::i;:49::-;44380:19;:71;44481:5;;44488:17;;44507:14;;44464:58;;-1:-1:-1;;;;;44481:5:0;;;;44488:17;;44464:16;:58::i;:::-;44550:5;;44557:24;;44583:21;;44533:72;;-1:-1:-1;;;;;44550:5:0;;;;44557:24;;44533:16;:72::i;:::-;44633:5;;44640:26;;44668:23;;44616:76;;-1:-1:-1;;;;;44633:5:0;;;;44640:26;;44616:16;:76::i;:::-;44720:5;;44727:22;;44751:19;;44703:68;;-1:-1:-1;;;;;44720:5:0;;;;44727:22;;44703:16;:68::i;8955:471::-;9013:7;9258:6;9254:47;;-1:-1:-1;9288:1:0;9281:8;;9254:47;9313:9;9325:5;9329:1;9325;:5;:::i;:::-;9313:17;-1:-1:-1;9358:1:0;9349:5;9353:1;9313:17;9349:5;:::i;:::-;:10;9341:56;;;;-1:-1:-1;;;9341:56:0;;8681:2:1;9341:56:0;;;8663:21:1;8720:2;8700:18;;;8693:30;8759:34;8739:18;;;8732:62;-1:-1:-1;;;8810:18:1;;;8803:31;8851:19;;9341:56:0;8479:397:1;30982:147:0;-1:-1:-1;;;;;31052:19:0;;;;;;:9;:19;;;;;;:27;;;31091:32;31074:5;;31052:19;31091:32;;;30982:147;;:::o;58407:998::-;41877:16;:23;;-1:-1:-1;;;;41877:23:0;-1:-1:-1;;;41877:23:0;;;;58516:27:::1;:20:::0;58541:1:::1;58516:24;:27::i;:::-;58492:51:::0;-1:-1:-1;58554:26:0::1;58583:39;:20:::0;58492:51;58583:24:::1;:39::i;:::-;58554:68:::0;-1:-1:-1;58925:21:0::1;58991:31;59008:13:::0;58991:16:::1;:31::i;:::-;59154:18;59175:41;:21;59201:14:::0;59175:25:::1;:41::i;:::-;59154:62;;59266:44;59279:18;59299:10;59266:12;:44::i;:::-;59336:61;::::0;;13613:25:1;;;13669:2;13654:18;;13647:34;;;13697:18;;;13690:34;;;59336:61:0::1;::::0;13601:2:1;13586:18;59336:61:0::1;;;;;;;-1:-1:-1::0;;41923:16:0;:24;;-1:-1:-1;;;;41923:24:0;;;-1:-1:-1;;;58407:998:0:o;60604:1477::-;60715:7;60711:40;;60737:14;:12;:14::i;:::-;60764:18;60902:7;14790:6;;-1:-1:-1;;;;;14790:6:0;;14717:87;60902:7;-1:-1:-1;;;;;60892:17:0;:6;-1:-1:-1;;;;;60892:17:0;;;:41;;;;-1:-1:-1;14790:6:0;;-1:-1:-1;;;;;60913:20:0;;;14790:6;;60913:20;;60892:41;:67;;;;-1:-1:-1;;;;;;60937:22:0;;60954:4;60937:22;;60892:67;60889:145;;;60998:24;61015:6;60998:16;:24::i;:::-;60985:37;;60889:145;-1:-1:-1;;;;;61058:19:0;;;;;;:11;:19;;;;;;;;:46;;;;-1:-1:-1;;;;;;61082:22:0;;;;;;:11;:22;;;;;;;;61081:23;61058:46;61054:677;;;61121:64;61143:6;61151:9;61162:22;:6;61173:10;61162;:22::i;:::-;61121:21;:64::i;:::-;61054:677;;;-1:-1:-1;;;;;61208:19:0;;;;;;:11;:19;;;;;;;;61207:20;:46;;;;-1:-1:-1;;;;;;61231:22:0;;;;;;:11;:22;;;;;;;;61207:46;61203:528;;;61270:62;61290:6;61298:9;61309:22;:6;61320:10;61309;:22::i;:::-;61270:19;:62::i;61203:528::-;-1:-1:-1;;;;;61355:19:0;;;;;;:11;:19;;;;;;;;61354:20;:47;;;;-1:-1:-1;;;;;;61379:22:0;;;;;;:11;:22;;;;;;;;61378:23;61354:47;61350:381;;;61418:60;61436:6;61444:9;61455:22;:6;61466:10;61455;:22::i;:::-;61418:17;:60::i;61350:381::-;-1:-1:-1;;;;;61500:19:0;;;;;;:11;:19;;;;;;;;:45;;;;-1:-1:-1;;;;;;61523:22:0;;;;;;:11;:22;;;;;;;;61500:45;61496:235;;;61562:64;61584:6;61592:9;61603:22;:6;61614:10;61603;:22::i;:::-;61562:21;:64::i;61496:235::-;61659:60;61677:6;61685:9;61696:22;:6;61707:10;61696;:22::i;61659:60::-;61820:14;:12;:14::i;:::-;61850;;61847:95;;61881:49;61899:6;61915:1;61919:10;61881:17;:49::i;:::-;61996:15;56021;;56011:7;:25;56063:21;;56047:13;:37;56106:16;;56095:8;:27;55967:163;61996:15;62036:7;62032:41;;62058:15;56021;;56011:7;:25;56063:21;;56047:13;:37;56106:16;;56095:8;:27;55967:163;62058:15;60700:1381;60604:1477;;;;:::o;10530:278::-;10616:7;10651:12;10644:5;10636:28;;;;-1:-1:-1;;;10636:28:0;;;;;;;;:::i;:::-;-1:-1:-1;10675:9:0;10687:5;10691:1;10687;:5;:::i;52793:330::-;52853:7;52862;52871;52891:12;52906:24;52922:7;52906:15;:24::i;:::-;52891:39;;52941:18;52962:30;52984:7;52962:21;:30::i;:::-;52941:51;-1:-1:-1;53003:23:0;53029:33;52941:51;53029:17;:7;53041:4;53029:11;:17::i;:::-;:21;;:33::i;:::-;53003:59;53098:4;;-1:-1:-1;53104:10:0;;-1:-1:-1;52793:330:0;;-1:-1:-1;;;52793:330:0:o;53131:429::-;53246:7;;;;53302:24;:7;53314:11;53302;:24::i;:::-;53284:42;-1:-1:-1;53337:12:0;53352:21;:4;53361:11;53352:8;:21::i;:::-;53337:36;-1:-1:-1;53384:18:0;53405:27;:10;53420:11;53405:14;:27::i;:::-;53384:48;-1:-1:-1;53443:23:0;53469:33;53384:48;53469:17;:7;53481:4;53469:11;:17::i;:33::-;53521:7;;;;-1:-1:-1;53547:4:0;;-1:-1:-1;53131:429:0;;-1:-1:-1;;;;;;;53131:429:0:o;13756:70::-;13369:13;;;;;;;13361:69;;;;-1:-1:-1;;;13361:69:0;;;;;;;:::i;20194:162::-;13369:13;;;;;;;13361:69;;;;-1:-1:-1;;;13361:69:0;;;;;;;:::i;:::-;20307:13;;::::1;::::0;:5:::1;::::0;:13:::1;::::0;::::1;::::0;::::1;:::i;:::-;-1:-1:-1::0;20331:17:0;;::::1;::::0;:7:::1;::::0;:17:::1;::::0;::::1;::::0;::::1;:::i;14381:134::-:0;13369:13;;;;;;;13361:69;;;;-1:-1:-1;;;13361:69:0;;;;;;;:::i;:::-;14444:26:::1;:24;:26::i;:::-;14481;:24;:26::i;44972:304::-:0;45070:15;45087:23;45114:26;45132:7;45114:17;:26::i;:::-;-1:-1:-1;;;;;45169:15:0;;;;;;:7;:15;;;;;;45069:71;;-1:-1:-1;45069:71:0;-1:-1:-1;45169:28:0;;45069:71;45169:19;:28::i;:::-;-1:-1:-1;;;;;45151:15:0;;;;;;;:7;:15;;;;;;:46;;;;45229:18;;;;;;;:39;;45252:15;45229:22;:39::i;:::-;-1:-1:-1;;;;;45208:18:0;;;;;;;:7;:18;;;;;:60;;;;-1:-1:-1;;;;44972:304:0:o;59413:589::-;59563:16;;;59577:1;59563:16;;;;;;;;59539:21;;59563:16;;;;;;;;;;-1:-1:-1;59563:16:0;59539:40;;59608:4;59590;59595:1;59590:7;;;;;;;;:::i;:::-;-1:-1:-1;;;;;59590:23:0;;;:7;;;;;;;;;;:23;;;;59634:15;;:22;;;-1:-1:-1;;;59634:22:0;;;;:15;;;;;:20;;:22;;;;;59590:7;;59634:22;;;;;:15;:22;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;59624:4;59629:1;59624:7;;;;;;;;:::i;:::-;-1:-1:-1;;;;;59624:32:0;;;:7;;;;;;;;;:32;59701:15;;59669:62;;59686:4;;59701:15;59719:11;59669:8;:62::i;:::-;59770:15;;:224;;-1:-1:-1;;;59770:224:0;;-1:-1:-1;;;;;59770:15:0;;;;:66;;:224;;59851:11;;59770:15;;59921:4;;59948;;59968:15;;59770:224;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;60010:513;60190:15;;60158:62;;60175:4;;-1:-1:-1;;;;;60190:15:0;60208:11;60158:8;:62::i;:::-;60263:15;;-1:-1:-1;;;;;60263:15:0;:31;60302:9;60335:4;60355:11;60263:15;;60467:7;14790:6;;-1:-1:-1;;;;;14790:6:0;;14717:87;60467:7;60263:252;;;;;;-1:-1:-1;;;;;;60263:252:0;;;-1:-1:-1;;;;;3671:15:1;;;60263:252:0;;;3653:34:1;3703:18;;;3696:34;;;;3746:18;;;3739:34;;;;3789:18;;;3782:34;3853:15;;;3832:19;;;3825:44;60489:15:0;3885:19:1;;;3878:35;3587:19;;60263:252:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;55627:328::-;55673:7;;:12;:34;;;;-1:-1:-1;55689:13:0;;:18;55673:34;:51;;;;-1:-1:-1;55711:8:0;;:13;55673:51;55670:63;;;55627:328::o;55670:63::-;55771:7;;;55753:15;:25;55813:13;;;55789:21;:37;55856:8;;;55837:16;:27;-1:-1:-1;55885:11:0;;;;55907:17;;;;55935:12;55627:328::o;55285:156::-;55350:7;55377:56;55417:5;55377:21;55389:8;;55377:7;:11;;:21;;;;:::i;63609:566::-;63712:15;63729:23;63754:12;63768:23;63793:12;63807:18;63829:19;63840:7;63829:10;:19::i;:::-;-1:-1:-1;;;;;63877:15:0;;;;;;:7;:15;;;;;;63711:137;;-1:-1:-1;63711:137:0;;-1:-1:-1;63711:137:0;;-1:-1:-1;63711:137:0;-1:-1:-1;63711:137:0;-1:-1:-1;63711:137:0;-1:-1:-1;63877:28:0;;63897:7;63877:19;:28::i;:::-;-1:-1:-1;;;;;63859:15:0;;;;;;:7;:15;;;;;;;;:46;;;;63934:7;:15;;;;:28;;63954:7;63934:19;:28::i;:::-;-1:-1:-1;;;;;63916:15:0;;;;;;;:7;:15;;;;;;:46;;;;63994:18;;;;;;;:39;;64017:15;63994:22;:39::i;:::-;-1:-1:-1;;;;;63973:18:0;;;;;;:7;:18;;;;;:60;64047:26;64062:10;64047:14;:26::i;:::-;64084:23;64096:4;64102;64084:11;:23::i;:::-;64140:9;-1:-1:-1;;;;;64123:44:0;64132:6;-1:-1:-1;;;;;64123:44:0;;64151:15;64123:44;;;;12137:25:1;;12125:2;12110:18;;11991:177;64123:44:0;;;;;;;;63700:475;;;;;;63609:566;;;:::o;63015:586::-;63116:15;63133:23;63158:12;63172:23;63197:12;63211:18;63233:19;63244:7;63233:10;:19::i;:::-;-1:-1:-1;;;;;63281:15:0;;;;;;:7;:15;;;;;;63115:137;;-1:-1:-1;63115:137:0;;-1:-1:-1;63115:137:0;;-1:-1:-1;63115:137:0;-1:-1:-1;63115:137:0;-1:-1:-1;63115:137:0;-1:-1:-1;63281:28:0;;63115:137;63281:19;:28::i;:::-;-1:-1:-1;;;;;63263:15:0;;;;;;;:7;:15;;;;;;;;:46;;;;63341:18;;;;;:7;:18;;;;;:39;;63364:15;63341:22;:39::i;:::-;-1:-1:-1;;;;;63320:18:0;;;;;;:7;:18;;;;;;;;:60;;;;63412:7;:18;;;;:39;;63435:15;63412:22;:39::i;62089:918::-;62188:15;62205:23;62230:12;62244:23;62269:12;62283:18;62305:19;62316:7;62305:10;:19::i;:::-;62187:137;;;;;;;;;;;;62359:1;-1:-1:-1;;;;;62338:23:0;:9;-1:-1:-1;;;;;62338:23:0;;62335:595;;;-1:-1:-1;;;;;62396:15:0;;;;;;:7;:15;;;;;;:28;;62416:7;62396:19;:28::i;:::-;-1:-1:-1;;;;;62378:15:0;;;;;;;:7;:15;;;;;;:46;;;;62460:18;;;;;;;:39;;62483:15;62460:22;:39::i;:::-;-1:-1:-1;;;;;62439:18:0;;;;;;:7;:18;;;;;:60;62524:7;;:20;;62536:7;62524:11;:20::i;:::-;62514:7;:30;62569:7;;:28;;62581:15;62569:11;:28::i;:::-;62559:7;:38;62612:26;62627:10;62612:14;:26::i;:::-;62653:23;62665:4;62671;62653:11;:23::i;:::-;62335:595;;;-1:-1:-1;;;;;62736:15:0;;;;;;:7;:15;;;;;;:28;;62756:7;62736:19;:28::i;49701:642::-;49804:15;49821:23;49846:12;49860:23;49885:12;49899:18;49921:19;49932:7;49921:10;:19::i;:::-;-1:-1:-1;;;;;49969:15:0;;;;;;:7;:15;;;;;;49803:137;;-1:-1:-1;49803:137:0;;-1:-1:-1;49803:137:0;;-1:-1:-1;49803:137:0;-1:-1:-1;49803:137:0;-1:-1:-1;49803:137:0;-1:-1:-1;49969:28:0;;49989:7;49969:19;:28::i;:::-;-1:-1:-1;;;;;49951:15:0;;;;;;:7;:15;;;;;;;;:46;;;;50026:7;:15;;;;:28;;50046:7;50026:19;:28::i;55123:154::-;55187:7;55214:55;55253:5;55214:20;55226:7;;55214;:11;;:20;;;;:::i;55449:166::-;55519:7;55546:61;55591:5;55546:26;55558:13;;55546:7;:11;;:26;;;;:::i;14523:113::-;13369:13;;;;;;;13361:69;;;;-1:-1:-1;;;13361:69:0;;;;;;;:::i;:::-;14596:32:::1;13912:10:::0;14596:18:::1;:32::i;53568:231::-:0;53634:7;53643;53664:15;53681:23;53708:39;53727:7;53736:10;:8;:10::i;:::-;53708:18;:39::i;:::-;53663:84;;;;-1:-1:-1;53568:231:0;-1:-1:-1;;;;53568:231:0:o;54756:355::-;54819:19;54842:10;:8;:10::i;:::-;54819:33;-1:-1:-1;54863:18:0;54884:27;:10;54819:33;54884:14;:27::i;:::-;54963:4;54947:22;;;;:7;:22;;;;;;54863:48;;-1:-1:-1;54947:38:0;;54863:48;54947:26;:38::i;:::-;54938:4;54922:22;;;;:7;:22;;;;;;;;:63;;;;54999:11;:26;;;;;;54996:107;;;55081:4;55065:22;;;;:7;:22;;;;;;:38;;55092:10;55065:26;:38::i;:::-;55056:4;55040:22;;;;:7;:22;;;;;:63;54808:303;;54756:355;:::o;52211:147::-;52289:7;;:17;;52301:4;52289:11;:17::i;:::-;52279:7;:27;52330:10;;:20;;52345:4;52330:14;:20::i;:::-;52317:10;:33;-1:-1:-1;;52211:147:0:o;53807:203::-;53895:7;;;53942:24;:7;53954:11;53942;:24::i;:::-;53924:42;;;-1:-1:-1;53807:203:0;-1:-1:-1;;;;53807:203:0:o;-1:-1:-1:-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;14:160:1;79:20;;135:13;;128:21;118:32;;108:60;;164:1;161;154:12;108:60;14:160;;;:::o;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::-;1609:6;1617;1670:2;1658:9;1649:7;1645:23;1641:32;1638:52;;;1686:1;1683;1676:12;1638:52;1725:9;1712:23;1744:31;1769:5;1744:31;:::i;:::-;1794:5;1846:2;1831:18;;;;1818:32;;-1:-1:-1;;;1541:315:1:o;1861:180::-;1917:6;1970:2;1958:9;1949:7;1945:23;1941:32;1938:52;;;1986:1;1983;1976:12;1938:52;2009:26;2025:9;2009:26;:::i;2046:180::-;2105:6;2158:2;2146:9;2137:7;2133:23;2129:32;2126:52;;;2174:1;2171;2164:12;2126:52;-1:-1:-1;2197:23:1;;2046:180;-1:-1:-1;2046:180:1:o;2231:248::-;2296:6;2304;2357:2;2345:9;2336:7;2332:23;2328:32;2325:52;;;2373:1;2370;2363:12;2325:52;2409:9;2396:23;2386:33;;2438:35;2469:2;2458:9;2454:18;2438:35;:::i;:::-;2428:45;;2231:248;;;;;:::o;2484:306::-;2572:6;2580;2588;2641:2;2629:9;2620:7;2616:23;2612:32;2609:52;;;2657:1;2654;2647:12;2609:52;2686:9;2680:16;2670:26;;2736:2;2725:9;2721:18;2715:25;2705:35;;2780:2;2769:9;2765:18;2759:25;2749:35;;2484:306;;;;;:::o;4351:597::-;4463:4;4492:2;4521;4510:9;4503:21;4553:6;4547:13;4596:6;4591:2;4580:9;4576:18;4569:34;4621:1;4631:140;4645:6;4642:1;4639:13;4631:140;;;4740:14;;;4736:23;;4730:30;4706:17;;;4725:2;4702:26;4695:66;4660:10;;4631:140;;;4789:6;4786:1;4783:13;4780:91;;;4859:1;4854:2;4845:6;4834:9;4830:22;4826:31;4819:42;4780:91;-1:-1:-1;4932:2:1;4911:15;-1:-1:-1;;4907:29:1;4892:45;;;;4939:2;4888:54;;4351:597;-1:-1:-1;;;4351:597:1:o;8064:410::-;8266:2;8248:21;;;8305:2;8285:18;;;8278:30;8344:34;8339:2;8324:18;;8317:62;-1:-1:-1;;;8410:2:1;8395:18;;8388:44;8464:3;8449:19;;8064:410::o;8881:356::-;9083:2;9065:21;;;9102:18;;;9095:30;9161:34;9156:2;9141:18;;9134:62;9228:2;9213:18;;8881:356::o;9652:341::-;9854:2;9836:21;;;9893:2;9873:18;;;9866:30;-1:-1:-1;;;9927:2:1;9912:18;;9905:47;9984:2;9969:18;;9652:341::o;10809:407::-;11011:2;10993:21;;;11050:2;11030:18;;;11023:30;11089:34;11084:2;11069:18;;11062:62;-1:-1:-1;;;11155:2:1;11140:18;;11133:41;11206:3;11191:19;;10809:407::o;12173:980::-;12435:4;12483:3;12472:9;12468:19;12514:6;12503:9;12496:25;12540:2;12578:6;12573:2;12562:9;12558:18;12551:34;12621:3;12616:2;12605:9;12601:18;12594:31;12645:6;12680;12674:13;12711:6;12703;12696:22;12749:3;12738:9;12734:19;12727:26;;12788:2;12780:6;12776:15;12762:29;;12809:1;12819:195;12833:6;12830:1;12827:13;12819:195;;;12898:13;;-1:-1:-1;;;;;12894:39:1;12882:52;;12989:15;;;;12954:12;;;;12930:1;12848:9;12819:195;;;-1:-1:-1;;;;;;;13070:32:1;;;;13065:2;13050:18;;13043:60;-1:-1:-1;;;13134:3:1;13119:19;13112:35;13031:3;12173:980;-1:-1:-1;;;12173:980:1:o;13924:128::-;13964:3;13995:1;13991:6;13988:1;13985:13;13982:39;;;14001:18;;:::i;:::-;-1:-1:-1;14037:9:1;;13924:128::o;14057:120::-;14097:1;14123;14113:35;;14128:18;;:::i;:::-;-1:-1:-1;14162:9:1;;14057:120::o;14182:168::-;14222:7;14288:1;14284;14280:6;14276:14;14273:1;14270:21;14265:1;14258:9;14251:17;14247:45;14244:71;;;14295:18;;:::i;:::-;-1:-1:-1;14335:9:1;;14182:168::o;14355:125::-;14395:4;14423:1;14420;14417:8;14414:34;;;14428:18;;:::i;:::-;-1:-1:-1;14465:9:1;;14355:125::o;14485:380::-;14564:1;14560:12;;;;14607;;;14628:61;;14682:4;14674:6;14670:17;14660:27;;14628:61;14735:2;14727:6;14724:14;14704:18;14701:38;14698:161;;;14781:10;14776:3;14772:20;14769:1;14762:31;14816:4;14813:1;14806:15;14844:4;14841:1;14834:15;14698:161;;14485:380;;;:::o;14870:135::-;14909:3;-1:-1:-1;;14930:17:1;;14927:43;;;14950:18;;:::i;:::-;-1:-1:-1;14997:1:1;14986:13;;14870:135::o;15010:112::-;15042:1;15068;15058:35;;15073:18;;:::i;:::-;-1:-1:-1;15107:9:1;;15010:112::o;15127:127::-;15188:10;15183:3;15179:20;15176:1;15169:31;15219:4;15216:1;15209:15;15243:4;15240:1;15233:15;15259:127;15320:10;15315:3;15311:20;15308:1;15301:31;15351:4;15348:1;15341:15;15375:4;15372:1;15365:15;15391:127;15452:10;15447:3;15443:20;15440:1;15433:31;15483:4;15480:1;15473:15;15507:4;15504:1;15497:15;15523:127;15584:10;15579:3;15575:20;15572:1;15565:31;15615:4;15612:1;15605:15;15639:4;15636:1;15629:15;15787:131;-1:-1:-1;;;;;15862:31:1;;15852:42;;15842:70;;15908:1;15905;15898:12
Swarm Source
ipfs://d8a811f09e35addb8f8ae85a03520377824fd7c7458d7267ae36c12fb4822ed4
Loading...
Loading
Loading...
Loading
Multichain Portfolio | 30 Chains
Chain | Token | Portfolio % | Price | Amount | Value |
---|
Loading...
Loading
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.