ETH Price: $3,403.60 (+1.12%)

Token

Communis (COM)
 

Overview

Max Total Supply

120,875,872,082,688,983.274741047416 COM

Holders

5,110

Market

Onchain Market Cap

$0.00

Circulating Supply Market Cap

-

Other Info

Token Contract (WITH 12 Decimals)

Balance
0 COM

Value
$0.00
0xc3c4ecb0845ec0393408dfadaddd6f8d4ac29e57
Loading...
Loading
Loading...
Loading
Loading...
Loading

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

Contract Source Code Verified (Exact Match)

Contract Name:
Communis

Compiler Version
v0.8.16+commit.07a7930e

Optimization Enabled:
Yes with 200 runs

Other Settings:
petersburg EvmVersion, MIT license

Contract Source Code (Solidity)

/**
 *Submitted for verification at Etherscan.io on 2023-01-09
*/

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

// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v4.6.0) (token/ERC20/IERC20.sol)

pragma solidity ^0.8.0;

/**
 * @dev Interface of the ERC20 standard as defined in the EIP.
 */
interface IERC20 {
    /**
     * @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);

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

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

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

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

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

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

// File: @openzeppelin\contracts\token\ERC20\extensions\IERC20Metadata.sol

// OpenZeppelin Contracts v4.4.1 (token/ERC20/extensions/IERC20Metadata.sol)

pragma solidity ^0.8.0;

/**
 * @dev Interface for the optional metadata functions from the ERC20 standard.
 *
 * _Available since v4.1._
 */
interface IERC20Metadata is IERC20 {
    /**
     * @dev Returns the name of the token.
     */
    function name() external view returns (string memory);

    /**
     * @dev Returns the symbol of the token.
     */
    function symbol() external view returns (string memory);

