ETH Price: $3,425.58 (+2.38%)

Token

Edith (EDTH)
 

Overview

Max Total Supply

10,000,000 EDTH

Holders

112

Market

Onchain Market Cap

$0.00

Circulating Supply Market Cap

-

Other Info

Token Contract (WITH 5 Decimals)

Balance
2.9619 EDTH

Value
$0.00
0x0eFe81db03b6a7828D2097418B8d804393277727
Loading...
Loading
Loading...
Loading
Loading...
Loading

Click here to update the token information / general information
# Exchange Pair Price  24H Volume % Volume

Contract Source Code Verified (Exact Match)

Contract Name:
Edith

Compiler Version
v0.8.13+commit.abaa5c0e

Optimization Enabled:
Yes with 200 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity)

/**
 *Submitted for verification at Etherscan.io on 2022-05-23
*/

// SPDX-License-Identifier: MIT
pragma solidity =0.8.13;



interface IERC20 {
    /**
     * @dev Returns the amount of tokens in existence.
     */
    function totalSupply() external view returns (uint256);

    /**
     * @dev Returns the amount of tokens owned by `account`.
     */
    function balanceOf(address account) external view returns (uint256);

    /**
     * @dev Moves `amount` tokens from the caller's account to `to`.
     *
     * Returns a boolean value indicating whether the operation succeeded.
     *
     * Emits a {Transfer} event.
     */
    function transfer(address to, uint256 amount) external returns (bool);

    /**
     * @dev Returns the remaining number of tokens that `spender` will be
     * allowed to spend on behalf of `owner` through {transferFrom}. This is
     * zero by default.
     *
     * This value changes when {approve} or {transferFrom} are called.
     */
    function allowance(address owner, address spender) external view returns (uint256);

    /**
     * @dev Sets `amount` as the allowance of `spender` over the caller's tokens.
     *
     * Returns a boolean value indicating whether the operation succeeded.
     *
     * IMPORTANT: Beware that changing an allowance with this method brings the risk
     * that someone may use both the old and the new allowance by unfortunate
     * transaction ordering. One possible solution to mitigate this race
     * condition is to first reduce the spender's allowance to 0 and set the
     * desired value afterwards:
     * https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729
     *
     * Emits an {Approval} event.
     */
    function approve(address spender, uint256 amount) external returns (bool);

    /**
     * @dev Moves `amount` tokens from `from` to `to` using the
     * allowance mechanism. `amount` is then deducted from the caller's
     * allowance.
     *
     * Returns a boolean value indicating whether the operation succeeded.
     *
     * Emits a {Transfer} event.
     */
    function transferFrom(
        address from,
        address to,
        uint256 amount
    ) external returns (bool);

    /**
     * @dev Emitted when `value` tokens are moved from one account (`from`) to
     * another (`to`).
     *
     * Note that `value` may be zero.
     */
    event Transfer(address indexed from, address indexed to, uint256 value);

    /**
     * @dev Emitted when the allowance of a `spender` for an `owner` is set by
     * a call to {approve}. `value` is the new allowance.
     */
    event Approval(address indexed owner, address indexed spender, uint256 value);
}


interface 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);
}



