ETH Price: $3,103.30 (+0.65%)
Gas: 6 Gwei

Token

FEG Wrapped SHIB (fSHIB)
 

Overview

Max Total Supply

35,777,055,812.359567004339055584 fSHIB

Holders

21

Market

Onchain Market Cap

$0.00

Circulating Supply Market Cap

-

Other Info

Token Contract (WITH 18 Decimals)

Balance
0.000000028894583633 fSHIB

Value
$0.00
0x7b9ca33b6e6d7650148aee719d315c828a0e35f7
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:
fSHIB

Compiler Version
v0.8.4+commit.c7e474f2

Optimization Enabled:
No with 200 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity)

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

// SPDX-License-Identifier: MIT

pragma solidity ^0.8.4;

library EnumerableSet {
    // To implement this library for multiple types with as little code
    // repetition as possible, we write it in terms of a generic Set type with
    // bytes32 values.
    // The Set implementation uses private functions, and user-facing
    // implementations (such as AddressSet) are just wrappers around the
    // underlying Set.
    // This means that we can only create new EnumerableSets for types that fit
    // in bytes32.

    struct Set {
        // Storage of set values
        bytes32[] _values;

        // Position of the value in the `values` array, plus 1 because index 0
        // means a value is not in the set.
        mapping (bytes32 => uint256) _indexes;
    }

    /**
     * @dev Add a value to a set. O(1).
     *
     * Returns true if the value was added to the set, that is if it was not
     * already present.
     */
    function _add(Set storage set, bytes32 value) private returns (bool) {
        if (!_contains(set, value)) {
            set._values.push(value);
            // The value is stored at length-1, but we add 1 to all indexes
            // and use 0 as a sentinel value
            set._indexes[value] = set._values.length;
            return true;
        } else {
            return false;
        }
    }

    /**
     * @dev Removes a value from a set. O(1).
     *
     * Returns true if the value was removed from the set, that is if it was
     * present.
     */
    function _remove(Set storage set, bytes32 value) private returns (bool) {
        // We read and store the value's index to prevent multiple reads from the same storage slot
        uint256 valueIndex = set._indexes[value];

        if (valueIndex != 0) { // Equivalent to contains(set, value)
            // To delete an element from the _values array in O(1), we swap the element to delete with the last one in
            // the array, and then remove the last element (sometimes called as 'swap and pop').
            // This modifies the order of the array, as noted in {at}.

            uint256 toDeleteIndex = valueIndex - 1;
            uint256 lastIndex = set._values.length - 1;

            // When the value to delete is the last one, the swap operation is unnecessary. However, since this occurs
            // so rarely, we still do the swap anyway to avoid the gas cost of adding an 'if' statement.

            bytes32 lastvalue = set._values[lastIndex];

            // Move the last value to the index where the value to delete is
            set._values[toDeleteIndex] = lastvalue;
            // Update the index for the moved value
            set._indexes[lastvalue] = toDeleteIndex + 1; // All indexes are 1-based

            // Delete the slot where the moved value was stored
            set._values.pop();

            // Delete the index for the deleted slot
            delete set._indexes[value];

            return true;
        } else {
            return false;
        }
    }

    /**
     * @dev Returns true if the value is in the set. O(1).
     */
    function _contains(Set storage set, bytes32 value) private view returns (bool) {
        return set._indexes[value] != 0;
    }

    /**
     * @dev Returns the number of values on the set. O(1).
     */
    function _length(Set storage set) private view returns (uint256) {
        return set._values.length;
    }

   /**
    * @dev Returns the value stored at position `index` in the set. O(1).
    *
    * Note that there are no guarantees on the ordering of values inside the
    * array, and it may change when more values are added or removed.
    *
    * Requirements:
    *
    * - `index` must be strictly less than {length}.
    */
    function _at(Set storage set, uint256 index) private view returns (bytes32) {
        require(set._values.length > index, "EnumerableSet: index out of bounds");
        return set._values[index];
    }

    // Bytes32Set

    struct Bytes32Set {
        Set _inner;
    }

    /**
     * @dev Add a value to a set. O(1).
     *
     * Returns true if the value was added to the set, that is if it was not
     * already present.
     */
    function add(Bytes32Set storage set, bytes32 value) internal returns (bool) {
        return _add(set._inner, value);
    }

    /**
     * @dev Removes a value from a set. O(1).
     *
     * Returns true if the value was removed from the set, that is if it was
     * present.
     */
    function remove(Bytes32Set storage set, bytes32 value) internal returns (bool) {
        return _remove(set._inner, value);
    }

    /**
     * @dev Returns true if the value is in the set. O(1).
     */
    function contains(Bytes32Set storage set, bytes32 value) internal view returns (bool) {
        return _contains(set._inner, value);
    }

    /**
     * @dev Returns the number of values in the set. O(1).
     */
    function length(Bytes32Set storage set) internal view returns (uint256) {
        return _length(set._inner);
    }

   /**
    * @dev Returns the value stored at position `index` in the set. O(1).
    *
    * Note that there are no guarantees on the ordering of values inside the
    * array, and it may change when more values are added or removed.
    *
    * Requirements:
    *
    * - `index` must be strictly less than {length}.
    */
    function at(Bytes32Set storage set, uint256 index) internal view returns (bytes32) {
        return _at(set._inner, index);
    }

    // AddressSet

    struct AddressSet {
        Set _inner;
    }

    /**
     * @dev Add a value to a set. O(1).
     *
     * Returns true if the value was added to the set, that is if it was not
     * already present.
     */
    function add(AddressSet storage set, address value) internal returns (bool) {
        return _add(set._inner, bytes32(uint256(uint160(value))));
    }

    /**
     * @dev Removes a value from a set. O(1).
     *
     * Returns true if the value was removed from the set, that is if it was
     * present.
     */
    function remove(AddressSet storage set, address value) internal returns (bool) {
        return _remove(set._inner, bytes32(uint256(uint160(value))));
    }

    /**
     * @dev Returns true if the value is in the set. O(1).
     */
    function contains(AddressSet storage set, address value) internal view returns (bool) {
        return _contains(set._inner, bytes32(uint256(uint160(value))));
    }

    /**
     * @dev Returns the number of values in the set. O(1).
     */
    function length(AddressSet storage set) internal view returns (uint256) {
        return _length(set._inner);
    }

   /**
    * @dev Returns the value stored at position `index` in the set. O(1).
    *
    * Note that there are no guarantees on the ordering of values inside the
    * array, and it may change when more values are added or removed.
    *
    * Requirements:
    *
    * - `index` must be strictly less than {length}.
    */
    function at(AddressSet storage set, uint256 index) internal view returns (address) {
        return address(uint160(uint256(_at(set._inner, index))));
    }


    // UintSet

    struct UintSet {
        Set _inner;
    }

    /**
     * @dev Add a value to a set. O(1).
     *
     * Returns true if the value was added to the set, that is if it was not
     * already present.
     */
    function add(UintSet storage set, uint256 value) internal returns (bool) {
        return _add(set._inner, bytes32(value));
    }

    /**
     * @dev Removes a value from a set. O(1).
     *
     * Returns true if the value was removed from the set, that is if it was
     * present.
     */
    function remove(UintSet storage set, uint256 value) internal returns (bool) {
        return _remove(set._inner, bytes32(value));
    }

    /**
     * @dev Returns true if the value is in the set. O(1).
     */
    function contains(UintSet storage set, uint256 value) internal view returns (bool) {
        return _contains(set._inner, bytes32(value));
    }

    /**
     * @dev Returns the number of values on the set. O(1).
     */
    function length(UintSet storage set) internal view returns (uint256) {
        return _length(set._inner);
    }

   /**
    * @dev Returns the value stored at position `index` in the set. O(1).
    *
    * Note that there are no guarantees on the ordering of values inside the
    * array, and it may change when more values are added or removed.
    *
    * Requirements:
    *
    * - `index` must be strictly less than {length}.
    */
    function at(UintSet storage set, uint256 index) internal view returns (uint256) {
        return uint256(_at(set._inner, index));
    }
}
    
    abstract contract ReentrancyGuard {

    uint256 private constant _NOT_ENTERED = 1;
    uint256 private constant _ENTERED = 2;

    uint256 private _status;

    constructor () {
        _status = _NOT_ENTERED;
    }

    modifier nonReentrant() {

        require(_status != _ENTERED, "ReentrancyGuard: reentrant call");

        _status = _ENTERED;

        _;

        _status = _NOT_ENTERED;
    }
}


// File: openzeppelin-solidity\contracts\token\ERC20\IERC20.sol

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

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

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

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

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

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

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

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

// File: openzeppelin-solidity\contracts\utils\Address.sol


/**
 * @dev Collection of functions related to the address type
 */
library Address {
    /**
     * @dev Returns true if `account` is a contract.
     *
     * [IMPORTANT]
     * ====
     * It is unsafe to assume that an address for which this function returns
     * false is an externally-owned account (EOA) and not a contract.
     *
     * Among others, `isContract` will return false for the following
     * types of addresses:
     *
     *  - an externally-owned account
     *  - a contract in construction
     *  - an address where a contract will be created
     *  - an address where a contract lived, but was destroyed
     * ====
     */
    function isContract(address account) internal view returns (bool) {
        // According to EIP-1052, 0x0 is the value returned for not-yet created accounts
        // and 0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470 is returned
        // for accounts without code, i.e. `keccak256('')`
        bytes32 codehash;
        bytes32 accountHash = 0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470;
        // solhint-disable-next-line no-inline-assembly
        assembly { codehash := extcodehash(account) }
        return (codehash != accountHash && codehash != 0x0);
    }
    
    
    /**
     * @dev Replacement for Solidity's `transfer`: sends `amount` wei to
     * `recipient`, forwarding all available gas and reverting on errors.
     *
     * https://eips.ethereum.org/EIPS/eip-1884[EIP1884] increases the gas cost
     * of certain opcodes, possibly making contracts go over the 2300 gas limit
     * imposed by `transfer`, making them unable to receive funds via
     * `transfer`. {sendValue} removes this limitation.
     *
     * https://diligence.consensys.net/posts/2019/09/stop-using-soliditys-transfer-now/[Learn more].
     *
     * IMPORTANT: because control is transferred to `recipient`, care must be
     * taken to not create reentrancy vulnerabilities. Consider using
     * {ReentrancyGuard} or the
     * https://solidity.readthedocs.io/en/v0.5.11/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern].
     */
    function sendValue(address payable recipient, uint256 amount) internal {
        require(address(this).balance >= amount, "Address: insufficient balance");

        // solhint-disable-next-line avoid-low-level-calls, avoid-call-value
        (bool success, ) = recipient.call{ value: amount }("");
        require(success, "Address: unable to send value, recipient may have reverted");
    }

    /**
     * @dev Performs a Solidity function call using a low level `call`. A
     * plain`call` is an unsafe replacement for a function call: use this
     * function instead.
     *
     * If `target` reverts with a revert reason, it is bubbled up by this
     * function (like regular Solidity function calls).
     *
     * Returns the raw returned data. To convert to the expected return value,
     * use https://solidity.readthedocs.io/en/latest/units-and-global-variables.html?highlight=abi.decode#abi-encoding-and-decoding-functions[`abi.decode`].
     *
     * Requirements:
     *
     * - `target` must be a contract.
     * - calling `target` with `data` must not revert.
     *
     * _Available since v3.1._
     */
    function functionCall(address target, bytes memory data) internal returns (bytes memory) {
      return functionCall(target, data, "Address: low-level call failed");
    }

    /**
     * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], but with
     * `errorMessage` as a fallback revert reason when `target` reverts.
     *
     * _Available since v3.1._
     */
    function functionCall(address target, bytes memory data, string memory errorMessage) internal returns (bytes memory) {
        return _functionCallWithValue(target, data, 0, errorMessage);
    }

    /**
     * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],
     * but also transferring `value` wei to `target`.
     *
     * Requirements:
     *
     * - the calling contract must have an ETH balance of at least `value`.
     * - the called Solidity function must be `payable`.
     *
     * _Available since v3.1._
     */
    function functionCallWithValue(address target, bytes memory data, uint256 value) internal returns (bytes memory) {
        return functionCallWithValue(target, data, value, "Address: low-level call with value failed");
    }

    /**
     * @dev Same as {xref-Address-functionCallWithValue-address-bytes-uint256-}[`functionCallWithValue`], but
     * with `errorMessage` as a fallback revert reason when `target` reverts.
     *
     * _Available since v3.1._
     */
    function functionCallWithValue(address target, bytes memory data, uint256 value, string memory errorMessage) internal returns (bytes memory) {
        require(address(this).balance >= value, "Address: insufficient balance for call");
        return _functionCallWithValue(target, data, value, errorMessage);
    }

    function _functionCallWithValue(address target, bytes memory data, uint256 weiValue, string memory errorMessage) private returns (bytes memory) {
        require(isContract(target), "Address: call to non-contract");

        // solhint-disable-next-line avoid-low-level-calls
        (bool success, bytes memory returndata) = target.call{ value: weiValue }(data);
        if (success) {
            return returndata;
        } else {
            // Look for revert reason and bubble it up if present
            if (returndata.length > 0) {
                // The easiest way to bubble the revert reason is using memory via assembly

                // solhint-disable-next-line no-inline-assembly
                assembly {
                    let returndata_size := mload(returndata)
                    revert(add(32, returndata), returndata_size)
                }
            } else {
                revert(errorMessage);
            }
        }
    }
}