    /**
     * @dev Returns the decimals places of the token.
     */
    function decimals() external view returns (uint8);
}

// File: @openzeppelin\contracts\utils\Context.sol

// OpenZeppelin Contracts v4.4.1 (utils/Context.sol)

pragma solidity ^0.8.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 meta-transactions the account sending and
 * paying for execution may not be the actual sender (as far as an application
 * is concerned).
 *
 * This contract is only required for intermediate, library-like contracts.
 */
abstract contract Context {
    function _msgSender() internal view virtual returns (address) {
        return msg.sender;
    }

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

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

// OpenZeppelin Contracts (last updated v4.7.0) (token/ERC20/ERC20.sol)

pragma solidity ^0.8.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 Contracts guidelines: functions revert
 * instead returning `false` on failure. This behavior is nonetheless
 * conventional and does not conflict with the expectations of ERC20
 * applications.
 *
 * Additionally, an {Approval} event is emitted on calls to {transferFrom}.
 * This allows applications to reconstruct the allowance for all accounts just
 * by listening to said events. Other implementations of the EIP may not emit
 * these events, as it isn't required by the specification.
 *
 * Finally, the non-standard {decreaseAllowance} and {increaseAllowance}
 * functions have been added to mitigate the well-known issues around setting
 * allowances. See {IERC20-approve}.
 */
contract ERC20 is Context, IERC20, IERC20Metadata {
    mapping(address => uint256) private _balances;

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

    uint256 private _totalSupply;

    string private _name;
    string private _symbol;

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

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

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

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

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

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

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

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

    /**
     * @dev See {IERC20-approve}.
     *
     * NOTE: If `amount` is the maximum `uint256`, the allowance is not updated on
     * `transferFrom`. This is semantically equivalent to an infinite approval.
     *
     * Requirements:
     *
     * - `spender` cannot be the zero address.
     */
    function approve(address spender, uint256 amount) public virtual override returns (bool) {
        address owner = _msgSender();
        _approve(owner, spender, amount);
        return true;
    }

    /**
     * @dev See {IERC20-transferFrom}.
     *
     * Emits an {Approval} event indicating the updated allowance. This is not
     * required by the EIP. See the note at the beginning of {ERC20}.
     *
     * NOTE: Does not update the allowance if the current allowance
     * is the maximum `uint256`.
     *
     * Requirements:
     *
     * - `from` and `to` cannot be the zero address.
     * - `from` must have a balance of at least `amount`.
     * - the caller must have allowance for ``from``'s tokens of at least
     * `amount`.
     */
    function transferFrom(
        address from,
        address to,
        uint256 amount
    ) public virtual override returns (bool) {
        address spender = _msgSender();
        _spendAllowance(from, spender, amount);
        _transfer(from, to, amount);
        return true;
    }

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

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

        return true;
    }

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

        _beforeTokenTransfer(from, to, amount);

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

        emit Transfer(from, to, amount);

        _afterTokenTransfer(from, to, amount);
    }

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

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

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

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

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

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

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

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

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

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

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

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

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

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

// File: @openzeppelin\contracts\token\ERC20\extensions\ERC20Burnable.sol

// OpenZeppelin Contracts (last updated v4.5.0) (token/ERC20/extensions/ERC20Burnable.sol)

pragma solidity ^0.8.0;


/**
 * @dev Extension of {ERC20} that allows token holders to destroy both their own
 * tokens and those that they have an allowance for, in a way that can be
 * recognized off-chain (via event analysis).
 */
abstract contract ERC20Burnable is Context, ERC20 {
    /**
     * @dev Destroys `amount` tokens from the caller.
     *
     * See {ERC20-_burn}.
     */
    function burn(uint256 amount) public virtual {
        _burn(_msgSender(), amount);
    }

    /**
     * @dev Destroys `amount` tokens from `account`, deducting from the caller's
     * allowance.
     *
     * See {ERC20-_burn} and {ERC20-allowance}.
     *
     * Requirements:
     *
     * - the caller must have allowance for ``accounts``'s tokens of at least
     * `amount`.
     */
    function burnFrom(address account, uint256 amount) public virtual {
        _spendAllowance(account, _msgSender(), amount);
        _burn(account, amount);
    }
}

// File: contracts\COM.sol

// Codeak
pragma solidity ^0.8.4;
interface _HEX { 
   function currentDay() external view returns (uint256);
   function stakeLists(address owner, uint256 stakeIndex) external view returns (uint40, uint72, uint72, uint16, uint16, uint16, bool);
   function stakeGoodAccounting(address stakerAddr, uint256 stakeIndex, uint40 stakeIdParam) external;
   function globals() external view returns (
             uint72 lockedHeartsTotal
            ,uint72 nextStakeSharesTotal
            ,uint40 shareRate
            ,uint72 stakePenaltyTotal
            ,uint16 dailyDataCount
            ,uint72 stakeSharesTotal
            ,uint40 latestStakeId
            ,uint128 claimStats
            );
}

contract Communis is ERC20, ERC20Burnable {

    _HEX private HEX;

    address internal constant contract_creator = 0x3dEF1720Ce2B04a56f0ee6BC9875C64A785136b9;

    constructor() ERC20("Communis", "COM") {
        HEX = _HEX(address(0x2b591e99afE9f32eAA6214f7B7629768c40Eeb39));
    }

    function decimals() public view virtual override returns (uint8) {
        return 12;
    }

    enum BonusType {START, END, GOOD, RESTAKE}

    event newMint(
         uint256 data0
        ,uint256 data1
        ,uint256 indexed stakeId
        ,uint256 indexed bonusType
        ,address indexed senderAddr
        ,address referrer
    );

    event newDebtMint(
         uint256 data0
        ,address indexed senderAddr
    );

    event stakeDepositCodeak(
         uint256 data0
        ,address indexed senderAddr
    );

    event stakeWithdrawCodeak(
         uint256 data0
        ,address indexed senderAddr
    );

    struct PayoutResponse {
        uint256 recalculatedStakeShares;
        uint256 stakesOriginalShareRate;
        uint256 maxPayout;
    }

    struct Stake {
        uint256 stakeID;
        uint256 stakedHearts;
        uint256 stakeShares;
        uint256 lockedDay;
        uint256 stakedDays;
        uint256 unlockedDay;
    }

    struct RestakeEndDebt {
        uint16  stakedDays;
        uint16  endBonusPayoutDay;
        uint72  sharesDebt;
    }

    struct EndBonusDebt {
        uint16 nextPayoutDay;
        uint128 payoutDebt;
    }

    struct stakeIndexIdAmount {
        uint256 stakeIndex;
        uint256 stakeID;
        uint256 stakeAmount;
    }

    mapping(uint256 => uint256)                 public stakeIdStartBonusPayout;
    mapping(uint256 => uint256)                 public stakeIdEndBonusPayout;
    mapping(address => RestakeEndDebt)          public addressRestakeEndDebt;
    mapping(address => EndBonusDebt)            public addressEndBonusDebt;
    mapping(uint256 => uint256)                 public stakeIdGoodAccountingBonusPayout;
    mapping(address => uint256)                 public addressStakedCodeak;

    function memoryStake(address adr, uint256 stakeIndex, uint256 stakeID)
        internal view
        returns (Stake memory)
    {
        uint40 _stakeID;
        uint72 _stakedHearts;
        uint72 _stakeShares;
        uint16 _lockedDay;
        uint16 _stakedDays;
        uint16 _unlockedDay;

        (_stakeID, _stakedHearts, _stakeShares, _lockedDay, _stakedDays, _unlockedDay, ) = HEX.stakeLists(address(adr), stakeIndex);

        require(_stakeID == stakeID, "COM: Assure correct and current stake");

        return Stake(_stakeID, _stakedHearts, _stakeShares, _lockedDay, _stakedDays, _unlockedDay);
    }

    function getGlobalShareRate()
        internal view
        returns (uint256 shareRate)
    { 
        (, , shareRate, , , , , ) = HEX.globals(); 
    }

    function _emitNewMint(uint256 payout, uint256 stakedDays, uint256 recalculatedStakeShares, uint256 stakesOriginalShareRate, uint256 stakedHearts, uint256 stakeID, address referrer, BonusType bonusType)
        private
    {
        emit newMint(
            (uint256(uint128(payout)))
                | (uint256(uint128(recalculatedStakeShares)) << 128)
            ,uint256(uint40(block.timestamp))
                | (uint256(uint16(stakedDays))               << 40)
                | (uint256(uint40(stakesOriginalShareRate))  << 56)
                | (uint256(uint72(stakedHearts))             << 96)
            ,stakeID
            ,uint(bonusType)
            ,msg.sender
            ,referrer
        );
    }

    function _emitNewDebtMint(uint16 nextPayoutDay, uint256 payout, uint128 payoutDebt)
        private
    {
        emit newDebtMint(
             uint256(nextPayoutDay)
                | (uint256(uint112(payout)) << 16)
                | (uint256(payoutDebt)      << 128)
            ,msg.sender
        );
    }

    function _emitStakeDepositCodeak(uint256 amount, uint256 stakedCodeak)
        private
    {
        emit stakeDepositCodeak(
             uint256(uint128(amount))
                | (uint256(uint128(stakedCodeak)) << 128)
            ,msg.sender
        );
    }

    function _emitStakeWithdrawCodeak(uint256 amount, uint256 stakedCodeak)
        private
    {
        emit stakeWithdrawCodeak(
             uint256(uint128(amount))
                | (uint256(uint128(stakedCodeak)) << 128)
            ,msg.sender
        );
    }

    /**
     * 
     * @dev Reads current RestakeEndDebt
     * 
     * Maintains latest end bonus payout day
     * 
     * Maintains largest amount staked days
     * 
     * Accumulates stake's shares as total sharesDebt
     * 
     */
    function _updateRestakeEndDebt(uint256 currentDay, Stake memory s)
        private
    {
        RestakeEndDebt storage red = addressRestakeEndDebt[msg.sender];

        if(red.endBonusPayoutDay < currentDay) red.endBonusPayoutDay = uint16(currentDay);
        if(red.stakedDays < s.stakedDays) red.stakedDays = uint16(s.stakedDays);

        red.sharesDebt += uint72(s.stakeShares);
    }

    /**
     * 
     * @dev Reads current RestakeEndDebt
     * 
     * Assure new start stake (Stake Memory ss) meets requirements against RestakeEndDebt for Restake Bonus
     * 
     * Delete any restake debt if obligations are met
     * 
     */
    function _validateRestakeBonus(Stake memory ss)
        private
    {
        require(ss.stakedDays > 364, "COM: Minimum 365 staked days required");

        RestakeEndDebt storage red = addressRestakeEndDebt[msg.sender];

        require(red.endBonusPayoutDay != 0, "COM: No valid restake opportunity");
        require(ss.lockedDay > red.endBonusPayoutDay, "COM: Start Stake must be newer than previous stake");
        require(ss.stakedDays == 5555 || ss.stakedDays > red.stakedDays, "COM: New staked days must be greater than to previous");
        require(ss.stakeShares >= red.sharesDebt, "COM: Restake must at least maintain shares");     
        require(ss.stakeShares <= (red.sharesDebt * 2), "COM: Restake shares cannot be more than double");

        delete addressRestakeEndDebt[msg.sender];
    }

    /**
     * 
     * @dev Reverse engineer amount of bonus HEX hearts that were used in 
     * determining stake's HEX shares (this data is not kept in HEX storage)
     * 
     * Formula is derived from HEX smart contract
     * 
     */
    function getStakesBonusHearts(Stake memory s)
        internal pure
        returns (uint256 stakesBonusHearts)
    {
        uint256 cappedDays = 0;

        if (s.stakedDays > 1) cappedDays = s.stakedDays <= 3640 ? s.stakedDays - 1 : 3640;

        uint256 cappedHearts = s.stakedHearts <= (15 * (10 ** 15)) ? s.stakedHearts : (15 * (10 ** 15));

        stakesBonusHearts = s.stakedHearts * ((cappedDays * (15 * (10 ** 16))) + (cappedHearts * 1820)) / (273 * (10 ** 18)); 
    }

    /**
     * 
     * @dev Recalculate amount of bonus HEX hearts that would be applied if 
     * the cappedDays were not limited to 3640 days
     * 
     * Formula is derived from HEX smart contract
     * 
     */
    function getRecalculatedBonusHearts(Stake memory s)
        internal pure
        returns (uint256 recalculatedBonusHearts)
    {
        uint256 cappedDays = s.stakedDays - 1;

        uint256 cappedHearts = s.stakedHearts <= (15 * (10 ** 15)) ? s.stakedHearts : (15 * (10 ** 15));
 
        recalculatedBonusHearts = s.stakedHearts * ((cappedDays * (15 * (10 ** 16))) + (cappedHearts * 1820)) / (273 * (10 ** 18)); 
    }

    /**
     * 
     * @dev Creates a consistent PayoutResponse for any given Stake
     * 
     * Reverse engineer stakes original share rate as stakesOriginalShareRate using reverse engineered stakes bonus hearts
     * 
     * Recalculate Stake Shares with new Recalculated Bonus Hearts and using Reverse engineered stakesOriginalShareRate
     * 
     * Calculate penalty for amount days staked out of possible max length staked days of 5555, derived from HEX smart contract
     * 
     * Max payout represents the maximum possible value that can be minted for any given Stake
     * 
     */
    function getPayout(Stake memory s)
        public pure
        returns (PayoutResponse memory pr)
    {
        uint256 stakesOriginalShareRate = ((s.stakedHearts + getStakesBonusHearts(s)) * (10 ** 5)) / s.stakeShares;

        uint256 recalculatedStakeShares = (s.stakedHearts + getRecalculatedBonusHearts(s)) * (10 ** 17) / stakesOriginalShareRate;

        pr.stakesOriginalShareRate = stakesOriginalShareRate;
        pr.recalculatedStakeShares = recalculatedStakeShares;

        uint256 penalty = (s.stakedDays * (10 ** 15)) / 5555;
        pr.maxPayout = (recalculatedStakeShares * penalty) / (10 ** 15);
    }

    /**
     * 
     * @dev Creates a consistent payout for the Start Bonus given any Stake
     * 
     * If applyRestakeBonus, staked days range between 365 and 5555: 
     *      365 days gives bonusPercentage of 50000000000 and thus a 20% payout of maxPayout
     *      5555 days gives bonusPercentage of 20000000000 and thus a 50% payout of maxPayout
     * 
     * Else if staked days greater than 364, staked days range between 365 and 5555: 
     *      365 days gives bonusPercentage of 100000000000 and thus a 10% payout of maxPayout
     *      5555 days gives bonusPercentage of 40000000000 and thus a 25% payout of maxPayout
     * 
     * Else, staked days range between 180 and 364:
     *      180 days gives bonusPercentage of 200000000000 and thus a 5% payout of maxPayout
     *      364 days gives bonusPercentage of ~100540540540 and thus a ~9.946% payout of maxPayout
     * 
     * Penalty 
     *      global share rate is derived from HEX smart contract
     *      global share rate can only increase over time
     *      distance between current global share rate and reverse engineered stakes original share rate determine penalty
     * I.E.
     *      100,000 stakes share rate / 200,000 global share rate = you keep 50% of Start Bonus payout
     *      100,000 stakes share rate / 400,000 global share rate = you keep 25% of Start Bonus payout
     * 
     */
    function getStartBonusPayout(uint256 stakedDays, uint256 lockedDay, uint256 maxPayout, uint256 stakesOriginalShareRate, uint256 currentDay, uint256 globalShareRate, bool applyRestakeBonus)
        public pure
        returns (uint256 payout)
    {
        uint256 bonusPercentage;

        if(applyRestakeBonus == true) {
            bonusPercentage = (((stakedDays - 365) * (10 ** 10)) / 5190);
            bonusPercentage = ((3 * (10 ** 10)) * bonusPercentage) / (10 ** 10);
            bonusPercentage = (5 * (10 ** 10)) - bonusPercentage;
        }
        else if (stakedDays > 364) {
            bonusPercentage = ((stakedDays - 365) * (10 ** 10)) / 5190;
            bonusPercentage = ((6 * (10 ** 10)) * bonusPercentage) / (10 ** 10);
            bonusPercentage = (10 * (10 ** 10)) - bonusPercentage;
        }
        else {
            bonusPercentage = ((stakedDays - 180) * (10 ** 10)) / 185;
            bonusPercentage = ((10 * (10 ** 10)) * bonusPercentage) / (10 ** 10);
            bonusPercentage = (20 * (10 ** 10)) - bonusPercentage;
        }
 
        payout = (maxPayout * (10 ** 10)) / bonusPercentage;

        if(currentDay != lockedDay) {
            uint256 penalty = (stakesOriginalShareRate * (10 ** 15)) / globalShareRate;
            payout = (payout * penalty) / (10 ** 15);
        }
    }

    /**
     * 
     * @dev Allows withdraw of staked Codeak associated with msg.sender address
     * 
     */
    function withdrawStakedCodeak(uint256 withdrawAmount)
        external
    {
        require(withdrawAmount <= addressStakedCodeak[msg.sender], "COM: Requested withdraw amount is more than Address Staked Amount");

        addressStakedCodeak[msg.sender] -= withdrawAmount;

        _mint(msg.sender, withdrawAmount);
        _emitStakeWithdrawCodeak(withdrawAmount, addressStakedCodeak[msg.sender]);
    }

    /**
     * 
     * @dev External call to mint stake bonus for staking Codeak
     * 
     * Must have end bonus payout debt
     * 
     * Must have staked Codeak greater than or equal to end bonus payout debt
     * 
     */
    function mintStakeBonus()
        external
    {
        EndBonusDebt storage ebd = addressEndBonusDebt[msg.sender];
        if(ebd.payoutDebt != 0) {
            uint256 stakedCodeak = addressStakedCodeak[msg.sender];
            require(stakedCodeak >= ebd.payoutDebt, "COM: Address Staked Amount does not cover End Bonus Debt");
            _mintStakeBonus(ebd, HEX.currentDay(), stakedCodeak);
        }
    }

    /**
     * 
     * @dev Mints stake bonus for staking Codeak
     * 
     * Must have current day derived from HEX smart contract greater than next payout day
     * 
     * Calculates number of payouts based on distance between current day and next payout day
     * with no limit between the amount of days between them but in 91 day chunks
     *  
     * Sets next payout day depending on number of payouts minted
     * 
     */
    function _mintStakeBonus(EndBonusDebt storage ebd, uint256 currentDay, uint256 stakedCodeak)
        private
    {
        if(currentDay >= ebd.nextPayoutDay) {
            uint256 numberOfPayouts = ((currentDay - ebd.nextPayoutDay) / 91) + 1;
            uint256 payout = (stakedCodeak * numberOfPayouts) / 80;

            _mint(msg.sender, payout);

            ebd.nextPayoutDay += uint16(numberOfPayouts * 91);
            _emitNewDebtMint(ebd.nextPayoutDay, payout, ebd.payoutDebt);
        }
    }

    /**
     * 
     * @dev Allows batch minting of Start Bonuses to reduce gas costs
     * 
     */
    function mintStartBonusBatch(stakeIndexIdAmount[] calldata stakeIndexIdAmounts, address referrer)
        external
    {
        uint256 stakeIndexIdAmountsLength = stakeIndexIdAmounts.length;
        uint256 currentDay = HEX.currentDay();
        uint256 globalShareRate = getGlobalShareRate();

        for(uint256 i = 0; i < stakeIndexIdAmountsLength;){
            _mintStartBonus(stakeIndexIdAmounts[i].stakeIndex, stakeIndexIdAmounts[i].stakeID, false, referrer, currentDay, globalShareRate, stakeIndexIdAmounts[i].stakeAmount);
            unchecked {
                i++;
            }
        }
    }

    /**
     * 
     * @dev External call for single Start Bonuses
     * 
     */
    function mintStartBonus(uint256 stakeIndex, uint256 stakeID, bool applyRestakeBonus, address referrer, uint256 stakeAmount)
        external
    {
        _mintStartBonus(stakeIndex, stakeID, applyRestakeBonus, referrer, HEX.currentDay(), getGlobalShareRate(), stakeAmount);
    }

    /**
     * 
     * @dev Mints a bonus for starting a stake in HEX smart contract
     * 
     * Start bonus is only an upfront cut of the total max payout available for any given stake
     * 
     * Stake must not have its Start or End Bonus minted already
     * 
     * Stake shares must be at least 10000 to truncate low value edge cases
     * 
     * Start bonus forces minting Stake Bonus, if available, before staking new Codeak
     * 
     */
    function _mintStartBonus(uint256 stakeIndex, uint256 stakeID, bool applyRestakeBonus, address referrer, uint256 currentDay, uint256 globalShareRate, uint256 stakeAmount)
        private
    {
        require(stakeIdStartBonusPayout[stakeID] == 0, "COM: StakeID Start Bonus already minted");
        require(stakeIdEndBonusPayout[stakeID] == 0, "COM: StakeID End Bonus already minted");

        Stake memory s = memoryStake(address(msg.sender), stakeIndex, stakeID);

        require(s.stakeShares > 9999, "COM: Minimum 10000 shares required");
        require(s.stakedDays > 179, "COM: Minimum 180 staked days required");
        
        require(currentDay >= s.lockedDay, "COM: Stake not Active");

        BonusType bt = BonusType.START;
        if(applyRestakeBonus == true) {
            _validateRestakeBonus(s);
            bt = BonusType.RESTAKE;
        }

        PayoutResponse memory pr = getPayout(s);

        uint256 payout = getStartBonusPayout(s.stakedDays, s.lockedDay, pr.maxPayout, pr.stakesOriginalShareRate, currentDay, globalShareRate, applyRestakeBonus);

        if(referrer == msg.sender) {
            payout += (payout / 100);
        }
        else if(referrer != address(0)) {
            _mint(referrer, (payout / 100));
        }
        else {
            _mint(contract_creator, (payout / 100));
        }

        stakeIdStartBonusPayout[stakeID] = payout;

        EndBonusDebt storage ebd = addressEndBonusDebt[msg.sender];

        if(ebd.payoutDebt != 0 && addressStakedCodeak[msg.sender] >= ebd.payoutDebt) _mintStakeBonus(ebd, currentDay, addressStakedCodeak[msg.sender]);

        if(stakeAmount > 0) {
            require(stakeAmount <= payout, "COM: Stake amount is more than available payout");

            addressStakedCodeak[msg.sender] += stakeAmount;

            payout -= stakeAmount;

            _emitStakeDepositCodeak(stakeAmount, addressStakedCodeak[msg.sender]);
        }

        if(payout > 0) _mint(msg.sender, payout);
        _emitNewMint(payout, s.stakedDays, pr.recalculatedStakeShares, pr.stakesOriginalShareRate, s.stakedHearts, s.stakeID, referrer, bt);
    }

    /**
     * 
     * @dev Allows batch minting of End Bonuses to reduce gas costs
     * 
     */
    function mintEndBonusBatch(stakeIndexIdAmount[] calldata stakeIndexIdAmounts, address referrer)
        external
    {
        uint256 stakeIndexIdAmountsLength = stakeIndexIdAmounts.length;
        uint256 currentDay = HEX.currentDay();

        for(uint256 i = 0; i < stakeIndexIdAmountsLength;){
            _mintEndBonus(stakeIndexIdAmounts[i].stakeIndex, stakeIndexIdAmounts[i].stakeID, referrer, currentDay, stakeIndexIdAmounts[i].stakeAmount);
            unchecked {
                i++;
            }
        }
    }

    /**
     * 
     * @dev External call for single End Bonuses
     * 
     */
    function mintEndBonus(uint256 stakeIndex, uint256 stakeID, address referrer, uint256 stakeAmount)
        external
    {
        _mintEndBonus(stakeIndex, stakeID, referrer, HEX.currentDay(), stakeAmount);
    }

    /**
     * 
     * @dev Mints a bonus for fulfilling a stakes staked days commitment in HEX smart contract
     * 
     * End bonus is the remaining total max payout available for any given stake, reduced only based on previous Start Stake Bonus minted
     * 
     * Stake must not have its End Bonus minted already
     * 
     * Stake shares must be at least 10000 to truncate low value edge cases
     * 
     * 50% of End Bonus Payout is accumulated as End Bonus Debt
     * 
     * End bonus forces minting Stake Bonus, if available, before staking new Codeak
     * 
     * Allows staking new Codeak before checking if staked Codeak is less than End Bonus Debt
     * 
     */
    function _mintEndBonus(uint256 stakeIndex, uint256 stakeID, address referrer, uint256 currentDay, uint256 stakeAmount)
        private
    {
        require(stakeIdEndBonusPayout[stakeID] == 0, "COM: StakeID End Bonus already minted");

        Stake memory s = memoryStake(address(msg.sender), stakeIndex, stakeID);

        require(s.stakedDays > 364, "COM: Minimum 365 staked days required");
        require(s.stakeShares > 9999, "COM: Minimum 10000 shares required");

        uint256 dueDay = s.lockedDay + s.stakedDays;
        require(currentDay >= dueDay, "COM: Stake not due");
        require(currentDay <= dueDay + 37, "COM: Grace period ended");

        PayoutResponse memory pr = getPayout(s);

        uint256 payout = pr.maxPayout - stakeIdStartBonusPayout[stakeID];

        if(referrer == msg.sender) {
            payout += (payout / 100);
        }
        else if(referrer != address(0)) {
            _mint(referrer, (payout / 100));
        }
        else {
            _mint(contract_creator, (payout / 100));
        }

        stakeIdEndBonusPayout[stakeID] = payout;

        uint128 payoutDebt = uint128(payout / 2);

        EndBonusDebt storage ebd = addressEndBonusDebt[msg.sender];

        if(ebd.payoutDebt != 0) _mintStakeBonus(ebd, currentDay, addressStakedCodeak[msg.sender]);

        if(stakeAmount > 0) {
            require(stakeAmount <= payout, "COM: Stake amount is more than available payout");

            addressStakedCodeak[msg.sender] += stakeAmount;

            payout -= stakeAmount;
            
            _emitStakeDepositCodeak(stakeAmount, addressStakedCodeak[msg.sender]);
        }

        if(ebd.payoutDebt != 0) require(addressStakedCodeak[msg.sender] >= ebd.payoutDebt, "COM: Address Staked Amount does not cover End Bonus Debt");
        else ebd.nextPayoutDay = uint16(currentDay) + 91;

        if(payout > 0) _mint(msg.sender, payout);
        _emitNewMint(payout, s.stakedDays, pr.recalculatedStakeShares, pr.stakesOriginalShareRate, s.stakedHearts, s.stakeID, referrer, BonusType.END);

        _updateRestakeEndDebt(currentDay, s);
        ebd.payoutDebt += payoutDebt;
    }

    /**
     * 
     * @dev Mints a bonus for cleaning stale shares in the HEX smart contract
     * 
     * Stake must not already be unlocked 
     * 
     * Stake must not have its End or Good Accounting Bonus minted already
     * 
     */
    function mintGoodAccountingBonus(address stakeOwner, uint256 stakeIndex, uint256 stakeID)
        external
    {
        require(stakeIdGoodAccountingBonusPayout[stakeID] == 0, "COM: StakeID Good Accounting Bonus already minted");
        require(stakeIdEndBonusPayout[stakeID] == 0, "COM: StakeID End Bonus already minted");

        Stake memory s = memoryStake(address(stakeOwner), stakeIndex, stakeID);

        require(s.stakeShares > 9999, "COM: Minimum 10000 shares required");
        require(s.unlockedDay == 0, "COM: Stake already unlocked");
        require(HEX.currentDay() > s.lockedDay + s.stakedDays + 37, "COM: Grace period has not ended");

        HEX.stakeGoodAccounting(address(stakeOwner), stakeIndex, uint40(stakeID));

        Stake memory sga = memoryStake(address(stakeOwner), stakeIndex, stakeID);
        require(sga.unlockedDay != 0, "COM: Stake did not have Good Accounting ran");

        PayoutResponse memory pr = getPayout(s);

        uint256 payout = pr.maxPayout / 100;

        stakeIdGoodAccountingBonusPayout[stakeID] = payout;

        _mint(msg.sender, payout);
        _emitNewMint(payout, s.stakedDays, pr.recalculatedStakeShares, pr.stakesOriginalShareRate, s.stakedHearts, s.stakeID, address(0), BonusType.GOOD);
    }
}

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":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Transfer","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"data0","type":"uint256"},{"indexed":true,"internalType":"address","name":"senderAddr","type":"address"}],"name":"newDebtMint","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"data0","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"data1","type":"uint256"},{"indexed":true,"internalType":"uint256","name":"stakeId","type":"uint256"},{"indexed":true,"internalType":"uint256","name":"bonusType","type":"uint256"},{"indexed":true,"internalType":"address","name":"senderAddr","type":"address"},{"indexed":false,"internalType":"address","name":"referrer","type":"address"}],"name":"newMint","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"data0","type":"uint256"},{"indexed":true,"internalType":"address","name":"senderAddr","type":"address"}],"name":"stakeDepositCodeak","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"data0","type":"uint256"},{"indexed":true,"internalType":"address","name":"senderAddr","type":"address"}],"name":"stakeWithdrawCodeak","type":"event"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"addressEndBonusDebt","outputs":[{"internalType":"uint16","name":"nextPayoutDay","type":"uint16"},{"internalType":"uint128","name":"payoutDebt","type":"uint128"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"addressRestakeEndDebt","outputs":[{"internalType":"uint16","name":"stakedDays","type":"uint16"},{"internalType":"uint16","name":"endBonusPayoutDay","type":"uint16"},{"internalType":"uint72","name":"sharesDebt","type":"uint72"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"addressStakedCodeak","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"spender","type":"address"}],"name":"allowance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"approve","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"burn","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"burnFrom","outputs":[],"stateMutability":"nonpayable","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":[{"components":[{"internalType":"uint256","name":"stakeID","type":"uint256"},{"internalType":"uint256","name":"stakedHearts","type":"uint256"},{"internalType":"uint256","name":"stakeShares","type":"uint256"},{"internalType":"uint256","name":"lockedDay","type":"uint256"},{"internalType":"uint256","name":"stakedDays","type":"uint256"},{"internalType":"uint256","name":"unlockedDay","type":"uint256"}],"internalType":"struct Communis.Stake","name":"s","type":"tuple"}],"name":"getPayout","outputs":[{"components":[{"internalType":"uint256","name":"recalculatedStakeShares","type":"uint256"},{"internalType":"uint256","name":"stakesOriginalShareRate","type":"uint256"},{"internalType":"uint256","name":"maxPayout","type":"uint256"}],"internalType":"struct Communis.PayoutResponse","name":"pr","type":"tuple"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"uint256","name":"stakedDays","type":"uint256"},{"internalType":"uint256","name":"lockedDay","type":"uint256"},{"internalType":"uint256","name":"maxPayout","type":"uint256"},{"internalType":"uint256","name":"stakesOriginalShareRate","type":"uint256"},{"internalType":"uint256","name":"currentDay","type":"uint256"},{"internalType":"uint256","name":"globalShareRate","type":"uint256"},{"internalType":"bool","name":"applyRestakeBonus","type":"bool"}],"name":"getStartBonusPayout","outputs":[{"internalType":"uint256","name":"payout","type":"uint256"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"addedValue","type":"uint256"}],"name":"increaseAllowance","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"stakeIndex","type":"uint256"},{"internalType":"uint256","name":"stakeID","type":"uint256"},{"internalType":"address","name":"referrer","type":"address"},{"internalType":"uint256","name":"stakeAmount","type":"uint256"}],"name":"mintEndBonus","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"components":[{"internalType":"uint256","name":"stakeIndex","type":"uint256"},{"internalType":"uint256","name":"stakeID","type":"uint256"},{"internalType":"uint256","name":"stakeAmount","type":"uint256"}],"internalType":"struct Communis.stakeIndexIdAmount[]","name":"stakeIndexIdAmounts","type":"tuple[]"},{"internalType":"address","name":"referrer","type":"address"}],"name":"mintEndBonusBatch","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"stakeOwner","type":"address"},{"internalType":"uint256","name":"stakeIndex","type":"uint256"},{"internalType":"uint256","name":"stakeID","type":"uint256"}],"name":"mintGoodAccountingBonus","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"mintStakeBonus","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"stakeIndex","type":"uint256"},{"internalType":"uint256","name":"stakeID","type":"uint256"},{"internalType":"bool","name":"applyRestakeBonus","type":"bool"},{"internalType":"address","name":"referrer","type":"address"},{"internalType":"uint256","name":"stakeAmount","type":"uint256"}],"name":"mintStartBonus","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"components":[{"internalType":"uint256","name":"stakeIndex","type":"uint256"},{"internalType":"uint256","name":"stakeID","type":"uint256"},{"internalType":"uint256","name":"stakeAmount","type":"uint256"}],"internalType":"struct Communis.stakeIndexIdAmount[]","name":"stakeIndexIdAmounts","type":"tuple[]"},{"internalType":"address","name":"referrer","type":"address"}],"name":"mintStartBonusBatch","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"stakeIdEndBonusPayout","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"stakeIdGoodAccountingBonusPayout","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"stakeIdStartBonusPayout","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transfer","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transferFrom","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"withdrawAmount","type":"uint256"}],"name":"withdrawStakedCodeak","outputs":[],"stateMutability":"nonpayable","type":"function"}]