abstract contract Context {
    function _msgSender() internal view virtual returns (address) {
        return msg.sender;
    }

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



abstract contract Ownable is Context {
    address private _owner;

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

    /**
     * @dev Initializes the contract setting the deployer as the initial owner.
     */
    constructor() {
        _transferOwnership(_msgSender());
    }

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

    /**
     * @dev Throws if called by any account other than the owner.
     */
    modifier onlyOwner() {
        require(owner() == _msgSender(), "Ownable: caller is not the owner");
        _;
    }

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

    /**
     * @dev Transfers ownership of the contract to a new account (`newOwner`).
     * Can only be called by the current owner.
     */
    function transferOwnership(address newOwner) public virtual onlyOwner {
        require(newOwner != address(0), "Ownable: new owner is the zero address");
        _transferOwnership(newOwner);
    }

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

contract ERC20 is Context, IERC20, IERC20Metadata {
    mapping(address => uint256) private _balances;

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

    uint256 private _totalSupply;

    string private _name;
    string private _symbol;

    /**
     * @dev Sets the values for {name} and {symbol}.
     *
     * The default value of {decimals} is 18. To select a different value for
     * {decimals} you should overload it.
     *
     * All two of these values are immutable: they can only be set once during
     * construction.
     */
    constructor(string memory name_, string memory symbol_) {
        _name = name_;
        _symbol = symbol_;
    }

    /**
     * @dev Returns the name of the token.
     */
    function name() public view virtual override returns (string memory) {
        return _name;
    }

    /**
     * @dev Returns the symbol of the token, usually a shorter version of the
     * name.
     */
    function symbol() public view virtual override returns (string memory) {
        return _symbol;
    }

    /**
     * @dev Returns the number of decimals used to get its user representation.
     * For example, if `decimals` equals `2`, a balance of `505` tokens should
     * be displayed to a user as `5.05` (`505 / 10 ** 2`).
     *
     * Tokens usually opt for a value of 18, imitating the relationship between
     * Ether and Wei. This is the value {ERC20} uses, unless this function is
     * overridden;
     *
     * NOTE: This information is only used for _display_ purposes: it in
     * no way affects any of the arithmetic of the contract, including
     * {IERC20-balanceOf} and {IERC20-transfer}.
     */
    function decimals() public view virtual override returns (uint8) {
        return 18;
    }

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

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

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

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

    /**
     * @dev See {IERC20-approve}.
     *
     * NOTE: If `amount` 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 amount) public virtual override returns (bool) {
        address owner = _msgSender();
        _approve(owner, spender, amount);
        return true;
    }

    /**
     * @dev See {IERC20-transferFrom}.
     *
     * Emits an {Approval} event indicating the updated allowance. This is not
     * required by the EIP. See the note at the beginning of {ERC20}.
     *
     * 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 `amount`.
     * - the caller must have allowance for ``from``'s tokens of at least
     * `amount`.
     */
    function transferFrom(
        address from,
        address to,
        uint256 amount
    ) public virtual override returns (bool) {
        address spender = _msgSender();
        _spendAllowance(from, spender, amount);
        _transfer(from, to, amount);
        return true;
    }

    /**
     * @dev Atomically increases the allowance granted to `spender` by the caller.
     *
     * This is an alternative to {approve} that can be used as a mitigation for
     * problems described in {IERC20-approve}.
     *
     * Emits an {Approval} event indicating the updated allowance.
     *
     * Requirements:
     *
     * - `spender` cannot be the zero address.
     */
    function increaseAllowance(address spender, uint256 addedValue) public virtual returns (bool) {
        address owner = _msgSender();
        _approve(owner, spender, _allowances[owner][spender] + addedValue);
        return true;
    }

    /**
     * @dev Atomically decreases the allowance granted to `spender` by the caller.
     *
     * This is an alternative to {approve} that can be used as a mitigation for
     * problems described in {IERC20-approve}.
     *
     * Emits an {Approval} event indicating the updated allowance.
     *
     * Requirements:
     *
     * - `spender` cannot be the zero address.
     * - `spender` must have allowance for the caller of at least
     * `subtractedValue`.
     */
    function decreaseAllowance(address spender, uint256 subtractedValue) public virtual returns (bool) {
        address owner = _msgSender();
        uint256 currentAllowance = _allowances[owner][spender];
        require(currentAllowance >= subtractedValue, "ERC20: decreased allowance below zero");
        unchecked {
            _approve(owner, spender, currentAllowance - subtractedValue);
        }

        return true;
    }

    /**
     * @dev Moves `amount` of tokens from `sender` to `recipient`.
     *
     * This internal function is equivalent to {transfer}, and can be used to
     * e.g. implement automatic token fees, slashing mechanisms, etc.
     *
     * Emits a {Transfer} event.
     *
     * Requirements:
     *
     * - `from` cannot be the zero address.
     * - `to` cannot be the zero address.
     * - `from` must have a balance of at least `amount`.
     */
    function _transfer(
        address from,
        address to,
        uint256 amount
    ) internal virtual {
        require(from != address(0), "ERC20: transfer from the zero address");
        require(to != address(0), "ERC20: transfer to the zero address");

        _beforeTokenTransfer(from, to, amount);

        uint256 fromBalance = _balances[from];
        require(fromBalance >= amount, "ERC20: transfer amount exceeds balance");
        unchecked {
            _balances[from] = fromBalance - amount;
        }
        _balances[to] += amount;

        emit Transfer(from, to, amount);

        _afterTokenTransfer(from, to, amount);
    }

    /** @dev Creates `amount` tokens and assigns them to `account`, increasing
     * the total supply.
     *
     * Emits a {Transfer} event with `from` set to the zero address.
     *
     * Requirements:
     *
     * - `account` cannot be the zero address.
     */
    function _mint(address account, uint256 amount) internal virtual {
        require(account != address(0), "ERC20: mint to the zero address");

        _beforeTokenTransfer(address(0), account, amount);

        _totalSupply += amount;
        _balances[account] += amount;
        emit Transfer(address(0), account, amount);

        _afterTokenTransfer(address(0), account, amount);
    }

    /**
     * @dev Destroys `amount` tokens from `account`, reducing the
     * total supply.
     *
     * Emits a {Transfer} event with `to` set to the zero address.
     *
     * Requirements:
     *
     * - `account` cannot be the zero address.
     * - `account` must have at least `amount` tokens.
     */
    function _burn(address account, uint256 amount) internal virtual {
        require(account != address(0), "ERC20: burn from the zero address");

        _beforeTokenTransfer(account, address(0), amount);

        uint256 accountBalance = _balances[account];
        require(accountBalance >= amount, "ERC20: burn amount exceeds balance");
        unchecked {
            _balances[account] = accountBalance - amount;
        }
        _totalSupply -= amount;

        emit Transfer(account, address(0), amount);

        _afterTokenTransfer(account, address(0), amount);
    }

    /**
     * @dev Sets `amount` as the allowance of `spender` over the `owner` s tokens.
     *
     * This internal function is equivalent to `approve`, and can be used to
     * e.g. set automatic allowances for certain subsystems, etc.
     *
     * Emits an {Approval} event.
     *
     * Requirements:
     *
     * - `owner` cannot be the zero address.
     * - `spender` cannot be the zero address.
     */
    function _approve(
        address owner,
        address spender,
        uint256 amount
    ) internal virtual {
        require(owner != address(0), "ERC20: approve from the zero address");
        require(spender != address(0), "ERC20: approve to the zero address");

        _allowances[owner][spender] = amount;
        emit Approval(owner, spender, amount);
    }

    /**
     * @dev Spend `amount` form the allowance of `owner` toward `spender`.
     *
     * Does not update the allowance amount in case of infinite allowance.
     * Revert if not enough allowance is available.
     *
     * Might emit an {Approval} event.
     */
    function _spendAllowance(
        address owner,
        address spender,
        uint256 amount
    ) internal virtual {
        uint256 currentAllowance = allowance(owner, spender);
        if (currentAllowance != type(uint256).max) {
            require(currentAllowance >= amount, "ERC20: insufficient allowance");
            unchecked {
                _approve(owner, spender, currentAllowance - amount);
            }
        }
    }

    /**
     * @dev Hook that is called before any transfer of tokens. This includes
     * minting and burning.
     *
     * Calling conditions:
     *
     * - when `from` and `to` are both non-zero, `amount` of ``from``'s tokens
     * will be transferred to `to`.
     * - when `from` is zero, `amount` tokens will be minted for `to`.
     * - when `to` is zero, `amount` of ``from``'s tokens will be burned.
     * - `from` and `to` are never both zero.
     *
     * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks].
     */
    function _beforeTokenTransfer(
        address from,
        address to,
        uint256 amount
    ) internal virtual {}

    /**
     * @dev Hook that is called after any transfer of tokens. This includes
     * minting and burning.
     *
     * Calling conditions:
     *
     * - when `from` and `to` are both non-zero, `amount` of ``from``'s tokens
     * has been transferred to `to`.
     * - when `from` is zero, `amount` tokens have been minted for `to`.
     * - when `to` is zero, `amount` of ``from``'s tokens have been burned.
     * - `from` and `to` are never both zero.
     *
     * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks].
     */
    function _afterTokenTransfer(
        address from,
        address to,
        uint256 amount
    ) internal virtual {}
}



contract Edith is ERC20, Ownable {
    mapping (address => uint256) private _rOwned;
    mapping (address => bool) private _isHolder;
    address[] private _holders;
    
    //mapping (address => uint256) private _tOwned;
    mapping (address => mapping (address => uint256)) private _allowances;

    //recieves no reflections, transfers from are untaxed
    mapping (address => bool) private _isExcluded; 
    //recieves no reflections, all transfers are untaxed. All items on this list need to also be on _isExcluded.
    mapping (address => bool) private _isCompletelyExcluded;

    //address[] private _holders;
    address[] private _excluded;
   
    uint256 private constant MAX = 2**128 - 1;
    uint256 private constant _tTotal = 10 * 10**6 * 10**5;
    uint256 private _rTotal = (MAX - (MAX % _tTotal));
    uint256 private _rTotalInitial = _rTotal;
    uint256 private _tFeeTotal;

    uint256 private _taxLowerBound = 0;
    uint256 private _taxUpperBound = 0;
    uint256 private constant _taxMaximum = 50; //sets the absolute max tax
    uint256 private _taxMaximumCutoff = 50; 
    bool private _rSupplyNeedsReset = false;

    string private constant _name = "Edith";
    string private constant _symbol = "EDTH";
    uint8 private constant _decimals = 5;

    constructor () ERC20("Edith", "EDTH") {
        address sender = _msgSender();
        _rOwned[sender] = _rTotal;
        _isHolder[sender] = true;
        _holders.push(sender);
        setTaxRates(2, 20);
        emit Transfer(address(0), sender, _tTotal);
    }

    function min(uint256 a, uint256 b) private pure returns(uint256) {
        if (a <= b) {
            return a;
        } else {
            return b;
        }
    }

    function setTaxRates(uint256 LB, uint256 UB) public onlyOwner returns(bool) {
        require(LB <= UB, "lower bound must be less than or equal to upper bound");
        require(UB <= _taxMaximum, "upper bound must be less than or equal to _taxMaximum");
        require(!_rSupplyNeedsReset, "the tax functionality has been permenantly disabled for this contract");
        _taxLowerBound = LB;
        _taxUpperBound = UB;
        return true;
    }

    function setTaxMaximumCutoff(uint256 cutoff) public onlyOwner returns(bool) {
        require(cutoff >= _tTotal/10, "cutoff must be >= 1/10th of the total supply");
        _taxMaximumCutoff = cutoff;
        return true;
    }

    function getTaxMaximumCutoff() public view returns(uint256) {
        return _taxMaximumCutoff;
    }

    function getTaxRates() public view returns(uint256, uint256) {
        return(_taxLowerBound, _taxUpperBound);
    }

    function getTaxableState() public view returns(bool){
        return !_rSupplyNeedsReset;
    }

    function name() public pure override returns (string memory) {
        return _name;
    }

    function symbol() public pure override returns (string memory) {
        return _symbol;
    }

    function decimals() public pure override returns (uint8) {
        return _decimals;
    }

    function totalSupply() public pure override returns (uint256) {
        return _tTotal;
    }

    function rSupply() public view returns(uint256) {
        return _rTotal;
    }

    function rOwned(address account) public view returns(uint256) {
        return _rOwned[account];
    }

    function balanceOf(address account) public view override returns (uint256) {
        // uint256 rAmount = _rOwned[account];
        // uint256 currentRate =  _getRate();
        // return rAmount/currentRate;
        return (_rOwned[account]*_tTotal)/_rTotal;
    }

    function transfer(address recipient, uint256 amount) public override returns (bool) {
        _transfer(_msgSender(), recipient, amount);
        if (!_isHolder[recipient]) {
            _isHolder[recipient] = true;
            _holders.push(recipient);
        }
        return true;
    }

    function allowance(address owner, address spender) public view override returns (uint256) {
        return _allowances[owner][spender];
    }

    function approve(address spender, uint256 amount) public override returns (bool) {
        _approve(_msgSender(), spender, amount);
        return true;
    }

    function transferFrom(address sender, address recipient, uint256 amount) public override returns (bool) {
        uint256 allowed = _allowances[sender][_msgSender()];
        require(amount <= allowed, "transferring too much edith");
        _approve(sender, _msgSender(), allowed - amount);
        _transfer(sender, recipient, amount);
        return true;
    }

    function increaseAllowance(address spender, uint256 addedValue) public override returns (bool) {
        _approve(_msgSender(), spender, _allowances[_msgSender()][spender] + addedValue);
        return true;
    }

    function decreaseAllowance(address spender, uint256 subtractedValue) public override returns (bool) {
        _approve(_msgSender(), spender, _allowances[_msgSender()][spender] - subtractedValue);
        return true;
    }

    function isExcluded(address account) public view returns (bool) {
        return _isExcluded[account];
    }

    function isCompletelyExcluded(address account) public view returns (bool) {
        return _isCompletelyExcluded[account];
    }

    function totalFees() public view returns (uint256) {
        return _tFeeTotal;
    }

    function excludeAccount(address account) external onlyOwner() {
        require(!_isExcluded[account], "Account is already excluded");
        _isExcluded[account] = true;
        _excluded.push(account);
    }

    function completelyExcludeAccount(address account) external onlyOwner() {
        require(!_isCompletelyExcluded[account], "Account is already completely excluded");
        _isCompletelyExcluded[account] = true;
        // check if already on excluded list. if not, add it.
        if (!_isExcluded[account]){
            _isExcluded[account] = true;
            _excluded.push(account);
        }
    }

    function numExcluded() public view returns(uint256) {
        return _excluded.length;
    }

    function viewExcluded(uint256 n) public view returns(address) {
        require(n < _excluded.length, "n is too big");
        return _excluded[n];
    }

    function includeAccount(address account) external onlyOwner() {
        require(_isExcluded[account], "Account is already included");
        for (uint256 i = 0; i < _excluded.length; i++) {
            if (_excluded[i] == account) {
                _excluded[i] = _excluded[_excluded.length - 1];
                //_tOwned[account] = 0;
                _isExcluded[account] = false;
                _isCompletelyExcluded[account] = false;
                _excluded.pop();
                break;
            }
        }
    }

    function _approve(address owner, address spender, uint256 amount) internal override {
        require(owner != address(0), "ERC20: approve from the zero address");
        require(spender != address(0), "ERC20: approve to the zero address");

        _allowances[owner][spender] = amount;
        emit Approval(owner, spender, amount);
    }

    function _transfer(address sender, address recipient, uint256 amount) internal override{
        require(sender != address(0), "ERC20: transfer from the zero address");
        require(recipient != address(0), "ERC20: transfer to the zero address");
        require(amount > 0, "Transfer amount must be greater than zero");


        if (_isExcluded[sender] || _isCompletelyExcluded[recipient] || _rSupplyNeedsReset || _taxUpperBound == 0) {
            //sender excluded or both excluded, or recipient completely excluded
            _transferTaxFree(sender, recipient, amount);
        } else if (!_isExcluded[sender] && _isExcluded[recipient]) {
            _transferToExcluded(sender, recipient, amount);
        } else {
            uint256 excludedRowned = 0;
            if (!_isExcluded[sender]){
                excludedRowned += _rOwned[sender];
            }
            if (!_isExcluded[recipient]){
                excludedRowned += _rOwned[recipient];
            }
            for (uint256 i = 0; i < _excluded.length; i++){
                excludedRowned += _rOwned[_excluded[i]];
            }
            if (excludedRowned > (99*_rTotal)/100){
                _transferTaxFree(sender, recipient, amount);
            } else {
                _transferStandard(sender, recipient, amount);
            }
            
        }
    }

    //struct needed to avoid "stack too deep" compile error
    struct stackTooDeepStruct {
        uint256 n1;
        uint256 n2;
        uint256 n3;
        uint256 temp;
        uint256 a;
        uint256 b;
        uint256 c;
    }

    struct accountInfo {
        address account;
        uint256 rOwned;
    }

    function _transferStandard(address sender, address recipient, uint256 tAmount) private {
        (uint256 rAmount, uint256 rTransferAmount, uint256 rFee, uint256 tTransferAmount, uint256 tFee) = _getValues(tAmount); //, rSupply, tSupply);
        uint256 ne = numExcluded();

        uint256[] memory excludedROwned = new uint256[](ne);
        uint256 totalExcluded = 0;

        for (uint i = 0; i < ne; i++){
            excludedROwned[i] = _rOwned[_excluded[i]];
            totalExcluded += excludedROwned[i];
        }

        stackTooDeepStruct memory std;
        std.n1 = _rOwned[sender] - rAmount;
        std.n2 = _rOwned[recipient] + rTransferAmount;
        std.n3 = totalExcluded;
        std.temp = _rTotal- std.n1 - std.n2 - std.n3;

        std.a = (rFee*std.n1)/std.temp;
        std.b = (rFee*std.n2)/std.temp;
        std.c = (rFee*std.n3)/std.temp;


        _rOwned[sender] = std.n1 - std.a;
        _rOwned[recipient] = std.n2 - std.b;
        uint256 subtractedTotal = 0;
        uint256 toSubtract;
        if (totalExcluded > 0){
            for (uint i=0; i < ne; i++){
                toSubtract = (std.c*excludedROwned[i])/totalExcluded;
                _rOwned[_excluded[i]] = excludedROwned[i] - toSubtract;
                subtractedTotal += toSubtract;
            }
            //_rOwned[_excluded[ne-1]] = excludedROwned[ne-1] - (std.c - subtractedTotal);
        }
        _reflectFee(rFee + std.a + std.b + subtractedTotal, tFee);
        emit Transfer(sender, recipient, tTransferAmount);

    }

    function _transferToExcluded(address sender, address recipient, uint256 tAmount) private {
        (uint256 rAmount, uint256 rTransferAmount, uint256 rFee, uint256 tTransferAmount, uint256 tFee) = _getValues(tAmount); //, rSupply, tSupply);

        uint256 ne = numExcluded();

        // for this one, excludedInfo refers to accounts *other than* the recipient.
        // otherwise, this function is the same as transferStandard.
        // i.e. the recipient is just another excluded account.
        accountInfo[] memory excludedInfo = new accountInfo[](ne - 1);
        uint256 totalExcluded = 0;

        uint256 arrayIndex = 0;
        for (uint i = 0; i < ne; i++){
            if (_excluded[i] != recipient){
                excludedInfo[arrayIndex].account = _excluded[i];
                excludedInfo[arrayIndex].rOwned = _rOwned[excludedInfo[arrayIndex].account];
                totalExcluded += excludedInfo[arrayIndex].rOwned;
                arrayIndex += 1;
            }
        }

        stackTooDeepStruct memory std;
        std.n1 = _rOwned[sender] - rAmount;
        std.n2 = _rOwned[recipient] + rTransferAmount;
        std.n3 = totalExcluded;
        std.temp = _rTotal - std.n1 - std.n2 - std.n3;

        std.a = (rFee*std.n1)/std.temp;
        std.b = (rFee*std.n2)/std.temp;
        std.c = (rFee*std.n3)/std.temp;

        _rOwned[sender] = std.n1 - std.a;
        _rOwned[recipient] = std.n2 - std.b;

        uint256 subtractedTotal = 0;
        uint256 toSubtract;
        if (totalExcluded > 0){
            for (uint i = 0; i < excludedInfo.length; i++){
                toSubtract = (std.c * excludedInfo[i].rOwned) / totalExcluded;
                _rOwned[excludedInfo[i].account] = excludedInfo[i].rOwned - toSubtract;
                subtractedTotal += toSubtract;
            }
            //_rOwned[excludedInfo[excludedInfo.length - 1].account] = excludedInfo[excludedInfo.length - 1].rOwned - (std.c - subtractedTotal);
        }
        _reflectFee(rFee + std.a + std.b + subtractedTotal, tFee);
        emit Transfer(sender, recipient, tTransferAmount);
    }


    function _transferTaxFree(address sender, address recipient, uint256 tAmount) private {
        // uint256 currentRate = _rTotal / _tTotal;
        // uint256 rAmount = tAmount * currentRate;
        uint256 rAmount = (tAmount * _rTotal) / _tTotal;
        _rOwned[sender] = _rOwned[sender] - rAmount;
        _rOwned[recipient] = _rOwned[recipient] + rAmount; 
        emit Transfer(sender, recipient, tAmount);
    }

    function _reflectFee(uint256 rFee, uint256 tFee) private {
        _rTotal -= rFee;
        _tFeeTotal += tFee;
    }

    function calculateTax(uint256 tAmount) public view returns (uint256) {
        uint256 cutoffTSupply = (_tTotal * _taxMaximumCutoff) / 100;
        uint256 taxTemp = _taxLowerBound + ((_taxUpperBound - _taxLowerBound)*tAmount)/cutoffTSupply;
        return min(taxTemp, _taxUpperBound);
    }

    function _getValues(uint256 tAmount) private returns (uint256, uint256, uint256, uint256, uint256) {
        //check for rSupply depletion
        if (!_rSupplyNeedsReset) {
            if (_rTotal < 15 * _tTotal){
                _rSupplyNeedsReset = true;
            }
        }

        //calculates tax based on amount being transferred
        uint256 tax = calculateTax(tAmount); //_taxLowerBound + (_taxUpperBound - _taxLowerBound) * tAmount.div(tSupply);

        (uint256 tTransferAmount, uint256 tFee) = _getTValues(tAmount, tax);
        //uint256 currentRate =  _getRate();
        //uint256 currentRate = _getRate();
        (uint256 rAmount, uint256 rTransferAmount, uint256 rFee) = _getRValues(tAmount, tFee);
        return (rAmount, rTransferAmount, rFee, tTransferAmount, tFee);
    }

    function _getTValues(uint256 tAmount, uint256 tax) private pure returns (uint256, uint256) {
        uint256 tFee = (tAmount * tax) / 100;
        uint256 tTransferAmount = tAmount - tFee;
        return (tTransferAmount, tFee);
    }

    function _getRValues(uint256 tAmount, uint256 tFee) private view returns (uint256, uint256, uint256) {
        uint256 rAmount = (tAmount * _rTotal) / _tTotal;
        uint256 rFee = (tFee * _rTotal) / _tTotal;
        uint256 rTransferAmount = rAmount - rFee;
        return (rAmount, rTransferAmount, rFee);
    }

    function resetRSupply() public onlyOwner returns(bool) {
        uint256 newROwned;
        uint256 totalNewROwned;
        for (uint256 i = 0; i < _holders.length; i++) {
            newROwned = (_rOwned[_holders[i]]*_rTotalInitial)/_rTotal;
            totalNewROwned += newROwned;
            _rOwned[_holders[i]] = newROwned;
        }
        _rTotal = totalNewROwned;
        _rSupplyNeedsReset = false;
        return true;
    }
}

Contract Security Audit

Contract ABI

[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"spender","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"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":"owner","type":"address"},{"internalType":"address","name":"spender","type":"address"}],"name":"allowance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"approve","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tAmount","type":"uint256"}],"name":"calculateTax","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"completelyExcludeAccount","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"decimals","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"subtractedValue","type":"uint256"}],"name":"decreaseAllowance","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"excludeAccount","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"getTaxMaximumCutoff","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getTaxRates","outputs":[{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getTaxableState","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"includeAccount","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"addedValue","type":"uint256"}],"name":"increaseAllowance","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"isCompletelyExcluded","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"isExcluded","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"pure","type":"function"},{"inputs":[],"name":"numExcluded","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"rOwned","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"rSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"resetRSupply","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"cutoff","type":"uint256"}],"name":"setTaxMaximumCutoff","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"LB","type":"uint256"},{"internalType":"uint256","name":"UB","type":"uint256"}],"name":"setTaxRates","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"pure","type":"function"},{"inputs":[],"name":"totalFees","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"address","name":"recipient","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transfer","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"sender","type":"address"},{"internalType":"address","name":"recipient","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transferFrom","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"n","type":"uint256"}],"name":"viewExcluded","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"}]

