ETH Price: $3,285.16 (-1.65%)

Token

BloodyToken (BLOODY)
 

Overview

Max Total Supply

650,462.524777629939324862 BLOODY

Holders

473 (0.00%)

Market

Price

$0.00 @ 0.000000 ETH

Onchain Market Cap

$48.59

Circulating Supply Market Cap

-

Other Info

Token Contract (WITH 18 Decimals)

Balance
125,000 BLOODY

Value
$9.34 ( ~0.00284308796323316 Eth) [19.2171%]
0x29d3209e90ba1cfde9b5d8731afd57a75e90ba87
Loading...
Loading
Loading...
Loading
Loading...
Loading

OVERVIEW

BLOODY is a deflationary / rebase token that whenever there is a BLOODY transfer, it spills - give rewards. It is initially given out to ROT holders which holds above 7500 ROT token.

# Exchange Pair Price  24H Volume % Volume

Contract Source Code Verified (Exact Match)

Contract Name:
BloodyToken

Compiler Version
v0.6.2+commit.bacdbe57

Optimization Enabled:
No with 200 runs

Other Settings:
default evmVersion, None license

Contract Source Code (Solidity)

/**
 *Submitted for verification at Etherscan.io on 2020-10-27
*/

/*

@@@@@@@   @@@        @@@@@@    @@@@@@   @@@@@@@   @@@ @@@  
@@@@@@@@  @@@       @@@@@@@@  @@@@@@@@  @@@@@@@@  @@@ @@@  
@@!  @@@  @@!       @@!  @@@  @@!  @@@  @@!  @@@  @@! !@@  
!@   @!@  !@!       !@!  @!@  !@!  @!@  !@!  @!@  !@! @!!  
@!@!@!@   @!!       @!@  !@!  @!@  !@!  @!@  !@!   !@!@!   
!!!@!!!!  !!!       !@!  !!!  !@!  !!!  !@!  !!!    @!!!   
!!:  !!!  !!:       !!:  !!!  !!:  !!!  !!:  !!!    !!:    
:!:  !:!   :!:      :!:  !:!  :!:  !:!  :!:  !:!    :!:    
 :: ::::   :: ::::  ::::: ::  ::::: ::   :::: ::     ::    
:: : ::   : :: : :   : :  :    : :  :   :: :  :      :

Website: bloodyfi.org

BLOODY, a deflationary elastic experiment that clots if it 
doesn't circulate

How does clotting work?

Whenever the BLOODY transfer volume increases, everyone's 
BLOODY balance gets a little bit bigger, whenever the BLOODY 
transfer volume decreases, everyone's BLOODY balance gets a 
little bit smaller.

How is it deflationary?

Whenever there's a BLOODY transfer, it spills. The faster it
circulates, the higher the spill rate.

How often are rebases?

Rebases are hourly. After a rebase, transfers are frozen for 
5 minutes.

How are BLOODY liquidity provider incentivized?

- Half the spills are redistributed to BLOODY-ETH, BLOODY-ROT 
and BLOODY-NICE liquidity providers (up to 6% of ANY transfer).
- A BLOODY-ROT pool will be added to Rottenswap on Halloween.

How is BLOODY initially distributed?

BLOODY cannot be minted, it is ditributed once on Halloween 2020 
to ROT holders with a balance above 7,500. The snapshot block 
(11106871) was chosen at random 
https://twitter.com/TheTimTempleton/status/1320722096578727937

Are contracts audited?

BLOODY is written 100% from scratch, not tested nor audited. 
It is not secure, use at your own risk.

What does it BLOODY do?

Nothing, it is an experiment with no purpose.

*/

// File: @openzeppelin/contracts/GSN/Context.sol

// SPDX-License-Identifier: MIT

pragma solidity ^0.6.0;

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

    function _msgData() internal view virtual returns (bytes memory) {
        this; // silence state mutability warning without generating bytecode - see https://github.com/ethereum/solidity/issues/2691
        return msg.data;
    }
}

// File: @openzeppelin/contracts/token/ERC20/IERC20.sol

// SPDX-License-Identifier: MIT

pragma solidity ^0.6.0;

/**
 * @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/contracts/math/SafeMath.sol

// SPDX-License-Identifier: MIT

pragma solidity ^0.6.0;

/**
 * @dev Wrappers over Solidity's arithmetic operations with added overflow
 * checks.
 *
 * Arithmetic operations in Solidity wrap on overflow. This can easily result
 * in bugs, because programmers usually assume that an overflow raises an
 * error, which is the standard behavior in high level programming languages.
 * `SafeMath` restores this intuition by reverting the transaction when an
 * operation overflows.
 *
 * Using this library instead of the unchecked operations eliminates an entire
 * class of bugs, so it's recommended to use it always.
 */
library SafeMath {
    /**
     * @dev Returns the addition of two unsigned integers, reverting on
     * overflow.
     *
     * Counterpart to Solidity's `+` operator.
     *
     * Requirements:
     *
     * - Addition cannot overflow.
     */
    function add(uint256 a, uint256 b) internal pure returns (uint256) {
        uint256 c = a + b;
        require(c >= a, "SafeMath: addition overflow");

        return c;
    }

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

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

        return c;
    }

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

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

        return c;
    }

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

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

        return c;
    }

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

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

// File: @openzeppelin/contracts/utils/Address.sol

// SPDX-License-Identifier: MIT

pragma solidity ^0.6.2;

/**
 * @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);
            }
        }
    }
}

// File: contracts/ERC20.sol

// SPDX-License-Identifier: MIT

pragma solidity ^0.6.0;





/**
 * @dev Implementation of the {IERC20} interface.
 *
 * This implementation is agnostic to the way tokens are created. This means
 * that a supply mechanism has to be added in a derived contract using {_mint}.
 * For a generic mechanism see {ERC20PresetMinterPauser}.
 *
 * TIP: For a detailed writeup see our guide
 * https://forum.zeppelin.solutions/t/how-to-implement-erc20-supply-mechanisms/226[How
 * to implement supply mechanisms].
 *
 * We have followed general OpenZeppelin guidelines: functions revert instead
 * of returning `false` on failure. This behavior is nonetheless conventional
 * and does not conflict with the expectations of ERC20 applications.
 *
 * Additionally, an {Approval} event is emitted on calls to {transferFrom}.
 * This allows applications to reconstruct the allowance for all accounts just
 * by listening to said events. Other implementations of the EIP may not emit
 * these events, as it isn't required by the specification.
 *
 * Finally, the non-standard {decreaseAllowance} and {increaseAllowance}
 * functions have been added to mitigate the well-known issues around setting
 * allowances. See {IERC20-approve}.
 */
contract ERC20 is Context, IERC20 {
    using SafeMath for uint256;
    using Address for address;

    mapping (address => uint256) private _balances;

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

    uint256 private _totalSupply;

    string private _name;
    string private _symbol;
    uint8 private _decimals;

    /**
     * @dev Sets the values for {name} and {symbol}, initializes {decimals} with
     * a default value of 18.
     *
     * To select a different value for {decimals}, use {_setupDecimals}.
     *
     * All three of these values are immutable: they can only be set once during
     * construction.
     */
    constructor (string memory name, string memory symbol) public {
        _name = name;
        _symbol = symbol;
        _decimals = 18;
    }

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

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

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

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

    /**
     * @dev See {IERC20-balanceOf}.
     */
    // EDIT: make balanceOf virtual so it can be overridden
    function balanceOf(address account) public view virtual override returns (uint256) {
        return _balances[account];
    }
    // function balanceOf(address account) public view override returns (uint256) {
    //     return _balances[account];
    // }

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

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

    /**
     * @dev See {IERC20-approve}.
     *
     * Requirements:
     *
     * - `spender` cannot be the zero address.
     */
    function approve(address spender, uint256 amount) public virtual override returns (bool) {
        _approve(_msgSender(), spender, amount);
        return true;
    }

    /**
     * @dev See {IERC20-transferFrom}.
     *
     * Emits an {Approval} event indicating the updated allowance. This is not
     * required by the EIP. See the note at the beginning of {ERC20};
     *
     * Requirements:
     * - `sender` and `recipient` cannot be the zero address.
     * - `sender` must have a balance of at least `amount`.
     * - the caller must have allowance for ``sender``'s tokens of at least
     * `amount`.
     */
    function transferFrom(address sender, address recipient, uint256 amount) public virtual override returns (bool) {
        _transfer(sender, recipient, amount);
        _approve(sender, _msgSender(), _allowances[sender][_msgSender()].sub(amount, "ERC20: transfer amount exceeds allowance"));
        return true;
    }

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

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

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

        // _beforeTokenTransfer(sender, recipient, amount);

        _balances[sender] = _balances[sender].sub(amount, "ERC20: transfer amount exceeds balance");
        _balances[recipient] = _balances[recipient].add(amount);
        emit Transfer(sender, recipient, amount);
    }

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

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

        _totalSupply = _totalSupply.add(amount);
        _balances[account] = _balances[account].add(amount);
        emit Transfer(address(0), account, amount);
    }

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

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

        _balances[account] = _balances[account].sub(amount, "ERC20: burn amount exceeds balance");
        _totalSupply = _totalSupply.sub(amount);
        emit Transfer(account, address(0), amount);
    }

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

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

    /**
     * @dev Sets {decimals} to a value other than the default one of 18.
     *
     * WARNING: This function should only be called from the constructor. Most
     * applications that interact with token contracts will not expect
     * {decimals} to ever change, and may work incorrectly if it does.
     */
    function _setupDecimals(uint8 decimals_) internal {
        _decimals = decimals_;
    }

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

// File: contracts/ERC20TransferBurn.sol

pragma solidity ^0.6.2;


contract ERC20TransferBurn is ERC20 {
    using SafeMath for uint256;

    constructor (string memory name, string memory symbol) ERC20(name, symbol) public {}

    // the amount of burn during every transfer, i.e. 100 = 1%, 50 = 2%, 40 = 2.5%
    uint256 private _burnDivisor = 100;

    function burnDivisor() public view virtual returns (uint256) {
        return _burnDivisor;
    }

    function _setBurnDivisor(uint256 burnDivisor) internal virtual {
        require(burnDivisor > 0, "_setBurnDivisor burnDivisor must be bigger than 0");
        _burnDivisor = burnDivisor;
    }

    function transfer(address recipient, uint256 amount) public virtual override returns (bool) {
        // calculate burn amount
        uint256 burnAmount = amount.div(_burnDivisor);
        // burn burn amount
        burn(msg.sender, burnAmount);
        // transfer amount minus burn amount
        return super.transfer(recipient, amount.sub(burnAmount));
    }

    function transferFrom(address sender, address recipient, uint256 amount) public virtual override returns (bool) {
        // calculate burn amount
        uint256 burnAmount = amount.div(_burnDivisor);
        // burn burn amount
        burn(sender, burnAmount);
        // transfer amount minus burn amount
        return super.transferFrom(sender, recipient, amount.sub(burnAmount));
    }

    // keep track of total supply burned (for fun only, serves no purpose)
    uint256 private _totalSupplyBurned;

    function totalSupplyBurned() public view virtual returns (uint256) {
        return _totalSupplyBurned;
    }

    function burn(address account, uint256 amount) private {
        _burn(account, amount);
        // keep track of total supply burned
        _totalSupplyBurned = _totalSupplyBurned.add(amount);
    }
}

// File: contracts/ERC20ElasticTransferBurn.sol

// ERC20Elastic is duplicated in ERC20Elastic.sol and ERC20ElasticTransferBurn.sol
// because I don't know how to not duplicate it

pragma solidity ^0.6.0;


contract ERC20ElasticTransferBurn is ERC20TransferBurn {
    using SafeMath for uint256;

    constructor (string memory name, string memory symbol) ERC20TransferBurn(name, symbol) public {}

    uint256 private _elasticMultiplier = 100;

    function elasticMultiplier() public view virtual returns (uint256) {
        return _elasticMultiplier;
    }

    function _setElasticMultiplier(uint256 elasticMultiplier) internal virtual {
        require(elasticMultiplier > 0, "_setElasticMultiplier elasticMultiplier must be bigger than 0");
        _elasticMultiplier = elasticMultiplier;
    }

    function balanceOf(address account) public view virtual override returns (uint256) {
        return super.balanceOf(account).mul(_elasticMultiplier);
    }

    // don't override totalSupply to cause more madness and confusion
    function totalSupplyElastic() public view virtual returns (uint256) {
        return super.totalSupply().mul(_elasticMultiplier);
    }

    function balanceOfRaw(address account) public view virtual returns (uint256) {
        return super.balanceOf(account);
    }

    function transfer(address recipient, uint256 amount) public virtual override returns (bool) {
        return super.transfer(recipient, amount.div(_elasticMultiplier));
    }

    function transferFrom(address sender, address recipient, uint256 amount) public virtual override returns (bool) {
        return super.transferFrom(sender, recipient, amount.div(_elasticMultiplier));
    }
}