library SafeMath {
    /**
     * @dev Returns the addition of two unsigned integers, reverting on
     * overflow.
     *
     * Counterpart to Solidity's `+` operator.
     *
     * Requirements:
     *
     * - Addition cannot overflow.
     */
    function add(uint256 a, uint256 b) internal pure returns (uint256) {
        uint256 c = a + b;
        require(c >= a, "SafeMath: addition overflow");

        return c;
    }

    /**
     * @dev Returns the subtraction of two unsigned integers, reverting on
     * overflow (when the result is negative).
     *
     * Counterpart to Solidity's `-` operator.
     *
     * Requirements:
     *
     * - Subtraction cannot overflow.
     */
    function sub(uint256 a, uint256 b) internal pure returns (uint256) {
        return sub(a, b, "SafeMath: subtraction overflow");
    }

    /**
     * @dev Returns the subtraction of two unsigned integers, reverting with custom message on
     * overflow (when the result is negative).
     *
     * Counterpart to Solidity's `-` operator.
     *
     * Requirements:
     *
     * - Subtraction cannot overflow.
     */
    function sub(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) {
        require(b <= a, errorMessage);
        uint256 c = a - b;

        return c;
    }

    /**
     * @dev Returns the multiplication of two unsigned integers, reverting on
     * overflow.
     *
     * Counterpart to Solidity's `*` operator.
     *
     * Requirements:
     *
     * - Multiplication cannot overflow.
     */
    function mul(uint256 a, uint256 b) internal pure returns (uint256) {
        // Gas optimization: this is cheaper than requiring 'a' not being zero, but the
        // benefit is lost if 'b' is also tested.
        // See: https://github.com/OpenZeppelin/openzeppelin-contracts/pull/522
        if (a == 0) {
            return 0;
        }

        uint256 c = a * b;
        require(c / a == b, "SafeMath: multiplication overflow");

        return c;
    }

    /**
     * @dev Returns the integer division of two unsigned integers. Reverts on
     * division by zero. The result is rounded towards zero.
     *
     * Counterpart to Solidity's `/` operator. Note: this function uses a
     * `revert` opcode (which leaves remaining gas untouched) while Solidity
     * uses an invalid opcode to revert (consuming all remaining gas).
     *
     * Requirements:
     *
     * - The divisor cannot be zero.
     */
    function div(uint256 a, uint256 b) internal pure returns (uint256) {
        return div(a, b, "SafeMath: division by zero");
    }

    /**
     * @dev Returns the integer division of two unsigned integers. Reverts with custom message on
     * division by zero. The result is rounded towards zero.
     *
     * Counterpart to Solidity's `/` operator. Note: this function uses a
     * `revert` opcode (which leaves remaining gas untouched) while Solidity
     * uses an invalid opcode to revert (consuming all remaining gas).
     *
     * Requirements:
     *
     * - The divisor cannot be zero.
     */
    function div(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) {
        require(b > 0, errorMessage);
        uint256 c = a / b;
        // assert(a == b * c + a % b); // There is no case in which this doesn't hold

        return c;
    }

    /**
     * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo),
     * Reverts when dividing by zero.
     *
     * Counterpart to Solidity's `%` operator. This function uses a `revert`
     * opcode (which leaves remaining gas untouched) while Solidity uses an
     * invalid opcode to revert (consuming all remaining gas).
     *
     * Requirements:
     *
     * - The divisor cannot be zero.
     */
    function mod(uint256 a, uint256 b) internal pure returns (uint256) {
        return mod(a, b, "SafeMath: modulo by zero");
    }

    /**
     * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo),
     * Reverts with custom message when dividing by zero.
     *
     * Counterpart to Solidity's `%` operator. This function uses a `revert`
     * opcode (which leaves remaining gas untouched) while Solidity uses an
     * invalid opcode to revert (consuming all remaining gas).
     *
     * Requirements:
     *
     * - The divisor cannot be zero.
     */
    function mod(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) {
        require(b != 0, errorMessage);
        return a % b;
    }
    
    function ceil(uint a, uint m) internal pure returns (uint r) {
        return (a + m - 1) / m * m;
    }
}

contract fSHIB is IERC20, ReentrancyGuard {
    using Address for address;
    using SafeMath for uint256;
    enum TxType { FromExcluded, ToExcluded, BothExcluded, Standard }

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

    EnumerableSet.AddressSet excluded;

    uint256 private tTokenSupply;
    uint256 private rTokenSupply;
    uint256 private feesAccrued;
 
    string private _name = 'FEG Wrapped SHIB'; 
    string private _symbol = 'fSHIB';
    uint8  private _decimals = 18;
    
    address private op;
    address private op2;
    address public tContract = 0x95aD61b0a150d79219dCF64E1E6Cc01f0B64C4cE;
    
    event  Deposit(address indexed dst, uint amount);
    event  Withdrawal(address indexed src, uint amount);

    constructor () {
        op = address(0x4c9BC793716e8dC05d1F48D8cA8f84318Ec3043C);
        op2 = op;
        EnumerableSet.add(excluded, address(0)); // stablity - zen.
        emit Transfer(address(0), msg.sender, 0);
    }

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

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

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

    function totalSupply() public view override returns (uint256) {
        return tTokenSupply;
    }

    function balanceOf(address account) public view override returns (uint256) {
        if (EnumerableSet.contains(excluded, account)) return tTokenBalance[account];
        (uint256 r, uint256 t) = currentSupply();
        return (rTokenBalance[account] * t)  / r;
    }

    function transfer(address recipient, uint256 amount) public override returns (bool) {
        _transfer(msg.sender, recipient, amount);
        return true;
    }

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

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

    function transferFrom(address sender, address recipient, uint256 amount) public override returns (bool) {
        _transfer(sender, recipient, amount);
        _approve(sender, msg.sender, _allowances[sender][msg.sender] - amount);
        return true;
    }

    function increaseAllowance(address spender, uint256 addedValue) public virtual returns (bool) {
        _approve(msg.sender, spender, _allowances[msg.sender][spender] + addedValue);
        return true;
    }

    function decreaseAllowance(address spender, uint256 subtractedValue) public virtual returns (bool) {
        _approve(msg.sender, spender, _allowances[msg.sender][spender] - subtractedValue);
        return true;
    }

    function isExcluded(address account) public view returns (bool) {
        return EnumerableSet.contains(excluded, account);
    }

    function totalFees() public view returns (uint256) {
        return feesAccrued;
    }
    
    function ClaimOPfee() public {
        require (msg.sender == op);
        uint256 transferToAmount = (IERC20(tContract).balanceOf(address(this))) - (tTokenSupply);
        _pushUnderlying(tContract, op, transferToAmount);
        tTokenSupply -= transferToAmount;
      
        
    }
    
    function deposit(uint256 _amount) public  {
        require(_amount > 0, "can't deposit nothing");
        _pullUnderlying(tContract, msg.sender, _amount);
        (uint256 r, uint256 t) = currentSupply();
        uint256 fee = _amount / 100; 
        uint256 df = fee / 10;
        uint256 net = fee != 0 ? (_amount - (fee)) : _amount;
        tTokenSupply += _amount;
        if(isExcluded(msg.sender)){
            tTokenBalance[msg.sender] += (_amount- fee);
        } 
        feesAccrued += df;
        rTokenBalance[op] += ((df * r) / t);
        rTokenSupply += (((net + df) * r) / t);
        rTokenBalance[msg.sender] += ((net * r) / t);
        emit Deposit(msg.sender, _amount);
    }

    function _pullUnderlying(address erc20, address from, uint amount)
        internal
        nonReentrant
    {
        bool xfer = IERC20(erc20).transferFrom(from, address(this), amount);
        require(xfer, "ERR_ERC20_FALSE");
    }
    
    
    function withdraw(uint256 _amount) public  {
        require(balanceOf(msg.sender) >= _amount && _amount <= totalSupply(), "invalid _amount");
        (uint256 r, uint256 t) = currentSupply();
        uint256 fee = _amount / 100;
        uint256 wf = fee / 10;
        uint256 net = _amount - fee;
        if(isExcluded(msg.sender)) {
            tTokenBalance[msg.sender] -= _amount;
            rTokenBalance[msg.sender] -= ((_amount * r) / t);
        } else {
            rTokenBalance[msg.sender] -= ((_amount * r) / t);
        }
        tTokenSupply -= (net + wf);
        rTokenSupply -= (((net + wf) * r ) / t);
        rTokenBalance[op] += ((wf * r) / t);
        feesAccrued += wf;
        _pushUnderlying(tContract, msg.sender, net);
        emit Withdrawal(msg.sender, net);
    }
    
    function _pushUnderlying(address erc20, address to, uint amount)
        internal
        nonReentrant
    {
        bool xfer = IERC20(erc20).transfer(to, amount);
        require(xfer, "ERR_ERC20_FALSE");
    }
    
    function rTokenToEveryone(uint256 amt) public {
        require(!isExcluded(msg.sender), "not allowed");
        (uint256 r, uint256 t) = currentSupply();
        rTokenBalance[msg.sender] -= ((amt * r) / t);
        rTokenSupply -= ((amt * r) / t);
        feesAccrued += amt;
    }

    function excludeFromFees(address account) external {
        require(msg.sender == op2, "op only");
        require(!EnumerableSet.contains(excluded, account), "address excluded");
        if(rTokenBalance[account] > 0) {
            (uint256 r, uint256 t) = currentSupply();
            tTokenBalance[account] = (rTokenBalance[account] * (t)) / (r);
        }
        EnumerableSet.add(excluded, account);
    }

    function includeInFees(address account) external {
        require(msg.sender == op2, "op only");
        require(EnumerableSet.contains(excluded, account), "address excluded");
        tTokenBalance[account] = 0;
        EnumerableSet.remove(excluded, account);
    }
    
    function tTokenFromrToken(uint256 rTokenAmount) external view returns (uint256) {
        (uint256 r, uint256 t) = currentSupply();
        return (rTokenAmount * t) / r;
    }


    function _approve(address owner, address spender, uint256 amount) private {
        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 getTtype(address sender, address recipient) internal view returns (TxType t) {
        bool isSenderExcluded = EnumerableSet.contains(excluded, sender);
        bool isRecipientExcluded = EnumerableSet.contains(excluded, recipient);
        if (isSenderExcluded && !isRecipientExcluded) {
            t = TxType.FromExcluded;
        } else if (!isSenderExcluded && isRecipientExcluded) {
            t = TxType.ToExcluded;
        } else if (!isSenderExcluded && !isRecipientExcluded) {
            t = TxType.Standard;
        } else if (isSenderExcluded && isRecipientExcluded) {
            t = TxType.BothExcluded;
        } else {
            t = TxType.Standard;
        }
        return t;
    }
    function _transfer(address sender, address recipient, uint256 amt) private {
        require(sender != address(0), "ERC20: transfer from the zero address");
        require(recipient != address(0), "ERC20: transfer to the zero address");
        require(amt > 0, "Transfer amt must be greater than zero");
        (uint256 r, uint256 t) = currentSupply();
        uint256 fee = amt / 100;
        TxType tt = getTtype(sender, recipient);
        if (tt == TxType.ToExcluded) {
            rTokenBalance[sender] -= ((amt * r) / t);
            tTokenBalance[recipient] += (amt - fee);
            rTokenBalance[recipient] += (((amt - fee) * r) / t);
        } else if (tt == TxType.FromExcluded) {
            tTokenBalance[sender] -= (amt);
            rTokenBalance[sender] -= ((amt * r) / t);
            rTokenBalance[recipient] += (((amt - fee) * r) / t);
        } else if (tt == TxType.BothExcluded) {
            tTokenBalance[sender] -= (amt);
            rTokenBalance[sender] -= ((amt * r) / t);
            tTokenBalance[recipient] += (amt - fee);
            rTokenBalance[recipient] += (((amt - fee) * r) / t);
        } else {
            rTokenBalance[sender] -= ((amt * r) / t);
            rTokenBalance[recipient] += (((amt - fee) * r) / t);
        }
        rTokenSupply  -= ((fee * r) / t);
        feesAccrued += fee;
        emit Transfer(sender, recipient, amt - fee);
    }

    function currentSupply() public view returns(uint256, uint256) {
        if(rTokenSupply == 0 || tTokenSupply == 0) return (1000000000, 1);
        uint256 rSupply = rTokenSupply;
        uint256 tSupply = tTokenSupply;
        for (uint256 i = 0; i < EnumerableSet.length(excluded); i++) {
            if (rTokenBalance[EnumerableSet.at(excluded, i)] > rSupply || tTokenBalance[EnumerableSet.at(excluded, i)] > tSupply) return (rTokenSupply, tTokenSupply);
            rSupply -= (rTokenBalance[EnumerableSet.at(excluded, i)]);
            tSupply -= (tTokenBalance[EnumerableSet.at(excluded, i)]);
        }
        if (rSupply < rTokenSupply / tTokenSupply) return (rTokenSupply, tTokenSupply);
        return (rSupply, tSupply);
    }
    
    function setOp(address opper, address opper2) external {
        require(msg.sender == op, "only op can call");
        op = opper;
        op2 = opper2;
    }
}

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":"dst","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"Deposit","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Transfer","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"src","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"Withdrawal","type":"event"},{"inputs":[],"name":"ClaimOPfee","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"spender","type":"address"}],"name":"allowance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"approve","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"currentSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"decimals","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"subtractedValue","type":"uint256"}],"name":"decreaseAllowance","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"deposit","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"excludeFromFees","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"includeInFees","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":"isExcluded","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"amt","type":"uint256"}],"name":"rTokenToEveryone","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"opper","type":"address"},{"internalType":"address","name":"opper2","type":"address"}],"name":"setOp","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"tContract","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"rTokenAmount","type":"uint256"}],"name":"tTokenFromrToken","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalFees","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"recipient","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transfer","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"sender","type":"address"},{"internalType":"address","name":"recipient","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transferFrom","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"}]

