ETH Price: $2,516.85 (+2.56%)

Token

Arcoin (ARCN)
 

Overview

Max Total Supply

100,000,000 ARCN

Holders

42 (0.00%)

Market

Price

$0.00 @ 0.000000 ETH

Onchain Market Cap

$62,581.00

Circulating Supply Market Cap

$0.00

Other Info

Token Contract (WITH 18 Decimals)

Balance
54,727.41163 ARCN

Value
$34.25 ( ~0.0136083013340253 Eth) [0.0547%]
0xdc5e0658fd59000e656b00244418774233d84326
Loading...
Loading
Loading...
Loading
Loading...
Loading

OVERVIEW

Arcade is a fully-functional decentralised GameFi platform that allows users to play a variation of their favourite arcade games and win prizes!

# Exchange Pair Price  24H Volume % Volume

Contract Source Code Verified (Exact Match)

Contract Name:
Arcoin

Compiler Version
v0.8.20+commit.a1b79de6

Optimization Enabled:
No with 200 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity)

/**
 *Submitted for verification at Etherscan.io on 2023-12-13
*/

// SPDX-License-Identifier: MIT
pragma solidity ^0.8.20;

/**           
 

  ____  ____      __   ____  ___      ___ 
 /    ||    \    /  ] /    ||   \    /  _]
|  o  ||  D  )  /  / |  o  ||    \  /  [_ 
|     ||    /  /  /  |     ||  D  ||    _]
|  _  ||    \ /   \_ |  _  ||     ||   [_ 
|  |  ||  .  \\     ||  |  ||     ||     |
|__|__||__|\_| \____||__|__||_____||_____|
                                        
 Website: https://arcade.money/
 Docs: https://docs.arcade.money/
 Twitter: https://twitter.com/ArcadeERC20/
 Telegram: https://t.me/ArcadePortal

      _=====_                               _=====_
     / _____ \                             / _____ \
   +.-'_____'-.---------------------------.-'_____'-.+
  /   |     |  '.                       .'  |  _  |   \
 / ___| /|\ |___ \                     / ___| /_\ |___ \
/ |      |      | ;  __           _   ; | _         _ | ;
| | <---   ---> | | |__|         |_:> | ||_|       (_)| |
| |___   |   ___| ;SELECT       START ; |___       ___| ;
|\    | \|/ |    /  _     ___      _   \    | (X) |    /|
| \   |_____|  .','" "', |___|  ,'" "', '.  |_____|  .' |
|  '-.______.-' /       \ANALOG/       \  '-._____.-'   |
|               |       |------|       |                |
|              /\       /      \       /\               |
|             /  '.___.'        '.___.'  \              |
|            /                            \             |
 \          /                              \           /
  \________/                                \_________/            
*/
pragma solidity >=0.6.2;
pragma solidity >=0.6.2;

interface IUniswapV2Router01 {
    function factory() external pure returns (address);
    function WETH() external pure returns (address);

    function addLiquidity(
        address tokenA,
        address tokenB,
        uint amountADesired,
        uint amountBDesired,
        uint amountAMin,
        uint amountBMin,
        address to,
        uint deadline
    ) external returns (uint amountA, uint amountB, uint liquidity);
    function addLiquidityETH(
        address token,
        uint amountTokenDesired,
        uint amountTokenMin,
        uint amountETHMin,
        address to,
        uint deadline
    ) external payable returns (uint amountToken, uint amountETH, uint liquidity);
    function removeLiquidity(
        address tokenA,
        address tokenB,
        uint liquidity,
        uint amountAMin,
        uint amountBMin,
        address to,
        uint deadline
    ) external returns (uint amountA, uint amountB);
    function removeLiquidityETH(
        address token,
        uint liquidity,
        uint amountTokenMin,
        uint amountETHMin,
        address to,
        uint deadline
    ) external returns (uint amountToken, uint amountETH);
    function removeLiquidityWithPermit(
        address tokenA,
        address tokenB,
        uint liquidity,
        uint amountAMin,
        uint amountBMin,
        address to,
        uint deadline,
        bool approveMax, uint8 v, bytes32 r, bytes32 s
    ) external returns (uint amountA, uint amountB);
    function removeLiquidityETHWithPermit(
        address token,
        uint liquidity,
        uint amountTokenMin,
        uint amountETHMin,
        address to,
        uint deadline,
        bool approveMax, uint8 v, bytes32 r, bytes32 s
    ) external returns (uint amountToken, uint amountETH);
    function swapExactTokensForTokens(
        uint amountIn,
        uint amountOutMin,
        address[] calldata path,
        address to,
        uint deadline
    ) external returns (uint[] memory amounts);
    function swapTokensForExactTokens(
        uint amountOut,
        uint amountInMax,
        address[] calldata path,
        address to,
        uint deadline
    ) external returns (uint[] memory amounts);
    function swapExactETHForTokens(uint amountOutMin, address[] calldata path, address to, uint deadline)
        external
        payable
        returns (uint[] memory amounts);
    function swapTokensForExactETH(uint amountOut, uint amountInMax, address[] calldata path, address to, uint deadline)
        external
        returns (uint[] memory amounts);
    function swapExactTokensForETH(uint amountIn, uint amountOutMin, address[] calldata path, address to, uint deadline)
        external
        returns (uint[] memory amounts);
    function swapETHForExactTokens(uint amountOut, address[] calldata path, address to, uint deadline)
        external
        payable
        returns (uint[] memory amounts);

    function quote(uint amountA, uint reserveA, uint reserveB) external pure returns (uint amountB);
    function getAmountOut(uint amountIn, uint reserveIn, uint reserveOut) external pure returns (uint amountOut);
    function getAmountIn(uint amountOut, uint reserveIn, uint reserveOut) external pure returns (uint amountIn);
    function getAmountsOut(uint amountIn, address[] calldata path) external view returns (uint[] memory amounts);
    function getAmountsIn(uint amountOut, address[] calldata path) external view returns (uint[] memory amounts);
}

interface IUniswapV2Router02 is IUniswapV2Router01 {
    function removeLiquidityETHSupportingFeeOnTransferTokens(
        address token,
        uint liquidity,
        uint amountTokenMin,
        uint amountETHMin,
        address to,
        uint deadline
    ) external returns (uint amountETH);
    function removeLiquidityETHWithPermitSupportingFeeOnTransferTokens(
        address token,
        uint liquidity,
        uint amountTokenMin,
        uint amountETHMin,
        address to,
        uint deadline,
        bool approveMax, uint8 v, bytes32 r, bytes32 s
    ) external returns (uint amountETH);

    function swapExactTokensForTokensSupportingFeeOnTransferTokens(
        uint amountIn,
        uint amountOutMin,
        address[] calldata path,
        address to,
        uint deadline
    ) external;
    function swapExactETHForTokensSupportingFeeOnTransferTokens(
        uint amountOutMin,
        address[] calldata path,
        address to,
        uint deadline
    ) external payable;
    function swapExactTokensForETHSupportingFeeOnTransferTokens(
        uint amountIn,
        uint amountOutMin,
        address[] calldata path,
        address to,
        uint deadline
    ) external;
}
pragma solidity >=0.5.0;

interface IUniswapV2Pair {
    event Approval(address indexed owner, address indexed spender, uint value);
    event Transfer(address indexed from, address indexed to, uint value);

    function name() external pure returns (string memory);
    function symbol() external pure returns (string memory);
    function decimals() external pure returns (uint8);
    function totalSupply() external view returns (uint);
    function balanceOf(address owner) external view returns (uint);
    function allowance(address owner, address spender) external view returns (uint);

    function approve(address spender, uint value) external returns (bool);
    function transfer(address to, uint value) external returns (bool);
    function transferFrom(address from, address to, uint value) external returns (bool);

    function DOMAIN_SEPARATOR() external view returns (bytes32);
    function PERMIT_TYPEHASH() external pure returns (bytes32);
    function nonces(address owner) external view returns (uint);

    function permit(address owner, address spender, uint value, uint deadline, uint8 v, bytes32 r, bytes32 s) external;

    event Mint(address indexed sender, uint amount0, uint amount1);
    event Burn(address indexed sender, uint amount0, uint amount1, address indexed to);
    event Swap(
        address indexed sender,
        uint amount0In,
        uint amount1In,
        uint amount0Out,
        uint amount1Out,
        address indexed to
    );
    event Sync(uint112 reserve0, uint112 reserve1);

    function MINIMUM_LIQUIDITY() external pure returns (uint);
    function factory() external view returns (address);
    function token0() external view returns (address);
    function token1() external view returns (address);
    function getReserves() external view returns (uint112 reserve0, uint112 reserve1, uint32 blockTimestampLast);
    function price0CumulativeLast() external view returns (uint);
    function price1CumulativeLast() external view returns (uint);
    function kLast() external view returns (uint);

    function mint(address to) external returns (uint liquidity);
    function burn(address to) external returns (uint amount0, uint amount1);
    function swap(uint amount0Out, uint amount1Out, address to, bytes calldata data) external;
    function skim(address to) external;
    function sync() external;

    function initialize(address, address) external;
}

pragma solidity >=0.5.0;

interface IUniswapV2Factory {
    event PairCreated(address indexed token0, address indexed token1, address pair, uint);

    function feeTo() external view returns (address);
    function feeToSetter() external view returns (address);

    function getPair(address tokenA, address tokenB) external view returns (address pair);
    function allPairs(uint) external view returns (address pair);
    function allPairsLength() external view returns (uint);

    function createPair(address tokenA, address tokenB) external returns (address pair);

    function setFeeTo(address) external;
    function setFeeToSetter(address) external;
}

pragma solidity >=0.6.2;

/**
 * @dev Provides information about the current execution context, including the
 * sender of the transaction and its data. While these are generally available
 * via msg.sender and msg.data, they should not be accessed in such a direct
 * manner, since when dealing with meta-transactions the account sending and
 * paying for execution may not be the actual sender (as far as an application
 * is concerned).
 *
 * This contract is only required for intermediate, library-like contracts.
 */
abstract contract Context {
    function _msgSender() internal view virtual returns (address) {
        return msg.sender;
    }

    function _msgData() internal view virtual returns (bytes calldata) {
        return msg.data;
    }
}

/**
 * @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.
 *
 * The initial owner is set to the address provided by the deployer. This can
 * later be changed with {transferOwnership}.
 *
 * This module is used through inheritance. It will make available the modifier
 * `onlyOwner`, which can be applied to your functions to restrict their use to
 * the owner.
 */
abstract contract Ownable is Context {
    address private _owner;

    /**
     * @dev The caller account is not authorized to perform an operation.
     */
    error OwnableUnauthorizedAccount(address account);

    /**
     * @dev The owner is not a valid owner account. (eg. `address(0)`)
     */
    error OwnableInvalidOwner(address owner);

    event OwnershipTransferred(address indexed previousOwner, address indexed newOwner);

    /**
     * @dev Initializes the contract setting the address provided by the deployer as the initial owner.
     */
    constructor(address initialOwner) {
        if (initialOwner == address(0)) {
            revert OwnableInvalidOwner(address(0));
        }
        _transferOwnership(initialOwner);
    }

    /**
     * @dev Throws if called by any account other than the owner.
     */
    modifier onlyOwner() {
        _checkOwner();
        _;
    }

    /**
     * @dev Returns the address of the current owner.
     */
    function owner() public view virtual returns (address) {
        return _owner;
    }

    /**
     * @dev Throws if the sender is not the owner.
     */
    function _checkOwner() internal view virtual {
        if (owner() != _msgSender()) {
            revert OwnableUnauthorizedAccount(_msgSender());
        }
    }

    /**
     * @dev Leaves the contract without owner. It will not be possible to call
     * `onlyOwner` functions. Can only be called by the current owner.
     *
     * NOTE: Renouncing ownership will leave the contract without an owner,
     * thereby disabling any functionality that is only available to the owner.
     */
    function renounceOwnership() public virtual onlyOwner {
        _transferOwnership(address(0));
    }

    /**
     * @dev Transfers ownership of the contract to a new account (`newOwner`).
     * Can only be called by the current owner.
     */
    function transferOwnership(address newOwner) public virtual onlyOwner {
        if (newOwner == address(0)) {
            revert OwnableInvalidOwner(address(0));
        }
        _transferOwnership(newOwner);
    }

    /**
     * @dev Transfers ownership of the contract to a new account (`newOwner`).
     * Internal function without access restriction.
     */
    function _transferOwnership(address newOwner) internal virtual {
        address oldOwner = _owner;
        _owner = newOwner;
        emit OwnershipTransferred(oldOwner, newOwner);
    }
}

/**
 * @dev Collection of functions related to the address type
 */