// File: @openzeppelin/contracts/access/Ownable.sol

// SPDX-License-Identifier: MIT

pragma solidity ^0.6.0;

/**
 * @dev Contract module which provides a basic access control mechanism, where
 * there is an account (an owner) that can be granted exclusive access to
 * specific functions.
 *
 * By default, the owner account will be the one that deploys the contract. This
 * can later be changed with {transferOwnership}.
 *
 * This module is used through inheritance. It will make available the modifier
 * `onlyOwner`, which can be applied to your functions to restrict their use to
 * the owner.
 */
contract Ownable is Context {
    address private _owner;

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

    /**
     * @dev Initializes the contract setting the deployer as the initial owner.
     */
    constructor () internal {
        address msgSender = _msgSender();
        _owner = msgSender;
        emit OwnershipTransferred(address(0), msgSender);
    }

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

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

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

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

// File: contracts/BloodyToken.sol

pragma solidity ^0.6.2;



contract BloodyToken is ERC20ElasticTransferBurn("BloodyToken", "BLOODY"), Ownable {
    using SafeMath for uint256;

    // store how many transfers have occurred every hour
    // to calculate the burn divisor
    uint256 public transferVolumeNowBucket;
    uint256 public transferVolume1HourAgoBucket;

    // store the now timestamp to know when it has expired
    uint256 public transferVolumeNowBucketTimestamp;

    constructor() public {
        // set to arbitrary initial values
        _setBurnDivisor(100);
        _setElasticMultiplier(10);

        // freeze transfers for 5 minutes after rebase
        // to mitigate users transferring wrong amounts
        transferAfterRebaseFreezeTime = 5 minutes;

        transferVolumeNowBucketTimestamp = getTransferVolumeNowBucketTimestamp();
    }

    function getTransferVolumeNowBucketTimestamp() public view returns (uint256) {
        // 3600 seconds per hour
        // round the timestamp bucket every hour
        return block.timestamp - (block.timestamp % 3600);
    }

    event Rebase(
        uint256 indexed transferVolumeNowBucketTimestamp, uint256 burnDivisor, uint256 elasticMultiplier, 
        uint256 transferVolume1HourAgoBucket, uint256 transferVolume2HoursAgoBucket
    );

    uint256 public lastRebaseTimestamp;
    uint256 public transferAfterRebaseFreezeTime;

    function rebase() public {
        // time is still in current bucket, does not need updating
        require(requiresRebase() == true, "someone else called rebase already");

        // update volume buckets
        // shift buckets 1 spot
        uint256 transferVolume2HoursAgoBucket = transferVolume1HourAgoBucket;
        transferVolume1HourAgoBucket = transferVolumeNowBucket;
        transferVolumeNowBucket = 0;

        // store new timestamp
        transferVolumeNowBucketTimestamp = getTransferVolumeNowBucketTimestamp();

        // mint half the burn to the uniswap pairs
        // make sure to sync the uniswap pairs after
        uint256 uniswapPairReward = transferVolume1HourAgoBucket.div(burnDivisor()).div(2);
        mintToUniswapPairs(uniswapPairReward);

        // rebase supply and burn rate
        uint256 newBurnDivisor = calculateBurnDivisor(burnDivisor(), transferVolume1HourAgoBucket, transferVolume2HoursAgoBucket);
        // arbitrarily set elastic modifier to 10x the burn rate (10 * 100 / burnDivisor)
        // if bloody circulates, spill rate increases, but clotting decreases
        // if volume increases, burn rate increases (burn divisor decreases), supply increases
        uint256 newElasticMultiplier = uint256(1000).div(newBurnDivisor);
        _setBurnDivisor(newBurnDivisor);
        _setElasticMultiplier(newElasticMultiplier);
        emit Rebase(transferVolumeNowBucketTimestamp, newBurnDivisor, newElasticMultiplier, transferVolume1HourAgoBucket, transferVolume2HoursAgoBucket);

        // if uniswap pairs are not synced loss of
        // funds will occur after rebase or reward minting
        syncUniswapPairs();

        // set to false until next rebase
        setRequiresRebase(false);
        lastRebaseTimestamp = block.timestamp;
    }

    uint256 public constant minBurnPercent = 1;
    uint256 public constant maxBurnPercent = 12;
    // they are inversely correlated
    uint256 public constant minBurnDivisor = 100 / maxBurnPercent;
    uint256 public constant maxBurnDivisor = 100 / minBurnPercent;

    // if bloody circulates, spill rate increases, but clotting decreases
    // if volume decreases, burn rate decreases (burn divisor increases), supply decreases
    // if supply decreases, price goes up, which stimulates more volume, which in turn
    // increases burn
    // if volume increases, burn rate increases (burn divisor decreases), supply increases
    function calculateBurnDivisor(uint256 _previousBurnDivisor, uint256 _transferVolume1HourAgoBucket, uint256 _transferVolume2HoursAgoBucket) public view returns (uint256) {
        // convert burn divisor to burn percent using division precision
        int256 divisionPrecision = 10000;
        int256 preciseMinBurnPercent = int256(minBurnPercent) * divisionPrecision;
        int256 preciseMaxBurnPercent = int256(maxBurnPercent) * divisionPrecision;
        // don't divide by 0
        if (_previousBurnDivisor == 0) {
            return minBurnDivisor;
        }
        int256 precisePreviousBurnPercent = (100 * divisionPrecision) / int256(_previousBurnDivisor);

        // no update needed
        if (_transferVolume1HourAgoBucket == _transferVolume2HoursAgoBucket) {
            // never return burn divisor above or below max
            if (precisePreviousBurnPercent < preciseMinBurnPercent) {
                return maxBurnDivisor;
            }
            else if (precisePreviousBurnPercent > preciseMaxBurnPercent) {
                return minBurnDivisor;
            }
            else {
                return _previousBurnDivisor;
            }
        }

        bool volumeHasIncreased = _transferVolume1HourAgoBucket > _transferVolume2HoursAgoBucket;

        // check for min / max already reached
        if (volumeHasIncreased) {
            // volume has increased but 
            // burn percent is already max (burn divisor is already min)
            if (precisePreviousBurnPercent >= preciseMaxBurnPercent) {
                return minBurnDivisor;
            }
        }
        // volume has decreased
        else {
            // volume has decreased but 
            // burn percent is already min (burn divisor is already max)
            if (precisePreviousBurnPercent <= preciseMinBurnPercent) {
                return maxBurnDivisor;
            }
        }

        // find the transfer volume difference ratio between the 2 hour buckets
        int256 transferVolumeRatio;
        if (_transferVolume1HourAgoBucket == 0) {
            transferVolumeRatio = -int256(_transferVolume2HoursAgoBucket + 1);
        }
        else if (_transferVolume2HoursAgoBucket == 0) {
            transferVolumeRatio = int256(_transferVolume1HourAgoBucket + 1);
        }
        else if (volumeHasIncreased) {
            transferVolumeRatio = int256(_transferVolume1HourAgoBucket / _transferVolume2HoursAgoBucket);
        }
        else {
            transferVolumeRatio = -int256(_transferVolume2HoursAgoBucket / _transferVolume1HourAgoBucket);
        }

        // find the burn percent modifier and the new burn percent
        // round division to 10000
        int256 preciseNewBurnPercent = calculateBurnPercentFromTransferVolumeRatio(
            precisePreviousBurnPercent,
            transferVolumeRatio * divisionPrecision, 
            preciseMinBurnPercent, 
            preciseMaxBurnPercent
        );

        // convert the burn percent back to burn divisor, without forgetting division precision
        return uint256((100 * divisionPrecision) / preciseNewBurnPercent);
    }

    function calculateBurnPercentFromTransferVolumeRatio(int256 _previousBurnPercent, int256 _transferVolumeRatio, int256 _minBurnPercent, int256 _maxBurnPercent) public pure returns (int256) {
        // this is a pure function, don't use globals min and max
        // because might use division precision

        // previous burn percent should never be bigger or smaller than max or min
        // but if the exception occurs it messes up the curve
        if (_previousBurnPercent < _minBurnPercent) {
            _previousBurnPercent = _minBurnPercent;
        }
        else if (_previousBurnPercent > _maxBurnPercent) {
            _previousBurnPercent = _maxBurnPercent;
        }

        // attempt to find burn divisor curve
        int256 burnPercentModifier = _transferVolumeRatio;
        int8 maxAttempt = 5;
        while (true) {
            int256 newBurnPercent = _previousBurnPercent + burnPercentModifier;
            // found burn divisor curve
            if (newBurnPercent < _maxBurnPercent && newBurnPercent > _minBurnPercent) {
                return _previousBurnPercent + burnPercentModifier;
            }

            // curve formula brings too little change to burn divisor, not worth it
            if (maxAttempt-- == 0) {
                // instead of returning the value very close to the min or max
                // return min or max instead to avoid wasting gas
                if (_transferVolumeRatio > 0) {
                    // if _transferVolumeRatio is positive, burn should increase
                    return _maxBurnPercent;
                }
                else {
                    // bigger than max would give min
                    return _minBurnPercent;
                }
            }

            // divide by 2 until burnPercent + burnPercentModifier
            // fit between min and max to find the perfect curve
            burnPercentModifier = burnPercentModifier / 2;
        }
    }

    function transfer(address recipient, uint256 amount) public override returns (bool) {
        // if time for rebase, freeze all transfers until someone calls rebase
        require(requiresRebase() == false, "transfers are frozen until someone calls rebase");
        require(transfersAreFrozenAfterRebase() == false, "transfers are frozen for a few minutes after rebase");
        super.transfer(recipient, amount);
        updateTransferVolume(amount);
        return true;
    }

    function transferFrom(address sender, address recipient, uint256 amount) public override returns (bool) {
        // if time for rebase, freeze all transfers until someone calls rebase
        require(requiresRebase() == false, "transfers are frozen until someone calls rebase");
        require(transfersAreFrozenAfterRebase() == false, "transfers are frozen for a few minutes after rebase");
        super.transferFrom(sender, recipient, amount);
        updateTransferVolume(amount);
        return true;
    }

    function updateTransferVolume(uint256 volume) internal virtual {
        // keep track of transfer volume on each transfer
        // store the volume without elastic multiplier to know the real volume
        transferVolumeNowBucket = transferVolumeNowBucket.add(volume.div(elasticMultiplier()));

        // if 1 hour has passed, requires new rebase
        if (transferVolumeNowBucketTimestamp != getTransferVolumeNowBucketTimestamp()) {
            setRequiresRebase(true);
        }
    }

    function transfersAreFrozenAfterRebase() public view returns (bool) {
        // use < and not <= to always stop transfers that occur on the same block as a rebase
        // even if transferAfterRebaseFreezeTime is set to 0
        if (lastRebaseTimestamp + transferAfterRebaseFreezeTime < block.timestamp) {
            return false;
        }
        return true;
    }

    // if should rebase, freeze all transfers until someone calls rebase
    bool private _requiresRebase = false;
    // only require rebase on the next block
    uint256 private lastSetRequiresRebaseTimestamp;

    function requiresRebase() public view returns (bool) {
        if (_requiresRebase) {
            if (lastSetRequiresRebaseTimestamp < block.timestamp) {
                return true;
            }
        }
        return false;
    }

    function setRequiresRebase (bool value) internal {
        _requiresRebase = value;
        lastSetRequiresRebaseTimestamp = block.timestamp;
    }

    // mint half the burn to the uniswap pair to incentivize liquidity
    // swapping or providing liquidity on any other pairs will cause
    // loss of funds after every rebase
    address public bloodyEthUniswapPair;
    address public bloodyNiceUniswapPair;
    address public bloodyRotUniswapPair;

    // called by owner after contract is deployed to set
    // the uniswap pair which receives half the burn to incentivize liquidity
    // then contract ownership is transfered to
    // address 0x0000000000000000000000000000000000000000 and can never be called again
    function setUniswapPairs(address _bloodyEthUniswapPair, address _bloodyNiceUniswapPair, address _bloodyRotUniswapPair) public virtual onlyOwner {
        bloodyEthUniswapPair = _bloodyEthUniswapPair;
        bloodyNiceUniswapPair = _bloodyNiceUniswapPair;
        bloodyRotUniswapPair = _bloodyRotUniswapPair;
    }

    // mint half the burn to the uniswap pairs
    // make sure to sync the uniswap pairs after
    // reward is half of the burn split into 3 pairs
    function mintToUniswapPairs(uint256 uniswapPairRewardAmount) internal {
        if (uniswapPairRewardAmount == 0) {
            return;
        }
        // reward is half of the burn split into 3 pairs
        uint256 amountPerPair = uniswapPairRewardAmount.div(3);
        if (uniswapPairRewardAmount == 0) {
            return;
        }
        if (bloodyEthUniswapPair != address(0)) {
            _mint(bloodyEthUniswapPair, amountPerPair);
        }
        if (bloodyNiceUniswapPair != address(0)) {
            _mint(bloodyNiceUniswapPair, amountPerPair);
        }
        if (bloodyRotUniswapPair != address(0)) {
            _mint(bloodyRotUniswapPair, amountPerPair);
        }
    }

    // if uniswap pairs are not synced loss of
    // funds will occur after rebase or reward minting
    function syncUniswapPairs() internal {
        if (bloodyEthUniswapPair != address(0)) {
            IUniswapV2Pair(bloodyEthUniswapPair).sync();
        }
        if (bloodyNiceUniswapPair != address(0)) {
            IUniswapV2Pair(bloodyNiceUniswapPair).sync();
        }
        if (bloodyRotUniswapPair != address(0)) {
            IUniswapV2Pair(bloodyRotUniswapPair).sync();
        }
    }

    // called by owner after contract is deployed to airdrop
    // tokens to inital holders, then contract ownership is transfered to
    // address 0x0000000000000000000000000000000000000000 and can never be called again
    function airdrop(address[] memory recipients, uint256[] memory amounts) public onlyOwner {
        for (uint i = 0; i < recipients.length; i++) {
            _mint(recipients[i], amounts[i]);
        }
    }

    // util external function for website
    function totalSupplyBurnedElastic() external view returns (uint256) {
        return totalSupplyBurned().mul(elasticMultiplier());
    }

    // util external function for website
    // half the burn is minted to the uniswap pools
    // might not be accurate if uniswap pools aren't set yet
    function totalSupplyBurnedMinusRewards() public view returns (uint256) {
        return totalSupplyBurned().div(2);
    }

    // util external function for website
    function timeUntilNextRebase() external view returns (uint256) {
        uint256 rebaseTime = transferVolumeNowBucketTimestamp + 3600;
        if (rebaseTime <= block.timestamp) {
            return 0;
        }
        return rebaseTime - block.timestamp;
    }

    // util external function for website
    function nextRebaseTimestamp() external view returns (uint256) {
        return transferVolumeNowBucketTimestamp + 3600;
    }

    // util external function for website
    function transfersAreFrozen() external view returns (bool) {
        if (transfersAreFrozenAfterRebase() || requiresRebase()) {
            return true;
        }
        return false;
    }

    // util external function for website
    function transfersAreFrozenRequiresRebase() external view returns (bool) {
        return requiresRebase();
    }

    // util external function for website
    function timeUntilNextTransferAfterRebaseUnfreeze() external view virtual returns (uint256) {
        uint256 unfreezeTime = lastRebaseTimestamp + transferAfterRebaseFreezeTime;
        if (unfreezeTime <= block.timestamp) {
            return 0;
        }
        return unfreezeTime - block.timestamp;
    }

    // util external function for website
    function nextTransferAfterRebaseUnfreezeTimestamp() external view virtual returns (uint256) {
        return lastRebaseTimestamp + transferAfterRebaseFreezeTime;
    }

    // util external function for website
    function balanceInUniswapPair(address user, address uniswapPair) public view returns (uint256) {
        if (uniswapPair == address(0)) {
            return 0;
        }
        uint256 pairBloodyBalance = balanceOf(uniswapPair);
        if (pairBloodyBalance == 0) {
            return 0;
        }
        uint256 userLpBalance = IUniswapV2Pair(uniswapPair).balanceOf(user);
        if (userLpBalance == 0) {
            return 0;
        }
        uint256 lpTotalSupply = IUniswapV2Pair(uniswapPair).totalSupply();
        uint256 divisionPrecision = 1e12;
        uint256 userLpTotalOwnershipRatio = userLpBalance.mul(divisionPrecision).div(lpTotalSupply);
        return pairBloodyBalance.mul(userLpTotalOwnershipRatio).div(divisionPrecision);
    }

    // util external function for website
    function balanceInUniswapPairs(address user) public view returns (uint256) {
        return balanceInUniswapPair(user, bloodyEthUniswapPair)
            .add(balanceInUniswapPair(user, bloodyNiceUniswapPair))
            .add(balanceInUniswapPair(user, bloodyRotUniswapPair));
    }

    // util external function for website
    function balanceIncludingUniswapPairs(address user) external view returns (uint256) {
        return balanceOf(user).add(balanceInUniswapPairs(user));
    }
}

interface IUniswapV2Pair {
    function sync() external;
    function balanceOf(address owner) external view returns (uint);
    function totalSupply() external view returns (uint);
}

Contract Security Audit

Contract ABI

[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"spender","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"transferVolumeNowBucketTimestamp","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"burnDivisor","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"elasticMultiplier","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"transferVolume1HourAgoBucket","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"transferVolume2HoursAgoBucket","type":"uint256"}],"name":"Rebase","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[{"internalType":"address[]","name":"recipients","type":"address[]"},{"internalType":"uint256[]","name":"amounts","type":"uint256[]"}],"name":"airdrop","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":"user","type":"address"},{"internalType":"address","name":"uniswapPair","type":"address"}],"name":"balanceInUniswapPair","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"user","type":"address"}],"name":"balanceInUniswapPairs","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"user","type":"address"}],"name":"balanceIncludingUniswapPairs","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"balanceOfRaw","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"bloodyEthUniswapPair","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"bloodyNiceUniswapPair","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"bloodyRotUniswapPair","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"burnDivisor","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_previousBurnDivisor","type":"uint256"},{"internalType":"uint256","name":"_transferVolume1HourAgoBucket","type":"uint256"},{"internalType":"uint256","name":"_transferVolume2HoursAgoBucket","type":"uint256"}],"name":"calculateBurnDivisor","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"int256","name":"_previousBurnPercent","type":"int256"},{"internalType":"int256","name":"_transferVolumeRatio","type":"int256"},{"internalType":"int256","name":"_minBurnPercent","type":"int256"},{"internalType":"int256","name":"_maxBurnPercent","type":"int256"}],"name":"calculateBurnPercentFromTransferVolumeRatio","outputs":[{"internalType":"int256","name":"","type":"int256"}],"stateMutability":"pure","type":"function"},{"inputs":[],"name":"decimals","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"subtractedValue","type":"uint256"}],"name":"decreaseAllowance","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"elasticMultiplier","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getTransferVolumeNowBucketTimestamp","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"addedValue","type":"uint256"}],"name":"increaseAllowance","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"lastRebaseTimestamp","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxBurnDivisor","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxBurnPercent","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"minBurnDivisor","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"minBurnPercent","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"nextRebaseTimestamp","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"nextTransferAfterRebaseUnfreezeTimestamp","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"rebase","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"requiresRebase","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_bloodyEthUniswapPair","type":"address"},{"internalType":"address","name":"_bloodyNiceUniswapPair","type":"address"},{"internalType":"address","name":"_bloodyRotUniswapPair","type":"address"}],"name":"setUniswapPairs","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"timeUntilNextRebase","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"timeUntilNextTransferAfterRebaseUnfreeze","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupplyBurned","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupplyBurnedElastic","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupplyBurnedMinusRewards","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupplyElastic","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":[],"name":"transferAfterRebaseFreezeTime","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"sender","type":"address"},{"internalType":"address","name":"recipient","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transferFrom","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"transferVolume1HourAgoBucket","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"transferVolumeNowBucket","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"transferVolumeNowBucketTimestamp","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"transfersAreFrozen","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"transfersAreFrozenAfterRebase","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"transfersAreFrozenRequiresRebase","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"}]