60806040523480156200001157600080fd5b506040518060400160405280600881526020017f436f6d6d756e69730000000000000000000000000000000000000000000000008152506040518060400160405280600381526020017f434f4d000000000000000000000000000000000000000000000000000000000081525081600390816200008f9190620001a4565b5060046200009e8282620001a4565b5050600580546001600160a01b031916732b591e99afe9f32eaa6214f7b7629768c40eeb391790555062000270565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600181811c908216806200011157607f821691505b6020821081036200014b577f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b50919050565b601f8211156200019f57600081815260208120601f850160051c810160208610156200017a5750805b601f850160051c820191505b818110156200019b5782815560010162000186565b5050505b505050565b81516001600160401b03811115620001c057620001c0620000cd565b620001d881620001d18454620000fc565b8462000151565b602080601f831160018114620002105760008415620001f75750858301515b600019600386901b1c1916600185901b1785556200019b565b600085815260208120601f198616915b82811015620002415788860151825594840194600190910190840162000220565b5085821015620002605787850151600019600388901b60f8161c191681555b5050505050600190811b01905550565b612f0f80620002806000396000f3fe608060405234801561001057600080fd5b50600436106101c45760003560e01c806379cc6790116100f9578063b2d9bf8011610097578063c031e1df11610071578063c031e1df1461046d578063dd62ed3e146104a2578063e107625d146104b5578063ea98ed9a146104c857600080fd5b8063b2d9bf801461043f578063b4f98bed14610452578063bf607ab81461046557600080fd5b80638efd25c3116100d35780638efd25c3146103fe57806395d89b4114610411578063a457c2d714610419578063a9059cbb1461042c57600080fd5b806379cc6790146103b85780637b4296db146103cb5780638c58e047146103eb57600080fd5b80633b665f9c1161016657806367350ffe1161014057806367350ffe1461033c5780636c03c39c1461034f57806370a082311461036f578063741bf9211461039857600080fd5b80633b665f9c1461026657806342966c68146102bd57806360bc0be8146102d057600080fd5b806323b872dd116101a257806323b872dd1461021c578063313ce5671461022f578063395093511461023e57806339d6e5671461025157600080fd5b806306fdde03146101c9578063095ea7b3146101e757806318160ddd1461020a575b600080fd5b6101d16104e8565b6040516101de91906126fd565b60405180910390f35b6101fa6101f5366004612767565b61057a565b60405190151581526020016101de565b6002545b6040519081526020016101de565b6101fa61022a366004612791565b610594565b604051600c81526020016101de565b6101fa61024c366004612767565b6105b8565b61026461025f3660046127cd565b6105da565b005b61029b610274366004612800565b60096020526000908152604090205461ffff8116906201000090046001600160801b031682565b6040805161ffff90931683526001600160801b039091166020830152016101de565b6102646102cb366004612822565b610940565b6103126102de366004612800565b60086020526000908152604090205461ffff808216916201000081049091169064010000000090046001600160481b031683565b6040805161ffff94851681529390921660208401526001600160481b0316908201526060016101de565b61026461034a366004612849565b61094d565b61020e61035d366004612822565b600a6020526000908152604090205481565b61020e61037d366004612800565b6001600160a01b031660009081526020819052604090205490565b61020e6103a6366004612822565b60066020526000908152604090205481565b6102646103c6366004612767565b6109e0565b61020e6103d9366004612800565b600b6020526000908152604090205481565b6102646103f9366004612899565b6109f9565b61026461040c366004612822565b610aee565b6101d1610bc7565b6101fa610427366004612767565b610bd6565b6101fa61043a366004612767565b610c51565b61026461044d366004612899565b610c5f565b61020e61046036600461291d565b610d4d565b610264610ee9565b61048061047b36600461297d565b610fcf565b60408051825181526020808401519082015291810151908201526060016101de565b61020e6104b0366004612a05565b6110c2565b6102646104c3366004612a38565b6110ed565b61020e6104d6366004612822565b60076020526000908152604090205481565b6060600380546104f790612a75565b80601f016020809104026020016040519081016040528092919081815260200182805461052390612a75565b80156105705780601f1061054557610100808354040283529160200191610570565b820191906000526020600020905b81548152906001019060200180831161055357829003601f168201915b5050505050905090565b600033610588818585611176565b60019150505b92915050565b6000336105a285828561129b565b6105ad85858561130f565b506001949350505050565b6000336105888185856105cb83836110c2565b6105d59190612ac5565b611176565b6000818152600a6020526040902054156106555760405162461bcd60e51b815260206004820152603160248201527f434f4d3a205374616b65494420476f6f64204163636f756e74696e6720426f6e6044820152701d5cc8185b1c9958591e481b5a5b9d1959607a1b60648201526084015b60405180910390fd5b600081815260076020526040902054156106815760405162461bcd60e51b815260040161064c90612ad8565b600061068e8484846114dd565b905061270f8160400151116106b55760405162461bcd60e51b815260040161064c90612b1d565b60a0810151156107075760405162461bcd60e51b815260206004820152601b60248201527f434f4d3a205374616b6520616c726561647920756e6c6f636b65640000000000604482015260640161064c565b8060800151816060015161071b9190612ac5565b610726906025612ac5565b600560009054906101000a90046001600160a01b03166001600160a01b0316635c9302c96040518163ffffffff1660e01b8152600401602060405180830381865afa158015610779573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061079d9190612b5f565b116107ea5760405162461bcd60e51b815260206004820152601f60248201527f434f4d3a20477261636520706572696f6420686173206e6f7420656e64656400604482015260640161064c565b6005546040516332e7b8d960e11b81526001600160a01b0386811660048301526024820186905264ffffffffff85166044830152909116906365cf71b290606401600060405180830381600087803b15801561084557600080fd5b505af1158015610859573d6000803e3d6000fd5b50505050600061086a8585856114dd565b90508060a001516000036108d45760405162461bcd60e51b815260206004820152602b60248201527f434f4d3a205374616b6520646964206e6f74206861766520476f6f642041636360448201526a37bab73a34b733903930b760a91b606482015260840161064c565b60006108df83610fcf565b90506000606482604001516108f49190612b78565b6000868152600a602052604090208190559050610911338261165e565b61093781856080015184600001518560200151886020015189600001516000600261173d565b50505050505050565b61094a33826117f5565b50565b6109d985858585600560009054906101000a90046001600160a01b03166001600160a01b0316635c9302c96040518163ffffffff1660e01b8152600401602060405180830381865afa1580156109a7573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906109cb9190612b5f565b6109d3611940565b876119c4565b5050505050565b6109eb82338361129b565b6109f582826117f5565b5050565b60055460408051635c9302c960e01b8152905184926000926001600160a01b0390911691635c9302c9916004808201926020929091908290030181865afa158015610a48573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610a6c9190612b5f565b90506000610a78611940565b905060005b8381101561093757610ae6878783818110610a9a57610a9a612b9a565b90506060020160000135888884818110610ab657610ab6612b9a565b9050606002016020013560008887878d8d89818110610ad757610ad7612b9a565b905060600201604001356119c4565b600101610a7d565b336000908152600b6020526040902054811115610b7d5760405162461bcd60e51b815260206004820152604160248201527f434f4d3a2052657175657374656420776974686472617720616d6f756e74206960448201527f73206d6f7265207468616e2041646472657373205374616b656420416d6f756e6064820152601d60fa1b608482015260a40161064c565b336000908152600b602052604081208054839290610b9c908490612bb0565b90915550610bac9050338261165e565b336000908152600b602052604090205461094a908290611d32565b6060600480546104f790612a75565b60003381610be482866110c2565b905083811015610c445760405162461bcd60e51b815260206004820152602560248201527f45524332303a2064656372656173656420616c6c6f77616e63652062656c6f77604482015264207a65726f60d81b606482015260840161064c565b6105ad8286868403611176565b60003361058881858561130f565b60055460408051635c9302c960e01b8152905184926000926001600160a01b0390911691635c9302c9916004808201926020929091908290030181865afa158015610cae573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610cd29190612b5f565b905060005b82811015610d4557610d3d868683818110610cf457610cf4612b9a565b90506060020160000135878784818110610d1057610d10612b9a565b9050606002016020013586858a8a87818110610d2e57610d2e612b9a565b90506060020160400135611d85565b600101610cd7565b505050505050565b600080821515600103610dbb57611446610d6961016d8b612bb0565b610d78906402540be400612bc3565b610d829190612b78565b90506402540be400610d99826406fc23ac00612bc3565b610da39190612b78565b9050610db481640ba43b7400612bb0565b9050610e7a565b61016c891115610e1f57611446610dd461016d8b612bb0565b610de3906402540be400612bc3565b610ded9190612b78565b90506402540be400610e0482640df8475800612bc3565b610e0e9190612b78565b9050610db48164174876e800612bb0565b60b9610e2c60b48b612bb0565b610e3b906402540be400612bc3565b610e459190612b78565b90506402540be400610e5c8264174876e800612bc3565b610e669190612b78565b9050610e7781642e90edd000612bb0565b90505b80610e8a886402540be400612bc3565b610e949190612b78565b9150878514610edd57600084610eb18866038d7ea4c68000612bc3565b610ebb9190612b78565b905066038d7ea4c68000610ecf8285612bc3565b610ed99190612b78565b9250505b50979650505050505050565b33600090815260096020526040902080546201000090046001600160801b03161561094a57336000908152600b602052604090205481546201000090046001600160801b0316811015610f4e5760405162461bcd60e51b815260040161064c90612be2565b6109f582600560009054906101000a90046001600160a01b03166001600160a01b0316635c9302c96040518163ffffffff1660e01b8152600401602060405180830381865afa158015610fa5573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610fc99190612b5f565b83612143565b610ff360405180606001604052806000815260200160008152602001600081525090565b60008260400151611003846121fd565b84602001516110129190612ac5565b61101f90620186a0612bc3565b6110299190612b78565b9050600081611037856122b8565b85602001516110469190612ac5565b6110589067016345785d8a0000612bc3565b6110629190612b78565b6020840183905280845260808501519091506000906115b39061108c9066038d7ea4c68000612bc3565b6110969190612b78565b905066038d7ea4c680006110aa8284612bc3565b6110b49190612b78565b604085015250919392505050565b6001600160a01b03918216600090815260016020908152604080832093909416825291909152205490565b611170848484600560009054906101000a90046001600160a01b03166001600160a01b0316635c9302c96040518163ffffffff1660e01b8152600401602060405180830381865afa158015611146573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061116a9190612b5f565b85611d85565b50505050565b6001600160a01b0383166111d85760405162461bcd60e51b8152602060048201526024808201527f45524332303a20617070726f76652066726f6d20746865207a65726f206164646044820152637265737360e01b606482015260840161064c565b6001600160a01b0382166112395760405162461bcd60e51b815260206004820152602260248201527f45524332303a20617070726f766520746f20746865207a65726f206164647265604482015261737360f01b606482015260840161064c565b6001600160a01b0383811660008181526001602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92591015b60405180910390a3505050565b60006112a784846110c2565b9050600019811461117057818110156113025760405162461bcd60e51b815260206004820152601d60248201527f45524332303a20696e73756666696369656e7420616c6c6f77616e6365000000604482015260640161064c565b6111708484848403611176565b6001600160a01b0383166113735760405162461bcd60e51b815260206004820152602560248201527f45524332303a207472616e736665722066726f6d20746865207a65726f206164604482015264647265737360d81b606482015260840161064c565b6001600160a01b0382166113d55760405162461bcd60e51b815260206004820152602360248201527f45524332303a207472616e7366657220746f20746865207a65726f206164647260448201526265737360e81b606482015260840161064c565b6001600160a01b0383166000908152602081905260409020548181101561144d5760405162461bcd60e51b815260206004820152602660248201527f45524332303a207472616e7366657220616d6f756e7420657863656564732062604482015265616c616e636560d01b606482015260840161064c565b6001600160a01b03808516600090815260208190526040808220858503905591851681529081208054849290611484908490612ac5565b92505081905550826001600160a01b0316846001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef846040516114d091815260200190565b60405180910390a3611170565b6115166040518060c001604052806000815260200160008152602001600081526020016000815260200160008152602001600081525090565b600554604051632607443b60e01b81526001600160a01b038681166004830152602482018690526000928392839283928392839290911690632607443b9060440160e060405180830381865afa158015611574573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906115989190612c7d565b50949a5092985090965094509250905064ffffffffff8616881461160c5760405162461bcd60e51b815260206004820152602560248201527f434f4d3a2041737375726520636f727265637420616e642063757272656e74206044820152647374616b6560d81b606482015260840161064c565b6040805160c08101825264ffffffffff90971687526001600160481b039586166020880152939094169285019290925261ffff908116606085015290811660808401521660a082015290509392505050565b6001600160a01b0382166116b45760405162461bcd60e51b815260206004820152601f60248201527f45524332303a206d696e7420746f20746865207a65726f206164647265737300604482015260640161064c565b80600260008282546116c69190612ac5565b90915550506001600160a01b038216600090815260208190526040812080548392906116f3908490612ac5565b90915550506040518181526001600160a01b038316906000907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9060200160405180910390a35050565b3381600381111561175057611750612cf7565b847fafc22f2a1b7c8423cb392f3fe7711c08b38f98246adb12e5a041c2fba455ef2a60808a6001600160801b0316901b8c6001600160801b0316176060896001600160481b0316901b60388b64ffffffffff16901b60288e61ffff16901b4264ffffffffff16171717876040516117e39392919092835260208301919091526001600160a01b0316604082015260600190565b60405180910390a45050505050505050565b6001600160a01b0382166118555760405162461bcd60e51b815260206004820152602160248201527f45524332303a206275726e2066726f6d20746865207a65726f206164647265736044820152607360f81b606482015260840161064c565b6001600160a01b038216600090815260208190526040902054818110156118c95760405162461bcd60e51b815260206004820152602260248201527f45524332303a206275726e20616d6f756e7420657863656564732062616c616e604482015261636560f01b606482015260840161064c565b6001600160a01b03831660009081526020819052604081208383039055600280548492906118f8908490612bb0565b90915550506040518281526000906001600160a01b038516907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9060200161128e565b505050565b6005546040805163c312452560e01b815290516000926001600160a01b03169163c3124525916004808301926101009291908290030181865afa15801561198b573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906119af9190612d0d565b505064ffffffffff9093169695505050505050565b60008681526006602052604090205415611a305760405162461bcd60e51b815260206004820152602760248201527f434f4d3a205374616b65494420537461727420426f6e757320616c7265616479604482015266081b5a5b9d195960ca1b606482015260840161064c565b60008681526007602052604090205415611a5c5760405162461bcd60e51b815260040161064c90612ad8565b6000611a693389896114dd565b905061270f816040015111611a905760405162461bcd60e51b815260040161064c90612b1d565b60b3816080015111611af25760405162461bcd60e51b815260206004820152602560248201527f434f4d3a204d696e696d756d20313830207374616b65642064617973207265716044820152641d5a5c995960da1b606482015260840161064c565b8060600151841015611b3e5760405162461bcd60e51b8152602060048201526015602482015274434f4d3a205374616b65206e6f742041637469766560581b604482015260640161064c565b6000861515600103611b5757611b53826122cc565b5060035b6000611b6283610fcf565b90506000611b8584608001518560600151846040015185602001518b8b8f610d4d565b9050336001600160a01b03891603611bb357611ba2606482612b78565b611bac9082612ac5565b9050611bfe565b6001600160a01b03881615611bdb57611bd688611bd1606484612b78565b61165e565b611bfe565b611bfe733def1720ce2b04a56f0ee6bc9875c64a785136b9611bd1606484612b78565b60008a81526006602090815260408083208490553383526009909152902080546201000090046001600160801b031615801590611c5b57508054336000908152600b6020526040902054620100009091046001600160801b031611155b15611c7d57336000908152600b6020526040902054611c7d9082908a90612143565b8515611cf05781861115611ca35760405162461bcd60e51b815260040161064c90612db4565b336000908152600b602052604081208054889290611cc2908490612ac5565b90915550611cd290508683612bb0565b336000908152600b6020526040902054909250611cf090879061259b565b8115611d0057611d00338361165e565b611d248286608001518560000151866020015189602001518a600001518f8b61173d565b505050505050505050505050565b6040516001600160801b0383166001600160801b0319608084901b1617815233907f4cbbb1897a82fabe5c208fdda8b9787408442e9e6f9263068465e228a5f906c4906020015b60405180910390a25050565b60008481526007602052604090205415611db15760405162461bcd60e51b815260040161064c90612ad8565b6000611dbe3387876114dd565b905061016c816080015111611de55760405162461bcd60e51b815260040161064c90612e03565b61270f816040015111611e0a5760405162461bcd60e51b815260040161064c90612b1d565b600081608001518260600151611e209190612ac5565b905080841015611e675760405162461bcd60e51b8152602060048201526012602482015271434f4d3a205374616b65206e6f742064756560701b604482015260640161064c565b611e72816025612ac5565b841115611ec15760405162461bcd60e51b815260206004820152601760248201527f434f4d3a20477261636520706572696f6420656e646564000000000000000000604482015260640161064c565b6000611ecc83610fcf565b60008881526006602052604080822054908301519293509091611eef9190612bb0565b9050336001600160a01b03881603611f1d57611f0c606482612b78565b611f169082612ac5565b9050611f63565b6001600160a01b03871615611f4057611f3b87611bd1606484612b78565b611f63565b611f63733def1720ce2b04a56f0ee6bc9875c64a785136b9611bd1606484612b78565b6000888152600760205260408120829055611f7f600283612b78565b3360009081526009602052604090208054919250906201000090046001600160801b031615611fc557336000908152600b6020526040902054611fc59082908a90612143565b86156120385782871115611feb5760405162461bcd60e51b815260040161064c90612db4565b336000908152600b60205260408120805489929061200a908490612ac5565b9091555061201a90508784612bb0565b336000908152600b602052604090205490935061203890889061259b565b80546201000090046001600160801b031615612093578054336000908152600b6020526040902054620100009091046001600160801b0316111561208e5760405162461bcd60e51b815260040161064c90612be2565b6120b0565b61209e88605b612e48565b815461ffff191661ffff919091161781555b82156120c0576120c0338461165e565b6120e5838760800151866000015187602001518a602001518b600001518f600161173d565b6120ef88876125e6565b8054829082906002906121129084906201000090046001600160801b0316612e6a565b92506101000a8154816001600160801b0302191690836001600160801b031602179055505050505050505050505050565b825461ffff16821061193b578254600090605b906121659061ffff1685612bb0565b61216f9190612b78565b61217a906001612ac5565b90506000605061218a8385612bc3565b6121949190612b78565b90506121a0338261165e565b6121ab82605b612bc3565b855486906000906121c190849061ffff16612e48565b82546101009290920a61ffff81810219909316918316021790915586546109d992509081169083906201000090046001600160801b0316612697565b6000806000905060018360800151111561223b57610e388360800151111561222757610e38612238565b600183608001516122389190612bb0565b90505b600066354a6ba7a180008460200151111561225d5766354a6ba7a18000612263565b83602001515b9050680ecca2d59581a4000061227b8261071c612bc3565b61228d84670214e8348c4f0000612bc3565b6122979190612ac5565b85602001516122a69190612bc3565b6122b09190612b78565b949350505050565b600080600183608001516122389190612bb0565b61016c8160800151116122f15760405162461bcd60e51b815260040161064c90612e03565b336000908152600860205260408120805490916201000090910461ffff1690036123675760405162461bcd60e51b815260206004820152602160248201527f434f4d3a204e6f2076616c69642072657374616b65206f70706f7274756e69746044820152607960f81b606482015260840161064c565b805460608301516201000090910461ffff16106123e15760405162461bcd60e51b815260206004820152603260248201527f434f4d3a205374617274205374616b65206d757374206265206e65776572207460448201527168616e2070726576696f7573207374616b6560701b606482015260840161064c565b81608001516115b314806123ff57508054608083015161ffff909116105b6124695760405162461bcd60e51b815260206004820152603560248201527f434f4d3a204e6577207374616b65642064617973206d7573742062652067726560448201527461746572207468616e20746f2070726576696f757360581b606482015260840161064c565b805460408301516401000000009091046001600160481b031611156124e35760405162461bcd60e51b815260206004820152602a60248201527f434f4d3a2052657374616b65206d757374206174206c65617374206d61696e7460448201526961696e2073686172657360b01b606482015260840161064c565b80546125019064010000000090046001600160481b03166002612e8a565b6001600160481b0316826040015111156125745760405162461bcd60e51b815260206004820152602e60248201527f434f4d3a2052657374616b65207368617265732063616e6e6f74206265206d6f60448201526d7265207468616e20646f75626c6560901b606482015260840161064c565b505033600090815260086020526040902080546cffffffffffffffffffffffffff19169055565b6040516001600160801b0383166001600160801b0319608084901b1617815233907fa8f21c07a94b82da90d177f9b2b3a25e91a969ac251d1601fa387a831c951ad890602001611d79565b336000908152600860205260409020805462010000900461ffff1683111561261f57805463ffff000019166201000061ffff8516021781555b6080820151815461ffff161015612646576080820151815461ffff191661ffff9091161781555b60408201518154829060049061266e90849064010000000090046001600160481b0316612eb9565b92506101000a8154816001600160481b0302191690836001600160481b03160217905550505050565b60405161ffff84166fffffffffffffffffffffffffffff0000601085901b16176001600160801b0319608084901b1617815233907f3a4343c9c29638775b0d0acbd8fcb6ec75cf77284a520b2f4b41357b86f4900c9060200160405180910390a2505050565b600060208083528351808285015260005b8181101561272a5785810183015185820160400152820161270e565b506000604082860101526040601f19601f8301168501019250505092915050565b80356001600160a01b038116811461276257600080fd5b919050565b6000806040838503121561277a57600080fd5b6127838361274b565b946020939093013593505050565b6000806000606084860312156127a657600080fd5b6127af8461274b565b92506127bd6020850161274b565b9150604084013590509250925092565b6000806000606084860312156127e257600080fd5b6127eb8461274b565b95602085013595506040909401359392505050565b60006020828403121561281257600080fd5b61281b8261274b565b9392505050565b60006020828403121561283457600080fd5b5035919050565b801515811461094a57600080fd5b600080600080600060a0868803121561286157600080fd5b8535945060208601359350604086013561287a8161283b565b92506128886060870161274b565b949793965091946080013592915050565b6000806000604084860312156128ae57600080fd5b833567ffffffffffffffff808211156128c657600080fd5b818601915086601f8301126128da57600080fd5b8135818111156128e957600080fd5b8760206060830285010111156128fe57600080fd5b602092830195509350612914918601905061274b565b90509250925092565b600080600080600080600060e0888a03121561293857600080fd5b873596506020880135955060408801359450606088013593506080880135925060a0880135915060c088013561296d8161283b565b8091505092959891949750929550565b600060c0828403121561298f57600080fd5b60405160c0810181811067ffffffffffffffff821117156129c057634e487b7160e01b600052604160045260246000fd5b8060405250823581526020830135602082015260408301356040820152606083013560608201526080830135608082015260a083013560a08201528091505092915050565b60008060408385031215612a1857600080fd5b612a218361274b565b9150612a2f6020840161274b565b90509250929050565b60008060008060808587031215612a4e57600080fd5b8435935060208501359250612a656040860161274b565b9396929550929360600135925050565b600181811c90821680612a8957607f821691505b602082108103612aa957634e487b7160e01b600052602260045260246000fd5b50919050565b634e487b7160e01b600052601160045260246000fd5b8082018082111561058e5761058e612aaf565b60208082526025908201527f434f4d3a205374616b65494420456e6420426f6e757320616c7265616479206d6040820152641a5b9d195960da1b606082015260800190565b60208082526022908201527f434f4d3a204d696e696d756d2031303030302073686172657320726571756972604082015261195960f21b606082015260800190565b600060208284031215612b7157600080fd5b5051919050565b600082612b9557634e487b7160e01b600052601260045260246000fd5b500490565b634e487b7160e01b600052603260045260246000fd5b8181038181111561058e5761058e612aaf565b6000816000190483118215151615612bdd57612bdd612aaf565b500290565b60208082526038908201527f434f4d3a2041646472657373205374616b656420416d6f756e7420646f65732060408201527f6e6f7420636f76657220456e6420426f6e757320446562740000000000000000606082015260800190565b805164ffffffffff8116811461276257600080fd5b80516001600160481b038116811461276257600080fd5b805161ffff8116811461276257600080fd5b600080600080600080600060e0888a031215612c9857600080fd5b612ca188612c3f565b9650612caf60208901612c54565b9550612cbd60408901612c54565b9450612ccb60608901612c6b565b9350612cd960808901612c6b565b9250612ce760a08901612c6b565b915060c088015161296d8161283b565b634e487b7160e01b600052602160045260246000fd5b600080600080600080600080610100898b031215612d2a57600080fd5b612d3389612c54565b9750612d4160208a01612c54565b9650612d4f60408a01612c3f565b9550612d5d60608a01612c54565b9450612d6b60808a01612c6b565b9350612d7960a08a01612c54565b9250612d8760c08a01612c3f565b915060e08901516001600160801b0381168114612da357600080fd5b809150509295985092959890939650565b6020808252602f908201527f434f4d3a205374616b6520616d6f756e74206973206d6f7265207468616e206160408201526e1d985a5b18589b19481c185e5bdd5d608a1b606082015260800190565b60208082526025908201527f434f4d3a204d696e696d756d20333635207374616b65642064617973207265716040820152641d5a5c995960da1b606082015260800190565b61ffff818116838216019080821115612e6357612e63612aaf565b5092915050565b6001600160801b03818116838216019080821115612e6357612e63612aaf565b60006001600160481b0380831681851681830481118215151615612eb057612eb0612aaf565b02949350505050565b6001600160481b03818116838216019080821115612e6357612e63612aaf56fea264697066735822122061a13278b51a7e83d610fe88bde393134b6eef7699d4c59c7a88088a0cba7ed664736f6c63430008100033