library Address {
    /**
     * @dev The ETH balance of the account is not enough to perform the operation.
     */
    error AddressInsufficientBalance(address account);

    /**
     * @dev There's no code at `target` (it is not a contract).
     */
    error AddressEmptyCode(address target);

    /**
     * @dev A call to an address target failed. The target may have reverted.
     */
    error FailedInnerCall();

    /**
     * @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://consensys.net/diligence/blog/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.8.20/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern].
     */
    function sendValue(address payable recipient, uint256 amount) internal {
        if (address(this).balance < amount) {
            revert AddressInsufficientBalance(address(this));
        }

        (bool success, ) = recipient.call{value: amount}("");
        if (!success) {
            revert FailedInnerCall();
        }
    }

    /**
     * @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 or custom error, it is bubbled
     * up by this function (like regular Solidity function calls). However, if
     * the call reverted with no returned reason, this function reverts with a
     * {FailedInnerCall} error.
     *
     * 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.
     */
    function functionCall(address target, bytes memory data) internal returns (bytes memory) {
        return functionCallWithValue(target, data, 0);
    }

    /**
     * @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`.
     */
    function functionCallWithValue(address target, bytes memory data, uint256 value) internal returns (bytes memory) {
        if (address(this).balance < value) {
            revert AddressInsufficientBalance(address(this));
        }
        (bool success, bytes memory returndata) = target.call{value: value}(data);
        return verifyCallResultFromTarget(target, success, returndata);
    }

    /**
     * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],
     * but performing a static call.
     */
    function functionStaticCall(address target, bytes memory data) internal view returns (bytes memory) {
        (bool success, bytes memory returndata) = target.staticcall(data);
        return verifyCallResultFromTarget(target, success, returndata);
    }

    /**
     * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],
     * but performing a delegate call.
     */
    function functionDelegateCall(address target, bytes memory data) internal returns (bytes memory) {
        (bool success, bytes memory returndata) = target.delegatecall(data);
        return verifyCallResultFromTarget(target, success, returndata);
    }

    /**
     * @dev Tool to verify that a low level call to smart-contract was successful, and reverts if the target
     * was not a contract or bubbling up the revert reason (falling back to {FailedInnerCall}) in case of an
     * unsuccessful call.
     */
    function verifyCallResultFromTarget(
        address target,
        bool success,
        bytes memory returndata
    ) internal view returns (bytes memory) {
        if (!success) {
            _revert(returndata);
        } else {
            // only check if target is a contract if the call was successful and the return data is empty
            // otherwise we already know that it was a contract
            if (returndata.length == 0 && target.code.length == 0) {
                revert AddressEmptyCode(target);
            }
            return returndata;
        }
    }

    /**
     * @dev Tool to verify that a low level call was successful, and reverts if it wasn't, either by bubbling the
     * revert reason or with a default {FailedInnerCall} error.
     */
    function verifyCallResult(bool success, bytes memory returndata) internal pure returns (bytes memory) {
        if (!success) {
            _revert(returndata);
        } else {
            return returndata;
        }
    }

    /**
     * @dev Reverts with returndata if present. Otherwise reverts with {FailedInnerCall}.
     */
    function _revert(bytes memory returndata) private pure {
        // Look for revert reason and bubble it up if present
        if (returndata.length > 0) {
            // The easiest way to bubble the revert reason is using memory via assembly
            /// @solidity memory-safe-assembly
            assembly {
                let returndata_size := mload(returndata)
                revert(add(32, returndata), returndata_size)
            }
        } else {
            revert FailedInnerCall();
        }
    }
}

contract ArcadeProtocol is Ownable {
    address public prizePoolContract;
    address public revenueShareWallet;
    uint256 public swapAmount;
    uint256 public prizePoolShare;

    constructor(address _prizePoolContract, address _revenueShareWallet) Ownable(msg.sender) {
        prizePoolContract = _prizePoolContract;
        revenueShareWallet = _revenueShareWallet;
        prizePoolShare = 35; // 35%
    }

    // Function to receive Ether. msg.data must be empty
    receive() external payable {}

    /**
     * @notice Sets the prize pool contract
     */
    function setPrizePoolContract(address _prizePoolContract) external onlyOwner {
        prizePoolContract = _prizePoolContract;
    }

    /**
     * @notice Sets the revenue share wallet
     */
    function setRevenueWallet(address _revenueShareWallet) external onlyOwner {
        revenueShareWallet = _revenueShareWallet;
    }

    /**
     * @notice Sets the prize pool share 
     */
    function setPrizePoolShare(uint256 share) external onlyOwner {
        prizePoolShare = share;
    }

    /**
     * @notice Sets the swap threshold for the Arcoin ERC-20 contract, controlled outside so we can renounce ownership of the coin itself
     */
    function setSwapAmount(uint256 amount) external onlyOwner {
        swapAmount = amount;
    }

    /**
     * @notice Distributes ETH to the revenue share pool and the prize pool
     */
    function distributeFunds() external {
        uint256 prizePoolAmount = address(this).balance * prizePoolShare / 100;
        uint256 revenueShareAmount = address(this).balance - prizePoolShare;

        // Send 35% to the prize pool contract
        (bool sentPrize, ) = prizePoolContract.call{value: prizePoolAmount}("");
        require(sentPrize, "Failed to send Ether to prize pool");

        // Send 65% to the revenue share wallet
        (bool sentRevenue, ) = revenueShareWallet.call{value: revenueShareAmount}("");
        require(sentRevenue, "Failed to send Ether to revenue share wallet");
    }
}

pragma solidity >=0.5.0;

interface IERC20 {
    event Approval(address indexed owner, address indexed spender, uint value);
    event Transfer(address indexed from, address indexed to, uint value);

    function name() external view returns (string memory);
    function symbol() external view returns (string memory);
    function decimals() external view returns (uint8);
    function totalSupply() external view returns (uint);
    function balanceOf(address owner) external view returns (uint);
    function allowance(address owner, address spender) external view returns (uint);

    function approve(address spender, uint value) external returns (bool);
    function transfer(address to, uint value) external returns (bool);
    function transferFrom(address from, address to, uint value) external returns (bool);
}

/**
 * @dev Interface for the optional metadata functions from the ERC20 standard.
 */
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);
}


/**
 * @dev Standard ERC20 Errors
 * Interface of the https://eips.ethereum.org/EIPS/eip-6093[ERC-6093] custom errors for ERC20 tokens.
 */
interface IERC20Errors {
    /**
     * @dev Indicates an error related to the current `balance` of a `sender`. Used in transfers.
     * @param sender Address whose tokens are being transferred.
     * @param balance Current balance for the interacting account.
     * @param needed Minimum amount required to perform a transfer.
     */
    error ERC20InsufficientBalance(address sender, uint256 balance, uint256 needed);

    /**
     * @dev Indicates a failure with the token `sender`. Used in transfers.
     * @param sender Address whose tokens are being transferred.
     */
    error ERC20InvalidSender(address sender);

    /**
     * @dev Indicates a failure with the token `receiver`. Used in transfers.
     * @param receiver Address to which tokens are being transferred.
     */
    error ERC20InvalidReceiver(address receiver);

    /**
     * @dev Indicates a failure with the `spender`’s `allowance`. Used in transfers.
     * @param spender Address that may be allowed to operate on tokens without being their owner.
     * @param allowance Amount of tokens a `spender` is allowed to operate with.
     * @param needed Minimum amount required to perform a transfer.
     */
    error ERC20InsufficientAllowance(address spender, uint256 allowance, uint256 needed);

    /**
     * @dev Indicates a failure with the `approver` of a token to be approved. Used in approvals.
     * @param approver Address initiating an approval operation.
     */
    error ERC20InvalidApprover(address approver);

    /**
     * @dev Indicates a failure with the `spender` to be approved. Used in approvals.
     * @param spender Address that may be allowed to operate on tokens without being their owner.
     */
    error ERC20InvalidSpender(address spender);
}

/**
 * @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}.
 *
 * TIP: For a detailed writeup see our guide
 * https://forum.openzeppelin.com/t/how-to-implement-erc20-supply-mechanisms/226[How
 * to implement supply mechanisms].
 *
 * The default value of {decimals} is 18. To change this, you should override
 * this function so it returns a different value.
 *
 * We have followed general OpenZeppelin Contracts guidelines: functions revert
 * instead returning `false` on failure. This behavior is nonetheless
 * conventional and does not conflict with the expectations of ERC20
 * applications.
 *
 * Additionally, an {Approval} event is emitted on calls to {transferFrom}.
 * This allows applications to reconstruct the allowance for all accounts just
 * by listening to said events. Other implementations of the EIP may not emit
 * these events, as it isn't required by the specification.
 */
abstract contract ERC20 is Context, IERC20, IERC20Metadata, IERC20Errors {
    mapping(address account => uint256) private _balances;

    mapping(address account => mapping(address spender => uint256)) private _allowances;

    uint256 private _totalSupply;

    string private _name;
    string private _symbol;

    /**
     * @dev Sets the values for {name} and {symbol}.
     *
     * 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(IERC20, IERC20Metadata)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(IERC20, IERC20Metadata)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 default value returned by this function, unless
     * it's 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(IERC20, IERC20Metadata)returns (uint8) {
        return 18;
    }

    /**
     * @dev See {IERC20-totalSupply}.
     */
    function totalSupply() public view virtual returns (uint256) {
        return _totalSupply;
    }

    /**
     * @dev See {IERC20-balanceOf}.
     */
    function balanceOf(address account) public view virtual returns (uint256) {
        return _balances[account];
    }

    /**
     * @dev See {IERC20-transfer}.
     *
     * Requirements:
     *
     * - `to` cannot be the zero address.
     * - the caller must have a balance of at least `value`.
     */
    function transfer(address to, uint256 value) public virtual returns (bool) {
        address owner = _msgSender();
        _transfer(owner, to, value);
        return true;
    }

    /**
     * @dev See {IERC20-allowance}.
     */
    function allowance(address owner, address spender) public view virtual returns (uint256) {
        return _allowances[owner][spender];
    }

    /**
     * @dev See {IERC20-approve}.
     *
     * NOTE: If `value` is the maximum `uint256`, the allowance is not updated on
     * `transferFrom`. This is semantically equivalent to an infinite approval.
     *
     * Requirements:
     *
     * - `spender` cannot be the zero address.
     */
    function approve(address spender, uint256 value) public virtual returns (bool) {
        address owner = _msgSender();
        _approve(owner, spender, value);
        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}.
     *
     * NOTE: Does not update the allowance if the current allowance
     * is the maximum `uint256`.
     *
     * Requirements:
     *
     * - `from` and `to` cannot be the zero address.
     * - `from` must have a balance of at least `value`.
     * - the caller must have allowance for ``from``'s tokens of at least
     * `value`.
     */
    function transferFrom(address from, address to, uint256 value) public virtual returns (bool) {
        address spender = _msgSender();
        _spendAllowance(from, spender, value);
        _transfer(from, to, value);
        return true;
    }

    /**
     * @dev Moves a `value` amount of tokens from `from` to `to`.
     *
     * This internal function is equivalent to {transfer}, and can be used to
     * e.g. implement automatic token fees, slashing mechanisms, etc.
     *
     * Emits a {Transfer} event.
     *
     * NOTE: This function is not virtual, {_update} should be overridden instead.
     */
    function _transfer(address from, address to, uint256 value) internal {
        if (from == address(0)) {
            revert ERC20InvalidSender(address(0));
        }
        if (to == address(0)) {
            revert ERC20InvalidReceiver(address(0));
        }
        _update(from, to, value);
    }

    /**
     * @dev Transfers a `value` amount of tokens from `from` to `to`, or alternatively mints (or burns) if `from`
     * (or `to`) is the zero address. All customizations to transfers, mints, and burns should be done by overriding
     * this function.
     *
     * Emits a {Transfer} event.
     */
    function _update(address from, address to, uint256 value) internal virtual {
        if (from == address(0)) {
            // Overflow check required: The rest of the code assumes that totalSupply never overflows
            _totalSupply += value;
        } else {
            uint256 fromBalance = _balances[from];
            if (fromBalance < value) {
                revert ERC20InsufficientBalance(from, fromBalance, value);
            }
            unchecked {
                // Overflow not possible: value <= fromBalance <= totalSupply.
                _balances[from] = fromBalance - value;
            }
        }

        if (to == address(0)) {
            unchecked {
                // Overflow not possible: value <= totalSupply or value <= fromBalance <= totalSupply.
                _totalSupply -= value;
            }
        } else {
            unchecked {
                // Overflow not possible: balance + value is at most totalSupply, which we know fits into a uint256.
                _balances[to] += value;
            }
        }

        emit Transfer(from, to, value);
    }

    /**
     * @dev Creates a `value` amount of tokens and assigns them to `account`, by transferring it from address(0).
     * Relies on the `_update` mechanism
     *
     * Emits a {Transfer} event with `from` set to the zero address.
     *
     * NOTE: This function is not virtual, {_update} should be overridden instead.
     */
    function _mint(address account, uint256 value) internal {
        if (account == address(0)) {
            revert ERC20InvalidReceiver(address(0));
        }
        _update(address(0), account, value);
    }

    /**
     * @dev Destroys a `value` amount of tokens from `account`, lowering the total supply.
     * Relies on the `_update` mechanism.
     *
     * Emits a {Transfer} event with `to` set to the zero address.
     *
     * NOTE: This function is not virtual, {_update} should be overridden instead
     */
    function _burn(address account, uint256 value) internal {
        if (account == address(0)) {
            revert ERC20InvalidSender(address(0));
        }
        _update(account, address(0), value);
    }

    /**
     * @dev Sets `value` 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.
     *
     * Overrides to this logic should be done to the variant with an additional `bool emitEvent` argument.
     */
    function _approve(address owner, address spender, uint256 value) internal {
        _approve(owner, spender, value, true);
    }

    /**
     * @dev Variant of {_approve} with an optional flag to enable or disable the {Approval} event.
     *
     * By default (when calling {_approve}) the flag is set to true. On the other hand, approval changes made by
     * `_spendAllowance` during the `transferFrom` operation set the flag to false. This saves gas by not emitting any
     * `Approval` event during `transferFrom` operations.
     *
     * Anyone who wishes to continue emitting `Approval` events on the`transferFrom` operation can force the flag to
     * true using the following override:
     * ```
     * function _approve(address owner, address spender, uint256 value, bool) internal virtual override {
     *     super._approve(owner, spender, value, true);
     * }
     * ```
     *
     * Requirements are the same as {_approve}.
     */
    function _approve(address owner, address spender, uint256 value, bool emitEvent) internal virtual {
        if (owner == address(0)) {
            revert ERC20InvalidApprover(address(0));
        }
        if (spender == address(0)) {
            revert ERC20InvalidSpender(address(0));
        }
        _allowances[owner][spender] = value;
        if (emitEvent) {
            emit Approval(owner, spender, value);
        }
    }

    /**
     * @dev Updates `owner` s allowance for `spender` based on spent `value`.
     *
     * Does not update the allowance value in case of infinite allowance.
     * Revert if not enough allowance is available.
     *
     * Does not emit an {Approval} event.
     */
    function _spendAllowance(address owner, address spender, uint256 value) internal virtual {
        uint256 currentAllowance = allowance(owner, spender);
        if (currentAllowance != type(uint256).max) {
            if (currentAllowance < value) {
                revert ERC20InsufficientAllowance(spender, currentAllowance, value);
            }
            unchecked {
                _approve(owner, spender, currentAllowance - value, false);
            }
        }
    }
}

/**
 * @title The COIN ERC-20 Token Implementation
 * @author 
 * @notice Play and earn
 */