6080604052606460065560646008556000600f60006101000a81548160ff0219169083151502179055503480156200003657600080fd5b506040518060400160405280600b81526020017f426c6f6f6479546f6b656e0000000000000000000000000000000000000000008152506040518060400160405280600681526020017f424c4f4f44590000000000000000000000000000000000000000000000000000815250818181818160039080519060200190620000bf929190620002dd565b508060049080519060200190620000d8929190620002dd565b506012600560006101000a81548160ff021916908360ff16021790555050505050505060006200010d620001f560201b60201c565b905080600960006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508073ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a350620001be6064620001fd60201b60201c565b620001d0600a6200026260201b60201c565b61012c600e81905550620001e9620002c760201b60201c565b600c819055506200038c565b600033905090565b6000811162000258576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252603181526020018062003cc56031913960400191505060405180910390fd5b8060068190555050565b60008111620002bd576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252603d81526020018062003c88603d913960400191505060405180910390fd5b8060088190555050565b6000610e104281620002d557fe5b064203905090565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f106200032057805160ff191683800117855562000351565b8280016001018555821562000351579182015b828111156200035057825182559160200191906001019062000333565b5b50905062000360919062000364565b5090565b6200038991905b80821115620003855760008160009055506001016200036b565b5090565b90565b6138ec806200039c6000396000f3fe608060405234801561001057600080fd5b50600436106102d65760003560e01c80638da5cb5b11610182578063be378b89116100e9578063f00dcaee116100a2578063f42f40c21161007c578063f42f40c214610e6b578063f7752afe14610e89578063f7a9f6cf14610f01578063f89b601114610f1f576102d6565b8063f00dcaee14610dbf578063f047c10d14610e09578063f2fde38b14610e27576102d6565b8063be378b8914610c11578063c3d7402614610c69578063c962c2df14610c87578063c9b7d92814610ca5578063d661e90a14610cc3578063dd62ed3e14610d47576102d6565b8063a9059cbb1161013b578063a9059cbb14610ae3578063af14052c14610b49578063b6ef70bc14610b53578063b863a7cb14610bb3578063b86a2fd714610bd5578063ba52c8b714610bf3576102d6565b80638da5cb5b14610952578063914344cf1461099c57806395d89b41146109be5780639cc32cdb14610a41578063a457c2d714610a5f578063a779a81b14610ac5576102d6565b80632bb2bb061161024157806354f5bffa116101fa578063715018a6116101d4578063715018a6146108ee5780637fba744e146108f8578063859f6d8a146109165780638a991b7f14610934576102d6565b806354f5bffa1461072c578063672434821461074a57806370a0823114610896576102d6565b80632bb2bb06146105f2578063313ce5671461061057806339509351146106345780634456e3271461069a578063486ed6e2146106b85780634f656b861461070e576102d6565b806317c5b5cb1161029357806317c5b5cb1461047a57806318160ddd1461049c57806323b872dd146104ba578063240c98681461054057806326fe6a8c1461058a578063295f42a9146105d4576102d6565b806305ee7414146102db57806306fdde03146102f9578063095ea7b31461037c5780630b5d1a54146103e2578063106cdceb1461043a578063106f3b6e1461045c575b600080fd5b6102e3610f77565b6040518082815260200191505060405180910390f35b610301610f9a565b6040518080602001828103825283818151815260200191508051906020019080838360005b83811015610341578082015181840152602081019050610326565b50505050905090810190601f16801561036e5780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b6103c86004803603604081101561039257600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff1690602001909291908035906020019092919050505061103c565b604051808215151515815260200191505060405180910390f35b610424600480360360208110156103f857600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919050505061105a565b6040518082815260200191505060405180910390f35b610442611086565b604051808215151515815260200191505060405180910390f35b6104646110a7565b6040518082815260200191505060405180910390f35b6104826110ac565b604051808215151515815260200191505060405180910390f35b6104a46110df565b6040518082815260200191505060405180910390f35b610526600480360360608110156104d057600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803590602001909291905050506110e9565b604051808215151515815260200191505060405180910390f35b6105486111d2565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b6105926111f8565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b6105dc61121e565b6040518082815260200191505060405180910390f35b6105fa611245565b6040518082815260200191505060405180910390f35b61061861124b565b604051808260ff1660ff16815260200191505060405180910390f35b6106806004803603604081101561064a57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190505050611262565b604051808215151515815260200191505060405180910390f35b6106a2611315565b6040518082815260200191505060405180910390f35b6106f8600480360360608110156106ce57600080fd5b8101908080359060200190929190803590602001909291908035906020019092919050505061131b565b6040518082815260200191505060405180910390f35b61071661148b565b6040518082815260200191505060405180910390f35b610734611495565b6040518082815260200191505060405180910390f35b6108946004803603604081101561076057600080fd5b810190808035906020019064010000000081111561077d57600080fd5b82018360208201111561078f57600080fd5b803590602001918460208302840111640100000000831117156107b157600080fd5b919080806020026020016040519081016040528093929190818152602001838360200280828437600081840152601f19601f8201169050808301925050505050505091929192908035906020019064010000000081111561081157600080fd5b82018360208201111561082357600080fd5b8035906020019184602083028401116401000000008311171561084557600080fd5b919080806020026020016040519081016040528093929190818152602001838360200280828437600081840152601f19601f8201169050808301925050505050505091929192905050506114bd565b005b6108d8600480360360208110156108ac57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff1690602001909291905050506115d8565b6040518082815260200191505060405180910390f35b6108f66115fe565b005b610900611789565b6040518082815260200191505060405180910390f35b61091e611797565b6040518082815260200191505060405180910390f35b61093c6117a1565b6040518082815260200191505060405180910390f35b61095a6117a7565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b6109a46117d1565b604051808215151515815260200191505060405180910390f35b6109c6611800565b6040518080602001828103825283818151815260200191508051906020019080838360005b83811015610a065780820151818401526020810190506109eb565b50505050905090810190601f168015610a335780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b610a496118a2565b6040518082815260200191505060405180910390f35b610aab60048036036040811015610a7557600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803590602001909291905050506118c9565b604051808215151515815260200191505060405180910390f35b610acd611996565b6040518082815260200191505060405180910390f35b610b2f60048036036040811015610af957600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803590602001909291905050506119ab565b604051808215151515815260200191505060405180910390f35b610b51611a92565b005b610b9d60048036036080811015610b6957600080fd5b8101908080359060200190929190803590602001909291908035906020019092919080359060200190929190505050611c0e565b6040518082815260200191505060405180910390f35b610bbb611cb7565b604051808215151515815260200191505060405180910390f35b610bdd611cc6565b6040518082815260200191505060405180910390f35b610bfb611ccc565b6040518082815260200191505060405180910390f35b610c5360048036036020811015610c2757600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050611cd6565b6040518082815260200191505060405180910390f35b610c71611ce8565b6040518082815260200191505060405180910390f35b610c8f611ced565b6040518082815260200191505060405180910390f35b610cad611cf3565b6040518082815260200191505060405180910390f35b610d4560048036036060811015610cd957600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050611d02565b005b610da960048036036040811015610d5d57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050611e94565b6040518082815260200191505060405180910390f35b610dc7611f1b565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b610e11611f41565b6040518082815260200191505060405180910390f35b610e6960048036036020811015610e3d57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050611f4f565b005b610e7361215f565b6040518082815260200191505060405180910390f35b610eeb60048036036040811015610e9f57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050612181565b6040518082815260200191505060405180910390f35b610f0961239b565b6040518082815260200191505060405180910390f35b610f6160048036036020811015610f3557600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff1690602001909291905050506123aa565b6040518082815260200191505060405180910390f35b6000610f95600854610f876110df565b61245990919063ffffffff16565b905090565b606060038054600181600116156101000203166002900480601f0160208091040260200160405190810160405280929190818152602001828054600181600116156101000203166002900480156110325780601f1061100757610100808354040283529160200191611032565b820191906000526020600020905b81548152906001019060200180831161101557829003601f168201915b5050505050905090565b60006110506110496124df565b84846124e7565b6001905092915050565b600061107f611068836123aa565b611071846115d8565b6126de90919063ffffffff16565b9050919050565b600042600e54600d5401101561109f57600090506110a4565b600190505b90565b600181565b6000600f60009054906101000a900460ff16156110d7574260105410156110d657600190506110dc565b5b600090505b90565b6000600254905090565b60008015156110f66110ac565b15151461114e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602f81526020018061377e602f913960400191505060405180910390fd5b6000151561115a611086565b1515146111b2576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252603381526020018061367e6033913960400191505060405180910390fd5b6111bd848484612766565b506111c782612790565b600190509392505050565b601360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b601260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600080610e10600c5401905042811161123b576000915050611242565b4281039150505b90565b600a5481565b6000600560009054906101000a900460ff16905090565b600061130b61126f6124df565b8461130685600160006112806124df565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546126de90919063ffffffff16565b6124e7565b6001905092915050565b600e5481565b60008061271090506000816001029050600082600c029050600087141561135257600c60648161134757fe5b049350505050611484565b600087846064028161136057fe5b059050858714156113b5578281121561138a57600160648161137e57fe5b04945050505050611484565b818113156113a957600c60648161139d57fe5b04945050505050611484565b87945050505050611484565b6000868811905080156113e6578282126113e157600c6064816113d457fe5b0495505050505050611484565b611406565b8382136114055760016064816113f857fe5b0495505050505050611484565b5b60008089141561141e5760018801600003905061145b565b60008814156114325760018901905061145a565b81156114495787898161144157fe5b049050611459565b88888161145257fe5b0460000390505b5b5b600061146b848884028888611c0e565b905080876064028161147957fe5b059750505050505050505b9392505050565b6000600854905090565b60006114b86114a261148b565b6114aa611797565b61245990919063ffffffff16565b905090565b6114c56124df565b73ffffffffffffffffffffffffffffffffffffffff16600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614611587576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657281525060200191505060405180910390fd5b60008090505b82518110156115d3576115c68382815181106115a557fe5b60200260200101518383815181106115b957fe5b60200260200101516127e2565b808060010191505061158d565b505050565b60006115f76008546115e9846128fa565b61245990919063ffffffff16565b9050919050565b6116066124df565b73ffffffffffffffffffffffffffffffffffffffff16600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16146116c8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657281525060200191505060405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff16600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a36000600960006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550565b6000610e10600c5401905090565b6000600754905090565b600b5481565b6000600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b60006117db611086565b806117ea57506117e96110ac565b5b156117f857600190506117fd565b600090505b90565b606060048054600181600116156101000203166002900480601f0160208091040260200160405190810160405280929190818152602001828054600181600116156101000203166002900480156118985780601f1061186d57610100808354040283529160200191611898565b820191906000526020600020905b81548152906001019060200180831161187b57829003601f168201915b5050505050905090565b600080600e54600d540190504281116118bf5760009150506118c6565b4281039150505b90565b600061198c6118d66124df565b846119878560405180606001604052806025815260200161389260259139600160006119006124df565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008a73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546129429092919063ffffffff16565b6124e7565b6001905092915050565b6000610e1042816119a357fe5b064203905090565b60008015156119b86110ac565b151514611a10576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602f81526020018061377e602f913960400191505060405180910390fd5b60001515611a1c611086565b151514611a74576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252603381526020018061367e6033913960400191505060405180910390fd5b611a7e8383612a02565b50611a8882612790565b6001905092915050565b60011515611a9e6110ac565b151514611af6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260228152602001806138706022913960400191505060405180910390fd5b6000600b549050600a54600b819055506000600a81905550611b16611996565b600c819055506000611b4d6002611b3f611b2e611ccc565b600b54612a2a90919063ffffffff16565b612a2a90919063ffffffff16565b9050611b5881612a74565b6000611b6e611b65611ccc565b600b548561131b565b90506000611b87826103e8612a2a90919063ffffffff16565b9050611b9282612c37565b611b9b81612c9a565b600c547fa904dcf42a3461c90173c0b966672b2cb4350e529ea12d44e562fcec438363248383600b54886040518085815260200184815260200183815260200182815260200194505050505060405180910390a2611bf7612cfd565b611c016000612f8a565b42600d8190555050505050565b600082851215611c2057829450611c2d565b81851315611c2c578194505b5b60008490506000600590505b600115611cac57600082880190508481128015611c5557508581135b15611c67578288019350505050611caf565b6000828060019003935060000b1415611c99576000871315611c8e57849350505050611caf565b859350505050611caf565b60028381611ca357fe5b05925050611c39565b50505b949350505050565b6000611cc16110ac565b905090565b600d5481565b6000600654905090565b6000611ce1826128fa565b9050919050565b600c81565b600c5481565b600c606481611cfe57fe5b0481565b611d0a6124df565b73ffffffffffffffffffffffffffffffffffffffff16600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614611dcc576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657281525060200191505060405180910390fd5b82601160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555081601260006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555080601360006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550505050565b6000600160008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905092915050565b601160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6000600e54600d5401905090565b611f576124df565b73ffffffffffffffffffffffffffffffffffffffff16600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614612019576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657281525060200191505060405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16141561209f576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260268152602001806136d36026913960400191505060405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a380600960006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b600061217c600261216e611797565b612a2a90919063ffffffff16565b905090565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156121c05760009050612395565b60006121cb836115d8565b905060008114156121e0576000915050612395565b60008373ffffffffffffffffffffffffffffffffffffffff166370a08231866040518263ffffffff1660e01b8152600401808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060206040518083038186803b15801561225f57600080fd5b505afa158015612273573d6000803e3d6000fd5b505050506040513d602081101561228957600080fd5b8101908080519060200190929190505050905060008114156122b057600092505050612395565b60008473ffffffffffffffffffffffffffffffffffffffff166318160ddd6040518163ffffffff1660e01b815260040160206040518083038186803b1580156122f857600080fd5b505afa15801561230c573d6000803e3d6000fd5b505050506040513d602081101561232257600080fd5b81019080805190602001909291905050509050600064e8d4a510009050600061236683612358848761245990919063ffffffff16565b612a2a90919063ffffffff16565b905061238d8261237f838861245990919063ffffffff16565b612a2a90919063ffffffff16565b955050505050505b92915050565b60016064816123a657fe5b0481565b60006124526123db83601360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16612181565b61244461240a85601260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16612181565b61243686601160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16612181565b6126de90919063ffffffff16565b6126de90919063ffffffff16565b9050919050565b60008083141561246c57600090506124d9565b600082840290508284828161247d57fe5b04146124d4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260218152602001806137de6021913960400191505060405180910390fd5b809150505b92915050565b600033905090565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16141561256d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602481526020018061384c6024913960400191505060405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156125f3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260228152602001806136f96022913960400191505060405180910390fd5b80600160008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925836040518082815260200191505060405180910390a3505050565b60008082840190508381101561275c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601b8152602001807f536166654d6174683a206164646974696f6e206f766572666c6f77000000000081525060200191505060405180910390fd5b8091505092915050565b6000612787848461278260085486612a2a90919063ffffffff16565b612fae565b90509392505050565b6127be6127ad61279e61148b565b83612a2a90919063ffffffff16565b600a546126de90919063ffffffff16565b600a819055506127cc611996565b600c54146127df576127de6001612f8a565b5b50565b6127f7816002546126de90919063ffffffff16565b60028190555061284e816000808573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546126de90919063ffffffff16565b6000808473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508173ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef836040518082815260200191505060405180910390a35050565b60008060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b60008383111582906129ef576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825283818151815260200191508051906020019080838360005b838110156129b4578082015181840152602081019050612999565b50505050905090810190601f1680156129e15780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b5060008385039050809150509392505050565b6000612a2283612a1d60085485612a2a90919063ffffffff16565b612ff9565b905092915050565b6000612a6c83836040518060400160405280601a81526020017f536166654d6174683a206469766973696f6e206279207a65726f000000000000815250613042565b905092915050565b6000811415612a8257612c34565b6000612a98600383612a2a90919063ffffffff16565b90506000821415612aa95750612c34565b600073ffffffffffffffffffffffffffffffffffffffff16601160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614612b2c57612b2b601160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16826127e2565b5b600073ffffffffffffffffffffffffffffffffffffffff16601260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614612baf57612bae601260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16826127e2565b5b600073ffffffffffffffffffffffffffffffffffffffff16601360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614612c3257612c31601360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16826127e2565b5b505b50565b60008111612c90576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260318152602001806137ad6031913960400191505060405180910390fd5b8060068190555050565b60008111612cf3576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252603d815260200180613741603d913960400191505060405180910390fd5b8060088190555050565b600073ffffffffffffffffffffffffffffffffffffffff16601160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614612dd657601160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663fff6cae96040518163ffffffff1660e01b8152600401600060405180830381600087803b158015612dbd57600080fd5b505af1158015612dd1573d6000803e3d6000fd5b505050505b600073ffffffffffffffffffffffffffffffffffffffff16601260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614612eaf57601260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663fff6cae96040518163ffffffff1660e01b8152600401600060405180830381600087803b158015612e9657600080fd5b505af1158015612eaa573d6000803e3d6000fd5b505050505b600073ffffffffffffffffffffffffffffffffffffffff16601360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614612f8857601360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663fff6cae96040518163ffffffff1660e01b8152600401600060405180830381600087803b158015612f6f57600080fd5b505af1158015612f83573d6000803e3d6000fd5b505050505b565b80600f60006101000a81548160ff0219169083151502179055504260108190555050565b600080612fc660065484612a2a90919063ffffffff16565b9050612fd28582613108565b612fef8585612fea848761313190919063ffffffff16565b61317b565b9150509392505050565b60008061301160065484612a2a90919063ffffffff16565b905061301d3382613108565b61303984613034838661313190919063ffffffff16565b613254565b91505092915050565b600080831182906130ee576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825283818151815260200191508051906020019080838360005b838110156130b3578082015181840152602081019050613098565b50505050905090810190601f1680156130e05780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b5060008385816130fa57fe5b049050809150509392505050565b6131128282613272565b613127816007546126de90919063ffffffff16565b6007819055505050565b600061317383836040518060400160405280601e81526020017f536166654d6174683a207375627472616374696f6e206f766572666c6f770000815250612942565b905092915050565b60006131888484846133a4565b613249846131946124df565b613244856040518060600160405280602881526020016137ff60289139600160008b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006131fa6124df565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546129429092919063ffffffff16565b6124e7565b600190509392505050565b60006132686132616124df565b84846133a4565b6001905092915050565b6132dd816040518060600160405280602281526020016136b1602291396000808673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546129429092919063ffffffff16565b6000808473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055506133348160025461313190919063ffffffff16565b600281905550600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef836040518082815260200191505060405180910390a35050565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16141561342a576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260258152602001806138276025913960400191505060405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156134b0576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602381526020018061365b6023913960400191505060405180910390fd5b61351b8160405180606001604052806026815260200161371b602691396000808773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546129429092919063ffffffff16565b6000808573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055506135ae816000808573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546126de90919063ffffffff16565b6000808473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef836040518082815260200191505060405180910390a350505056fe45524332303a207472616e7366657220746f20746865207a65726f20616464726573737472616e7366657273206172652066726f7a656e20666f72206120666577206d696e757465732061667465722072656261736545524332303a206275726e20616d6f756e7420657863656564732062616c616e63654f776e61626c653a206e6577206f776e657220697320746865207a65726f206164647265737345524332303a20617070726f766520746f20746865207a65726f206164647265737345524332303a207472616e7366657220616d6f756e7420657863656564732062616c616e63655f736574456c61737469634d756c7469706c69657220656c61737469634d756c7469706c696572206d75737420626520626967676572207468616e20307472616e7366657273206172652066726f7a656e20756e74696c20736f6d656f6e652063616c6c73207265626173655f7365744275726e44697669736f72206275726e44697669736f72206d75737420626520626967676572207468616e2030536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f7745524332303a207472616e7366657220616d6f756e74206578636565647320616c6c6f77616e636545524332303a207472616e736665722066726f6d20746865207a65726f206164647265737345524332303a20617070726f76652066726f6d20746865207a65726f2061646472657373736f6d656f6e6520656c73652063616c6c65642072656261736520616c726561647945524332303a2064656372656173656420616c6c6f77616e63652062656c6f77207a65726fa26469706673582212208004802ec84dcc94442e25491577b7ee0a379b53cfec17e5e98bd9c34013923864736f6c634300060200335f736574456c61737469634d756c7469706c69657220656c61737469634d756c7469706c696572206d75737420626520626967676572207468616e20305f7365744275726e44697669736f72206275726e44697669736f72206d75737420626520626967676572207468616e2030