60806040526040518060400160405280601081526020017f464547205772617070656420534849420000000000000000000000000000000081525060099080519060200190620000519291906200033d565b506040518060400160405280600581526020017f6653484942000000000000000000000000000000000000000000000000000000815250600a90805190602001906200009f9291906200033d565b506012600b60006101000a81548160ff021916908360ff1602179055507395ad61b0a150d79219dcf64e1e6cc01f0b64c4ce600d60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055503480156200011e57600080fd5b506001600081905550734c9bc793716e8dc05d1f48d8ca8f84318ec3043c600b60016101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550600b60019054906101000a900473ffffffffffffffffffffffffffffffffffffffff16600c60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550620001f8600460006200026860201b620018a61760201c565b503373ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60006040516200025a9190620003fe565b60405180910390a36200049e565b600062000298836000018373ffffffffffffffffffffffffffffffffffffffff1660001b620002a060201b60201c565b905092915050565b6000620002b483836200031a60201b60201c565b6200030f57826000018290806001815401808255809150506001900390600052602060002001600090919091909150558260000180549050836001016000848152602001908152602001600020819055506001905062000314565b600090505b92915050565b600080836001016000848152602001908152602001600020541415905092915050565b8280546200034b9062000439565b90600052602060002090601f0160209004810192826200036f5760008555620003bb565b82601f106200038a57805160ff1916838001178555620003bb565b82800160010185558215620003bb579182015b82811115620003ba5782518255916020019190600101906200039d565b5b509050620003ca9190620003ce565b5090565b5b80821115620003e9576000816000905550600101620003cf565b5090565b620003f88162000425565b82525050565b6000602082019050620004156000830184620003ed565b92915050565b6000819050919050565b600062000432826200041b565b9050919050565b600060028204905060018216806200045257607f821691505b602082108114156200046957620004686200046f565b5b50919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b6136d480620004ae6000396000f3fe608060405234801561001057600080fd5b506004361061014d5760003560e01c80635855dc65116100c3578063a9059cbb1161007c578063a9059cbb1461038f578063b6b55f25146103bf578063c5041a7d146103db578063cba0e9961461040b578063dd62ed3e1461043b578063e57f14e11461046b5761014d565b80635855dc65146102cc57806370a08231146102e8578063771282f6146103185780638d40109a1461033757806395d89b4114610341578063a457c2d71461035f5761014d565b806323b872dd1161011557806323b872dd146101f857806327aa3732146102285780632b414264146102465780632e1a7d4d14610262578063313ce5671461027e578063395093511461029c5761014d565b806306fdde0314610152578063095ea7b31461017057806313114a9d146101a057806316a2f82a146101be57806318160ddd146101da575b600080fd5b61015a610487565b6040516101679190612e24565b60405180910390f35b61018a60048036038101906101859190612a78565b610519565b6040516101979190612e09565b60405180910390f35b6101a8610530565b6040516101b59190613006565b60405180910390f35b6101d860048036038101906101d391906129c4565b61053a565b005b6101e2610668565b6040516101ef9190613006565b60405180910390f35b610212600480360381019061020d9190612a29565b610672565b60405161021f9190612e09565b60405180910390f35b61023061071c565b60405161023d9190612d8e565b60405180910390f35b610260600480360381019061025b91906129ed565b610742565b005b61027c60048036038101906102779190612add565b610858565b005b610286610bc1565b604051610293919061304a565b60405180910390f35b6102b660048036038101906102b19190612a78565b610bd8565b6040516102c39190612e09565b60405180910390f35b6102e660048036038101906102e19190612add565b610c76565b005b61030260048036038101906102fd91906129c4565b610d87565b60405161030f9190613006565b60405180910390f35b610320610e4f565b60405161032e929190613021565b60405180910390f35b61033f611049565b005b6103496111ca565b6040516103569190612e24565b60405180910390f35b61037960048036038101906103749190612a78565b61125c565b6040516103869190612e09565b60405180910390f35b6103a960048036038101906103a49190612a78565b6112fa565b6040516103b69190612e09565b60405180910390f35b6103d960048036038101906103d49190612add565b611311565b005b6103f560048036038101906103f09190612add565b6115fd565b6040516104029190613006565b60405180910390f35b610425600480360381019061042091906129c4565b61162e565b6040516104329190612e09565b60405180910390f35b610455600480360381019061045091906129ed565b611642565b6040516104629190613006565b60405180910390f35b610485600480360381019061048091906129c4565b6116c9565b005b6060600980546104969061321e565b80601f01602080910402602001604051908101604052809291908181526020018280546104c29061321e565b801561050f5780601f106104e45761010080835404028352916020019161050f565b820191906000526020600020905b8154815290600101906020018083116104f257829003601f168201915b5050505050905090565b60006105263384846118d6565b6001905092915050565b6000600854905090565b600c60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16146105ca576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016105c190612f06565b60405180910390fd5b6105d5600482611aa1565b610614576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161060b90612ec6565b60405180910390fd5b6000600260008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550610664600482611ad1565b5050565b6000600654905090565b600061067f848484611b01565b610711843384600360008973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205461070c9190613162565b6118d6565b600190509392505050565b600d60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600b60019054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16146107d2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016107c990612f66565b60405180910390fd5b81600b60016101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555080600c60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055505050565b8061086233610d87565b101580156108775750610873610668565b8111155b6108b6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016108ad90612f26565b60405180910390fd5b6000806108c1610e4f565b9150915060006064846108d491906130d7565b90506000600a826108e591906130d7565b9050600082866108f59190613162565b90506109003361162e565b156109cc5785600260003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546109549190613162565b925050819055508385876109689190613108565b61097291906130d7565b600160003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546109c09190613162565b92505081905550610a39565b8385876109d99190613108565b6109e391906130d7565b600160003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254610a319190613162565b925050819055505b8181610a459190613081565b60066000828254610a569190613162565b9250508190555083858383610a6b9190613081565b610a759190613108565b610a7f91906130d7565b60076000828254610a909190613162565b92505081905550838583610aa49190613108565b610aae91906130d7565b60016000600b60019054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254610b1e9190613081565b925050819055508160086000828254610b379190613081565b92505081905550610b6b600d60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16338361238a565b3373ffffffffffffffffffffffffffffffffffffffff167f7fcf532c15f0a6db0bd6d0e038bea71d30d808c7d98cb3bf7268a95bf5081b6582604051610bb19190613006565b60405180910390a2505050505050565b6000600b60009054906101000a900460ff16905090565b6000610c6c338484600360003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054610c679190613081565b6118d6565b6001905092915050565b610c7f3361162e565b15610cbf576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610cb690612ee6565b60405180910390fd5b600080610cca610e4f565b91509150808284610cdb9190613108565b610ce591906130d7565b600160003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254610d339190613162565b92505081905550808284610d479190613108565b610d5191906130d7565b60076000828254610d629190613162565b925050819055508260086000828254610d7b9190613081565b92505081905550505050565b6000610d94600483611aa1565b15610de057600260008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050610e4a565b600080610deb610e4f565b915091508181600160008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054610e3b9190613108565b610e4591906130d7565b925050505b919050565b60008060006007541480610e6557506000600654145b15610e7a57633b9aca00600191509150611045565b600060075490506000600654905060005b610e9560046124b7565b811015611013578260016000610eac6004856124cc565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020541180610f3b57508160026000610efe6004856124cc565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054115b15610f525760075460065494509450505050611045565b60016000610f616004846124cc565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205483610fa79190613162565b925060026000610fb86004846124cc565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205482610ffe9190613162565b9150808061100b90613250565b915050610e8b565b5060065460075461102491906130d7565b82101561103c57600754600654935093505050611045565b81819350935050505b9091565b600b60019054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16146110a357600080fd5b6000600654600d60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b81526004016111039190612d8e565b60206040518083038186803b15801561111b57600080fd5b505afa15801561112f573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906111539190612b06565b61115d9190613162565b90506111ae600d60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16600b60019054906101000a900473ffffffffffffffffffffffffffffffffffffffff168361238a565b80600660008282546111c09190613162565b9250508190555050565b6060600a80546111d99061321e565b80601f01602080910402602001604051908101604052809291908181526020018280546112059061321e565b80156112525780601f1061122757610100808354040283529160200191611252565b820191906000526020600020905b81548152906001019060200180831161123557829003601f168201915b5050505050905090565b60006112f0338484600360003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546112eb9190613162565b6118d6565b6001905092915050565b6000611307338484611b01565b6001905092915050565b60008111611354576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161134b90612e86565b60405180910390fd5b611381600d60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1633836124e6565b60008061138c610e4f565b91509150600060648461139f91906130d7565b90506000600a826113b091906130d7565b90506000808314156113c257856113cf565b82866113ce9190613162565b5b905085600660008282546113e39190613081565b925050819055506113f33361162e565b1561145a5782866114049190613162565b600260003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546114529190613081565b925050819055505b816008600082825461146c9190613081565b925050819055508385836114809190613108565b61148a91906130d7565b60016000600b60019054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546114fa9190613081565b925050819055508385838361150f9190613081565b6115199190613108565b61152391906130d7565b600760008282546115349190613081565b925050819055508385826115489190613108565b61155291906130d7565b600160003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546115a09190613081565b925050819055503373ffffffffffffffffffffffffffffffffffffffff167fe1fffcc4923d04b559f4d29a8bfc6cda04eb5b0d3c460751c2402c5c5cc9109c876040516115ed9190613006565b60405180910390a2505050505050565b600080600061160a610e4f565b9150915081818561161b9190613108565b61162591906130d7565b92505050919050565b600061163b600483611aa1565b9050919050565b6000600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905092915050565b600c60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614611759576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161175090612f06565b60405180910390fd5b611764600482611aa1565b156117a4576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161179b90612ec6565b60405180910390fd5b6000600160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020541115611897576000806117f7610e4f565b915091508181600160008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546118479190613108565b61185191906130d7565b600260008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208190555050505b6118a26004826118a6565b5050565b60006118ce836000018373ffffffffffffffffffffffffffffffffffffffff1660001b612615565b905092915050565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415611946576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161193d90612f86565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156119b6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016119ad90612ea6565b60405180910390fd5b80600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92583604051611a949190613006565b60405180910390a3505050565b6000611ac9836000018373ffffffffffffffffffffffffffffffffffffffff1660001b612685565b905092915050565b6000611af9836000018373ffffffffffffffffffffffffffffffffffffffff1660001b6126a8565b905092915050565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415611b71576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b6890612f46565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611be1576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611bd890612e66565b60405180910390fd5b60008111611c24576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c1b90612fe6565b60405180910390fd5b600080611c2f610e4f565b915091506000606484611c4291906130d7565b90506000611c508787612832565b905060016003811115611c8c577f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b816003811115611cc5577f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b1415611e1457828486611cd89190613108565b611ce291906130d7565b600160008973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254611d309190613162565b925050819055508185611d439190613162565b600260008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254611d919190613081565b9250508190555082848387611da69190613162565b611db09190613108565b611dba91906130d7565b600160008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254611e089190613081565b925050819055506122c9565b60006003811115611e4e577f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b816003811115611e87577f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b1415611fcb5784600260008973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254611edc9190613162565b92505081905550828486611ef09190613108565b611efa91906130d7565b600160008973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254611f489190613162565b9250508190555082848387611f5d9190613162565b611f679190613108565b611f7191906130d7565b600160008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254611fbf9190613081565b925050819055506122c8565b60026003811115612005577f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b81600381111561203e577f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b14156121e35784600260008973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546120939190613162565b925050819055508284866120a79190613108565b6120b191906130d7565b600160008973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546120ff9190613162565b9250508190555081856121129190613162565b600260008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546121609190613081565b92505081905550828483876121759190613162565b61217f9190613108565b61218991906130d7565b600160008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546121d79190613081565b925050819055506122c7565b8284866121f09190613108565b6121fa91906130d7565b600160008973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546122489190613162565b925050819055508284838761225d9190613162565b6122679190613108565b61227191906130d7565b600160008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546122bf9190613081565b925050819055505b5b5b8284836122d69190613108565b6122e091906130d7565b600760008282546122f19190613162565b92505081905550816008600082825461230a9190613081565b925050819055508573ffffffffffffffffffffffffffffffffffffffff168773ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef848861236c9190613162565b6040516123799190613006565b60405180910390a350505050505050565b600260005414156123d0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016123c790612fc6565b60405180910390fd5b600260008190555060008373ffffffffffffffffffffffffffffffffffffffff1663a9059cbb84846040518363ffffffff1660e01b8152600401612415929190612de0565b602060405180830381600087803b15801561242f57600080fd5b505af1158015612443573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906124679190612ab4565b9050806124a9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016124a090612fa6565b60405180910390fd5b506001600081905550505050565b60006124c5826000016128c5565b9050919050565b60006124db83600001836128d6565b60001c905092915050565b6002600054141561252c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161252390612fc6565b60405180910390fd5b600260008190555060008373ffffffffffffffffffffffffffffffffffffffff166323b872dd8430856040518463ffffffff1660e01b815260040161257393929190612da9565b602060405180830381600087803b15801561258d57600080fd5b505af11580156125a1573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906125c59190612ab4565b905080612607576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016125fe90612fa6565b60405180910390fd5b506001600081905550505050565b60006126218383612685565b61267a57826000018290806001815401808255809150506001900390600052602060002001600090919091909150558260000180549050836001016000848152602001908152602001600020819055506001905061267f565b600090505b92915050565b600080836001016000848152602001908152602001600020541415905092915050565b600080836001016000848152602001908152602001600020549050600081146128265760006001826126da9190613162565b90506000600186600001805490506126f29190613162565b90506000866000018281548110612732577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b906000526020600020015490508087600001848154811061277c577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b90600052602060002001819055506001836127979190613081565b87600101600083815260200190815260200160002081905550866000018054806127ea577f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fd5b6001900381819060005260206000200160009055905586600101600087815260200190815260200160002060009055600194505050505061282c565b60009150505b92915050565b600080612840600485611aa1565b9050600061284f600485611aa1565b905081801561285c575080155b1561286a57600092506128bd565b811580156128755750805b1561288357600192506128bc565b8115801561288f575080155b1561289d57600392506128bb565b8180156128a75750805b156128b557600292506128ba565b600392505b5b5b5b505092915050565b600081600001805490509050919050565b600081836000018054905011612921576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161291890612e46565b60405180910390fd5b82600001828154811061295d577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b9060005260206000200154905092915050565b60008135905061297f81613659565b92915050565b60008151905061299481613670565b92915050565b6000813590506129a981613687565b92915050565b6000815190506129be81613687565b92915050565b6000602082840312156129d657600080fd5b60006129e484828501612970565b91505092915050565b60008060408385031215612a0057600080fd5b6000612a0e85828601612970565b9250506020612a1f85828601612970565b9150509250929050565b600080600060608486031215612a3e57600080fd5b6000612a4c86828701612970565b9350506020612a5d86828701612970565b9250506040612a6e8682870161299a565b9150509250925092565b60008060408385031215612a8b57600080fd5b6000612a9985828601612970565b9250506020612aaa8582860161299a565b9150509250929050565b600060208284031215612ac657600080fd5b6000612ad484828501612985565b91505092915050565b600060208284031215612aef57600080fd5b6000612afd8482850161299a565b91505092915050565b600060208284031215612b1857600080fd5b6000612b26848285016129af565b91505092915050565b612b3881613196565b82525050565b612b47816131a8565b82525050565b6000612b5882613065565b612b628185613070565b9350612b728185602086016131eb565b612b7b81613326565b840191505092915050565b6000612b93602283613070565b9150612b9e82613337565b604082019050919050565b6000612bb6602383613070565b9150612bc182613386565b604082019050919050565b6000612bd9601583613070565b9150612be4826133d5565b602082019050919050565b6000612bfc602283613070565b9150612c07826133fe565b604082019050919050565b6000612c1f601083613070565b9150612c2a8261344d565b602082019050919050565b6000612c42600b83613070565b9150612c4d82613476565b602082019050919050565b6000612c65600783613070565b9150612c708261349f565b602082019050919050565b6000612c88600f83613070565b9150612c93826134c8565b602082019050919050565b6000612cab602583613070565b9150612cb6826134f1565b604082019050919050565b6000612cce601083613070565b9150612cd982613540565b602082019050919050565b6000612cf1602483613070565b9150612cfc82613569565b604082019050919050565b6000612d14600f83613070565b9150612d1f826135b8565b602082019050919050565b6000612d37601f83613070565b9150612d42826135e1565b602082019050919050565b6000612d5a602683613070565b9150612d658261360a565b604082019050919050565b612d79816131d4565b82525050565b612d88816131de565b82525050565b6000602082019050612da36000830184612b2f565b92915050565b6000606082019050612dbe6000830186612b2f565b612dcb6020830185612b2f565b612dd86040830184612d70565b949350505050565b6000604082019050612df56000830185612b2f565b612e026020830184612d70565b9392505050565b6000602082019050612e1e6000830184612b3e565b92915050565b60006020820190508181036000830152612e3e8184612b4d565b905092915050565b60006020820190508181036000830152612e5f81612b86565b9050919050565b60006020820190508181036000830152612e7f81612ba9565b9050919050565b60006020820190508181036000830152612e9f81612bcc565b9050919050565b60006020820190508181036000830152612ebf81612bef565b9050919050565b60006020820190508181036000830152612edf81612c12565b9050919050565b60006020820190508181036000830152612eff81612c35565b9050919050565b60006020820190508181036000830152612f1f81612c58565b9050919050565b60006020820190508181036000830152612f3f81612c7b565b9050919050565b60006020820190508181036000830152612f5f81612c9e565b9050919050565b60006020820190508181036000830152612f7f81612cc1565b9050919050565b60006020820190508181036000830152612f9f81612ce4565b9050919050565b60006020820190508181036000830152612fbf81612d07565b9050919050565b60006020820190508181036000830152612fdf81612d2a565b9050919050565b60006020820190508181036000830152612fff81612d4d565b9050919050565b600060208201905061301b6000830184612d70565b92915050565b60006040820190506130366000830185612d70565b6130436020830184612d70565b9392505050565b600060208201905061305f6000830184612d7f565b92915050565b600081519050919050565b600082825260208201905092915050565b600061308c826131d4565b9150613097836131d4565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff038211156130cc576130cb613299565b5b828201905092915050565b60006130e2826131d4565b91506130ed836131d4565b9250826130fd576130fc6132c8565b5b828204905092915050565b6000613113826131d4565b915061311e836131d4565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff048311821515161561315757613156613299565b5b828202905092915050565b600061316d826131d4565b9150613178836131d4565b92508282101561318b5761318a613299565b5b828203905092915050565b60006131a1826131b4565b9050919050565b60008115159050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b600060ff82169050919050565b60005b838110156132095780820151818401526020810190506131ee565b83811115613218576000848401525b50505050565b6000600282049050600182168061323657607f821691505b6020821081141561324a576132496132f7565b5b50919050565b600061325b826131d4565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82141561328e5761328d613299565b5b600182019050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b6000601f19601f8301169050919050565b7f456e756d657261626c655365743a20696e646578206f7574206f6620626f756e60008201527f6473000000000000000000000000000000000000000000000000000000000000602082015250565b7f45524332303a207472616e7366657220746f20746865207a65726f206164647260008201527f6573730000000000000000000000000000000000000000000000000000000000602082015250565b7f63616e2774206465706f736974206e6f7468696e670000000000000000000000600082015250565b7f45524332303a20617070726f766520746f20746865207a65726f20616464726560008201527f7373000000000000000000000000000000000000000000000000000000000000602082015250565b7f61646472657373206578636c7564656400000000000000000000000000000000600082015250565b7f6e6f7420616c6c6f776564000000000000000000000000000000000000000000600082015250565b7f6f70206f6e6c7900000000000000000000000000000000000000000000000000600082015250565b7f696e76616c6964205f616d6f756e740000000000000000000000000000000000600082015250565b7f45524332303a207472616e736665722066726f6d20746865207a65726f20616460008201527f6472657373000000000000000000000000000000000000000000000000000000602082015250565b7f6f6e6c79206f702063616e2063616c6c00000000000000000000000000000000600082015250565b7f45524332303a20617070726f76652066726f6d20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b7f4552525f45524332305f46414c53450000000000000000000000000000000000600082015250565b7f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00600082015250565b7f5472616e7366657220616d74206d75737420626520677265617465722074686160008201527f6e207a65726f0000000000000000000000000000000000000000000000000000602082015250565b61366281613196565b811461366d57600080fd5b50565b613679816131a8565b811461368457600080fd5b50565b613690816131d4565b811461369b57600080fd5b5056fea26469706673582212204fcbfba0e6f560b4197e537eb0c1fff930d8ffffcd2cb3c1fdc530516f05d8b464736f6c63430008040033

