Feature Tip: Add private address tag to any address under My Name Tag !
ERC-20
DeFi
Overview
Max Total Supply
100,000,000,000,000 ACE
Holders
726 (0.00%)
Market
Onchain Market Cap
$0.00
Circulating Supply Market Cap
-
Other Info
Token Contract (WITH 9 Decimals)
Balance
11,466,025,026 ACEValue
$0.00Loading...
Loading
Loading...
Loading
Loading...
Loading
# | Exchange | Pair | Price | 24H Volume | % Volume |
---|
Contract Name:
Ascend
Compiler Version
v0.8.4+commit.c7e474f2
Contract Source Code (Solidity Multiple files format)
pragma solidity ^0.8.4; // SPDX-License-Identifier: Apache-2.0 import "./SafeMath.sol"; import "./Address.sol"; import "./RewardsToken.sol"; import "./IUniswapV2Factory.sol"; import "./IUniswapV2Router.sol"; import "./IRewardsTracker.sol"; contract Ascend is RewardsToken { using SafeMath for uint256; using Address for address; // Supply, limits and fees uint256 private constant REWARDS_TRACKER_IDENTIFIER = 0; uint256 private constant TOTAL_SUPPLY = 100000000000000 * (10**9); uint256 public maxTxAmount = TOTAL_SUPPLY.mul(5).div(1000); // 0.5% uint256 public devFee = 4; uint256 private _previousDevFee = devFee; uint256 public rewardsFee = 8; uint256 private _previousRewardsFee = rewardsFee; address payable private _devWalletAddress = payable(0x5E0EB60467bEbb9438545b63f9adB51A526d029c); IRewardsTracker private _rewardsTracker; // Exclusions mapping(address => bool) private _isExcludedFromFee; mapping(address => bool) private _isExcludedFromMaxTx; // Token -> ETH swap support IUniswapV2Router public uniswapV2Router; address public uniswapV2Pair; bool currentlySwapping; bool public swapAndRedirectEthFeesEnabled = true; uint256 private minTokensBeforeSwap = 2000000000 * 10**9; // Events and modifiers event MinTokensBeforeSwapUpdated(uint256 minTokensBeforeSwap); event SwapAndRedirectEthFeesUpdated(bool enabled); event OnSwapAndRedirectEthFees( uint256 tokensSwapped, uint256 ethToDevWallet ); event MaxTxAmountUpdated(uint256 maxTxAmount); event ExcludeFromFees(address wallet); event IncludeInFees(address wallet); event DevWalletUpdated(address newDevWallet); event RewardsTrackerUpdated(address newRewardsTracker); event RouterUpdated(address newRouterAddress); event FeesChanged(uint256 newDevFee, uint256 newRewardsFee); modifier lockTheSwap() { currentlySwapping = true; _; currentlySwapping = false; } constructor() ERC20("Ascend", "ACE") { IUniswapV2Router _uniswapV2Router = IUniswapV2Router( 0x7a250d5630B4cF539739dF2C5dAcb4c659F2488D ); // Create a uniswap pair for this new token uniswapV2Pair = IUniswapV2Factory(_uniswapV2Router.factory()) .createPair(address(this), _uniswapV2Router.WETH()); // set the rest of the contract variables uniswapV2Router = _uniswapV2Router; // mint supply _mint(owner(), TOTAL_SUPPLY); // exclude owner and this contract from fee _isExcludedFromFee[owner()] = true; _isExcludedFromFee[address(this)] = true; // internal exclude from max tx _isExcludedFromMaxTx[owner()] = true; _isExcludedFromMaxTx[address(this)] = true; // exclude from rewards excludeFromRewards(address(this)); excludeFromRewards(address(0xdead)); excludeFromRewards(uniswapV2Pair); emit Transfer(address(0), _msgSender(), TOTAL_SUPPLY); } function decimals() public view virtual override returns (uint8) { return 9; } function _transfer( address from, address to, uint256 amount ) internal virtual override { if ( !_isExcludedFromMaxTx[from] && !_isExcludedFromMaxTx[to] // by default false ) { require( amount <= maxTxAmount, "Transfer amount exceeds the maxTxAmount" ); } // start swap to ETH uint256 contractTokenBalance = balanceOf(address(this)); bool overMinTokenBalance = contractTokenBalance >= minTokensBeforeSwap; if ( overMinTokenBalance && !currentlySwapping && from != uniswapV2Pair && swapAndRedirectEthFeesEnabled ) { // add dev fee swapAndRedirectEthFees(contractTokenBalance); } if (_isExcludedFromFee[from] || _isExcludedFromFee[to]) { removeAllFee(); } (uint256 tTransferAmount, uint256 tFee) = _getValues(amount); _balances[from] = _balances[from].sub(amount); _balances[to] = _balances[to].add(tTransferAmount); _takeFee(tFee); if (_isExcludedFromFee[from] || _isExcludedFromFee[to]) { restoreAllFee(); } emit Transfer(from, to, tTransferAmount); } //to recieve ETH from uniswapV2Router when swaping receive() external payable {} function _getValues(uint256 tAmount) private view returns (uint256, uint256) { uint256 tFee = calculateFee(tAmount); uint256 tTransferAmount = tAmount.sub(tFee); return (tTransferAmount, tFee); } function _takeFee(uint256 fee) private { _balances[address(this)] = _balances[address(this)].add(fee); } function calculateFee(uint256 _amount) private view returns (uint256) { uint256 totalFee = devFee.add(rewardsFee); return _amount.mul(totalFee).div(100); } function removeAllFee() private { if (devFee == 0 || rewardsFee == 0) return; _previousDevFee = devFee; _previousRewardsFee = rewardsFee; devFee = 0; rewardsFee = 0; } function restoreAllFee() private { devFee = _previousDevFee; rewardsFee = _previousRewardsFee; } function swapAndRedirectEthFees(uint256 contractTokenBalance) private lockTheSwap { uint256 totalRedirectFee = devFee.add(rewardsFee); if (totalRedirectFee == 0) return; // capture the contract's current ETH balance. // this is so that we can capture exactly the amount of ETH that the // swap creates, and not make the fee events include any ETH that // has been manually sent to the contract uint256 initialBalance = address(this).balance; // swap tokens for ETH swapTokensForEth(contractTokenBalance); uint256 newBalance = address(this).balance.sub(initialBalance); if (newBalance > 0) { // // send to rewards wallet // uint256 rewardsBalance = newBalance.mul(rewardsFee).div(totalRedirectFee); if (rewardsBalance > 0 && address(_rewardsTracker) != address(0)) { try _rewardsTracker.addAllocation{value: rewardsBalance}(REWARDS_TRACKER_IDENTIFIER) {} catch {} } // // send to dev wallet // uint256 devBalance = newBalance.mul(devFee).div(totalRedirectFee); sendEthToWallet(_devWalletAddress, devBalance); emit OnSwapAndRedirectEthFees(contractTokenBalance, newBalance); } } function sendEthToWallet(address wallet, uint256 amount) private { if (amount > 0) { payable(wallet).transfer(amount); } } 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 ); } // for 0.5% input 5, for 1% input 10 function setMaxTxPercent(uint256 newMaxTx) public onlyOwner { require(newMaxTx >= 5, "Max TX should be above 0.5%"); maxTxAmount = TOTAL_SUPPLY.mul(newMaxTx).div(1000); emit MaxTxAmountUpdated(maxTxAmount); } function isExcludedFromFee(address account) external view returns (bool) { return _isExcludedFromFee[account]; } function excludeFromFee(address account) external onlyOwner { _isExcludedFromFee[account] = true; emit ExcludeFromFees(account); } function includeInFee(address account) external onlyOwner { _isExcludedFromFee[account] = false; emit IncludeInFees(account); } function setFees(uint256 newDevFee, uint256 newRewardsFee) external onlyOwner { require(newDevFee <= 10 && newRewardsFee <= 10, "Fees exceed maximum allowed value"); devFee = newDevFee; rewardsFee = newRewardsFee; emit FeesChanged(newDevFee, newRewardsFee); } function _setDevWallet(address payable newDevWallet) external onlyOwner { _devWalletAddress = newDevWallet; emit DevWalletUpdated(newDevWallet); } function _setRewardsTracker(address payable newRewardsTracker) external onlyOwner { _rewardsTracker = IRewardsTracker(newRewardsTracker); emit RewardsTrackerUpdated(newRewardsTracker); } function setRouterAddress(address newRouter) external onlyOwner { IUniswapV2Router _newUniswapRouter = IUniswapV2Router(newRouter); uniswapV2Pair = IUniswapV2Factory(_newUniswapRouter.factory()) .createPair(address(this), _newUniswapRouter.WETH()); uniswapV2Router = _newUniswapRouter; emit RouterUpdated(newRouter); } function setSwapAndRedirectEthFeesEnabled(bool enabled) external onlyOwner { swapAndRedirectEthFeesEnabled = enabled; emit SwapAndRedirectEthFeesUpdated(enabled); } function setMinTokensBeforeSwap(uint256 minTokens) external onlyOwner { minTokensBeforeSwap = minTokens * 10**9; emit MinTokensBeforeSwapUpdated(minTokens); } // emergency claim functions function manualSwap() external onlyOwner { uint256 contractBalance = balanceOf(address(this)); swapTokensForEth(contractBalance); } function manualSend() external onlyOwner { uint256 contractEthBalance = address(this).balance; sendEthToWallet(_devWalletAddress, contractEthBalance); } }
pragma solidity ^0.8.4; // SPDX-License-Identifier: MIT /** * @dev Collection of functions related to the address type */ library Address { /** * @dev Returns true if `account` is a contract. * * [IMPORTANT] * ==== * It is unsafe to assume that an address for which this function returns * false is an externally-owned account (EOA) and not a contract. * * Among others, `isContract` will return false for the following * types of addresses: * * - an externally-owned account * - a contract in construction * - an address where a contract will be created * - an address where a contract lived, but was destroyed * ==== */ function isContract(address account) internal view returns (bool) { // According to EIP-1052, 0x0 is the value returned for not-yet created accounts // and 0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470 is returned // for accounts without code, i.e. `keccak256('')` bytes32 codehash; bytes32 accountHash = 0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470; // solhint-disable-next-line no-inline-assembly assembly { codehash := extcodehash(account) } return (codehash != accountHash && codehash != 0x0); } /** * @dev Replacement for Solidity's `transfer`: sends `amount` wei to * `recipient`, forwarding all available gas and reverting on errors. * * https://eips.ethereum.org/EIPS/eip-1884[EIP1884] increases the gas cost * of certain opcodes, possibly making contracts go over the 2300 gas limit * imposed by `transfer`, making them unable to receive funds via * `transfer`. {sendValue} removes this limitation. * * https://diligence.consensys.net/posts/2019/09/stop-using-soliditys-transfer-now/[Learn more]. * * IMPORTANT: because control is transferred to `recipient`, care must be * taken to not create reentrancy vulnerabilities. Consider using * {ReentrancyGuard} or the * https://solidity.readthedocs.io/en/v0.5.11/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern]. */ function sendValue(address payable recipient, uint256 amount) internal { require( address(this).balance >= amount, "Address: insufficient balance" ); // solhint-disable-next-line avoid-low-level-calls, avoid-call-value (bool success, ) = recipient.call{value: amount}(""); require( success, "Address: unable to send value, recipient may have reverted" ); } /** * @dev Performs a Solidity function call using a low level `call`. A * plain`call` is an unsafe replacement for a function call: use this * function instead. * * If `target` reverts with a revert reason, it is bubbled up by this * function (like regular Solidity function calls). * * Returns the raw returned data. To convert to the expected return value, * use https://solidity.readthedocs.io/en/latest/units-and-global-variables.html?highlight=abi.decode#abi-encoding-and-decoding-functions[`abi.decode`]. * * Requirements: * * - `target` must be a contract. * - calling `target` with `data` must not revert. * * _Available since v3.1._ */ function functionCall(address target, bytes memory data) internal returns (bytes memory) { return functionCall(target, data, "Address: low-level call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], but with * `errorMessage` as a fallback revert reason when `target` reverts. * * _Available since v3.1._ */ function functionCall( address target, bytes memory data, string memory errorMessage ) internal returns (bytes memory) { return _functionCallWithValue(target, data, 0, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but also transferring `value` wei to `target`. * * Requirements: * * - the calling contract must have an ETH balance of at least `value`. * - the called Solidity function must be `payable`. * * _Available since v3.1._ */ function functionCallWithValue( address target, bytes memory data, uint256 value ) internal returns (bytes memory) { return functionCallWithValue( target, data, value, "Address: low-level call with value failed" ); } /** * @dev Same as {xref-Address-functionCallWithValue-address-bytes-uint256-}[`functionCallWithValue`], but * with `errorMessage` as a fallback revert reason when `target` reverts. * * _Available since v3.1._ */ function functionCallWithValue( address target, bytes memory data, uint256 value, string memory errorMessage ) internal returns (bytes memory) { require( address(this).balance >= value, "Address: insufficient balance for call" ); return _functionCallWithValue(target, data, value, errorMessage); } function _functionCallWithValue( address target, bytes memory data, uint256 weiValue, string memory errorMessage ) private returns (bytes memory) { require(isContract(target), "Address: call to non-contract"); // solhint-disable-next-line avoid-low-level-calls (bool success, bytes memory returndata) = target.call{value: weiValue}( data ); if (success) { return returndata; } else { // Look for revert reason and bubble it up if present if (returndata.length > 0) { // The easiest way to bubble the revert reason is using memory via assembly // solhint-disable-next-line no-inline-assembly assembly { let returndata_size := mload(returndata) revert(add(32, returndata), returndata_size) } } else { revert(errorMessage); } } } }
pragma solidity ^0.8.4; // SPDX-License-Identifier: MIT abstract contract Context { function _msgSender() internal view virtual returns (address) { return msg.sender; } function _msgData() internal view virtual returns (bytes memory) { this; // silence state mutability warning without generating bytecode - see https://github.com/ethereum/solidity/issues/2691 return msg.data; } }
pragma solidity ^0.8.4; // SPDX-License-Identifier: MIT import "./IERC20.sol"; import "./IERC20Metadata.sol"; import "./Context.sol"; import "./SafeMath.sol"; import "./Address.sol"; /** * @dev Implementation of the {IERC20} interface. * * This implementation is agnostic to the way tokens are created. This means * that a supply mechanism has to be added in a derived contract using {_mint}. * For a generic mechanism see {ERC20PresetMinterPauser}. * * TIP: For a detailed writeup see our guide * https://forum.zeppelin.solutions/t/how-to-implement-erc20-supply-mechanisms/226[How * to implement supply mechanisms]. * * We have followed general OpenZeppelin guidelines: functions revert instead * of returning `false` on failure. This behavior is nonetheless conventional * and does not conflict with the expectations of ERC20 applications. * * Additionally, an {Approval} event is emitted on calls to {transferFrom}. * This allows applications to reconstruct the allowance for all accounts just * by listening to said events. Other implementations of the EIP may not emit * these events, as it isn't required by the specification. * * Finally, the non-standard {decreaseAllowance} and {increaseAllowance} * functions have been added to mitigate the well-known issues around setting * allowances. See {IERC20-approve}. */ contract ERC20 is Context, IERC20, IERC20Metadata { using SafeMath for uint256; using Address for address; mapping(address => uint256) internal _balances; mapping(address => mapping(address => uint256)) private _allowances; uint256 internal _totalSupply; string private _name; string private _symbol; /** * @dev Sets the values for {name} and {symbol}. * * The default value of {decimals} is 18. To select a different value for * {decimals} you should overload it. * * All two of these values are immutable: they can only be set once during * construction. */ constructor(string memory name_, string memory symbol_) { _name = name_; _symbol = symbol_; } /** * @dev Returns the name of the token. */ function name() public view virtual override returns (string memory) { return _name; } /** * @dev Returns the symbol of the token, usually a shorter version of the * name. */ function symbol() public view virtual override returns (string memory) { return _symbol; } /** * @dev Returns the number of decimals used to get its user representation. * For example, if `decimals` equals `2`, a balance of `505` tokens should * be displayed to a user as `5,05` (`505 / 10 ** 2`). * * Tokens usually opt for a value of 18, imitating the relationship between * Ether and Wei. This is the value {ERC20} uses, unless this function is * overridden; * * NOTE: This information is only used for _display_ purposes: it in * no way affects any of the arithmetic of the contract, including * {IERC20-balanceOf} and {IERC20-transfer}. */ function decimals() public view virtual override returns (uint8) { return 18; } /** * @dev See {IERC20-totalSupply}. */ function totalSupply() public view virtual override returns (uint256) { return _totalSupply; } /** * @dev See {IERC20-balanceOf}. */ function balanceOf(address account) public view virtual override returns (uint256) { return _balances[account]; } /** * @dev See {IERC20-transfer}. * * Requirements: * * - `recipient` cannot be the zero address. * - the caller must have a balance of at least `amount`. */ function transfer(address recipient, uint256 amount) public virtual override returns (bool) { _transfer(_msgSender(), recipient, amount); return true; } /** * @dev See {IERC20-allowance}. */ function allowance(address owner, address spender) public view virtual override returns (uint256) { return _allowances[owner][spender]; } /** * @dev See {IERC20-approve}. * * Requirements: * * - `spender` cannot be the zero address. */ function approve(address spender, uint256 amount) public virtual override returns (bool) { _approve(_msgSender(), spender, amount); return true; } /** * @dev See {IERC20-transferFrom}. * * Emits an {Approval} event indicating the updated allowance. This is not * required by the EIP. See the note at the beginning of {ERC20}. * * Requirements: * * - `sender` and `recipient` cannot be the zero address. * - `sender` must have a balance of at least `amount`. * - the caller must have allowance for ``sender``'s tokens of at least * `amount`. */ function transferFrom( address sender, address recipient, uint256 amount ) public virtual override returns (bool) { _transfer(sender, recipient, amount); _approve(sender, _msgSender(), _allowances[sender][_msgSender()].sub(amount, "ERC20: transfer amount exceeds allowance")); return true; } /** * @dev Atomically increases the allowance granted to `spender` by the caller. * * This is an alternative to {approve} that can be used as a mitigation for * problems described in {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].add(addedValue)); return true; } /** * @dev Atomically decreases the allowance granted to `spender` by the caller. * * This is an alternative to {approve} that can be used as a mitigation for * problems described in {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) { _approve(_msgSender(), spender, _allowances[_msgSender()][spender].sub(subtractedValue, "ERC20: decreased allowance below zero")); return true; } /** * @dev Moves tokens `amount` from `sender` to `recipient`. * * This is internal function is equivalent to {transfer}, and can be used to * e.g. implement automatic token fees, slashing mechanisms, etc. * * Emits a {Transfer} event. * * Requirements: * * - `sender` cannot be the zero address. * - `recipient` cannot be the zero address. * - `sender` must have a balance of at least `amount`. */ function _transfer( address sender, address recipient, uint256 amount ) internal virtual { require(sender != address(0), "ERC20: transfer from the zero address"); require(recipient != address(0), "ERC20: transfer to the zero address"); _beforeTokenTransfer(sender, recipient, amount); _balances[sender] = _balances[sender].sub(amount, "ERC20: transfer amount exceeds balance"); _balances[recipient] = _balances[recipient].add(amount); emit Transfer(sender, recipient, amount); } /** @dev Creates `amount` tokens and assigns them to `account`, increasing * the total supply. * * Emits a {Transfer} event with `from` set to the zero address. * * Requirements: * * - `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 = _totalSupply.add(amount); _balances[account] = _balances[account].add(amount); emit Transfer(address(0), account, amount); } /** * @dev Destroys `amount` tokens from `account`, reducing the * total supply. * * Emits a {Transfer} event with `to` set to the zero address. * * Requirements: * * - `account` cannot be the zero address. * - `account` must have at least `amount` tokens. */ function _burn(address account, uint256 amount) internal virtual { require(account != address(0), "ERC20: burn from the zero address"); _beforeTokenTransfer(account, address(0), amount); _balances[account] = _balances[account].sub(amount, "ERC20: burn amount exceeds balance"); _totalSupply = _totalSupply.sub(amount); emit Transfer(account, address(0), amount); } /** * @dev Sets `amount` as the allowance of `spender` over the `owner` s tokens. * * This 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 to 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 {} }
pragma solidity ^0.8.4; // SPDX-License-Identifier: MIT /** * @dev Interface of the ERC20 standard as defined in the EIP. */ interface IERC20 { /** * @dev Returns the amount of tokens in existence. */ function totalSupply() external view returns (uint256); /** * @dev Returns the amount of tokens owned by `account`. */ function balanceOf(address account) external view returns (uint256); /** * @dev Moves `amount` tokens from the caller's account to `recipient`. * * Returns a boolean value indicating whether the operation succeeded. * * Emits a {Transfer} event. */ function transfer(address recipient, uint256 amount) external returns (bool); /** * @dev Returns the remaining number of tokens that `spender` will be * allowed to spend on behalf of `owner` through {transferFrom}. This is * zero by default. * * This value changes when {approve} or {transferFrom} are called. */ function allowance(address owner, address spender) external view returns (uint256); /** * @dev Sets `amount` as the allowance of `spender` over the caller's tokens. * * Returns a boolean value indicating whether the operation succeeded. * * IMPORTANT: Beware that changing an allowance with this method brings the risk * that someone may use both the old and the new allowance by unfortunate * transaction ordering. One possible solution to mitigate this race * condition is to first reduce the spender's allowance to 0 and set the * desired value afterwards: * https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729 * * Emits an {Approval} event. */ function approve(address spender, uint256 amount) external returns (bool); /** * @dev Moves `amount` tokens from `sender` to `recipient` using the * allowance mechanism. `amount` is then deducted from the caller's * allowance. * * Returns a boolean value indicating whether the operation succeeded. * * Emits a {Transfer} event. */ function transferFrom( address sender, address recipient, uint256 amount ) external returns (bool); /** * @dev Emitted when `value` tokens are moved from one account (`from`) to * another (`to`). * * Note that `value` may be zero. */ event Transfer(address indexed from, address indexed to, uint256 value); /** * @dev Emitted when the allowance of a `spender` for an `owner` is set by * a call to {approve}. `value` is the new allowance. */ event Approval(address indexed owner, address indexed spender, uint256 value); }
pragma solidity ^0.8.4; // SPDX-License-Identifier: MIT import "./IERC20.sol"; /** * @dev Interface for the optional metadata functions from the ERC20 standard. * * _Available since v4.1._ */ interface IERC20Metadata is IERC20 { /** * @dev Returns the name of the token. */ function name() external view returns (string memory); /** * @dev Returns the symbol of the token. */ function symbol() external view returns (string memory); /** * @dev Returns the decimals places of the token. */ function decimals() external view returns (uint8); }
pragma solidity 0.8.4; // SPDX-License-Identifier: Apache-2.0 interface IRewardsTracker { function addAllocation(uint identifier) external payable; }
pragma solidity 0.8.4; // SPDX-License-Identifier: MIT interface IUniswapV2Factory { function createPair(address tokenA, address tokenB) external returns (address pair); }
pragma solidity 0.8.4; // SPDX-License-Identifier: MIT interface IUniswapV2Router { function factory() external pure returns (address); function WETH() external pure returns (address); function swapExactTokensForETHSupportingFeeOnTransferTokens( uint256 amountIn, uint256 amountOutMin, address[] calldata path, address to, uint256 deadline ) external; }
pragma solidity 0.8.4; // SPDX-License-Identifier: MIT import "./Context.sol"; /** * @dev Contract module which provides a basic access control mechanism, where * there is an account (an owner) that can be granted exclusive access to * specific functions. * * By default, the owner account will be the one that deploys the contract. This * can later be changed with {transferOwnership}. * * This module is used through inheritance. It will make available the modifier * `onlyOwner`, which can be applied to your functions to restrict their use to * the owner. */ contract Ownable is Context { address private _owner; event OwnershipTransferred( address indexed previousOwner, address indexed newOwner ); /** * @dev Initializes the contract setting the deployer as the initial owner. */ constructor() { address msgSender = _msgSender(); _owner = msgSender; emit OwnershipTransferred(address(0), msgSender); } /** * @dev Returns the address of the current owner. */ function owner() public view 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() external virtual onlyOwner { emit OwnershipTransferred(_owner, address(0)); _owner = address(0); } /** * @dev Transfers ownership of the contract to a new account (`newOwner`). * Can only be called by the current owner. */ function transferOwnership(address newOwner) external virtual onlyOwner { require( newOwner != address(0), "Ownable: new owner is the zero address" ); emit OwnershipTransferred(_owner, newOwner); _owner = newOwner; } }
pragma solidity ^0.8.4; // SPDX-License-Identifier: Apache-2.0 import "./ERC20.sol"; import "./Ownable.sol"; abstract contract RewardsToken is ERC20, Ownable { address[] private excludedFromRewards; mapping(address => bool) private isAddressExcluded; event ExcludeFromRewards(address wallet); event IncludeInRewards(address wallet); function deleteExcluded(uint index) internal { require(index < excludedFromRewards.length, "Index is greater than array length"); excludedFromRewards[index] = excludedFromRewards[excludedFromRewards.length - 1]; excludedFromRewards.pop(); } function getExcludedBalances() internal view returns (uint256) { uint256 totalExcludedHoldings = 0; for (uint i = 0; i < excludedFromRewards.length; i++) { totalExcludedHoldings += balanceOf(excludedFromRewards[i]); } return totalExcludedHoldings; } function excludeFromRewards(address wallet) public onlyOwner { require(!isAddressExcluded[wallet], "Address is already excluded from rewards"); excludedFromRewards.push(wallet); isAddressExcluded[wallet] = true; emit ExcludeFromRewards(wallet); } function includeInRewards(address wallet) external onlyOwner { require(isAddressExcluded[wallet], "Address is not excluded from rewards"); for (uint i = 0; i < excludedFromRewards.length; i++) { if (excludedFromRewards[i] == wallet) { isAddressExcluded[wallet] = false; deleteExcluded(i); break; } } emit IncludeInRewards(wallet); } function isExcludedFromRewards(address wallet) external view returns (bool) { return isAddressExcluded[wallet]; } function getAllExcludedFromRewards() external view returns (address[] memory) { return excludedFromRewards; } function getRewardsSupply() public view returns (uint256) { return _totalSupply - getExcludedBalances(); } }
pragma solidity ^0.8.4; // SPDX-License-Identifier: MIT /** * @dev Wrappers over Solidity's arithmetic operations with added overflow * checks. * * Arithmetic operations in Solidity wrap on overflow. This can easily result * in bugs, because programmers usually assume that an overflow raises an * error, which is the standard behavior in high level programming languages. * `SafeMath` restores this intuition by reverting the transaction when an * operation overflows. * * Using this library instead of the unchecked operations eliminates an entire * class of bugs, so it's recommended to use it always. */ library SafeMath { /** * @dev Returns the addition of two unsigned integers, 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; } }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"spender","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"newDevWallet","type":"address"}],"name":"DevWalletUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"wallet","type":"address"}],"name":"ExcludeFromFees","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"wallet","type":"address"}],"name":"ExcludeFromRewards","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"newDevFee","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"newRewardsFee","type":"uint256"}],"name":"FeesChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"wallet","type":"address"}],"name":"IncludeInFees","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"wallet","type":"address"}],"name":"IncludeInRewards","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"maxTxAmount","type":"uint256"}],"name":"MaxTxAmountUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"minTokensBeforeSwap","type":"uint256"}],"name":"MinTokensBeforeSwapUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"tokensSwapped","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"ethToDevWallet","type":"uint256"}],"name":"OnSwapAndRedirectEthFees","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":"address","name":"newRewardsTracker","type":"address"}],"name":"RewardsTrackerUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"newRouterAddress","type":"address"}],"name":"RouterUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"bool","name":"enabled","type":"bool"}],"name":"SwapAndRedirectEthFeesUpdated","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":[{"internalType":"address payable","name":"newDevWallet","type":"address"}],"name":"_setDevWallet","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address payable","name":"newRewardsTracker","type":"address"}],"name":"_setRewardsTracker","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":[],"name":"decimals","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"subtractedValue","type":"uint256"}],"name":"decreaseAllowance","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"devFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"excludeFromFee","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"wallet","type":"address"}],"name":"excludeFromRewards","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"getAllExcludedFromRewards","outputs":[{"internalType":"address[]","name":"","type":"address[]"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getRewardsSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"includeInFee","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"wallet","type":"address"}],"name":"includeInRewards","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"addedValue","type":"uint256"}],"name":"increaseAllowance","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"isExcludedFromFee","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"wallet","type":"address"}],"name":"isExcludedFromRewards","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"manualSend","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"manualSwap","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"maxTxAmount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"rewardsFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"newDevFee","type":"uint256"},{"internalType":"uint256","name":"newRewardsFee","type":"uint256"}],"name":"setFees","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"newMaxTx","type":"uint256"}],"name":"setMaxTxPercent","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"minTokens","type":"uint256"}],"name":"setMinTokensBeforeSwap","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newRouter","type":"address"}],"name":"setRouterAddress","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"enabled","type":"bool"}],"name":"setSwapAndRedirectEthFeesEnabled","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"swapAndRedirectEthFeesEnabled","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"recipient","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transfer","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"sender","type":"address"},{"internalType":"address","name":"recipient","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transferFrom","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"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 IUniswapV2Router","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"stateMutability":"payable","type":"receive"}]
Contract Creation Code
6080604052620000446103e862000030600569152d02c7e14af68000006200047060201b620014511790919060201c565b6200050460201b620014d71790919060201c565b600890815560046009819055600a55600b819055600c55600d80546001600160a01b031916735e0eb60467bebb9438545b63f9adb51a526d029c1790556012805460ff60a81b1916600160a81b179055671bc16d674ec80000601355348015620000ad57600080fd5b5060405180604001604052806006815260200165105cd8d95b9960d21b8152506040518060400160405280600381526020016241434560e81b8152508160039080519060200190620001019291906200084e565b508051620001179060049060208401906200084e565b50505060006200012c6200054e60201b60201c565b600580546001600160a01b0319166001600160a01b038316908117909155604051919250906000907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908290a3506000737a250d5630b4cf539739df2c5dacb4c659f2488d9050806001600160a01b031663c45a01556040518163ffffffff1660e01b815260040160206040518083038186803b158015620001cd57600080fd5b505afa158015620001e2573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620002089190620008f4565b6001600160a01b031663c9c6539630836001600160a01b031663ad5c46486040518163ffffffff1660e01b815260040160206040518083038186803b1580156200025157600080fd5b505afa15801562000266573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906200028c9190620008f4565b6040516001600160e01b031960e085901b1681526001600160a01b03928316600482015291166024820152604401602060405180830381600087803b158015620002d557600080fd5b505af1158015620002ea573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620003109190620008f4565b601280546001600160a01b03199081166001600160a01b03938416179091556011805490911683831617905560055462000356911669152d02c7e14af680000062000552565b6001600f60006200036f6005546001600160a01b031690565b6001600160a01b0316815260208082019290925260409081016000908120805494151560ff19958616179055308152600f909252812080549092166001908117909255601090620003c86005546001600160a01b031690565b6001600160a01b0316815260208082019290925260409081016000908120805494151560ff1995861617905530808252601090935220805490921660011790915562000414906200063d565b6200042161dead6200063d565b60125462000438906001600160a01b03166200063d565b60405169152d02c7e14af68000008152339060009060008051602062002d548339815191529060200160405180910390a35062000a24565b6000826200048157506000620004fe565b60006200048f8385620009af565b9050826200049e85836200098e565b14620004fb5760405162461bcd60e51b815260206004820152602160248201527f536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f6044820152607760f81b60648201526084015b60405180910390fd5b90505b92915050565b6000620004fb83836040518060400160405280601a81526020017f536166654d6174683a206469766973696f6e206279207a65726f000000000000815250620007af60201b60201c565b3390565b6001600160a01b038216620005aa5760405162461bcd60e51b815260206004820152601f60248201527f45524332303a206d696e7420746f20746865207a65726f2061646472657373006044820152606401620004f2565b620005c681600254620007eb60201b620015191790919060201c565b6002556001600160a01b03821660009081526020818152604090912054620005f991839062001519620007eb821b17901c565b6001600160a01b0383166000818152602081815260408083209490945592518481529192909160008051602062002d54833981519152910160405180910390a35050565b6005546001600160a01b03163314620006995760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401620004f2565b6001600160a01b03811660009081526007602052604090205460ff1615620007155760405162461bcd60e51b815260206004820152602860248201527f4164647265737320697320616c7265616479206578636c756465642066726f6d604482015267207265776172647360c01b6064820152608401620004f2565b6006805460018082019092557ff652222313e28459528d920b65115c16c04f3efc82aaedc97be59f3f377c0d3f0180546001600160a01b0319166001600160a01b038416908117909155600081815260076020908152604091829020805460ff1916909417909355519081527f9dc0c5d829ba95d4a3aa3e40791b3e0ff125f876788532b9f7f6eb543d8dfbd6910160405180910390a150565b60008183620007d35760405162461bcd60e51b8152600401620004f291906200091d565b506000620007e284866200098e565b95945050505050565b600080620007fa838562000973565b905083811015620004fb5760405162461bcd60e51b815260206004820152601b60248201527f536166654d6174683a206164646974696f6e206f766572666c6f7700000000006044820152606401620004f2565b8280546200085c90620009d1565b90600052602060002090601f016020900481019282620008805760008555620008cb565b82601f106200089b57805160ff1916838001178555620008cb565b82800160010185558215620008cb579182015b82811115620008cb578251825591602001919060010190620008ae565b50620008d9929150620008dd565b5090565b5b80821115620008d95760008155600101620008de565b60006020828403121562000906578081fd5b81516001600160a01b0381168114620004fb578182fd5b6000602080835283518082850152825b818110156200094b578581018301518582016040015282016200092d565b818111156200095d5783604083870101525b50601f01601f1916929092016040019392505050565b6000821982111562000989576200098962000a0e565b500190565b600082620009aa57634e487b7160e01b81526012600452602481fd5b500490565b6000816000190483118215151615620009cc57620009cc62000a0e565b500290565b600181811c90821680620009e657607f821691505b6020821081141562000a0857634e487b7160e01b600052602260045260246000fd5b50919050565b634e487b7160e01b600052601160045260246000fd5b6123208062000a346000396000f3fe60806040526004361061021e5760003560e01c806351bc3c8511610123578063a457c2d7116100ab578063dd62ed3e1161006f578063dd62ed3e14610664578063ea2f0b37146106aa578063f2fde38b146106ca578063f4293890146106ea578063fffa1dd9146106ff57600080fd5b8063a457c2d7146105c2578063a9059cbb146105e2578063ada46d0a14610602578063b609995e14610624578063d543dbeb1461064457600080fd5b806370a08231116100f257806370a082311461052e578063715018a6146105645780638c0b5e22146105795780638da5cb5b1461058f57806395d89b41146105ad57600080fd5b806351bc3c85146104aa5780635342acb4146104bf5780635c7b2258146104f85780636827e7641461051857600080fd5b806323b872dd116101a65780633950935111610175578063395093511461040a57806341cb87fc1461042a578063437823ec1461044a57806348a464731461046a57806349bd5a5e1461048a57600080fd5b806323b872dd1461039857806326b6308d146103b85780632bb14e1d146103d8578063313ce567146103ee57600080fd5b80630e832273116101ed5780630e832273146102c7578063111e037614610300578063113201fa146103205780631694505e1461034157806318160ddd1461037957600080fd5b806306fdde031461022a578063095ea7b3146102555780630a1f8ea8146102855780630b78f9c0146102a757600080fd5b3661022557005b600080fd5b34801561023657600080fd5b5061023f610714565b60405161024c91906120f0565b60405180910390f35b34801561026157600080fd5b50610275610270366004612016565b6107a6565b604051901515815260200161024c565b34801561029157600080fd5b506102a56102a0366004611f66565b6107bd565b005b3480156102b357600080fd5b506102a56102c2366004612079565b610845565b3480156102d357600080fd5b506102756102e2366004611f66565b6001600160a01b031660009081526007602052604090205460ff1690565b34801561030c57600080fd5b506102a561031b366004611f66565b61091f565b34801561032c57600080fd5b5060125461027590600160a81b900460ff1681565b34801561034d57600080fd5b50601154610361906001600160a01b031681565b6040516001600160a01b03909116815260200161024c565b34801561038557600080fd5b506002545b60405190815260200161024c565b3480156103a457600080fd5b506102756103b3366004611fd6565b610a57565b3480156103c457600080fd5b506102a56103d3366004612041565b610ac0565b3480156103e457600080fd5b5061038a600b5481565b3480156103fa57600080fd5b506040516009815260200161024c565b34801561041657600080fd5b50610275610425366004612016565b610b37565b34801561043657600080fd5b506102a5610445366004611f66565b610b6d565b34801561045657600080fd5b506102a5610465366004611f66565b610d6b565b34801561047657600080fd5b506102a5610485366004612061565b610de9565b34801561049657600080fd5b50601254610361906001600160a01b031681565b3480156104b657600080fd5b506102a5610e54565b3480156104cb57600080fd5b506102756104da366004611f66565b6001600160a01b03166000908152600f602052604090205460ff1690565b34801561050457600080fd5b506102a5610513366004611f66565b610e9a565b34801561052457600080fd5b5061038a60095481565b34801561053a57600080fd5b5061038a610549366004611f66565b6001600160a01b031660009081526020819052604090205490565b34801561057057600080fd5b506102a5610f12565b34801561058557600080fd5b5061038a60085481565b34801561059b57600080fd5b506005546001600160a01b0316610361565b3480156105b957600080fd5b5061023f610f86565b3480156105ce57600080fd5b506102756105dd366004612016565b610f95565b3480156105ee57600080fd5b506102756105fd366004612016565b610fe4565b34801561060e57600080fd5b50610617610ff1565b60405161024c91906120dd565b34801561063057600080fd5b506102a561063f366004611f66565b611052565b34801561065057600080fd5b506102a561065f366004612061565b6111bd565b34801561067057600080fd5b5061038a61067f366004611f9e565b6001600160a01b03918216600090815260016020908152604080832093909416825291909152205490565b3480156106b657600080fd5b506102a56106c5366004611f66565b61128d565b3480156106d657600080fd5b506102a56106e5366004611f66565b611308565b3480156106f657600080fd5b506102a56113f3565b34801561070b57600080fd5b5061038a611435565b60606003805461072390612222565b80601f016020809104026020016040519081016040528092919081815260200182805461074f90612222565b801561079c5780601f106107715761010080835404028352916020019161079c565b820191906000526020600020905b81548152906001019060200180831161077f57829003601f168201915b5050505050905090565b60006107b3338484611578565b5060015b92915050565b6005546001600160a01b031633146107f05760405162461bcd60e51b81526004016107e790612143565b60405180910390fd5b600d80546001600160a01b0319166001600160a01b0383169081179091556040519081527f31bb1993faff4f8409d7baad771f861e093ef4ce2c92c6e0cb10b82d1c7324cb906020015b60405180910390a150565b6005546001600160a01b0316331461086f5760405162461bcd60e51b81526004016107e790612143565b600a82111580156108815750600a8111155b6108d75760405162461bcd60e51b815260206004820152602160248201527f4665657320657863656564206d6178696d756d20616c6c6f7765642076616c756044820152606560f81b60648201526084016107e7565b6009829055600b81905560408051838152602081018390527f64f84976d9c917a44796104a59950fdbd9b3c16a5dd348b546d738301f6bd06891015b60405180910390a15050565b6005546001600160a01b031633146109495760405162461bcd60e51b81526004016107e790612143565b6001600160a01b03811660009081526007602052604090205460ff16156109c35760405162461bcd60e51b815260206004820152602860248201527f4164647265737320697320616c7265616479206578636c756465642066726f6d604482015267207265776172647360c01b60648201526084016107e7565b6006805460018082019092557ff652222313e28459528d920b65115c16c04f3efc82aaedc97be59f3f377c0d3f0180546001600160a01b0319166001600160a01b038416908117909155600081815260076020908152604091829020805460ff1916909417909355519081527f9dc0c5d829ba95d4a3aa3e40791b3e0ff125f876788532b9f7f6eb543d8dfbd6910161083a565b6000610a6484848461169c565b610ab68433610ab18560405180606001604052806028815260200161229e602891396001600160a01b038a166000908152600160209081526040808320338452909152902054919061192c565b611578565b5060019392505050565b6005546001600160a01b03163314610aea5760405162461bcd60e51b81526004016107e790612143565b60128054821515600160a81b0260ff60a81b199091161790556040517fd9fca2a469120637ae54e43ab68dfdcd9354db52d615dea3d3a66a085e6f41b99061083a90831515815260200190565b3360008181526001602090815260408083206001600160a01b038716845290915281205490916107b3918590610ab19086611519565b6005546001600160a01b03163314610b975760405162461bcd60e51b81526004016107e790612143565b6000819050806001600160a01b031663c45a01556040518163ffffffff1660e01b815260040160206040518083038186803b158015610bd557600080fd5b505afa158015610be9573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610c0d9190611f82565b6001600160a01b031663c9c6539630836001600160a01b031663ad5c46486040518163ffffffff1660e01b815260040160206040518083038186803b158015610c5557600080fd5b505afa158015610c69573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610c8d9190611f82565b6040516001600160e01b031960e085901b1681526001600160a01b03928316600482015291166024820152604401602060405180830381600087803b158015610cd557600080fd5b505af1158015610ce9573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610d0d9190611f82565b601280546001600160a01b03199081166001600160a01b03938416179091556011805490911683831617905560405190831681527f7aed1d3e8155a07ccf395e44ea3109a0e2d6c9b29bbbe9f142d9790596f4dc8090602001610913565b6005546001600160a01b03163314610d955760405162461bcd60e51b81526004016107e790612143565b6001600160a01b0381166000818152600f6020908152604091829020805460ff1916600117905590519182527f57a00f76b5f242fb1e04b0b514a6974665a5b07bce45e39f36dabff4a042d936910161083a565b6005546001600160a01b03163314610e135760405162461bcd60e51b81526004016107e790612143565b610e2181633b9aca006121ec565b6013556040518181527f5948780118f41f7c4577ae4619d5cbd064057bd8562d9f7b7e60324053375c009060200161083a565b6005546001600160a01b03163314610e7e5760405162461bcd60e51b81526004016107e790612143565b30600090815260208190526040902054610e9781611966565b50565b6005546001600160a01b03163314610ec45760405162461bcd60e51b81526004016107e790612143565b600e80546001600160a01b0319166001600160a01b0383169081179091556040519081527f535be0bbc71c839ded01277ab57f29f2e810c1ff0255bb938d7cb8e96ac8ca1a9060200161083a565b6005546001600160a01b03163314610f3c5760405162461bcd60e51b81526004016107e790612143565b6005546040516000916001600160a01b0316907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908390a3600580546001600160a01b0319169055565b60606004805461072390612222565b60006107b33384610ab1856040518060600160405280602581526020016122c6602591393360009081526001602090815260408083206001600160a01b038d168452909152902054919061192c565b60006107b333848461169c565b6060600680548060200260200160405190810160405280929190818152602001828054801561079c57602002820191906000526020600020905b81546001600160a01b0316815260019091019060200180831161102b575050505050905090565b6005546001600160a01b0316331461107c5760405162461bcd60e51b81526004016107e790612143565b6001600160a01b03811660009081526007602052604090205460ff166110f05760405162461bcd60e51b8152602060048201526024808201527f41646472657373206973206e6f74206578636c756465642066726f6d207265776044820152636172647360e01b60648201526084016107e7565b60005b60065481101561118357816001600160a01b03166006828154811061112857634e487b7160e01b600052603260045260246000fd5b6000918252602090912001546001600160a01b03161415611171576001600160a01b0382166000908152600760205260409020805460ff1916905561116c81611aeb565b611183565b8061117b81612257565b9150506110f3565b506040516001600160a01b03821681527f87434094d24a90fbd9a8ffcf2be9818d237c06a12d126296bc1ea7d5895943349060200161083a565b6005546001600160a01b031633146111e75760405162461bcd60e51b81526004016107e790612143565b60058110156112385760405162461bcd60e51b815260206004820152601b60248201527f4d61782054582073686f756c642062652061626f766520302e3525000000000060448201526064016107e7565b6112586103e861125269152d02c7e14af680000084611451565b906114d7565b60088190556040519081527f947f344d56e1e8c70dc492fb94c4ddddd490c016aab685f5e7e47b2e85cb44cf9060200161083a565b6005546001600160a01b031633146112b75760405162461bcd60e51b81526004016107e790612143565b6001600160a01b0381166000818152600f6020908152604091829020805460ff1916905590519182527f346f6c42af1ce4b7d7951f3fa40a2fb1e78c80ab0f3d76fb4f9fec269d568f0d910161083a565b6005546001600160a01b031633146113325760405162461bcd60e51b81526004016107e790612143565b6001600160a01b0381166113975760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b60648201526084016107e7565b6005546040516001600160a01b038084169216907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a3600580546001600160a01b0319166001600160a01b0392909216919091179055565b6005546001600160a01b0316331461141d5760405162461bcd60e51b81526004016107e790612143565b600d544790610e97906001600160a01b031682611c21565b600061143f611c63565b60025461144c919061220b565b905090565b600082611460575060006107b7565b600061146c83856121ec565b90508261147985836121cc565b146114d05760405162461bcd60e51b815260206004820152602160248201527f536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f6044820152607760f81b60648201526084016107e7565b9392505050565b60006114d083836040518060400160405280601a81526020017f536166654d6174683a206469766973696f6e206279207a65726f000000000000815250611cde565b60008061152683856121b4565b9050838110156114d05760405162461bcd60e51b815260206004820152601b60248201527f536166654d6174683a206164646974696f6e206f766572666c6f77000000000060448201526064016107e7565b6001600160a01b0383166115da5760405162461bcd60e51b8152602060048201526024808201527f45524332303a20617070726f76652066726f6d20746865207a65726f206164646044820152637265737360e01b60648201526084016107e7565b6001600160a01b03821661163b5760405162461bcd60e51b815260206004820152602260248201527f45524332303a20617070726f766520746f20746865207a65726f206164647265604482015261737360f01b60648201526084016107e7565b6001600160a01b0383811660008181526001602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925910160405180910390a3505050565b6001600160a01b03831660009081526010602052604090205460ff161580156116de57506001600160a01b03821660009081526010602052604090205460ff16155b15611745576008548111156117455760405162461bcd60e51b815260206004820152602760248201527f5472616e7366657220616d6f756e74206578636565647320746865206d6178546044820152661e105b5bdd5b9d60ca1b60648201526084016107e7565b30600090815260208190526040902054601354811080159081906117735750601254600160a01b900460ff16155b801561178d57506012546001600160a01b03868116911614155b80156117a25750601254600160a81b900460ff165b156117b0576117b082611d0c565b6001600160a01b0385166000908152600f602052604090205460ff16806117ef57506001600160a01b0384166000908152600f602052604090205460ff165b156117fc576117fc611e78565b60008061180885611ea5565b6001600160a01b03891660009081526020819052604090205491935091506118309086611ecc565b6001600160a01b03808916600090815260208190526040808220939093559088168152205461185f9083611519565b6001600160a01b03871660009081526020819052604090205561188181611f0e565b6001600160a01b0387166000908152600f602052604090205460ff16806118c057506001600160a01b0386166000908152600f602052604090205460ff165b156118d6576118d6600a54600955600c54600b55565b856001600160a01b0316876001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef8460405161191b91815260200190565b60405180910390a350505050505050565b600081848411156119505760405162461bcd60e51b81526004016107e791906120f0565b50600061195d848661220b565b95945050505050565b60408051600280825260608201835260009260208301908036833701905050905030816000815181106119a957634e487b7160e01b600052603260045260246000fd5b6001600160a01b03928316602091820292909201810191909152601154604080516315ab88c960e31b81529051919093169263ad5c4648926004808301939192829003018186803b1580156119fd57600080fd5b505afa158015611a11573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611a359190611f82565b81600181518110611a5657634e487b7160e01b600052603260045260246000fd5b6001600160a01b039283166020918202929092010152601154611a7c9130911684611578565b60115460405163791ac94760e01b81526001600160a01b039091169063791ac94790611ab5908590600090869030904290600401612178565b600060405180830381600087803b158015611acf57600080fd5b505af1158015611ae3573d6000803e3d6000fd5b505050505050565b6006548110611b475760405162461bcd60e51b815260206004820152602260248201527f496e6465782069732067726561746572207468616e206172726179206c656e676044820152610e8d60f31b60648201526084016107e7565b60068054611b579060019061220b565b81548110611b7557634e487b7160e01b600052603260045260246000fd5b600091825260209091200154600680546001600160a01b039092169183908110611baf57634e487b7160e01b600052603260045260246000fd5b9060005260206000200160006101000a8154816001600160a01b0302191690836001600160a01b031602179055506006805480611bfc57634e487b7160e01b600052603160045260246000fd5b600082815260209020810160001990810180546001600160a01b031916905501905550565b8015611c5f576040516001600160a01b0383169082156108fc029083906000818181858888f19350505050158015611c5d573d6000803e3d6000fd5b505b5050565b600080805b600654811015611cd857611cba60068281548110611c9657634e487b7160e01b600052603260045260246000fd5b60009182526020808320909101546001600160a01b03168252819052604090205490565b611cc490836121b4565b915080611cd081612257565b915050611c68565b50919050565b60008183611cff5760405162461bcd60e51b81526004016107e791906120f0565b50600061195d84866121cc565b6012805460ff60a01b1916600160a01b179055600b54600954600091611d329190611519565b905080611d3f5750611e68565b47611d4983611966565b6000611d554783611ecc565b90508015611e64576000611d7884611252600b548561145190919063ffffffff16565b9050600081118015611d945750600e546001600160a01b031615155b15611df457600e5460405163febd221b60e01b8152600060048201526001600160a01b039091169063febd221b9083906024016000604051808303818588803b158015611de057600080fd5b505af193505050508015611df2575060015b505b6000611e0f856112526009548661145190919063ffffffff16565b600d54909150611e28906001600160a01b031682611c21565b60408051878152602081018590527f3736f4ec17d19b9b4f0fbeeb377db969da082d70e2e16221f77d5b321570e8c7910160405180910390a150505b5050505b506012805460ff60a01b19169055565b6009541580611e875750600b54155b15611e8e57565b60098054600a55600b8054600c5560009182905555565b6000806000611eb384611f3b565b90506000611ec18583611ecc565b959194509092505050565b60006114d083836040518060400160405280601e81526020017f536166654d6174683a207375627472616374696f6e206f766572666c6f77000081525061192c565b30600090815260208190526040902054611f289082611519565b3060009081526020819052604090205550565b600080611f55600b5460095461151990919063ffffffff16565b90506114d060646112528584611451565b600060208284031215611f77578081fd5b81356114d081612288565b600060208284031215611f93578081fd5b81516114d081612288565b60008060408385031215611fb0578081fd5b8235611fbb81612288565b91506020830135611fcb81612288565b809150509250929050565b600080600060608486031215611fea578081fd5b8335611ff581612288565b9250602084013561200581612288565b929592945050506040919091013590565b60008060408385031215612028578182fd5b823561203381612288565b946020939093013593505050565b600060208284031215612052578081fd5b813580151581146114d0578182fd5b600060208284031215612072578081fd5b5035919050565b6000806040838503121561208b578182fd5b50508035926020909101359150565b6000815180845260208085019450808401835b838110156120d25781516001600160a01b0316875295820195908201906001016120ad565b509495945050505050565b6020815260006114d0602083018461209a565b6000602080835283518082850152825b8181101561211c57858101830151858201604001528201612100565b8181111561212d5783604083870101525b50601f01601f1916929092016040019392505050565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b85815284602082015260a06040820152600061219760a083018661209a565b6001600160a01b0394909416606083015250608001529392505050565b600082198211156121c7576121c7612272565b500190565b6000826121e757634e487b7160e01b81526012600452602481fd5b500490565b600081600019048311821515161561220657612206612272565b500290565b60008282101561221d5761221d612272565b500390565b600181811c9082168061223657607f821691505b60208210811415611cd857634e487b7160e01b600052602260045260246000fd5b600060001982141561226b5761226b612272565b5060010190565b634e487b7160e01b600052601160045260246000fd5b6001600160a01b0381168114610e9757600080fdfe45524332303a207472616e7366657220616d6f756e74206578636565647320616c6c6f77616e636545524332303a2064656372656173656420616c6c6f77616e63652062656c6f77207a65726fa264697066735822122047f2b7bbd6b8aad79903148b6f08b2115008e769e5aa4ae617630de339ca153b64736f6c63430008040033ddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef
Deployed Bytecode
0x60806040526004361061021e5760003560e01c806351bc3c8511610123578063a457c2d7116100ab578063dd62ed3e1161006f578063dd62ed3e14610664578063ea2f0b37146106aa578063f2fde38b146106ca578063f4293890146106ea578063fffa1dd9146106ff57600080fd5b8063a457c2d7146105c2578063a9059cbb146105e2578063ada46d0a14610602578063b609995e14610624578063d543dbeb1461064457600080fd5b806370a08231116100f257806370a082311461052e578063715018a6146105645780638c0b5e22146105795780638da5cb5b1461058f57806395d89b41146105ad57600080fd5b806351bc3c85146104aa5780635342acb4146104bf5780635c7b2258146104f85780636827e7641461051857600080fd5b806323b872dd116101a65780633950935111610175578063395093511461040a57806341cb87fc1461042a578063437823ec1461044a57806348a464731461046a57806349bd5a5e1461048a57600080fd5b806323b872dd1461039857806326b6308d146103b85780632bb14e1d146103d8578063313ce567146103ee57600080fd5b80630e832273116101ed5780630e832273146102c7578063111e037614610300578063113201fa146103205780631694505e1461034157806318160ddd1461037957600080fd5b806306fdde031461022a578063095ea7b3146102555780630a1f8ea8146102855780630b78f9c0146102a757600080fd5b3661022557005b600080fd5b34801561023657600080fd5b5061023f610714565b60405161024c91906120f0565b60405180910390f35b34801561026157600080fd5b50610275610270366004612016565b6107a6565b604051901515815260200161024c565b34801561029157600080fd5b506102a56102a0366004611f66565b6107bd565b005b3480156102b357600080fd5b506102a56102c2366004612079565b610845565b3480156102d357600080fd5b506102756102e2366004611f66565b6001600160a01b031660009081526007602052604090205460ff1690565b34801561030c57600080fd5b506102a561031b366004611f66565b61091f565b34801561032c57600080fd5b5060125461027590600160a81b900460ff1681565b34801561034d57600080fd5b50601154610361906001600160a01b031681565b6040516001600160a01b03909116815260200161024c565b34801561038557600080fd5b506002545b60405190815260200161024c565b3480156103a457600080fd5b506102756103b3366004611fd6565b610a57565b3480156103c457600080fd5b506102a56103d3366004612041565b610ac0565b3480156103e457600080fd5b5061038a600b5481565b3480156103fa57600080fd5b506040516009815260200161024c565b34801561041657600080fd5b50610275610425366004612016565b610b37565b34801561043657600080fd5b506102a5610445366004611f66565b610b6d565b34801561045657600080fd5b506102a5610465366004611f66565b610d6b565b34801561047657600080fd5b506102a5610485366004612061565b610de9565b34801561049657600080fd5b50601254610361906001600160a01b031681565b3480156104b657600080fd5b506102a5610e54565b3480156104cb57600080fd5b506102756104da366004611f66565b6001600160a01b03166000908152600f602052604090205460ff1690565b34801561050457600080fd5b506102a5610513366004611f66565b610e9a565b34801561052457600080fd5b5061038a60095481565b34801561053a57600080fd5b5061038a610549366004611f66565b6001600160a01b031660009081526020819052604090205490565b34801561057057600080fd5b506102a5610f12565b34801561058557600080fd5b5061038a60085481565b34801561059b57600080fd5b506005546001600160a01b0316610361565b3480156105b957600080fd5b5061023f610f86565b3480156105ce57600080fd5b506102756105dd366004612016565b610f95565b3480156105ee57600080fd5b506102756105fd366004612016565b610fe4565b34801561060e57600080fd5b50610617610ff1565b60405161024c91906120dd565b34801561063057600080fd5b506102a561063f366004611f66565b611052565b34801561065057600080fd5b506102a561065f366004612061565b6111bd565b34801561067057600080fd5b5061038a61067f366004611f9e565b6001600160a01b03918216600090815260016020908152604080832093909416825291909152205490565b3480156106b657600080fd5b506102a56106c5366004611f66565b61128d565b3480156106d657600080fd5b506102a56106e5366004611f66565b611308565b3480156106f657600080fd5b506102a56113f3565b34801561070b57600080fd5b5061038a611435565b60606003805461072390612222565b80601f016020809104026020016040519081016040528092919081815260200182805461074f90612222565b801561079c5780601f106107715761010080835404028352916020019161079c565b820191906000526020600020905b81548152906001019060200180831161077f57829003601f168201915b5050505050905090565b60006107b3338484611578565b5060015b92915050565b6005546001600160a01b031633146107f05760405162461bcd60e51b81526004016107e790612143565b60405180910390fd5b600d80546001600160a01b0319166001600160a01b0383169081179091556040519081527f31bb1993faff4f8409d7baad771f861e093ef4ce2c92c6e0cb10b82d1c7324cb906020015b60405180910390a150565b6005546001600160a01b0316331461086f5760405162461bcd60e51b81526004016107e790612143565b600a82111580156108815750600a8111155b6108d75760405162461bcd60e51b815260206004820152602160248201527f4665657320657863656564206d6178696d756d20616c6c6f7765642076616c756044820152606560f81b60648201526084016107e7565b6009829055600b81905560408051838152602081018390527f64f84976d9c917a44796104a59950fdbd9b3c16a5dd348b546d738301f6bd06891015b60405180910390a15050565b6005546001600160a01b031633146109495760405162461bcd60e51b81526004016107e790612143565b6001600160a01b03811660009081526007602052604090205460ff16156109c35760405162461bcd60e51b815260206004820152602860248201527f4164647265737320697320616c7265616479206578636c756465642066726f6d604482015267207265776172647360c01b60648201526084016107e7565b6006805460018082019092557ff652222313e28459528d920b65115c16c04f3efc82aaedc97be59f3f377c0d3f0180546001600160a01b0319166001600160a01b038416908117909155600081815260076020908152604091829020805460ff1916909417909355519081527f9dc0c5d829ba95d4a3aa3e40791b3e0ff125f876788532b9f7f6eb543d8dfbd6910161083a565b6000610a6484848461169c565b610ab68433610ab18560405180606001604052806028815260200161229e602891396001600160a01b038a166000908152600160209081526040808320338452909152902054919061192c565b611578565b5060019392505050565b6005546001600160a01b03163314610aea5760405162461bcd60e51b81526004016107e790612143565b60128054821515600160a81b0260ff60a81b199091161790556040517fd9fca2a469120637ae54e43ab68dfdcd9354db52d615dea3d3a66a085e6f41b99061083a90831515815260200190565b3360008181526001602090815260408083206001600160a01b038716845290915281205490916107b3918590610ab19086611519565b6005546001600160a01b03163314610b975760405162461bcd60e51b81526004016107e790612143565b6000819050806001600160a01b031663c45a01556040518163ffffffff1660e01b815260040160206040518083038186803b158015610bd557600080fd5b505afa158015610be9573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610c0d9190611f82565b6001600160a01b031663c9c6539630836001600160a01b031663ad5c46486040518163ffffffff1660e01b815260040160206040518083038186803b158015610c5557600080fd5b505afa158015610c69573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610c8d9190611f82565b6040516001600160e01b031960e085901b1681526001600160a01b03928316600482015291166024820152604401602060405180830381600087803b158015610cd557600080fd5b505af1158015610ce9573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610d0d9190611f82565b601280546001600160a01b03199081166001600160a01b03938416179091556011805490911683831617905560405190831681527f7aed1d3e8155a07ccf395e44ea3109a0e2d6c9b29bbbe9f142d9790596f4dc8090602001610913565b6005546001600160a01b03163314610d955760405162461bcd60e51b81526004016107e790612143565b6001600160a01b0381166000818152600f6020908152604091829020805460ff1916600117905590519182527f57a00f76b5f242fb1e04b0b514a6974665a5b07bce45e39f36dabff4a042d936910161083a565b6005546001600160a01b03163314610e135760405162461bcd60e51b81526004016107e790612143565b610e2181633b9aca006121ec565b6013556040518181527f5948780118f41f7c4577ae4619d5cbd064057bd8562d9f7b7e60324053375c009060200161083a565b6005546001600160a01b03163314610e7e5760405162461bcd60e51b81526004016107e790612143565b30600090815260208190526040902054610e9781611966565b50565b6005546001600160a01b03163314610ec45760405162461bcd60e51b81526004016107e790612143565b600e80546001600160a01b0319166001600160a01b0383169081179091556040519081527f535be0bbc71c839ded01277ab57f29f2e810c1ff0255bb938d7cb8e96ac8ca1a9060200161083a565b6005546001600160a01b03163314610f3c5760405162461bcd60e51b81526004016107e790612143565b6005546040516000916001600160a01b0316907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908390a3600580546001600160a01b0319169055565b60606004805461072390612222565b60006107b33384610ab1856040518060600160405280602581526020016122c6602591393360009081526001602090815260408083206001600160a01b038d168452909152902054919061192c565b60006107b333848461169c565b6060600680548060200260200160405190810160405280929190818152602001828054801561079c57602002820191906000526020600020905b81546001600160a01b0316815260019091019060200180831161102b575050505050905090565b6005546001600160a01b0316331461107c5760405162461bcd60e51b81526004016107e790612143565b6001600160a01b03811660009081526007602052604090205460ff166110f05760405162461bcd60e51b8152602060048201526024808201527f41646472657373206973206e6f74206578636c756465642066726f6d207265776044820152636172647360e01b60648201526084016107e7565b60005b60065481101561118357816001600160a01b03166006828154811061112857634e487b7160e01b600052603260045260246000fd5b6000918252602090912001546001600160a01b03161415611171576001600160a01b0382166000908152600760205260409020805460ff1916905561116c81611aeb565b611183565b8061117b81612257565b9150506110f3565b506040516001600160a01b03821681527f87434094d24a90fbd9a8ffcf2be9818d237c06a12d126296bc1ea7d5895943349060200161083a565b6005546001600160a01b031633146111e75760405162461bcd60e51b81526004016107e790612143565b60058110156112385760405162461bcd60e51b815260206004820152601b60248201527f4d61782054582073686f756c642062652061626f766520302e3525000000000060448201526064016107e7565b6112586103e861125269152d02c7e14af680000084611451565b906114d7565b60088190556040519081527f947f344d56e1e8c70dc492fb94c4ddddd490c016aab685f5e7e47b2e85cb44cf9060200161083a565b6005546001600160a01b031633146112b75760405162461bcd60e51b81526004016107e790612143565b6001600160a01b0381166000818152600f6020908152604091829020805460ff1916905590519182527f346f6c42af1ce4b7d7951f3fa40a2fb1e78c80ab0f3d76fb4f9fec269d568f0d910161083a565b6005546001600160a01b031633146113325760405162461bcd60e51b81526004016107e790612143565b6001600160a01b0381166113975760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b60648201526084016107e7565b6005546040516001600160a01b038084169216907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a3600580546001600160a01b0319166001600160a01b0392909216919091179055565b6005546001600160a01b0316331461141d5760405162461bcd60e51b81526004016107e790612143565b600d544790610e97906001600160a01b031682611c21565b600061143f611c63565b60025461144c919061220b565b905090565b600082611460575060006107b7565b600061146c83856121ec565b90508261147985836121cc565b146114d05760405162461bcd60e51b815260206004820152602160248201527f536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f6044820152607760f81b60648201526084016107e7565b9392505050565b60006114d083836040518060400160405280601a81526020017f536166654d6174683a206469766973696f6e206279207a65726f000000000000815250611cde565b60008061152683856121b4565b9050838110156114d05760405162461bcd60e51b815260206004820152601b60248201527f536166654d6174683a206164646974696f6e206f766572666c6f77000000000060448201526064016107e7565b6001600160a01b0383166115da5760405162461bcd60e51b8152602060048201526024808201527f45524332303a20617070726f76652066726f6d20746865207a65726f206164646044820152637265737360e01b60648201526084016107e7565b6001600160a01b03821661163b5760405162461bcd60e51b815260206004820152602260248201527f45524332303a20617070726f766520746f20746865207a65726f206164647265604482015261737360f01b60648201526084016107e7565b6001600160a01b0383811660008181526001602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925910160405180910390a3505050565b6001600160a01b03831660009081526010602052604090205460ff161580156116de57506001600160a01b03821660009081526010602052604090205460ff16155b15611745576008548111156117455760405162461bcd60e51b815260206004820152602760248201527f5472616e7366657220616d6f756e74206578636565647320746865206d6178546044820152661e105b5bdd5b9d60ca1b60648201526084016107e7565b30600090815260208190526040902054601354811080159081906117735750601254600160a01b900460ff16155b801561178d57506012546001600160a01b03868116911614155b80156117a25750601254600160a81b900460ff165b156117b0576117b082611d0c565b6001600160a01b0385166000908152600f602052604090205460ff16806117ef57506001600160a01b0384166000908152600f602052604090205460ff165b156117fc576117fc611e78565b60008061180885611ea5565b6001600160a01b03891660009081526020819052604090205491935091506118309086611ecc565b6001600160a01b03808916600090815260208190526040808220939093559088168152205461185f9083611519565b6001600160a01b03871660009081526020819052604090205561188181611f0e565b6001600160a01b0387166000908152600f602052604090205460ff16806118c057506001600160a01b0386166000908152600f602052604090205460ff165b156118d6576118d6600a54600955600c54600b55565b856001600160a01b0316876001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef8460405161191b91815260200190565b60405180910390a350505050505050565b600081848411156119505760405162461bcd60e51b81526004016107e791906120f0565b50600061195d848661220b565b95945050505050565b60408051600280825260608201835260009260208301908036833701905050905030816000815181106119a957634e487b7160e01b600052603260045260246000fd5b6001600160a01b03928316602091820292909201810191909152601154604080516315ab88c960e31b81529051919093169263ad5c4648926004808301939192829003018186803b1580156119fd57600080fd5b505afa158015611a11573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611a359190611f82565b81600181518110611a5657634e487b7160e01b600052603260045260246000fd5b6001600160a01b039283166020918202929092010152601154611a7c9130911684611578565b60115460405163791ac94760e01b81526001600160a01b039091169063791ac94790611ab5908590600090869030904290600401612178565b600060405180830381600087803b158015611acf57600080fd5b505af1158015611ae3573d6000803e3d6000fd5b505050505050565b6006548110611b475760405162461bcd60e51b815260206004820152602260248201527f496e6465782069732067726561746572207468616e206172726179206c656e676044820152610e8d60f31b60648201526084016107e7565b60068054611b579060019061220b565b81548110611b7557634e487b7160e01b600052603260045260246000fd5b600091825260209091200154600680546001600160a01b039092169183908110611baf57634e487b7160e01b600052603260045260246000fd5b9060005260206000200160006101000a8154816001600160a01b0302191690836001600160a01b031602179055506006805480611bfc57634e487b7160e01b600052603160045260246000fd5b600082815260209020810160001990810180546001600160a01b031916905501905550565b8015611c5f576040516001600160a01b0383169082156108fc029083906000818181858888f19350505050158015611c5d573d6000803e3d6000fd5b505b5050565b600080805b600654811015611cd857611cba60068281548110611c9657634e487b7160e01b600052603260045260246000fd5b60009182526020808320909101546001600160a01b03168252819052604090205490565b611cc490836121b4565b915080611cd081612257565b915050611c68565b50919050565b60008183611cff5760405162461bcd60e51b81526004016107e791906120f0565b50600061195d84866121cc565b6012805460ff60a01b1916600160a01b179055600b54600954600091611d329190611519565b905080611d3f5750611e68565b47611d4983611966565b6000611d554783611ecc565b90508015611e64576000611d7884611252600b548561145190919063ffffffff16565b9050600081118015611d945750600e546001600160a01b031615155b15611df457600e5460405163febd221b60e01b8152600060048201526001600160a01b039091169063febd221b9083906024016000604051808303818588803b158015611de057600080fd5b505af193505050508015611df2575060015b505b6000611e0f856112526009548661145190919063ffffffff16565b600d54909150611e28906001600160a01b031682611c21565b60408051878152602081018590527f3736f4ec17d19b9b4f0fbeeb377db969da082d70e2e16221f77d5b321570e8c7910160405180910390a150505b5050505b506012805460ff60a01b19169055565b6009541580611e875750600b54155b15611e8e57565b60098054600a55600b8054600c5560009182905555565b6000806000611eb384611f3b565b90506000611ec18583611ecc565b959194509092505050565b60006114d083836040518060400160405280601e81526020017f536166654d6174683a207375627472616374696f6e206f766572666c6f77000081525061192c565b30600090815260208190526040902054611f289082611519565b3060009081526020819052604090205550565b600080611f55600b5460095461151990919063ffffffff16565b90506114d060646112528584611451565b600060208284031215611f77578081fd5b81356114d081612288565b600060208284031215611f93578081fd5b81516114d081612288565b60008060408385031215611fb0578081fd5b8235611fbb81612288565b91506020830135611fcb81612288565b809150509250929050565b600080600060608486031215611fea578081fd5b8335611ff581612288565b9250602084013561200581612288565b929592945050506040919091013590565b60008060408385031215612028578182fd5b823561203381612288565b946020939093013593505050565b600060208284031215612052578081fd5b813580151581146114d0578182fd5b600060208284031215612072578081fd5b5035919050565b6000806040838503121561208b578182fd5b50508035926020909101359150565b6000815180845260208085019450808401835b838110156120d25781516001600160a01b0316875295820195908201906001016120ad565b509495945050505050565b6020815260006114d0602083018461209a565b6000602080835283518082850152825b8181101561211c57858101830151858201604001528201612100565b8181111561212d5783604083870101525b50601f01601f1916929092016040019392505050565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b85815284602082015260a06040820152600061219760a083018661209a565b6001600160a01b0394909416606083015250608001529392505050565b600082198211156121c7576121c7612272565b500190565b6000826121e757634e487b7160e01b81526012600452602481fd5b500490565b600081600019048311821515161561220657612206612272565b500290565b60008282101561221d5761221d612272565b500390565b600181811c9082168061223657607f821691505b60208210811415611cd857634e487b7160e01b600052602260045260246000fd5b600060001982141561226b5761226b612272565b5060010190565b634e487b7160e01b600052601160045260246000fd5b6001600160a01b0381168114610e9757600080fdfe45524332303a207472616e7366657220616d6f756e74206578636565647320616c6c6f77616e636545524332303a2064656372656173656420616c6c6f77616e63652062656c6f77207a65726fa264697066735822122047f2b7bbd6b8aad79903148b6f08b2115008e769e5aa4ae617630de339ca153b64736f6c63430008040033
Deployed Bytecode Sourcemap
243:9998:1:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2168:98:3;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;4265:166;;;;;;;;;;-1:-1:-1;4265:166:3;;;;;:::i;:::-;;:::i;:::-;;;4404:14:12;;4397:22;4379:41;;4367:2;4352:18;4265:166:3;4334:92:12;8699:186:1;;;;;;;;;;-1:-1:-1;8699:186:1;;;;;:::i;:::-;;:::i;:::-;;8398:295;;;;;;;;;;-1:-1:-1;8398:295:1;;;;;:::i;:::-;;:::i;1694:125:10:-;;;;;;;;;;-1:-1:-1;1694:125:10;;;;;:::i;:::-;-1:-1:-1;;;;;1787:25:10;1764:4;1787:25;;;:17;:25;;;;;;;;;1694:125;952:282;;;;;;;;;;-1:-1:-1;952:282:10;;;;;:::i;:::-;;:::i;1197:48:1:-;;;;;;;;;;-1:-1:-1;1197:48:1;;;;-1:-1:-1;;;1197:48:1;;;;;;1089:39;;;;;;;;;;-1:-1:-1;1089:39:1;;;;-1:-1:-1;;;;;1089:39:1;;;;;;-1:-1:-1;;;;;3404:32:12;;;3386:51;;3374:2;3359:18;1089:39:1;3341:102:12;3256:106:3;;;;;;;;;;-1:-1:-1;3343:12:3;;3256:106;;;10135:25:12;;;10123:2;10108:18;3256:106:3;10090:76:12;4898:347:3;;;;;;;;;;-1:-1:-1;4898:347:3;;;;;:::i;:::-;;:::i;9499:184:1:-;;;;;;;;;;-1:-1:-1;9499:184:1;;;;;:::i;:::-;;:::i;667:29::-;;;;;;;;;;;;;;;;3112:90;;;;;;;;;;-1:-1:-1;3112:90:1;;3194:1;11153:36:12;;11141:2;11126:18;3112:90:1;11108:87:12;5640:215:3;;;;;;;;;;-1:-1:-1;5640:215:3;;;;;:::i;:::-;;:::i;9127:366:1:-;;;;;;;;;;-1:-1:-1;9127:366:1;;;;;:::i;:::-;;:::i;8089:150::-;;;;;;;;;;-1:-1:-1;8089:150:1;;;;;:::i;:::-;;:::i;9689:178::-;;;;;;;;;;-1:-1:-1;9689:178:1;;;;;:::i;:::-;;:::i;1134:28::-;;;;;;;;;;-1:-1:-1;1134:28:1;;;;-1:-1:-1;;;;;1134:28:1;;;9910:151;;;;;;;;;;;;;:::i;7959:124::-;;;;;;;;;;-1:-1:-1;7959:124:1;;;;;:::i;:::-;-1:-1:-1;;;;;8049:27:1;8026:4;8049:27;;;:18;:27;;;;;;;;;7959:124;8895:226;;;;;;;;;;-1:-1:-1;8895:226:1;;;;;:::i;:::-;;:::i;585:25::-;;;;;;;;;;;;;;;;3420:125:3;;;;;;;;;;-1:-1:-1;3420:125:3;;;;;:::i;:::-;-1:-1:-1;;;;;3520:18:3;3494:7;3520:18;;;;;;;;;;;;3420:125;1696:147:9;;;;;;;;;;;;;:::i;512:58:1:-;;;;;;;;;;;;;;;;1073:77:9;;;;;;;;;;-1:-1:-1;1137:6:9;;-1:-1:-1;;;;;1137:6:9;1073:77;;2379:102:3;;;;;;;;;;;;;:::i;6342:266::-;;;;;;;;;;-1:-1:-1;6342:266:3;;;;;:::i;:::-;;:::i;3748:172::-;;;;;;;;;;-1:-1:-1;3748:172:3;;;;;:::i;:::-;;:::i;1829:121:10:-;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;1244:440::-;;;;;;;;;;-1:-1:-1;1244:440:10;;;;;:::i;:::-;;:::i;7713:236:1:-;;;;;;;;;;-1:-1:-1;7713:236:1;;;;;:::i;:::-;;:::i;3978:149:3:-;;;;;;;;;;-1:-1:-1;3978:149:3;;;;;:::i;:::-;-1:-1:-1;;;;;4093:18:3;;;4067:7;4093:18;;;:11;:18;;;;;;;;:27;;;;;;;;;;;;;3978:149;8245:147:1;;;;;;;;;;-1:-1:-1;8245:147:1;;;;;:::i;:::-;;:::i;1992:276:9:-;;;;;;;;;;-1:-1:-1;1992:276:9;;;;;:::i;:::-;;:::i;10067:172:1:-;;;;;;;;;;;;;:::i;1960:118:10:-;;;;;;;;;;;;;:::i;2168:98:3:-;2222:13;2254:5;2247:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2168:98;:::o;4265:166::-;4348:4;4364:39;169:10:2;4387:7:3;4396:6;4364:8;:39::i;:::-;-1:-1:-1;4420:4:3;4265:166;;;;;:::o;8699:186:1:-;1277:6:9;;-1:-1:-1;;;;;1277:6:9;169:10:2;1277:22:9;1269:67;;;;-1:-1:-1;;;1269:67:9;;;;;;;:::i;:::-;;;;;;;;;8801:17:1::1;:32:::0;;-1:-1:-1;;;;;;8801:32:1::1;-1:-1:-1::0;;;;;8801:32:1;::::1;::::0;;::::1;::::0;;;8848:30:::1;::::0;3386:51:12;;;8848:30:1::1;::::0;3374:2:12;3359:18;8848:30:1::1;;;;;;;;8699:186:::0;:::o;8398:295::-;1277:6:9;;-1:-1:-1;;;;;1277:6:9;169:10:2;1277:22:9;1269:67;;;;-1:-1:-1;;;1269:67:9;;;;;;;:::i;:::-;8507:2:1::1;8494:9;:15;;:38;;;;;8530:2;8513:13;:19;;8494:38;8486:84;;;::::0;-1:-1:-1;;;8486:84:1;;7448:2:12;8486:84:1::1;::::0;::::1;7430:21:12::0;7487:2;7467:18;;;7460:30;7526:34;7506:18;;;7499:62;-1:-1:-1;;;7577:18:12;;;7570:31;7618:19;;8486:84:1::1;7420:223:12::0;8486:84:1::1;8580:6;:18:::0;;;8608:10:::1;:26:::0;;;8649:37:::1;::::0;;10932:25:12;;;10988:2;10973:18;;10966:34;;;8649:37:1::1;::::0;10905:18:12;8649:37:1::1;;;;;;;;8398:295:::0;;:::o;952:282:10:-;1277:6:9;;-1:-1:-1;;;;;1277:6:9;169:10:2;1277:22:9;1269:67;;;;-1:-1:-1;;;1269:67:9;;;;;;;:::i;:::-;-1:-1:-1;;;;;1032:25:10;::::1;;::::0;;;:17:::1;:25;::::0;;;;;::::1;;1031:26;1023:79;;;::::0;-1:-1:-1;;;1023:79:10;;8608:2:12;1023:79:10::1;::::0;::::1;8590:21:12::0;8647:2;8627:18;;;8620:30;8686:34;8666:18;;;8659:62;-1:-1:-1;;;8737:18:12;;;8730:38;8785:19;;1023:79:10::1;8580:230:12::0;1023:79:10::1;1112:19;:32:::0;;::::1;::::0;;::::1;::::0;;;;::::1;::::0;;-1:-1:-1;;;;;;1112:32:10::1;-1:-1:-1::0;;;;;1112:32:10;::::1;::::0;;::::1;::::0;;;-1:-1:-1;1154:25:10;;;:17:::1;1112:32;1154:25:::0;;;;;;;;:32;;-1:-1:-1;;1154:32:10::1;::::0;;::::1;::::0;;;1201:26;3386:51:12;;;1201:26:10::1;::::0;3359:18:12;1201:26:10::1;3341:102:12::0;4898:347:3;5034:4;5050:36;5060:6;5068:9;5079:6;5050:9;:36::i;:::-;5096:121;5105:6;169:10:2;5127:89:3;5165:6;5127:89;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;5127:19:3;;;;;;:11;:19;;;;;;;;169:10:2;5127:33:3;;;;;;;;;;:37;:89::i;:::-;5096:8;:121::i;:::-;-1:-1:-1;5234:4:3;4898:347;;;;;:::o;9499:184:1:-;1277:6:9;;-1:-1:-1;;;;;1277:6:9;169:10:2;1277:22:9;1269:67;;;;-1:-1:-1;;;1269:67:9;;;;;;;:::i;:::-;9584:29:1::1;:39:::0;;;::::1;;-1:-1:-1::0;;;9584:39:1::1;-1:-1:-1::0;;;;9584:39:1;;::::1;;::::0;;9638:38:::1;::::0;::::1;::::0;::::1;::::0;9616:7;4404:14:12;4397:22;4379:41;;4367:2;4352:18;;4334:92;5640:215:3;169:10:2;5728:4:3;5776:25;;;:11;:25;;;;;;;;-1:-1:-1;;;;;5776:34:3;;;;;;;;;;5728:4;;5744:83;;5767:7;;5776:50;;5815:10;5776:38;:50::i;9127:366:1:-;1277:6:9;;-1:-1:-1;;;;;1277:6:9;169:10:2;1277:22:9;1269:67;;;;-1:-1:-1;;;1269:67:9;;;;;;;:::i;:::-;9201:34:1::1;9255:9;9201:64;;9309:17;-1:-1:-1::0;;;;;9309:25:1::1;;:27;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1::0;;;;;9291:70:1::1;;9370:4;9377:17;-1:-1:-1::0;;;;;9377:22:1::1;;:24;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;9291:111;::::0;-1:-1:-1;;;;;;9291:111:1::1;::::0;;;;;;-1:-1:-1;;;;;3894:15:12;;;9291:111:1::1;::::0;::::1;3876:34:12::0;3946:15;;3926:18;;;3919:43;3811:18;;9291:111:1::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;9275:13;:127:::0;;-1:-1:-1;;;;;;9275:127:1;;::::1;-1:-1:-1::0;;;;;9275:127:1;;::::1;;::::0;;;9412:15:::1;:35:::0;;;;::::1;::::0;;::::1;;::::0;;9462:24:::1;::::0;3404:32:12;;;3386:51;;9462:24:1::1;::::0;3374:2:12;3359:18;9462:24:1::1;3341:102:12::0;8089:150:1;1277:6:9;;-1:-1:-1;;;;;1277:6:9;169:10:2;1277:22:9;1269:67;;;;-1:-1:-1;;;1269:67:9;;;;;;;:::i;:::-;-1:-1:-1;;;;;8159:27:1;::::1;;::::0;;;:18:::1;:27;::::0;;;;;;;;:34;;-1:-1:-1;;8159:34:1::1;8189:4;8159:34;::::0;;8208:24;;3386:51:12;;;8208:24:1::1;::::0;3359:18:12;8208:24:1::1;3341:102:12::0;9689:178:1;1277:6:9;;-1:-1:-1;;;;;1277:6:9;169:10:2;1277:22:9;1269:67;;;;-1:-1:-1;;;1269:67:9;;;;;;;:::i;:::-;9791:17:1::1;:9:::0;9803:5:::1;9791:17;:::i;:::-;9769:19;:39:::0;9823:37:::1;::::0;10135:25:12;;;9823:37:1::1;::::0;10123:2:12;10108:18;9823:37:1::1;10090:76:12::0;9910:151:1;1277:6:9;;-1:-1:-1;;;;;1277:6:9;169:10:2;1277:22:9;1269:67;;;;-1:-1:-1;;;1269:67:9;;;;;;;:::i;:::-;10005:4:1::1;9961:23;3520:18:3::0;;;;;;;;;;;10021:33:1::1;3520:18:3::0;10021:16:1::1;:33::i;:::-;1346:1:9;9910:151:1:o:0;8895:226::-;1277:6:9;;-1:-1:-1;;;;;1277:6:9;169:10:2;1277:22:9;1269:67;;;;-1:-1:-1;;;1269:67:9;;;;;;;:::i;:::-;9007:15:1::1;:52:::0;;-1:-1:-1;;;;;;9007:52:1::1;-1:-1:-1::0;;;;;9007:52:1;::::1;::::0;;::::1;::::0;;;9074:40:::1;::::0;3386:51:12;;;9074:40:1::1;::::0;3374:2:12;3359:18;9074:40:1::1;3341:102:12::0;1696:147:9;1277:6;;-1:-1:-1;;;;;1277:6:9;169:10:2;1277:22:9;1269:67;;;;-1:-1:-1;;;1269:67:9;;;;;;;:::i;:::-;1788:6:::1;::::0;1767:40:::1;::::0;1804:1:::1;::::0;-1:-1:-1;;;;;1788:6:9::1;::::0;1767:40:::1;::::0;1804:1;;1767:40:::1;1817:6;:19:::0;;-1:-1:-1;;;;;;1817:19:9::1;::::0;;1696:147::o;2379:102:3:-;2435:13;2467:7;2460:14;;;;;:::i;6342:266::-;6435:4;6451:129;169:10:2;6474:7:3;6483:96;6522:15;6483:96;;;;;;;;;;;;;;;;;169:10:2;6483:25:3;;;;:11;:25;;;;;;;;-1:-1:-1;;;;;6483:34:3;;;;;;;;;;;;:38;:96::i;3748:172::-;3834:4;3850:42;169:10:2;3874:9:3;3885:6;3850:9;:42::i;1829:121:10:-;1889:16;1924:19;1917:26;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;1917:26:10;;;;;;;;;;;;;;;;;;;;;;1829:121;:::o;1244:440::-;1277:6:9;;-1:-1:-1;;;;;1277:6:9;169:10:2;1277:22:9;1269:67;;;;-1:-1:-1;;;1269:67:9;;;;;;;:::i;:::-;-1:-1:-1;;;;;1323:25:10;::::1;;::::0;;;:17:::1;:25;::::0;;;;;::::1;;1315:74;;;::::0;-1:-1:-1;;;1315:74:10;;7043:2:12;1315:74:10::1;::::0;::::1;7025:21:12::0;7082:2;7062:18;;;7055:30;7121:34;7101:18;;;7094:62;-1:-1:-1;;;7172:18:12;;;7165:34;7216:19;;1315:74:10::1;7015:226:12::0;1315:74:10::1;1404:6;1399:240;1420:19;:26:::0;1416:30;::::1;1399:240;;;1497:6;-1:-1:-1::0;;;;;1471:32:10::1;:19;1491:1;1471:22;;;;;;-1:-1:-1::0;;;1471:22:10::1;;;;;;;;;;::::0;;;::::1;::::0;;;::::1;::::0;-1:-1:-1;;;;;1471:22:10::1;:32;1467:162;;;-1:-1:-1::0;;;;;1523:25:10;::::1;1551:5;1523:25:::0;;;:17:::1;:25;::::0;;;;:33;;-1:-1:-1;;1523:33:10::1;::::0;;1574:17:::1;1589:1:::0;1574:14:::1;:17::i;:::-;1609:5;;1467:162;1448:3:::0;::::1;::::0;::::1;:::i;:::-;;;;1399:240;;;-1:-1:-1::0;1653:24:10::1;::::0;-1:-1:-1;;;;;3404:32:12;;3386:51;;1653:24:10::1;::::0;3374:2:12;3359:18;1653:24:10::1;3341:102:12::0;7713:236:1;1277:6:9;;-1:-1:-1;;;;;1277:6:9;169:10:2;1277:22:9;1269:67;;;;-1:-1:-1;;;1269:67:9;;;;;;;:::i;:::-;7803:1:1::1;7791:8;:13;;7783:53;;;::::0;-1:-1:-1;;;7783:53:1;;7850:2:12;7783:53:1::1;::::0;::::1;7832:21:12::0;7889:2;7869:18;;;7862:30;7928:29;7908:18;;;7901:57;7975:18;;7783:53:1::1;7822:177:12::0;7783:53:1::1;7860:36;7891:4;7860:26;481:25;7877:8:::0;7860:16:::1;:26::i;:::-;:30:::0;::::1;:36::i;:::-;7846:11;:50:::0;;;7911:31:::1;::::0;10135:25:12;;;7911:31:1::1;::::0;10123:2:12;10108:18;7911:31:1::1;10090:76:12::0;8245:147:1;1277:6:9;;-1:-1:-1;;;;;1277:6:9;169:10:2;1277:22:9;1269:67;;;;-1:-1:-1;;;1269:67:9;;;;;;;:::i;:::-;-1:-1:-1;;;;;8313:27:1;::::1;8343:5;8313:27:::0;;;:18:::1;:27;::::0;;;;;;;;:35;;-1:-1:-1;;8313:35:1::1;::::0;;8363:22;;3386:51:12;;;8363:22:1::1;::::0;3359:18:12;8363:22:1::1;3341:102:12::0;1992:276:9;1277:6;;-1:-1:-1;;;;;1277:6:9;169:10:2;1277:22:9;1269:67;;;;-1:-1:-1;;;1269:67:9;;;;;;;:::i;:::-;-1:-1:-1;;;;;2095:22:9;::::1;2074:107;;;::::0;-1:-1:-1;;;2074:107:9;;5474:2:12;2074:107:9::1;::::0;::::1;5456:21:12::0;5513:2;5493:18;;;5486:30;5552:34;5532:18;;;5525:62;-1:-1:-1;;;5603:18:12;;;5596:36;5649:19;;2074:107:9::1;5446:228:12::0;2074:107:9::1;2217:6;::::0;2196:38:::1;::::0;-1:-1:-1;;;;;2196:38:9;;::::1;::::0;2217:6:::1;::::0;2196:38:::1;::::0;2217:6:::1;::::0;2196:38:::1;2244:6;:17:::0;;-1:-1:-1;;;;;;2244:17:9::1;-1:-1:-1::0;;;;;2244:17:9;;;::::1;::::0;;;::::1;::::0;;1992:276::o;10067:172:1:-;1277:6:9;;-1:-1:-1;;;;;1277:6:9;169:10:2;1277:22:9;1269:67;;;;-1:-1:-1;;;1269:67:9;;;;;;;:::i;:::-;10194:17:1::1;::::0;10147:21:::1;::::0;10178:54:::1;::::0;-1:-1:-1;;;;;10194:17:1::1;10147:21:::0;10178:15:::1;:54::i;1960:118:10:-:0;2009:7;2050:21;:19;:21::i;:::-;2035:12;;:36;;;;:::i;:::-;2028:43;;1960:118;:::o;2211:459:11:-;2269:7;2510:6;2506:45;;-1:-1:-1;2539:1:11;2532:8;;2506:45;2561:9;2573:5;2577:1;2573;:5;:::i;:::-;2561:17;-1:-1:-1;2605:1:11;2596:5;2600:1;2561:17;2596:5;:::i;:::-;:10;2588:56;;;;-1:-1:-1;;;2588:56:11;;8206:2:12;2588:56:11;;;8188:21:12;8245:2;8225:18;;;8218:30;8284:34;8264:18;;;8257:62;-1:-1:-1;;;8335:18:12;;;8328:31;8376:19;;2588:56:11;8178:223:12;2588:56:11;2662:1;2211:459;-1:-1:-1;;;2211:459:11:o;3132:130::-;3190:7;3216:39;3220:1;3223;3216:39;;;;;;;;;;;;;;;;;:3;:39::i;875:176::-;933:7;;964:5;968:1;964;:5;:::i;:::-;952:17;;992:1;987;:6;;979:46;;;;-1:-1:-1;;;979:46:11;;6284:2:12;979:46:11;;;6266:21:12;6323:2;6303:18;;;6296:30;6362:29;6342:18;;;6335:57;6409:18;;979:46:11;6256:177:12;9441:370:3;-1:-1:-1;;;;;9572:19:3;;9564:68;;;;-1:-1:-1;;;9564:68:3;;9378:2:12;9564:68:3;;;9360:21:12;9417:2;9397:18;;;9390:30;9456:34;9436:18;;;9429:62;-1:-1:-1;;;9507:18:12;;;9500:34;9551:19;;9564:68:3;9350:226:12;9564:68:3;-1:-1:-1;;;;;9650:21:3;;9642:68;;;;-1:-1:-1;;;9642:68:3;;5881:2:12;9642:68:3;;;5863:21:12;5920:2;5900:18;;;5893:30;5959:34;5939:18;;;5932:62;-1:-1:-1;;;6010:18:12;;;6003:32;6052:19;;9642:68:3;5853:224:12;9642:68:3;-1:-1:-1;;;;;9721:18:3;;;;;;;:11;:18;;;;;;;;:27;;;;;;;;;;;;;:36;;;9772:32;;10135:25:12;;;9772:32:3;;10108:18:12;9772:32:3;;;;;;;9441:370;;;:::o;3208:1308:1:-;-1:-1:-1;;;;;3353:26:1;;;;;;:20;:26;;;;;;;;3352:27;:68;;;;-1:-1:-1;;;;;;3396:24:1;;;;;;:20;:24;;;;;;;;3395:25;3352:68;3335:260;;;3500:11;;3490:6;:21;;3465:119;;;;-1:-1:-1;;;3465:119:1;;9783:2:12;3465:119:1;;;9765:21:12;9822:2;9802:18;;;9795:30;9861:34;9841:18;;;9834:62;-1:-1:-1;;;9912:18:12;;;9905:37;9959:19;;3465:119:1;9755:229:12;3465:119:1;3683:4;3634:28;3520:18:3;;;;;;;;;;;3750:19:1;;3726:43;;;;;;;3796:53;;-1:-1:-1;3832:17:1;;-1:-1:-1;;;3832:17:1;;;;3831:18;3796:53;:90;;;;-1:-1:-1;3873:13:1;;-1:-1:-1;;;;;3865:21:1;;;3873:13;;3865:21;;3796:90;:135;;;;-1:-1:-1;3902:29:1;;-1:-1:-1;;;3902:29:1;;;;3796:135;3779:259;;;3983:44;4006:20;3983:22;:44::i;:::-;-1:-1:-1;;;;;4052:24:1;;;;;;:18;:24;;;;;;;;;:50;;-1:-1:-1;;;;;;4080:22:1;;;;;;:18;:22;;;;;;;;4052:50;4048:95;;;4118:14;:12;:14::i;:::-;4154:23;4179:12;4195:18;4206:6;4195:10;:18::i;:::-;-1:-1:-1;;;;;4241:15:1;;:9;:15;;;;;;;;;;;4153:60;;-1:-1:-1;4153:60:1;-1:-1:-1;4241:27:1;;4261:6;4241:19;:27::i;:::-;-1:-1:-1;;;;;4223:15:1;;;:9;:15;;;;;;;;;;;:45;;;;4294:13;;;;;;;:34;;4312:15;4294:17;:34::i;:::-;-1:-1:-1;;;;;4278:13:1;;:9;:13;;;;;;;;;;:50;4338:14;4347:4;4338:8;:14::i;:::-;-1:-1:-1;;;;;4367:24:1;;;;;;:18;:24;;;;;;;;;:50;;-1:-1:-1;;;;;;4395:22:1;;;;;;:18;:22;;;;;;;;4367:50;4363:96;;;4433:15;5471;;5462:6;:24;5509:19;;5496:10;:32;5419:116;4433:15;4489:2;-1:-1:-1;;;;;4474:35:1;4483:4;-1:-1:-1;;;;;4474:35:1;;4493:15;4474:35;;;;10135:25:12;;10123:2;10108:18;;10090:76;4474:35:1;;;;;;;;3208:1308;;;;;;;:::o;1747:217:11:-;1863:7;1898:12;1890:6;;;;1882:29;;;;-1:-1:-1;;;1882:29:11;;;;;;;;:::i;:::-;-1:-1:-1;1921:9:11;1933:5;1937:1;1933;:5;:::i;:::-;1921:17;1747:217;-1:-1:-1;;;;;1747:217:11:o;7089:573:1:-;7237:16;;;7251:1;7237:16;;;;;;;;7213:21;;7237:16;;;;;;;;;;-1:-1:-1;7237:16:1;7213:40;;7281:4;7263;7268:1;7263:7;;;;;;-1:-1:-1;;;7263:7:1;;;;;;;;;-1:-1:-1;;;;;7263:23:1;;;:7;;;;;;;;;;:23;;;;7306:15;;:22;;;-1:-1:-1;;;7306:22:1;;;;:15;;;;;:20;;:22;;;;;7263:7;;7306:22;;;;;:15;:22;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;7296:4;7301:1;7296:7;;;;;;-1:-1:-1;;;7296:7:1;;;;;;;;;-1:-1:-1;;;;;7296:32:1;;;:7;;;;;;;;;:32;7371:15;;7339:62;;7356:4;;7371:15;7389:11;7339:8;:62::i;:::-;7437:15;;:218;;-1:-1:-1;;;7437:218:1;;-1:-1:-1;;;;;7437:15:1;;;;:66;;:218;;7517:11;;7437:15;;7585:4;;7611;;7630:15;;7437:218;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;7089:573;;:::o;367:268:10:-;438:19;:26;430:34;;422:81;;;;-1:-1:-1;;;422:81:10;;6640:2:12;422:81:10;;;6622:21:12;6679:2;6659:18;;;6652:30;6718:34;6698:18;;;6691:62;-1:-1:-1;;;6769:18:12;;;6762:32;6811:19;;422:81:10;6612:224:12;422:81:10;542:19;562:26;;:30;;591:1;;562:30;:::i;:::-;542:51;;;;;;-1:-1:-1;;;542:51:10;;;;;;;;;;;;;;;;;;;513:19;:26;;-1:-1:-1;;;;;542:51:10;;;;533:5;;513:26;;;;-1:-1:-1;;;513:26:10;;;;;;;;;;;;;;;;;:80;;;;;-1:-1:-1;;;;;513:80:10;;;;;-1:-1:-1;;;;;513:80:10;;;;;;603:19;:25;;;;;-1:-1:-1;;;603:25:10;;;;;;;;;;;;;;;;;;-1:-1:-1;;603:25:10;;;;;-1:-1:-1;;;;;;603:25:10;;;;;;-1:-1:-1;367:268:10:o;6929:154:1:-;7008:10;;7004:73;;7034:32;;-1:-1:-1;;;;;7034:24:1;;;:32;;;;;7059:6;;7034:32;;;;7059:6;7034:24;:32;;;;;;;;;;;;;;;;;;;;;7004:73;6929:154;;:::o;645:297:10:-;699:7;;;761:137;782:19;:26;778:30;;761:137;;;854:33;864:19;884:1;864:22;;;;;;-1:-1:-1;;;864:22:10;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;864:22:10;3520:18:3;;;;;;;;;;3420:125;854:33:10;829:58;;;;:::i;:::-;;-1:-1:-1;810:3:10;;;;:::i;:::-;;;;761:137;;;-1:-1:-1;914:21:10;645:297;-1:-1:-1;645:297:10:o;3744:302:11:-;3860:7;3894:12;3887:5;3879:28;;;;-1:-1:-1;;;3879:28:11;;;;;;;;:::i;:::-;-1:-1:-1;3917:9:11;3929:5;3933:1;3929;:5;:::i;5541:1382:1:-;1965:17;:24;;-1:-1:-1;;;;1965:24:1;-1:-1:-1;;;1965:24:1;;;5691:10:::1;::::0;5680:6:::1;::::0;1965:24;;5680:22:::1;::::0;:6;:10:::1;:22::i;:::-;5653:49:::0;-1:-1:-1;5716:21:1;5712:34:::1;;5739:7;;;5712:34;6045:21;6108:38;6125:20:::0;6108:16:::1;:38::i;:::-;6157:18;6178:41;:21;6204:14:::0;6178:25:::1;:41::i;:::-;6157:62:::0;-1:-1:-1;6234:14:1;;6230:687:::1;;6332:22;6357:48;6388:16;6357:26;6372:10;;6357;:14;;:26;;;;:::i;:48::-;6332:73;;6440:1;6423:14;:18;:60;;;;-1:-1:-1::0;6453:15:1::1;::::0;-1:-1:-1;;;;;6453:15:1::1;6445:38:::0;::::1;6423:60;6419:194;;;6507:15;::::0;:80:::1;::::0;-1:-1:-1;;;6507:80:1;;:15:::1;:80;::::0;::::1;10135:25:12::0;-1:-1:-1;;;;;6507:15:1;;::::1;::::0;:29:::1;::::0;6544:14;;10108:18:12;;6507:80:1::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;6503:96:::0;::::1;6703:18;6724:44;6751:16;6724:22;6739:6;;6724:10;:14;;:22;;;;:::i;:44::-;6798:17;::::0;6703:65;;-1:-1:-1;6782:46:1::1;::::0;-1:-1:-1;;;;;6798:17:1::1;6703:65:::0;6782:15:::1;:46::i;:::-;6848:58;::::0;;10932:25:12;;;10988:2;10973:18;;10966:34;;;6848:58:1::1;::::0;10905:18:12;6848:58:1::1;;;;;;;6230:687;;;1999:1;;;;-1:-1:-1::0;2010:17:1;:25;;-1:-1:-1;;;;2010:25:1;;;5541:1382::o;5200:213::-;5246:6;;:11;;:30;;-1:-1:-1;5261:10:1;;:15;5246:30;5242:43;;;5200:213::o;5242:43::-;5313:6;;;5295:15;:24;5351:10;;;5329:19;:32;-1:-1:-1;5372:10:1;;;;5392:14;5200:213::o;4612:251::-;4695:7;4704;4727:12;4742:21;4755:7;4742:12;:21::i;:::-;4727:36;-1:-1:-1;4773:23:1;4799:17;:7;4727:36;4799:11;:17::i;:::-;4773:43;4851:4;;-1:-1:-1;4612:251:1;;-1:-1:-1;;;4612:251:1:o;1322:134:11:-;1380:7;1406:43;1410:1;1413;1406:43;;;;;;;;;;;;;;;;;:3;:43::i;4869:116:1:-;4963:4;4945:9;:24;;;;;;;;;;;:33;;4974:3;4945:28;:33::i;:::-;4936:4;4918:9;:24;;;;;;;;;;:60;-1:-1:-1;4869:116:1:o;4991:203::-;5076:7;5099:16;5118:22;5129:10;;5118:6;;:10;;:22;;;;:::i;:::-;5099:41;-1:-1:-1;5157:30:1;5183:3;5157:21;:7;5099:41;5157:11;:21::i;14:257:12:-;73:6;126:2;114:9;105:7;101:23;97:32;94:2;;;147:6;139;132:22;94:2;191:9;178:23;210:31;235:5;210:31;:::i;276:261::-;346:6;399:2;387:9;378:7;374:23;370:32;367:2;;;420:6;412;405:22;367:2;457:9;451:16;476:31;501:5;476:31;:::i;812:398::-;880:6;888;941:2;929:9;920:7;916:23;912:32;909:2;;;962:6;954;947:22;909:2;1006:9;993:23;1025:31;1050:5;1025:31;:::i;:::-;1075:5;-1:-1:-1;1132:2:12;1117:18;;1104:32;1145:33;1104:32;1145:33;:::i;:::-;1197:7;1187:17;;;899:311;;;;;:::o;1215:466::-;1292:6;1300;1308;1361:2;1349:9;1340:7;1336:23;1332:32;1329:2;;;1382:6;1374;1367:22;1329:2;1426:9;1413:23;1445:31;1470:5;1445:31;:::i;:::-;1495:5;-1:-1:-1;1552:2:12;1537:18;;1524:32;1565:33;1524:32;1565:33;:::i;:::-;1319:362;;1617:7;;-1:-1:-1;;;1671:2:12;1656:18;;;;1643:32;;1319:362::o;1686:325::-;1754:6;1762;1815:2;1803:9;1794:7;1790:23;1786:32;1783:2;;;1836:6;1828;1821:22;1783:2;1880:9;1867:23;1899:31;1924:5;1899:31;:::i;:::-;1949:5;2001:2;1986:18;;;;1973:32;;-1:-1:-1;;;1773:238:12:o;2016:293::-;2072:6;2125:2;2113:9;2104:7;2100:23;2096:32;2093:2;;;2146:6;2138;2131:22;2093:2;2190:9;2177:23;2243:5;2236:13;2229:21;2222:5;2219:32;2209:2;;2270:6;2262;2255:22;2314:190;2373:6;2426:2;2414:9;2405:7;2401:23;2397:32;2394:2;;;2447:6;2439;2432:22;2394:2;-1:-1:-1;2475:23:12;;2384:120;-1:-1:-1;2384:120:12:o;2509:258::-;2577:6;2585;2638:2;2626:9;2617:7;2613:23;2609:32;2606:2;;;2659:6;2651;2644:22;2606:2;-1:-1:-1;;2687:23:12;;;2757:2;2742:18;;;2729:32;;-1:-1:-1;2596:171:12:o;2772:463::-;2825:3;2863:5;2857:12;2890:6;2885:3;2878:19;2916:4;2945:2;2940:3;2936:12;2929:19;;2982:2;2975:5;2971:14;3003:3;3015:195;3029:6;3026:1;3023:13;3015:195;;;3094:13;;-1:-1:-1;;;;;3090:39:12;3078:52;;3150:12;;;;3185:15;;;;3126:1;3044:9;3015:195;;;-1:-1:-1;3226:3:12;;2833:402;-1:-1:-1;;;;;2833:402:12:o;3973:261::-;4152:2;4141:9;4134:21;4115:4;4172:56;4224:2;4213:9;4209:18;4201:6;4172:56;:::i;4664:603::-;4776:4;4805:2;4834;4823:9;4816:21;4866:6;4860:13;4909:6;4904:2;4893:9;4889:18;4882:34;4934:4;4947:140;4961:6;4958:1;4955:13;4947:140;;;5056:14;;;5052:23;;5046:30;5022:17;;;5041:2;5018:26;5011:66;4976:10;;4947:140;;;5105:6;5102:1;5099:13;5096:2;;;5175:4;5170:2;5161:6;5150:9;5146:22;5142:31;5135:45;5096:2;-1:-1:-1;5251:2:12;5230:15;-1:-1:-1;;5226:29:12;5211:45;;;;5258:2;5207:54;;4785:482;-1:-1:-1;;;4785:482:12:o;8815:356::-;9017:2;8999:21;;;9036:18;;;9029:30;9095:34;9090:2;9075:18;;9068:62;9162:2;9147:18;;8989:182::o;10171:582::-;10470:6;10459:9;10452:25;10513:6;10508:2;10497:9;10493:18;10486:34;10556:3;10551:2;10540:9;10536:18;10529:31;10433:4;10577:57;10629:3;10618:9;10614:19;10606:6;10577:57;:::i;:::-;-1:-1:-1;;;;;10670:32:12;;;;10665:2;10650:18;;10643:60;-1:-1:-1;10734:3:12;10719:19;10712:35;10569:65;10442:311;-1:-1:-1;;;10442:311:12:o;11200:128::-;11240:3;11271:1;11267:6;11264:1;11261:13;11258:2;;;11277:18;;:::i;:::-;-1:-1:-1;11313:9:12;;11248:80::o;11333:217::-;11373:1;11399;11389:2;;-1:-1:-1;;;11424:31:12;;11478:4;11475:1;11468:15;11506:4;11431:1;11496:15;11389:2;-1:-1:-1;11535:9:12;;11379:171::o;11555:168::-;11595:7;11661:1;11657;11653:6;11649:14;11646:1;11643:21;11638:1;11631:9;11624:17;11620:45;11617:2;;;11668:18;;:::i;:::-;-1:-1:-1;11708:9:12;;11607:116::o;11728:125::-;11768:4;11796:1;11793;11790:8;11787:2;;;11801:18;;:::i;:::-;-1:-1:-1;11838:9:12;;11777:76::o;11858:380::-;11937:1;11933:12;;;;11980;;;12001:2;;12055:4;12047:6;12043:17;12033:27;;12001:2;12108;12100:6;12097:14;12077:18;12074:38;12071:2;;;12154:10;12149:3;12145:20;12142:1;12135:31;12189:4;12186:1;12179:15;12217:4;12214:1;12207:15;12243:135;12282:3;-1:-1:-1;;12303:17:12;;12300:2;;;12323:18;;:::i;:::-;-1:-1:-1;12370:1:12;12359:13;;12290:88::o;12383:127::-;12444:10;12439:3;12435:20;12432:1;12425:31;12475:4;12472:1;12465:15;12499:4;12496:1;12489:15;12515:131;-1:-1:-1;;;;;12590:31:12;;12580:42;;12570:2;;12636:1;12633;12626:12
Swarm Source
ipfs://47f2b7bbd6b8aad79903148b6f08b2115008e769e5aa4ae617630de339ca153b
Loading...
Loading
Loading...
Loading
[ Download: CSV Export ]
[ Download: CSV Export ]
A token is a representation of an on-chain or off-chain asset. The token page shows information such as price, total supply, holders, transfers and social links. Learn more about this page in our Knowledge Base.