60806040526200001c64e8d4a510006001600160801b036200048c565b6200002f906001600160801b03620004af565b600d819055600e556000601081905560115560326012556013805460ff191690553480156200005d57600080fd5b50604080518082018252600581526408ac8d2e8d60db1b60208083019182528351808501909452600484526308a88a8960e31b908401528151919291620000a791600391620003e6565b508051620000bd906004906020840190620003e6565b505050620000da620000d4620001a460201b60201c565b620001a8565b600d543360008181526006602090815260408083209490945560079052918220805460ff191660019081179091556008805491820181559092527ff3f7a9fe364faab93b216da50a3214154f22a0a2b415b23a84c8169e8b636ee390910180546001600160a01b031916821790556200015660026014620001fa565b5060405164e8d4a5100081526001600160a01b038216906000907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9060200160405180910390a35062000511565b3390565b600580546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b6005546000906001600160a01b031633146200025d5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064015b60405180910390fd5b81831115620002d55760405162461bcd60e51b815260206004820152603560248201527f6c6f77657220626f756e64206d757374206265206c657373207468616e206f7260448201527f20657175616c20746f20757070657220626f756e640000000000000000000000606482015260840162000254565b60328211156200034e5760405162461bcd60e51b815260206004820152603560248201527f757070657220626f756e64206d757374206265206c657373207468616e206f7260448201527f20657175616c20746f205f7461784d6178696d756d0000000000000000000000606482015260840162000254565b60135460ff1615620003d75760405162461bcd60e51b815260206004820152604560248201527f746865207461782066756e6374696f6e616c69747920686173206265656e207060448201527f65726d656e616e746c792064697361626c656420666f72207468697320636f6e6064820152641d1c9858dd60da1b608482015260a40162000254565b50601091909155601155600190565b828054620003f490620004d5565b90600052602060002090601f01602090048101928262000418576000855562000463565b82601f106200043357805160ff191683800117855562000463565b8280016001018555821562000463579182015b828111156200046357825182559160200191906001019062000446565b506200047192915062000475565b5090565b5b8082111562000471576000815560010162000476565b600082620004aa57634e487b7160e01b600052601260045260246000fd5b500690565b600082821015620004d057634e487b7160e01b600052601160045260246000fd5b500390565b600181811c90821680620004ea57607f821691505b6020821081036200050b57634e487b7160e01b600052602260045260246000fd5b50919050565b6121e880620005216000396000f3fe608060405234801561001057600080fd5b50600436106101e55760003560e01c806384a3f5c01161010f578063c80dfa1d116100a2578063e1c2bbd111610071578063e1c2bbd114610472578063f2cc0c181461047a578063f2fde38b1461048d578063f84354f1146104a057600080fd5b8063c80dfa1d146103ce578063cba0e996146103fa578063cd22b0f014610426578063dd62ed3e1461043957600080fd5b80639bc2e1b3116100de5780639bc2e1b31461037a578063a457c2d71461038d578063a9059cbb146103a0578063b8a7d108146103b357600080fd5b806384a3f5c01461030457806388a06f8b1461030c5780638da5cb5b1461033557806395d89b411461035a57600080fd5b8063395093511161018757806370a082311161015657806370a08231146102cc578063715018a6146102df5780637ded8aae146102e95780637e2940d8146102f157600080fd5b8063395093511461028b5780633986ed6e1461029e578063483a9310146102a65780635cb23e12146102b957600080fd5b806318160ddd116101c357806318160ddd1461025257806323b872dd1461025d5780632acb7d2014610270578063313ce5671461027c57600080fd5b806306fdde03146101ea578063095ea7b31461021d57806313114a9d14610240575b600080fd5b60408051808201909152600581526408ac8d2e8d60db1b60208201525b6040516102149190611f3a565b60405180910390f35b61023061022b366004611fa6565b6104b3565b6040519015158152602001610214565b600f545b604051908152602001610214565b64e8d4a51000610244565b61023061026b366004611fd0565b6104ca565b60135460ff1615610230565b60405160058152602001610214565b610230610299366004611fa6565b61056d565b6102306105a4565b6102446102b436600461200c565b6106a9565b6102306102c7366004612025565b610718565b6102446102da366004612047565b6108b8565b6102e76108f1565b005b600c54610244565b6102e76102ff366004612047565b610927565b600d54610244565b61024461031a366004612047565b6001600160a01b031660009081526006602052604090205490565b6005546001600160a01b03165b6040516001600160a01b039091168152602001610214565b60408051808201909152600481526308a88a8960e31b6020820152610207565b61034261038836600461200c565b610a67565b61023061039b366004611fa6565b610ad8565b6102306103ae366004611fa6565b610b0f565b60105460115460408051928352602083019190915201610214565b6102306103dc366004612047565b6001600160a01b03166000908152600b602052604090205460ff1690565b610230610408366004612047565b6001600160a01b03166000908152600a602052604090205460ff1690565b61023061043436600461200c565b610ba7565b610244610447366004612069565b6001600160a01b03918216600090815260096020908152604080832093909416825291909152205490565b601254610244565b6102e7610488366004612047565b610c56565b6102e761049b366004612047565b610d4f565b6102e76104ae366004612047565b610de7565b60006104c0338484610fa5565b5060015b92915050565b6001600160a01b0383166000908152600960209081526040808320338452909152812054808311156105435760405162461bcd60e51b815260206004820152601b60248201527f7472616e7366657272696e6720746f6f206d756368206564697468000000000060448201526064015b60405180910390fd5b610557853361055286856120b2565b610fa5565b6105628585856110c9565b506001949350505050565b3360008181526009602090815260408083206001600160a01b038716845290915281205490916104c09185906105529086906120c9565b6005546000906001600160a01b031633146105d15760405162461bcd60e51b815260040161053a906120e1565b60008060005b60085481101561069457600d54600e5460066000600885815481106105fe576105fe612116565b60009182526020808320909101546001600160a01b0316835282019290925260400190205461062d919061212c565b610637919061214b565b925061064383836120c9565b915082600660006008848154811061065d5761065d612116565b60009182526020808320909101546001600160a01b031683528201929092526040019020558061068c8161216d565b9150506105d7565b50600d5550506013805460ff19169055600190565b600080606460125464e8d4a510006106c1919061212c565b6106cb919061214b565b9050600081846010546011546106e191906120b2565b6106eb919061212c565b6106f5919061214b565b60105461070291906120c9565b9050610710816011546113e5565b949350505050565b6005546000906001600160a01b031633146107455760405162461bcd60e51b815260040161053a906120e1565b818311156107b35760405162461bcd60e51b815260206004820152603560248201527f6c6f77657220626f756e64206d757374206265206c657373207468616e206f7260448201527408195c5d585b081d1bc81d5c1c195c88189bdd5b99605a1b606482015260840161053a565b60328211156108225760405162461bcd60e51b815260206004820152603560248201527f757070657220626f756e64206d757374206265206c657373207468616e206f7260448201527420657175616c20746f205f7461784d6178696d756d60581b606482015260840161053a565b60135460ff16156108a95760405162461bcd60e51b815260206004820152604560248201527f746865207461782066756e6374696f6e616c69747920686173206265656e207060448201527f65726d656e616e746c792064697361626c656420666f72207468697320636f6e6064820152641d1c9858dd60da1b608482015260a40161053a565b50601091909155601155600190565b600d546001600160a01b0382166000908152600660205260408120549091906108e79064e8d4a510009061212c565b6104c4919061214b565b6005546001600160a01b0316331461091b5760405162461bcd60e51b815260040161053a906120e1565b61092560006113fc565b565b6005546001600160a01b031633146109515760405162461bcd60e51b815260040161053a906120e1565b6001600160a01b0381166000908152600b602052604090205460ff16156109c95760405162461bcd60e51b815260206004820152602660248201527f4163636f756e7420697320616c726561647920636f6d706c6574656c7920657860448201526518db1d59195960d21b606482015260840161053a565b6001600160a01b0381166000908152600b60209081526040808320805460ff19166001179055600a90915290205460ff16610a64576001600160a01b0381166000818152600a60205260408120805460ff19166001908117909155600c805491820181559091527fdf6966c971051c3d54ec59162606531493a51404a002842f56009d7e5cf4a8c70180546001600160a01b03191690911790555b50565b600c546000908210610aaa5760405162461bcd60e51b815260206004820152600c60248201526b6e20697320746f6f2062696760a01b604482015260640161053a565b600c8281548110610abd57610abd612116565b6000918252602090912001546001600160a01b031692915050565b3360008181526009602090815260408083206001600160a01b038716845290915281205490916104c09185906105529086906120b2565b6000610b1c3384846110c9565b6001600160a01b03831660009081526007602052604090205460ff166104c05750506001600160a01b03166000818152600760205260408120805460ff1916600190811790915560088054808301825592527ff3f7a9fe364faab93b216da50a3214154f22a0a2b415b23a84c8169e8b636ee390910180546001600160a01b03191690921790915590565b6005546000906001600160a01b03163314610bd45760405162461bcd60e51b815260040161053a906120e1565b610be4600a64e8d4a5100061214b565b821015610c485760405162461bcd60e51b815260206004820152602c60248201527f6375746f6666206d757374206265203e3d20312f31307468206f66207468652060448201526b746f74616c20737570706c7960a01b606482015260840161053a565b50601281905560015b919050565b6005546001600160a01b03163314610c805760405162461bcd60e51b815260040161053a906120e1565b6001600160a01b0381166000908152600a602052604090205460ff1615610ce95760405162461bcd60e51b815260206004820152601b60248201527f4163636f756e7420697320616c7265616479206578636c756465640000000000604482015260640161053a565b6001600160a01b03166000818152600a60205260408120805460ff19166001908117909155600c805491820181559091527fdf6966c971051c3d54ec59162606531493a51404a002842f56009d7e5cf4a8c70180546001600160a01b0319169091179055565b6005546001600160a01b03163314610d795760405162461bcd60e51b815260040161053a906120e1565b6001600160a01b038116610dde5760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b606482015260840161053a565b610a64816113fc565b6005546001600160a01b03163314610e115760405162461bcd60e51b815260040161053a906120e1565b6001600160a01b0381166000908152600a602052604090205460ff16610e795760405162461bcd60e51b815260206004820152601b60248201527f4163636f756e7420697320616c726561647920696e636c756465640000000000604482015260640161053a565b60005b600c54811015610fa157816001600160a01b0316600c8281548110610ea357610ea3612116565b6000918252602090912001546001600160a01b031603610f8f57600c8054610ecd906001906120b2565b81548110610edd57610edd612116565b600091825260209091200154600c80546001600160a01b039092169183908110610f0957610f09612116565b600091825260208083209190910180546001600160a01b0319166001600160a01b039485161790559184168152600a82526040808220805460ff19908116909155600b909352902080549091169055600c805480610f6957610f69612186565b600082815260209020810160001990810180546001600160a01b03191690550190555050565b80610f998161216d565b915050610e7c565b5050565b6001600160a01b0383166110075760405162461bcd60e51b8152602060048201526024808201527f45524332303a20617070726f76652066726f6d20746865207a65726f206164646044820152637265737360e01b606482015260840161053a565b6001600160a01b0382166110685760405162461bcd60e51b815260206004820152602260248201527f45524332303a20617070726f766520746f20746865207a65726f206164647265604482015261737360f01b606482015260840161053a565b6001600160a01b0383811660008181526009602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925910160405180910390a3505050565b6001600160a01b03831661112d5760405162461bcd60e51b815260206004820152602560248201527f45524332303a207472616e736665722066726f6d20746865207a65726f206164604482015264647265737360d81b606482015260840161053a565b6001600160a01b03821661118f5760405162461bcd60e51b815260206004820152602360248201527f45524332303a207472616e7366657220746f20746865207a65726f206164647260448201526265737360e81b606482015260840161053a565b600081116111f15760405162461bcd60e51b815260206004820152602960248201527f5472616e7366657220616d6f756e74206d7573742062652067726561746572206044820152687468616e207a65726f60b81b606482015260840161053a565b6001600160a01b0383166000908152600a602052604090205460ff168061123057506001600160a01b0382166000908152600b602052604090205460ff165b8061123d575060135460ff165b806112485750601154155b1561125d5761125883838361144e565b505050565b6001600160a01b0383166000908152600a602052604090205460ff1615801561129e57506001600160a01b0382166000908152600a602052604090205460ff165b156112ae57611258838383611527565b6001600160a01b0383166000908152600a602052604081205460ff166112f4576001600160a01b0384166000908152600660205260409020546112f190826120c9565b90505b6001600160a01b0383166000908152600a602052604090205460ff1661133a576001600160a01b03831660009081526006602052604090205461133790826120c9565b90505b60005b600c548110156113a15760066000600c838154811061135e5761135e612116565b60009182526020808320909101546001600160a01b0316835282019290925260400190205461138d90836120c9565b9150806113998161216d565b91505061133d565b506064600d5460636113b3919061212c565b6113bd919061214b565b8111156113d4576113cf84848461144e565b6113df565b6113df8484846119ff565b50505050565b60008183116113f55750816104c4565b50806104c4565b600580546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b600064e8d4a51000600d5483611464919061212c565b61146e919061214b565b6001600160a01b0385166000908152600660205260409020549091506114959082906120b2565b6001600160a01b0380861660009081526006602052604080822093909355908516815220546114c59082906120c9565b6001600160a01b0380851660008181526006602052604090819020939093559151908616907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef906115199086815260200190565b60405180910390a350505050565b600080600080600061153886611ded565b94509450945094509450600061154d600c5490565b9050600061155c6001836120b2565b67ffffffffffffffff8111156115745761157461219c565b6040519080825280602002602001820160405280156115b957816020015b60408051808201909152600080825260208201528152602001906001900390816115925790505b50905060008060005b84811015611718578b6001600160a01b0316600c82815481106115e7576115e7612116565b6000918252602090912001546001600160a01b03161461170657600c818154811061161457611614612116565b9060005260206000200160009054906101000a90046001600160a01b031684838151811061164457611644612116565b6020026020010151600001906001600160a01b031690816001600160a01b0316815250506006600085848151811061167e5761167e612116565b6020026020010151600001516001600160a01b03166001600160a01b03168152602001908152602001600020548483815181106116bd576116bd612116565b602002602001015160200181815250508382815181106116df576116df612116565b602002602001015160200151836116f691906120c9565b92506117036001836120c9565b91505b806117108161216d565b9150506115c2565b506117596040518060e00160405280600081526020016000815260200160008152602001600081526020016000815260200160008152602001600081525090565b6001600160a01b038d1660009081526006602052604090205461177d908b906120b2565b81526001600160a01b038c166000908152600660205260409020546117a3908a906120c9565b60208201819052604082018490528151600d548592916117c2916120b2565b6117cc91906120b2565b6117d691906120b2565b6060820181905281516117e9908a61212c565b6117f3919061214b565b60808201526060810151602082015161180c908a61212c565b611816919061214b565b60a08201526060810151604082015161182f908a61212c565b611839919061214b565b60c08201526080810151815161184f91906120b2565b6001600160a01b038e1660009081526006602090815260409091209190915560a08201519082015161188191906120b2565b6001600160a01b038d1660009081526006602052604081209190915580841561196e5760005b865181101561196c57858782815181106118c3576118c3612116565b6020026020010151602001518560c001516118de919061212c565b6118e8919061214b565b9150818782815181106118fd576118fd612116565b60200260200101516020015161191391906120b2565b6006600089848151811061192957611929612116565b602090810291909101810151516001600160a01b031682528101919091526040016000205561195882846120c9565b9250806119648161216d565b9150506118a7565b505b6119a1828460a0015185608001518d61198791906120c9565b61199191906120c9565b61199b91906120c9565b89611e6e565b8d6001600160a01b03168f6001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef8b6040516119e691815260200190565b60405180910390a3505050505050505050505050505050565b6000806000806000611a1086611ded565b945094509450945094506000611a25600c5490565b905060008167ffffffffffffffff811115611a4257611a4261219c565b604051908082528060200260200182016040528015611a6b578160200160208202803683370190505b5090506000805b83811015611b0f5760066000600c8381548110611a9157611a91612116565b60009182526020808320909101546001600160a01b031683528201929092526040019020548351849083908110611aca57611aca612116565b602002602001018181525050828181518110611ae857611ae8612116565b602002602001015182611afb91906120c9565b915080611b078161216d565b915050611a72565b50611b506040518060e00160405280600081526020016000815260200160008152602001600081526020016000815260200160008152602001600081525090565b6001600160a01b038c16600090815260066020526040902054611b74908a906120b2565b81526001600160a01b038b16600090815260066020526040902054611b9a9089906120c9565b60208201819052604082018390528151600d54849291611bb9916120b2565b611bc391906120b2565b611bcd91906120b2565b606082018190528151611be0908961212c565b611bea919061214b565b608082015260608101516020820151611c03908961212c565b611c0d919061214b565b60a082015260608101516040820151611c26908961212c565b611c30919061214b565b60c082015260808101518151611c4691906120b2565b6001600160a01b038d1660009081526006602090815260409091209190915560a082015190820151611c7891906120b2565b6001600160a01b038c16600090815260066020526040812091909155808315611d5d5760005b86811015611d5b5784868281518110611cb957611cb9612116565b60200260200101518560c00151611cd0919061212c565b611cda919061214b565b915081868281518110611cef57611cef612116565b6020026020010151611d0191906120b2565b60066000600c8481548110611d1857611d18612116565b60009182526020808320909101546001600160a01b03168352820192909252604001902055611d4782846120c9565b925080611d538161216d565b915050611c9e565b505b611d90828460a0015185608001518c611d7691906120c9565b611d8091906120c9565b611d8a91906120c9565b88611e6e565b8c6001600160a01b03168e6001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef8a604051611dd591815260200190565b60405180910390a35050505050505050505050505050565b601354600090819081908190819060ff16611e2957611e1264e8d4a51000600f61212c565b600d541015611e29576013805460ff191660011790555b6000611e34876106a9565b9050600080611e438984611ea2565b915091506000806000611e568c85611ed6565b919e909d50909b509499509297509295505050505050565b81600d6000828254611e8091906120b2565b9250508190555080600f6000828254611e9991906120c9565b90915550505050565b600080806064611eb2858761212c565b611ebc919061214b565b90506000611eca82876120b2565b96919550909350505050565b60008060008064e8d4a51000600d5487611ef0919061212c565b611efa919061214b565b9050600064e8d4a51000600d5487611f12919061212c565b611f1c919061214b565b90506000611f2a82846120b2565b9295509193509150509250925092565b600060208083528351808285015260005b81811015611f6757858101830151858201604001528201611f4b565b81811115611f79576000604083870101525b50601f01601f1916929092016040019392505050565b80356001600160a01b0381168114610c5157600080fd5b60008060408385031215611fb957600080fd5b611fc283611f8f565b946020939093013593505050565b600080600060608486031215611fe557600080fd5b611fee84611f8f565b9250611ffc60208501611f8f565b9150604084013590509250925092565b60006020828403121561201e57600080fd5b5035919050565b6000806040838503121561203857600080fd5b50508035926020909101359150565b60006020828403121561205957600080fd5b61206282611f8f565b9392505050565b6000806040838503121561207c57600080fd5b61208583611f8f565b915061209360208401611f8f565b90509250929050565b634e487b7160e01b600052601160045260246000fd5b6000828210156120c4576120c461209c565b500390565b600082198211156120dc576120dc61209c565b500190565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b634e487b7160e01b600052603260045260246000fd5b60008160001904831182151516156121465761214661209c565b500290565b60008261216857634e487b7160e01b600052601260045260246000fd5b500490565b60006001820161217f5761217f61209c565b5060010190565b634e487b7160e01b600052603160045260246000fd5b634e487b7160e01b600052604160045260246000fdfea2646970667358221220bdf0ca3fbf03a0db8659018da9ac16932d7a4709b8c2175c82391a5b5980fb0364736f6c634300080d0033