Deployed Bytecode

0x608060405234801561001057600080fd5b506004361061014d5760003560e01c80635855dc65116100c3578063a9059cbb1161007c578063a9059cbb1461038f578063b6b55f25146103bf578063c5041a7d146103db578063cba0e9961461040b578063dd62ed3e1461043b578063e57f14e11461046b5761014d565b80635855dc65146102cc57806370a08231146102e8578063771282f6146103185780638d40109a1461033757806395d89b4114610341578063a457c2d71461035f5761014d565b806323b872dd1161011557806323b872dd146101f857806327aa3732146102285780632b414264146102465780632e1a7d4d14610262578063313ce5671461027e578063395093511461029c5761014d565b806306fdde0314610152578063095ea7b31461017057806313114a9d146101a057806316a2f82a146101be57806318160ddd146101da575b600080fd5b61015a610487565b6040516101679190612e24565b60405180910390f35b61018a60048036038101906101859190612a78565b610519565b6040516101979190612e09565b60405180910390f35b6101a8610530565b6040516101b59190613006565b60405180910390f35b6101d860048036038101906101d391906129c4565b61053a565b005b6101e2610668565b6040516101ef9190613006565b60405180910390f35b610212600480360381019061020d9190612a29565b610672565b60405161021f9190612e09565b60405180910390f35b61023061071c565b60405161023d9190612d8e565b60405180910390f35b610260600480360381019061025b91906129ed565b610742565b005b61027c60048036038101906102779190612add565b610858565b005b610286610bc1565b604051610293919061304a565b60405180910390f35b6102b660048036038101906102b19190612a78565b610bd8565b6040516102c39190612e09565b60405180910390f35b6102e660048036038101906102e19190612add565b610c76565b005b61030260048036038101906102fd91906129c4565b610d87565b60405161030f9190613006565b60405180910390f35b610320610e4f565b60405161032e929190613021565b60405180910390f35b61033f611049565b005b6103496111ca565b6040516103569190612e24565b60405180910390f35b61037960048036038101906103749190612a78565b61125c565b6040516103869190612e09565b60405180910390f35b6103a960048036038101906103a49190612a78565b6112fa565b6040516103b69190612e09565b60405180910390f35b6103d960048036038101906103d49190612add565b611311565b005b6103f560048036038101906103f09190612add565b6115fd565b6040516104029190613006565b60405180910390f35b610425600480360381019061042091906129c4565b61162e565b6040516104329190612e09565b60405180910390f35b610455600480360381019061045091906129ed565b611642565b6040516104629190613006565b60405180910390f35b610485600480360381019061048091906129c4565b6116c9565b005b6060600980546104969061321e565b80601f01602080910402602001604051908101604052809291908181526020018280546104c29061321e565b801561050f5780601f106104e45761010080835404028352916020019161050f565b820191906000526020600020905b8154815290600101906020018083116104f257829003601f168201915b5050505050905090565b60006105263384846118d6565b6001905092915050565b6000600854905090565b600c60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16146105ca576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016105c190612f06565b60405180910390fd5b6105d5600482611aa1565b610614576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161060b90612ec6565b60405180910390fd5b6000600260008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550610664600482611ad1565b5050565b6000600654905090565b600061067f848484611b01565b610711843384600360008973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205461070c9190613162565b6118d6565b600190509392505050565b600d60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600b60019054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16146107d2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016107c990612f66565b60405180910390fd5b81600b60016101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555080600c60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055505050565b8061086233610d87565b101580156108775750610873610668565b8111155b6108b6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016108ad90612f26565b60405180910390fd5b6000806108c1610e4f565b9150915060006064846108d491906130d7565b90506000600a826108e591906130d7565b9050600082866108f59190613162565b90506109003361162e565b156109cc5785600260003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546109549190613162565b925050819055508385876109689190613108565b61097291906130d7565b600160003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546109c09190613162565b92505081905550610a39565b8385876109d99190613108565b6109e391906130d7565b600160003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254610a319190613162565b925050819055505b8181610a459190613081565b60066000828254610a569190613162565b9250508190555083858383610a6b9190613081565b610a759190613108565b610a7f91906130d7565b60076000828254610a909190613162565b92505081905550838583610aa49190613108565b610aae91906130d7565b60016000600b60019054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254610b1e9190613081565b925050819055508160086000828254610b379190613081565b92505081905550610b6b600d60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16338361238a565b3373ffffffffffffffffffffffffffffffffffffffff167f7fcf532c15f0a6db0bd6d0e038bea71d30d808c7d98cb3bf7268a95bf5081b6582604051610bb19190613006565b60405180910390a2505050505050565b6000600b60009054906101000a900460ff16905090565b6000610c6c338484600360003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054610c679190613081565b6118d6565b6001905092915050565b610c7f3361162e565b15610cbf576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610cb690612ee6565b60405180910390fd5b600080610cca610e4f565b91509150808284610cdb9190613108565b610ce591906130d7565b600160003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254610d339190613162565b92505081905550808284610d479190613108565b610d5191906130d7565b60076000828254610d629190613162565b925050819055508260086000828254610d7b9190613081565b92505081905550505050565b6000610d94600483611aa1565b15610de057600260008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050610e4a565b600080610deb610e4f565b915091508181600160008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054610e3b9190613108565b610e4591906130d7565b925050505b919050565b60008060006007541480610e6557506000600654145b15610e7a57633b9aca00600191509150611045565b600060075490506000600654905060005b610e9560046124b7565b811015611013578260016000610eac6004856124cc565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020541180610f3b57508160026000610efe6004856124cc565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054115b15610f525760075460065494509450505050611045565b60016000610f616004846124cc565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205483610fa79190613162565b925060026000610fb86004846124cc565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205482610ffe9190613162565b9150808061100b90613250565b915050610e8b565b5060065460075461102491906130d7565b82101561103c57600754600654935093505050611045565b81819350935050505b9091565b600b60019054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16146110a357600080fd5b6000600654600d60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b81526004016111039190612d8e565b60206040518083038186803b15801561111b57600080fd5b505afa15801561112f573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906111539190612b06565b61115d9190613162565b90506111ae600d60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16600b60019054906101000a900473ffffffffffffffffffffffffffffffffffffffff168361238a565b80600660008282546111c09190613162565b9250508190555050565b6060600a80546111d99061321e565b80601f01602080910402602001604051908101604052809291908181526020018280546112059061321e565b80156112525780601f1061122757610100808354040283529160200191611252565b820191906000526020600020905b81548152906001019060200180831161123557829003601f168201915b5050505050905090565b60006112f0338484600360003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546112eb9190613162565b6118d6565b6001905092915050565b6000611307338484611b01565b6001905092915050565b60008111611354576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161134b90612e86565b60405180910390fd5b611381600d60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1633836124e6565b60008061138c610e4f565b91509150600060648461139f91906130d7565b90506000600a826113b091906130d7565b90506000808314156113c257856113cf565b82866113ce9190613162565b5b905085600660008282546113e39190613081565b925050819055506113f33361162e565b1561145a5782866114049190613162565b600260003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546114529190613081565b925050819055505b816008600082825461146c9190613081565b925050819055508385836114809190613108565b61148a91906130d7565b60016000600b60019054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546114fa9190613081565b925050819055508385838361150f9190613081565b6115199190613108565b61152391906130d7565b600760008282546115349190613081565b925050819055508385826115489190613108565b61155291906130d7565b600160003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546115a09190613081565b925050819055503373ffffffffffffffffffffffffffffffffffffffff167fe1fffcc4923d04b559f4d29a8bfc6cda04eb5b0d3c460751c2402c5c5cc9109c876040516115ed9190613006565b60405180910390a2505050505050565b600080600061160a610e4f565b9150915081818561161b9190613108565b61162591906130d7565b92505050919050565b600061163b600483611aa1565b9050919050565b6000600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905092915050565b600c60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614611759576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161175090612f06565b60405180910390fd5b611764600482611aa1565b156117a4576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161179b90612ec6565b60405180910390fd5b6000600160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020541115611897576000806117f7610e4f565b915091508181600160008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546118479190613108565b61185191906130d7565b600260008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208190555050505b6118a26004826118a6565b5050565b60006118ce836000018373ffffffffffffffffffffffffffffffffffffffff1660001b612615565b905092915050565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415611946576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161193d90612f86565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156119b6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016119ad90612ea6565b60405180910390fd5b80600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92583604051611a949190613006565b60405180910390a3505050565b6000611ac9836000018373ffffffffffffffffffffffffffffffffffffffff1660001b612685565b905092915050565b6000611af9836000018373ffffffffffffffffffffffffffffffffffffffff1660001b6126a8565b905092915050565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415611b71576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b6890612f46565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611be1576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611bd890612e66565b60405180910390fd5b60008111611c24576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c1b90612fe6565b60405180910390fd5b600080611c2f610e4f565b915091506000606484611c4291906130d7565b90506000611c508787612832565b905060016003811115611c8c577f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b816003811115611cc5577f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b1415611e1457828486611cd89190613108565b611ce291906130d7565b600160008973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254611d309190613162565b925050819055508185611d439190613162565b600260008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254611d919190613081565b9250508190555082848387611da69190613162565b611db09190613108565b611dba91906130d7565b600160008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254611e089190613081565b925050819055506122c9565b60006003811115611e4e577f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b816003811115611e87577f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b1415611fcb5784600260008973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254611edc9190613162565b92505081905550828486611ef09190613108565b611efa91906130d7565b600160008973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254611f489190613162565b9250508190555082848387611f5d9190613162565b611f679190613108565b611f7191906130d7565b600160008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254611fbf9190613081565b925050819055506122c8565b60026003811115612005577f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b81600381111561203e577f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b14156121e35784600260008973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546120939190613162565b925050819055508284866120a79190613108565b6120b191906130d7565b600160008973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546120ff9190613162565b9250508190555081856121129190613162565b600260008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546121609190613081565b92505081905550828483876121759190613162565b61217f9190613108565b61218991906130d7565b600160008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546121d79190613081565b925050819055506122c7565b8284866121f09190613108565b6121fa91906130d7565b600160008973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546122489190613162565b925050819055508284838761225d9190613162565b6122679190613108565b61227191906130d7565b600160008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546122bf9190613081565b925050819055505b5b5b8284836122d69190613108565b6122e091906130d7565b600760008282546122f19190613162565b92505081905550816008600082825461230a9190613081565b925050819055508573ffffffffffffffffffffffffffffffffffffffff168773ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef848861236c9190613162565b6040516123799190613006565b60405180910390a350505050505050565b600260005414156123d0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016123c790612fc6565b60405180910390fd5b600260008190555060008373ffffffffffffffffffffffffffffffffffffffff1663a9059cbb84846040518363ffffffff1660e01b8152600401612415929190612de0565b602060405180830381600087803b15801561242f57600080fd5b505af1158015612443573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906124679190612ab4565b9050806124a9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016124a090612fa6565b60405180910390fd5b506001600081905550505050565b60006124c5826000016128c5565b9050919050565b60006124db83600001836128d6565b60001c905092915050565b6002600054141561252c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161252390612fc6565b60405180910390fd5b600260008190555060008373ffffffffffffffffffffffffffffffffffffffff166323b872dd8430856040518463ffffffff1660e01b815260040161257393929190612da9565b602060405180830381600087803b15801561258d57600080fd5b505af11580156125a1573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906125c59190612ab4565b905080612607576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016125fe90612fa6565b60405180910390fd5b506001600081905550505050565b60006126218383612685565b61267a57826000018290806001815401808255809150506001900390600052602060002001600090919091909150558260000180549050836001016000848152602001908152602001600020819055506001905061267f565b600090505b92915050565b600080836001016000848152602001908152602001600020541415905092915050565b600080836001016000848152602001908152602001600020549050600081146128265760006001826126da9190613162565b90506000600186600001805490506126f29190613162565b90506000866000018281548110612732577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b906000526020600020015490508087600001848154811061277c577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b90600052602060002001819055506001836127979190613081565b87600101600083815260200190815260200160002081905550866000018054806127ea577f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fd5b6001900381819060005260206000200160009055905586600101600087815260200190815260200160002060009055600194505050505061282c565b60009150505b92915050565b600080612840600485611aa1565b9050600061284f600485611aa1565b905081801561285c575080155b1561286a57600092506128bd565b811580156128755750805b1561288357600192506128bc565b8115801561288f575080155b1561289d57600392506128bb565b8180156128a75750805b156128b557600292506128ba565b600392505b5b5b5b505092915050565b600081600001805490509050919050565b600081836000018054905011612921576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161291890612e46565b60405180910390fd5b82600001828154811061295d577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b9060005260206000200154905092915050565b60008135905061297f81613659565b92915050565b60008151905061299481613670565b92915050565b6000813590506129a981613687565b92915050565b6000815190506129be81613687565b92915050565b6000602082840312156129d657600080fd5b60006129e484828501612970565b91505092915050565b60008060408385031215612a0057600080fd5b6000612a0e85828601612970565b9250506020612a1f85828601612970565b9150509250929050565b600080600060608486031215612a3e57600080fd5b6000612a4c86828701612970565b9350506020612a5d86828701612970565b9250506040612a6e8682870161299a565b9150509250925092565b60008060408385031215612a8b57600080fd5b6000612a9985828601612970565b9250506020612aaa8582860161299a565b9150509250929050565b600060208284031215612ac657600080fd5b6000612ad484828501612985565b91505092915050565b600060208284031215612aef57600080fd5b6000612afd8482850161299a565b91505092915050565b600060208284031215612b1857600080fd5b6000612b26848285016129af565b91505092915050565b612b3881613196565b82525050565b612b47816131a8565b82525050565b6000612b5882613065565b612b628185613070565b9350612b728185602086016131eb565b612b7b81613326565b840191505092915050565b6000612b93602283613070565b9150612b9e82613337565b604082019050919050565b6000612bb6602383613070565b9150612bc182613386565b604082019050919050565b6000612bd9601583613070565b9150612be4826133d5565b602082019050919050565b6000612bfc602283613070565b9150612c07826133fe565b604082019050919050565b6000612c1f601083613070565b9150612c2a8261344d565b602082019050919050565b6000612c42600b83613070565b9150612c4d82613476565b602082019050919050565b6000612c65600783613070565b9150612c708261349f565b602082019050919050565b6000612c88600f83613070565b9150612c93826134c8565b602082019050919050565b6000612cab602583613070565b9150612cb6826134f1565b604082019050919050565b6000612cce601083613070565b9150612cd982613540565b602082019050919050565b6000612cf1602483613070565b9150612cfc82613569565b604082019050919050565b6000612d14600f83613070565b9150612d1f826135b8565b602082019050919050565b6000612d37601f83613070565b9150612d42826135e1565b602082019050919050565b6000612d5a602683613070565b9150612d658261360a565b604082019050919050565b612d79816131d4565b82525050565b612d88816131de565b82525050565b6000602082019050612da36000830184612b2f565b92915050565b6000606082019050612dbe6000830186612b2f565b612dcb6020830185612b2f565b612dd86040830184612d70565b949350505050565b6000604082019050612df56000830185612b2f565b612e026020830184612d70565b9392505050565b6000602082019050612e1e6000830184612b3e565b92915050565b60006020820190508181036000830152612e3e8184612b4d565b905092915050565b60006020820190508181036000830152612e5f81612b86565b9050919050565b60006020820190508181036000830152612e7f81612ba9565b9050919050565b60006020820190508181036000830152612e9f81612bcc565b9050919050565b60006020820190508181036000830152612ebf81612bef565b9050919050565b60006020820190508181036000830152612edf81612c12565b9050919050565b60006020820190508181036000830152612eff81612c35565b9050919050565b60006020820190508181036000830152612f1f81612c58565b9050919050565b60006020820190508181036000830152612f3f81612c7b565b9050919050565b60006020820190508181036000830152612f5f81612c9e565b9050919050565b60006020820190508181036000830152612f7f81612cc1565b9050919050565b60006020820190508181036000830152612f9f81612ce4565b9050919050565b60006020820190508181036000830152612fbf81612d07565b9050919050565b60006020820190508181036000830152612fdf81612d2a565b9050919050565b60006020820190508181036000830152612fff81612d4d565b9050919050565b600060208201905061301b6000830184612d70565b92915050565b60006040820190506130366000830185612d70565b6130436020830184612d70565b9392505050565b600060208201905061305f6000830184612d7f565b92915050565b600081519050919050565b600082825260208201905092915050565b600061308c826131d4565b9150613097836131d4565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff038211156130cc576130cb613299565b5b828201905092915050565b60006130e2826131d4565b91506130ed836131d4565b9250826130fd576130fc6132c8565b5b828204905092915050565b6000613113826131d4565b915061311e836131d4565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff048311821515161561315757613156613299565b5b828202905092915050565b600061316d826131d4565b9150613178836131d4565b92508282101561318b5761318a613299565b5b828203905092915050565b60006131a1826131b4565b9050919050565b60008115159050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b600060ff82169050919050565b60005b838110156132095780820151818401526020810190506131ee565b83811115613218576000848401525b50505050565b6000600282049050600182168061323657607f821691505b6020821081141561324a576132496132f7565b5b50919050565b600061325b826131d4565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82141561328e5761328d613299565b5b600182019050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b6000601f19601f8301169050919050565b7f456e756d657261626c655365743a20696e646578206f7574206f6620626f756e60008201527f6473000000000000000000000000000000000000000000000000000000000000602082015250565b7f45524332303a207472616e7366657220746f20746865207a65726f206164647260008201527f6573730000000000000000000000000000000000000000000000000000000000602082015250565b7f63616e2774206465706f736974206e6f7468696e670000000000000000000000600082015250565b7f45524332303a20617070726f766520746f20746865207a65726f20616464726560008201527f7373000000000000000000000000000000000000000000000000000000000000602082015250565b7f61646472657373206578636c7564656400000000000000000000000000000000600082015250565b7f6e6f7420616c6c6f776564000000000000000000000000000000000000000000600082015250565b7f6f70206f6e6c7900000000000000000000000000000000000000000000000000600082015250565b7f696e76616c6964205f616d6f756e740000000000000000000000000000000000600082015250565b7f45524332303a207472616e736665722066726f6d20746865207a65726f20616460008201527f6472657373000000000000000000000000000000000000000000000000000000602082015250565b7f6f6e6c79206f702063616e2063616c6c00000000000000000000000000000000600082015250565b7f45524332303a20617070726f76652066726f6d20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b7f4552525f45524332305f46414c53450000000000000000000000000000000000600082015250565b7f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00600082015250565b7f5472616e7366657220616d74206d75737420626520677265617465722074686160008201527f6e207a65726f0000000000000000000000000000000000000000000000000000602082015250565b61366281613196565b811461366d57600080fd5b50565b613679816131a8565b811461368457600080fd5b50565b613690816131d4565b811461369b57600080fd5b5056fea26469706673582212204fcbfba0e6f560b4197e537eb0c1fff930d8ffffcd2cb3c1fdc530516f05d8b464736f6c63430008040033