Deployed Bytecode

0x608060405234801561001057600080fd5b50600436106102d65760003560e01c80638da5cb5b11610182578063be378b89116100e9578063f00dcaee116100a2578063f42f40c21161007c578063f42f40c214610e6b578063f7752afe14610e89578063f7a9f6cf14610f01578063f89b601114610f1f576102d6565b8063f00dcaee14610dbf578063f047c10d14610e09578063f2fde38b14610e27576102d6565b8063be378b8914610c11578063c3d7402614610c69578063c962c2df14610c87578063c9b7d92814610ca5578063d661e90a14610cc3578063dd62ed3e14610d47576102d6565b8063a9059cbb1161013b578063a9059cbb14610ae3578063af14052c14610b49578063b6ef70bc14610b53578063b863a7cb14610bb3578063b86a2fd714610bd5578063ba52c8b714610bf3576102d6565b80638da5cb5b14610952578063914344cf1461099c57806395d89b41146109be5780639cc32cdb14610a41578063a457c2d714610a5f578063a779a81b14610ac5576102d6565b80632bb2bb061161024157806354f5bffa116101fa578063715018a6116101d4578063715018a6146108ee5780637fba744e146108f8578063859f6d8a146109165780638a991b7f14610934576102d6565b806354f5bffa1461072c578063672434821461074a57806370a0823114610896576102d6565b80632bb2bb06146105f2578063313ce5671461061057806339509351146106345780634456e3271461069a578063486ed6e2146106b85780634f656b861461070e576102d6565b806317c5b5cb1161029357806317c5b5cb1461047a57806318160ddd1461049c57806323b872dd146104ba578063240c98681461054057806326fe6a8c1461058a578063295f42a9146105d4576102d6565b806305ee7414146102db57806306fdde03146102f9578063095ea7b31461037c5780630b5d1a54146103e2578063106cdceb1461043a578063106f3b6e1461045c575b600080fd5b6102e3610f77565b6040518082815260200191505060405180910390f35b610301610f9a565b6040518080602001828103825283818151815260200191508051906020019080838360005b83811015610341578082015181840152602081019050610326565b50505050905090810190601f16801561036e5780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b6103c86004803603604081101561039257600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff1690602001909291908035906020019092919050505061103c565b604051808215151515815260200191505060405180910390f35b610424600480360360208110156103f857600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919050505061105a565b6040518082815260200191505060405180910390f35b610442611086565b604051808215151515815260200191505060405180910390f35b6104646110a7565b6040518082815260200191505060405180910390f35b6104826110ac565b604051808215151515815260200191505060405180910390f35b6104a46110df565b6040518082815260200191505060405180910390f35b610526600480360360608110156104d057600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803590602001909291905050506110e9565b604051808215151515815260200191505060405180910390f35b6105486111d2565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b6105926111f8565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b6105dc61121e565b6040518082815260200191505060405180910390f35b6105fa611245565b6040518082815260200191505060405180910390f35b61061861124b565b604051808260ff1660ff16815260200191505060405180910390f35b6106806004803603604081101561064a57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190505050611262565b604051808215151515815260200191505060405180910390f35b6106a2611315565b6040518082815260200191505060405180910390f35b6106f8600480360360608110156106ce57600080fd5b8101908080359060200190929190803590602001909291908035906020019092919050505061131b565b6040518082815260200191505060405180910390f35b61071661148b565b6040518082815260200191505060405180910390f35b610734611495565b6040518082815260200191505060405180910390f35b6108946004803603604081101561076057600080fd5b810190808035906020019064010000000081111561077d57600080fd5b82018360208201111561078f57600080fd5b803590602001918460208302840111640100000000831117156107b157600080fd5b919080806020026020016040519081016040528093929190818152602001838360200280828437600081840152601f19601f8201169050808301925050505050505091929192908035906020019064010000000081111561081157600080fd5b82018360208201111561082357600080fd5b8035906020019184602083028401116401000000008311171561084557600080fd5b919080806020026020016040519081016040528093929190818152602001838360200280828437600081840152601f19601f8201169050808301925050505050505091929192905050506114bd565b005b6108d8600480360360208110156108ac57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff1690602001909291905050506115d8565b6040518082815260200191505060405180910390f35b6108f66115fe565b005b610900611789565b6040518082815260200191505060405180910390f35b61091e611797565b6040518082815260200191505060405180910390f35b61093c6117a1565b6040518082815260200191505060405180910390f35b61095a6117a7565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b6109a46117d1565b604051808215151515815260200191505060405180910390f35b6109c6611800565b6040518080602001828103825283818151815260200191508051906020019080838360005b83811015610a065780820151818401526020810190506109eb565b50505050905090810190601f168015610a335780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b610a496118a2565b6040518082815260200191505060405180910390f35b610aab60048036036040811015610a7557600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803590602001909291905050506118c9565b604051808215151515815260200191505060405180910390f35b610acd611996565b6040518082815260200191505060405180910390f35b610b2f60048036036040811015610af957600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803590602001909291905050506119ab565b604051808215151515815260200191505060405180910390f35b610b51611a92565b005b610b9d60048036036080811015610b6957600080fd5b8101908080359060200190929190803590602001909291908035906020019092919080359060200190929190505050611c0e565b6040518082815260200191505060405180910390f35b610bbb611cb7565b604051808215151515815260200191505060405180910390f35b610bdd611cc6565b6040518082815260200191505060405180910390f35b610bfb611ccc565b6040518082815260200191505060405180910390f35b610c5360048036036020811015610c2757600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050611cd6565b6040518082815260200191505060405180910390f35b610c71611ce8565b6040518082815260200191505060405180910390f35b610c8f611ced565b6040518082815260200191505060405180910390f35b610cad611cf3565b6040518082815260200191505060405180910390f35b610d4560048036036060811015610cd957600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050611d02565b005b610da960048036036040811015610d5d57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050611e94565b6040518082815260200191505060405180910390f35b610dc7611f1b565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b610e11611f41565b6040518082815260200191505060405180910390f35b610e6960048036036020811015610e3d57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050611f4f565b005b610e7361215f565b6040518082815260200191505060405180910390f35b610eeb60048036036040811015610e9f57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050612181565b6040518082815260200191505060405180910390f35b610f0961239b565b6040518082815260200191505060405180910390f35b610f6160048036036020811015610f3557600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff1690602001909291905050506123aa565b6040518082815260200191505060405180910390f35b6000610f95600854610f876110df565b61245990919063ffffffff16565b905090565b606060038054600181600116156101000203166002900480601f0160208091040260200160405190810160405280929190818152602001828054600181600116156101000203166002900480156110325780601f1061100757610100808354040283529160200191611032565b820191906000526020600020905b81548152906001019060200180831161101557829003601f168201915b5050505050905090565b60006110506110496124df565b84846124e7565b6001905092915050565b600061107f611068836123aa565b611071846115d8565b6126de90919063ffffffff16565b9050919050565b600042600e54600d5401101561109f57600090506110a4565b600190505b90565b600181565b6000600f60009054906101000a900460ff16156110d7574260105410156110d657600190506110dc565b5b600090505b90565b6000600254905090565b60008015156110f66110ac565b15151461114e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602f81526020018061377e602f913960400191505060405180910390fd5b6000151561115a611086565b1515146111b2576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252603381526020018061367e6033913960400191505060405180910390fd5b6111bd848484612766565b506111c782612790565b600190509392505050565b601360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b601260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600080610e10600c5401905042811161123b576000915050611242565b4281039150505b90565b600a5481565b6000600560009054906101000a900460ff16905090565b600061130b61126f6124df565b8461130685600160006112806124df565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546126de90919063ffffffff16565b6124e7565b6001905092915050565b600e5481565b60008061271090506000816001029050600082600c029050600087141561135257600c60648161134757fe5b049350505050611484565b600087846064028161136057fe5b059050858714156113b5578281121561138a57600160648161137e57fe5b04945050505050611484565b818113156113a957600c60648161139d57fe5b04945050505050611484565b87945050505050611484565b6000868811905080156113e6578282126113e157600c6064816113d457fe5b0495505050505050611484565b611406565b8382136114055760016064816113f857fe5b0495505050505050611484565b5b60008089141561141e5760018801600003905061145b565b60008814156114325760018901905061145a565b81156114495787898161144157fe5b049050611459565b88888161145257fe5b0460000390505b5b5b600061146b848884028888611c0e565b905080876064028161147957fe5b059750505050505050505b9392505050565b6000600854905090565b60006114b86114a261148b565b6114aa611797565b61245990919063ffffffff16565b905090565b6114c56124df565b73ffffffffffffffffffffffffffffffffffffffff16600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614611587576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657281525060200191505060405180910390fd5b60008090505b82518110156115d3576115c68382815181106115a557fe5b60200260200101518383815181106115b957fe5b60200260200101516127e2565b808060010191505061158d565b505050565b60006115f76008546115e9846128fa565b61245990919063ffffffff16565b9050919050565b6116066124df565b73ffffffffffffffffffffffffffffffffffffffff16600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16146116c8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657281525060200191505060405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff16600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a36000600960006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550565b6000610e10600c5401905090565b6000600754905090565b600b5481565b6000600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b60006117db611086565b806117ea57506117e96110ac565b5b156117f857600190506117fd565b600090505b90565b606060048054600181600116156101000203166002900480601f0160208091040260200160405190810160405280929190818152602001828054600181600116156101000203166002900480156118985780601f1061186d57610100808354040283529160200191611898565b820191906000526020600020905b81548152906001019060200180831161187b57829003601f168201915b5050505050905090565b600080600e54600d540190504281116118bf5760009150506118c6565b4281039150505b90565b600061198c6118d66124df565b846119878560405180606001604052806025815260200161389260259139600160006119006124df565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008a73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546129429092919063ffffffff16565b6124e7565b6001905092915050565b6000610e1042816119a357fe5b064203905090565b60008015156119b86110ac565b151514611a10576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602f81526020018061377e602f913960400191505060405180910390fd5b60001515611a1c611086565b151514611a74576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252603381526020018061367e6033913960400191505060405180910390fd5b611a7e8383612a02565b50611a8882612790565b6001905092915050565b60011515611a9e6110ac565b151514611af6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260228152602001806138706022913960400191505060405180910390fd5b6000600b549050600a54600b819055506000600a81905550611b16611996565b600c819055506000611b4d6002611b3f611b2e611ccc565b600b54612a2a90919063ffffffff16565b612a2a90919063ffffffff16565b9050611b5881612a74565b6000611b6e611b65611ccc565b600b548561131b565b90506000611b87826103e8612a2a90919063ffffffff16565b9050611b9282612c37565b611b9b81612c9a565b600c547fa904dcf42a3461c90173c0b966672b2cb4350e529ea12d44e562fcec438363248383600b54886040518085815260200184815260200183815260200182815260200194505050505060405180910390a2611bf7612cfd565b611c016000612f8a565b42600d8190555050505050565b600082851215611c2057829450611c2d565b81851315611c2c578194505b5b60008490506000600590505b600115611cac57600082880190508481128015611c5557508581135b15611c67578288019350505050611caf565b6000828060019003935060000b1415611c99576000871315611c8e57849350505050611caf565b859350505050611caf565b60028381611ca357fe5b05925050611c39565b50505b949350505050565b6000611cc16110ac565b905090565b600d5481565b6000600654905090565b6000611ce1826128fa565b9050919050565b600c81565b600c5481565b600c606481611cfe57fe5b0481565b611d0a6124df565b73ffffffffffffffffffffffffffffffffffffffff16600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614611dcc576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657281525060200191505060405180910390fd5b82601160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555081601260006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555080601360006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550505050565b6000600160008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905092915050565b601160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6000600e54600d5401905090565b611f576124df565b73ffffffffffffffffffffffffffffffffffffffff16600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614612019576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657281525060200191505060405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16141561209f576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260268152602001806136d36026913960400191505060405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a380600960006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b600061217c600261216e611797565b612a2a90919063ffffffff16565b905090565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156121c05760009050612395565b60006121cb836115d8565b905060008114156121e0576000915050612395565b60008373ffffffffffffffffffffffffffffffffffffffff166370a08231866040518263ffffffff1660e01b8152600401808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060206040518083038186803b15801561225f57600080fd5b505afa158015612273573d6000803e3d6000fd5b505050506040513d602081101561228957600080fd5b8101908080519060200190929190505050905060008114156122b057600092505050612395565b60008473ffffffffffffffffffffffffffffffffffffffff166318160ddd6040518163ffffffff1660e01b815260040160206040518083038186803b1580156122f857600080fd5b505afa15801561230c573d6000803e3d6000fd5b505050506040513d602081101561232257600080fd5b81019080805190602001909291905050509050600064e8d4a510009050600061236683612358848761245990919063ffffffff16565b612a2a90919063ffffffff16565b905061238d8261237f838861245990919063ffffffff16565b612a2a90919063ffffffff16565b955050505050505b92915050565b60016064816123a657fe5b0481565b60006124526123db83601360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16612181565b61244461240a85601260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16612181565b61243686601160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16612181565b6126de90919063ffffffff16565b6126de90919063ffffffff16565b9050919050565b60008083141561246c57600090506124d9565b600082840290508284828161247d57fe5b04146124d4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260218152602001806137de6021913960400191505060405180910390fd5b809150505b92915050565b600033905090565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16141561256d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602481526020018061384c6024913960400191505060405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156125f3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260228152602001806136f96022913960400191505060405180910390fd5b80600160008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925836040518082815260200191505060405180910390a3505050565b60008082840190508381101561275c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601b8152602001807f536166654d6174683a206164646974696f6e206f766572666c6f77000000000081525060200191505060405180910390fd5b8091505092915050565b6000612787848461278260085486612a2a90919063ffffffff16565b612fae565b90509392505050565b6127be6127ad61279e61148b565b83612a2a90919063ffffffff16565b600a546126de90919063ffffffff16565b600a819055506127cc611996565b600c54146127df576127de6001612f8a565b5b50565b6127f7816002546126de90919063ffffffff16565b60028190555061284e816000808573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546126de90919063ffffffff16565b6000808473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508173ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef836040518082815260200191505060405180910390a35050565b60008060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b60008383111582906129ef576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825283818151815260200191508051906020019080838360005b838110156129b4578082015181840152602081019050612999565b50505050905090810190601f1680156129e15780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b5060008385039050809150509392505050565b6000612a2283612a1d60085485612a2a90919063ffffffff16565b612ff9565b905092915050565b6000612a6c83836040518060400160405280601a81526020017f536166654d6174683a206469766973696f6e206279207a65726f000000000000815250613042565b905092915050565b6000811415612a8257612c34565b6000612a98600383612a2a90919063ffffffff16565b90506000821415612aa95750612c34565b600073ffffffffffffffffffffffffffffffffffffffff16601160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614612b2c57612b2b601160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16826127e2565b5b600073ffffffffffffffffffffffffffffffffffffffff16601260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614612baf57612bae601260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16826127e2565b5b600073ffffffffffffffffffffffffffffffffffffffff16601360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614612c3257612c31601360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16826127e2565b5b505b50565b60008111612c90576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260318152602001806137ad6031913960400191505060405180910390fd5b8060068190555050565b60008111612cf3576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252603d815260200180613741603d913960400191505060405180910390fd5b8060088190555050565b600073ffffffffffffffffffffffffffffffffffffffff16601160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614612dd657601160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663fff6cae96040518163ffffffff1660e01b8152600401600060405180830381600087803b158015612dbd57600080fd5b505af1158015612dd1573d6000803e3d6000fd5b505050505b600073ffffffffffffffffffffffffffffffffffffffff16601260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614612eaf57601260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663fff6cae96040518163ffffffff1660e01b8152600401600060405180830381600087803b158015612e9657600080fd5b505af1158015612eaa573d6000803e3d6000fd5b505050505b600073ffffffffffffffffffffffffffffffffffffffff16601360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614612f8857601360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663fff6cae96040518163ffffffff1660e01b8152600401600060405180830381600087803b158015612f6f57600080fd5b505af1158015612f83573d6000803e3d6000fd5b505050505b565b80600f60006101000a81548160ff0219169083151502179055504260108190555050565b600080612fc660065484612a2a90919063ffffffff16565b9050612fd28582613108565b612fef8585612fea848761313190919063ffffffff16565b61317b565b9150509392505050565b60008061301160065484612a2a90919063ffffffff16565b905061301d3382613108565b61303984613034838661313190919063ffffffff16565b613254565b91505092915050565b600080831182906130ee576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825283818151815260200191508051906020019080838360005b838110156130b3578082015181840152602081019050613098565b50505050905090810190601f1680156130e05780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b5060008385816130fa57fe5b049050809150509392505050565b6131128282613272565b613127816007546126de90919063ffffffff16565b6007819055505050565b600061317383836040518060400160405280601e81526020017f536166654d6174683a207375627472616374696f6e206f766572666c6f770000815250612942565b905092915050565b60006131888484846133a4565b613249846131946124df565b613244856040518060600160405280602881526020016137ff60289139600160008b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006131fa6124df565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546129429092919063ffffffff16565b6124e7565b600190509392505050565b60006132686132616124df565b84846133a4565b6001905092915050565b6132dd816040518060600160405280602281526020016136b1602291396000808673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546129429092919063ffffffff16565b6000808473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055506133348160025461313190919063ffffffff16565b600281905550600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef836040518082815260200191505060405180910390a35050565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16141561342a576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260258152602001806138276025913960400191505060405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156134b0576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602381526020018061365b6023913960400191505060405180910390fd5b61351b8160405180606001604052806026815260200161371b602691396000808773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546129429092919063ffffffff16565b6000808573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055506135ae816000808573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546126de90919063ffffffff16565b6000808473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef836040518082815260200191505060405180910390a350505056fe45524332303a207472616e7366657220746f20746865207a65726f20616464726573737472616e7366657273206172652066726f7a656e20666f72206120666577206d696e757465732061667465722072656261736545524332303a206275726e20616d6f756e7420657863656564732062616c616e63654f776e61626c653a206e6577206f776e657220697320746865207a65726f206164647265737345524332303a20617070726f766520746f20746865207a65726f206164647265737345524332303a207472616e7366657220616d6f756e7420657863656564732062616c616e63655f736574456c61737469634d756c7469706c69657220656c61737469634d756c7469706c696572206d75737420626520626967676572207468616e20307472616e7366657273206172652066726f7a656e20756e74696c20736f6d656f6e652063616c6c73207265626173655f7365744275726e44697669736f72206275726e44697669736f72206d75737420626520626967676572207468616e2030536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f7745524332303a207472616e7366657220616d6f756e74206578636565647320616c6c6f77616e636545524332303a207472616e736665722066726f6d20746865207a65726f206164647265737345524332303a20617070726f76652066726f6d20746865207a65726f2061646472657373736f6d656f6e6520656c73652063616c6c65642072656261736520616c726561647945524332303a2064656372656173656420616c6c6f77616e63652062656c6f77207a65726fa26469706673582212208004802ec84dcc94442e25491577b7ee0a379b53cfec17e5e98bd9c34013923864736f6c63430006020033