Deployed Bytecode

0x608060405234801561001057600080fd5b50600436106101c45760003560e01c806379cc6790116100f9578063b2d9bf8011610097578063c031e1df11610071578063c031e1df1461046d578063dd62ed3e146104a2578063e107625d146104b5578063ea98ed9a146104c857600080fd5b8063b2d9bf801461043f578063b4f98bed14610452578063bf607ab81461046557600080fd5b80638efd25c3116100d35780638efd25c3146103fe57806395d89b4114610411578063a457c2d714610419578063a9059cbb1461042c57600080fd5b806379cc6790146103b85780637b4296db146103cb5780638c58e047146103eb57600080fd5b80633b665f9c1161016657806367350ffe1161014057806367350ffe1461033c5780636c03c39c1461034f57806370a082311461036f578063741bf9211461039857600080fd5b80633b665f9c1461026657806342966c68146102bd57806360bc0be8146102d057600080fd5b806323b872dd116101a257806323b872dd1461021c578063313ce5671461022f578063395093511461023e57806339d6e5671461025157600080fd5b806306fdde03146101c9578063095ea7b3146101e757806318160ddd1461020a575b600080fd5b6101d16104e8565b6040516101de91906126fd565b60405180910390f35b6101fa6101f5366004612767565b61057a565b60405190151581526020016101de565b6002545b6040519081526020016101de565b6101fa61022a366004612791565b610594565b604051600c81526020016101de565b6101fa61024c366004612767565b6105b8565b61026461025f3660046127cd565b6105da565b005b61029b610274366004612800565b60096020526000908152604090205461ffff8116906201000090046001600160801b031682565b6040805161ffff90931683526001600160801b039091166020830152016101de565b6102646102cb366004612822565b610940565b6103126102de366004612800565b60086020526000908152604090205461ffff808216916201000081049091169064010000000090046001600160481b031683565b6040805161ffff94851681529390921660208401526001600160481b0316908201526060016101de565b61026461034a366004612849565b61094d565b61020e61035d366004612822565b600a6020526000908152604090205481565b61020e61037d366004612800565b6001600160a01b031660009081526020819052604090205490565b61020e6103a6366004612822565b60066020526000908152604090205481565b6102646103c6366004612767565b6109e0565b61020e6103d9366004612800565b600b6020526000908152604090205481565b6102646103f9366004612899565b6109f9565b61026461040c366004612822565b610aee565b6101d1610bc7565b6101fa610427366004612767565b610bd6565b6101fa61043a366004612767565b610c51565b61026461044d366004612899565b610c5f565b61020e61046036600461291d565b610d4d565b610264610ee9565b61048061047b36600461297d565b610fcf565b60408051825181526020808401519082015291810151908201526060016101de565b61020e6104b0366004612a05565b6110c2565b6102646104c3366004612a38565b6110ed565b61020e6104d6366004612822565b60076020526000908152604090205481565b6060600380546104f790612a75565b80601f016020809104026020016040519081016040528092919081815260200182805461052390612a75565b80156105705780601f1061054557610100808354040283529160200191610570565b820191906000526020600020905b81548152906001019060200180831161055357829003601f168201915b5050505050905090565b600033610588818585611176565b60019150505b92915050565b6000336105a285828561129b565b6105ad85858561130f565b506001949350505050565b6000336105888185856105cb83836110c2565b6105d59190612ac5565b611176565b6000818152600a6020526040902054156106555760405162461bcd60e51b815260206004820152603160248201527f434f4d3a205374616b65494420476f6f64204163636f756e74696e6720426f6e6044820152701d5cc8185b1c9958591e481b5a5b9d1959607a1b60648201526084015b60405180910390fd5b600081815260076020526040902054156106815760405162461bcd60e51b815260040161064c90612ad8565b600061068e8484846114dd565b905061270f8160400151116106b55760405162461bcd60e51b815260040161064c90612b1d565b60a0810151156107075760405162461bcd60e51b815260206004820152601b60248201527f434f4d3a205374616b6520616c726561647920756e6c6f636b65640000000000604482015260640161064c565b8060800151816060015161071b9190612ac5565b610726906025612ac5565b600560009054906101000a90046001600160a01b03166001600160a01b0316635c9302c96040518163ffffffff1660e01b8152600401602060405180830381865afa158015610779573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061079d9190612b5f565b116107ea5760405162461bcd60e51b815260206004820152601f60248201527f434f4d3a20477261636520706572696f6420686173206e6f7420656e64656400604482015260640161064c565b6005546040516332e7b8d960e11b81526001600160a01b0386811660048301526024820186905264ffffffffff85166044830152909116906365cf71b290606401600060405180830381600087803b15801561084557600080fd5b505af1158015610859573d6000803e3d6000fd5b50505050600061086a8585856114dd565b90508060a001516000036108d45760405162461bcd60e51b815260206004820152602b60248201527f434f4d3a205374616b6520646964206e6f74206861766520476f6f642041636360448201526a37bab73a34b733903930b760a91b606482015260840161064c565b60006108df83610fcf565b90506000606482604001516108f49190612b78565b6000868152600a602052604090208190559050610911338261165e565b61093781856080015184600001518560200151886020015189600001516000600261173d565b50505050505050565b61094a33826117f5565b50565b6109d985858585600560009054906101000a90046001600160a01b03166001600160a01b0316635c9302c96040518163ffffffff1660e01b8152600401602060405180830381865afa1580156109a7573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906109cb9190612b5f565b6109d3611940565b876119c4565b5050505050565b6109eb82338361129b565b6109f582826117f5565b5050565b60055460408051635c9302c960e01b8152905184926000926001600160a01b0390911691635c9302c9916004808201926020929091908290030181865afa158015610a48573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610a6c9190612b5f565b90506000610a78611940565b905060005b8381101561093757610ae6878783818110610a9a57610a9a612b9a565b90506060020160000135888884818110610ab657610ab6612b9a565b9050606002016020013560008887878d8d89818110610ad757610ad7612b9a565b905060600201604001356119c4565b600101610a7d565b336000908152600b6020526040902054811115610b7d5760405162461bcd60e51b815260206004820152604160248201527f434f4d3a2052657175657374656420776974686472617720616d6f756e74206960448201527f73206d6f7265207468616e2041646472657373205374616b656420416d6f756e6064820152601d60fa1b608482015260a40161064c565b336000908152600b602052604081208054839290610b9c908490612bb0565b90915550610bac9050338261165e565b336000908152600b602052604090205461094a908290611d32565b6060600480546104f790612a75565b60003381610be482866110c2565b905083811015610c445760405162461bcd60e51b815260206004820152602560248201527f45524332303a2064656372656173656420616c6c6f77616e63652062656c6f77604482015264207a65726f60d81b606482015260840161064c565b6105ad8286868403611176565b60003361058881858561130f565b60055460408051635c9302c960e01b8152905184926000926001600160a01b0390911691635c9302c9916004808201926020929091908290030181865afa158015610cae573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610cd29190612b5f565b905060005b82811015610d4557610d3d868683818110610cf457610cf4612b9a565b90506060020160000135878784818110610d1057610d10612b9a565b9050606002016020013586858a8a87818110610d2e57610d2e612b9a565b90506060020160400135611d85565b600101610cd7565b505050505050565b600080821515600103610dbb57611446610d6961016d8b612bb0565b610d78906402540be400612bc3565b610d829190612b78565b90506402540be400610d99826406fc23ac00612bc3565b610da39190612b78565b9050610db481640ba43b7400612bb0565b9050610e7a565b61016c891115610e1f57611446610dd461016d8b612bb0565b610de3906402540be400612bc3565b610ded9190612b78565b90506402540be400610e0482640df8475800612bc3565b610e0e9190612b78565b9050610db48164174876e800612bb0565b60b9610e2c60b48b612bb0565b610e3b906402540be400612bc3565b610e459190612b78565b90506402540be400610e5c8264174876e800612bc3565b610e669190612b78565b9050610e7781642e90edd000612bb0565b90505b80610e8a886402540be400612bc3565b610e949190612b78565b9150878514610edd57600084610eb18866038d7ea4c68000612bc3565b610ebb9190612b78565b905066038d7ea4c68000610ecf8285612bc3565b610ed99190612b78565b9250505b50979650505050505050565b33600090815260096020526040902080546201000090046001600160801b03161561094a57336000908152600b602052604090205481546201000090046001600160801b0316811015610f4e5760405162461bcd60e51b815260040161064c90612be2565b6109f582600560009054906101000a90046001600160a01b03166001600160a01b0316635c9302c96040518163ffffffff1660e01b8152600401602060405180830381865afa158015610fa5573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610fc99190612b5f565b83612143565b610ff360405180606001604052806000815260200160008152602001600081525090565b60008260400151611003846121fd565b84602001516110129190612ac5565b61101f90620186a0612bc3565b6110299190612b78565b9050600081611037856122b8565b85602001516110469190612ac5565b6110589067016345785d8a0000612bc3565b6110629190612b78565b6020840183905280845260808501519091506000906115b39061108c9066038d7ea4c68000612bc3565b6110969190612b78565b905066038d7ea4c680006110aa8284612bc3565b6110b49190612b78565b604085015250919392505050565b6001600160a01b03918216600090815260016020908152604080832093909416825291909152205490565b611170848484600560009054906101000a90046001600160a01b03166001600160a01b0316635c9302c96040518163ffffffff1660e01b8152600401602060405180830381865afa158015611146573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061116a9190612b5f565b85611d85565b50505050565b6001600160a01b0383166111d85760405162461bcd60e51b8152602060048201526024808201527f45524332303a20617070726f76652066726f6d20746865207a65726f206164646044820152637265737360e01b606482015260840161064c565b6001600160a01b0382166112395760405162461bcd60e51b815260206004820152602260248201527f45524332303a20617070726f766520746f20746865207a65726f206164647265604482015261737360f01b606482015260840161064c565b6001600160a01b0383811660008181526001602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92591015b60405180910390a3505050565b60006112a784846110c2565b9050600019811461117057818110156113025760405162461bcd60e51b815260206004820152601d60248201527f45524332303a20696e73756666696369656e7420616c6c6f77616e6365000000604482015260640161064c565b6111708484848403611176565b6001600160a01b0383166113735760405162461bcd60e51b815260206004820152602560248201527f45524332303a207472616e736665722066726f6d20746865207a65726f206164604482015264647265737360d81b606482015260840161064c565b6001600160a01b0382166113d55760405162461bcd60e51b815260206004820152602360248201527f45524332303a207472616e7366657220746f20746865207a65726f206164647260448201526265737360e81b606482015260840161064c565b6001600160a01b0383166000908152602081905260409020548181101561144d5760405162461bcd60e51b815260206004820152602660248201527f45524332303a207472616e7366657220616d6f756e7420657863656564732062604482015265616c616e636560d01b606482015260840161064c565b6001600160a01b03808516600090815260208190526040808220858503905591851681529081208054849290611484908490612ac5565b92505081905550826001600160a01b0316846001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef846040516114d091815260200190565b60405180910390a3611170565b6115166040518060c001604052806000815260200160008152602001600081526020016000815260200160008152602001600081525090565b600554604051632607443b60e01b81526001600160a01b038681166004830152602482018690526000928392839283928392839290911690632607443b9060440160e060405180830381865afa158015611574573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906115989190612c7d565b50949a5092985090965094509250905064ffffffffff8616881461160c5760405162461bcd60e51b815260206004820152602560248201527f434f4d3a2041737375726520636f727265637420616e642063757272656e74206044820152647374616b6560d81b606482015260840161064c565b6040805160c08101825264ffffffffff90971687526001600160481b039586166020880152939094169285019290925261ffff908116606085015290811660808401521660a082015290509392505050565b6001600160a01b0382166116b45760405162461bcd60e51b815260206004820152601f60248201527f45524332303a206d696e7420746f20746865207a65726f206164647265737300604482015260640161064c565b80600260008282546116c69190612ac5565b90915550506001600160a01b038216600090815260208190526040812080548392906116f3908490612ac5565b90915550506040518181526001600160a01b038316906000907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9060200160405180910390a35050565b3381600381111561175057611750612cf7565b847fafc22f2a1b7c8423cb392f3fe7711c08b38f98246adb12e5a041c2fba455ef2a60808a6001600160801b0316901b8c6001600160801b0316176060896001600160481b0316901b60388b64ffffffffff16901b60288e61ffff16901b4264ffffffffff16171717876040516117e39392919092835260208301919091526001600160a01b0316604082015260600190565b60405180910390a45050505050505050565b6001600160a01b0382166118555760405162461bcd60e51b815260206004820152602160248201527f45524332303a206275726e2066726f6d20746865207a65726f206164647265736044820152607360f81b606482015260840161064c565b6001600160a01b038216600090815260208190526040902054818110156118c95760405162461bcd60e51b815260206004820152602260248201527f45524332303a206275726e20616d6f756e7420657863656564732062616c616e604482015261636560f01b606482015260840161064c565b6001600160a01b03831660009081526020819052604081208383039055600280548492906118f8908490612bb0565b90915550506040518281526000906001600160a01b038516907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9060200161128e565b505050565b6005546040805163c312452560e01b815290516000926001600160a01b03169163c3124525916004808301926101009291908290030181865afa15801561198b573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906119af9190612d0d565b505064ffffffffff9093169695505050505050565b60008681526006602052604090205415611a305760405162461bcd60e51b815260206004820152602760248201527f434f4d3a205374616b65494420537461727420426f6e757320616c7265616479604482015266081b5a5b9d195960ca1b606482015260840161064c565b60008681526007602052604090205415611a5c5760405162461bcd60e51b815260040161064c90612ad8565b6000611a693389896114dd565b905061270f816040015111611a905760405162461bcd60e51b815260040161064c90612b1d565b60b3816080015111611af25760405162461bcd60e51b815260206004820152602560248201527f434f4d3a204d696e696d756d20313830207374616b65642064617973207265716044820152641d5a5c995960da1b606482015260840161064c565b8060600151841015611b3e5760405162461bcd60e51b8152602060048201526015602482015274434f4d3a205374616b65206e6f742041637469766560581b604482015260640161064c565b6000861515600103611b5757611b53826122cc565b5060035b6000611b6283610fcf565b90506000611b8584608001518560600151846040015185602001518b8b8f610d4d565b9050336001600160a01b03891603611bb357611ba2606482612b78565b611bac9082612ac5565b9050611bfe565b6001600160a01b03881615611bdb57611bd688611bd1606484612b78565b61165e565b611bfe565b611bfe733def1720ce2b04a56f0ee6bc9875c64a785136b9611bd1606484612b78565b60008a81526006602090815260408083208490553383526009909152902080546201000090046001600160801b031615801590611c5b57508054336000908152600b6020526040902054620100009091046001600160801b031611155b15611c7d57336000908152600b6020526040902054611c7d9082908a90612143565b8515611cf05781861115611ca35760405162461bcd60e51b815260040161064c90612db4565b336000908152600b602052604081208054889290611cc2908490612ac5565b90915550611cd290508683612bb0565b336000908152600b6020526040902054909250611cf090879061259b565b8115611d0057611d00338361165e565b611d248286608001518560000151866020015189602001518a600001518f8b61173d565b505050505050505050505050565b6040516001600160801b0383166001600160801b0319608084901b1617815233907f4cbbb1897a82fabe5c208fdda8b9787408442e9e6f9263068465e228a5f906c4906020015b60405180910390a25050565b60008481526007602052604090205415611db15760405162461bcd60e51b815260040161064c90612ad8565b6000611dbe3387876114dd565b905061016c816080015111611de55760405162461bcd60e51b815260040161064c90612e03565b61270f816040015111611e0a5760405162461bcd60e51b815260040161064c90612b1d565b600081608001518260600151611e209190612ac5565b905080841015611e675760405162461bcd60e51b8152602060048201526012602482015271434f4d3a205374616b65206e6f742064756560701b604482015260640161064c565b611e72816025612ac5565b841115611ec15760405162461bcd60e51b815260206004820152601760248201527f434f4d3a20477261636520706572696f6420656e646564000000000000000000604482015260640161064c565b6000611ecc83610fcf565b60008881526006602052604080822054908301519293509091611eef9190612bb0565b9050336001600160a01b03881603611f1d57611f0c606482612b78565b611f169082612ac5565b9050611f63565b6001600160a01b03871615611f4057611f3b87611bd1606484612b78565b611f63565b611f63733def1720ce2b04a56f0ee6bc9875c64a785136b9611bd1606484612b78565b6000888152600760205260408120829055611f7f600283612b78565b3360009081526009602052604090208054919250906201000090046001600160801b031615611fc557336000908152600b6020526040902054611fc59082908a90612143565b86156120385782871115611feb5760405162461bcd60e51b815260040161064c90612db4565b336000908152600b60205260408120805489929061200a908490612ac5565b9091555061201a90508784612bb0565b336000908152600b602052604090205490935061203890889061259b565b80546201000090046001600160801b031615612093578054336000908152600b6020526040902054620100009091046001600160801b0316111561208e5760405162461bcd60e51b815260040161064c90612be2565b6120b0565b61209e88605b612e48565b815461ffff191661ffff919091161781555b82156120c0576120c0338461165e565b6120e5838760800151866000015187602001518a602001518b600001518f600161173d565b6120ef88876125e6565b8054829082906002906121129084906201000090046001600160801b0316612e6a565b92506101000a8154816001600160801b0302191690836001600160801b031602179055505050505050505050505050565b825461ffff16821061193b578254600090605b906121659061ffff1685612bb0565b61216f9190612b78565b61217a906001612ac5565b90506000605061218a8385612bc3565b6121949190612b78565b90506121a0338261165e565b6121ab82605b612bc3565b855486906000906121c190849061ffff16612e48565b82546101009290920a61ffff81810219909316918316021790915586546109d992509081169083906201000090046001600160801b0316612697565b6000806000905060018360800151111561223b57610e388360800151111561222757610e38612238565b600183608001516122389190612bb0565b90505b600066354a6ba7a180008460200151111561225d5766354a6ba7a18000612263565b83602001515b9050680ecca2d59581a4000061227b8261071c612bc3565b61228d84670214e8348c4f0000612bc3565b6122979190612ac5565b85602001516122a69190612bc3565b6122b09190612b78565b949350505050565b600080600183608001516122389190612bb0565b61016c8160800151116122f15760405162461bcd60e51b815260040161064c90612e03565b336000908152600860205260408120805490916201000090910461ffff1690036123675760405162461bcd60e51b815260206004820152602160248201527f434f4d3a204e6f2076616c69642072657374616b65206f70706f7274756e69746044820152607960f81b606482015260840161064c565b805460608301516201000090910461ffff16106123e15760405162461bcd60e51b815260206004820152603260248201527f434f4d3a205374617274205374616b65206d757374206265206e65776572207460448201527168616e2070726576696f7573207374616b6560701b606482015260840161064c565b81608001516115b314806123ff57508054608083015161ffff909116105b6124695760405162461bcd60e51b815260206004820152603560248201527f434f4d3a204e6577207374616b65642064617973206d7573742062652067726560448201527461746572207468616e20746f2070726576696f757360581b606482015260840161064c565b805460408301516401000000009091046001600160481b031611156124e35760405162461bcd60e51b815260206004820152602a60248201527f434f4d3a2052657374616b65206d757374206174206c65617374206d61696e7460448201526961696e2073686172657360b01b606482015260840161064c565b80546125019064010000000090046001600160481b03166002612e8a565b6001600160481b0316826040015111156125745760405162461bcd60e51b815260206004820152602e60248201527f434f4d3a2052657374616b65207368617265732063616e6e6f74206265206d6f60448201526d7265207468616e20646f75626c6560901b606482015260840161064c565b505033600090815260086020526040902080546cffffffffffffffffffffffffff19169055565b6040516001600160801b0383166001600160801b0319608084901b1617815233907fa8f21c07a94b82da90d177f9b2b3a25e91a969ac251d1601fa387a831c951ad890602001611d79565b336000908152600860205260409020805462010000900461ffff1683111561261f57805463ffff000019166201000061ffff8516021781555b6080820151815461ffff161015612646576080820151815461ffff191661ffff9091161781555b60408201518154829060049061266e90849064010000000090046001600160481b0316612eb9565b92506101000a8154816001600160481b0302191690836001600160481b03160217905550505050565b60405161ffff84166fffffffffffffffffffffffffffff0000601085901b16176001600160801b0319608084901b1617815233907f3a4343c9c29638775b0d0acbd8fcb6ec75cf77284a520b2f4b41357b86f4900c9060200160405180910390a2505050565b600060208083528351808285015260005b8181101561272a5785810183015185820160400152820161270e565b506000604082860101526040601f19601f8301168501019250505092915050565b80356001600160a01b038116811461276257600080fd5b919050565b6000806040838503121561277a57600080fd5b6127838361274b565b946020939093013593505050565b6000806000606084860312156127a657600080fd5b6127af8461274b565b92506127bd6020850161274b565b9150604084013590509250925092565b6000806000606084860312156127e257600080fd5b6127eb8461274b565b95602085013595506040909401359392505050565b60006020828403121561281257600080fd5b61281b8261274b565b9392505050565b60006020828403121561283457600080fd5b5035919050565b801515811461094a57600080fd5b600080600080600060a0868803121561286157600080fd5b8535945060208601359350604086013561287a8161283b565b92506128886060870161274b565b949793965091946080013592915050565b6000806000604084860312156128ae57600080fd5b833567ffffffffffffffff808211156128c657600080fd5b818601915086601f8301126128da57600080fd5b8135818111156128e957600080fd5b8760206060830285010111156128fe57600080fd5b602092830195509350612914918601905061274b565b90509250925092565b600080600080600080600060e0888a03121561293857600080fd5b873596506020880135955060408801359450606088013593506080880135925060a0880135915060c088013561296d8161283b565b8091505092959891949750929550565b600060c0828403121561298f57600080fd5b60405160c0810181811067ffffffffffffffff821117156129c057634e487b7160e01b600052604160045260246000fd5b8060405250823581526020830135602082015260408301356040820152606083013560608201526080830135608082015260a083013560a08201528091505092915050565b60008060408385031215612a1857600080fd5b612a218361274b565b9150612a2f6020840161274b565b90509250929050565b60008060008060808587031215612a4e57600080fd5b8435935060208501359250612a656040860161274b565b9396929550929360600135925050565b600181811c90821680612a8957607f821691505b602082108103612aa957634e487b7160e01b600052602260045260246000fd5b50919050565b634e487b7160e01b600052601160045260246000fd5b8082018082111561058e5761058e612aaf565b60208082526025908201527f434f4d3a205374616b65494420456e6420426f6e757320616c7265616479206d6040820152641a5b9d195960da1b606082015260800190565b60208082526022908201527f434f4d3a204d696e696d756d2031303030302073686172657320726571756972604082015261195960f21b606082015260800190565b600060208284031215612b7157600080fd5b5051919050565b600082612b9557634e487b7160e01b600052601260045260246000fd5b500490565b634e487b7160e01b600052603260045260246000fd5b8181038181111561058e5761058e612aaf565b6000816000190483118215151615612bdd57612bdd612aaf565b500290565b60208082526038908201527f434f4d3a2041646472657373205374616b656420416d6f756e7420646f65732060408201527f6e6f7420636f76657220456e6420426f6e757320446562740000000000000000606082015260800190565b805164ffffffffff8116811461276257600080fd5b80516001600160481b038116811461276257600080fd5b805161ffff8116811461276257600080fd5b600080600080600080600060e0888a031215612c9857600080fd5b612ca188612c3f565b9650612caf60208901612c54565b9550612cbd60408901612c54565b9450612ccb60608901612c6b565b9350612cd960808901612c6b565b9250612ce760a08901612c6b565b915060c088015161296d8161283b565b634e487b7160e01b600052602160045260246000fd5b600080600080600080600080610100898b031215612d2a57600080fd5b612d3389612c54565b9750612d4160208a01612c54565b9650612d4f60408a01612c3f565b9550612d5d60608a01612c54565b9450612d6b60808a01612c6b565b9350612d7960a08a01612c54565b9250612d8760c08a01612c3f565b915060e08901516001600160801b0381168114612da357600080fd5b809150509295985092959890939650565b6020808252602f908201527f434f4d3a205374616b6520616d6f756e74206973206d6f7265207468616e206160408201526e1d985a5b18589b19481c185e5bdd5d608a1b606082015260800190565b60208082526025908201527f434f4d3a204d696e696d756d20333635207374616b65642064617973207265716040820152641d5a5c995960da1b606082015260800190565b61ffff818116838216019080821115612e6357612e63612aaf565b5092915050565b6001600160801b03818116838216019080821115612e6357612e63612aaf565b60006001600160481b0380831681851681830481118215151615612eb057612eb0612aaf565b02949350505050565b6001600160481b03818116838216019080821115612e6357612e63612aaf56fea264697066735822122061a13278b51a7e83d610fe88bde393134b6eef7699d4c59c7a88088a0cba7ed664736f6c63430008100033