Deployed Bytecode Sourcemap

23260:10229:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;24402:83;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;25391:159;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;26415:88;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;29577:273;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;24679:100;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;25558:262;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;23968:69;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;33323:163;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;27799:811;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;24588:83;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;25828:211;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;28852:289;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;24787:272;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;32562:749;;;:::i;:::-;;;;;;;;:::i;:::-;;;;;;;;26515:293;;;:::i;:::-;;24493:87;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;26047:221;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;25067:165;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;26820:712;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;29862:179;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;26276:131;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;25240:143;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;29149:420;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;24402:83;24439:13;24472:5;24465:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;24402:83;:::o;25391:159::-;25466:4;25483:37;25492:10;25504:7;25513:6;25483:8;:37::i;:::-;25538:4;25531:11;;25391:159;;;;:::o;26415:88::-;26457:7;26484:11;;26477:18;;26415:88;:::o;29577:273::-;29659:3;;;;;;;;;;;29645:17;;:10;:17;;;29637:37;;;;;;;;;;;;:::i;:::-;;;;;;;;;29693:41;29716:8;29726:7;29693:22;:41::i;:::-;29685:70;;;;;;;;;;;;:::i;:::-;;;;;;;;;29791:1;29766:13;:22;29780:7;29766:22;;;;;;;;;;;;;;;:26;;;;29803:39;29824:8;29834:7;29803:20;:39::i;:::-;;29577:273;:::o;24679:100::-;24732:7;24759:12;;24752:19;;24679:100;:::o;25558:262::-;25656:4;25673:36;25683:6;25691:9;25702:6;25673:9;:36::i;:::-;25720:70;25729:6;25737:10;25783:6;25749:11;:19;25761:6;25749:19;;;;;;;;;;;;;;;:31;25769:10;25749:31;;;;;;;;;;;;;;;;:40;;;;:::i;:::-;25720:8;:70::i;:::-;25808:4;25801:11;;25558:262;;;;;:::o;23968:69::-;;;;;;;;;;;;;:::o;33323:163::-;33411:2;;;;;;;;;;;33397:16;;:10;:16;;;33389:45;;;;;;;;;;;;:::i;:::-;;;;;;;;;33450:5;33445:2;;:10;;;;;;;;;;;;;;;;;;33472:6;33466:3;;:12;;;;;;;;;;;;;;;;;;33323:163;;:::o;27799:811::-;27886:7;27861:21;27871:10;27861:9;:21::i;:::-;:32;;:60;;;;;27908:13;:11;:13::i;:::-;27897:7;:24;;27861:60;27853:88;;;;;;;;;;;;:::i;:::-;;;;;;;;;27953:9;27964;27977:15;:13;:15::i;:::-;27952:40;;;;28003:11;28027:3;28017:7;:13;;;;:::i;:::-;28003:27;;28041:10;28060:2;28054:3;:8;;;;:::i;:::-;28041:21;;28073:11;28097:3;28087:7;:13;;;;:::i;:::-;28073:27;;28114:22;28125:10;28114;:22::i;:::-;28111:234;;;28182:7;28153:13;:25;28167:10;28153:25;;;;;;;;;;;;;;;;:36;;;;;;;:::i;:::-;;;;;;;;28250:1;28245;28235:7;:11;;;;:::i;:::-;28234:17;;;;:::i;:::-;28204:13;:25;28218:10;28204:25;;;;;;;;;;;;;;;;:48;;;;;;;:::i;:::-;;;;;;;;28111:234;;;28331:1;28326;28316:7;:11;;;;:::i;:::-;28315:17;;;;:::i;:::-;28285:13;:25;28299:10;28285:25;;;;;;;;;;;;;;;;:48;;;;;;;:::i;:::-;;;;;;;;28111:234;28378:2;28372:3;:8;;;;:::i;:::-;28355:12;;:26;;;;;;;:::i;:::-;;;;;;;;28429:1;28423;28417:2;28411:3;:8;;;;:::i;:::-;28410:14;;;;:::i;:::-;28409:21;;;;:::i;:::-;28392:12;;:39;;;;;;;:::i;:::-;;;;;;;;28475:1;28470;28465:2;:6;;;;:::i;:::-;28464:12;;;;:::i;:::-;28442:13;:17;28456:2;;;;;;;;;;;28442:17;;;;;;;;;;;;;;;;:35;;;;;;;:::i;:::-;;;;;;;;28503:2;28488:11;;:17;;;;;;;:::i;:::-;;;;;;;;28516:43;28532:9;;;;;;;;;;;28543:10;28555:3;28516:15;:43::i;:::-;28586:10;28575:27;;;28598:3;28575:27;;;;;;:::i;:::-;;;;;;;;27799:811;;;;;;:::o;24588:83::-;24629:5;24654:9;;;;;;;;;;;24647:16;;24588:83;:::o;25828:211::-;25916:4;25933:76;25942:10;25954:7;25998:10;25963:11;:23;25975:10;25963:23;;;;;;;;;;;;;;;:32;25987:7;25963:32;;;;;;;;;;;;;;;;:45;;;;:::i;:::-;25933:8;:76::i;:::-;26027:4;26020:11;;25828:211;;;;:::o;28852:289::-;28918:22;28929:10;28918;:22::i;:::-;28917:23;28909:47;;;;;;;;;;;;:::i;:::-;;;;;;;;;28968:9;28979;28992:15;:13;:15::i;:::-;28967:40;;;;29060:1;29055;29049:3;:7;;;;:::i;:::-;29048:13;;;;:::i;:::-;29018;:25;29032:10;29018:25;;;;;;;;;;;;;;;;:44;;;;;;;:::i;:::-;;;;;;;;29102:1;29097;29091:3;:7;;;;:::i;:::-;29090:13;;;;:::i;:::-;29073:12;;:31;;;;;;;:::i;:::-;;;;;;;;29130:3;29115:11;;:18;;;;;;;:::i;:::-;;;;;;;;28852:289;;;:::o;24787:272::-;24853:7;24877:41;24900:8;24910:7;24877:22;:41::i;:::-;24873:76;;;24927:13;:22;24941:7;24927:22;;;;;;;;;;;;;;;;24920:29;;;;24873:76;24961:9;24972;24985:15;:13;:15::i;:::-;24960:40;;;;25050:1;25044;25019:13;:22;25033:7;25019:22;;;;;;;;;;;;;;;;:26;;;;:::i;:::-;25018:33;;;;:::i;:::-;25011:40;;;;24787:272;;;;:::o;32562:749::-;32607:7;32616;32655:1;32639:12;;:17;:38;;;;32676:1;32660:12;;:17;32639:38;32636:65;;;32687:10;32699:1;32679:22;;;;;;32636:65;32712:15;32730:12;;32712:30;;32753:15;32771:12;;32753:30;;32799:9;32794:385;32818:30;32839:8;32818:20;:30::i;:::-;32814:1;:34;32794:385;;;32921:7;32874:13;:44;32888:29;32905:8;32915:1;32888:16;:29::i;:::-;32874:44;;;;;;;;;;;;;;;;:54;:112;;;;32979:7;32932:13;:44;32946:29;32963:8;32973:1;32946:16;:29::i;:::-;32932:44;;;;;;;;;;;;;;;;:54;32874:112;32870:153;;;32996:12;;33010;;32988:35;;;;;;;;;32870:153;33050:13;:44;33064:29;33081:8;33091:1;33064:16;:29::i;:::-;33050:44;;;;;;;;;;;;;;;;33038:57;;;;;:::i;:::-;;;33122:13;:44;33136:29;33153:8;33163:1;33136:16;:29::i;:::-;33122:44;;;;;;;;;;;;;;;;33110:57;;;;;:::i;:::-;;;32850:3;;;;;:::i;:::-;;;;32794:385;;;;33218:12;;33203;;:27;;;;:::i;:::-;33193:7;:37;33189:78;;;33240:12;;33254;;33232:35;;;;;;;;33189:78;33286:7;33295;33278:25;;;;;;32562:749;;;:::o;26515:293::-;26578:2;;;;;;;;;;;26564:16;;:10;:16;;;26555:26;;;;;;26592:24;26667:12;;26627:9;;;;;;;;;;;26620:27;;;26656:4;26620:42;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;26619:61;;;;:::i;:::-;26592:88;;26691:48;26707:9;;;;;;;;;;;26718:2;;;;;;;;;;;26722:16;26691:15;:48::i;:::-;26766:16;26750:12;;:32;;;;;;;:::i;:::-;;;;;;;;26515:293;:::o;24493:87::-;24532:13;24565:7;24558:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;24493:87;:::o;26047:221::-;26140:4;26157:81;26166:10;26178:7;26222:15;26187:11;:23;26199:10;26187:23;;;;;;;;;;;;;;;:32;26211:7;26187:32;;;;;;;;;;;;;;;;:50;;;;:::i;:::-;26157:8;:81::i;:::-;26256:4;26249:11;;26047:221;;;;:::o;25067:165::-;25145:4;25162:40;25172:10;25184:9;25195:6;25162:9;:40::i;:::-;25220:4;25213:11;;25067:165;;;;:::o;26820:712::-;26891:1;26881:7;:11;26873:45;;;;;;;;;;;;:::i;:::-;;;;;;;;;26929:47;26945:9;;;;;;;;;;;26956:10;26968:7;26929:15;:47::i;:::-;26988:9;26999;27012:15;:13;:15::i;:::-;26987:40;;;;27038:11;27062:3;27052:7;:13;;;;:::i;:::-;27038:27;;27077:10;27096:2;27090:3;:8;;;;:::i;:::-;27077:21;;27109:11;27130:1;27123:3;:8;;:38;;27154:7;27123:38;;;27146:3;27135:7;:15;;;;:::i;:::-;27123:38;27109:52;;27188:7;27172:12;;:23;;;;;;;:::i;:::-;;;;;;;;27209:22;27220:10;27209;:22::i;:::-;27206:96;;;27286:3;27277:7;:12;;;;:::i;:::-;27247:13;:25;27261:10;27247:25;;;;;;;;;;;;;;;;:43;;;;;;;:::i;:::-;;;;;;;;27206:96;27328:2;27313:11;;:17;;;;;;;:::i;:::-;;;;;;;;27374:1;27369;27364:2;:6;;;;:::i;:::-;27363:12;;;;:::i;:::-;27341:13;:17;27355:2;;;;;;;;;;;27341:17;;;;;;;;;;;;;;;;:35;;;;;;;:::i;:::-;;;;;;;;27423:1;27418;27412:2;27406:3;:8;;;;:::i;:::-;27405:14;;;;:::i;:::-;27404:20;;;;:::i;:::-;27387:12;;:38;;;;;;;:::i;:::-;;;;;;;;27478:1;27473;27467:3;:7;;;;:::i;:::-;27466:13;;;;:::i;:::-;27436;:25;27450:10;27436:25;;;;;;;;;;;;;;;;:44;;;;;;;:::i;:::-;;;;;;;;27504:10;27496:28;;;27516:7;27496:28;;;;;;:::i;:::-;;;;;;;;26820:712;;;;;;:::o;29862:179::-;29933:7;29954:9;29965;29978:15;:13;:15::i;:::-;29953:40;;;;30032:1;30027;30012:12;:16;;;;:::i;:::-;30011:22;;;;:::i;:::-;30004:29;;;;29862:179;;;:::o;26276:131::-;26334:4;26358:41;26381:8;26391:7;26358:22;:41::i;:::-;26351:48;;26276:131;;;:::o;25240:143::-;25321:7;25348:11;:18;25360:5;25348:18;;;;;;;;;;;;;;;:27;25367:7;25348:27;;;;;;;;;;;;;;;;25341:34;;25240:143;;;;:::o;29149:420::-;29233:3;;;;;;;;;;;29219:17;;:10;:17;;;29211:37;;;;;;;;;;;;:::i;:::-;;;;;;;;;29268:41;29291:8;29301:7;29268:22;:41::i;:::-;29267:42;29259:71;;;;;;;;;;;;:::i;:::-;;;;;;;;;29369:1;29344:13;:22;29358:7;29344:22;;;;;;;;;;;;;;;;:26;29341:174;;;29388:9;29399;29412:15;:13;:15::i;:::-;29387:40;;;;29501:1;29494;29468:13;:22;29482:7;29468:22;;;;;;;;;;;;;;;;:28;;;;:::i;:::-;29467:36;;;;:::i;:::-;29442:13;:22;29456:7;29442:22;;;;;;;;;;;;;;;:61;;;;29341:174;;;29525:36;29543:8;29553:7;29525:17;:36::i;:::-;;29149:420;:::o;5910:152::-;5980:4;6004:50;6009:3;:10;;6045:5;6029:23;;6021:32;;6004:4;:50::i;:::-;5997:57;;5910:152;;;;:::o;30051:337::-;30161:1;30144:19;;:5;:19;;;;30136:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;30242:1;30223:21;;:7;:21;;;;30215:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;30326:6;30296:11;:18;30308:5;30296:18;;;;;;;;;;;;;;;:27;30315:7;30296:27;;;;;;;;;;;;;;;:36;;;;30364:7;30348:32;;30357:5;30348:32;;;30373:6;30348:32;;;;;;:::i;:::-;;;;;;;;30051:337;;;:::o;6482:167::-;6562:4;6586:55;6596:3;:10;;6632:5;6616:23;;6608:32;;6586:9;:55::i;:::-;6579:62;;6482:167;;;;:::o;6238:158::-;6311:4;6335:53;6343:3;:10;;6379:5;6363:23;;6355:32;;6335:7;:53::i;:::-;6328:60;;6238:158;;;;:::o;31129:1425::-;31241:1;31223:20;;:6;:20;;;;31215:70;;;;;;;;;;;;:::i;:::-;;;;;;;;;31325:1;31304:23;;:9;:23;;;;31296:71;;;;;;;;;;;;:::i;:::-;;;;;;;;;31392:1;31386:3;:7;31378:58;;;;;;;;;;;;:::i;:::-;;;;;;;;;31448:9;31459;31472:15;:13;:15::i;:::-;31447:40;;;;31498:11;31518:3;31512;:9;;;;:::i;:::-;31498:23;;31532:9;31544:27;31553:6;31561:9;31544:8;:27::i;:::-;31532:39;;31592:17;31586:23;;;;;;;;;;;;;;;;:2;:23;;;;;;;;;;;;;;;;;31582:839;;;31664:1;31659;31653:3;:7;;;;:::i;:::-;31652:13;;;;:::i;:::-;31626;:21;31640:6;31626:21;;;;;;;;;;;;;;;;:40;;;;;;;:::i;:::-;;;;;;;;31716:3;31710;:9;;;;:::i;:::-;31681:13;:24;31695:9;31681:24;;;;;;;;;;;;;;;;:39;;;;;;;:::i;:::-;;;;;;;;31784:1;31779;31772:3;31766;:9;;;;:::i;:::-;31765:15;;;;:::i;:::-;31764:21;;;;:::i;:::-;31735:13;:24;31749:9;31735:24;;;;;;;;;;;;;;;;:51;;;;;;;:::i;:::-;;;;;;;;31582:839;;;31814:19;31808:25;;;;;;;;;;;;;;;;:2;:25;;;;;;;;;;;;;;;;;31804:617;;;31876:3;31850:13;:21;31864:6;31850:21;;;;;;;;;;;;;;;;:30;;;;;;;:::i;:::-;;;;;;;;31933:1;31928;31922:3;:7;;;;:::i;:::-;31921:13;;;;:::i;:::-;31895;:21;31909:6;31895:21;;;;;;;;;;;;;;;;:40;;;;;;;:::i;:::-;;;;;;;;31999:1;31994;31987:3;31981;:9;;;;:::i;:::-;31980:15;;;;:::i;:::-;31979:21;;;;:::i;:::-;31950:13;:24;31964:9;31950:24;;;;;;;;;;;;;;;;:51;;;;;;;:::i;:::-;;;;;;;;31804:617;;;32029:19;32023:25;;;;;;;;;;;;;;;;:2;:25;;;;;;;;;;;;;;;;;32019:402;;;32091:3;32065:13;:21;32079:6;32065:21;;;;;;;;;;;;;;;;:30;;;;;;;:::i;:::-;;;;;;;;32148:1;32143;32137:3;:7;;;;:::i;:::-;32136:13;;;;:::i;:::-;32110;:21;32124:6;32110:21;;;;;;;;;;;;;;;;:40;;;;;;;:::i;:::-;;;;;;;;32200:3;32194;:9;;;;:::i;:::-;32165:13;:24;32179:9;32165:24;;;;;;;;;;;;;;;;:39;;;;;;;:::i;:::-;;;;;;;;32268:1;32263;32256:3;32250;:9;;;;:::i;:::-;32249:15;;;;:::i;:::-;32248:21;;;;:::i;:::-;32219:13;:24;32233:9;32219:24;;;;;;;;;;;;;;;;:51;;;;;;;:::i;:::-;;;;;;;;32019:402;;;32341:1;32336;32330:3;:7;;;;:::i;:::-;32329:13;;;;:::i;:::-;32303;:21;32317:6;32303:21;;;;;;;;;;;;;;;;:40;;;;;;;:::i;:::-;;;;;;;;32407:1;32402;32395:3;32389;:9;;;;:::i;:::-;32388:15;;;;:::i;:::-;32387:21;;;;:::i;:::-;32358:13;:24;32372:9;32358:24;;;;;;;;;;;;;;;;:51;;;;;;;:::i;:::-;;;;;;;;32019:402;31804:617;31582:839;32461:1;32456;32450:3;:7;;;;:::i;:::-;32449:13;;;;:::i;:::-;32431:12;;:32;;;;;;;:::i;:::-;;;;;;;;32489:3;32474:11;;:18;;;;;;;:::i;:::-;;;;;;;;32525:9;32508:38;;32517:6;32508:38;;;32542:3;32536;:9;;;;:::i;:::-;32508:38;;;;;;:::i;:::-;;;;;;;;31129:1425;;;;;;;:::o;28622:218::-;9103:1;9254:7;;:19;;9246:63;;;;;;;;;;;;:::i;:::-;;;;;;;;;9103:1;9322:7;:18;;;;28743:9:::1;28762:5;28755:22;;;28778:2;28782:6;28755:34;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;28743:46;;28808:4;28800:32;;;;;;;;;;;;:::i;:::-;;;;;;;;;9353:1;9059::::0;9367:7;:22;;;;28622:218;;;:::o;6735:117::-;6798:7;6825:19;6833:3;:10;;6825:7;:19::i;:::-;6818:26;;6735:117;;;:::o;7196:158::-;7270:7;7321:22;7325:3;:10;;7337:5;7321:3;:22::i;:::-;7313:31;;7290:56;;7196:158;;;;:::o;27540:241::-;9103:1;9254:7;;:19;;9246:63;;;;;;;;;;;;:::i;:::-;;;;;;;;;9103:1;9322:7;:18;;;;27663:9:::1;27682:5;27675:26;;;27702:4;27716;27723:6;27675:55;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;27663:67;;27749:4;27741:32;;;;;;;;;;;;:::i;:::-;;;;;;;;;9353:1;9059::::0;9367:7;:22;;;;27540:241;;;:::o;974:414::-;1037:4;1059:21;1069:3;1074:5;1059:9;:21::i;:::-;1054:327;;1097:3;:11;;1114:5;1097:23;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1280:3;:11;;:18;;;;1258:3;:12;;:19;1271:5;1258:19;;;;;;;;;;;:40;;;;1320:4;1313:11;;;;1054:327;1364:5;1357:12;;974:414;;;;;:::o;3194:129::-;3267:4;3314:1;3291:3;:12;;:19;3304:5;3291:19;;;;;;;;;;;;:24;;3284:31;;3194:129;;;;:::o;1564:1544::-;1630:4;1748:18;1769:3;:12;;:19;1782:5;1769:19;;;;;;;;;;;;1748:40;;1819:1;1805:10;:15;1801:1300;;2167:21;2204:1;2191:10;:14;;;;:::i;:::-;2167:38;;2220:17;2261:1;2240:3;:11;;:18;;;;:22;;;;:::i;:::-;2220:42;;2507:17;2527:3;:11;;2539:9;2527:22;;;;;;;;;;;;;;;;;;;;;;;;2507:42;;2673:9;2644:3;:11;;2656:13;2644:26;;;;;;;;;;;;;;;;;;;;;;;:38;;;;2792:1;2776:13;:17;;;;:::i;:::-;2750:3;:12;;:23;2763:9;2750:23;;;;;;;;;;;:43;;;;2902:3;:11;;:17;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2997:3;:12;;:19;3010:5;2997:19;;;;;;;;;;;2990:26;;;3040:4;3033:11;;;;;;;;1801:1300;3084:5;3077:12;;;1564:1544;;;;;:::o;30396:727::-;30472:8;30493:21;30517:40;30540:8;30550:6;30517:22;:40::i;:::-;30493:64;;30568:24;30595:43;30618:8;30628:9;30595:22;:43::i;:::-;30568:70;;30653:16;:40;;;;;30674:19;30673:20;30653:40;30649:448;;;30714:19;30710:23;;30649:448;;;30756:16;30755:17;:40;;;;;30776:19;30755:40;30751:346;;;30816:17;30812:21;;30751:346;;;30856:16;30855:17;:41;;;;;30877:19;30876:20;30855:41;30851:246;;;30917:15;30913:19;;30851:246;;;30954:16;:39;;;;;30974:19;30954:39;30950:147;;;31014:19;31010:23;;30950:147;;;31070:15;31066:19;;30950:147;30851:246;30751:346;30649:448;31107:8;;30396:727;;;;:::o;3409:109::-;3465:7;3492:3;:11;;:18;;;;3485:25;;3409:109;;;:::o;3862:204::-;3929:7;3978:5;3957:3;:11;;:18;;;;:26;3949:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;4040:3;:11;;4052:5;4040:18;;;;;;;;;;;;;;;;;;;;;;;;4033:25;;3862:204;;;;:::o;7:139:1:-;53:5;91:6;78:20;69:29;;107:33;134:5;107:33;:::i;:::-;59:87;;;;:::o;152:137::-;206:5;237:6;231:13;222:22;;253:30;277:5;253:30;:::i;:::-;212:77;;;;:::o;295:139::-;341:5;379:6;366:20;357:29;;395:33;422:5;395:33;:::i;:::-;347:87;;;;:::o;440:143::-;497:5;528:6;522:13;513:22;;544:33;571:5;544:33;:::i;:::-;503:80;;;;:::o;589:262::-;648:6;697:2;685:9;676:7;672:23;668:32;665:2;;;713:1;710;703:12;665:2;756:1;781:53;826:7;817:6;806:9;802:22;781:53;:::i;:::-;771:63;;727:117;655:196;;;;:::o;857:407::-;925:6;933;982:2;970:9;961:7;957:23;953:32;950:2;;;998:1;995;988:12;950:2;1041:1;1066:53;1111:7;1102:6;1091:9;1087:22;1066:53;:::i;:::-;1056:63;;1012:117;1168:2;1194:53;1239:7;1230:6;1219:9;1215:22;1194:53;:::i;:::-;1184:63;;1139:118;940:324;;;;;:::o;1270:552::-;1347:6;1355;1363;1412:2;1400:9;1391:7;1387:23;1383:32;1380:2;;;1428:1;1425;1418:12;1380:2;1471:1;1496:53;1541:7;1532:6;1521:9;1517:22;1496:53;:::i;:::-;1486:63;;1442:117;1598:2;1624:53;1669:7;1660:6;1649:9;1645:22;1624:53;:::i;:::-;1614:63;;1569:118;1726:2;1752:53;1797:7;1788:6;1777:9;1773:22;1752:53;:::i;:::-;1742:63;;1697:118;1370:452;;;;;:::o;1828:407::-;1896:6;1904;1953:2;1941:9;1932:7;1928:23;1924:32;1921:2;;;1969:1;1966;1959:12;1921:2;2012:1;2037:53;2082:7;2073:6;2062:9;2058:22;2037:53;:::i;:::-;2027:63;;1983:117;2139:2;2165:53;2210:7;2201:6;2190:9;2186:22;2165:53;:::i;:::-;2155:63;;2110:118;1911:324;;;;;:::o;2241:278::-;2308:6;2357:2;2345:9;2336:7;2332:23;2328:32;2325:2;;;2373:1;2370;2363:12;2325:2;2416:1;2441:61;2494:7;2485:6;2474:9;2470:22;2441:61;:::i;:::-;2431:71;;2387:125;2315:204;;;;:::o;2525:262::-;2584:6;2633:2;2621:9;2612:7;2608:23;2604:32;2601:2;;;2649:1;2646;2639:12;2601:2;2692:1;2717:53;2762:7;2753:6;2742:9;2738:22;2717:53;:::i;:::-;2707:63;;2663:117;2591:196;;;;:::o;2793:284::-;2863:6;2912:2;2900:9;2891:7;2887:23;2883:32;2880:2;;;2928:1;2925;2918:12;2880:2;2971:1;2996:64;3052:7;3043:6;3032:9;3028:22;2996:64;:::i;:::-;2986:74;;2942:128;2870:207;;;;:::o;3083:118::-;3170:24;3188:5;3170:24;:::i;:::-;3165:3;3158:37;3148:53;;:::o;3207:109::-;3288:21;3303:5;3288:21;:::i;:::-;3283:3;3276:34;3266:50;;:::o;3322:364::-;3410:3;3438:39;3471:5;3438:39;:::i;:::-;3493:71;3557:6;3552:3;3493:71;:::i;:::-;3486:78;;3573:52;3618:6;3613:3;3606:4;3599:5;3595:16;3573:52;:::i;:::-;3650:29;3672:6;3650:29;:::i;:::-;3645:3;3641:39;3634:46;;3414:272;;;;;:::o;3692:366::-;3834:3;3855:67;3919:2;3914:3;3855:67;:::i;:::-;3848:74;;3931:93;4020:3;3931:93;:::i;:::-;4049:2;4044:3;4040:12;4033:19;;3838:220;;;:::o;4064:366::-;4206:3;4227:67;4291:2;4286:3;4227:67;:::i;:::-;4220:74;;4303:93;4392:3;4303:93;:::i;:::-;4421:2;4416:3;4412:12;4405:19;;4210:220;;;:::o;4436:366::-;4578:3;4599:67;4663:2;4658:3;4599:67;:::i;:::-;4592:74;;4675:93;4764:3;4675:93;:::i;:::-;4793:2;4788:3;4784:12;4777:19;;4582:220;;;:::o;4808:366::-;4950:3;4971:67;5035:2;5030:3;4971:67;:::i;:::-;4964:74;;5047:93;5136:3;5047:93;:::i;:::-;5165:2;5160:3;5156:12;5149:19;;4954:220;;;:::o;5180:366::-;5322:3;5343:67;5407:2;5402:3;5343:67;:::i;:::-;5336:74;;5419:93;5508:3;5419:93;:::i;:::-;5537:2;5532:3;5528:12;5521:19;;5326:220;;;:::o;5552:366::-;5694:3;5715:67;5779:2;5774:3;5715:67;:::i;:::-;5708:74;;5791:93;5880:3;5791:93;:::i;:::-;5909:2;5904:3;5900:12;5893:19;;5698:220;;;:::o;5924:365::-;6066:3;6087:66;6151:1;6146:3;6087:66;:::i;:::-;6080:73;;6162:93;6251:3;6162:93;:::i;:::-;6280:2;6275:3;6271:12;6264:19;;6070:219;;;:::o;6295:366::-;6437:3;6458:67;6522:2;6517:3;6458:67;:::i;:::-;6451:74;;6534:93;6623:3;6534:93;:::i;:::-;6652:2;6647:3;6643:12;6636:19;;6441:220;;;:::o;6667:366::-;6809:3;6830:67;6894:2;6889:3;6830:67;:::i;:::-;6823:74;;6906:93;6995:3;6906:93;:::i;:::-;7024:2;7019:3;7015:12;7008:19;;6813:220;;;:::o;7039:366::-;7181:3;7202:67;7266:2;7261:3;7202:67;:::i;:::-;7195:74;;7278:93;7367:3;7278:93;:::i;:::-;7396:2;7391:3;7387:12;7380:19;;7185:220;;;:::o;7411:366::-;7553:3;7574:67;7638:2;7633:3;7574:67;:::i;:::-;7567:74;;7650:93;7739:3;7650:93;:::i;:::-;7768:2;7763:3;7759:12;7752:19;;7557:220;;;:::o;7783:366::-;7925:3;7946:67;8010:2;8005:3;7946:67;:::i;:::-;7939:74;;8022:93;8111:3;8022:93;:::i;:::-;8140:2;8135:3;8131:12;8124:19;;7929:220;;;:::o;8155:366::-;8297:3;8318:67;8382:2;8377:3;8318:67;:::i;:::-;8311:74;;8394:93;8483:3;8394:93;:::i;:::-;8512:2;8507:3;8503:12;8496:19;;8301:220;;;:::o;8527:366::-;8669:3;8690:67;8754:2;8749:3;8690:67;:::i;:::-;8683:74;;8766:93;8855:3;8766:93;:::i;:::-;8884:2;8879:3;8875:12;8868:19;;8673:220;;;:::o;8899:118::-;8986:24;9004:5;8986:24;:::i;:::-;8981:3;8974:37;8964:53;;:::o;9023:112::-;9106:22;9122:5;9106:22;:::i;:::-;9101:3;9094:35;9084:51;;:::o;9141:222::-;9234:4;9272:2;9261:9;9257:18;9249:26;;9285:71;9353:1;9342:9;9338:17;9329:6;9285:71;:::i;:::-;9239:124;;;;:::o;9369:442::-;9518:4;9556:2;9545:9;9541:18;9533:26;;9569:71;9637:1;9626:9;9622:17;9613:6;9569:71;:::i;:::-;9650:72;9718:2;9707:9;9703:18;9694:6;9650:72;:::i;:::-;9732;9800:2;9789:9;9785:18;9776:6;9732:72;:::i;:::-;9523:288;;;;;;:::o;9817:332::-;9938:4;9976:2;9965:9;9961:18;9953:26;;9989:71;10057:1;10046:9;10042:17;10033:6;9989:71;:::i;:::-;10070:72;10138:2;10127:9;10123:18;10114:6;10070:72;:::i;:::-;9943:206;;;;;:::o;10155:210::-;10242:4;10280:2;10269:9;10265:18;10257:26;;10293:65;10355:1;10344:9;10340:17;10331:6;10293:65;:::i;:::-;10247:118;;;;:::o;10371:313::-;10484:4;10522:2;10511:9;10507:18;10499:26;;10571:9;10565:4;10561:20;10557:1;10546:9;10542:17;10535:47;10599:78;10672:4;10663:6;10599:78;:::i;:::-;10591:86;;10489:195;;;;:::o;10690:419::-;10856:4;10894:2;10883:9;10879:18;10871:26;;10943:9;10937:4;10933:20;10929:1;10918:9;10914:17;10907:47;10971:131;11097:4;10971:131;:::i;:::-;10963:139;;10861:248;;;:::o;11115:419::-;11281:4;11319:2;11308:9;11304:18;11296:26;;11368:9;11362:4;11358:20;11354:1;11343:9;11339:17;11332:47;11396:131;11522:4;11396:131;:::i;:::-;11388:139;;11286:248;;;:::o;11540:419::-;11706:4;11744:2;11733:9;11729:18;11721:26;;11793:9;11787:4;11783:20;11779:1;11768:9;11764:17;11757:47;11821:131;11947:4;11821:131;:::i;:::-;11813:139;;11711:248;;;:::o;11965:419::-;12131:4;12169:2;12158:9;12154:18;12146:26;;12218:9;12212:4;12208:20;12204:1;12193:9;12189:17;12182:47;12246:131;12372:4;12246:131;:::i;:::-;12238:139;;12136:248;;;:::o;12390:419::-;12556:4;12594:2;12583:9;12579:18;12571:26;;12643:9;12637:4;12633:20;12629:1;12618:9;12614:17;12607:47;12671:131;12797:4;12671:131;:::i;:::-;12663:139;;12561:248;;;:::o;12815:419::-;12981:4;13019:2;13008:9;13004:18;12996:26;;13068:9;13062:4;13058:20;13054:1;13043:9;13039:17;13032:47;13096:131;13222:4;13096:131;:::i;:::-;13088:139;;12986:248;;;:::o;13240:419::-;13406:4;13444:2;13433:9;13429:18;13421:26;;13493:9;13487:4;13483:20;13479:1;13468:9;13464:17;13457:47;13521:131;13647:4;13521:131;:::i;:::-;13513:139;;13411:248;;;:::o;13665:419::-;13831:4;13869:2;13858:9;13854:18;13846:26;;13918:9;13912:4;13908:20;13904:1;13893:9;13889:17;13882:47;13946:131;14072:4;13946:131;:::i;:::-;13938:139;;13836:248;;;:::o;14090:419::-;14256:4;14294:2;14283:9;14279:18;14271:26;;14343:9;14337:4;14333:20;14329:1;14318:9;14314:17;14307:47;14371:131;14497:4;14371:131;:::i;:::-;14363:139;;14261:248;;;:::o;14515:419::-;14681:4;14719:2;14708:9;14704:18;14696:26;;14768:9;14762:4;14758:20;14754:1;14743:9;14739:17;14732:47;14796:131;14922:4;14796:131;:::i;:::-;14788:139;;14686:248;;;:::o;14940:419::-;15106:4;15144:2;15133:9;15129:18;15121:26;;15193:9;15187:4;15183:20;15179:1;15168:9;15164:17;15157:47;15221:131;15347:4;15221:131;:::i;:::-;15213:139;;15111:248;;;:::o;15365:419::-;15531:4;15569:2;15558:9;15554:18;15546:26;;15618:9;15612:4;15608:20;15604:1;15593:9;15589:17;15582:47;15646:131;15772:4;15646:131;:::i;:::-;15638:139;;15536:248;;;:::o;15790:419::-;15956:4;15994:2;15983:9;15979:18;15971:26;;16043:9;16037:4;16033:20;16029:1;16018:9;16014:17;16007:47;16071:131;16197:4;16071:131;:::i;:::-;16063:139;;15961:248;;;:::o;16215:419::-;16381:4;16419:2;16408:9;16404:18;16396:26;;16468:9;16462:4;16458:20;16454:1;16443:9;16439:17;16432:47;16496:131;16622:4;16496:131;:::i;:::-;16488:139;;16386:248;;;:::o;16640:222::-;16733:4;16771:2;16760:9;16756:18;16748:26;;16784:71;16852:1;16841:9;16837:17;16828:6;16784:71;:::i;:::-;16738:124;;;;:::o;16868:332::-;16989:4;17027:2;17016:9;17012:18;17004:26;;17040:71;17108:1;17097:9;17093:17;17084:6;17040:71;:::i;:::-;17121:72;17189:2;17178:9;17174:18;17165:6;17121:72;:::i;:::-;16994:206;;;;;:::o;17206:214::-;17295:4;17333:2;17322:9;17318:18;17310:26;;17346:67;17410:1;17399:9;17395:17;17386:6;17346:67;:::i;:::-;17300:120;;;;:::o;17426:99::-;17478:6;17512:5;17506:12;17496:22;;17485:40;;;:::o;17531:169::-;17615:11;17649:6;17644:3;17637:19;17689:4;17684:3;17680:14;17665:29;;17627:73;;;;:::o;17706:305::-;17746:3;17765:20;17783:1;17765:20;:::i;:::-;17760:25;;17799:20;17817:1;17799:20;:::i;:::-;17794:25;;17953:1;17885:66;17881:74;17878:1;17875:81;17872:2;;;17959:18;;:::i;:::-;17872:2;18003:1;18000;17996:9;17989:16;;17750:261;;;;:::o;18017:185::-;18057:1;18074:20;18092:1;18074:20;:::i;:::-;18069:25;;18108:20;18126:1;18108:20;:::i;:::-;18103:25;;18147:1;18137:2;;18152:18;;:::i;:::-;18137:2;18194:1;18191;18187:9;18182:14;;18059:143;;;;:::o;18208:348::-;18248:7;18271:20;18289:1;18271:20;:::i;:::-;18266:25;;18305:20;18323:1;18305:20;:::i;:::-;18300:25;;18493:1;18425:66;18421:74;18418:1;18415:81;18410:1;18403:9;18396:17;18392:105;18389:2;;;18500:18;;:::i;:::-;18389:2;18548:1;18545;18541:9;18530:20;;18256:300;;;;:::o;18562:191::-;18602:4;18622:20;18640:1;18622:20;:::i;:::-;18617:25;;18656:20;18674:1;18656:20;:::i;:::-;18651:25;;18695:1;18692;18689:8;18686:2;;;18700:18;;:::i;:::-;18686:2;18745:1;18742;18738:9;18730:17;;18607:146;;;;:::o;18759:96::-;18796:7;18825:24;18843:5;18825:24;:::i;:::-;18814:35;;18804:51;;;:::o;18861:90::-;18895:7;18938:5;18931:13;18924:21;18913:32;;18903:48;;;:::o;18957:126::-;18994:7;19034:42;19027:5;19023:54;19012:65;;19002:81;;;:::o;19089:77::-;19126:7;19155:5;19144:16;;19134:32;;;:::o;19172:86::-;19207:7;19247:4;19240:5;19236:16;19225:27;;19215:43;;;:::o;19264:307::-;19332:1;19342:113;19356:6;19353:1;19350:13;19342:113;;;19441:1;19436:3;19432:11;19426:18;19422:1;19417:3;19413:11;19406:39;19378:2;19375:1;19371:10;19366:15;;19342:113;;;19473:6;19470:1;19467:13;19464:2;;;19553:1;19544:6;19539:3;19535:16;19528:27;19464:2;19313:258;;;;:::o;19577:320::-;19621:6;19658:1;19652:4;19648:12;19638:22;;19705:1;19699:4;19695:12;19726:18;19716:2;;19782:4;19774:6;19770:17;19760:27;;19716:2;19844;19836:6;19833:14;19813:18;19810:38;19807:2;;;19863:18;;:::i;:::-;19807:2;19628:269;;;;:::o;19903:233::-;19942:3;19965:24;19983:5;19965:24;:::i;:::-;19956:33;;20011:66;20004:5;20001:77;19998:2;;;20081:18;;:::i;:::-;19998:2;20128:1;20121:5;20117:13;20110:20;;19946:190;;;:::o;20142:180::-;20190:77;20187:1;20180:88;20287:4;20284:1;20277:15;20311:4;20308:1;20301:15;20328:180;20376:77;20373:1;20366:88;20473:4;20470:1;20463:15;20497:4;20494:1;20487:15;20514:180;20562:77;20559:1;20552:88;20659:4;20656:1;20649:15;20683:4;20680:1;20673:15;20700:102;20741:6;20792:2;20788:7;20783:2;20776:5;20772:14;20768:28;20758:38;;20748:54;;;:::o;20808:221::-;20948:34;20944:1;20936:6;20932:14;20925:58;21017:4;21012:2;21004:6;21000:15;20993:29;20914:115;:::o;21035:222::-;21175:34;21171:1;21163:6;21159:14;21152:58;21244:5;21239:2;21231:6;21227:15;21220:30;21141:116;:::o;21263:171::-;21403:23;21399:1;21391:6;21387:14;21380:47;21369:65;:::o;21440:221::-;21580:34;21576:1;21568:6;21564:14;21557:58;21649:4;21644:2;21636:6;21632:15;21625:29;21546:115;:::o;21667:166::-;21807:18;21803:1;21795:6;21791:14;21784:42;21773:60;:::o;21839:161::-;21979:13;21975:1;21967:6;21963:14;21956:37;21945:55;:::o;22006:157::-;22146:9;22142:1;22134:6;22130:14;22123:33;22112:51;:::o;22169:165::-;22309:17;22305:1;22297:6;22293:14;22286:41;22275:59;:::o;22340:224::-;22480:34;22476:1;22468:6;22464:14;22457:58;22549:7;22544:2;22536:6;22532:15;22525:32;22446:118;:::o;22570:166::-;22710:18;22706:1;22698:6;22694:14;22687:42;22676:60;:::o;22742:223::-;22882:34;22878:1;22870:6;22866:14;22859:58;22951:6;22946:2;22938:6;22934:15;22927:31;22848:117;:::o;22971:165::-;23111:17;23107:1;23099:6;23095:14;23088:41;23077:59;:::o;23142:181::-;23282:33;23278:1;23270:6;23266:14;23259:57;23248:75;:::o;23329:225::-;23469:34;23465:1;23457:6;23453:14;23446:58;23538:8;23533:2;23525:6;23521:15;23514:33;23435:119;:::o;23560:122::-;23633:24;23651:5;23633:24;:::i;:::-;23626:5;23623:35;23613:2;;23672:1;23669;23662:12;23613:2;23603:79;:::o;23688:116::-;23758:21;23773:5;23758:21;:::i;:::-;23751:5;23748:32;23738:2;;23794:1;23791;23784:12;23738:2;23728:76;:::o;23810:122::-;23883:24;23901:5;23883:24;:::i;:::-;23876:5;23873:35;23863:2;;23922:1;23919;23912:12;23863:2;23853:79;:::o

Swarm Source

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