Deployed Bytecode Sourcemap

34734:17715:0:-:0;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;34734:17715:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;31667:137;;;:::i;:::-;;;;;;;;;;;;;;;;;;;19650:83;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23:1:-1;8:100;33:3;30:1;27:10;8:100;;;99:1;94:3;90:11;84:18;80:1;75:3;71:11;64:39;52:2;49:1;45:10;40:15;;8:100;;;12:14;19650:83:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;21959:169;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;21959:169:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;52288:158;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;52288:158:0;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;45349:379;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;37966:42;;;:::i;:::-;;;;;;;;;;;;;;;;;;;45954:241;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;20725:100;;;:::i;:::-;;;;;;;;;;;;;;;;;;;44311:520;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;44311:520:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;46629:35;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;46586:36;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;49634:268;;;:::i;:::-;;;;;;;;;;;;;;;;;;;34955:38;;;:::i;:::-;;;;;;;;;;;;;;;;;;;20577:83;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;23332:218;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;23332:218:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;36068:44;;;:::i;:::-;;;;;;;;;;;;;;;;;;;38611:3195;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;38611:3195:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;31066:111;;;:::i;:::-;;;;;;;;;;;;;;;;;;;49156:138;;;:::i;:::-;;;;;;;;;;;;;;;;;;;48894:211;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;48894:211:0;;;;;;;;;;21:11:-1;8;5:28;2:2;;;46:1;43;36:12;2:2;48894:211:0;;35:9:-1;28:4;12:14;8:25;5:40;2:2;;;58:1;55;48:12;2:2;48894:211:0;;;;;;101:9:-1;95:2;81:12;77:21;67:8;63:36;60:51;39:11;25:12;22:29;11:108;8:2;;;132:1;129;122:12;8:2;48894:211:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30:3:-1;22:6;14;1:33;99:1;93:3;85:6;81:16;74:27;137:4;133:9;126:4;121:3;117:14;113:30;106:37;;169:3;161:6;157:16;147:26;;48894:211:0;;;;;;;;;;;;;;;;;21:11:-1;8;5:28;2:2;;;46:1;43;36:12;2:2;48894:211:0;;35:9:-1;28:4;12:14;8:25;5:40;2:2;;;58:1;55;48:12;2:2;48894:211:0;;;;;;101:9:-1;95:2;81:12;77:21;67:8;63:36;60:51;39:11;25:12;22:29;11:108;8:2;;;132:1;129;122:12;8:2;48894:211:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30:3:-1;22:6;14;1:33;99:1;93:3;85:6;81:16;74:27;137:4;133:9;126:4;121:3;117:14;113:30;106:37;;169:3;161:6;157:16;147:26;;48894:211:0;;;;;;;;;;;;;;;:::i;:::-;;31431:157;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;31431:157:0;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;34111:148;;;:::i;:::-;;49953:128;;;:::i;:::-;;;;;;;;;;;;;;;;;;;30271:111;;;:::i;:::-;;;;;;;;;;;;;;;;;;;35000:43;;;:::i;:::-;;;;;;;;;;;;;;;;;;;33469:79;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;50132:195;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;19852:87;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23:1:-1;8:100;33:3;30:1;27:10;8:100;;;99:1;94:3;90:11;84:18;80:1;75:3;71:11;64:39;52:2;49:1;45:10;40:15;;8:100;;;12:14;19852:87:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;50544:315;;;:::i;:::-;;;;;;;;;;;;;;;;;;;24053:269;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;24053:269:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;35568:229;;;:::i;:::-;;;;;;;;;;;;;;;;;;;43815:488;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;43815:488:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;36121:1837;;;:::i;:::-;;41814:1993;;;;;;13:3:-1;8;5:12;2:2;;;30:1;27;20:12;2:2;41814:1993:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;50378:115;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;36027:34;;;:::i;:::-;;;;;;;;;;;;;;;;;;;29055:99;;;:::i;:::-;;;;;;;;;;;;;;;;;;;31812:127;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;31812:127:0;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;38015:43;;;:::i;:::-;;;;;;;;;;;;;;;;;;;35112:47;;;:::i;:::-;;;;;;;;;;;;;;;;;;;38103:61;;;:::i;:::-;;;;;;;;;;;;;;;;;;;46948:319;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;46948:319:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;21661:151;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;21661:151:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;46544:35;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;50910:169;;;:::i;:::-;;;;;;;;;;;;;;;;;;;34414:244;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;34414:244:0;;;;;;;;;;;;;;;;;;;:::i;:::-;;49460:123;;;:::i;:::-;;;;;;;;;;;;;;;;;;;51130:770;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;51130:770:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;38171:61;;;:::i;:::-;;;;;;;;;;;;;;;;;;;51951:286;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;51951:286:0;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;31667:137;31726:7;31753:43;31777:18;;31753:19;:17;:19::i;:::-;:23;;:43;;;;:::i;:::-;31746:50;;31667:137;:::o;19650:83::-;19687:13;19720:5;19713:12;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;19650:83;:::o;21959:169::-;22042:4;22059:39;22068:12;:10;:12::i;:::-;22082:7;22091:6;22059:8;:39::i;:::-;22116:4;22109:11;;21959:169;;;;:::o;52288:158::-;52363:7;52390:48;52410:27;52432:4;52410:21;:27::i;:::-;52390:15;52400:4;52390:9;:15::i;:::-;:19;;:48;;;;:::i;:::-;52383:55;;52288:158;;;:::o;45349:379::-;45411:4;45643:15;45611:29;;45589:19;;:51;:69;45585:114;;;45682:5;45675:12;;;;45585:114;45716:4;45709:11;;45349:379;;:::o;37966:42::-;38007:1;37966:42;:::o;45954:241::-;46001:4;46022:15;;;;;;;;;;;46018:147;;;46091:15;46058:30;;:48;46054:100;;;46134:4;46127:11;;;;46054:100;46018:147;46182:5;46175:12;;45954:241;;:::o;20725:100::-;20778:7;20805:12;;20798:19;;20725:100;:::o;44311:520::-;44409:4;44534:5;44514:25;;:16;:14;:16::i;:::-;:25;;;44506:85;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;44645:5;44610:40;;:31;:29;:31::i;:::-;:40;;;44602:104;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;44717:45;44736:6;44744:9;44755:6;44717:18;:45::i;:::-;;44773:28;44794:6;44773:20;:28::i;:::-;44819:4;44812:11;;44311:520;;;;;:::o;46629:35::-;;;;;;;;;;;;;:::o;46586:36::-;;;;;;;;;;;;;:::o;49634:268::-;49688:7;49708:18;49764:4;49729:32;;:39;49708:60;;49797:15;49783:10;:29;49779:70;;49836:1;49829:8;;;;;49779:70;49879:15;49866:10;:28;49859:35;;;49634:268;;:::o;34955:38::-;;;;:::o;20577:83::-;20618:5;20643:9;;;;;;;;;;;20636:16;;20577:83;:::o;23332:218::-;23420:4;23437:83;23446:12;:10;:12::i;:::-;23460:7;23469:50;23508:10;23469:11;:25;23481:12;:10;:12::i;:::-;23469:25;;;;;;;;;;;;;;;:34;23495:7;23469:34;;;;;;;;;;;;;;;;:38;;:50;;;;:::i;:::-;23437:8;:83::i;:::-;23538:4;23531:11;;23332:218;;;;:::o;36068:44::-;;;;:::o;38611:3195::-;38771:7;38865:24;38892:5;38865:32;;38908:28;38964:17;38007:1;38939:42;38908:73;;38992:28;39048:17;38056:2;39023:42;38992:73;;39134:1;39110:20;:25;39106:79;;;38056:2;38144:3;:20;;;;;;39152:21;;;;;;;39106:79;39195:33;39266:20;39238:17;39232:3;:23;39231:56;;;;;;39195:92;;39366:30;39333:29;:63;39329:480;;;39507:21;39478:26;:50;39474:324;;;38007:1;38212:3;:20;;;;;;39549:21;;;;;;;;39474:324;39638:21;39609:26;:50;39605:193;;;38056:2;38144:3;:20;;;;;;39680:21;;;;;;;;39605:193;39762:20;39755:27;;;;;;;;39329:480;39821:23;39879:30;39847:29;:62;39821:88;;39974:18;39970:582;;;40159:21;40129:26;:51;40125:113;;38056:2;38144:3;:20;;;;;;40201:21;;;;;;;;;40125:113;39970:582;;;40462:21;40432:26;:51;40428:113;;38007:1;38212:3;:20;;;;;;40504:21;;;;;;;;;40428:113;39970:582;40645:26;40719:1;40686:29;:34;40682:571;;;40800:1;40767:30;:34;40759:43;;40737:65;;40682:571;;;40867:1;40833:30;:35;40829:424;;;40946:1;40914:29;:33;40885:63;;40829:424;;;40979:18;40975:278;;;41075:30;41043:29;:62;;;;;;41014:92;;40975:278;;;41211:29;41178:30;:62;;;;;;41170:71;;41148:93;;40975:278;40829:424;40682:571;41369:28;41400:223;41458:26;41521:17;41499:19;:39;41554:21;41591;41400:43;:223::i;:::-;41369:254;;41776:21;41755:17;41749:3;:23;41748:49;;;;;;41733:65;;;;;;;;;38611:3195;;;;;;:::o;31066:111::-;31124:7;31151:18;;31144:25;;31066:111;:::o;49156:138::-;49215:7;49242:44;49266:19;:17;:19::i;:::-;49242;:17;:19::i;:::-;:23;;:44;;;;:::i;:::-;49235:51;;49156:138;:::o;48894:211::-;33691:12;:10;:12::i;:::-;33681:22;;:6;;;;;;;;;;;:22;;;33673:67;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;48999:6:::1;49008:1:::0;48999:10:::1;;48994:104;49015:10;:17;49011:1;:21;48994:104;;;49054:32;49060:10;49071:1;49060:13;;;;;;;;;;;;;;49075:7;49083:1;49075:10;;;;;;;;;;;;;;49054:5;:32::i;:::-;49034:3;;;;;;;48994:104;;;;48894:211:::0;;:::o;31431:157::-;31505:7;31532:48;31561:18;;31532:24;31548:7;31532:15;:24::i;:::-;:28;;:48;;;;:::i;:::-;31525:55;;31431:157;;;:::o;34111:148::-;33691:12;:10;:12::i;:::-;33681:22;;:6;;;;;;;;;;;:22;;;33673:67;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;34218:1:::1;34181:40;;34202:6;;;;;;;;;;;34181:40;;;;;;;;;;;;34249:1;34232:6;;:19;;;;;;;;;;;;;;;;;;34111:148::o:0;49953:128::-;50007:7;50069:4;50034:32;;:39;50027:46;;49953:128;:::o;30271:111::-;30329:7;30356:18;;30349:25;;30271:111;:::o;35000:43::-;;;;:::o;33469:79::-;33507:7;33534:6;;;;;;;;;;;33527:13;;33469:79;:::o;50132:195::-;50185:4;50206:31;:29;:31::i;:::-;:51;;;;50241:16;:14;:16::i;:::-;50206:51;50202:95;;;50281:4;50274:11;;;;50202:95;50314:5;50307:12;;50132:195;;:::o;19852:87::-;19891:13;19924:7;19917:14;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;19852:87;:::o;50544:315::-;50627:7;50647:20;50692:29;;50670:19;;:51;50647:74;;50752:15;50736:12;:31;50732:72;;50791:1;50784:8;;;;;50732:72;50836:15;50821:12;:30;50814:37;;;50544:315;;:::o;24053:269::-;24146:4;24163:129;24172:12;:10;:12::i;:::-;24186:7;24195:96;24234:15;24195:96;;;;;;;;;;;;;;;;;:11;:25;24207:12;:10;:12::i;:::-;24195:25;;;;;;;;;;;;;;;:34;24221:7;24195:34;;;;;;;;;;;;;;;;:38;;:96;;;;;:::i;:::-;24163:8;:129::i;:::-;24310:4;24303:11;;24053:269;;;;:::o;35568:229::-;35636:7;35784:4;35766:15;:22;;;;;;35747:15;:42;35740:49;;35568:229;:::o;43815:488::-;43893:4;44018:5;43998:25;;:16;:14;:16::i;:::-;:25;;;43990:85;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;44129:5;44094:40;;:31;:29;:31::i;:::-;:40;;;44086:104;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;44201:33;44216:9;44227:6;44201:14;:33::i;:::-;;44245:28;44266:6;44245:20;:28::i;:::-;44291:4;44284:11;;43815:488;;;;:::o;36121:1837::-;36253:4;36233:24;;:16;:14;:16::i;:::-;:24;;;36225:71;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;36376:37;36416:28;;36376:68;;36486:23;;36455:28;:54;;;;36546:1;36520:23;:27;;;;36627:37;:35;:37::i;:::-;36592:32;:72;;;;36783:25;36811:54;36863:1;36811:47;36844:13;:11;:13::i;:::-;36811:28;;:32;;:47;;;;:::i;:::-;:51;;:54;;;;:::i;:::-;36783:82;;36876:37;36895:17;36876:18;:37::i;:::-;36966:22;36991:96;37012:13;:11;:13::i;:::-;37027:28;;37057:29;36991:20;:96::i;:::-;36966:121;;37364:28;37395:33;37413:14;37403:4;37395:17;;:33;;;;:::i;:::-;37364:64;;37439:31;37455:14;37439:15;:31::i;:::-;37481:43;37503:20;37481:21;:43::i;:::-;37547:32;;37540:139;37581:14;37597:20;37619:28;;37649:29;37540:139;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;37804:18;:16;:18::i;:::-;37878:24;37896:5;37878:17;:24::i;:::-;37935:15;37913:19;:37;;;;36121:1837;;;;:::o;41814:1993::-;41994:6;42305:15;42282:20;:38;42278:233;;;42360:15;42337:38;;42278:233;;;42429:15;42406:20;:38;42402:109;;;42484:15;42461:38;;42402:109;42278:233;42570:26;42599:20;42570:49;;42630:15;42648:1;42630:19;;42660:1140;42667:4;42660:1140;;;42688:21;42735:19;42712:20;:42;42688:66;;42831:15;42814:14;:32;:68;;;;;42867:15;42850:14;:32;42814:68;42810:158;;;42933:19;42910:20;:42;42903:49;;;;;;;42810:158;43089:1;43073:12;;;;;;;:17;;;43069:524;;;43285:1;43262:20;:24;43258:320;;;43400:15;43393:22;;;;;;;43258:320;43543:15;43536:22;;;;;;;43069:524;43787:1;43765:19;:23;;;;;;43743:45;;42660:1140;;;;41814:1993;;;;;;;;;:::o;50378:115::-;50445:4;50469:16;:14;:16::i;:::-;50462:23;;50378:115;:::o;36027:34::-;;;;:::o;29055:99::-;29107:7;29134:12;;29127:19;;29055:99;:::o;31812:127::-;31880:7;31907:24;31923:7;31907:15;:24::i;:::-;31900:31;;31812:127;;;:::o;38015:43::-;38056:2;38015:43;:::o;35112:47::-;;;;:::o;38103:61::-;38056:2;38144:3;:20;;;;;;38103:61;:::o;46948:319::-;33691:12;:10;:12::i;:::-;33681:22;;:6;;;;;;;;;;;:22;;;33673:67;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;47126:21:::1;47103:20;;:44;;;;;;;;;;;;;;;;;;47182:22;47158:21;;:46;;;;;;;;;;;;;;;;;;47238:21;47215:20;;:44;;;;;;;;;;;;;;;;;;46948:319:::0;;;:::o;21661:151::-;21750:7;21777:11;:18;21789:5;21777:18;;;;;;;;;;;;;;;:27;21796:7;21777:27;;;;;;;;;;;;;;;;21770:34;;21661:151;;;;:::o;46544:35::-;;;;;;;;;;;;;:::o;50910:169::-;50993:7;51042:29;;51020:19;;:51;51013:58;;50910:169;:::o;34414:244::-;33691:12;:10;:12::i;:::-;33681:22;;:6;;;;;;;;;;;:22;;;33673:67;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;34523:1:::1;34503:22;;:8;:22;;;;34495:73;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;34613:8;34584:38;;34605:6;;;;;;;;;;;34584:38;;;;;;;;;;;;34642:8;34633:6;;:17;;;;;;;;;;;;;;;;;;34414:244:::0;:::o;49460:123::-;49522:7;49549:26;49573:1;49549:19;:17;:19::i;:::-;:23;;:26;;;;:::i;:::-;49542:33;;49460:123;:::o;51130:770::-;51216:7;51263:1;51240:25;;:11;:25;;;51236:66;;;51289:1;51282:8;;;;51236:66;51312:25;51340:22;51350:11;51340:9;:22::i;:::-;51312:50;;51398:1;51377:17;:22;51373:63;;;51423:1;51416:8;;;;;51373:63;51446:21;51485:11;51470:37;;;51508:4;51470:43;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;51470:43:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;51470:43:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;51470:43:0;;;;;;;;;;;;;;;;51446:67;;51545:1;51528:13;:18;51524:59;;;51570:1;51563:8;;;;;;51524:59;51593:21;51632:11;51617:39;;;:41;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;51617:41:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;51617:41:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;51617:41:0;;;;;;;;;;;;;;;;51593:65;;51669:25;51697:4;51669:32;;51712:33;51748:55;51789:13;51748:36;51766:17;51748:13;:17;;:36;;;;:::i;:::-;:40;;:55;;;;:::i;:::-;51712:91;;51821:71;51874:17;51821:48;51843:25;51821:17;:21;;:48;;;;:::i;:::-;:52;;:71;;;;:::i;:::-;51814:78;;;;;;;51130:770;;;;;:::o;38171:61::-;38007:1;38212:3;:20;;;;;;38171:61;:::o;51951:286::-;52017:7;52044:185;52180:48;52201:4;52207:20;;;;;;;;;;;52180;:48::i;:::-;52044:117;52111:49;52132:4;52138:21;;;;;;;;;;;52111:20;:49::i;:::-;52044:48;52065:4;52071:20;;;;;;;;;;;52044;:48::i;:::-;:66;;:117;;;;:::i;:::-;:135;;:185;;;;:::i;:::-;52037:192;;51951:286;;;:::o;8074:471::-;8132:7;8382:1;8377;:6;8373:47;;;8407:1;8400:8;;;;8373:47;8432:9;8448:1;8444;:5;8432:17;;8477:1;8472;8468;:5;;;;;;:10;8460:56;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8536:1;8529:8;;;8074:471;;;;;:::o;2576:106::-;2629:15;2664:10;2657:17;;2576:106;:::o;27215:346::-;27334:1;27317:19;;:5;:19;;;;27309:68;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;27415:1;27396:21;;:7;:21;;;;27388:68;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;27499:6;27469:11;:18;27481:5;27469:18;;;;;;;;;;;;;;;:27;27488:7;27469:27;;;;;;;;;;;;;;;:36;;;;27537:7;27521:32;;27530:5;27521:32;;;27546:6;27521:32;;;;;;;;;;;;;;;;;;27215:346;;;:::o;6720:181::-;6778:7;6798:9;6814:1;6810;:5;6798:17;;6839:1;6834;:6;;6826:46;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;6892:1;6885:8;;;6720:181;;;;:::o;32130:207::-;32236:4;32260:69;32279:6;32287:9;32298:30;32309:18;;32298:6;:10;;:30;;;;:::i;:::-;32260:18;:69::i;:::-;32253:76;;32130:207;;;;;:::o;44839:502::-;45078:60;45106:31;45117:19;:17;:19::i;:::-;45106:6;:10;;:31;;;;:::i;:::-;45078:23;;:27;;:60;;;;:::i;:::-;45052:23;:86;;;;45245:37;:35;:37::i;:::-;45209:32;;:73;45205:129;;45299:23;45317:4;45299:17;:23::i;:::-;45205:129;44839:502;:::o;25635:384::-;25872:24;25889:6;25872:12;;:16;;:24;;;;:::i;:::-;25857:12;:39;;;;25928:30;25951:6;25928:9;:18;25938:7;25928:18;;;;;;;;;;;;;;;;:22;;:30;;;;:::i;:::-;25907:9;:18;25917:7;25907:18;;;;;;;;;;;;;;;:51;;;;25995:7;25974:37;;25991:1;25974:37;;;26004:6;25974:37;;;;;;;;;;;;;;;;;;25635:384;;:::o;20949:127::-;21023:7;21050:9;:18;21060:7;21050:18;;;;;;;;;;;;;;;;21043:25;;20949:127;;;:::o;7623:192::-;7709:7;7742:1;7737;:6;;7745:12;7729:29;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23:1:-1;8:100;33:3;30:1;27:10;8:100;;;99:1;94:3;90:11;84:18;80:1;75:3;71:11;64:39;52:2;49:1;45:10;40:15;;8:100;;;12:14;7729:29:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;7769:9;7785:1;7781;:5;7769:17;;7806:1;7799:8;;;7623:192;;;;;:::o;31947:175::-;32033:4;32057:57;32072:9;32083:30;32094:18;;32083:6;:10;;:30;;;;:::i;:::-;32057:14;:57::i;:::-;32050:64;;31947:175;;;;:::o;9021:132::-;9079:7;9106:39;9110:1;9113;9106:39;;;;;;;;;;;;;;;;;:3;:39::i;:::-;9099:46;;9021:132;;;;:::o;47427:714::-;47539:1;47512:23;:28;47508:67;;;47557:7;;47508:67;47643:21;47667:30;47695:1;47667:23;:27;;:30;;;;:::i;:::-;47643:54;;47739:1;47712:23;:28;47708:67;;;47757:7;;;47708:67;47821:1;47789:34;;:20;;;;;;;;;;;:34;;;47785:109;;47840:42;47846:20;;;;;;;;;;;47868:13;47840:5;:42::i;:::-;47785:109;47941:1;47908:35;;:21;;;;;;;;;;;:35;;;47904:111;;47960:43;47966:21;;;;;;;;;;;47989:13;47960:5;:43::i;:::-;47904:111;48061:1;48029:34;;:20;;;;;;;;;;;:34;;;48025:109;;48080:42;48086:20;;;;;;;;;;;48108:13;48080:5;:42::i;:::-;48025:109;47427:714;;;:::o;29162:196::-;29258:1;29244:11;:15;29236:77;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;29339:11;29324:12;:26;;;;29162:196;:::o;31185:238::-;31299:1;31279:17;:21;31271:95;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;31398:17;31377:18;:38;;;;31185:238;:::o;48253:407::-;48337:1;48305:34;;:20;;;;;;;;;;;:34;;;48301:110;;48371:20;;;;;;;;;;;48356:41;;;:43;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;48356:43:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;48356:43:0;;;;48301:110;48458:1;48425:35;;:21;;;;;;;;;;;:35;;;48421:112;;48492:21;;;;;;;;;;;48477:42;;;:44;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;48477:44:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;48477:44:0;;;;48421:112;48579:1;48547:34;;:20;;;;;;;;;;;:34;;;48543:110;;48613:20;;;;;;;;;;;48598:41;;;:43;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;48598:43:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;48598:43:0;;;;48543:110;48253:407::o;46203:150::-;46281:5;46263:15;;:23;;;;;;;;;;;;;;;;;;46330:15;46297:30;:48;;;;46203:150;:::o;29745:399::-;29851:4;29902:18;29923:24;29934:12;;29923:6;:10;;:24;;;;:::i;:::-;29902:45;;29987:24;29992:6;30000:10;29987:4;:24::i;:::-;30075:61;30094:6;30102:9;30113:22;30124:10;30113:6;:10;;:22;;;;:::i;:::-;30075:18;:61::i;:::-;30068:68;;;29745:399;;;;;:::o;29366:371::-;29452:4;29503:18;29524:24;29535:12;;29524:6;:10;;:24;;;;:::i;:::-;29503:45;;29588:28;29593:10;29605;29588:4;:28::i;:::-;29680:49;29695:9;29706:22;29717:10;29706:6;:10;;:22;;;;:::i;:::-;29680:14;:49::i;:::-;29673:56;;;29366:371;;;;:::o;9649:278::-;9735:7;9767:1;9763;:5;9770:12;9755:28;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23:1:-1;8:100;33:3;30:1;27:10;8:100;;;99:1;94:3;90:11;84:18;80:1;75:3;71:11;64:39;52:2;49:1;45:10;40:15;;8:100;;;12:14;9755:28:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;9794:9;9810:1;9806;:5;;;;;;9794:17;;9918:1;9911:8;;;9649:278;;;;;:::o;30390:204::-;30456:22;30462:7;30471:6;30456:5;:22::i;:::-;30556:30;30579:6;30556:18;;:22;;:30;;;;:::i;:::-;30535:18;:51;;;;30390:204;;:::o;7184:136::-;7242:7;7269:43;7273:1;7276;7269:43;;;;;;;;;;;;;;;;;:3;:43::i;:::-;7262:50;;7184:136;;;;:::o;22602:321::-;22708:4;22725:36;22735:6;22743:9;22754:6;22725:9;:36::i;:::-;22772:121;22781:6;22789:12;:10;:12::i;:::-;22803:89;22841:6;22803:89;;;;;;;;;;;;;;;;;:11;:19;22815:6;22803:19;;;;;;;;;;;;;;;:33;22823:12;:10;:12::i;:::-;22803:33;;;;;;;;;;;;;;;;:37;;:89;;;;;:::i;:::-;22772:8;:121::i;:::-;22911:4;22904:11;;22602:321;;;;;:::o;21423:175::-;21509:4;21526:42;21536:12;:10;:12::i;:::-;21550:9;21561:6;21526:9;:42::i;:::-;21586:4;21579:11;;21423:175;;;;:::o;26351:424::-;26596:68;26619:6;26596:68;;;;;;;;;;;;;;;;;:9;:18;26606:7;26596:18;;;;;;;;;;;;;;;;:22;;:68;;;;;:::i;:::-;26575:9;:18;26585:7;26575:18;;;;;;;;;;;;;;;:89;;;;26690:24;26707:6;26690:12;;:16;;:24;;;;:::i;:::-;26675:12;:39;;;;26756:1;26730:37;;26739:7;26730:37;;;26760:6;26730:37;;;;;;;;;;;;;;;;;;26351:424;;:::o;24812:542::-;24936:1;24918:20;;:6;:20;;;;24910:70;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;25020:1;24999:23;;:9;:23;;;;24991:71;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;25158;25180:6;25158:71;;;;;;;;;;;;;;;;;:9;:17;25168:6;25158:17;;;;;;;;;;;;;;;;:21;;:71;;;;;:::i;:::-;25138:9;:17;25148:6;25138:17;;;;;;;;;;;;;;;:91;;;;25263:32;25288:6;25263:9;:20;25273:9;25263:20;;;;;;;;;;;;;;;;:24;;:32;;;;:::i;:::-;25240:9;:20;25250:9;25240:20;;;;;;;;;;;;;;;:55;;;;25328:9;25311:35;;25320:6;25311:35;;;25339:6;25311:35;;;;;;;;;;;;;;;;;;24812:542;;;:::o

Swarm Source

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