Deployed Bytecode Sourcemap

19366:23161:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;6674:100;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;9025:201;;;;;;:::i;:::-;;:::i;:::-;;;1169:14:1;;1162:22;1144:41;;1132:2;1117:18;9025:201:0;1004:187:1;7794:108:0;7882:12;;7794:108;;;1342:25:1;;;1330:2;1315:18;7794:108:0;1196:177:1;9806:295:0;;;;;;:::i;:::-;;:::i;19667:93::-;;;19750:2;1853:36:1;;1841:2;1826:18;19667:93:0;1711:184:1;10510:238:0;;;;;;:::i;:::-;;:::i;41236:1288::-;;;;;;:::i;:::-;;:::i;:::-;;21277:70;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;21277:70:0;;;;;;;2620:6:1;2608:19;;;2590:38;;-1:-1:-1;;;;;2664:47:1;;;2659:2;2644:18;;2637:75;2563:18;21277:70:0;2418:300:1;18039:91:0;;;;;;:::i;:::-;;:::i;21198:72::-;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;21198:72:0;;;;;;;3114:6:1;3147:15;;;3129:34;;3199:15;;;;3194:2;3179:18;;3172:43;-1:-1:-1;;;;;3251:33:1;3231:18;;;3224:61;3092:2;3077:18;21198:72:0;2908:383:1;34159:284:0;;;;;;:::i;:::-;;:::i;21354:83::-;;;;;;:::i;:::-;;;;;;;;;;;;;;7965:127;;;;;;:::i;:::-;-1:-1:-1;;;;;8066:18:0;8039:7;8066:18;;;;;;;;;;;;7965:127;21038:74;;;;;;:::i;:::-;;;;;;;;;;;;;;18449:164;;;;;;:::i;:::-;;:::i;21444:70::-;;;;;;:::i;:::-;;;;;;;;;;;;;;33441:622;;;;;;:::i;:::-;;:::i;31268:415::-;;;;;;:::i;:::-;;:::i;6893:104::-;;;:::i;11251:436::-;;;;;;:::i;:::-;;:::i;8298:193::-;;;;;;:::i;:::-;;:::i;37214:537::-;;;;;;:::i;:::-;;:::i;29791:1352::-;;;;;;:::i;:::-;;:::i;31930:422::-;;;:::i;27732:631::-;;;;;;:::i;:::-;;:::i;:::-;;;;6442:13:1;;6424:32;;6512:4;6500:17;;;6494:24;6472:20;;;6465:54;6563:17;;;6557:24;6535:20;;;6528:54;6412:2;6397:18;27732:631:0;6216:372:1;8554:151:0;;;;;;:::i;:::-;;:::i;37845:215::-;;;;;;:::i;:::-;;:::i;21119:72::-;;;;;;:::i;:::-;;;;;;;;;;;;;;6674:100;6728:13;6761:5;6754:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;6674:100;:::o;9025:201::-;9108:4;4398:10;9164:32;4398:10;9180:7;9189:6;9164:8;:32::i;:::-;9214:4;9207:11;;;9025:201;;;;;:::o;9806:295::-;9937:4;4398:10;9995:38;10011:4;4398:10;10026:6;9995:15;:38::i;:::-;10044:27;10054:4;10060:2;10064:6;10044:9;:27::i;:::-;-1:-1:-1;10089:4:0;;9806:295;-1:-1:-1;;;;9806:295:0:o;10510:238::-;10598:4;4398:10;10654:64;4398:10;10670:7;10707:10;10679:25;4398:10;10670:7;10679:9;:25::i;:::-;:38;;;;:::i;:::-;10654:8;:64::i;41236:1288::-;41368:41;;;;:32;:41;;;;;;:46;41360:108;;;;-1:-1:-1;;;41360:108:0;;8103:2:1;41360:108:0;;;8085:21:1;8142:2;8122:18;;;8115:30;8181:34;8161:18;;;8154:62;-1:-1:-1;;;8232:18:1;;;8225:47;8289:19;;41360:108:0;;;;;;;;;41487:30;;;;:21;:30;;;;;;:35;41479:85;;;;-1:-1:-1;;;41479:85:0;;;;;;;:::i;:::-;41577:14;41594:53;41614:10;41627;41639:7;41594:11;:53::i;:::-;41577:70;;41684:4;41668:1;:13;;;:20;41660:67;;;;-1:-1:-1;;;41660:67:0;;;;;;;:::i;:::-;41746:13;;;;:18;41738:58;;;;-1:-1:-1;;;41738:58:0;;9330:2:1;41738:58:0;;;9312:21:1;9369:2;9349:18;;;9342:30;9408:29;9388:18;;;9381:57;9455:18;;41738:58:0;9128:351:1;41738:58:0;41848:1;:12;;;41834:1;:11;;;:26;;;;:::i;:::-;:31;;41863:2;41834:31;:::i;:::-;41815:3;;;;;;;;;-1:-1:-1;;;;;41815:3:0;-1:-1:-1;;;;;41815:14:0;;:16;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:50;41807:94;;;;-1:-1:-1;;;41807:94:0;;9875:2:1;41807:94:0;;;9857:21:1;9914:2;9894:18;;;9887:30;9953:33;9933:18;;;9926:61;10004:18;;41807:94:0;9673:355:1;41807:94:0;41914:3;;:73;;-1:-1:-1;;;41914:73:0;;-1:-1:-1;;;;;10251:32:1;;;41914:73:0;;;10233:51:1;10300:18;;;10293:34;;;10375:12;10363:25;;10343:18;;;10336:53;41914:3:0;;;;:23;;10206:18:1;;41914:73:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;42000:16;42019:53;42039:10;42052;42064:7;42019:11;:53::i;:::-;42000:72;;42091:3;:15;;;42110:1;42091:20;42083:76;;;;-1:-1:-1;;;42083:76:0;;10602:2:1;42083:76:0;;;10584:21:1;10641:2;10621:18;;;10614:30;10680:34;10660:18;;;10653:62;-1:-1:-1;;;10731:18:1;;;10724:41;10782:19;;42083:76:0;10400:407:1;42083:76:0;42172:24;42199:12;42209:1;42199:9;:12::i;:::-;42172:39;;42224:14;42256:3;42241:2;:12;;;:18;;;;:::i;:::-;42272:41;;;;:32;:41;;;;;:50;;;42224:35;-1:-1:-1;42335:25:0;42341:10;42224:35;42335:5;:25::i;:::-;42371:145;42384:6;42392:1;:12;;;42406:2;:26;;;42434:2;:26;;;42462:1;:14;;;42478:1;:9;;;42497:1;42501:14;42371:12;:145::i;:::-;41349:1175;;;;41236:1288;;;:::o;18039:91::-;18095:27;4398:10;18115:6;18095:5;:27::i;:::-;18039:91;:::o;34159:284::-;34317:118;34333:10;34345:7;34354:17;34373:8;34383:3;;;;;;;;;-1:-1:-1;;;;;34383:3:0;-1:-1:-1;;;;;34383:14:0;;:16;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;34401:20;:18;:20::i;:::-;34423:11;34317:15;:118::i;:::-;34159:284;;;;;:::o;18449:164::-;18526:46;18542:7;4398:10;18565:6;18526:15;:46::i;:::-;18583:22;18589:7;18598:6;18583:5;:22::i;:::-;18449:164;;:::o;33441:622::-;33667:3;;:16;;;-1:-1:-1;;;33667:16:0;;;;33609:19;;33573:33;;-1:-1:-1;;;;;33667:3:0;;;;:14;;:16;;;;;;;;;;;;;;;:3;:16;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;33646:37;;33694:23;33720:20;:18;:20::i;:::-;33694:46;;33757:9;33753:303;33776:25;33772:1;:29;33753:303;;;33818:164;33834:19;;33854:1;33834:22;;;;;;;:::i;:::-;;;;;;:33;;;33869:19;;33889:1;33869:22;;;;;;;:::i;:::-;;;;;;:30;;;33901:5;33908:8;33918:10;33930:15;33947:19;;33967:1;33947:22;;;;;;;:::i;:::-;;;;;;:34;;;33818:15;:164::i;:::-;34026:3;;33753:303;;31268:415;31402:10;31382:31;;;;:19;:31;;;;;;31364:49;;;31356:127;;;;-1:-1:-1;;;31356:127:0;;11368:2:1;31356:127:0;;;11350:21:1;11407:2;11387:18;;;11380:30;11446:34;11426:18;;;11419:62;11517:34;11497:18;;;11490:62;-1:-1:-1;;;11568:19:1;;;11561:32;11610:19;;31356:127:0;11166:469:1;31356:127:0;31516:10;31496:31;;;;:19;:31;;;;;:49;;31531:14;;31496:31;:49;;31531:14;;31496:49;:::i;:::-;;;;-1:-1:-1;31558:33:0;;-1:-1:-1;31564:10:0;31576:14;31558:5;:33::i;:::-;31663:10;31643:31;;;;:19;:31;;;;;;31602:73;;31627:14;;31602:24;:73::i;6893:104::-;6949:13;6982:7;6975:14;;;;;:::i;11251:436::-;11344:4;4398:10;11344:4;11427:25;4398:10;11444:7;11427:9;:25::i;:::-;11400:52;;11491:15;11471:16;:35;;11463:85;;;;-1:-1:-1;;;11463:85:0;;11975:2:1;11463:85:0;;;11957:21:1;12014:2;11994:18;;;11987:30;12053:34;12033:18;;;12026:62;-1:-1:-1;;;12104:18:1;;;12097:35;12149:19;;11463:85:0;11773:401:1;11463:85:0;11584:60;11593:5;11600:7;11628:15;11609:16;:34;11584:8;:60::i;8298:193::-;8377:4;4398:10;8433:28;4398:10;8450:2;8454:6;8433:9;:28::i;37214:537::-;37438:3;;:16;;;-1:-1:-1;;;37438:16:0;;;;37380:19;;37344:33;;-1:-1:-1;;;;;37438:3:0;;;;:14;;:16;;;;;;;;;;;;;;;:3;:16;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;37417:37;;37471:9;37467:277;37490:25;37486:1;:29;37467:277;;;37532:138;37546:19;;37566:1;37546:22;;;;;;;:::i;:::-;;;;;;:33;;;37581:19;;37601:1;37581:22;;;;;;;:::i;:::-;;;;;;:30;;;37613:8;37623:10;37635:19;;37655:1;37635:22;;;;;;;:::i;:::-;;;;;;:34;;;37532:13;:138::i;:::-;37714:3;;37467:277;;;;37333:418;;37214:537;;;:::o;29791:1352::-;30019:14;;30090:25;;;30111:4;30090:25;30087:788;;30187:4;30153:16;30166:3;30153:10;:16;:::i;:::-;30152:31;;30174:8;30152:31;:::i;:::-;30151:40;;;;:::i;:::-;30132:60;-1:-1:-1;30265:8:0;30226:34;30132:60;30227:14;30226:34;:::i;:::-;30225:49;;;;:::i;:::-;30207:67;-1:-1:-1;30307:34:0;30207:67;30308:14;30307:34;:::i;:::-;30289:52;;30087:788;;;30385:3;30372:10;:16;30368:507;;;30459:4;30425:16;30438:3;30425:10;:16;:::i;:::-;30424:31;;30446:8;30424:31;:::i;:::-;30423:40;;;;:::i;:::-;30405:58;-1:-1:-1;30536:8:0;30497:34;30405:58;30498:14;30497:34;:::i;:::-;30496:49;;;;:::i;:::-;30478:67;-1:-1:-1;30578:35:0;30478:67;30579:15;30578:35;:::i;30368:507::-;30709:3;30675:16;30688:3;30675:10;:16;:::i;:::-;30674:31;;30696:8;30674:31;:::i;:::-;30673:39;;;;:::i;:::-;30655:57;-1:-1:-1;30786:8:0;30746:35;30655:57;30747:15;30746:35;:::i;:::-;30745:50;;;;:::i;:::-;30727:68;-1:-1:-1;30828:35:0;30727:68;30829:15;30828:35;:::i;:::-;30810:53;;30368:507;30924:15;30898:22;:9;30911:8;30898:22;:::i;:::-;30897:42;;;;:::i;:::-;30888:51;;30969:9;30955:10;:23;30952:184;;30995:15;31054;31014:36;:23;31041:8;31014:36;:::i;:::-;31013:56;;;;:::i;:::-;30995:74;-1:-1:-1;31115:8:0;31094:16;30995:74;31094:6;:16;:::i;:::-;31093:31;;;;:::i;:::-;31084:40;;30980:156;30952:184;30040:1103;29791:1352;;;;;;;;;:::o;31930:422::-;32037:10;31990:24;32017:31;;;:19;:31;;;;;32062:14;;;;;-1:-1:-1;;;;;32062:14:0;:19;32059:286;;32141:10;32098:20;32121:31;;;:19;:31;;;;;;32191:14;;;;;-1:-1:-1;;;;;32191:14:0;32175:30;;;32167:99;;;;-1:-1:-1;;;32167:99:0;;;;;;;:::i;:::-;32281:52;32297:3;32302;;;;;;;;;-1:-1:-1;;;;;32302:3:0;-1:-1:-1;;;;;32302:14:0;;:16;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;32320:12;32281:15;:52::i;27732:631::-;27806:24;-1:-1:-1;;;;;;;;;;;;;;;;;;;;;;;;27806:24:0;27848:31;27941:1;:13;;;27901:23;27922:1;27901:20;:23::i;:::-;27884:1;:14;;;:40;;;;:::i;:::-;27883:54;;27929:7;27883:54;:::i;:::-;27882:72;;;;:::i;:::-;27848:106;;27967:31;28065:23;28019:29;28046:1;28019:26;:29::i;:::-;28002:1;:14;;;:46;;;;:::i;:::-;28001:61;;28053:8;28001:61;:::i;:::-;:87;;;;:::i;:::-;28101:26;;;:52;;;28164;;;28248:12;;;;27967:121;;-1:-1:-1;28164:26:0;;28277:4;;28248:25;;28264:8;28248:25;:::i;:::-;28247:34;;;;:::i;:::-;28229:52;-1:-1:-1;28346:8:0;28308:33;28229:52;28308:23;:33;:::i;:::-;28307:48;;;;:::i;:::-;28292:12;;;:63;-1:-1:-1;28292:2:0;;27732:631;-1:-1:-1;;;27732:631:0:o;8554:151::-;-1:-1:-1;;;;;8670:18:0;;;8643:7;8670:18;;;:11;:18;;;;;;;;:27;;;;;;;;;;;;;8554:151::o;37845:215::-;37977:75;37991:10;38003:7;38012:8;38022:3;;;;;;;;;-1:-1:-1;;;;;38022:3:0;-1:-1:-1;;;;;38022:14:0;;:16;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;38040:11;37977:13;:75::i;:::-;37845:215;;;;:::o;14876:380::-;-1:-1:-1;;;;;15012:19:0;;15004:68;;;;-1:-1:-1;;;15004:68:0;;12979:2:1;15004:68:0;;;12961:21:1;13018:2;12998:18;;;12991:30;13057:34;13037:18;;;13030:62;-1:-1:-1;;;13108:18:1;;;13101:34;13152:19;;15004:68:0;12777:400:1;15004:68:0;-1:-1:-1;;;;;15091:21:0;;15083:68;;;;-1:-1:-1;;;15083:68:0;;13384:2:1;15083:68:0;;;13366:21:1;13423:2;13403:18;;;13396:30;13462:34;13442:18;;;13435:62;-1:-1:-1;;;13513:18:1;;;13506:32;13555:19;;15083:68:0;13182:398:1;15083:68:0;-1:-1:-1;;;;;15164:18:0;;;;;;;:11;:18;;;;;;;;:27;;;;;;;;;;;;;:36;;;15216:32;;1342:25:1;;;15216:32:0;;1315:18:1;15216:32:0;;;;;;;;14876:380;;;:::o;15547:453::-;15682:24;15709:25;15719:5;15726:7;15709:9;:25::i;:::-;15682:52;;-1:-1:-1;;15749:16:0;:37;15745:248;;15831:6;15811:16;:26;;15803:68;;;;-1:-1:-1;;;15803:68:0;;13787:2:1;15803:68:0;;;13769:21:1;13826:2;13806:18;;;13799:30;13865:31;13845:18;;;13838:59;13914:18;;15803:68:0;13585:353:1;15803:68:0;15915:51;15924:5;15931:7;15959:6;15940:16;:25;15915:8;:51::i;12157:671::-;-1:-1:-1;;;;;12288:18:0;;12280:68;;;;-1:-1:-1;;;12280:68:0;;14145:2:1;12280:68:0;;;14127:21:1;14184:2;14164:18;;;14157:30;14223:34;14203:18;;;14196:62;-1:-1:-1;;;14274:18:1;;;14267:35;14319:19;;12280:68:0;13943:401:1;12280:68:0;-1:-1:-1;;;;;12367:16:0;;12359:64;;;;-1:-1:-1;;;12359:64:0;;14551:2:1;12359:64:0;;;14533:21:1;14590:2;14570:18;;;14563:30;14629:34;14609:18;;;14602:62;-1:-1:-1;;;14680:18:1;;;14673:33;14723:19;;12359:64:0;14349:399:1;12359:64:0;-1:-1:-1;;;;;12509:15:0;;12487:19;12509:15;;;;;;;;;;;12543:21;;;;12535:72;;;;-1:-1:-1;;;12535:72:0;;14955:2:1;12535:72:0;;;14937:21:1;14994:2;14974:18;;;14967:30;15033:34;15013:18;;;15006:62;-1:-1:-1;;;15084:18:1;;;15077:36;15130:19;;12535:72:0;14753:402:1;12535:72:0;-1:-1:-1;;;;;12643:15:0;;;:9;:15;;;;;;;;;;;12661:20;;;12643:38;;12703:13;;;;;;;;:23;;12675:6;;12643:9;12703:23;;12675:6;;12703:23;:::i;:::-;;;;;;;;12759:2;-1:-1:-1;;;;;12744:26:0;12753:4;-1:-1:-1;;;;;12744:26:0;;12763:6;12744:26;;;;1342:25:1;;1330:2;1315:18;;1196:177;12744:26:0;;;;;;;;12783:37;13847:591;21523:634;21635:12;-1:-1:-1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;21635:12:0;21924:3;;:40;;-1:-1:-1;;;21924:40:0;;-1:-1:-1;;;;;15352:32:1;;;21924:40:0;;;15334:51:1;15401:18;;;15394:34;;;21665:15:0;;;;;;;;;;;;21924:3;;;;:14;;15307:18:1;;21924:40:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;21841:123:0;;-1:-1:-1;21841:123:0;;-1:-1:-1;21841:123:0;;-1:-1:-1;21841:123:0;-1:-1:-1;21841:123:0;-1:-1:-1;21841:123:0;-1:-1:-1;21985:19:0;;;;;21977:69;;;;-1:-1:-1;;;21977:69:0;;16917:2:1;21977:69:0;;;16899:21:1;16956:2;16936:18;;;16929:30;16995:34;16975:18;;;16968:62;-1:-1:-1;;;17046:18:1;;;17039:35;17091:19;;21977:69:0;16715:401:1;21977:69:0;22066:83;;;;;;;;;;;;;;-1:-1:-1;;;;;22066:83:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;21523:634:0;;;;;:::o;13115:399::-;-1:-1:-1;;;;;13199:21:0;;13191:65;;;;-1:-1:-1;;;13191:65:0;;17323:2:1;13191:65:0;;;17305:21:1;17362:2;17342:18;;;17335:30;17401:33;17381:18;;;17374:61;17452:18;;13191:65:0;17121:355:1;13191:65:0;13347:6;13331:12;;:22;;;;;;;:::i;:::-;;;;-1:-1:-1;;;;;;;13364:18:0;;:9;:18;;;;;;;;;;:28;;13386:6;;13364:9;:28;;13386:6;;13364:28;:::i;:::-;;;;-1:-1:-1;;13408:37:0;;1342:25:1;;;-1:-1:-1;;;;;13408:37:0;;;13425:1;;13408:37;;1330:2:1;1315:18;13408:37:0;;;;;;;18449:164;;:::o;22330:731::-;23009:10;22984:9;22979:15;;;;;;;;:::i;:::-;22957:7;22570:483;22684:3;22655:23;-1:-1:-1;;;;;22639:41:0;:48;;22609:6;-1:-1:-1;;;;;22593:24:0;22592:96;22939:2;22909:12;-1:-1:-1;;;;;22894:29:0;:47;;22870:2;22840:23;22825:40;;:47;;22801:2;22771:10;22756:27;;:47;;22718:15;22703:32;;:101;:170;:239;23034:8;22570:483;;;;;;;17815:25:1;;;17871:2;17856:18;;17849:34;;;;-1:-1:-1;;;;;17919:32:1;17914:2;17899:18;;17892:60;17803:2;17788:18;;17613:345;22570:483:0;;;;;;;;22330:731;;;;;;;;:::o;13847:591::-;-1:-1:-1;;;;;13931:21:0;;13923:67;;;;-1:-1:-1;;;13923:67:0;;18165:2:1;13923:67:0;;;18147:21:1;18204:2;18184:18;;;18177:30;18243:34;18223:18;;;18216:62;-1:-1:-1;;;18294:18:1;;;18287:31;18335:19;;13923:67:0;17963:397:1;13923:67:0;-1:-1:-1;;;;;14090:18:0;;14065:22;14090:18;;;;;;;;;;;14127:24;;;;14119:71;;;;-1:-1:-1;;;14119:71:0;;18567:2:1;14119:71:0;;;18549:21:1;18606:2;18586:18;;;18579:30;18645:34;18625:18;;;18618:62;-1:-1:-1;;;18696:18:1;;;18689:32;18738:19;;14119:71:0;18365:398:1;14119:71:0;-1:-1:-1;;;;;14226:18:0;;:9;:18;;;;;;;;;;14247:23;;;14226:44;;14292:12;:22;;14264:6;;14226:9;14292:22;;14264:6;;14292:22;:::i;:::-;;;;-1:-1:-1;;14332:37:0;;1342:25:1;;;14358:1:0;;-1:-1:-1;;;;;14332:37:0;;;;;1330:2:1;1315:18;14332:37:0;1196:177:1;14382:48:0;13912:526;13847:591;;:::o;22165:157::-;22300:3;;:13;;;-1:-1:-1;;;22300:13:0;;;;22236:17;;-1:-1:-1;;;;;22300:3:0;;:11;;:13;;;;;:3;;:13;;;;;;;:3;:13;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;;22272:41:0;;;;;22165:157;-1:-1:-1;;;;;;22165:157:0:o;34921:2180::-;35132:32;;;;:23;:32;;;;;;:37;35124:89;;;;-1:-1:-1;;;35124:89:0;;19866:2:1;35124:89:0;;;19848:21:1;19905:2;19885:18;;;19878:30;19944:34;19924:18;;;19917:62;-1:-1:-1;;;19995:18:1;;;19988:37;20042:19;;35124:89:0;19664:403:1;35124:89:0;35232:30;;;;:21;:30;;;;;;:35;35224:85;;;;-1:-1:-1;;;35224:85:0;;;;;;;:::i;:::-;35322:14;35339:53;35359:10;35372;35384:7;35339:11;:53::i;:::-;35322:70;;35429:4;35413:1;:13;;;:20;35405:67;;;;-1:-1:-1;;;35405:67:0;;;;;;;:::i;:::-;35506:3;35491:1;:12;;;:18;35483:68;;;;-1:-1:-1;;;35483:68:0;;20274:2:1;35483:68:0;;;20256:21:1;20313:2;20293:18;;;20286:30;20352:34;20332:18;;;20325:62;-1:-1:-1;;;20403:18:1;;;20396:35;20448:19;;35483:68:0;20072:401:1;35483:68:0;35594:1;:11;;;35580:10;:25;;35572:59;;;;-1:-1:-1;;;35572:59:0;;20680:2:1;35572:59:0;;;20662:21:1;20719:2;20699:18;;;20692:30;-1:-1:-1;;;20738:18:1;;;20731:51;20799:18;;35572:59:0;20478:345:1;35572:59:0;35644:12;35688:25;;;35709:4;35688:25;35685:118;;35730:24;35752:1;35730:21;:24::i;:::-;-1:-1:-1;35774:17:0;35685:118;35815:24;35842:12;35852:1;35842:9;:12::i;:::-;35815:39;;35867:14;35884:136;35904:1;:12;;;35918:1;:11;;;35931:2;:12;;;35945:2;:26;;;35973:10;35985:15;36002:17;35884:19;:136::i;:::-;35867:153;-1:-1:-1;36048:10:0;-1:-1:-1;;;;;36036:22:0;;;36033:259;;36086:12;36095:3;36086:6;:12;:::i;:::-;36075:24;;;;:::i;:::-;;;36033:259;;;-1:-1:-1;;;;;36129:22:0;;;36126:166;;36168:31;36174:8;36185:12;36194:3;36185:6;:12;:::i;:::-;36168:5;:31::i;:::-;36126:166;;;36241:39;19487:42;36266:12;36275:3;36266:6;:12;:::i;36241:39::-;36304:32;;;;:23;:32;;;;;;;;:41;;;36405:10;36385:31;;:19;:31;;;;;36432:14;;;;;-1:-1:-1;;;;;36432:14:0;:19;;;;:72;;-1:-1:-1;36490:14:0;;36475:10;36490:14;36455:31;;;:19;:31;;;;;;36490:14;;;;-1:-1:-1;;;;;36490:14:0;-1:-1:-1;36455:49:0;36432:72;36429:142;;;36559:10;36539:31;;;;:19;:31;;;;;;36506:65;;36522:3;;36527:10;;36506:15;:65::i;:::-;36587:15;;36584:315;;36642:6;36627:11;:21;;36619:81;;;;-1:-1:-1;;;36619:81:0;;;;;;;:::i;:::-;36737:10;36717:31;;;;:19;:31;;;;;:46;;36752:11;;36717:31;:46;;36752:11;;36717:46;:::i;:::-;;;;-1:-1:-1;36780:21:0;;-1:-1:-1;36790:11:0;36780:21;;:::i;:::-;36875:10;36855:31;;;;:19;:31;;;;;;36780:21;;-1:-1:-1;36818:69:0;;36842:11;;36818:23;:69::i;:::-;36914:10;;36911:40;;36926:25;36932:10;36944:6;36926:5;:25::i;:::-;36962:131;36975:6;36983:1;:12;;;36997:2;:26;;;37025:2;:26;;;37053:1;:14;;;37069:1;:9;;;37080:8;37090:2;36962:12;:131::i;:::-;35113:1988;;;;;34921:2180;;;;;;;:::o;23675:272::-;23785:154;;-1:-1:-1;;;;;23820:24:0;;-1:-1:-1;;;;;;23899:3:0;23865:37;;;;23820:83;1342:25:1;;23918:10:0;;23785:154;;1330:2:1;1315:18;23785:154:0;;;;;;;;23675:272;;:::o;38773:2202::-;38933:30;;;;:21;:30;;;;;;:35;38925:85;;;;-1:-1:-1;;;38925:85:0;;;;;;;:::i;:::-;39023:14;39040:53;39060:10;39073;39085:7;39040:11;:53::i;:::-;39023:70;;39129:3;39114:1;:12;;;:18;39106:68;;;;-1:-1:-1;;;39106:68:0;;;;;;;:::i;:::-;39209:4;39193:1;:13;;;:20;39185:67;;;;-1:-1:-1;;;39185:67:0;;;;;;;:::i;:::-;39265:14;39296:1;:12;;;39282:1;:11;;;:26;;;;:::i;:::-;39265:43;;39341:6;39327:10;:20;;39319:51;;;;-1:-1:-1;;;39319:51:0;;21852:2:1;39319:51:0;;;21834:21:1;21891:2;21871:18;;;21864:30;-1:-1:-1;;;21910:18:1;;;21903:48;21968:18;;39319:51:0;21650:342:1;39319:51:0;39403:11;:6;39412:2;39403:11;:::i;:::-;39389:10;:25;;39381:61;;;;-1:-1:-1;;;39381:61:0;;22199:2:1;39381:61:0;;;22181:21:1;22238:2;22218:18;;;22211:30;22277:25;22257:18;;;22250:53;22320:18;;39381:61:0;21997:347:1;39381:61:0;39455:24;39482:12;39492:1;39482:9;:12::i;:::-;39507:14;39539:32;;;:23;:32;;;;;;;39524:12;;;;39455:39;;-1:-1:-1;39507:14:0;;39524:47;;39539:32;39524:47;:::i;:::-;39507:64;-1:-1:-1;39599:10:0;-1:-1:-1;;;;;39587:22:0;;;39584:259;;39637:12;39646:3;39637:6;:12;:::i;:::-;39626:24;;;;:::i;:::-;;;39584:259;;;-1:-1:-1;;;;;39680:22:0;;;39677:166;;39719:31;39725:8;39736:12;39745:3;39736:6;:12;:::i;39719:31::-;39677:166;;;39792:39;19487:42;39817:12;39826:3;39817:6;:12;:::i;39792:39::-;39855:30;;;;:21;:30;;;;;:39;;;39936:10;39945:1;39888:6;39936:10;:::i;:::-;40007;39960:24;39987:31;;;:19;:31;;;;;40034:14;;39907:40;;-1:-1:-1;39987:31:0;40034:14;;;-1:-1:-1;;;;;40034:14:0;:19;40031:89;;40108:10;40088:31;;;;:19;:31;;;;;;40055:65;;40071:3;;40076:10;;40055:15;:65::i;:::-;40136:15;;40133:327;;40191:6;40176:11;:21;;40168:81;;;;-1:-1:-1;;;40168:81:0;;;;;;;:::i;:::-;40286:10;40266:31;;;;:19;:31;;;;;:46;;40301:11;;40266:31;:46;;40301:11;;40266:46;:::i;:::-;;;;-1:-1:-1;40329:21:0;;-1:-1:-1;40339:11:0;40329:21;;:::i;:::-;40436:10;40416:31;;;;:19;:31;;;;;;40329:21;;-1:-1:-1;40379:69:0;;40403:11;;40379:23;:69::i;:::-;40475:14;;;;;-1:-1:-1;;;;;40475:14:0;:19;40472:201;;40539:14;;40524:10;40539:14;40504:31;;;:19;:31;;;;;;40539:14;;;;-1:-1:-1;;;;;40539:14:0;-1:-1:-1;40504:49:0;40496:118;;;;-1:-1:-1;;;40496:118:0;;;;;;;:::i;:::-;40472:201;;;40650:23;40657:10;40671:2;40650:23;:::i;:::-;40630:43;;-1:-1:-1;;40630:43:0;;;;;;;;;40472:201;40689:10;;40686:40;;40701:25;40707:10;40719:6;40701:5;:25::i;:::-;40737:142;40750:6;40758:1;:12;;;40772:2;:26;;;40800:2;:26;;;40828:1;:14;;;40844:1;:9;;;40855:8;40865:13;40737:12;:142::i;:::-;40892:36;40914:10;40926:1;40892:21;:36::i;:::-;40939:28;;40957:10;;40939:28;;:14;;:28;;40957:10;;40939:28;;;-1:-1:-1;;;;;40939:28:0;;:::i;:::-;;;;;;;;-1:-1:-1;;;;;40939:28:0;;;;;-1:-1:-1;;;;;40939:28:0;;;;;;38914:2061;;;;;;38773:2202;;;;;:::o;32810:516::-;32953:17;;;;32939:31;;32936:383;;33028:17;;32987:23;;33049:2;;33015:30;;33028:17;;33015:10;:30;:::i;:::-;33014:37;;;;:::i;:::-;33013:43;;33055:1;33013:43;:::i;:::-;32987:69;-1:-1:-1;33071:14:0;33123:2;33089:30;32987:69;33089:12;:30;:::i;:::-;33088:37;;;;:::i;:::-;33071:54;;33142:25;33148:10;33160:6;33142:5;:25::i;:::-;33212:20;:15;33230:2;33212:20;:::i;:::-;33184:49;;:3;;:17;;:49;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;33265:17;;33248:59;;-1:-1:-1;33265:17:0;;;;33284:6;;33292:14;;;-1:-1:-1;;;;;33292:14:0;33248:16;:59::i;25954:492::-;26041:25;26084:18;26105:1;26084:22;;26138:1;26123;:12;;;:16;26119:81;;;26170:4;26154:1;:12;;;:20;;:46;;26196:4;26154:46;;;26192:1;26177;:12;;;:16;;;;:::i;:::-;26141:59;;26119:81;26213:20;26255:15;26236:1;:14;;;:35;;:72;;26292:15;26236:72;;;26274:1;:14;;;26236:72;26213:95;-1:-1:-1;26420:16:0;26395:19;26213:95;26410:4;26395:19;:::i;:::-;26360:30;:10;26374:15;26360:30;:::i;:::-;26359:56;;;;:::i;:::-;26341:1;:14;;;:75;;;;:::i;:::-;:96;;;;:::i;:::-;26321:116;25954:492;-1:-1:-1;;;;25954:492:0:o;26681:432::-;26774:31;26823:18;26859:1;26844;:12;;;:16;;;;:::i;24872:824::-;24977:3;24961:2;:13;;;:19;24953:69;;;;-1:-1:-1;;;24953:69:0;;;;;;;:::i;:::-;25086:10;25035:26;25064:33;;;:21;:33;;;;;25118:21;;25064:33;;25118:21;;;;;;:26;;25110:72;;;;-1:-1:-1;;;25110:72:0;;22926:2:1;25110:72:0;;;22908:21:1;22965:2;22945:18;;;22938:30;23004:34;22984:18;;;22977:62;-1:-1:-1;;;23055:18:1;;;23048:31;23096:19;;25110:72:0;22724:397:1;25110:72:0;25216:21;;25201:12;;;;25216:21;;;;;;-1:-1:-1;25193:99:0;;;;-1:-1:-1;;;25193:99:0;;23328:2:1;25193:99:0;;;23310:21:1;23367:2;23347:18;;;23340:30;23406:34;23386:18;;;23379:62;-1:-1:-1;;;23457:18:1;;;23450:48;23515:19;;25193:99:0;23126:414:1;25193:99:0;25311:2;:13;;;25328:4;25311:21;:55;;;-1:-1:-1;25352:14:0;;25336:13;;;;25352:14;;;;-1:-1:-1;25311:55:0;25303:121;;;;-1:-1:-1;;;25303:121:0;;23747:2:1;25303:121:0;;;23729:21:1;23786:2;23766:18;;;23759:30;23825:34;23805:18;;;23798:62;-1:-1:-1;;;23876:18:1;;;23869:51;23937:19;;25303:121:0;23545:417:1;25303:121:0;25461:14;;25443;;;;25461;;;;-1:-1:-1;;;;;25461:14:0;-1:-1:-1;25443:32:0;25435:87;;;;-1:-1:-1;;;25435:87:0;;24169:2:1;25435:87:0;;;24151:21:1;24208:2;24188:18;;;24181:30;24247:34;24227:18;;;24220:62;-1:-1:-1;;;24298:18:1;;;24291:40;24348:19;;25435:87:0;23967:406:1;25435:87:0;25565:14;;:18;;:14;;;-1:-1:-1;;;;;25565:14:0;25582:1;25565:18;:::i;:::-;-1:-1:-1;;;;;25546:38:0;:2;:14;;;:38;;25538:97;;;;-1:-1:-1;;;25538:97:0;;24857:2:1;25538:97:0;;;24839:21:1;24896:2;24876:18;;;24869:30;24935:34;24915:18;;;24908:62;-1:-1:-1;;;24986:18:1;;;24979:44;25040:19;;25538:97:0;24655:410:1;25538:97:0;-1:-1:-1;;25677:10:0;25655:33;;;;:21;:33;;;;;25648:40;;-1:-1:-1;;25648:40:0;;;24872:824::o;23397:270::-;23506:153;;-1:-1:-1;;;;;23540:24:0;;-1:-1:-1;;;;;;23619:3:0;23585:37;;;;23540:83;1342:25:1;;23638:10:0;;23506:153;;1330:2:1;1315:18;23506:153:0;1196:177:1;24206:398:0;24357:10;24306:26;24335:33;;;:21;:33;;;;;24384:21;;;;;;;-1:-1:-1;;24381:81:0;;;24420:42;;-1:-1:-1;;24420:42:0;;;;;;;;;24381:81;24493:12;;;;24476:14;;;;:29;24473:71;;;24531:12;;;;24507:37;;-1:-1:-1;;24507:37:0;;;;;;;;24473:71;24582:13;;;;24557:39;;;;:14;;:39;;24582:13;;24557:39;;;-1:-1:-1;;;;;24557:39:0;;:::i;:::-;;;;;;;;-1:-1:-1;;;;;24557:39:0;;;;;-1:-1:-1;;;;;24557:39:0;;;;;;24295:309;24206:398;;:::o;23069:320::-;23191:190;;23218:22;;;23261:30;23289:2;23261:30;;;;23218:74;-1:-1:-1;;;;;;23341:3:0;23313:31;;;;23218:127;1342:25:1;;23360:10:0;;23191:190;;1330:2:1;1315:18;23191:190:0;;;;;;;23069:320;;;:::o;14:548:1:-;126:4;155:2;184;173:9;166:21;216:6;210:13;259:6;254:2;243:9;239:18;232:34;284:1;294:140;308:6;305:1;302:13;294:140;;;403:14;;;399:23;;393:30;369:17;;;388:2;365:26;358:66;323:10;;294:140;;;298:3;483:1;478:2;469:6;458:9;454:22;450:31;443:42;553:2;546;542:7;537:2;529:6;525:15;521:29;510:9;506:45;502:54;494:62;;;;14:548;;;;:::o;567:173::-;635:20;;-1:-1:-1;;;;;684:31:1;;674:42;;664:70;;730:1;727;720:12;664:70;567:173;;;:::o;745:254::-;813:6;821;874:2;862:9;853:7;849:23;845:32;842:52;;;890:1;887;880:12;842:52;913:29;932:9;913:29;:::i;:::-;903:39;989:2;974:18;;;;961:32;;-1:-1:-1;;;745:254:1:o;1378:328::-;1455:6;1463;1471;1524:2;1512:9;1503:7;1499:23;1495:32;1492:52;;;1540:1;1537;1530:12;1492:52;1563:29;1582:9;1563:29;:::i;:::-;1553:39;;1611:38;1645:2;1634:9;1630:18;1611:38;:::i;:::-;1601:48;;1696:2;1685:9;1681:18;1668:32;1658:42;;1378:328;;;;;:::o;1900:322::-;1977:6;1985;1993;2046:2;2034:9;2025:7;2021:23;2017:32;2014:52;;;2062:1;2059;2052:12;2014:52;2085:29;2104:9;2085:29;:::i;:::-;2075:39;2161:2;2146:18;;2133:32;;-1:-1:-1;2212:2:1;2197:18;;;2184:32;;1900:322;-1:-1:-1;;;1900:322:1:o;2227:186::-;2286:6;2339:2;2327:9;2318:7;2314:23;2310:32;2307:52;;;2355:1;2352;2345:12;2307:52;2378:29;2397:9;2378:29;:::i;:::-;2368:39;2227:186;-1:-1:-1;;;2227:186:1:o;2723:180::-;2782:6;2835:2;2823:9;2814:7;2810:23;2806:32;2803:52;;;2851:1;2848;2841:12;2803:52;-1:-1:-1;2874:23:1;;2723:180;-1:-1:-1;2723:180:1:o;3296:118::-;3382:5;3375:13;3368:21;3361:5;3358:32;3348:60;;3404:1;3401;3394:12;3419:521;3511:6;3519;3527;3535;3543;3596:3;3584:9;3575:7;3571:23;3567:33;3564:53;;;3613:1;3610;3603:12;3564:53;3649:9;3636:23;3626:33;;3706:2;3695:9;3691:18;3678:32;3668:42;;3760:2;3749:9;3745:18;3732:32;3773:28;3795:5;3773:28;:::i;:::-;3820:5;-1:-1:-1;3844:38:1;3878:2;3863:18;;3844:38;:::i;:::-;3419:521;;;;-1:-1:-1;3419:521:1;;3929:3;3914:19;3901:33;;3419:521;-1:-1:-1;;3419:521:1:o;3945:735::-;4077:6;4085;4093;4146:2;4134:9;4125:7;4121:23;4117:32;4114:52;;;4162:1;4159;4152:12;4114:52;4202:9;4189:23;4231:18;4272:2;4264:6;4261:14;4258:34;;;4288:1;4285;4278:12;4258:34;4326:6;4315:9;4311:22;4301:32;;4371:7;4364:4;4360:2;4356:13;4352:27;4342:55;;4393:1;4390;4383:12;4342:55;4433:2;4420:16;4459:2;4451:6;4448:14;4445:34;;;4475:1;4472;4465:12;4445:34;4533:7;4526:4;4518;4510:6;4506:17;4502:2;4498:26;4494:37;4491:50;4488:70;;;4554:1;4551;4544:12;4488:70;4585:4;4577:13;;;;-1:-1:-1;4609:6:1;-1:-1:-1;4634:40:1;;4653:20;;;-1:-1:-1;4634:40:1;:::i;:::-;4624:50;;3945:735;;;;;:::o;4685:653::-;4795:6;4803;4811;4819;4827;4835;4843;4896:3;4884:9;4875:7;4871:23;4867:33;4864:53;;;4913:1;4910;4903:12;4864:53;4949:9;4936:23;4926:33;;5006:2;4995:9;4991:18;4978:32;4968:42;;5057:2;5046:9;5042:18;5029:32;5019:42;;5108:2;5097:9;5093:18;5080:32;5070:42;;5159:3;5148:9;5144:19;5131:33;5121:43;;5211:3;5200:9;5196:19;5183:33;5173:43;;5266:3;5255:9;5251:19;5238:33;5280:28;5302:5;5280:28;:::i;:::-;5327:5;5317:15;;;4685:653;;;;;;;;;;:::o;5343:868::-;5424:6;5477:3;5465:9;5456:7;5452:23;5448:33;5445:53;;;5494:1;5491;5484:12;5445:53;5527:2;5521:9;5569:3;5561:6;5557:16;5639:6;5627:10;5624:22;5603:18;5591:10;5588:34;5585:62;5582:185;;;5689:10;5684:3;5680:20;5677:1;5670:31;5724:4;5721:1;5714:15;5752:4;5749:1;5742:15;5582:185;5787:10;5783:2;5776:22;;5835:9;5822:23;5814:6;5807:39;5907:2;5896:9;5892:18;5879:32;5874:2;5866:6;5862:15;5855:57;5973:2;5962:9;5958:18;5945:32;5940:2;5932:6;5928:15;5921:57;6039:2;6028:9;6024:18;6011:32;6006:2;5998:6;5994:15;5987:57;6106:3;6095:9;6091:19;6078:33;6072:3;6064:6;6060:16;6053:59;6174:3;6163:9;6159:19;6146:33;6140:3;6132:6;6128:16;6121:59;6199:6;6189:16;;;5343:868;;;;:::o;6593:260::-;6661:6;6669;6722:2;6710:9;6701:7;6697:23;6693:32;6690:52;;;6738:1;6735;6728:12;6690:52;6761:29;6780:9;6761:29;:::i;:::-;6751:39;;6809:38;6843:2;6832:9;6828:18;6809:38;:::i;:::-;6799:48;;6593:260;;;;;:::o;6858:391::-;6944:6;6952;6960;6968;7021:3;7009:9;7000:7;6996:23;6992:33;6989:53;;;7038:1;7035;7028:12;6989:53;7074:9;7061:23;7051:33;;7131:2;7120:9;7116:18;7103:32;7093:42;;7154:38;7188:2;7177:9;7173:18;7154:38;:::i;:::-;6858:391;;;;-1:-1:-1;7144:48:1;;7239:2;7224:18;7211:32;;-1:-1:-1;;6858:391:1:o;7254:380::-;7333:1;7329:12;;;;7376;;;7397:61;;7451:4;7443:6;7439:17;7429:27;;7397:61;7504:2;7496:6;7493:14;7473:18;7470:38;7467:161;;7550:10;7545:3;7541:20;7538:1;7531:31;7585:4;7582:1;7575:15;7613:4;7610:1;7603:15;7467:161;;7254:380;;;:::o;7639:127::-;7700:10;7695:3;7691:20;7688:1;7681:31;7731:4;7728:1;7721:15;7755:4;7752:1;7745:15;7771:125;7836:9;;;7857:10;;;7854:36;;;7870:18;;:::i;8319:401::-;8521:2;8503:21;;;8560:2;8540:18;;;8533:30;8599:34;8594:2;8579:18;;8572:62;-1:-1:-1;;;8665:2:1;8650:18;;8643:35;8710:3;8695:19;;8319:401::o;8725:398::-;8927:2;8909:21;;;8966:2;8946:18;;;8939:30;9005:34;9000:2;8985:18;;8978:62;-1:-1:-1;;;9071:2:1;9056:18;;9049:32;9113:3;9098:19;;8725:398::o;9484:184::-;9554:6;9607:2;9595:9;9586:7;9582:23;9578:32;9575:52;;;9623:1;9620;9613:12;9575:52;-1:-1:-1;9646:16:1;;9484:184;-1:-1:-1;9484:184:1:o;10812:217::-;10852:1;10878;10868:132;;10922:10;10917:3;10913:20;10910:1;10903:31;10957:4;10954:1;10947:15;10985:4;10982:1;10975:15;10868:132;-1:-1:-1;11014:9:1;;10812:217::o;11034:127::-;11095:10;11090:3;11086:20;11083:1;11076:31;11126:4;11123:1;11116:15;11150:4;11147:1;11140:15;11640:128;11707:9;;;11728:11;;;11725:37;;;11742:18;;:::i;12179:168::-;12219:7;12285:1;12281;12277:6;12273:14;12270:1;12267:21;12262:1;12255:9;12248:17;12244:45;12241:71;;;12292:18;;:::i;:::-;-1:-1:-1;12332:9:1;;12179:168::o;12352:420::-;12554:2;12536:21;;;12593:2;12573:18;;;12566:30;12632:34;12627:2;12612:18;;12605:62;12703:26;12698:2;12683:18;;12676:54;12762:3;12747:19;;12352:420::o;15439:169::-;15517:13;;15570:12;15559:24;;15549:35;;15539:63;;15598:1;15595;15588:12;15613:177;15691:13;;-1:-1:-1;;;;;15733:32:1;;15723:43;;15713:71;;15780:1;15777;15770:12;15795:163;15873:13;;15926:6;15915:18;;15905:29;;15895:57;;15948:1;15945;15938:12;15963:747;16078:6;16086;16094;16102;16110;16118;16126;16179:3;16167:9;16158:7;16154:23;16150:33;16147:53;;;16196:1;16193;16186:12;16147:53;16219:39;16248:9;16219:39;:::i;:::-;16209:49;;16277:48;16321:2;16310:9;16306:18;16277:48;:::i;:::-;16267:58;;16344:48;16388:2;16377:9;16373:18;16344:48;:::i;:::-;16334:58;;16411:48;16455:2;16444:9;16440:18;16411:48;:::i;:::-;16401:58;;16478:49;16522:3;16511:9;16507:19;16478:49;:::i;:::-;16468:59;;16546:49;16590:3;16579:9;16575:19;16546:49;:::i;:::-;16536:59;;16638:3;16627:9;16623:19;16617:26;16652:28;16674:5;16652:28;:::i;17481:127::-;17542:10;17537:3;17533:20;17530:1;17523:31;17573:4;17570:1;17563:15;17597:4;17594:1;17587:15;18768:891;18894:6;18902;18910;18918;18926;18934;18942;18950;19003:3;18991:9;18982:7;18978:23;18974:33;18971:53;;;19020:1;19017;19010:12;18971:53;19043:39;19072:9;19043:39;:::i;:::-;19033:49;;19101:48;19145:2;19134:9;19130:18;19101:48;:::i;:::-;19091:58;;19168:48;19212:2;19201:9;19197:18;19168:48;:::i;:::-;19158:58;;19235:48;19279:2;19268:9;19264:18;19235:48;:::i;:::-;19225:58;;19302:49;19346:3;19335:9;19331:19;19302:49;:::i;:::-;19292:59;;19370:49;19414:3;19403:9;19399:19;19370:49;:::i;:::-;19360:59;;19438:49;19482:3;19471:9;19467:19;19438:49;:::i;:::-;19428:59;;19530:3;19519:9;19515:19;19509:26;-1:-1:-1;;;;;19568:5:1;19564:46;19557:5;19554:57;19544:85;;19625:1;19622;19615:12;19544:85;19648:5;19638:15;;;18768:891;;;;;;;;;;;:::o;20828:411::-;21030:2;21012:21;;;21069:2;21049:18;;;21042:30;21108:34;21103:2;21088:18;;21081:62;-1:-1:-1;;;21174:2:1;21159:18;;21152:45;21229:3;21214:19;;20828:411::o;21244:401::-;21446:2;21428:21;;;21485:2;21465:18;;;21458:30;21524:34;21519:2;21504:18;;21497:62;-1:-1:-1;;;21590:2:1;21575:18;;21568:35;21635:3;21620:19;;21244:401::o;22349:168::-;22416:6;22442:10;;;22454;;;22438:27;;22477:11;;;22474:37;;;22491:18;;:::i;:::-;22474:37;22349:168;;;;:::o;22522:197::-;-1:-1:-1;;;;;22644:10:1;;;22656;;;22640:27;;22679:11;;;22676:37;;;22693:18;;:::i;24378:272::-;24417:7;-1:-1:-1;;;;;24496:2:1;24493:1;24489:10;24526:2;24523:1;24519:10;24582:3;24578:2;24574:12;24569:3;24566:21;24559:3;24552:11;24545:19;24541:47;24538:73;;;24591:18;;:::i;:::-;24631:13;;24378:272;-1:-1:-1;;;;24378:272:1:o;25070:182::-;-1:-1:-1;;;;;25177:10:1;;;25189;;;25173:27;;25212:11;;;25209:37;;;25226:18;;:::i

Swarm Source

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