contract Arcoin is ERC20, Ownable {
    using Address for address payable;

    /// @notice The V2 router to use for swapping 
    IUniswapV2Router02 public router;

    /// @notice The V2 pair to use for swapping
    address public pair;

    /// @notice A mapping showing whether or not a wallet is excluded from fees
    mapping (address => bool) public isExcludedFromFees;

    /// @notice The trading fee
    /// @dev Done in basis points (500 = 5%)
    /// @dev Cannot be set to more than 20%.
    uint16 public tradingFee;

    /// @notice The wallet used to receive fees used for development
    address payable public developmentWallet;

    /// @notice The address for the protocol contract
    address payable public protocolAddress;

    /// @notice The address for the wallet that deployed this contract
    address payable public deployWallet;

    /// @notice Whether or not we have swapping enabled
    bool public swapEnabled;

    /// @notice Whether or not the contract is currently swapping
    bool private swapping;

    /// @notice The swap amount
    uint256 public maxSwapTokenAmount;

    bool public tradingEnabled;
    uint256 public tradingBlock;
    uint256 public tradingTime;

    constructor(
        uint256 _startingSupply,
        address _developmentAddress,
        address _protocolAddress
    ) 
        ERC20("Arcoin", "ARCN")
        Ownable(msg.sender) 
    {   
        // Initialize the trading fee (the trading fee setter is hardcoded to only allow values between 0 and 2000 inclusive - this is 0% to 20%) q
        tradingFee = 500;

        // Set wallets
        deployWallet = payable(msg.sender);
        developmentWallet = payable(_developmentAddress);
        protocolAddress = payable(_protocolAddress);

        // Exclude the necessary wallets from fees
        isExcludedFromFees[msg.sender] = true;
        isExcludedFromFees[developmentWallet] = true;
        isExcludedFromFees[address(this)] = true;

        // Mint the starting supply to the owner of the contract
        _mint(owner(), _startingSupply);

        // Initialize the auto-swap settings
        swapEnabled = false;

        maxSwapTokenAmount = totalSupply() * 25 / 10000; // 0.25% total supply swap amount

        tradingEnabled = false;
    }

    /**
     * @notice Allows the contract to receive ETH from the auto-swapping protocol
     */
    receive() external payable { }

    function setArcadeProtocolAddress(address _protocolAddress) external onlyOwner {
        protocolAddress = payable(_protocolAddress);
    }

    function setDevelopmentAddress(address _devWallet) external onlyOwner {
        developmentWallet = payable(_devWallet);
    }

    /**
     * @notice Adds the liquidity in a synchronous way to ensure all transactions go through in the right order
     * @param _routerAddress The address of the router
     */
    function addLiquidity(address _routerAddress, uint256 tokenAmount) external payable onlyOwner {
        // Initialize the router and create a pair (the router should be the Uniswap V2 router 0x7a250d5630B4cF539739dF2C5dAcb4c659F2488D)
        router = IUniswapV2Router02(_routerAddress);
        pair = IUniswapV2Factory(router.factory()).createPair(address(this), router.WETH());

        _transfer(msg.sender, address(this), tokenAmount);

        _approve(address(this), address(router), type(uint).max);
        router.addLiquidityETH{value: msg.value}(
            address(this),
            tokenAmount,
            0,
            0,
            msg.sender,
            block.timestamp
        );
        IERC20(pair).approve(address(router), type(uint).max);
    }

    /**
     * @notice Enables trading, recording the time and block when trading was enabled to allow for the variable sell fee on launch
     */
    function enableTrading() external onlyOwner {
        require(!tradingEnabled, "TRADING_ALREADY_ENABLED");
        swapEnabled = true;
        tradingEnabled = true;
        tradingBlock = block.number;
        tradingTime = block.timestamp;
    }

    /**
     * @notice Allows the deploy wallet to manually swap the tokens to control execute smaller sells
     */
    function manualSwap() external {
        require(deployWallet == msg.sender, "MUST_BE_DEPLOY_WALLET");

        uint256 tokenBalance = balanceOf(address(this));
        if (tokenBalance > 0) {
            swapping = true;
            _swapAndSendETH(tokenBalance);
            swapping = false;
        }
    }

    /**
     * @notice The transfer logic.
     * @dev For any transfers to and from the liquidity pool, we incur a fee
     * @param from The address that is sending tokens
     * @param to The address that is receiving tokens
     * @param amount The amount to send 
     */
    function _update(address from, address to, uint256 amount) internal override {
        require(amount > 0, "TRANSFER_ZERO");
		uint256 contractTokenBalance = balanceOf(address(this));

        bool canSwap = contractTokenBalance >= maxSwapTokenAmount;

        if (canSwap &&
            !swapping &&
            from != pair && 
            to == pair &&
            swapEnabled
        ) {
            swapping = true;
            _swapAndSendETH(contractTokenBalance);
            swapping = false;
        }

        uint256 fee;
        if (block.number > tradingBlock + 4){
            fee = tradingFee;
        } else if (block.number > tradingBlock + 3){
            fee = 1000;
        } else if (block.number > tradingBlock + 2){
            fee = 1500;
        } else if (block.number > tradingBlock + 1){
            fee = 2000;
        } else if (block.number > tradingBlock) {
            fee = 2500;
        } else {
            fee = 3000;
        }

        // Only apply the tax if we are dealing with a trade against the LP
        uint256 tax = 0;
        if (!isExcludedFromFees[from] && !isExcludedFromFees[to] && !swapping && (from == pair || to == pair)) {
            require(tradingEnabled, "TRADING_DISABLED");
            tax = fee;
        }

        // The taxed amount is sent to the contract, and the resulting amount is transfered to the receipient. 
        uint256 taxAmount = (amount * tax) / 1e4;
        uint256 transferAmount = amount - taxAmount;
        super._update(from, to, transferAmount);
        if (taxAmount > 0) {
            super._update(from, address(this), taxAmount);
        }
    }

    function _swapAndSendETH(uint256 tokenAmount) internal {
        address[] memory path = new address[](2);
        path[0] = address(this);
        path[1] = router.WETH();

        router.swapExactTokensForETHSupportingFeeOnTransferTokens(
            tokenAmount,
            0,
            path,
            address(this),
            block.timestamp);

        if (address(this).balance > 0) {
            
            uint256 developmentAmount = address(this).balance / 2;
            uint256 protocolAmount = address(this).balance - developmentAmount;
            developmentWallet.transfer(developmentAmount);
            protocolAddress.transfer(protocolAmount);
        }
    }
}

Contract Security Audit

Contract ABI