Deployed Bytecode

0x608060405234801561001057600080fd5b50600436106101e55760003560e01c806384a3f5c01161010f578063c80dfa1d116100a2578063e1c2bbd111610071578063e1c2bbd114610472578063f2cc0c181461047a578063f2fde38b1461048d578063f84354f1146104a057600080fd5b8063c80dfa1d146103ce578063cba0e996146103fa578063cd22b0f014610426578063dd62ed3e1461043957600080fd5b80639bc2e1b3116100de5780639bc2e1b31461037a578063a457c2d71461038d578063a9059cbb146103a0578063b8a7d108146103b357600080fd5b806384a3f5c01461030457806388a06f8b1461030c5780638da5cb5b1461033557806395d89b411461035a57600080fd5b8063395093511161018757806370a082311161015657806370a08231146102cc578063715018a6146102df5780637ded8aae146102e95780637e2940d8146102f157600080fd5b8063395093511461028b5780633986ed6e1461029e578063483a9310146102a65780635cb23e12146102b957600080fd5b806318160ddd116101c357806318160ddd1461025257806323b872dd1461025d5780632acb7d2014610270578063313ce5671461027c57600080fd5b806306fdde03146101ea578063095ea7b31461021d57806313114a9d14610240575b600080fd5b60408051808201909152600581526408ac8d2e8d60db1b60208201525b6040516102149190611f3a565b60405180910390f35b61023061022b366004611fa6565b6104b3565b6040519015158152602001610214565b600f545b604051908152602001610214565b64e8d4a51000610244565b61023061026b366004611fd0565b6104ca565b60135460ff1615610230565b60405160058152602001610214565b610230610299366004611fa6565b61056d565b6102306105a4565b6102446102b436600461200c565b6106a9565b6102306102c7366004612025565b610718565b6102446102da366004612047565b6108b8565b6102e76108f1565b005b600c54610244565b6102e76102ff366004612047565b610927565b600d54610244565b61024461031a366004612047565b6001600160a01b031660009081526006602052604090205490565b6005546001600160a01b03165b6040516001600160a01b039091168152602001610214565b60408051808201909152600481526308a88a8960e31b6020820152610207565b61034261038836600461200c565b610a67565b61023061039b366004611fa6565b610ad8565b6102306103ae366004611fa6565b610b0f565b60105460115460408051928352602083019190915201610214565b6102306103dc366004612047565b6001600160a01b03166000908152600b602052604090205460ff1690565b610230610408366004612047565b6001600160a01b03166000908152600a602052604090205460ff1690565b61023061043436600461200c565b610ba7565b610244610447366004612069565b6001600160a01b03918216600090815260096020908152604080832093909416825291909152205490565b601254610244565b6102e7610488366004612047565b610c56565b6102e761049b366004612047565b610d4f565b6102e76104ae366004612047565b610de7565b60006104c0338484610fa5565b5060015b92915050565b6001600160a01b0383166000908152600960209081526040808320338452909152812054808311156105435760405162461bcd60e51b815260206004820152601b60248201527f7472616e7366657272696e6720746f6f206d756368206564697468000000000060448201526064015b60405180910390fd5b610557853361055286856120b2565b610fa5565b6105628585856110c9565b506001949350505050565b3360008181526009602090815260408083206001600160a01b038716845290915281205490916104c09185906105529086906120c9565b6005546000906001600160a01b031633146105d15760405162461bcd60e51b815260040161053a906120e1565b60008060005b60085481101561069457600d54600e5460066000600885815481106105fe576105fe612116565b60009182526020808320909101546001600160a01b0316835282019290925260400190205461062d919061212c565b610637919061214b565b925061064383836120c9565b915082600660006008848154811061065d5761065d612116565b60009182526020808320909101546001600160a01b031683528201929092526040019020558061068c8161216d565b9150506105d7565b50600d5550506013805460ff19169055600190565b600080606460125464e8d4a510006106c1919061212c565b6106cb919061214b565b9050600081846010546011546106e191906120b2565b6106eb919061212c565b6106f5919061214b565b60105461070291906120c9565b9050610710816011546113e5565b949350505050565b6005546000906001600160a01b031633146107455760405162461bcd60e51b815260040161053a906120e1565b818311156107b35760405162461bcd60e51b815260206004820152603560248201527f6c6f77657220626f756e64206d757374206265206c657373207468616e206f7260448201527408195c5d585b081d1bc81d5c1c195c88189bdd5b99605a1b606482015260840161053a565b60328211156108225760405162461bcd60e51b815260206004820152603560248201527f757070657220626f756e64206d757374206265206c657373207468616e206f7260448201527420657175616c20746f205f7461784d6178696d756d60581b606482015260840161053a565b60135460ff16156108a95760405162461bcd60e51b815260206004820152604560248201527f746865207461782066756e6374696f6e616c69747920686173206265656e207060448201527f65726d656e616e746c792064697361626c656420666f72207468697320636f6e6064820152641d1c9858dd60da1b608482015260a40161053a565b50601091909155601155600190565b600d546001600160a01b0382166000908152600660205260408120549091906108e79064e8d4a510009061212c565b6104c4919061214b565b6005546001600160a01b0316331461091b5760405162461bcd60e51b815260040161053a906120e1565b61092560006113fc565b565b6005546001600160a01b031633146109515760405162461bcd60e51b815260040161053a906120e1565b6001600160a01b0381166000908152600b602052604090205460ff16156109c95760405162461bcd60e51b815260206004820152602660248201527f4163636f756e7420697320616c726561647920636f6d706c6574656c7920657860448201526518db1d59195960d21b606482015260840161053a565b6001600160a01b0381166000908152600b60209081526040808320805460ff19166001179055600a90915290205460ff16610a64576001600160a01b0381166000818152600a60205260408120805460ff19166001908117909155600c805491820181559091527fdf6966c971051c3d54ec59162606531493a51404a002842f56009d7e5cf4a8c70180546001600160a01b03191690911790555b50565b600c546000908210610aaa5760405162461bcd60e51b815260206004820152600c60248201526b6e20697320746f6f2062696760a01b604482015260640161053a565b600c8281548110610abd57610abd612116565b6000918252602090912001546001600160a01b031692915050565b3360008181526009602090815260408083206001600160a01b038716845290915281205490916104c09185906105529086906120b2565b6000610b1c3384846110c9565b6001600160a01b03831660009081526007602052604090205460ff166104c05750506001600160a01b03166000818152600760205260408120805460ff1916600190811790915560088054808301825592527ff3f7a9fe364faab93b216da50a3214154f22a0a2b415b23a84c8169e8b636ee390910180546001600160a01b03191690921790915590565b6005546000906001600160a01b03163314610bd45760405162461bcd60e51b815260040161053a906120e1565b610be4600a64e8d4a5100061214b565b821015610c485760405162461bcd60e51b815260206004820152602c60248201527f6375746f6666206d757374206265203e3d20312f31307468206f66207468652060448201526b746f74616c20737570706c7960a01b606482015260840161053a565b50601281905560015b919050565b6005546001600160a01b03163314610c805760405162461bcd60e51b815260040161053a906120e1565b6001600160a01b0381166000908152600a602052604090205460ff1615610ce95760405162461bcd60e51b815260206004820152601b60248201527f4163636f756e7420697320616c7265616479206578636c756465640000000000604482015260640161053a565b6001600160a01b03166000818152600a60205260408120805460ff19166001908117909155600c805491820181559091527fdf6966c971051c3d54ec59162606531493a51404a002842f56009d7e5cf4a8c70180546001600160a01b0319169091179055565b6005546001600160a01b03163314610d795760405162461bcd60e51b815260040161053a906120e1565b6001600160a01b038116610dde5760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b606482015260840161053a565b610a64816113fc565b6005546001600160a01b03163314610e115760405162461bcd60e51b815260040161053a906120e1565b6001600160a01b0381166000908152600a602052604090205460ff16610e795760405162461bcd60e51b815260206004820152601b60248201527f4163636f756e7420697320616c726561647920696e636c756465640000000000604482015260640161053a565b60005b600c54811015610fa157816001600160a01b0316600c8281548110610ea357610ea3612116565b6000918252602090912001546001600160a01b031603610f8f57600c8054610ecd906001906120b2565b81548110610edd57610edd612116565b600091825260209091200154600c80546001600160a01b039092169183908110610f0957610f09612116565b600091825260208083209190910180546001600160a01b0319166001600160a01b039485161790559184168152600a82526040808220805460ff19908116909155600b909352902080549091169055600c805480610f6957610f69612186565b600082815260209020810160001990810180546001600160a01b03191690550190555050565b80610f998161216d565b915050610e7c565b5050565b6001600160a01b0383166110075760405162461bcd60e51b8152602060048201526024808201527f45524332303a20617070726f76652066726f6d20746865207a65726f206164646044820152637265737360e01b606482015260840161053a565b6001600160a01b0382166110685760405162461bcd60e51b815260206004820152602260248201527f45524332303a20617070726f766520746f20746865207a65726f206164647265604482015261737360f01b606482015260840161053a565b6001600160a01b0383811660008181526009602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925910160405180910390a3505050565b6001600160a01b03831661112d5760405162461bcd60e51b815260206004820152602560248201527f45524332303a207472616e736665722066726f6d20746865207a65726f206164604482015264647265737360d81b606482015260840161053a565b6001600160a01b03821661118f5760405162461bcd60e51b815260206004820152602360248201527f45524332303a207472616e7366657220746f20746865207a65726f206164647260448201526265737360e81b606482015260840161053a565b600081116111f15760405162461bcd60e51b815260206004820152602960248201527f5472616e7366657220616d6f756e74206d7573742062652067726561746572206044820152687468616e207a65726f60b81b606482015260840161053a565b6001600160a01b0383166000908152600a602052604090205460ff168061123057506001600160a01b0382166000908152600b602052604090205460ff165b8061123d575060135460ff165b806112485750601154155b1561125d5761125883838361144e565b505050565b6001600160a01b0383166000908152600a602052604090205460ff1615801561129e57506001600160a01b0382166000908152600a602052604090205460ff165b156112ae57611258838383611527565b6001600160a01b0383166000908152600a602052604081205460ff166112f4576001600160a01b0384166000908152600660205260409020546112f190826120c9565b90505b6001600160a01b0383166000908152600a602052604090205460ff1661133a576001600160a01b03831660009081526006602052604090205461133790826120c9565b90505b60005b600c548110156113a15760066000600c838154811061135e5761135e612116565b60009182526020808320909101546001600160a01b0316835282019290925260400190205461138d90836120c9565b9150806113998161216d565b91505061133d565b506064600d5460636113b3919061212c565b6113bd919061214b565b8111156113d4576113cf84848461144e565b6113df565b6113df8484846119ff565b50505050565b60008183116113f55750816104c4565b50806104c4565b600580546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b600064e8d4a51000600d5483611464919061212c565b61146e919061214b565b6001600160a01b0385166000908152600660205260409020549091506114959082906120b2565b6001600160a01b0380861660009081526006602052604080822093909355908516815220546114c59082906120c9565b6001600160a01b0380851660008181526006602052604090819020939093559151908616907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef906115199086815260200190565b60405180910390a350505050565b600080600080600061153886611ded565b94509450945094509450600061154d600c5490565b9050600061155c6001836120b2565b67ffffffffffffffff8111156115745761157461219c565b6040519080825280602002602001820160405280156115b957816020015b60408051808201909152600080825260208201528152602001906001900390816115925790505b50905060008060005b84811015611718578b6001600160a01b0316600c82815481106115e7576115e7612116565b6000918252602090912001546001600160a01b03161461170657600c818154811061161457611614612116565b9060005260206000200160009054906101000a90046001600160a01b031684838151811061164457611644612116565b6020026020010151600001906001600160a01b031690816001600160a01b0316815250506006600085848151811061167e5761167e612116565b6020026020010151600001516001600160a01b03166001600160a01b03168152602001908152602001600020548483815181106116bd576116bd612116565b602002602001015160200181815250508382815181106116df576116df612116565b602002602001015160200151836116f691906120c9565b92506117036001836120c9565b91505b806117108161216d565b9150506115c2565b506117596040518060e00160405280600081526020016000815260200160008152602001600081526020016000815260200160008152602001600081525090565b6001600160a01b038d1660009081526006602052604090205461177d908b906120b2565b81526001600160a01b038c166000908152600660205260409020546117a3908a906120c9565b60208201819052604082018490528151600d548592916117c2916120b2565b6117cc91906120b2565b6117d691906120b2565b6060820181905281516117e9908a61212c565b6117f3919061214b565b60808201526060810151602082015161180c908a61212c565b611816919061214b565b60a08201526060810151604082015161182f908a61212c565b611839919061214b565b60c08201526080810151815161184f91906120b2565b6001600160a01b038e1660009081526006602090815260409091209190915560a08201519082015161188191906120b2565b6001600160a01b038d1660009081526006602052604081209190915580841561196e5760005b865181101561196c57858782815181106118c3576118c3612116565b6020026020010151602001518560c001516118de919061212c565b6118e8919061214b565b9150818782815181106118fd576118fd612116565b60200260200101516020015161191391906120b2565b6006600089848151811061192957611929612116565b602090810291909101810151516001600160a01b031682528101919091526040016000205561195882846120c9565b9250806119648161216d565b9150506118a7565b505b6119a1828460a0015185608001518d61198791906120c9565b61199191906120c9565b61199b91906120c9565b89611e6e565b8d6001600160a01b03168f6001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef8b6040516119e691815260200190565b60405180910390a3505050505050505050505050505050565b6000806000806000611a1086611ded565b945094509450945094506000611a25600c5490565b905060008167ffffffffffffffff811115611a4257611a4261219c565b604051908082528060200260200182016040528015611a6b578160200160208202803683370190505b5090506000805b83811015611b0f5760066000600c8381548110611a9157611a91612116565b60009182526020808320909101546001600160a01b031683528201929092526040019020548351849083908110611aca57611aca612116565b602002602001018181525050828181518110611ae857611ae8612116565b602002602001015182611afb91906120c9565b915080611b078161216d565b915050611a72565b50611b506040518060e00160405280600081526020016000815260200160008152602001600081526020016000815260200160008152602001600081525090565b6001600160a01b038c16600090815260066020526040902054611b74908a906120b2565b81526001600160a01b038b16600090815260066020526040902054611b9a9089906120c9565b60208201819052604082018390528151600d54849291611bb9916120b2565b611bc391906120b2565b611bcd91906120b2565b606082018190528151611be0908961212c565b611bea919061214b565b608082015260608101516020820151611c03908961212c565b611c0d919061214b565b60a082015260608101516040820151611c26908961212c565b611c30919061214b565b60c082015260808101518151611c4691906120b2565b6001600160a01b038d1660009081526006602090815260409091209190915560a082015190820151611c7891906120b2565b6001600160a01b038c16600090815260066020526040812091909155808315611d5d5760005b86811015611d5b5784868281518110611cb957611cb9612116565b60200260200101518560c00151611cd0919061212c565b611cda919061214b565b915081868281518110611cef57611cef612116565b6020026020010151611d0191906120b2565b60066000600c8481548110611d1857611d18612116565b60009182526020808320909101546001600160a01b03168352820192909252604001902055611d4782846120c9565b925080611d538161216d565b915050611c9e565b505b611d90828460a0015185608001518c611d7691906120c9565b611d8091906120c9565b611d8a91906120c9565b88611e6e565b8c6001600160a01b03168e6001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef8a604051611dd591815260200190565b60405180910390a35050505050505050505050505050565b601354600090819081908190819060ff16611e2957611e1264e8d4a51000600f61212c565b600d541015611e29576013805460ff191660011790555b6000611e34876106a9565b9050600080611e438984611ea2565b915091506000806000611e568c85611ed6565b919e909d50909b509499509297509295505050505050565b81600d6000828254611e8091906120b2565b9250508190555080600f6000828254611e9991906120c9565b90915550505050565b600080806064611eb2858761212c565b611ebc919061214b565b90506000611eca82876120b2565b96919550909350505050565b60008060008064e8d4a51000600d5487611ef0919061212c565b611efa919061214b565b9050600064e8d4a51000600d5487611f12919061212c565b611f1c919061214b565b90506000611f2a82846120b2565b9295509193509150509250925092565b600060208083528351808285015260005b81811015611f6757858101830151858201604001528201611f4b565b81811115611f79576000604083870101525b50601f01601f1916929092016040019392505050565b80356001600160a01b0381168114610c5157600080fd5b60008060408385031215611fb957600080fd5b611fc283611f8f565b946020939093013593505050565b600080600060608486031215611fe557600080fd5b611fee84611f8f565b9250611ffc60208501611f8f565b9150604084013590509250925092565b60006020828403121561201e57600080fd5b5035919050565b6000806040838503121561203857600080fd5b50508035926020909101359150565b60006020828403121561205957600080fd5b61206282611f8f565b9392505050565b6000806040838503121561207c57600080fd5b61208583611f8f565b915061209360208401611f8f565b90509250929050565b634e487b7160e01b600052601160045260246000fd5b6000828210156120c4576120c461209c565b500390565b600082198211156120dc576120dc61209c565b500190565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b634e487b7160e01b600052603260045260246000fd5b60008160001904831182151516156121465761214661209c565b500290565b60008261216857634e487b7160e01b600052601260045260246000fd5b500490565b60006001820161217f5761217f61209c565b5060010190565b634e487b7160e01b600052603160045260246000fd5b634e487b7160e01b600052604160045260246000fdfea2646970667358221220bdf0ca3fbf03a0db8659018da9ac16932d7a4709b8c2175c82391a5b5980fb0364736f6c634300080d0033