[{"inputs":[{"internalType":"uint256","name":"_startingSupply","type":"uint256"},{"internalType":"address","name":"_developmentAddress","type":"address"},{"internalType":"address","name":"_protocolAddress","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"allowance","type":"uint256"},{"internalType":"uint256","name":"needed","type":"uint256"}],"name":"ERC20InsufficientAllowance","type":"error"},{"inputs":[{"internalType":"address","name":"sender","type":"address"},{"internalType":"uint256","name":"balance","type":"uint256"},{"internalType":"uint256","name":"needed","type":"uint256"}],"name":"ERC20InsufficientBalance","type":"error"},{"inputs":[{"internalType":"address","name":"approver","type":"address"}],"name":"ERC20InvalidApprover","type":"error"},{"inputs":[{"internalType":"address","name":"receiver","type":"address"}],"name":"ERC20InvalidReceiver","type":"error"},{"inputs":[{"internalType":"address","name":"sender","type":"address"}],"name":"ERC20InvalidSender","type":"error"},{"inputs":[{"internalType":"address","name":"spender","type":"address"}],"name":"ERC20InvalidSpender","type":"error"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"OwnableInvalidOwner","type":"error"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"OwnableUnauthorizedAccount","type":"error"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"spender","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[{"internalType":"address","name":"_routerAddress","type":"address"},{"internalType":"uint256","name":"tokenAmount","type":"uint256"}],"name":"addLiquidity","outputs":[],"stateMutability":"payable","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":"value","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":[],"name":"deployWallet","outputs":[{"internalType":"address payable","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"developmentWallet","outputs":[{"internalType":"address payable","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"enableTrading","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"isExcludedFromFees","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"manualSwap","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"maxSwapTokenAmount","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":"pair","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"protocolAddress","outputs":[{"internalType":"address payable","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"router","outputs":[{"internalType":"contract IUniswapV2Router02","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_protocolAddress","type":"address"}],"name":"setArcadeProtocolAddress","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_devWallet","type":"address"}],"name":"setDevelopmentAddress","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"swapEnabled","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":[],"name":"tradingBlock","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"tradingEnabled","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"tradingFee","outputs":[{"internalType":"uint16","name":"","type":"uint16"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"tradingTime","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"value","type":"uint256"}],"name":"transfer","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"value","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"},{"stateMutability":"payable","type":"receive"}]

608060405234801562000010575f80fd5b506040516200420438038062004204833981810160405281019062000036919062001003565b336040518060400160405280600681526020017f4172636f696e00000000000000000000000000000000000000000000000000008152506040518060400160405280600481526020017f4152434e000000000000000000000000000000000000000000000000000000008152508160039081620000b49190620012b7565b508060049081620000c69190620012b7565b5050505f73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16036200013c575f6040517f1e4fbdf7000000000000000000000000000000000000000000000000000000008152600401620001339190620013ac565b60405180910390fd5b6200014d81620003de60201b60201c565b506101f460095f6101000a81548161ffff021916908361ffff16021790555033600b5f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555081600960026101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555080600a5f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550600160085f3373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f6101000a81548160ff021916908315150217905550600160085f600960029054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f6101000a81548160ff021916908315150217905550600160085f3073ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f6101000a81548160ff0219169083151502179055506200036f62000362620004a160201b60201c565b84620004c960201b60201c565b5f600b60146101000a81548160ff02191690831515021790555061271060196200039e6200055360201b60201c565b620003aa9190620013f4565b620003b691906200146b565b600c819055505f600d5f6101000a81548160ff02191690831515021790555050505062001830565b5f60055f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1690508160055f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b5f60055f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b5f73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16036200053c575f6040517fec442f05000000000000000000000000000000000000000000000000000000008152600401620005339190620013ac565b60405180910390fd5b6200054f5f83836200055c60201b60201c565b5050565b5f600254905090565b5f8111620005a1576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401620005989062001500565b60405180910390fd5b5f620005b330620009e660201b60201c565b90505f600c548210159050808015620005d95750600b60159054906101000a900460ff16155b801562000633575060075f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff1614155b80156200068c575060075f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff16145b8015620006a55750600b60149054906101000a900460ff165b15620006f2576001600b60156101000a81548160ff021916908315150217905550620006d78262000a2b60201b60201c565b5f600b60156101000a81548160ff0219169083151502179055505b5f6004600e5462000704919062001520565b431115620007285760095f9054906101000a900461ffff1661ffff169050620007b4565b6003600e5462000739919062001520565b4311156200074c576103e89050620007b3565b6002600e546200075d919062001520565b43111562000770576105dc9050620007b2565b6001600e5462000781919062001520565b43111562000794576107d09050620007b1565b600e54431115620007aa576109c49050620007b0565b610bb890505b5b5b5b5b5f60085f8873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff1615801562000854575060085f8773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff16155b80156200086e5750600b60159054906101000a900460ff16155b80156200091f575060075f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168773ffffffffffffffffffffffffffffffffffffffff1614806200091e575060075f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff16145b5b156200097a57600d5f9054906101000a900460ff1662000976576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016200096d90620015a8565b60405180910390fd5b8190505b5f61271082876200098c9190620013f4565b6200099891906200146b565b90505f8187620009a99190620015c8565b9050620009be89898362000d4260201b60201c565b5f821115620009db57620009da89308462000d4260201b60201c565b5b505050505050505050565b5f805f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20549050919050565b5f600267ffffffffffffffff81111562000a4a5762000a4962001066565b5b60405190808252806020026020018201604052801562000a795781602001602082028036833780820191505090505b50905030815f8151811062000a935762000a9262001602565b5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff168152505060065f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663ad5c46486040518163ffffffff1660e01b8152600401602060405180830381865afa15801562000b38573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019062000b5e91906200162f565b8160018151811062000b755762000b7462001602565b5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff168152505060065f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663791ac947835f8430426040518663ffffffff1660e01b815260040162000c1395949392919062001778565b5f604051808303815f87803b15801562000c2b575f80fd5b505af115801562000c3e573d5f803e3d5ffd5b505050505f47111562000d3e575f60024762000c5b91906200146b565b90505f814762000c6c9190620015c8565b9050600960029054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166108fc8390811502906040515f60405180830381858888f1935050505015801562000cd4573d5f803e3d5ffd5b50600a5f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166108fc8290811502906040515f60405180830381858888f1935050505015801562000d3a573d5f803e3d5ffd5b5050505b5050565b5f73ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff160362000d96578060025f82825462000d89919062001520565b9250508190555062000e67565b5f805f8573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205490508181101562000e22578381836040517fe450d38c00000000000000000000000000000000000000000000000000000000815260040162000e1993929190620017da565b60405180910390fd5b8181035f808673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f2081905550505b5f73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff160362000eb0578060025f828254039250508190555062000efa565b805f808473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f82825401925050819055505b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef8360405162000f59919062001815565b60405180910390a3505050565b5f80fd5b5f819050919050565b62000f7e8162000f6a565b811462000f89575f80fd5b50565b5f8151905062000f9c8162000f73565b92915050565b5f73ffffffffffffffffffffffffffffffffffffffff82169050919050565b5f62000fcd8262000fa2565b9050919050565b62000fdf8162000fc1565b811462000fea575f80fd5b50565b5f8151905062000ffd8162000fd4565b92915050565b5f805f606084860312156200101d576200101c62000f66565b5b5f6200102c8682870162000f8c565b93505060206200103f8682870162000fed565b9250506040620010528682870162000fed565b9150509250925092565b5f81519050919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b7f4e487b71000000000000000000000000000000000000000000000000000000005f52602260045260245ffd5b5f6002820490506001821680620010d857607f821691505b602082108103620010ee57620010ed62001093565b5b50919050565b5f819050815f5260205f209050919050565b5f6020601f8301049050919050565b5f82821b905092915050565b5f60088302620011527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8262001115565b6200115e868362001115565b95508019841693508086168417925050509392505050565b5f819050919050565b5f6200119f62001199620011938462000f6a565b62001176565b62000f6a565b9050919050565b5f819050919050565b620011ba836200117f565b620011d2620011c982620011a6565b84845462001121565b825550505050565b5f90565b620011e8620011da565b620011f5818484620011af565b505050565b5b818110156200121c57620012105f82620011de565b600181019050620011fb565b5050565b601f8211156200126b576200123581620010f4565b620012408462001106565b8101602085101562001250578190505b620012686200125f8562001106565b830182620011fa565b50505b505050565b5f82821c905092915050565b5f6200128d5f198460080262001270565b1980831691505092915050565b5f620012a783836200127c565b9150826002028217905092915050565b620012c2826200105c565b67ffffffffffffffff811115620012de57620012dd62001066565b5b620012ea8254620010c0565b620012f782828562001220565b5f60209050601f8311600181146200132d575f841562001318578287015190505b6200132485826200129a565b86555062001393565b601f1984166200133d86620010f4565b5f5b8281101562001366578489015182556001820191506020850194506020810190506200133f565b8683101562001386578489015162001382601f8916826200127c565b8355505b6001600288020188555050505b505050505050565b620013a68162000fc1565b82525050565b5f602082019050620013c15f8301846200139b565b92915050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b5f620014008262000f6a565b91506200140d8362000f6a565b92508282026200141d8162000f6a565b91508282048414831517620014375762001436620013c7565b5b5092915050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601260045260245ffd5b5f620014778262000f6a565b9150620014848362000f6a565b9250826200149757620014966200143e565b5b828204905092915050565b5f82825260208201905092915050565b7f5452414e534645525f5a45524f000000000000000000000000000000000000005f82015250565b5f620014e8600d83620014a2565b9150620014f582620014b2565b602082019050919050565b5f6020820190508181035f8301526200151981620014da565b9050919050565b5f6200152c8262000f6a565b9150620015398362000f6a565b9250828201905080821115620015545762001553620013c7565b5b92915050565b7f54524144494e475f44495341424c4544000000000000000000000000000000005f82015250565b5f62001590601083620014a2565b91506200159d826200155a565b602082019050919050565b5f6020820190508181035f830152620015c18162001582565b9050919050565b5f620015d48262000f6a565b9150620015e18362000f6a565b9250828203905081811115620015fc57620015fb620013c7565b5b92915050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52603260045260245ffd5b5f6020828403121562001647576200164662000f66565b5b5f620016568482850162000fed565b91505092915050565b6200166a8162000f6a565b82525050565b5f819050919050565b5f62001699620016936200168d8462001670565b62001176565b62000f6a565b9050919050565b620016ab8162001679565b82525050565b5f81519050919050565b5f82825260208201905092915050565b5f819050602082019050919050565b620016e58162000fc1565b82525050565b5f620016f88383620016da565b60208301905092915050565b5f602082019050919050565b5f6200171c82620016b1565b620017288185620016bb565b93506200173583620016cb565b805f5b838110156200176b5781516200174f8882620016eb565b97506200175c8362001704565b92505060018101905062001738565b5085935050505092915050565b5f60a0820190506200178d5f8301886200165f565b6200179c6020830187620016a0565b8181036040830152620017b0818662001710565b9050620017c160608301856200139b565b620017d060808301846200165f565b9695505050505050565b5f606082019050620017ef5f8301866200139b565b620017fe60208301856200165f565b6200180d60408301846200165f565b949350505050565b5f6020820190506200182a5f8301846200165f565b92915050565b6129c6806200183e5f395ff3fe6080604052600436106101c5575f3560e01c806356f43352116100f6578063a8aa1b3111610094578063cd51e6d411610063578063cd51e6d4146105f6578063dd62ed3e14610620578063f2fde38b1461065c578063f887ea4014610684576101cc565b8063a8aa1b311461053c578063a9059cbb14610566578063b8158d60146105a2578063c04a5414146105cc576101cc565b8063715018a6116100d0578063715018a6146104bc5780638a8c523c146104d25780638da5cb5b146104e857806395d89b4114610512576101cc565b806356f433521461042c5780636ddd17131461045657806370a0823114610480576101cc565b806329b1c15c116101635780634fbee1931161013d5780634fbee1931461039457806351bc3c85146103d057806353535db9146103e65780635668870014610410576101cc565b806329b1c15c14610318578063313ce567146103405780634ada218b1461036a576101cc565b806306fdde031161019f57806306fdde031461024c578063095ea7b31461027657806318160ddd146102b257806323b872dd146102dc576101cc565b806303248dce146101d05780630352b2ee146101f85780630676c1b714610222576101cc565b366101cc57005b5f80fd5b3480156101db575f80fd5b506101f660048036038101906101f19190611f79565b6106ae565b005b348015610203575f80fd5b5061020c6106f9565b6040516102199190611fbc565b60405180910390f35b34801561022d575f80fd5b506102366106ff565b6040516102439190611ff5565b60405180910390f35b348015610257575f80fd5b50610260610724565b60405161026d9190612098565b60405180910390f35b348015610281575f80fd5b5061029c600480360381019061029791906120e2565b6107b4565b6040516102a9919061213a565b60405180910390f35b3480156102bd575f80fd5b506102c66107d6565b6040516102d39190611fbc565b60405180910390f35b3480156102e7575f80fd5b5061030260048036038101906102fd9190612153565b6107df565b60405161030f919061213a565b60405180910390f35b348015610323575f80fd5b5061033e60048036038101906103399190611f79565b61080d565b005b34801561034b575f80fd5b50610354610859565b60405161036191906121be565b60405180910390f35b348015610375575f80fd5b5061037e610861565b60405161038b919061213a565b60405180910390f35b34801561039f575f80fd5b506103ba60048036038101906103b59190611f79565b610873565b6040516103c7919061213a565b60405180910390f35b3480156103db575f80fd5b506103e4610890565b005b3480156103f1575f80fd5b506103fa610975565b6040516104079190611ff5565b60405180910390f35b61042a600480360381019061042591906120e2565b61099a565b005b348015610437575f80fd5b50610440610d98565b60405161044d91906121f3565b60405180910390f35b348015610461575f80fd5b5061046a610dab565b604051610477919061213a565b60405180910390f35b34801561048b575f80fd5b506104a660048036038101906104a19190611f79565b610dbe565b6040516104b39190611fbc565b60405180910390f35b3480156104c7575f80fd5b506104d0610e03565b005b3480156104dd575f80fd5b506104e6610e16565b005b3480156104f3575f80fd5b506104fc610eb2565b604051610509919061221b565b60405180910390f35b34801561051d575f80fd5b50610526610eda565b6040516105339190612098565b60405180910390f35b348015610547575f80fd5b50610550610f6a565b60405161055d919061221b565b60405180910390f35b348015610571575f80fd5b5061058c600480360381019061058791906120e2565b610f8f565b604051610599919061213a565b60405180910390f35b3480156105ad575f80fd5b506105b6610fb1565b6040516105c39190611fbc565b60405180910390f35b3480156105d7575f80fd5b506105e0610fb7565b6040516105ed9190611ff5565b60405180910390f35b348015610601575f80fd5b5061060a610fdd565b6040516106179190611fbc565b60405180910390f35b34801561062b575f80fd5b5061064660048036038101906106419190612234565b610fe3565b6040516106539190611fbc565b60405180910390f35b348015610667575f80fd5b50610682600480360381019061067d9190611f79565b611065565b005b34801561068f575f80fd5b506106986110e9565b6040516106a591906122cd565b60405180910390f35b6106b661110e565b80600a5f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b600c5481565b600a5f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b60606003805461073390612313565b80601f016020809104026020016040519081016040528092919081815260200182805461075f90612313565b80156107aa5780601f10610781576101008083540402835291602001916107aa565b820191905f5260205f20905b81548152906001019060200180831161078d57829003601f168201915b5050505050905090565b5f806107be611195565b90506107cb81858561119c565b600191505092915050565b5f600254905090565b5f806107e9611195565b90506107f68582856111ae565b610801858585611240565b60019150509392505050565b61081561110e565b80600960026101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b5f6012905090565b600d5f9054906101000a900460ff1681565b6008602052805f5260405f205f915054906101000a900460ff1681565b3373ffffffffffffffffffffffffffffffffffffffff16600b5f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161461091f576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016109169061238d565b60405180910390fd5b5f61092930610dbe565b90505f811115610972576001600b60156101000a81548160ff02191690831515021790555061095781611330565b5f600b60156101000a81548160ff0219169083151502179055505b50565b600b5f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6109a261110e565b8160065f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060065f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663c45a01556040518163ffffffff1660e01b8152600401602060405180830381865afa158015610a4c573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610a7091906123bf565b73ffffffffffffffffffffffffffffffffffffffff1663c9c653963060065f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663ad5c46486040518163ffffffff1660e01b8152600401602060405180830381865afa158015610af6573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610b1a91906123bf565b6040518363ffffffff1660e01b8152600401610b379291906123ea565b6020604051808303815f875af1158015610b53573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610b7791906123bf565b60075f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550610bc1333083611240565b610c0d3060065f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff167fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff61119c565b60065f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663f305d7193430845f8033426040518863ffffffff1660e01b8152600401610c729695949392919061244a565b60606040518083038185885af1158015610c8e573d5f803e3d5ffd5b50505050506040513d601f19601f82011682018060405250810190610cb391906124bd565b50505060075f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663095ea7b360065f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff167fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff6040518363ffffffff1660e01b8152600401610d5392919061250d565b6020604051808303815f875af1158015610d6f573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610d93919061255e565b505050565b60095f9054906101000a900461ffff1681565b600b60149054906101000a900460ff1681565b5f805f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20549050919050565b610e0b61110e565b610e145f61162f565b565b610e1e61110e565b600d5f9054906101000a900460ff1615610e6d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e64906125d3565b60405180910390fd5b6001600b60146101000a81548160ff0219169083151502179055506001600d5f6101000a81548160ff02191690831515021790555043600e8190555042600f81905550565b5f60055f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b606060048054610ee990612313565b80601f0160208091040260200160405190810160405280929190818152602001828054610f1590612313565b8015610f605780601f10610f3757610100808354040283529160200191610f60565b820191905f5260205f20905b815481529060010190602001808311610f4357829003601f168201915b5050505050905090565b60075f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b5f80610f99611195565b9050610fa6818585611240565b600191505092915050565b600f5481565b600960029054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600e5481565b5f60015f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f2054905092915050565b61106d61110e565b5f73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16036110dd575f6040517f1e4fbdf70000000000000000000000000000000000000000000000000000000081526004016110d4919061221b565b60405180910390fd5b6110e68161162f565b50565b60065f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b611116611195565b73ffffffffffffffffffffffffffffffffffffffff16611134610eb2565b73ffffffffffffffffffffffffffffffffffffffff161461119357611157611195565b6040517f118cdaa700000000000000000000000000000000000000000000000000000000815260040161118a919061221b565b60405180910390fd5b565b5f33905090565b6111a983838360016116f2565b505050565b5f6111b98484610fe3565b90507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff811461123a578181101561122b578281836040517ffb8f41b2000000000000000000000000000000000000000000000000000000008152600401611222939291906125f1565b60405180910390fd5b61123984848484035f6116f2565b5b50505050565b5f73ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16036112b0575f6040517f96c6fd1e0000000000000000000000000000000000000000000000000000000081526004016112a7919061221b565b60405180910390fd5b5f73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603611320575f6040517fec442f05000000000000000000000000000000000000000000000000000000008152600401611317919061221b565b60405180910390fd5b61132b8383836118c1565b505050565b5f600267ffffffffffffffff81111561134c5761134b612626565b5b60405190808252806020026020018201604052801561137a5781602001602082028036833780820191505090505b50905030815f8151811061139157611390612653565b5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff168152505060065f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663ad5c46486040518163ffffffff1660e01b8152600401602060405180830381865afa158015611435573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061145991906123bf565b8160018151811061146d5761146c612653565b5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff168152505060065f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663791ac947835f8430426040518663ffffffff1660e01b8152600401611509959493929190612737565b5f604051808303815f87803b158015611520575f80fd5b505af1158015611532573d5f803e3d5ffd5b505050505f47111561162b575f60024761154c91906127e9565b90505f814761155b9190612819565b9050600960029054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166108fc8390811502906040515f60405180830381858888f193505050501580156115c2573d5f803e3d5ffd5b50600a5f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166108fc8290811502906040515f60405180830381858888f19350505050158015611627573d5f803e3d5ffd5b5050505b5050565b5f60055f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1690508160055f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b5f73ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1603611762575f6040517fe602df05000000000000000000000000000000000000000000000000000000008152600401611759919061221b565b60405180910390fd5b5f73ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16036117d2575f6040517f94280d620000000000000000000000000000000000000000000000000000000081526004016117c9919061221b565b60405180910390fd5b8160015f8673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f8573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f208190555080156118bb578273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925846040516118b29190611fbc565b60405180910390a35b50505050565b5f8111611903576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016118fa90612896565b60405180910390fd5b5f61190d30610dbe565b90505f600c5482101590508080156119325750600b60159054906101000a900460ff16155b801561198b575060075f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff1614155b80156119e3575060075f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff16145b80156119fb5750600b60149054906101000a900460ff165b15611a3f576001600b60156101000a81548160ff021916908315150217905550611a2482611330565b5f600b60156101000a81548160ff0219169083151502179055505b5f6004600e54611a4f91906128b4565b431115611a715760095f9054906101000a900461ffff1661ffff169050611aef565b6003600e54611a8091906128b4565b431115611a91576103e89050611aee565b6002600e54611aa091906128b4565b431115611ab1576105dc9050611aed565b6001600e54611ac091906128b4565b431115611ad1576107d09050611aec565b600e54431115611ae5576109c49050611aeb565b610bb890505b5b5b5b5b5f60085f8873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff16158015611b8e575060085f8773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff16155b8015611ba75750600b60159054906101000a900460ff16155b8015611c56575060075f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168773ffffffffffffffffffffffffffffffffffffffff161480611c55575060075f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff16145b5b15611cad57600d5f9054906101000a900460ff16611ca9576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ca090612931565b60405180910390fd5b8190505b5f6127108287611cbd919061294f565b611cc791906127e9565b90505f8187611cd69190612819565b9050611ce3898983611d02565b5f821115611cf757611cf6893084611d02565b5b505050505050505050565b5f73ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603611d52578060025f828254611d4691906128b4565b92505081905550611e20565b5f805f8573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f2054905081811015611ddb578381836040517fe450d38c000000000000000000000000000000000000000000000000000000008152600401611dd2939291906125f1565b60405180910390fd5b8181035f808673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f2081905550505b5f73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603611e67578060025f8282540392505081905550611eb1565b805f808473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f82825401925050819055505b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef83604051611f0e9190611fbc565b60405180910390a3505050565b5f80fd5b5f73ffffffffffffffffffffffffffffffffffffffff82169050919050565b5f611f4882611f1f565b9050919050565b611f5881611f3e565b8114611f62575f80fd5b50565b5f81359050611f7381611f4f565b92915050565b5f60208284031215611f8e57611f8d611f1b565b5b5f611f9b84828501611f65565b91505092915050565b5f819050919050565b611fb681611fa4565b82525050565b5f602082019050611fcf5f830184611fad565b92915050565b5f611fdf82611f1f565b9050919050565b611fef81611fd5565b82525050565b5f6020820190506120085f830184611fe6565b92915050565b5f81519050919050565b5f82825260208201905092915050565b5f5b8381101561204557808201518184015260208101905061202a565b5f8484015250505050565b5f601f19601f8301169050919050565b5f61206a8261200e565b6120748185612018565b9350612084818560208601612028565b61208d81612050565b840191505092915050565b5f6020820190508181035f8301526120b08184612060565b905092915050565b6120c181611fa4565b81146120cb575f80fd5b50565b5f813590506120dc816120b8565b92915050565b5f80604083850312156120f8576120f7611f1b565b5b5f61210585828601611f65565b9250506020612116858286016120ce565b9150509250929050565b5f8115159050919050565b61213481612120565b82525050565b5f60208201905061214d5f83018461212b565b92915050565b5f805f6060848603121561216a57612169611f1b565b5b5f61217786828701611f65565b935050602061218886828701611f65565b9250506040612199868287016120ce565b9150509250925092565b5f60ff82169050919050565b6121b8816121a3565b82525050565b5f6020820190506121d15f8301846121af565b92915050565b5f61ffff82169050919050565b6121ed816121d7565b82525050565b5f6020820190506122065f8301846121e4565b92915050565b61221581611f3e565b82525050565b5f60208201905061222e5f83018461220c565b92915050565b5f806040838503121561224a57612249611f1b565b5b5f61225785828601611f65565b925050602061226885828601611f65565b9150509250929050565b5f819050919050565b5f61229561229061228b84611f1f565b612272565b611f1f565b9050919050565b5f6122a68261227b565b9050919050565b5f6122b78261229c565b9050919050565b6122c7816122ad565b82525050565b5f6020820190506122e05f8301846122be565b92915050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52602260045260245ffd5b5f600282049050600182168061232a57607f821691505b60208210810361233d5761233c6122e6565b5b50919050565b7f4d5553545f42455f4445504c4f595f57414c4c455400000000000000000000005f82015250565b5f612377601583612018565b915061238282612343565b602082019050919050565b5f6020820190508181035f8301526123a48161236b565b9050919050565b5f815190506123b981611f4f565b92915050565b5f602082840312156123d4576123d3611f1b565b5b5f6123e1848285016123ab565b91505092915050565b5f6040820190506123fd5f83018561220c565b61240a602083018461220c565b9392505050565b5f819050919050565b5f61243461242f61242a84612411565b612272565b611fa4565b9050919050565b6124448161241a565b82525050565b5f60c08201905061245d5f83018961220c565b61246a6020830188611fad565b612477604083018761243b565b612484606083018661243b565b612491608083018561220c565b61249e60a0830184611fad565b979650505050505050565b5f815190506124b7816120b8565b92915050565b5f805f606084860312156124d4576124d3611f1b565b5b5f6124e1868287016124a9565b93505060206124f2868287016124a9565b9250506040612503868287016124a9565b9150509250925092565b5f6040820190506125205f83018561220c565b61252d6020830184611fad565b9392505050565b61253d81612120565b8114612547575f80fd5b50565b5f8151905061255881612534565b92915050565b5f6020828403121561257357612572611f1b565b5b5f6125808482850161254a565b91505092915050565b7f54524144494e475f414c52454144595f454e41424c45440000000000000000005f82015250565b5f6125bd601783612018565b91506125c882612589565b602082019050919050565b5f6020820190508181035f8301526125ea816125b1565b9050919050565b5f6060820190506126045f83018661220c565b6126116020830185611fad565b61261e6040830184611fad565b949350505050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b7f4e487b71000000000000000000000000000000000000000000000000000000005f52603260045260245ffd5b5f81519050919050565b5f82825260208201905092915050565b5f819050602082019050919050565b6126b281611f3e565b82525050565b5f6126c383836126a9565b60208301905092915050565b5f602082019050919050565b5f6126e582612680565b6126ef818561268a565b93506126fa8361269a565b805f5b8381101561272a57815161271188826126b8565b975061271c836126cf565b9250506001810190506126fd565b5085935050505092915050565b5f60a08201905061274a5f830188611fad565b612757602083018761243b565b818103604083015261276981866126db565b9050612778606083018561220c565b6127856080830184611fad565b9695505050505050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601260045260245ffd5b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b5f6127f382611fa4565b91506127fe83611fa4565b92508261280e5761280d61278f565b5b828204905092915050565b5f61282382611fa4565b915061282e83611fa4565b9250828203905081811115612846576128456127bc565b5b92915050565b7f5452414e534645525f5a45524f000000000000000000000000000000000000005f82015250565b5f612880600d83612018565b915061288b8261284c565b602082019050919050565b5f6020820190508181035f8301526128ad81612874565b9050919050565b5f6128be82611fa4565b91506128c983611fa4565b92508282019050808211156128e1576128e06127bc565b5b92915050565b7f54524144494e475f44495341424c4544000000000000000000000000000000005f82015250565b5f61291b601083612018565b9150612926826128e7565b602082019050919050565b5f6020820190508181035f8301526129488161290f565b9050919050565b5f61295982611fa4565b915061296483611fa4565b925082820261297281611fa4565b91508282048414831517612989576129886127bc565b5b509291505056fea2646970667358221220fadcfd02430c9218a6361d5839c858ef565d48d93153411f6b7f6a72bfc74fd864736f6c6343000814003300000000000000000000000000000000000000000052b7d2dcc80cd2e40000000000000000000000000000002f16f69fffed4da2dd06efde3388dda5701ccb13000000000000000000000000145420c4ef48f864c9dea76d261158d4884e9ce1

Deployed Bytecode

0x6080604052600436106101c5575f3560e01c806356f43352116100f6578063a8aa1b3111610094578063cd51e6d411610063578063cd51e6d4146105f6578063dd62ed3e14610620578063f2fde38b1461065c578063f887ea4014610684576101cc565b8063a8aa1b311461053c578063a9059cbb14610566578063b8158d60146105a2578063c04a5414146105cc576101cc565b8063715018a6116100d0578063715018a6146104bc5780638a8c523c146104d25780638da5cb5b146104e857806395d89b4114610512576101cc565b806356f433521461042c5780636ddd17131461045657806370a0823114610480576101cc565b806329b1c15c116101635780634fbee1931161013d5780634fbee1931461039457806351bc3c85146103d057806353535db9146103e65780635668870014610410576101cc565b806329b1c15c14610318578063313ce567146103405780634ada218b1461036a576101cc565b806306fdde031161019f57806306fdde031461024c578063095ea7b31461027657806318160ddd146102b257806323b872dd146102dc576101cc565b806303248dce146101d05780630352b2ee146101f85780630676c1b714610222576101cc565b366101cc57005b5f80fd5b3480156101db575f80fd5b506101f660048036038101906101f19190611f79565b6106ae565b005b348015610203575f80fd5b5061020c6106f9565b6040516102199190611fbc565b60405180910390f35b34801561022d575f80fd5b506102366106ff565b6040516102439190611ff5565b60405180910390f35b348015610257575f80fd5b50610260610724565b60405161026d9190612098565b60405180910390f35b348015610281575f80fd5b5061029c600480360381019061029791906120e2565b6107b4565b6040516102a9919061213a565b60405180910390f35b3480156102bd575f80fd5b506102c66107d6565b6040516102d39190611fbc565b60405180910390f35b3480156102e7575f80fd5b5061030260048036038101906102fd9190612153565b6107df565b60405161030f919061213a565b60405180910390f35b348015610323575f80fd5b5061033e60048036038101906103399190611f79565b61080d565b005b34801561034b575f80fd5b50610354610859565b60405161036191906121be565b60405180910390f35b348015610375575f80fd5b5061037e610861565b60405161038b919061213a565b60405180910390f35b34801561039f575f80fd5b506103ba60048036038101906103b59190611f79565b610873565b6040516103c7919061213a565b60405180910390f35b3480156103db575f80fd5b506103e4610890565b005b3480156103f1575f80fd5b506103fa610975565b6040516104079190611ff5565b60405180910390f35b61042a600480360381019061042591906120e2565b61099a565b005b348015610437575f80fd5b50610440610d98565b60405161044d91906121f3565b60405180910390f35b348015610461575f80fd5b5061046a610dab565b604051610477919061213a565b60405180910390f35b34801561048b575f80fd5b506104a660048036038101906104a19190611f79565b610dbe565b6040516104b39190611fbc565b60405180910390f35b3480156104c7575f80fd5b506104d0610e03565b005b3480156104dd575f80fd5b506104e6610e16565b005b3480156104f3575f80fd5b506104fc610eb2565b604051610509919061221b565b60405180910390f35b34801561051d575f80fd5b50610526610eda565b6040516105339190612098565b60405180910390f35b348015610547575f80fd5b50610550610f6a565b60405161055d919061221b565b60405180910390f35b348015610571575f80fd5b5061058c600480360381019061058791906120e2565b610f8f565b604051610599919061213a565b60405180910390f35b3480156105ad575f80fd5b506105b6610fb1565b6040516105c39190611fbc565b60405180910390f35b3480156105d7575f80fd5b506105e0610fb7565b6040516105ed9190611ff5565b60405180910390f35b348015610601575f80fd5b5061060a610fdd565b6040516106179190611fbc565b60405180910390f35b34801561062b575f80fd5b5061064660048036038101906106419190612234565b610fe3565b6040516106539190611fbc565b60405180910390f35b348015610667575f80fd5b50610682600480360381019061067d9190611f79565b611065565b005b34801561068f575f80fd5b506106986110e9565b6040516106a591906122cd565b60405180910390f35b6106b661110e565b80600a5f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b600c5481565b600a5f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b60606003805461073390612313565b80601f016020809104026020016040519081016040528092919081815260200182805461075f90612313565b80156107aa5780601f10610781576101008083540402835291602001916107aa565b820191905f5260205f20905b81548152906001019060200180831161078d57829003601f168201915b5050505050905090565b5f806107be611195565b90506107cb81858561119c565b600191505092915050565b5f600254905090565b5f806107e9611195565b90506107f68582856111ae565b610801858585611240565b60019150509392505050565b61081561110e565b80600960026101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b5f6012905090565b600d5f9054906101000a900460ff1681565b6008602052805f5260405f205f915054906101000a900460ff1681565b3373ffffffffffffffffffffffffffffffffffffffff16600b5f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161461091f576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016109169061238d565b60405180910390fd5b5f61092930610dbe565b90505f811115610972576001600b60156101000a81548160ff02191690831515021790555061095781611330565b5f600b60156101000a81548160ff0219169083151502179055505b50565b600b5f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6109a261110e565b8160065f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060065f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663c45a01556040518163ffffffff1660e01b8152600401602060405180830381865afa158015610a4c573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610a7091906123bf565b73ffffffffffffffffffffffffffffffffffffffff1663c9c653963060065f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663ad5c46486040518163ffffffff1660e01b8152600401602060405180830381865afa158015610af6573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610b1a91906123bf565b6040518363ffffffff1660e01b8152600401610b379291906123ea565b6020604051808303815f875af1158015610b53573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610b7791906123bf565b60075f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550610bc1333083611240565b610c0d3060065f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff167fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff61119c565b60065f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663f305d7193430845f8033426040518863ffffffff1660e01b8152600401610c729695949392919061244a565b60606040518083038185885af1158015610c8e573d5f803e3d5ffd5b50505050506040513d601f19601f82011682018060405250810190610cb391906124bd565b50505060075f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663095ea7b360065f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff167fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff6040518363ffffffff1660e01b8152600401610d5392919061250d565b6020604051808303815f875af1158015610d6f573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610d93919061255e565b505050565b60095f9054906101000a900461ffff1681565b600b60149054906101000a900460ff1681565b5f805f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20549050919050565b610e0b61110e565b610e145f61162f565b565b610e1e61110e565b600d5f9054906101000a900460ff1615610e6d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e64906125d3565b60405180910390fd5b6001600b60146101000a81548160ff0219169083151502179055506001600d5f6101000a81548160ff02191690831515021790555043600e8190555042600f81905550565b5f60055f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b606060048054610ee990612313565b80601f0160208091040260200160405190810160405280929190818152602001828054610f1590612313565b8015610f605780601f10610f3757610100808354040283529160200191610f60565b820191905f5260205f20905b815481529060010190602001808311610f4357829003601f168201915b5050505050905090565b60075f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b5f80610f99611195565b9050610fa6818585611240565b600191505092915050565b600f5481565b600960029054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600e5481565b5f60015f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f2054905092915050565b61106d61110e565b5f73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16036110dd575f6040517f1e4fbdf70000000000000000000000000000000000000000000000000000000081526004016110d4919061221b565b60405180910390fd5b6110e68161162f565b50565b60065f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b611116611195565b73ffffffffffffffffffffffffffffffffffffffff16611134610eb2565b73ffffffffffffffffffffffffffffffffffffffff161461119357611157611195565b6040517f118cdaa700000000000000000000000000000000000000000000000000000000815260040161118a919061221b565b60405180910390fd5b565b5f33905090565b6111a983838360016116f2565b505050565b5f6111b98484610fe3565b90507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff811461123a578181101561122b578281836040517ffb8f41b2000000000000000000000000000000000000000000000000000000008152600401611222939291906125f1565b60405180910390fd5b61123984848484035f6116f2565b5b50505050565b5f73ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16036112b0575f6040517f96c6fd1e0000000000000000000000000000000000000000000000000000000081526004016112a7919061221b565b60405180910390fd5b5f73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603611320575f6040517fec442f05000000000000000000000000000000000000000000000000000000008152600401611317919061221b565b60405180910390fd5b61132b8383836118c1565b505050565b5f600267ffffffffffffffff81111561134c5761134b612626565b5b60405190808252806020026020018201604052801561137a5781602001602082028036833780820191505090505b50905030815f8151811061139157611390612653565b5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff168152505060065f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663ad5c46486040518163ffffffff1660e01b8152600401602060405180830381865afa158015611435573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061145991906123bf565b8160018151811061146d5761146c612653565b5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff168152505060065f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663791ac947835f8430426040518663ffffffff1660e01b8152600401611509959493929190612737565b5f604051808303815f87803b158015611520575f80fd5b505af1158015611532573d5f803e3d5ffd5b505050505f47111561162b575f60024761154c91906127e9565b90505f814761155b9190612819565b9050600960029054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166108fc8390811502906040515f60405180830381858888f193505050501580156115c2573d5f803e3d5ffd5b50600a5f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166108fc8290811502906040515f60405180830381858888f19350505050158015611627573d5f803e3d5ffd5b5050505b5050565b5f60055f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1690508160055f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b5f73ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1603611762575f6040517fe602df05000000000000000000000000000000000000000000000000000000008152600401611759919061221b565b60405180910390fd5b5f73ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16036117d2575f6040517f94280d620000000000000000000000000000000000000000000000000000000081526004016117c9919061221b565b60405180910390fd5b8160015f8673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f8573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f208190555080156118bb578273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925846040516118b29190611fbc565b60405180910390a35b50505050565b5f8111611903576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016118fa90612896565b60405180910390fd5b5f61190d30610dbe565b90505f600c5482101590508080156119325750600b60159054906101000a900460ff16155b801561198b575060075f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff1614155b80156119e3575060075f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff16145b80156119fb5750600b60149054906101000a900460ff165b15611a3f576001600b60156101000a81548160ff021916908315150217905550611a2482611330565b5f600b60156101000a81548160ff0219169083151502179055505b5f6004600e54611a4f91906128b4565b431115611a715760095f9054906101000a900461ffff1661ffff169050611aef565b6003600e54611a8091906128b4565b431115611a91576103e89050611aee565b6002600e54611aa091906128b4565b431115611ab1576105dc9050611aed565b6001600e54611ac091906128b4565b431115611ad1576107d09050611aec565b600e54431115611ae5576109c49050611aeb565b610bb890505b5b5b5b5b5f60085f8873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff16158015611b8e575060085f8773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff16155b8015611ba75750600b60159054906101000a900460ff16155b8015611c56575060075f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168773ffffffffffffffffffffffffffffffffffffffff161480611c55575060075f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff16145b5b15611cad57600d5f9054906101000a900460ff16611ca9576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ca090612931565b60405180910390fd5b8190505b5f6127108287611cbd919061294f565b611cc791906127e9565b90505f8187611cd69190612819565b9050611ce3898983611d02565b5f821115611cf757611cf6893084611d02565b5b505050505050505050565b5f73ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603611d52578060025f828254611d4691906128b4565b92505081905550611e20565b5f805f8573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f2054905081811015611ddb578381836040517fe450d38c000000000000000000000000000000000000000000000000000000008152600401611dd2939291906125f1565b60405180910390fd5b8181035f808673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f2081905550505b5f73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603611e67578060025f8282540392505081905550611eb1565b805f808473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f82825401925050819055505b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef83604051611f0e9190611fbc565b60405180910390a3505050565b5f80fd5b5f73ffffffffffffffffffffffffffffffffffffffff82169050919050565b5f611f4882611f1f565b9050919050565b611f5881611f3e565b8114611f62575f80fd5b50565b5f81359050611f7381611f4f565b92915050565b5f60208284031215611f8e57611f8d611f1b565b5b5f611f9b84828501611f65565b91505092915050565b5f819050919050565b611fb681611fa4565b82525050565b5f602082019050611fcf5f830184611fad565b92915050565b5f611fdf82611f1f565b9050919050565b611fef81611fd5565b82525050565b5f6020820190506120085f830184611fe6565b92915050565b5f81519050919050565b5f82825260208201905092915050565b5f5b8381101561204557808201518184015260208101905061202a565b5f8484015250505050565b5f601f19601f8301169050919050565b5f61206a8261200e565b6120748185612018565b9350612084818560208601612028565b61208d81612050565b840191505092915050565b5f6020820190508181035f8301526120b08184612060565b905092915050565b6120c181611fa4565b81146120cb575f80fd5b50565b5f813590506120dc816120b8565b92915050565b5f80604083850312156120f8576120f7611f1b565b5b5f61210585828601611f65565b9250506020612116858286016120ce565b9150509250929050565b5f8115159050919050565b61213481612120565b82525050565b5f60208201905061214d5f83018461212b565b92915050565b5f805f6060848603121561216a57612169611f1b565b5b5f61217786828701611f65565b935050602061218886828701611f65565b9250506040612199868287016120ce565b9150509250925092565b5f60ff82169050919050565b6121b8816121a3565b82525050565b5f6020820190506121d15f8301846121af565b92915050565b5f61ffff82169050919050565b6121ed816121d7565b82525050565b5f6020820190506122065f8301846121e4565b92915050565b61221581611f3e565b82525050565b5f60208201905061222e5f83018461220c565b92915050565b5f806040838503121561224a57612249611f1b565b5b5f61225785828601611f65565b925050602061226885828601611f65565b9150509250929050565b5f819050919050565b5f61229561229061228b84611f1f565b612272565b611f1f565b9050919050565b5f6122a68261227b565b9050919050565b5f6122b78261229c565b9050919050565b6122c7816122ad565b82525050565b5f6020820190506122e05f8301846122be565b92915050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52602260045260245ffd5b5f600282049050600182168061232a57607f821691505b60208210810361233d5761233c6122e6565b5b50919050565b7f4d5553545f42455f4445504c4f595f57414c4c455400000000000000000000005f82015250565b5f612377601583612018565b915061238282612343565b602082019050919050565b5f6020820190508181035f8301526123a48161236b565b9050919050565b5f815190506123b981611f4f565b92915050565b5f602082840312156123d4576123d3611f1b565b5b5f6123e1848285016123ab565b91505092915050565b5f6040820190506123fd5f83018561220c565b61240a602083018461220c565b9392505050565b5f819050919050565b5f61243461242f61242a84612411565b612272565b611fa4565b9050919050565b6124448161241a565b82525050565b5f60c08201905061245d5f83018961220c565b61246a6020830188611fad565b612477604083018761243b565b612484606083018661243b565b612491608083018561220c565b61249e60a0830184611fad565b979650505050505050565b5f815190506124b7816120b8565b92915050565b5f805f606084860312156124d4576124d3611f1b565b5b5f6124e1868287016124a9565b93505060206124f2868287016124a9565b9250506040612503868287016124a9565b9150509250925092565b5f6040820190506125205f83018561220c565b61252d6020830184611fad565b9392505050565b61253d81612120565b8114612547575f80fd5b50565b5f8151905061255881612534565b92915050565b5f6020828403121561257357612572611f1b565b5b5f6125808482850161254a565b91505092915050565b7f54524144494e475f414c52454144595f454e41424c45440000000000000000005f82015250565b5f6125bd601783612018565b91506125c882612589565b602082019050919050565b5f6020820190508181035f8301526125ea816125b1565b9050919050565b5f6060820190506126045f83018661220c565b6126116020830185611fad565b61261e6040830184611fad565b949350505050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b7f4e487b71000000000000000000000000000000000000000000000000000000005f52603260045260245ffd5b5f81519050919050565b5f82825260208201905092915050565b5f819050602082019050919050565b6126b281611f3e565b82525050565b5f6126c383836126a9565b60208301905092915050565b5f602082019050919050565b5f6126e582612680565b6126ef818561268a565b93506126fa8361269a565b805f5b8381101561272a57815161271188826126b8565b975061271c836126cf565b9250506001810190506126fd565b5085935050505092915050565b5f60a08201905061274a5f830188611fad565b612757602083018761243b565b818103604083015261276981866126db565b9050612778606083018561220c565b6127856080830184611fad565b9695505050505050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601260045260245ffd5b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b5f6127f382611fa4565b91506127fe83611fa4565b92508261280e5761280d61278f565b5b828204905092915050565b5f61282382611fa4565b915061282e83611fa4565b9250828203905081811115612846576128456127bc565b5b92915050565b7f5452414e534645525f5a45524f000000000000000000000000000000000000005f82015250565b5f612880600d83612018565b915061288b8261284c565b602082019050919050565b5f6020820190508181035f8301526128ad81612874565b9050919050565b5f6128be82611fa4565b91506128c983611fa4565b92508282019050808211156128e1576128e06127bc565b5b92915050565b7f54524144494e475f44495341424c4544000000000000000000000000000000005f82015250565b5f61291b601083612018565b9150612926826128e7565b602082019050919050565b5f6020820190508181035f8301526129488161290f565b9050919050565b5f61295982611fa4565b915061296483611fa4565b925082820261297281611fa4565b91508282048414831517612989576129886127bc565b5b509291505056fea2646970667358221220fadcfd02430c9218a6361d5839c858ef565d48d93153411f6b7f6a72bfc74fd864736f6c63430008140033

Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)

00000000000000000000000000000000000000000052b7d2dcc80cd2e40000000000000000000000000000002f16f69fffed4da2dd06efde3388dda5701ccb13000000000000000000000000145420c4ef48f864c9dea76d261158d4884e9ce1

-----Decoded View---------------
Arg [0] : _startingSupply (uint256): 100000000000000000000000000
Arg [1] : _developmentAddress (address): 0x2f16f69fffEd4DA2dd06EFdE3388DDA5701cCb13
Arg [2] : _protocolAddress (address): 0x145420c4eF48F864C9dea76D261158D4884e9ce1

-----Encoded View---------------
3 Constructor Arguments found :
Arg [0] : 00000000000000000000000000000000000000000052b7d2dcc80cd2e4000000
Arg [1] : 0000000000000000000000002f16f69fffed4da2dd06efde3388dda5701ccb13
Arg [2] : 000000000000000000000000145420c4ef48f864c9dea76d261158d4884e9ce1


Deployed Bytecode Sourcemap

36447:7301:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;38937:141;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;37555:33;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;37173:38;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;26924:123;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;29313:190;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;28122:99;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;30081:249;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;39086:128;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;27941:116;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;37597:26;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;36781:51;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;40736:319;;;;;;;;;;;;;:::i;:::-;;37292:35;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;39409:788;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;36966:24;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;37393:23;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;28284:118;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;12622:103;;;;;;;;;;;;;:::i;:::-;;40355:253;;;;;;;;;;;;;:::i;:::-;;11947:87;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;27166:127;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;36672:19;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;28607:182;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;37664:26;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;37069:40;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;37630:27;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;28852:142;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;12880:220;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;36582:32;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;38937:141;11833:13;:11;:13::i;:::-;39053:16:::1;39027:15;;:43;;;;;;;;;;;;;;;;;;38937:141:::0;:::o;37555:33::-;;;;:::o;37173:38::-;;;;;;;;;;;;;:::o;26924:123::-;27001:13;27034:5;27027:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;26924:123;:::o;29313:190::-;29386:4;29403:13;29419:12;:10;:12::i;:::-;29403:28;;29442:31;29451:5;29458:7;29467:5;29442:8;:31::i;:::-;29491:4;29484:11;;;29313:190;;;;:::o;28122:99::-;28174:7;28201:12;;28194:19;;28122:99;:::o;30081:249::-;30168:4;30185:15;30203:12;:10;:12::i;:::-;30185:30;;30226:37;30242:4;30248:7;30257:5;30226:15;:37::i;:::-;30274:26;30284:4;30290:2;30294:5;30274:9;:26::i;:::-;30318:4;30311:11;;;30081:249;;;;;:::o;39086:128::-;11833:13;:11;:13::i;:::-;39195:10:::1;39167:17;;:39;;;;;;;;;;;;;;;;;;39086:128:::0;:::o;27941:116::-;28022:5;28047:2;28040:9;;27941:116;:::o;37597:26::-;;;;;;;;;;;;;:::o;36781:51::-;;;;;;;;;;;;;;;;;;;;;;:::o;40736:319::-;40802:10;40786:26;;:12;;;;;;;;;;;:26;;;40778:60;;;;;;;;;;;;:::i;:::-;;;;;;;;;40851:20;40874:24;40892:4;40874:9;:24::i;:::-;40851:47;;40928:1;40913:12;:16;40909:139;;;40957:4;40946:8;;:15;;;;;;;;;;;;;;;;;;40976:29;40992:12;40976:15;:29::i;:::-;41031:5;41020:8;;:16;;;;;;;;;;;;;;;;;;40909:139;40767:288;40736:319::o;37292:35::-;;;;;;;;;;;;;:::o;39409:788::-;11833:13;:11;:13::i;:::-;39682:14:::1;39654:6;;:43;;;;;;;;;;;;;;;;;;39733:6;;;;;;;;;;;:14;;;:16;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;39715:46;;;39770:4;39777:6;;;;;;;;;;;:11;;;:13;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;39715:76;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;39708:4;;:83;;;;;;;;;;;;;;;;;;39804:49;39814:10;39834:4;39841:11;39804:9;:49::i;:::-;39866:56;39883:4;39898:6;;;;;;;;;;;39907:14;39866:8;:56::i;:::-;39933:6;;;;;;;;;;;:22;;;39963:9;39996:4;40016:11;40042:1;40058::::0;40074:10:::1;40099:15;39933:192;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;40143:4;;;;;;;;;;;40136:20;;;40165:6;;;;;;;;;;;40174:14;40136:53;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;39409:788:::0;;:::o;36966:24::-;;;;;;;;;;;;;:::o;37393:23::-;;;;;;;;;;;;;:::o;28284:118::-;28349:7;28376:9;:18;28386:7;28376:18;;;;;;;;;;;;;;;;28369:25;;28284:118;;;:::o;12622:103::-;11833:13;:11;:13::i;:::-;12687:30:::1;12714:1;12687:18;:30::i;:::-;12622:103::o:0;40355:253::-;11833:13;:11;:13::i;:::-;40419:14:::1;;;;;;;;;;;40418:15;40410:51;;;;;;;;;;;;:::i;:::-;;;;;;;;;40486:4;40472:11;;:18;;;;;;;;;;;;;;;;;;40518:4;40501:14;;:21;;;;;;;;;;;;;;;;;;40548:12;40533;:27;;;;40585:15;40571:11;:29;;;;40355:253::o:0;11947:87::-;11993:7;12020:6;;;;;;;;;;;12013:13;;11947:87;:::o;27166:127::-;27245:13;27278:7;27271:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;27166:127;:::o;36672:19::-;;;;;;;;;;;;;:::o;28607:182::-;28676:4;28693:13;28709:12;:10;:12::i;:::-;28693:28;;28732:27;28742:5;28749:2;28753:5;28732:9;:27::i;:::-;28777:4;28770:11;;;28607:182;;;;:::o;37664:26::-;;;;:::o;37069:40::-;;;;;;;;;;;;;:::o;37630:27::-;;;;:::o;28852:142::-;28932:7;28959:11;:18;28971:5;28959:18;;;;;;;;;;;;;;;:27;28978:7;28959:27;;;;;;;;;;;;;;;;28952:34;;28852:142;;;;:::o;12880:220::-;11833:13;:11;:13::i;:::-;12985:1:::1;12965:22;;:8;:22;;::::0;12961:93:::1;;13039:1;13011:31;;;;;;;;;;;:::i;:::-;;;;;;;;12961:93;13064:28;13083:8;13064:18;:28::i;:::-;12880:220:::0;:::o;36582:32::-;;;;;;;;;;;;;:::o;12112:166::-;12183:12;:10;:12::i;:::-;12172:23;;:7;:5;:7::i;:::-;:23;;;12168:103;;12246:12;:10;:12::i;:::-;12219:40;;;;;;;;;;;:::i;:::-;;;;;;;;12168:103;12112:166::o;10222:98::-;10275:7;10302:10;10295:17;;10222:98;:::o;34140:130::-;34225:37;34234:5;34241:7;34250:5;34257:4;34225:8;:37::i;:::-;34140:130;;;:::o;35856:487::-;35956:24;35983:25;35993:5;36000:7;35983:9;:25::i;:::-;35956:52;;36043:17;36023:16;:37;36019:317;;36100:5;36081:16;:24;36077:132;;;36160:7;36169:16;36187:5;36133:60;;;;;;;;;;;;;:::i;:::-;;;;;;;;36077:132;36252:57;36261:5;36268:7;36296:5;36277:16;:24;36303:5;36252:8;:57::i;:::-;36019:317;35945:398;35856:487;;;:::o;30715:308::-;30815:1;30799:18;;:4;:18;;;30795:88;;30868:1;30841:30;;;;;;;;;;;:::i;:::-;;;;;;;;30795:88;30911:1;30897:16;;:2;:16;;;30893:88;;30966:1;30937:32;;;;;;;;;;;:::i;:::-;;;;;;;;30893:88;30991:24;30999:4;31005:2;31009:5;30991:7;:24::i;:::-;30715:308;;;:::o;43040:705::-;43106:21;43144:1;43130:16;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;43106:40;;43175:4;43157;43162:1;43157:7;;;;;;;;:::i;:::-;;;;;;;:23;;;;;;;;;;;43201:6;;;;;;;;;;;:11;;;:13;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;43191:4;43196:1;43191:7;;;;;;;;:::i;:::-;;;;;;;:23;;;;;;;;;;;43227:6;;;;;;;;;;;:57;;;43299:11;43325:1;43341:4;43368;43388:15;43227:177;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;43445:1;43421:21;:25;43417:321;;;43477:25;43529:1;43505:21;:25;;;;:::i;:::-;43477:53;;43545:22;43594:17;43570:21;:41;;;;:::i;:::-;43545:66;;43626:17;;;;;;;;;;;:26;;:45;43653:17;43626:45;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;43686:15;;;;;;;;;;;:24;;:40;43711:14;43686:40;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;43448:290;;43417:321;43095:650;43040:705;:::o;13260:191::-;13334:16;13353:6;;;;;;;;;;;13334:25;;13379:8;13370:6;;:17;;;;;;;;;;;;;;;;;;13434:8;13403:40;;13424:8;13403:40;;;;;;;;;;;;13323:128;13260:191;:::o;35121:443::-;35251:1;35234:19;;:5;:19;;;35230:91;;35306:1;35277:32;;;;;;;;;;;:::i;:::-;;;;;;;;35230:91;35354:1;35335:21;;:7;:21;;;35331:92;;35408:1;35380:31;;;;;;;;;;;:::i;:::-;;;;;;;;35331:92;35463:5;35433:11;:18;35445:5;35433:18;;;;;;;;;;;;;;;:27;35452:7;35433:27;;;;;;;;;;;;;;;:35;;;;35483:9;35479:78;;;35530:7;35514:31;;35523:5;35514:31;;;35539:5;35514:31;;;;;;:::i;:::-;;;;;;;;35479:78;35121:443;;;;:::o;41347:1685::-;41452:1;41443:6;:10;41435:36;;;;;;;;;;;;:::i;:::-;;;;;;;;;41476:28;41507:24;41525:4;41507:9;:24::i;:::-;41476:55;;41544:12;41583:18;;41559:20;:42;;41544:57;;41618:7;:33;;;;;41643:8;;;;;;;;;;;41642:9;41618:33;:62;;;;;41676:4;;;;;;;;;;;41668:12;;:4;:12;;;;41618:62;:90;;;;;41704:4;;;;;;;;;;;41698:10;;:2;:10;;;41618:90;:118;;;;;41725:11;;;;;;;;;;;41618:118;41614:259;;;41774:4;41763:8;;:15;;;;;;;;;;;;;;;;;;41793:37;41809:20;41793:15;:37::i;:::-;41856:5;41845:8;;:16;;;;;;;;;;;;;;;;;;41614:259;41885:11;41941:1;41926:12;;:16;;;;:::i;:::-;41911:12;:31;41907:435;;;41964:10;;;;;;;;;;;41958:16;;;;41907:435;;;42026:1;42011:12;;:16;;;;:::i;:::-;41996:12;:31;41992:350;;;42049:4;42043:10;;41992:350;;;42105:1;42090:12;;:16;;;;:::i;:::-;42075:12;:31;42071:271;;;42128:4;42122:10;;42071:271;;;42184:1;42169:12;;:16;;;;:::i;:::-;42154:12;:31;42150:192;;;42207:4;42201:10;;42150:192;;;42248:12;;42233;:27;42229:113;;;42283:4;42277:10;;42229:113;;;42326:4;42320:10;;42229:113;42150:192;42071:271;41992:350;41907:435;42431:11;42462:18;:24;42481:4;42462:24;;;;;;;;;;;;;;;;;;;;;;;;;42461:25;:52;;;;;42491:18;:22;42510:2;42491:22;;;;;;;;;;;;;;;;;;;;;;;;;42490:23;42461:52;:65;;;;;42518:8;;;;;;;;;;;42517:9;42461:65;:97;;;;;42539:4;;;;;;;;;;;42531:12;;:4;:12;;;:26;;;;42553:4;;;;;;;;;;;42547:10;;:2;:10;;;42531:26;42461:97;42457:197;;;42583:14;;;;;;;;;;;42575:43;;;;;;;;;;;;:::i;:::-;;;;;;;;;42639:3;42633:9;;42457:197;42779:17;42816:3;42809;42800:6;:12;;;;:::i;:::-;42799:20;;;;:::i;:::-;42779:40;;42830:22;42864:9;42855:6;:18;;;;:::i;:::-;42830:43;;42884:39;42898:4;42904:2;42908:14;42884:13;:39::i;:::-;42950:1;42938:9;:13;42934:91;;;42968:45;42982:4;42996;43003:9;42968:13;:45::i;:::-;42934:91;41424:1608;;;;;;41347:1685;;;:::o;31347:1135::-;31453:1;31437:18;;:4;:18;;;31433:552;;31591:5;31575:12;;:21;;;;;;;:::i;:::-;;;;;;;;31433:552;;;31629:19;31651:9;:15;31661:4;31651:15;;;;;;;;;;;;;;;;31629:37;;31699:5;31685:11;:19;31681:117;;;31757:4;31763:11;31776:5;31732:50;;;;;;;;;;;;;:::i;:::-;;;;;;;;31681:117;31953:5;31939:11;:19;31921:9;:15;31931:4;31921:15;;;;;;;;;;;;;;;:37;;;;31614:371;31433:552;32015:1;32001:16;;:2;:16;;;31997:435;;32183:5;32167:12;;:21;;;;;;;;;;;31997:435;;;32400:5;32383:9;:13;32393:2;32383:13;;;;;;;;;;;;;;;;:22;;;;;;;;;;;31997:435;32464:2;32449:25;;32458:4;32449:25;;;32468:5;32449:25;;;;;;:::i;:::-;;;;;;;;31347:1135;;;:::o;88:117:1:-;197:1;194;187:12;334:126;371:7;411:42;404:5;400:54;389:65;;334:126;;;:::o;466:96::-;503:7;532:24;550:5;532:24;:::i;:::-;521:35;;466:96;;;:::o;568:122::-;641:24;659:5;641:24;:::i;:::-;634:5;631:35;621:63;;680:1;677;670:12;621:63;568:122;:::o;696:139::-;742:5;780:6;767:20;758:29;;796:33;823:5;796:33;:::i;:::-;696:139;;;;:::o;841:329::-;900:6;949:2;937:9;928:7;924:23;920:32;917:119;;;955:79;;:::i;:::-;917:119;1075:1;1100:53;1145:7;1136:6;1125:9;1121:22;1100:53;:::i;:::-;1090:63;;1046:117;841:329;;;;:::o;1176:77::-;1213:7;1242:5;1231:16;;1176:77;;;:::o;1259:118::-;1346:24;1364:5;1346:24;:::i;:::-;1341:3;1334:37;1259:118;;:::o;1383:222::-;1476:4;1514:2;1503:9;1499:18;1491:26;;1527:71;1595:1;1584:9;1580:17;1571:6;1527:71;:::i;:::-;1383:222;;;;:::o;1611:104::-;1656:7;1685:24;1703:5;1685:24;:::i;:::-;1674:35;;1611:104;;;:::o;1721:142::-;1824:32;1850:5;1824:32;:::i;:::-;1819:3;1812:45;1721:142;;:::o;1869:254::-;1978:4;2016:2;2005:9;2001:18;1993:26;;2029:87;2113:1;2102:9;2098:17;2089:6;2029:87;:::i;:::-;1869:254;;;;:::o;2129:99::-;2181:6;2215:5;2209:12;2199:22;;2129:99;;;:::o;2234:169::-;2318:11;2352:6;2347:3;2340:19;2392:4;2387:3;2383:14;2368:29;;2234:169;;;;:::o;2409:246::-;2490:1;2500:113;2514:6;2511:1;2508:13;2500:113;;;2599:1;2594:3;2590:11;2584:18;2580:1;2575:3;2571:11;2564:39;2536:2;2533:1;2529:10;2524:15;;2500:113;;;2647:1;2638:6;2633:3;2629:16;2622:27;2471:184;2409:246;;;:::o;2661:102::-;2702:6;2753:2;2749:7;2744:2;2737:5;2733:14;2729:28;2719:38;;2661:102;;;:::o;2769:377::-;2857:3;2885:39;2918:5;2885:39;:::i;:::-;2940:71;3004:6;2999:3;2940:71;:::i;:::-;2933:78;;3020:65;3078:6;3073:3;3066:4;3059:5;3055:16;3020:65;:::i;:::-;3110:29;3132:6;3110:29;:::i;:::-;3105:3;3101:39;3094:46;;2861:285;2769:377;;;;:::o;3152:313::-;3265:4;3303:2;3292:9;3288:18;3280:26;;3352:9;3346:4;3342:20;3338:1;3327:9;3323:17;3316:47;3380:78;3453:4;3444:6;3380:78;:::i;:::-;3372:86;;3152:313;;;;:::o;3471:122::-;3544:24;3562:5;3544:24;:::i;:::-;3537:5;3534:35;3524:63;;3583:1;3580;3573:12;3524:63;3471:122;:::o;3599:139::-;3645:5;3683:6;3670:20;3661:29;;3699:33;3726:5;3699:33;:::i;:::-;3599:139;;;;:::o;3744:474::-;3812:6;3820;3869:2;3857:9;3848:7;3844:23;3840:32;3837:119;;;3875:79;;:::i;:::-;3837:119;3995:1;4020:53;4065:7;4056:6;4045:9;4041:22;4020:53;:::i;:::-;4010:63;;3966:117;4122:2;4148:53;4193:7;4184:6;4173:9;4169:22;4148:53;:::i;:::-;4138:63;;4093:118;3744:474;;;;;:::o;4224:90::-;4258:7;4301:5;4294:13;4287:21;4276:32;;4224:90;;;:::o;4320:109::-;4401:21;4416:5;4401:21;:::i;:::-;4396:3;4389:34;4320:109;;:::o;4435:210::-;4522:4;4560:2;4549:9;4545:18;4537:26;;4573:65;4635:1;4624:9;4620:17;4611:6;4573:65;:::i;:::-;4435:210;;;;:::o;4651:619::-;4728:6;4736;4744;4793:2;4781:9;4772:7;4768:23;4764:32;4761:119;;;4799:79;;:::i;:::-;4761:119;4919:1;4944:53;4989:7;4980:6;4969:9;4965:22;4944:53;:::i;:::-;4934:63;;4890:117;5046:2;5072:53;5117:7;5108:6;5097:9;5093:22;5072:53;:::i;:::-;5062:63;;5017:118;5174:2;5200:53;5245:7;5236:6;5225:9;5221:22;5200:53;:::i;:::-;5190:63;;5145:118;4651:619;;;;;:::o;5276:86::-;5311:7;5351:4;5344:5;5340:16;5329:27;;5276:86;;;:::o;5368:112::-;5451:22;5467:5;5451:22;:::i;:::-;5446:3;5439:35;5368:112;;:::o;5486:214::-;5575:4;5613:2;5602:9;5598:18;5590:26;;5626:67;5690:1;5679:9;5675:17;5666:6;5626:67;:::i;:::-;5486:214;;;;:::o;5706:89::-;5742:7;5782:6;5775:5;5771:18;5760:29;;5706:89;;;:::o;5801:115::-;5886:23;5903:5;5886:23;:::i;:::-;5881:3;5874:36;5801:115;;:::o;5922:218::-;6013:4;6051:2;6040:9;6036:18;6028:26;;6064:69;6130:1;6119:9;6115:17;6106:6;6064:69;:::i;:::-;5922:218;;;;:::o;6146:118::-;6233:24;6251:5;6233:24;:::i;:::-;6228:3;6221:37;6146:118;;:::o;6270:222::-;6363:4;6401:2;6390:9;6386:18;6378:26;;6414:71;6482:1;6471:9;6467:17;6458:6;6414:71;:::i;:::-;6270:222;;;;:::o;6498:474::-;6566:6;6574;6623:2;6611:9;6602:7;6598:23;6594:32;6591:119;;;6629:79;;:::i;:::-;6591:119;6749:1;6774:53;6819:7;6810:6;6799:9;6795:22;6774:53;:::i;:::-;6764:63;;6720:117;6876:2;6902:53;6947:7;6938:6;6927:9;6923:22;6902:53;:::i;:::-;6892:63;;6847:118;6498:474;;;;;:::o;6978:60::-;7006:3;7027:5;7020:12;;6978:60;;;:::o;7044:142::-;7094:9;7127:53;7145:34;7154:24;7172:5;7154:24;:::i;:::-;7145:34;:::i;:::-;7127:53;:::i;:::-;7114:66;;7044:142;;;:::o;7192:126::-;7242:9;7275:37;7306:5;7275:37;:::i;:::-;7262:50;;7192:126;;;:::o;7324:152::-;7400:9;7433:37;7464:5;7433:37;:::i;:::-;7420:50;;7324:152;;;:::o;7482:183::-;7595:63;7652:5;7595:63;:::i;:::-;7590:3;7583:76;7482:183;;:::o;7671:274::-;7790:4;7828:2;7817:9;7813:18;7805:26;;7841:97;7935:1;7924:9;7920:17;7911:6;7841:97;:::i;:::-;7671:274;;;;:::o;7951:180::-;7999:77;7996:1;7989:88;8096:4;8093:1;8086:15;8120:4;8117:1;8110:15;8137:320;8181:6;8218:1;8212:4;8208:12;8198:22;;8265:1;8259:4;8255:12;8286:18;8276:81;;8342:4;8334:6;8330:17;8320:27;;8276:81;8404:2;8396:6;8393:14;8373:18;8370:38;8367:84;;8423:18;;:::i;:::-;8367:84;8188:269;8137:320;;;:::o;8463:171::-;8603:23;8599:1;8591:6;8587:14;8580:47;8463:171;:::o;8640:366::-;8782:3;8803:67;8867:2;8862:3;8803:67;:::i;:::-;8796:74;;8879:93;8968:3;8879:93;:::i;:::-;8997:2;8992:3;8988:12;8981:19;;8640:366;;;:::o;9012:419::-;9178:4;9216:2;9205:9;9201:18;9193:26;;9265:9;9259:4;9255:20;9251:1;9240:9;9236:17;9229:47;9293:131;9419:4;9293:131;:::i;:::-;9285:139;;9012:419;;;:::o;9437:143::-;9494:5;9525:6;9519:13;9510:22;;9541:33;9568:5;9541:33;:::i;:::-;9437:143;;;;:::o;9586:351::-;9656:6;9705:2;9693:9;9684:7;9680:23;9676:32;9673:119;;;9711:79;;:::i;:::-;9673:119;9831:1;9856:64;9912:7;9903:6;9892:9;9888:22;9856:64;:::i;:::-;9846:74;;9802:128;9586:351;;;;:::o;9943:332::-;10064:4;10102:2;10091:9;10087:18;10079:26;;10115:71;10183:1;10172:9;10168:17;10159:6;10115:71;:::i;:::-;10196:72;10264:2;10253:9;10249:18;10240:6;10196:72;:::i;:::-;9943:332;;;;;:::o;10281:85::-;10326:7;10355:5;10344:16;;10281:85;;;:::o;10372:158::-;10430:9;10463:61;10481:42;10490:32;10516:5;10490:32;:::i;:::-;10481:42;:::i;:::-;10463:61;:::i;:::-;10450:74;;10372:158;;;:::o;10536:147::-;10631:45;10670:5;10631:45;:::i;:::-;10626:3;10619:58;10536:147;;:::o;10689:807::-;10938:4;10976:3;10965:9;10961:19;10953:27;;10990:71;11058:1;11047:9;11043:17;11034:6;10990:71;:::i;:::-;11071:72;11139:2;11128:9;11124:18;11115:6;11071:72;:::i;:::-;11153:80;11229:2;11218:9;11214:18;11205:6;11153:80;:::i;:::-;11243;11319:2;11308:9;11304:18;11295:6;11243:80;:::i;:::-;11333:73;11401:3;11390:9;11386:19;11377:6;11333:73;:::i;:::-;11416;11484:3;11473:9;11469:19;11460:6;11416:73;:::i;:::-;10689:807;;;;;;;;;:::o;11502:143::-;11559:5;11590:6;11584:13;11575:22;;11606:33;11633:5;11606:33;:::i;:::-;11502:143;;;;:::o;11651:663::-;11739:6;11747;11755;11804:2;11792:9;11783:7;11779:23;11775:32;11772:119;;;11810:79;;:::i;:::-;11772:119;11930:1;11955:64;12011:7;12002:6;11991:9;11987:22;11955:64;:::i;:::-;11945:74;;11901:128;12068:2;12094:64;12150:7;12141:6;12130:9;12126:22;12094:64;:::i;:::-;12084:74;;12039:129;12207:2;12233:64;12289:7;12280:6;12269:9;12265:22;12233:64;:::i;:::-;12223:74;;12178:129;11651:663;;;;;:::o;12320:332::-;12441:4;12479:2;12468:9;12464:18;12456:26;;12492:71;12560:1;12549:9;12545:17;12536:6;12492:71;:::i;:::-;12573:72;12641:2;12630:9;12626:18;12617:6;12573:72;:::i;:::-;12320:332;;;;;:::o;12658:116::-;12728:21;12743:5;12728:21;:::i;:::-;12721:5;12718:32;12708:60;;12764:1;12761;12754:12;12708:60;12658:116;:::o;12780:137::-;12834:5;12865:6;12859:13;12850:22;;12881:30;12905:5;12881:30;:::i;:::-;12780:137;;;;:::o;12923:345::-;12990:6;13039:2;13027:9;13018:7;13014:23;13010:32;13007:119;;;13045:79;;:::i;:::-;13007:119;13165:1;13190:61;13243:7;13234:6;13223:9;13219:22;13190:61;:::i;:::-;13180:71;;13136:125;12923:345;;;;:::o;13274:173::-;13414:25;13410:1;13402:6;13398:14;13391:49;13274:173;:::o;13453:366::-;13595:3;13616:67;13680:2;13675:3;13616:67;:::i;:::-;13609:74;;13692:93;13781:3;13692:93;:::i;:::-;13810:2;13805:3;13801:12;13794:19;;13453:366;;;:::o;13825:419::-;13991:4;14029:2;14018:9;14014:18;14006:26;;14078:9;14072:4;14068:20;14064:1;14053:9;14049:17;14042:47;14106:131;14232:4;14106:131;:::i;:::-;14098:139;;13825:419;;;:::o;14250:442::-;14399:4;14437:2;14426:9;14422:18;14414:26;;14450:71;14518:1;14507:9;14503:17;14494:6;14450:71;:::i;:::-;14531:72;14599:2;14588:9;14584:18;14575:6;14531:72;:::i;:::-;14613;14681:2;14670:9;14666:18;14657:6;14613:72;:::i;:::-;14250:442;;;;;;:::o;14698:180::-;14746:77;14743:1;14736:88;14843:4;14840:1;14833:15;14867:4;14864:1;14857:15;14884:180;14932:77;14929:1;14922:88;15029:4;15026:1;15019:15;15053:4;15050:1;15043:15;15070:114;15137:6;15171:5;15165:12;15155:22;;15070:114;;;:::o;15190:184::-;15289:11;15323:6;15318:3;15311:19;15363:4;15358:3;15354:14;15339:29;;15190:184;;;;:::o;15380:132::-;15447:4;15470:3;15462:11;;15500:4;15495:3;15491:14;15483:22;;15380:132;;;:::o;15518:108::-;15595:24;15613:5;15595:24;:::i;:::-;15590:3;15583:37;15518:108;;:::o;15632:179::-;15701:10;15722:46;15764:3;15756:6;15722:46;:::i;:::-;15800:4;15795:3;15791:14;15777:28;;15632:179;;;;:::o;15817:113::-;15887:4;15919;15914:3;15910:14;15902:22;;15817:113;;;:::o;15966:732::-;16085:3;16114:54;16162:5;16114:54;:::i;:::-;16184:86;16263:6;16258:3;16184:86;:::i;:::-;16177:93;;16294:56;16344:5;16294:56;:::i;:::-;16373:7;16404:1;16389:284;16414:6;16411:1;16408:13;16389:284;;;16490:6;16484:13;16517:63;16576:3;16561:13;16517:63;:::i;:::-;16510:70;;16603:60;16656:6;16603:60;:::i;:::-;16593:70;;16449:224;16436:1;16433;16429:9;16424:14;;16389:284;;;16393:14;16689:3;16682:10;;16090:608;;;15966:732;;;;:::o;16704:831::-;16967:4;17005:3;16994:9;16990:19;16982:27;;17019:71;17087:1;17076:9;17072:17;17063:6;17019:71;:::i;:::-;17100:80;17176:2;17165:9;17161:18;17152:6;17100:80;:::i;:::-;17227:9;17221:4;17217:20;17212:2;17201:9;17197:18;17190:48;17255:108;17358:4;17349:6;17255:108;:::i;:::-;17247:116;;17373:72;17441:2;17430:9;17426:18;17417:6;17373:72;:::i;:::-;17455:73;17523:3;17512:9;17508:19;17499:6;17455:73;:::i;:::-;16704:831;;;;;;;;:::o;17541:180::-;17589:77;17586:1;17579:88;17686:4;17683:1;17676:15;17710:4;17707:1;17700:15;17727:180;17775:77;17772:1;17765:88;17872:4;17869:1;17862:15;17896:4;17893:1;17886:15;17913:185;17953:1;17970:20;17988:1;17970:20;:::i;:::-;17965:25;;18004:20;18022:1;18004:20;:::i;:::-;17999:25;;18043:1;18033:35;;18048:18;;:::i;:::-;18033:35;18090:1;18087;18083:9;18078:14;;17913:185;;;;:::o;18104:194::-;18144:4;18164:20;18182:1;18164:20;:::i;:::-;18159:25;;18198:20;18216:1;18198:20;:::i;:::-;18193:25;;18242:1;18239;18235:9;18227:17;;18266:1;18260:4;18257:11;18254:37;;;18271:18;;:::i;:::-;18254:37;18104:194;;;;:::o;18304:163::-;18444:15;18440:1;18432:6;18428:14;18421:39;18304:163;:::o;18473:366::-;18615:3;18636:67;18700:2;18695:3;18636:67;:::i;:::-;18629:74;;18712:93;18801:3;18712:93;:::i;:::-;18830:2;18825:3;18821:12;18814:19;;18473:366;;;:::o;18845:419::-;19011:4;19049:2;19038:9;19034:18;19026:26;;19098:9;19092:4;19088:20;19084:1;19073:9;19069:17;19062:47;19126:131;19252:4;19126:131;:::i;:::-;19118:139;;18845:419;;;:::o;19270:191::-;19310:3;19329:20;19347:1;19329:20;:::i;:::-;19324:25;;19363:20;19381:1;19363:20;:::i;:::-;19358:25;;19406:1;19403;19399:9;19392:16;;19427:3;19424:1;19421:10;19418:36;;;19434:18;;:::i;:::-;19418:36;19270:191;;;;:::o;19467:166::-;19607:18;19603:1;19595:6;19591:14;19584:42;19467:166;:::o;19639:366::-;19781:3;19802:67;19866:2;19861:3;19802:67;:::i;:::-;19795:74;;19878:93;19967:3;19878:93;:::i;:::-;19996:2;19991:3;19987:12;19980:19;;19639:366;;;:::o;20011:419::-;20177:4;20215:2;20204:9;20200:18;20192:26;;20264:9;20258:4;20254:20;20250:1;20239:9;20235:17;20228:47;20292:131;20418:4;20292:131;:::i;:::-;20284:139;;20011:419;;;:::o;20436:410::-;20476:7;20499:20;20517:1;20499:20;:::i;:::-;20494:25;;20533:20;20551:1;20533:20;:::i;:::-;20528:25;;20588:1;20585;20581:9;20610:30;20628:11;20610:30;:::i;:::-;20599:41;;20789:1;20780:7;20776:15;20773:1;20770:22;20750:1;20743:9;20723:83;20700:139;;20819:18;;:::i;:::-;20700:139;20484:362;20436:410;;;;:::o

Swarm Source

ipfs://fadcfd02430c9218a6361d5839c858ef565d48d93153411f6b7f6a72bfc74fd8
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.