Deployed Bytecode Sourcemap

16846:15501:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;19661:92;19740:5;;;;;;;;;;;;-1:-1:-1;;;19740:5:0;;;;19661:92;;;;;;;:::i;:::-;;;;;;;;21003:161;;;;;;:::i;:::-;;:::i;:::-;;;1218:14:1;;1211:22;1193:41;;1181:2;1166:18;21003:161:0;1053:187:1;22264:87:0;22333:10;;22264:87;;;1391:25:1;;;1379:2;1364:18;22264:87:0;1245:177:1;19965:95:0;17604:18;19965:95;;21172:370;;;;;;:::i;:::-;;:::i;19556:97::-;19627:18;;;;19626:19;19556:97;;19865:92;;;18147:1;1902:36:1;;1890:2;1875:18;19865:92:0;1760:184:1;21550:216:0;;;;;;:::i;:::-;;:::i;31897:447::-;;;:::i;30192:296::-;;;;;;:::i;:::-;;:::i;18615:457::-;;;;;;:::i;:::-;;:::i;20269:270::-;;;;;;:::i;:::-;;:::i;4450:103::-;;;:::i;:::-;;23001:94;23071:9;:16;23001:94;;22581:412;;;;;;:::i;:::-;;:::i;20068:81::-;20134:7;;20068:81;;20157:104;;;;;;:::i;:::-;-1:-1:-1;;;;;20237:16:0;20210:7;20237:16;;;:7;:16;;;;;;;20157:104;3799:87;3872:6;;-1:-1:-1;;;;;3872:6:0;3799:87;;;-1:-1:-1;;;;;2742:32:1;;;2724:51;;2712:2;2697:18;3799:87:0;2578:203:1;19761:96:0;19842:7;;;;;;;;;;;;-1:-1:-1;;;19842:7:0;;;;19761:96;;23103:156;;;;;;:::i;:::-;;:::i;21774:226::-;;;;;;:::i;:::-;;:::i;20547:297::-;;;;;;:::i;:::-;;:::i;19430:118::-;19509:14;;19525;;19430:118;;;2960:25:1;;;3016:2;3001:18;;2994:34;;;;2933:18;19430:118:0;2786:248:1;22126:130:0;;;;;;:::i;:::-;-1:-1:-1;;;;;22218:30:0;22194:4;22218:30;;;:21;:30;;;;;;;;;22126:130;22008:110;;;;;;:::i;:::-;-1:-1:-1;;;;;22090:20:0;22066:4;22090:20;;;:11;:20;;;;;;;;;22008:110;19080:231;;;;;;:::i;:::-;;:::i;20852:143::-;;;;;;:::i;:::-;-1:-1:-1;;;;;20960:18:0;;;20933:7;20960:18;;;:11;:18;;;;;;;;:27;;;;;;;;;;;;;20852:143;19319:103;19397:17;;19319:103;;22359:214;;;;;;:::i;:::-;;:::i;4708:201::-;;;;;;:::i;:::-;;:::i;23267:537::-;;;;;;:::i;:::-;;:::i;21003:161::-;21078:4;21095:39;3249:10;21118:7;21127:6;21095:8;:39::i;:::-;-1:-1:-1;21152:4:0;21003:161;;;;;:::o;21172:370::-;-1:-1:-1;;;;;21305:19:0;;21270:4;21305:19;;;:11;:19;;;;;;;;3249:10;21305:33;;;;;;;;21357:17;;;;21349:57;;;;-1:-1:-1;;;21349:57:0;;3506:2:1;21349:57:0;;;3488:21:1;3545:2;3525:18;;;3518:30;3584:29;3564:18;;;3557:57;3631:18;;21349:57:0;;;;;;;;;21417:48;21426:6;3249:10;21448:16;21458:6;21448:7;:16;:::i;:::-;21417:8;:48::i;:::-;21476:36;21486:6;21494:9;21505:6;21476:9;:36::i;:::-;-1:-1:-1;21530:4:0;;21172:370;-1:-1:-1;;;;21172:370:0:o;21550:216::-;3249:10;21639:4;21688:25;;;:11;:25;;;;;;;;-1:-1:-1;;;;;21688:34:0;;;;;;;;;;21639:4;;21656:80;;21679:7;;21688:47;;21725:10;;21688:47;:::i;31897:447::-;3872:6;;31946:4;;-1:-1:-1;;;;;3872:6:0;3249:10;4019:23;4011:68;;;;-1:-1:-1;;;4011:68:0;;;;;;;:::i;:::-;31963:17:::1;31991:22:::0;32029:9:::1;32024:219;32048:8;:15:::0;32044:19;::::1;32024:219;;;32135:7;;32119:14;;32098:7;:20;32106:8;32115:1;32106:11;;;;;;;;:::i;:::-;;::::0;;;::::1;::::0;;;;;::::1;::::0;-1:-1:-1;;;;;32106:11:0::1;32098:20:::0;;;::::1;::::0;;;;;;;;;:35:::1;::::0;;::::1;:::i;:::-;32097:45;;;;:::i;:::-;32085:57:::0;-1:-1:-1;32157:27:0::1;32085:57:::0;32157:27;::::1;:::i;:::-;;;32222:9;32199:7;:20;32207:8;32216:1;32207:11;;;;;;;;:::i;:::-;;::::0;;;::::1;::::0;;;;;::::1;::::0;-1:-1:-1;;;;;32207:11:0::1;32199:20:::0;;;::::1;::::0;;;;;;;;:32;32065:3;::::1;::::0;::::1;:::i;:::-;;;;32024:219;;;-1:-1:-1::0;32253:7:0::1;:24:::0;-1:-1:-1;;32288:18:0::1;:26:::0;;-1:-1:-1;;32288:26:0::1;::::0;;;31897:447;:::o;30192:296::-;30252:7;30272:21;30328:3;30307:17;;17604:18;30297:27;;;;:::i;:::-;30296:35;;;;:::i;:::-;30272:59;;30342:15;30421:13;30412:7;30396:14;;30379;;:31;;;;:::i;:::-;30378:41;;;;:::i;:::-;30377:57;;;;:::i;:::-;30360:14;;:74;;;;:::i;:::-;30342:92;;30452:28;30456:7;30465:14;;30452:3;:28::i;:::-;30445:35;30192:296;-1:-1:-1;;;;30192:296:0:o;18615:457::-;3872:6;;18685:4;;-1:-1:-1;;;;;3872:6:0;3249:10;4019:23;4011:68;;;;-1:-1:-1;;;4011:68:0;;;;;;;:::i;:::-;18716:2:::1;18710;:8;;18702:74;;;::::0;-1:-1:-1;;;18702:74:0;;5285:2:1;18702:74:0::1;::::0;::::1;5267:21:1::0;5324:2;5304:18;;;5297:30;5363:34;5343:18;;;5336:62;-1:-1:-1;;;5414:18:1;;;5407:51;5475:19;;18702:74:0::1;5083:417:1::0;18702:74:0::1;17888:2;18795;:17;;18787:83;;;::::0;-1:-1:-1;;;18787:83:0;;5707:2:1;18787:83:0::1;::::0;::::1;5689:21:1::0;5746:2;5726:18;;;5719:30;5785:34;5765:18;;;5758:62;-1:-1:-1;;;5836:18:1;;;5829:51;5897:19;;18787:83:0::1;5505:417:1::0;18787:83:0::1;18890:18;::::0;::::1;;18889:19;18881:101;;;::::0;-1:-1:-1;;;18881:101:0;;6129:2:1;18881:101:0::1;::::0;::::1;6111:21:1::0;6168:2;6148:18;;;6141:30;6207:34;6187:18;;;6180:62;6278:34;6258:18;;;6251:62;-1:-1:-1;;;6329:19:1;;;6322:36;6375:19;;18881:101:0::1;5927:473:1::0;18881:101:0::1;-1:-1:-1::0;18993:14:0::1;:19:::0;;;;19023:14:::1;:19:::0;19060:4:::1;::::0;18615:457::o;20269:270::-;20524:7;;-1:-1:-1;;;;;20498:16:0;;20335:7;20498:16;;;:7;:16;;;;;;20335:7;;20524;20498:24;;17604:18;;20498:24;:::i;:::-;20497:34;;;;:::i;4450:103::-;3872:6;;-1:-1:-1;;;;;3872:6:0;3249:10;4019:23;4011:68;;;;-1:-1:-1;;;4011:68:0;;;;;;;:::i;:::-;4515:30:::1;4542:1;4515:18;:30::i;:::-;4450:103::o:0;22581:412::-;3872:6;;-1:-1:-1;;;;;3872:6:0;3249:10;4019:23;4011:68;;;;-1:-1:-1;;;4011:68:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;22673:30:0;::::1;;::::0;;;:21:::1;:30;::::0;;;;;::::1;;22672:31;22664:82;;;::::0;-1:-1:-1;;;22664:82:0;;6607:2:1;22664:82:0::1;::::0;::::1;6589:21:1::0;6646:2;6626:18;;;6619:30;6685:34;6665:18;;;6658:62;-1:-1:-1;;;6736:18:1;;;6729:36;6782:19;;22664:82:0::1;6405:402:1::0;22664:82:0::1;-1:-1:-1::0;;;;;22757:30:0;::::1;;::::0;;;:21:::1;:30;::::0;;;;;;;:37;;-1:-1:-1;;22757:37:0::1;22790:4;22757:37;::::0;;22873:11:::1;:20:::0;;;;;;22757:37:::1;22873:20;22868:118;;-1:-1:-1::0;;;;;22909:20:0;::::1;;::::0;;;:11:::1;:20;::::0;;;;:27;;-1:-1:-1;;22909:27:0::1;22932:4;22909:27:::0;;::::1;::::0;;;22951:9:::1;:23:::0;;;;::::1;::::0;;;;;;::::1;::::0;;-1:-1:-1;;;;;;22951:23:0::1;::::0;;::::1;::::0;;22868:118:::1;22581:412:::0;:::o;23103:156::-;23188:9;:16;23156:7;;23184:20;;23176:45;;;;-1:-1:-1;;;23176:45:0;;7014:2:1;23176:45:0;;;6996:21:1;7053:2;7033:18;;;7026:30;-1:-1:-1;;;7072:18:1;;;7065:42;7124:18;;23176:45:0;6812:336:1;23176:45:0;23239:9;23249:1;23239:12;;;;;;;;:::i;:::-;;;;;;;;;;;-1:-1:-1;;;;;23239:12:0;;23103:156;-1:-1:-1;;23103:156:0:o;21774:226::-;3249:10;21868:4;21917:25;;;:11;:25;;;;;;;;-1:-1:-1;;;;;21917:34:0;;;;;;;;;;21868:4;;21885:85;;21908:7;;21917:52;;21954:15;;21917:52;:::i;20547:297::-;20625:4;20642:42;3249:10;20666:9;20677:6;20642:9;:42::i;:::-;-1:-1:-1;;;;;20700:20:0;;;;;;:9;:20;;;;;;;;20695:120;;-1:-1:-1;;;;;;;20737:20:0;;;;;:9;:20;;;;;:27;;-1:-1:-1;;20737:27:0;20760:4;20737:27;;;;;;20779:8;:24;;;;;;;;;;;;;;;-1:-1:-1;;;;;;20779:24:0;;;;;;;20760:4;20547:297::o;19080:231::-;3872:6;;19150:4;;-1:-1:-1;;;;;3872:6:0;3249:10;4019:23;4011:68;;;;-1:-1:-1;;;4011:68:0;;;;;;;:::i;:::-;19185:10:::1;19193:2;17604:18;19185:10;:::i;:::-;19175:6;:20;;19167:77;;;::::0;-1:-1:-1;;;19167:77:0;;7355:2:1;19167:77:0::1;::::0;::::1;7337:21:1::0;7394:2;7374:18;;;7367:30;7433:34;7413:18;;;7406:62;-1:-1:-1;;;7484:18:1;;;7477:42;7536:19;;19167:77:0::1;7153:408:1::0;19167:77:0::1;-1:-1:-1::0;19255:17:0::1;:26:::0;;;19299:4:::1;4090:1;19080:231:::0;;;:::o;22359:214::-;3872:6;;-1:-1:-1;;;;;3872:6:0;3249:10;4019:23;4011:68;;;;-1:-1:-1;;;4011:68:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;22441:20:0;::::1;;::::0;;;:11:::1;:20;::::0;;;;;::::1;;22440:21;22432:61;;;::::0;-1:-1:-1;;;22432:61:0;;7768:2:1;22432:61:0::1;::::0;::::1;7750:21:1::0;7807:2;7787:18;;;7780:30;7846:29;7826:18;;;7819:57;7893:18;;22432:61:0::1;7566:351:1::0;22432:61:0::1;-1:-1:-1::0;;;;;22504:20:0::1;;::::0;;;:11:::1;:20;::::0;;;;:27;;-1:-1:-1;;22504:27:0::1;22527:4;22504:27:::0;;::::1;::::0;;;22542:9:::1;:23:::0;;;;::::1;::::0;;;;;;::::1;::::0;;-1:-1:-1;;;;;;22542:23:0::1;::::0;;::::1;::::0;;22359:214::o;4708:201::-;3872:6;;-1:-1:-1;;;;;3872:6:0;3249:10;4019:23;4011:68;;;;-1:-1:-1;;;4011:68:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;4797:22:0;::::1;4789:73;;;::::0;-1:-1:-1;;;4789:73:0;;8124:2:1;4789:73:0::1;::::0;::::1;8106:21:1::0;8163:2;8143:18;;;8136:30;8202:34;8182:18;;;8175:62;-1:-1:-1;;;8253:18:1;;;8246:36;8299:19;;4789:73:0::1;7922:402:1::0;4789:73:0::1;4873:28;4892:8;4873:18;:28::i;23267:537::-:0;3872:6;;-1:-1:-1;;;;;3872:6:0;3249:10;4019:23;4011:68;;;;-1:-1:-1;;;4011:68:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;23348:20:0;::::1;;::::0;;;:11:::1;:20;::::0;;;;;::::1;;23340:60;;;::::0;-1:-1:-1;;;23340:60:0;;8531:2:1;23340:60:0::1;::::0;::::1;8513:21:1::0;8570:2;8550:18;;;8543:30;8609:29;8589:18;;;8582:57;8656:18;;23340:60:0::1;8329:351:1::0;23340:60:0::1;23416:9;23411:386;23435:9;:16:::0;23431:20;::::1;23411:386;;;23493:7;-1:-1:-1::0;;;;;23477:23:0::1;:9;23487:1;23477:12;;;;;;;;:::i;:::-;;::::0;;;::::1;::::0;;;::::1;::::0;-1:-1:-1;;;;;23477:12:0::1;:23:::0;23473:313:::1;;23536:9;23546:16:::0;;:20:::1;::::0;23565:1:::1;::::0;23546:20:::1;:::i;:::-;23536:31;;;;;;;;:::i;:::-;;::::0;;;::::1;::::0;;;::::1;::::0;23521:9:::1;:12:::0;;-1:-1:-1;;;;;23536:31:0;;::::1;::::0;23531:1;;23521:12;::::1;;;;;:::i;:::-;;::::0;;;::::1;::::0;;;;;;::::1;:46:::0;;-1:-1:-1;;;;;;23521:46:0::1;-1:-1:-1::0;;;;;23521:46:0;;::::1;;::::0;;23627:20;;::::1;::::0;;:11:::1;:20:::0;;;;;;:28;;-1:-1:-1;;23627:28:0;;::::1;::::0;;;23674:21:::1;:30:::0;;;;;:38;;;;::::1;::::0;;23731:9:::1;:15:::0;;;::::1;;;;:::i;:::-;;::::0;;;::::1;::::0;;;;-1:-1:-1;;23731:15:0;;;;;-1:-1:-1;;;;;;23731:15:0::1;::::0;;;;;23411:386:::1;23267:537:::0;:::o;23473:313::-:1;23453:3:::0;::::1;::::0;::::1;:::i;:::-;;;;23411:386;;;;23267:537:::0;:::o;23812:347::-;-1:-1:-1;;;;;23915:19:0;;23907:68;;;;-1:-1:-1;;;23907:68:0;;9019:2:1;23907:68:0;;;9001:21:1;9058:2;9038:18;;;9031:30;9097:34;9077:18;;;9070:62;-1:-1:-1;;;9148:18:1;;;9141:34;9192:19;;23907:68:0;8817:400:1;23907:68:0;-1:-1:-1;;;;;23994:21:0;;23986:68;;;;-1:-1:-1;;;23986:68:0;;9424:2:1;23986:68:0;;;9406:21:1;9463:2;9443:18;;;9436:30;9502:34;9482:18;;;9475:62;-1:-1:-1;;;9553:18:1;;;9546:32;9595:19;;23986:68:0;9222:398:1;23986:68:0;-1:-1:-1;;;;;24067:18:0;;;;;;;:11;:18;;;;;;;;:27;;;;;;;;;;;;;:36;;;24119:32;;1391:25:1;;;24119:32:0;;1364:18:1;24119:32:0;;;;;;;23812:347;;;:::o;24167:1378::-;-1:-1:-1;;;;;24273:20:0;;24265:70;;;;-1:-1:-1;;;24265:70:0;;9827:2:1;24265:70:0;;;9809:21:1;9866:2;9846:18;;;9839:30;9905:34;9885:18;;;9878:62;-1:-1:-1;;;9956:18:1;;;9949:35;10001:19;;24265:70:0;9625:401:1;24265:70:0;-1:-1:-1;;;;;24354:23:0;;24346:71;;;;-1:-1:-1;;;24346:71:0;;10233:2:1;24346:71:0;;;10215:21:1;10272:2;10252:18;;;10245:30;10311:34;10291:18;;;10284:62;-1:-1:-1;;;10362:18:1;;;10355:33;10405:19;;24346:71:0;10031:399:1;24346:71:0;24445:1;24436:6;:10;24428:64;;;;-1:-1:-1;;;24428:64:0;;10637:2:1;24428:64:0;;;10619:21:1;10676:2;10656:18;;;10649:30;10715:34;10695:18;;;10688:62;-1:-1:-1;;;10766:18:1;;;10759:39;10815:19;;24428:64:0;10435:405:1;24428:64:0;-1:-1:-1;;;;;24511:19:0;;;;;;:11;:19;;;;;;;;;:55;;-1:-1:-1;;;;;;24534:32:0;;;;;;:21;:32;;;;;;;;24511:55;:77;;;-1:-1:-1;24570:18:0;;;;24511:77;:100;;;-1:-1:-1;24592:14:0;;:19;24511:100;24507:1031;;;24710:43;24727:6;24735:9;24746:6;24710:16;:43::i;:::-;24167:1378;;;:::o;24507:1031::-;-1:-1:-1;;;;;24776:19:0;;;;;;:11;:19;;;;;;;;24775:20;:46;;;;-1:-1:-1;;;;;;24799:22:0;;;;;;:11;:22;;;;;;;;24775:46;24771:767;;;24838:46;24858:6;24866:9;24877:6;24838:19;:46::i;24771:767::-;-1:-1:-1;;;;;24963:19:0;;24917:22;24963:19;;;:11;:19;;;;;;;;24958:93;;-1:-1:-1;;;;;25020:15:0;;;;;;:7;:15;;;;;;25002:33;;;;:::i;:::-;;;24958:93;-1:-1:-1;;;;;25070:22:0;;;;;;:11;:22;;;;;;;;25065:99;;-1:-1:-1;;;;;25130:18:0;;;;;;:7;:18;;;;;;25112:36;;;;:::i;:::-;;;25065:99;25183:9;25178:120;25202:9;:16;25198:20;;25178:120;;;25261:7;:21;25269:9;25279:1;25269:12;;;;;;;;:::i;:::-;;;;;;;;;;;;;-1:-1:-1;;;;;25269:12:0;25261:21;;;;;;;;;;;;;25243:39;;;;:::i;:::-;;-1:-1:-1;25220:3:0;;;;:::i;:::-;;;;25178:120;;;;25346:3;25337:7;;25334:2;:10;;;;:::i;:::-;25333:16;;;;:::i;:::-;25316:14;:33;25312:201;;;25369:43;25386:6;25394:9;25405:6;25369:16;:43::i;:::-;25312:201;;;25453:44;25471:6;25479:9;25490:6;25453:17;:44::i;:::-;24902:636;24167:1378;;;:::o;18436:171::-;18492:7;18521:1;18516;:6;18512:88;;-1:-1:-1;18546:1:0;18539:8;;18512:88;-1:-1:-1;18587:1:0;18580:8;;5069:191;5162:6;;;-1:-1:-1;;;;;5179:17:0;;;-1:-1:-1;;;;;;5179:17:0;;;;;;;5212:40;;5162:6;;;5179:17;5162:6;;5212:40;;5143:16;;5212:40;5132:128;5069:191;:::o;29631:425::-;29834:15;17604:18;29863:7;;29853;:17;;;;:::i;:::-;29852:29;;;;:::i;:::-;-1:-1:-1;;;;;29910:15:0;;;;;;:7;:15;;;;;;29834:47;;-1:-1:-1;29910:25:0;;29834:47;;29910:25;:::i;:::-;-1:-1:-1;;;;;29892:15:0;;;;;;;:7;:15;;;;;;:43;;;;29967:18;;;;;;;:28;;29988:7;;29967:28;:::i;:::-;-1:-1:-1;;;;;29946:18:0;;;;;;;:7;:18;;;;;;;:49;;;;30012:36;;;;;;;;;;30040:7;1391:25:1;;1379:2;1364:18;;1245:177;30012:36:0;;;;;;;;29717:339;29631:425;;;:::o;27468:2153::-;27569:15;27586:23;27611:12;27625:23;27650:12;27666:19;27677:7;27666:10;:19::i;:::-;27568:117;;;;;;;;;;27721:10;27734:13;23071:9;:16;;23001:94;27734:13;27721:26;-1:-1:-1;27981:33:0;28035:6;28040:1;27721:26;28035:6;:::i;:::-;28017:25;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;;;;;;;28017:25:0;;;;;;;;;;;;;;;;27981:61;;28053:21;28091:18;28129:6;28124:362;28145:2;28141:1;:6;28124:362;;;28188:9;-1:-1:-1;;;;;28172:25:0;:9;28182:1;28172:12;;;;;;;;:::i;:::-;;;;;;;;;;;-1:-1:-1;;;;;28172:12:0;:25;28168:307;;28252:9;28262:1;28252:12;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;-1:-1:-1;;;;;28252:12:0;28217;28230:10;28217:24;;;;;;;;:::i;:::-;;;;;;;:32;;:47;-1:-1:-1;;;;;28217:47:0;;;-1:-1:-1;;;;;28217:47:0;;;;;28317:7;:41;28325:12;28338:10;28325:24;;;;;;;;:::i;:::-;;;;;;;:32;;;-1:-1:-1;;;;;28317:41:0;-1:-1:-1;;;;;28317:41:0;;;;;;;;;;;;;28283:12;28296:10;28283:24;;;;;;;;:::i;:::-;;;;;;;:31;;:75;;;;;28394:12;28407:10;28394:24;;;;;;;;:::i;:::-;;;;;;;:31;;;28377:48;;;;;:::i;:::-;;-1:-1:-1;28444:15:0;28458:1;28444:15;;:::i;:::-;;;28168:307;28149:3;;;;:::i;:::-;;;;28124:362;;;;28498:29;-1:-1:-1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;28498:29:0;-1:-1:-1;;;;;28547:15:0;;;;;;:7;:15;;;;;;:25;;28565:7;;28547:25;:::i;:::-;28538:34;;-1:-1:-1;;;;;28592:18:0;;28538:6;28592:18;;;:7;:18;;;;;;:36;;28613:15;;28592:36;:::i;:::-;28583:6;;;:45;;;28639:6;;;:22;;;28693:6;;28683:7;;28648:13;;28583:45;28683:16;;;:::i;:::-;:25;;;;:::i;:::-;:34;;;;:::i;:::-;28672:8;;;:45;;;28744:6;;28739:11;;:4;:11;:::i;:::-;28738:22;;;;:::i;:::-;28730:5;;;:30;28793:8;;;;28785:6;;;;28780:11;;:4;:11;:::i;:::-;28779:22;;;;:::i;:::-;28771:5;;;:30;28834:8;;;;28826:6;;;;28821:11;;:4;:11;:::i;:::-;28820:22;;;;:::i;:::-;28812:5;;;:30;28882:5;;;;28873:6;;:14;;28882:5;28873:14;:::i;:::-;-1:-1:-1;;;;;28855:15:0;;;;;;:7;:15;;;;;;;;:32;;;;28928:5;;;;28919:6;;;;:14;;28928:5;28919:14;:::i;:::-;-1:-1:-1;;;;;28898:18:0;;;;;;:7;:18;;;;;:35;;;;:18;29017:17;;29013:473;;29055:6;29050:279;29071:12;:19;29067:1;:23;29050:279;;;29163:13;29137:12;29150:1;29137:15;;;;;;;;:::i;:::-;;;;;;;:22;;;29129:3;:5;;;:30;;;;:::i;:::-;29128:48;;;;:::i;:::-;29115:61;;29255:10;29230:12;29243:1;29230:15;;;;;;;;:::i;:::-;;;;;;;:22;;;:35;;;;:::i;:::-;29195:7;:32;29203:12;29216:1;29203:15;;;;;;;;:::i;:::-;;;;;;;;;;;;:23;-1:-1:-1;;;;;29195:32:0;;;;;;;;;;;29203:23;29195:32;:70;29284:29;29303:10;29284:29;;:::i;:::-;;-1:-1:-1;29092:3:0;;;;:::i;:::-;;;;29050:279;;;;29013:473;29496:57;29531:15;29523:3;:5;;;29515:3;:5;;;29508:4;:12;;;;:::i;:::-;:20;;;;:::i;:::-;:38;;;;:::i;:::-;29548:4;29496:11;:57::i;:::-;29586:9;-1:-1:-1;;;;;29569:44:0;29578:6;-1:-1:-1;;;;;29569:44:0;;29597:15;29569:44;;;;1391:25:1;;1379:2;1364:18;;1245:177;29569:44:0;;;;;;;;27557:2064;;;;;;;;;;;;27468:2153;;;:::o;25888:1572::-;25987:15;26004:23;26029:12;26043:23;26068:12;26084:19;26095:7;26084:10;:19::i;:::-;25986:117;;;;;;;;;;26137:10;26150:13;23071:9;:16;;23001:94;26150:13;26137:26;;26176:31;26224:2;26210:17;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;26210:17:0;;26176:51;;26238:21;26281:6;26276:146;26297:2;26293:1;:6;26276:146;;;26340:7;:21;26348:9;26358:1;26348:12;;;;;;;;:::i;:::-;;;;;;;;;;;;;-1:-1:-1;;;;;26348:12:0;26340:21;;;;;;;;;;;;;26320:17;;:14;;26335:1;;26320:17;;;;;;:::i;:::-;;;;;;:41;;;;;26393:14;26408:1;26393:17;;;;;;;;:::i;:::-;;;;;;;26376:34;;;;;:::i;:::-;;-1:-1:-1;26301:3:0;;;;:::i;:::-;;;;26276:146;;;;26434:29;-1:-1:-1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;26434:29:0;-1:-1:-1;;;;;26483:15:0;;;;;;:7;:15;;;;;;:25;;26501:7;;26483:25;:::i;:::-;26474:34;;-1:-1:-1;;;;;26528:18:0;;26474:6;26528:18;;;:7;:18;;;;;;:36;;26549:15;;26528:36;:::i;:::-;26519:6;;;:45;;;26575:6;;;:22;;;26628:6;;26619:7;;26584:13;;26519:45;26619:15;;;:::i;:::-;:24;;;;:::i;:::-;:33;;;;:::i;:::-;26608:8;;;:44;;;26679:6;;26674:11;;:4;:11;:::i;:::-;26673:22;;;;:::i;:::-;26665:5;;;:30;26728:8;;;;26720:6;;;;26715:11;;:4;:11;:::i;:::-;26714:22;;;;:::i;:::-;26706:5;;;:30;26769:8;;;;26761:6;;;;26756:11;;:4;:11;:::i;:::-;26755:22;;;;:::i;:::-;26747:5;;;:30;26819:5;;;;26810:6;;:14;;26819:5;26810:14;:::i;:::-;-1:-1:-1;;;;;26792:15:0;;;;;;:7;:15;;;;;;;;:32;;;;26865:5;;;;26856:6;;;;:14;;26865:5;26856:14;:::i;:::-;-1:-1:-1;;;;;26835:18:0;;;;;;:7;:18;;;;;:35;;;;:18;26952:17;;26948:375;;26990:6;26985:235;27004:2;27000:1;:6;26985:235;;;27070:13;27051:14;27066:1;27051:17;;;;;;;;:::i;:::-;;;;;;;27045:3;:5;;;:23;;;;:::i;:::-;27044:39;;;;:::i;:::-;27031:52;;27146:10;27126:14;27141:1;27126:17;;;;;;;;:::i;:::-;;;;;;;:30;;;;:::i;:::-;27102:7;:21;27110:9;27120:1;27110:12;;;;;;;;:::i;:::-;;;;;;;;;;;;;-1:-1:-1;;;;;27110:12:0;27102:21;;;;;;;;;;;;:54;27175:29;27194:10;27175:29;;:::i;:::-;;-1:-1:-1;27008:3:0;;;;:::i;:::-;;;;26985:235;;;;26948:375;27333:57;27368:15;27360:3;:5;;;27352:3;:5;;;27345:4;:12;;;;:::i;:::-;:20;;;;:::i;:::-;:38;;;;:::i;:::-;27385:4;27333:11;:57::i;:::-;27423:9;-1:-1:-1;;;;;27406:44:0;27415:6;-1:-1:-1;;;;;27406:44:0;;27434:15;27406:44;;;;1391:25:1;;1379:2;1364:18;;1245:177;27406:44:0;;;;;;;;25975:1485;;;;;;;;;;;25888:1572;;;:::o;30496:819::-;30650:18;;30550:7;;;;;;;;;;30650:18;;30645:138;;30699:12;17604:18;30699:2;:12;:::i;:::-;30689:7;;:22;30685:87;;;30731:18;:25;;-1:-1:-1;;30731:25:0;30752:4;30731:25;;;30685:87;30855:11;30869:21;30882:7;30869:12;:21::i;:::-;30855:35;;30981:23;31006:12;31022:25;31034:7;31043:3;31022:11;:25::i;:::-;30980:67;;;;31150:15;31167:23;31192:12;31208:26;31220:7;31229:4;31208:11;:26::i;:::-;31149:85;;;;-1:-1:-1;31149:85:0;;-1:-1:-1;31285:15:0;;-1:-1:-1;31302:4:0;;-1:-1:-1;30496:819:0;;-1:-1:-1;;;;;;30496:819:0:o;30064:120::-;30143:4;30132:7;;:15;;;;;;;:::i;:::-;;;;;;;;30172:4;30158:10;;:18;;;;;;;:::i;:::-;;;;-1:-1:-1;;;;30064:120:0:o;31323:238::-;31396:7;;;31458:3;31441:13;31451:3;31441:7;:13;:::i;:::-;31440:21;;;;:::i;:::-;31425:36;-1:-1:-1;31472:23:0;31498:14;31425:36;31498:7;:14;:::i;:::-;31472:40;31548:4;;-1:-1:-1;31323:238:0;;-1:-1:-1;;;;31323:238:0:o;31569:320::-;31643:7;31652;31661;31681:15;17604:18;31710:7;;31700;:17;;;;:::i;:::-;31699:29;;;;:::i;:::-;31681:47;;31739:12;17604:18;31762:7;;31755:4;:14;;;;:::i;:::-;31754:26;;;;:::i;:::-;31739:41;-1:-1:-1;31791:23:0;31817:14;31739:41;31817:7;:14;:::i;:::-;31850:7;;-1:-1:-1;31791:40:0;;-1:-1:-1;31876:4:0;-1:-1:-1;;31569:320:0;;;;;:::o;14:597:1:-;126:4;155:2;184;173:9;166:21;216:6;210:13;259:6;254:2;243:9;239:18;232:34;284:1;294:140;308:6;305:1;302:13;294:140;;;403:14;;;399:23;;393:30;369:17;;;388:2;365:26;358:66;323:10;;294:140;;;452:6;449:1;446:13;443:91;;;522:1;517:2;508:6;497:9;493:22;489:31;482:42;443:91;-1:-1:-1;595:2:1;574:15;-1:-1:-1;;570:29:1;555:45;;;;602:2;551:54;;14:597;-1:-1:-1;;;14:597:1:o;616:173::-;684:20;;-1:-1:-1;;;;;733:31:1;;723:42;;713:70;;779:1;776;769:12;794:254;862:6;870;923:2;911:9;902:7;898:23;894:32;891:52;;;939:1;936;929:12;891:52;962:29;981:9;962:29;:::i;:::-;952:39;1038:2;1023:18;;;;1010:32;;-1:-1:-1;;;794:254:1:o;1427:328::-;1504:6;1512;1520;1573:2;1561:9;1552:7;1548:23;1544:32;1541:52;;;1589:1;1586;1579:12;1541:52;1612:29;1631:9;1612:29;:::i;:::-;1602:39;;1660:38;1694:2;1683:9;1679:18;1660:38;:::i;:::-;1650:48;;1745:2;1734:9;1730:18;1717:32;1707:42;;1427:328;;;;;:::o;1949:180::-;2008:6;2061:2;2049:9;2040:7;2036:23;2032:32;2029:52;;;2077:1;2074;2067:12;2029:52;-1:-1:-1;2100:23:1;;1949:180;-1:-1:-1;1949:180:1:o;2134:248::-;2202:6;2210;2263:2;2251:9;2242:7;2238:23;2234:32;2231:52;;;2279:1;2276;2269:12;2231:52;-1:-1:-1;;2302:23:1;;;2372:2;2357:18;;;2344:32;;-1:-1:-1;2134:248:1:o;2387:186::-;2446:6;2499:2;2487:9;2478:7;2474:23;2470:32;2467:52;;;2515:1;2512;2505:12;2467:52;2538:29;2557:9;2538:29;:::i;:::-;2528:39;2387:186;-1:-1:-1;;;2387:186:1:o;3039:260::-;3107:6;3115;3168:2;3156:9;3147:7;3143:23;3139:32;3136:52;;;3184:1;3181;3174:12;3136:52;3207:29;3226:9;3207:29;:::i;:::-;3197:39;;3255:38;3289:2;3278:9;3274:18;3255:38;:::i;:::-;3245:48;;3039:260;;;;;:::o;3660:127::-;3721:10;3716:3;3712:20;3709:1;3702:31;3752:4;3749:1;3742:15;3776:4;3773:1;3766:15;3792:125;3832:4;3860:1;3857;3854:8;3851:34;;;3865:18;;:::i;:::-;-1:-1:-1;3902:9:1;;3792:125::o;3922:128::-;3962:3;3993:1;3989:6;3986:1;3983:13;3980:39;;;3999:18;;:::i;:::-;-1:-1:-1;4035:9:1;;3922:128::o;4055:356::-;4257:2;4239:21;;;4276:18;;;4269:30;4335:34;4330:2;4315:18;;4308:62;4402:2;4387:18;;4055:356::o;4416:127::-;4477:10;4472:3;4468:20;4465:1;4458:31;4508:4;4505:1;4498:15;4532:4;4529:1;4522:15;4548:168;4588:7;4654:1;4650;4646:6;4642:14;4639:1;4636:21;4631:1;4624:9;4617:17;4613:45;4610:71;;;4661:18;;:::i;:::-;-1:-1:-1;4701:9:1;;4548:168::o;4721:217::-;4761:1;4787;4777:132;;4831:10;4826:3;4822:20;4819:1;4812:31;4866:4;4863:1;4856:15;4894:4;4891:1;4884:15;4777:132;-1:-1:-1;4923:9:1;;4721:217::o;4943:135::-;4982:3;5003:17;;;5000:43;;5023:18;;:::i;:::-;-1:-1:-1;5070:1:1;5059:13;;4943:135::o;8685:127::-;8746:10;8741:3;8737:20;8734:1;8727:31;8777:4;8774:1;8767:15;8801:4;8798:1;8791:15;10845:127;10906:10;10901:3;10897:20;10894:1;10887:31;10937:4;10934:1;10927:15;10961:4;10958:1;10951:15

Swarm Source

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