Token Jedi

Overview [ERC-20]

Price
$0.00 @ 0.000000 Eth
Fully Diluted Market Cap
Max Total Supply:
210,000,000 JEDI

Holders:
228
Balance
7,285.678686562 JEDI

Value
$0.00
0xcb9Af50F632C1891f45885a13E5149750f726de5
Loading
[ Download CSV Export ]
Loading
[ Download CSV Export ]
Loading

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

Contract Source Code Verified (Exact Match)

Contract Name:
Fungi

Compiler Version
v0.8.23+commit.f704f362

Optimization Enabled:
Yes with 200 runs

Other Settings:
london EvmVersion
File 1 of 10 : Fungi.sol
// SPDX-License-Identifier: MIT

pragma solidity ^0.8.21;



import "@openzeppelin/contracts/utils/ReentrancyGuard.sol";

import "./Erc20.sol";

import "./PoolCreatableErc20i.sol";

import "../Generator.sol";



library ExtraSeedLibrary {

    function extra(

        address account,

        uint extraSeed

    ) internal pure returns (uint256) {

        return uint(keccak256(abi.encodePacked(account, extraSeed)));

    }



    function seed_data(

        address account,

        uint seed,

        uint extraSeed

    ) internal pure returns (SeedData memory) {

        return SeedData(seed, extra(account, extraSeed));

    }

}



abstract contract Inscriptions is PoolCreatableErc20i {

    using ExtraSeedLibrary for address;

    mapping(address owner => uint) _counts;

    mapping(address owner => mapping(uint index => SeedData seed_data)) _ownedTokens;

    mapping(address owner => mapping(uint tokenId => uint)) _ownedTokensIndex;

    mapping(address owner => mapping(uint => bool)) _owns;

    mapping(address owner => SeedData seed_data) _dynamicInscription;

    mapping(uint index => address user) _holderList;

    mapping(address user => uint index) _holderListIndexes;

    uint _inscriptionsTotalCount;

    uint _holdersCount;

    uint _dynamicInscriptionTotalCount;

    uint _random_nonce;



    event OnMushroomTransfer(

        address indexed from,

        address indexed to,

        SeedData seed_data

    );

    event OnSporesGrow(address indexed holder, SeedData seed_data);

    event OnSporesShrink(address indexed holder, SeedData seed_data);



    constructor() PoolCreatableErc20i("Jedi", "JEDI", msg.sender) {}



    modifier holder_calculate(address acc1, address acc2) {

        bool before1 = _isHolder(acc1);

        bool before2 = _isHolder(acc2);

        _;

        bool after1 = _isHolder(acc1);

        bool after2 = _isHolder(acc2);

        if (!before1 && after1) _addHolder(acc1);

        if (before1 && !after1) _removeHolder(acc1);

        if (!before2 && after2) _addHolder(acc2);

        if (before2 && !after2) _removeHolder(acc2);

    }



    function _isHolder(address account) private view returns (bool) {

        if (

            account == address(this) ||

            account == _pool ||

            account == address(0)

        ) return false;



        return

            (_dynamicInscription[account].seed +

                this.inscriptionCount(account)) > 0;

    }



    function trySeedTransfer(

        address from,

        address to,

        uint amount

    ) internal holder_calculate(from, to) {

        if (from == address(this)) return;

        uint seed = amount / (10 ** decimals());



        if (seed > 0 && from != _pool && to != _pool) {

            // transfer growing inscription

            if (_dynamicInscription[from].seed == seed && !_owns[to][seed]) {

                SeedData memory data = _dynamicInscription[from];

                _removeSeedCount(from, seed);

                _addTokenToOwnerEnumeration(to, data);

                emit OnMushroomTransfer(from, to, data);

                return;

            }



            // transfer collected inscription

            if (_owns[from][seed] && !_owns[to][seed]) {

                SeedData memory data = _ownedTokens[from][

                    _ownedTokensIndex[from][seed]

                ];

                _removeTokenFromOwnerEnumeration(from, seed);

                _addTokenToOwnerEnumeration(to, data);

                emit OnMushroomTransfer(from, to, data);

                return;

            }

        }



        // transfer dynamicInscription

        uint lastBalanceFromSeed = _balances[from] / (10 ** decimals());

        uint newBalanceFromSeed = (_balances[from] - amount) /

            (10 ** decimals());

        _removeSeedCount(from, lastBalanceFromSeed - newBalanceFromSeed);

        _addSeedCount(to, seed);

    }



    function _addHolder(address account) private {

        _holderList[_holdersCount] = account;

        _holderListIndexes[account] = _holdersCount;

        ++_holdersCount;

    }



    function _removeHolder(address account) private {

        if (_holdersCount == 0) return;

        uint removingIndex = _holderListIndexes[account];

        if (removingIndex != _holdersCount - 1) {

            address lastHolder = _holderList[_holdersCount - 1];

            _holderList[removingIndex] = lastHolder;

            _holderListIndexes[lastHolder] = removingIndex;

        }



        --_holdersCount;

        delete _holderListIndexes[account];

        delete _holderList[_holdersCount];

    }



    function getHolderByIndex(uint index) public view returns (address) {

        return _holderList[index];

    }



    function getHoldersList(

        uint startIndex,

        uint count

    ) public view returns (address[] memory) {

        address[] memory holders = new address[](count);

        for (uint i = 0; i < count; ++i)

            holders[i] = getHolderByIndex(startIndex + i);

        return holders;

    }



    function _addSeedCount(address account, uint seed) private {

        if (seed == 0) return;

        if (account == _pool) return;

        SeedData memory last = _dynamicInscription[account];



        _dynamicInscription[account].seed += seed;

        _dynamicInscription[account].extra = account.extra(++_random_nonce);



        if (last.seed == 0 && _dynamicInscription[account].seed > 0)

            ++_dynamicInscriptionTotalCount;



        emit OnSporesGrow(account, _dynamicInscription[account]);

    }



    function _removeSeedCount(address account, uint seed) private {

        if (seed == 0) return;

        if (account == _pool) return;

        SeedData memory lastSpores = _dynamicInscription[account];

        if (_dynamicInscription[account].seed >= seed) {

            _dynamicInscription[account].seed -= seed;

            _dynamicInscription[account].extra = account.extra(++_random_nonce);

            if (lastSpores.seed > 0 && _dynamicInscription[account].seed == 0)

                --_dynamicInscriptionTotalCount;

            emit OnSporesShrink(account, _dynamicInscription[account]);

            return;

        }

        uint seedRemains = seed - _dynamicInscription[account].seed;

        _dynamicInscription[account].seed = 0;

        _dynamicInscription[account].extra = account.extra(++_random_nonce);



        // remove inscriptions

        uint count = _counts[account];

        uint removed;

        for (uint i = 0; i < count && removed < seedRemains; ++i) {

            removed += _removeFirstTokenFromOwner(account);

        }



        if (removed > seedRemains) {

            _dynamicInscription[account].seed += removed - seedRemains;

            _dynamicInscription[account].extra = account.extra(++_random_nonce);

        }

        if (lastSpores.seed > 0 && _dynamicInscription[account].seed == 0)

            --_dynamicInscriptionTotalCount;

        if (lastSpores.seed == 0 && _dynamicInscription[account].seed > 0)

            ++_dynamicInscriptionTotalCount;

        emit OnSporesShrink(account, _dynamicInscription[account]);

    }



    function _addTokenToOwnerEnumeration(

        address to,

        SeedData memory data

    ) private {

        if (to == _pool) return;

        ++_counts[to];

        ++_inscriptionsTotalCount;

        uint length = _counts[to] - 1;

        _ownedTokens[to][length] = data;

        _ownedTokensIndex[to][data.seed] = length;

        _owns[to][data.seed] = true;

    }



    function _removeTokenFromOwnerEnumeration(address from, uint seed) private {

        if (from == _pool) return;

        --_counts[from];

        --_inscriptionsTotalCount;

        _owns[from][seed] = false;

        uint lastTokenIndex = _counts[from];

        uint tokenIndex = _ownedTokensIndex[from][seed];

        SeedData memory data = _ownedTokens[from][tokenIndex];



        // When the token to delete is the last token, the swap operation is unnecessary

        if (tokenIndex != lastTokenIndex) {

            SeedData memory lastTokenId = _ownedTokens[from][lastTokenIndex];



            _ownedTokens[from][tokenIndex] = lastTokenId; // Move the last token to the slot of the to-delete token

            _ownedTokensIndex[from][lastTokenId.seed] = tokenIndex; // Update the moved token's index

        }



        delete _ownedTokensIndex[from][data.seed];

        delete _ownedTokens[from][lastTokenIndex];

    }



    function _removeFirstTokenFromOwner(address owner) private returns (uint) {

        uint count = _counts[owner];

        if (count == 0) return 0;

        uint seed = _ownedTokens[owner][0].seed;

        _removeTokenFromOwnerEnumeration(owner, seed);

        return seed;

    }



    function isOwnerOf(address owner, uint seed) external view returns (bool) {

        return _owns[owner][seed];

    }



    function dynamicInscription(

        address owner

    ) external view returns (SeedData memory data) {

        return _dynamicInscription[owner];

    }



    function inscriptionCount(address owner) external view returns (uint) {

        return _counts[owner];

    }



    function inscriptionOfOwnerByIndex(

        address owner,

        uint index

    ) external view returns (SeedData memory data) {

        return _ownedTokens[owner][index];

    }



    function inscriptionsTotalCount() external view returns (uint) {

        return _inscriptionsTotalCount;

    }



    function holdersCount() external view returns (uint) {

        return _holdersCount;

    }



    function dynamicInscriptionTotalCount() external view returns (uint) {

        return _dynamicInscriptionTotalCount;

    }



    function getHolderIndex(address account) external view returns (uint) {

        return _holderListIndexes[account];

    }

}



contract Fungi is Inscriptions, Generator, ReentrancyGuard {

    uint constant _startTotalSupply = 210e6 * (10 ** _decimals);

    uint constant _startMaxBuyCount = (_startTotalSupply * 5) / 10000;

    uint constant _addMaxBuyPercentPerSec = 5; // 100%=_addMaxBuyPrecesion add 0.005%/second

    uint constant _addMaxBuyPrecesion = 100000;



    constructor() {

        _mint(msg.sender, _startTotalSupply);

    }



    modifier maxBuyLimit(uint256 amount) {

        require(amount <= maxBuy(), "max buy limit");

        _;

    }



    function maxBuy() public view returns (uint256) {

        if (!isStarted()) return _startTotalSupply;

        uint256 count = _startMaxBuyCount +

            (_startTotalSupply *

                (block.timestamp - _startTime) *

                _addMaxBuyPercentPerSec) /

            _addMaxBuyPrecesion;

        if (count > _startTotalSupply) count = _startTotalSupply;

        return count;

    }



    function _transfer(

        address from,

        address to,

        uint256 amount

    ) internal override {

        if (isStarted()) {

            trySeedTransfer(from, to, amount);

        } else {

            require(from == _owner || to == _owner, "not started");

        }



        // allow burning

        if (to == address(0)) {

            _burn(from, amount);

            return;

        }



        // system transfers

        if (from == address(this)) {

            super._transfer(from, to, amount);

            return;

        }



        if (_feeLocked) {

            super._transfer(from, to, amount);

            return;

        } else {

            if (from == _pool) {

                buy(to, amount);

                return;

            }

        }



        super._transfer(from, to, amount);

    }



    function buy(

        address to,

        uint256 amount

    ) private maxBuyLimit(amount) lockFee {

        super._transfer(_pool, to, amount);

    }



    function burnCount() public view returns (uint256) {

        return _startTotalSupply - totalSupply();

    }



    function getSvg(SeedData memory seed_data)

        public

        view

        returns (string memory)

    {

        if (isStarted()){

            return toSvg(seed_data);

        }

        return "";

    }



    function getMeta(SeedData memory seed_data)

        public

        view

        returns (string memory)

    {

        if (isStarted()){

            return toMeta(seed_data);

        }

        return "";

    }

}

File 2 of 10 : ReentrancyGuard.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v5.0.0) (utils/ReentrancyGuard.sol)

pragma solidity ^0.8.20;

/**
 * @dev Contract module that helps prevent reentrant calls to a function.
 *
 * Inheriting from `ReentrancyGuard` will make the {nonReentrant} modifier
 * available, which can be applied to functions to make sure there are no nested
 * (reentrant) calls to them.
 *
 * Note that because there is a single `nonReentrant` guard, functions marked as
 * `nonReentrant` may not call one another. This can be worked around by making
 * those functions `private`, and then adding `external` `nonReentrant` entry
 * points to them.
 *
 * TIP: If you would like to learn more about reentrancy and alternative ways
 * to protect against it, check out our blog post
 * https://blog.openzeppelin.com/reentrancy-after-istanbul/[Reentrancy After Istanbul].
 */
abstract contract ReentrancyGuard {
    // Booleans are more expensive than uint256 or any type that takes up a full
    // word because each write operation emits an extra SLOAD to first read the
    // slot's contents, replace the bits taken up by the boolean, and then write
    // back. This is the compiler's defense against contract upgrades and
    // pointer aliasing, and it cannot be disabled.

    // The values being non-zero value makes deployment a bit more expensive,
    // but in exchange the refund on every call to nonReentrant will be lower in
    // amount. Since refunds are capped to a percentage of the total
    // transaction's gas, it is best to keep them low in cases like this one, to
    // increase the likelihood of the full refund coming into effect.
    uint256 private constant NOT_ENTERED = 1;
    uint256 private constant ENTERED = 2;

    uint256 private _status;

    /**
     * @dev Unauthorized reentrant call.
     */
    error ReentrancyGuardReentrantCall();

    constructor() {
        _status = NOT_ENTERED;
    }

    /**
     * @dev Prevents a contract from calling itself, directly or indirectly.
     * Calling a `nonReentrant` function from another `nonReentrant`
     * function is not supported. It is possible to prevent this from happening
     * by making the `nonReentrant` function external, and making it call a
     * `private` function that does the actual work.
     */
    modifier nonReentrant() {
        _nonReentrantBefore();
        _;
        _nonReentrantAfter();
    }

    function _nonReentrantBefore() private {
        // On the first call to nonReentrant, _status will be NOT_ENTERED
        if (_status == ENTERED) {
            revert ReentrancyGuardReentrantCall();
        }

        // Any calls to nonReentrant after this point will fail
        _status = ENTERED;
    }

    function _nonReentrantAfter() private {
        // By storing the original value once again, a refund is triggered (see
        // https://eips.ethereum.org/EIPS/eip-2200)
        _status = NOT_ENTERED;
    }

    /**
     * @dev Returns true if the reentrancy guard is currently set to "entered", which indicates there is a
     * `nonReentrant` function in the call stack.
     */
    function _reentrancyGuardEntered() internal view returns (bool) {
        return _status == ENTERED;
    }
}

File 3 of 10 : Erc20.sol
pragma solidity ^0.8.20;



import "@openzeppelin/contracts/token/ERC20/IERC20.sol";

import "@openzeppelin/contracts/token/ERC20/extensions/IERC20Metadata.sol";

import "@openzeppelin/contracts/utils/Context.sol";



contract ERC20 is Context, IERC20, IERC20Metadata {

    mapping(address => uint256) internal _balances;



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



    uint256 internal _totalSupply;

    uint8 internal constant _decimals = 9;



    string private _name;

    string private _symbol;



    /**

     * @dev Sets the values for {name} and {symbol}.

     *

     * All two of these values are immutable: they can only be set once during

     * construction.

     */

    constructor(string memory name_, string memory symbol_) {

        _name = name_;

        _symbol = symbol_;

    }



    /**

     * @dev Returns the name of the token.

     */

    function name() public view virtual override 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 default value returned by this function, unless

     * it's overridden.

     *

     * NOTE: This information is only used for _display_ purposes: it in

     * no way affects any of the arithmetic of the contract, including

     * {IERC20-balanceOf} and {IERC20-transfer}.

     */

    function decimals() public pure returns (uint8) {

        return _decimals;

    }



    /**

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



        uint256 fromBalance = _balances[from];

        require(

            fromBalance >= amount,

            "ERC20: transfer amount exceeds balance"

        );

        unchecked {

            _balances[from] = fromBalance - amount;

            // Overflow not possible: the sum of all balances is capped by totalSupply, and the sum is preserved by

            // decrementing then incrementing.

            _balances[to] += amount;

        }



        emit Transfer(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");



        _totalSupply += amount;

        unchecked {

            // Overflow not possible: balance + amount is at most totalSupply + amount, which is checked above.

            _balances[account] += amount;

        }

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

    }



    /**

     * @dev Erases `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");



        uint256 accountBalance = _balances[account];

        require(accountBalance >= amount, "ERC20: burn amount exceeds balance");

        unchecked {

            _balances[account] = accountBalance - amount;

            // Overflow not possible: amount <= accountBalance <= totalSupply.

            _totalSupply -= amount;

        }



        emit Transfer(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);

            }

        }

    }

}

File 4 of 10 : PoolCreatableErc20i.sol
// SPDX-License-Identifier: MIT

pragma solidity ^0.8.21;



import "./Erc20.sol";



abstract contract PoolCreatableErc20i is ERC20 {

    address internal _pool;

    uint256 internal _startTime;

    bool internal _feeLocked;

    address immutable _pairCreator;



    constructor(

        string memory name_,

        string memory symbol_,

        address pairCreator

    ) ERC20(name_, symbol_) {

        _pairCreator = pairCreator;

    }



    modifier lockFee() {

        _feeLocked = true;

        _;

        _feeLocked = false;

    }



    function launch(address poolAddress) external payable {

        require(msg.sender == _pairCreator);

        require(!isStarted());

        _pool = poolAddress;

        _startTime = block.timestamp;

    }



    function isStarted() internal view returns (bool) {

        return _pool != address(0);

    }



    function pool() external view returns (address) {

        return _pool;

    }

}

File 5 of 10 : Generator.sol
// SPDX-License-Identifier: MIT

pragma solidity ^0.8.20;



import "./lib/Ownable.sol";



import "forge-std/console.sol";



uint constant levelsCount = 5;

uint constant seedLevel1 = 1050; 

uint constant seedLevel2 = 10500; 

uint constant seedLevel3 = 105000; 

uint constant seedLevel4 = 1050000;

string constant description = "Jedi, $JEDI. May the force be with you.";

string constant web = "https://jedi.army/";



string constant viewBox="0 0 320.25 320.25";



uint constant pixelsCount = 256;



struct SaberData {

    uint lvl;

    string uuid;

    string hilt_color;    

    uint hilt_colors_index;

    string beam_color;

    string beam_glow_color;//_1;

    string background_color;

    // string beam_glow_color_2;

    uint saber_shape_id;

    SaberShape saberShape;

}



// struct HiltColors{

//     string base;

//     string darkerBase;

//     string highlight;

// }



struct SaberShape {

    string[] hilt;

    string[] beam;

    glowParts beam_glow;

}



struct glowParts {

    string[] defs;

    string[] outline;

    string[] radial;

}



struct ColorsData {

    string[] lvl0;

    string[] lvl1;

    string[] lvl2;

    string[] lvl3;

    string[] lvl4;

}



struct SeedData {

    uint seed;

    uint extra;

}



struct Rand {

    uint seed;

    uint nonce;

    uint extra;

}



struct Rect {

    uint8 x;

    uint8 y;

    uint8 width;

    uint8 height;

}



struct FileData {

    uint lvl;

    uint file;

    SaberShape[] saberShape;

}



library RandLib {

    function next(Rand memory rnd) internal pure returns (uint) {

        return

            uint(

                keccak256(

                    abi.encodePacked(rnd.seed + rnd.nonce++ - 1, rnd.extra)

                )

            );

    }



    function lvl(Rand memory rnd) internal pure returns (uint) {

        if (rnd.seed < seedLevel1) return 0;

        if (rnd.seed < seedLevel2) return 1;

        if (rnd.seed < seedLevel3) return 2;

        if (rnd.seed < seedLevel4) return 3;

        return 4;

    }



    function random(

        string[] memory data,

        Rand memory rnd

    ) internal pure returns (string memory) {

        return data[randomIndex(data, rnd)];

    }



    function randomIndex(

        string[] memory data,

        Rand memory rnd

    ) internal pure returns (uint) {

        return next(rnd) % data.length;

    }

}



library LayersLib {



    function getLvl(

        mapping(uint => SaberShape[]) storage saberShapes,

        uint lvl

    ) internal view returns (SaberShape[] storage) {

        return saberShapes[lvl];

    }



    function to_lvl_1(uint l) internal pure returns (uint) {

        if (l > 0) --l;

        return l;

    }

}



library Converter {

    function toString(uint value) internal pure returns (string memory) {

        if (value == 0) {

            return "0";

        }

        uint temp = value;

        uint digits;

        while (temp != 0) {

            digits++;

            temp /= 10;

        }

        bytes memory buffer = new bytes(digits);

        while (value != 0) {

            digits -= 1;

            buffer[digits] = bytes1(uint8(48 + uint256(value % 10)));

            value /= 10;

        }

        return string(buffer);

    }

}



library RectLib {

    using RectLib for Rect;

    using RandLib for Rand;

    using RandLib for string[];

    using Converter for uint8;



    function toSvg(

        Rect memory r,

        string memory color

    ) internal pure returns (string memory) {

        return

            string(

                abi.encodePacked(

                    "<rect x='",

                    r.x.toString(),

                    "' y='",

                    r.y.toString(),

                    "' width='",

                    r.width.toString(),

                    "' height='",

                    r.height.toString(),

                    "' fill='",

                    color,

                    "'/>"

                )

            );

    }



    function toSvg(

        Rect[] storage rects,

        string[] storage colors,

        Rand memory rnd

    ) internal view returns (string memory) {

        string memory res;

        for (uint i = 0; i < rects.length; ++i) {

            res = string(

                abi.encodePacked(res, rects[i].toSvg(colors.random(rnd)))

            );

        }

        return res;

    }



    function toSvg(

        Rect[] storage rects,

        string memory color

    ) internal view returns (string memory) {

        string memory res;

        for (uint i = 0; i < rects.length; ++i) {

            res = string(abi.encodePacked(res, rects[i].toSvg(color)));

        }

        return res;

    }

}



contract Generator is Ownable {

    using LayersLib for mapping(uint => SaberShape[]);

    using LayersLib for mapping(uint => string[]);

    using LayersLib for uint;



    using RectLib for Rect;

    using RectLib for Rect[];



    using RandLib for Rand;

    using RandLib for string[];

    using Converter for uint;



    // uint8 spores_count = 7;

    // uint8[levelsCount] stemLevelCounts = [5, 5, 5, 6, 10];

    // uint8[levelsCount] capLevelCounts = [5, 7, 10, 10, 10];

    // uint8[levelsCount] dotLevelCounts = [5, 7, 10, 10, 10];



    string stars;



    // mapping(uint => Rect[]) spores;

    // mapping(uint => mapping(uint => Rect[])) stems;

    // mapping(uint => mapping(uint => Rect[])) caps;

    // mapping(uint => mapping(uint => Rect[])) dots;    

    // mapping(uint => Rect[]) grounds;



    mapping(uint => SaberShape[]) saberShapes;



    string coreColor = "#fff";



    string[] backgroundColors = [

        "#190518",

        "#07071C",

        "#102421",

        "#05110B",

        "#000000"

    ];



    string[][] colors = [

        ['#f9e2dc', '#ffaa94'],

        ['#f7da8a', '#ffcc41'],

        ['#dbd1b8', '#ffdd89'],

        ['#bd9e32', '#ffc600'],

        ['#dad2c7', '#ffd59c'],

        ['#7eba72', '#6cff4f'],

        ['#070707', '#533a3a'],

        ['#79818c', '#7aa1d8'],

        ['#253c42', '#25788e'],

        ['#793695', '#a30ee1'],

        ['#e1bfa4', '#ffad6d'],

        ['#ad73b0', '#f459fc'],

        ['#a7a37e', '#f3e66e'],

        ['#1174b7', '#0098ff'],

        ['#475363', '#4975af'],

        ['#3e894a', '#20d53d'],

        ['#ede9ea', '#ffaec2'],

        ['#4f1f1d', '#9b100a'],

        ['#2b4f5f', '#1a7eab'],

        ['#df7bb2', '#ff40a9'],

        ['#daa478', '#ff953f'],

        ['#bfcf6c', '#deff38'],

        ['#5f5c33', '#aba228'],

        ['#203064', '#032cb0'],

        ['#2c3942', '#34698e'],

        ['#354a5b', '#2f71a7'],

        ['#a7a49b', '#f3dc98'],

        ['#771e16', '#c31000'],

        ['#4c7c92', '#31a7de'],

        ['#f1d34f', '#ffd107'],

        ['#79533e', '#c56129'],

        ['#74bf48', '#6aff13'],

        ['#266751', '#0cb37a'],

        ['#edecda', '#fff99e'],

        ['#745a63', '#c05b7e'],

        ['#303680', '#0f1dcc'],

        ['#cf463c', '#ff1100'],

        ['#c23a2a', '#ff1a00'],

        ['#70a9c6', '#43bfff'],

        ['#3195d3', '#009dff'],

        ['#e4422d', '#ff1d00'],

        ['#5c88b7', '#3395ff'],

        ['#face61', '#ffbc16'],

        ['#562912', '#a23600'],

        ['#3f6d50', '#33b965'],

        ['#704e33', '#bc631d'],

        ['#f2842d', '#ff7000'],

        ['#fefefe', '#ffb2b2'],

        ['#b0d0dd', '#7ed9ff'],

        ['#155fa6', '#007bf2'],

        ['#ad2e28', '#f90b00'],

        ['#103056', '#004aa2'],

        ['#f6944d', '#ff6d03'],

        ['#d94129', '#ff2200'],

        ['#3d5531', '#53a12c'],

        ['#762c1f', '#c21d00'],

        ['#f0ec55', '#fff80d'],

        ['#98d5f1', '#54c9ff'],

        ['#dcded3', '#eeffa5'],

        ['#bc7d2e', '#ff8d00'],

        ['#707070', '#bc8383'],

        ['#41143b', '#8d017a'],

        ['#f04730', '#ff1e00'],

        ['#0d0c11', '#31255d'],

        ['#f59f66', '#ff771d'],

        ['#ddd9da', '#ffadc2'],

        ['#2f705a', '#16bc84'],

        ['#5ea0c3', '#2eb6ff'],

        ['#919f9f', '#90ebeb'],

        ['#753d18', '#c14c00'],

        ['#070707', '#533a3a'],

        ['#452216', '#912702'],

        ['#4e1d0c', '#9a2700'],

        ['#389ecb', '#00b0ff'],

        ['#f07050', '#ff3908'],

        ['#1d1d1d', '#694949'],

        ['#3d7aba', '#0780ff'],

        ['#78808b', '#79a1d7'],

        ['#784a28', '#c45706'],

        ['#c0982f', '#ffb800']

    ];    



    // string[] private beam_glow_color_1_lvl0 = [

    //     "#493114"

    // ];



    // string[] private beam_glow_color_2_lvl0 = [

    //     "#453879"

    // ];



    // string[] private beam_color_lvl0 = [

    //     "#656565"

    // ];



    // HiltColors[] private hilt_colors_lvl0 = [

    //     HiltColors("#acacac","","")

    // ];        



    // string[] private beam_glow_color_1_lvl1 = [

    //     "#493114"

    // ];



    // string[] private beam_glow_color_2_lvl1 = [

    //     "#453879"

    // ];



    // string[] private beam_color_lvl1 = [

    //     "#231b32"

    // ];



    // HiltColors[] private hilt_colors_lvl1 = [

    //     HiltColors("#acacac","","")

    // ];



    // string[] private beam_glow_color_1_lvl2 = [

    //     "#493114"

    // ];



    // string[] private beam_glow_color_2_lvl2 = [

    //     "#453879"

    // ];



    // string[] private beam_color_lvl2 = [

    //     "#231b32"

    // ];



    // HiltColors[] private hilt_colors_lvl2 = [

    //     HiltColors("#acacac","","")

    // ];



    // string[] private beam_glow_color_1_lvl3 = [

    //     "#493114"

    // ];



    // string[] private beam_glow_color_2_lvl3 = [

    //     "#453879"

    // ];



    // string[] private beam_color_lvl3 = [

    //     "#231b32"

    // ];



    // HiltColors[] private hilt_colors_lvl3 = [

    //     HiltColors("#acacac","","")

    // ];



    // string[] private beam_glow_color_1_lvl4 = [

    //     "#493114"

    // ];



    // string[] private beam_glow_color_2_lvl4 = [

    //     "#453879"

    // ];



    // string[] private beam_color_lvl4 = [

    //     "#231b32"

    // ];



    // HiltColors[] private hilt_colors_lvl4 = [

    //     HiltColors("#acacac","","")

    // ];    



    // SaberShape[] private saberShapes_lvl0;

    // SaberShape[] private saberShapes_lvl1;

    // SaberShape[] private saberShapes_lvl2;

    // SaberShape[] private saberShapes_lvl3;

    // SaberShape[] private saberShapes_lvl4;



    // SaberShape[][] private saberShapes = [saberShapes_lvl0, saberShapes_lvl1, saberShapes_lvl2, saberShapes_lvl3, saberShapes_lvl4];



    constructor() {}



    // function get_color(uint index) public view returns (string[] memory) {

    //     return colors[index];

    // }





    // function beam_glow_color_1(

    //     uint index

    // ) private view returns (string[] storage) {

    //     if (index == 0) return beam_glow_color_1_lvl0;

    //     if (index == 1) return beam_glow_color_1_lvl1;

    //     if (index == 2) return beam_glow_color_1_lvl2;

    //     if (index == 3) return beam_glow_color_1_lvl3;

    //     if (index == 4) return beam_glow_color_1_lvl4;

    //     return beam_glow_color_1_lvl0;

    // }



    // function beam_glow_color_2(

    //     uint index

    // ) private view returns (string[] storage) {

    //     if (index == 0) return beam_glow_color_2_lvl0;

    //     if (index == 1) return beam_glow_color_2_lvl1;

    //     if (index == 2) return beam_glow_color_2_lvl2;

    //     if (index == 3) return beam_glow_color_2_lvl3;

    //     if (index == 4) return beam_glow_color_2_lvl4;

    //     return beam_glow_color_2_lvl0;

    // }



    // function beam_color(

    //     uint index

    // ) private view returns (string[] storage) {

    //     if (index == 0) return beam_color_lvl0;

    //     if (index == 1) return beam_color_lvl1;

    //     if (index == 2) return beam_color_lvl2;

    //     if (index == 3) return beam_color_lvl3;

    //     if (index == 4) return beam_color_lvl4;

    //     return beam_color_lvl0;

    // }



    // function hilt_colors(

    //     uint index

    // ) private view returns (HiltColors[] storage) {

    //     if (index == 0) return hilt_colors_lvl0;

    //     if (index == 1) return hilt_colors_lvl1;

    //     if (index == 2) return hilt_colors_lvl2;

    //     if (index == 3) return hilt_colors_lvl3;

    //     if (index == 4) return hilt_colors_lvl4;

    //     return hilt_colors_lvl0;

    // }



    // function setSaberShape(SaberShape calldata shape, uint8 lvl) external onlyOwner {

    //     saberShapes[lvl].push(shape);

    // }



    // function setSaberShapes(SaberShape[] calldata shape, uint8 lvl) external onlyOwner {

    //     console.log('setSaberShapes', shape.length);

    //     console.log('lvl', lvl);

    //     for (uint i = 0; i < shape.length; ++i) {

    //         saberShapes[lvl].push(shape[i]);

    //     }

    // }



    function addSaberShape(SaberShape calldata shape, uint8 lvl) external onlyOwner {

        console.log('addSaberShape');

        saberShapes[lvl].push(shape);

    }



    function setStars(string memory _stars) public onlyOwner {

        stars = _stars;

    }



    function toString(uint value) private pure returns (string memory) {

        if (value == 0) {

            return "0";

        }

        uint temp = value;

        uint digits;

        while (temp != 0) {

            digits++;

            temp /= 10;

        }

        bytes memory buffer = new bytes(digits);

        while (value != 0) {

            digits -= 1;

            buffer[digits] = bytes1(uint8(48 + uint256(value % 10)));

            value /= 10;

        }

        return string(buffer);

    }



    function setData(SeedData memory seed_data) private view returns (SaberData memory) {

        Rand memory rnd = Rand(seed_data.seed, 0, seed_data.extra);

        SaberData memory data;

        data.lvl = rnd.lvl().to_lvl_1();

        console.log('data.lvl', data.lvl);

        data.uuid = string(abi.encodePacked(seed_data.seed.toString(), '_', seed_data.extra.toString()));



        uint backgroundIndex = rnd.next() % backgroundColors.length;

        data.background_color = backgroundColors[backgroundIndex];



        uint hiltColorIndex = rnd.next() % colors.length;

        data.hilt_color = colors[hiltColorIndex][0];



        uint beamColorPairId = rnd.next() % colors.length;

        string[] memory beamColorPair = colors[beamColorPairId];



        data.beam_color = coreColor; //beamColorPair[1];

        data.beam_glow_color = beamColorPair[1];



        console.log('2');

        // data.beam_glow_color_1 = beam_glow_color_1(data.lvl).random(rnd);

        // data.beam_glow_color_2 = beam_glow_color_2(data.lvl).random(rnd);

        uint saberShapeId = rnd.next() % saberShapes[data.lvl].length;

        console.log('3');

        SaberShape memory saberShape = saberShapes[data.lvl][saberShapeId];

        data.saber_shape_id = saberShapeId;

        data.saberShape = saberShape;

        return data;

    }



    function toSvg(

        SeedData memory seed_data

    ) internal view returns (string memory) {

        return toSvg(setData(seed_data));

    }



    function toMeta(

        SeedData memory seed_data

    ) internal view returns (string memory) {

        SaberData memory data = setData(seed_data);

        string memory meta = string(abi.encodePacked(

            "{",

            '"Level":', data.lvl.toString(),

            ', "Hilt Color":"',

            data.hilt_color,

            '"',

            // ', "hilt_color_darker_base":"',

            // data.hilt_colors.darkerBase,

            // '"',

            // ', "hilt_color_highlight":"',

            // data.hilt_colors.highlight,

            // '"',

            ', "Beam Color":"',

            data.beam_color,

            '"',

            ', "Beam Glow Color":"',

            data.beam_glow_color,

            '"',

            ', "Background Color":"',

            data.background_color,

            '"',

            // ', "beam_glow_color_2":"',

            // data.beam_glow_color_2,

            // '"',

            ', "Saber Shape id":', data.saber_shape_id.toString(),     

            ', "Description":"', description, '"',

            ', "Web":"', web, '"',                   

            "}"

        ));



        return meta;

    }



    // function generateGlowClass(SaberData memory data) private pure returns (string memory) {

    //     string memory radialGradientClass = string(abi.encodePacked('radial-gradient-', data.uuid));

    //     string memory full_glow_class = string(abi.encodePacked(

    //         "<svg viewBox='", viewBox, "'>",

    //         data.saberShape.beam_glow.defs[0],

    //         radialGradientClass,

    //         data.saberShape.beam_glow.defs[1],

    //         data.beam_glow_color_1,

    //         data.saberShape.beam_glow.defs[2],

    //         data.beam_glow_color_1,

    //         data.saberShape.beam_glow.defs[3],

    //         data.saberShape.beam_glow.rest[0],

    //         radialGradientClass,

    //         data.saberShape.beam_glow.rest[1],

    //         "</svg>"

    //     ));

    //     return full_glow_class;

    // }



    function addColor(string[] memory parts, string memory color) private view returns (string memory) {

        string memory res;

        if (parts.length == 0) return res;

        for (uint i = 0; i < parts.length-1; ++i) {

            console.log('parts[i]', parts[i]);

            res = string(abi.encodePacked(res, parts[i], color));

        }

        return string(abi.encodePacked(res, parts[parts.length-1]));

        return res;

    }



    function generateGlowSvg(SaberData memory data) private view returns (string memory) {

        console.log('generateGlowSvg');

        if (data.saberShape.beam_glow.defs.length == 0) return "";

        string memory radialGradientClass = string(abi.encodePacked('radial-gradient-', data.uuid));

        string memory full_glow = string(abi.encodePacked(            

            "<svg viewBox='", viewBox, "'>",            

            "<defs>",

            data.saberShape.beam_glow.defs[0],

            radialGradientClass,

            data.saberShape.beam_glow.defs[1],

            data.beam_glow_color,

            data.saberShape.beam_glow.defs[2],

            data.beam_glow_color,

            data.saberShape.beam_glow.defs[3],

            "</defs>",

            addColor(data.saberShape.beam_glow.outline, data.beam_glow_color),

            data.saberShape.beam_glow.radial[0],

            radialGradientClass,

            data.saberShape.beam_glow.radial[1],

            "</svg>"

        ));

        console.log('done generateGlowSvg');





        // string memory full_glow_class = generateGlowClass(data);

        // string memory glow_class = string(abi.encodePacked('glow_', data.uuid));

        // string memory full_glow = addColor(data.saberShape.beam_glow, glow_class);

        // string memory result = string(abi.encodePacked(

        //     "<svg viewBox='", viewBox, "'>",

        //         "<defs>",

        //             "<style>",

        //                 full_glow_class,

        //             "</style>",

        //         "</defs>",

        //         full_glow,

        //     "</svg>"

        // ));

        return full_glow;

    }



    function generateBeamSvg(SaberData memory data) private view returns (string memory) {

        console.log('generateBeamSvg');

        string memory beam = addColor(data.saberShape.beam, data.beam_color);

        string memory result = string(abi.encodePacked(

            "<svg viewBox='", viewBox, "'>",

                beam,

            "</svg>"

        ));

        console.log('done generateBeamSvg');

        return result;

    }



    function generateHiltSvg(SaberData memory data) private view returns (string memory) {

        console.log('generateHiltSvg');

        string memory hilt;

        hilt = string(abi.encodePacked(

            addColor(data.saberShape.hilt, data.hilt_color)

            // addColor(data.saberShape.hilt.darkerBase, data.hilt_colors.darkerBase),

            // addColor(data.saberShape.hilt.highlight, data.hilt_colors.highlight)

        ));

        string memory result = string(abi.encodePacked(

            "<svg viewBox='", viewBox, "'>",

                hilt,

            "</svg>"

        ));

        console.log('done generateHiltSvg');

        return result;

    }



    function generateBackground(SaberData memory data) private view returns (string memory) {

        console.log('generateBackground');

        string memory background = string(abi.encodePacked(

            "<rect x='0' y='0' width='100%' height='100%' fill='", data.background_color, "' />",

            stars

        ));

        console.log('done generateBackground');

        return background;

    }



    function toSvg(

        SaberData memory data

    ) private view returns (string memory) {

        console.log('toSvg');

        bytes memory svgStart = abi.encodePacked(            

            "<svg xmlns='http://www.w3.org/2000/svg' viewBox='", viewBox, "'>"

        );



        return

            string(

                abi.encodePacked(

                    svgStart,

                    generateBackground(data),

                    generateGlowSvg(data),

                    generateBeamSvg(data),

                    generateHiltSvg(data),

                    "</svg>"

                )

            );

    }            

}

File 6 of 10 : IERC20.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v5.0.0) (token/ERC20/IERC20.sol)

pragma solidity ^0.8.20;

/**
 * @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 value of tokens in existence.
     */
    function totalSupply() external view returns (uint256);

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

    /**
     * @dev Moves a `value` amount of 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 value) 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 a `value` amount of tokens 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 value) external returns (bool);

    /**
     * @dev Moves a `value` amount of tokens from `from` to `to` using the
     * allowance mechanism. `value` 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 value) external returns (bool);
}

File 7 of 10 : IERC20Metadata.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v5.0.0) (token/ERC20/extensions/IERC20Metadata.sol)

pragma solidity ^0.8.20;

import {IERC20} from "../IERC20.sol";

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

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

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

File 8 of 10 : Context.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v5.0.1) (utils/Context.sol)

pragma solidity ^0.8.20;

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

    function _contextSuffixLength() internal view virtual returns (uint256) {
        return 0;
    }
}

File 9 of 10 : Ownable.sol
// SPDX-License-Identifier: MIT

pragma solidity ^0.8.20;



contract Ownable {

    address _owner;



    event RenounceOwnership();



    constructor() {

        _owner = msg.sender;

    }



    modifier onlyOwner() {

        require(_owner == msg.sender, "only owner");

        _;

    }



    function owner() external view virtual returns (address) {

        return _owner;

    }



    function ownerRenounce() public onlyOwner {

        _owner = address(0);

        emit RenounceOwnership();

    }



    function transferOwnership(address newOwner) external onlyOwner {

        _owner = newOwner;

    }

}

File 10 of 10 : console.sol
// SPDX-License-Identifier: MIT
pragma solidity >=0.4.22 <0.9.0;

library console {
    address constant CONSOLE_ADDRESS = address(0x000000000000000000636F6e736F6c652e6c6f67);

    function _sendLogPayload(bytes memory payload) private view {
        uint256 payloadLength = payload.length;
        address consoleAddress = CONSOLE_ADDRESS;
        /// @solidity memory-safe-assembly
        assembly {
            let payloadStart := add(payload, 32)
            let r := staticcall(gas(), consoleAddress, payloadStart, payloadLength, 0, 0)
        }
    }

    function log() internal view {
        _sendLogPayload(abi.encodeWithSignature("log()"));
    }

    function logInt(int p0) internal view {
        _sendLogPayload(abi.encodeWithSignature("log(int)", p0));
    }

    function logUint(uint p0) internal view {
        _sendLogPayload(abi.encodeWithSignature("log(uint)", p0));
    }

    function logString(string memory p0) internal view {
        _sendLogPayload(abi.encodeWithSignature("log(string)", p0));
    }

    function logBool(bool p0) internal view {
        _sendLogPayload(abi.encodeWithSignature("log(bool)", p0));
    }

    function logAddress(address p0) internal view {
        _sendLogPayload(abi.encodeWithSignature("log(address)", p0));
    }

    function logBytes(bytes memory p0) internal view {
        _sendLogPayload(abi.encodeWithSignature("log(bytes)", p0));
    }

    function logBytes1(bytes1 p0) internal view {
        _sendLogPayload(abi.encodeWithSignature("log(bytes1)", p0));
    }

    function logBytes2(bytes2 p0) internal view {
        _sendLogPayload(abi.encodeWithSignature("log(bytes2)", p0));
    }

    function logBytes3(bytes3 p0) internal view {
        _sendLogPayload(abi.encodeWithSignature("log(bytes3)", p0));
    }

    function logBytes4(bytes4 p0) internal view {
        _sendLogPayload(abi.encodeWithSignature("log(bytes4)", p0));
    }

    function logBytes5(bytes5 p0) internal view {
        _sendLogPayload(abi.encodeWithSignature("log(bytes5)", p0));
    }

    function logBytes6(bytes6 p0) internal view {
        _sendLogPayload(abi.encodeWithSignature("log(bytes6)", p0));
    }

    function logBytes7(bytes7 p0) internal view {
        _sendLogPayload(abi.encodeWithSignature("log(bytes7)", p0));
    }

    function logBytes8(bytes8 p0) internal view {
        _sendLogPayload(abi.encodeWithSignature("log(bytes8)", p0));
    }

    function logBytes9(bytes9 p0) internal view {
        _sendLogPayload(abi.encodeWithSignature("log(bytes9)", p0));
    }

    function logBytes10(bytes10 p0) internal view {
        _sendLogPayload(abi.encodeWithSignature("log(bytes10)", p0));
    }

    function logBytes11(bytes11 p0) internal view {
        _sendLogPayload(abi.encodeWithSignature("log(bytes11)", p0));
    }

    function logBytes12(bytes12 p0) internal view {
        _sendLogPayload(abi.encodeWithSignature("log(bytes12)", p0));
    }

    function logBytes13(bytes13 p0) internal view {
        _sendLogPayload(abi.encodeWithSignature("log(bytes13)", p0));
    }

    function logBytes14(bytes14 p0) internal view {
        _sendLogPayload(abi.encodeWithSignature("log(bytes14)", p0));
    }

    function logBytes15(bytes15 p0) internal view {
        _sendLogPayload(abi.encodeWithSignature("log(bytes15)", p0));
    }

    function logBytes16(bytes16 p0) internal view {
        _sendLogPayload(abi.encodeWithSignature("log(bytes16)", p0));
    }

    function logBytes17(bytes17 p0) internal view {
        _sendLogPayload(abi.encodeWithSignature("log(bytes17)", p0));
    }

    function logBytes18(bytes18 p0) internal view {
        _sendLogPayload(abi.encodeWithSignature("log(bytes18)", p0));
    }

    function logBytes19(bytes19 p0) internal view {
        _sendLogPayload(abi.encodeWithSignature("log(bytes19)", p0));
    }

    function logBytes20(bytes20 p0) internal view {
        _sendLogPayload(abi.encodeWithSignature("log(bytes20)", p0));
    }

    function logBytes21(bytes21 p0) internal view {
        _sendLogPayload(abi.encodeWithSignature("log(bytes21)", p0));
    }

    function logBytes22(bytes22 p0) internal view {
        _sendLogPayload(abi.encodeWithSignature("log(bytes22)", p0));
    }

    function logBytes23(bytes23 p0) internal view {
        _sendLogPayload(abi.encodeWithSignature("log(bytes23)", p0));
    }

    function logBytes24(bytes24 p0) internal view {
        _sendLogPayload(abi.encodeWithSignature("log(bytes24)", p0));
    }

    function logBytes25(bytes25 p0) internal view {
        _sendLogPayload(abi.encodeWithSignature("log(bytes25)", p0));
    }

    function logBytes26(bytes26 p0) internal view {
        _sendLogPayload(abi.encodeWithSignature("log(bytes26)", p0));
    }

    function logBytes27(bytes27 p0) internal view {
        _sendLogPayload(abi.encodeWithSignature("log(bytes27)", p0));
    }

    function logBytes28(bytes28 p0) internal view {
        _sendLogPayload(abi.encodeWithSignature("log(bytes28)", p0));
    }

    function logBytes29(bytes29 p0) internal view {
        _sendLogPayload(abi.encodeWithSignature("log(bytes29)", p0));
    }

    function logBytes30(bytes30 p0) internal view {
        _sendLogPayload(abi.encodeWithSignature("log(bytes30)", p0));
    }

    function logBytes31(bytes31 p0) internal view {
        _sendLogPayload(abi.encodeWithSignature("log(bytes31)", p0));
    }

    function logBytes32(bytes32 p0) internal view {
        _sendLogPayload(abi.encodeWithSignature("log(bytes32)", p0));
    }

    function log(uint p0) internal view {
        _sendLogPayload(abi.encodeWithSignature("log(uint)", p0));
    }

    function log(string memory p0) internal view {
        _sendLogPayload(abi.encodeWithSignature("log(string)", p0));
    }

    function log(bool p0) internal view {
        _sendLogPayload(abi.encodeWithSignature("log(bool)", p0));
    }

    function log(address p0) internal view {
        _sendLogPayload(abi.encodeWithSignature("log(address)", p0));
    }

    function log(uint p0, uint p1) internal view {
        _sendLogPayload(abi.encodeWithSignature("log(uint,uint)", p0, p1));
    }

    function log(uint p0, string memory p1) internal view {
        _sendLogPayload(abi.encodeWithSignature("log(uint,string)", p0, p1));
    }

    function log(uint p0, bool p1) internal view {
        _sendLogPayload(abi.encodeWithSignature("log(uint,bool)", p0, p1));
    }

    function log(uint p0, address p1) internal view {
        _sendLogPayload(abi.encodeWithSignature("log(uint,address)", p0, p1));
    }

    function log(string memory p0, uint p1) internal view {
        _sendLogPayload(abi.encodeWithSignature("log(string,uint)", p0, p1));
    }

    function log(string memory p0, string memory p1) internal view {
        _sendLogPayload(abi.encodeWithSignature("log(string,string)", p0, p1));
    }

    function log(string memory p0, bool p1) internal view {
        _sendLogPayload(abi.encodeWithSignature("log(string,bool)", p0, p1));
    }

    function log(string memory p0, address p1) internal view {
        _sendLogPayload(abi.encodeWithSignature("log(string,address)", p0, p1));
    }

    function log(bool p0, uint p1) internal view {
        _sendLogPayload(abi.encodeWithSignature("log(bool,uint)", p0, p1));
    }

    function log(bool p0, string memory p1) internal view {
        _sendLogPayload(abi.encodeWithSignature("log(bool,string)", p0, p1));
    }

    function log(bool p0, bool p1) internal view {
        _sendLogPayload(abi.encodeWithSignature("log(bool,bool)", p0, p1));
    }

    function log(bool p0, address p1) internal view {
        _sendLogPayload(abi.encodeWithSignature("log(bool,address)", p0, p1));
    }

    function log(address p0, uint p1) internal view {
        _sendLogPayload(abi.encodeWithSignature("log(address,uint)", p0, p1));
    }

    function log(address p0, string memory p1) internal view {
        _sendLogPayload(abi.encodeWithSignature("log(address,string)", p0, p1));
    }

    function log(address p0, bool p1) internal view {
        _sendLogPayload(abi.encodeWithSignature("log(address,bool)", p0, p1));
    }

    function log(address p0, address p1) internal view {
        _sendLogPayload(abi.encodeWithSignature("log(address,address)", p0, p1));
    }

    function log(uint p0, uint p1, uint p2) internal view {
        _sendLogPayload(abi.encodeWithSignature("log(uint,uint,uint)", p0, p1, p2));
    }

    function log(uint p0, uint p1, string memory p2) internal view {
        _sendLogPayload(abi.encodeWithSignature("log(uint,uint,string)", p0, p1, p2));
    }

    function log(uint p0, uint p1, bool p2) internal view {
        _sendLogPayload(abi.encodeWithSignature("log(uint,uint,bool)", p0, p1, p2));
    }

    function log(uint p0, uint p1, address p2) internal view {
        _sendLogPayload(abi.encodeWithSignature("log(uint,uint,address)", p0, p1, p2));
    }

    function log(uint p0, string memory p1, uint p2) internal view {
        _sendLogPayload(abi.encodeWithSignature("log(uint,string,uint)", p0, p1, p2));
    }

    function log(uint p0, string memory p1, string memory p2) internal view {
        _sendLogPayload(abi.encodeWithSignature("log(uint,string,string)", p0, p1, p2));
    }

    function log(uint p0, string memory p1, bool p2) internal view {
        _sendLogPayload(abi.encodeWithSignature("log(uint,string,bool)", p0, p1, p2));
    }

    function log(uint p0, string memory p1, address p2) internal view {
        _sendLogPayload(abi.encodeWithSignature("log(uint,string,address)", p0, p1, p2));
    }

    function log(uint p0, bool p1, uint p2) internal view {
        _sendLogPayload(abi.encodeWithSignature("log(uint,bool,uint)", p0, p1, p2));
    }

    function log(uint p0, bool p1, string memory p2) internal view {
        _sendLogPayload(abi.encodeWithSignature("log(uint,bool,string)", p0, p1, p2));
    }

    function log(uint p0, bool p1, bool p2) internal view {
        _sendLogPayload(abi.encodeWithSignature("log(uint,bool,bool)", p0, p1, p2));
    }

    function log(uint p0, bool p1, address p2) internal view {
        _sendLogPayload(abi.encodeWithSignature("log(uint,bool,address)", p0, p1, p2));
    }

    function log(uint p0, address p1, uint p2) internal view {
        _sendLogPayload(abi.encodeWithSignature("log(uint,address,uint)", p0, p1, p2));
    }

    function log(uint p0, address p1, string memory p2) internal view {
        _sendLogPayload(abi.encodeWithSignature("log(uint,address,string)", p0, p1, p2));
    }

    function log(uint p0, address p1, bool p2) internal view {
        _sendLogPayload(abi.encodeWithSignature("log(uint,address,bool)", p0, p1, p2));
    }

    function log(uint p0, address p1, address p2) internal view {
        _sendLogPayload(abi.encodeWithSignature("log(uint,address,address)", p0, p1, p2));
    }

    function log(string memory p0, uint p1, uint p2) internal view {
        _sendLogPayload(abi.encodeWithSignature("log(string,uint,uint)", p0, p1, p2));
    }

    function log(string memory p0, uint p1, string memory p2) internal view {
        _sendLogPayload(abi.encodeWithSignature("log(string,uint,string)", p0, p1, p2));
    }

    function log(string memory p0, uint p1, bool p2) internal view {
        _sendLogPayload(abi.encodeWithSignature("log(string,uint,bool)", p0, p1, p2));
    }

    function log(string memory p0, uint p1, address p2) internal view {
        _sendLogPayload(abi.encodeWithSignature("log(string,uint,address)", p0, p1, p2));
    }

    function log(string memory p0, string memory p1, uint p2) internal view {
        _sendLogPayload(abi.encodeWithSignature("log(string,string,uint)", p0, p1, p2));
    }

    function log(string memory p0, string memory p1, string memory p2) internal view {
        _sendLogPayload(abi.encodeWithSignature("log(string,string,string)", p0, p1, p2));
    }

    function log(string memory p0, string memory p1, bool p2) internal view {
        _sendLogPayload(abi.encodeWithSignature("log(string,string,bool)", p0, p1, p2));
    }

    function log(string memory p0, string memory p1, address p2) internal view {
        _sendLogPayload(abi.encodeWithSignature("log(string,string,address)", p0, p1, p2));
    }

    function log(string memory p0, bool p1, uint p2) internal view {
        _sendLogPayload(abi.encodeWithSignature("log(string,bool,uint)", p0, p1, p2));
    }

    function log(string memory p0, bool p1, string memory p2) internal view {
        _sendLogPayload(abi.encodeWithSignature("log(string,bool,string)", p0, p1, p2));
    }

    function log(string memory p0, bool p1, bool p2) internal view {
        _sendLogPayload(abi.encodeWithSignature("log(string,bool,bool)", p0, p1, p2));
    }

    function log(string memory p0, bool p1, address p2) internal view {
        _sendLogPayload(abi.encodeWithSignature("log(string,bool,address)", p0, p1, p2));
    }

    function log(string memory p0, address p1, uint p2) internal view {
        _sendLogPayload(abi.encodeWithSignature("log(string,address,uint)", p0, p1, p2));
    }

    function log(string memory p0, address p1, string memory p2) internal view {
        _sendLogPayload(abi.encodeWithSignature("log(string,address,string)", p0, p1, p2));
    }

    function log(string memory p0, address p1, bool p2) internal view {
        _sendLogPayload(abi.encodeWithSignature("log(string,address,bool)", p0, p1, p2));
    }

    function log(string memory p0, address p1, address p2) internal view {
        _sendLogPayload(abi.encodeWithSignature("log(string,address,address)", p0, p1, p2));
    }

    function log(bool p0, uint p1, uint p2) internal view {
        _sendLogPayload(abi.encodeWithSignature("log(bool,uint,uint)", p0, p1, p2));
    }

    function log(bool p0, uint p1, string memory p2) internal view {
        _sendLogPayload(abi.encodeWithSignature("log(bool,uint,string)", p0, p1, p2));
    }

    function log(bool p0, uint p1, bool p2) internal view {
        _sendLogPayload(abi.encodeWithSignature("log(bool,uint,bool)", p0, p1, p2));
    }

    function log(bool p0, uint p1, address p2) internal view {
        _sendLogPayload(abi.encodeWithSignature("log(bool,uint,address)", p0, p1, p2));
    }

    function log(bool p0, string memory p1, uint p2) internal view {
        _sendLogPayload(abi.encodeWithSignature("log(bool,string,uint)", p0, p1, p2));
    }

    function log(bool p0, string memory p1, string memory p2) internal view {
        _sendLogPayload(abi.encodeWithSignature("log(bool,string,string)", p0, p1, p2));
    }

    function log(bool p0, string memory p1, bool p2) internal view {
        _sendLogPayload(abi.encodeWithSignature("log(bool,string,bool)", p0, p1, p2));
    }

    function log(bool p0, string memory p1, address p2) internal view {
        _sendLogPayload(abi.encodeWithSignature("log(bool,string,address)", p0, p1, p2));
    }

    function log(bool p0, bool p1, uint p2) internal view {
        _sendLogPayload(abi.encodeWithSignature("log(bool,bool,uint)", p0, p1, p2));
    }

    function log(bool p0, bool p1, string memory p2) internal view {
        _sendLogPayload(abi.encodeWithSignature("log(bool,bool,string)", p0, p1, p2));
    }

    function log(bool p0, bool p1, bool p2) internal view {
        _sendLogPayload(abi.encodeWithSignature("log(bool,bool,bool)", p0, p1, p2));
    }

    function log(bool p0, bool p1, address p2) internal view {
        _sendLogPayload(abi.encodeWithSignature("log(bool,bool,address)", p0, p1, p2));
    }

    function log(bool p0, address p1, uint p2) internal view {
        _sendLogPayload(abi.encodeWithSignature("log(bool,address,uint)", p0, p1, p2));
    }

    function log(bool p0, address p1, string memory p2) internal view {
        _sendLogPayload(abi.encodeWithSignature("log(bool,address,string)", p0, p1, p2));
    }

    function log(bool p0, address p1, bool p2) internal view {
        _sendLogPayload(abi.encodeWithSignature("log(bool,address,bool)", p0, p1, p2));
    }

    function log(bool p0, address p1, address p2) internal view {
        _sendLogPayload(abi.encodeWithSignature("log(bool,address,address)", p0, p1, p2));
    }

    function log(address p0, uint p1, uint p2) internal view {
        _sendLogPayload(abi.encodeWithSignature("log(address,uint,uint)", p0, p1, p2));
    }

    function log(address p0, uint p1, string memory p2) internal view {
        _sendLogPayload(abi.encodeWithSignature("log(address,uint,string)", p0, p1, p2));
    }

    function log(address p0, uint p1, bool p2) internal view {
        _sendLogPayload(abi.encodeWithSignature("log(address,uint,bool)", p0, p1, p2));
    }

    function log(address p0, uint p1, address p2) internal view {
        _sendLogPayload(abi.encodeWithSignature("log(address,uint,address)", p0, p1, p2));
    }

    function log(address p0, string memory p1, uint p2) internal view {
        _sendLogPayload(abi.encodeWithSignature("log(address,string,uint)", p0, p1, p2));
    }

    function log(address p0, string memory p1, string memory p2) internal view {
        _sendLogPayload(abi.encodeWithSignature("log(address,string,string)", p0, p1, p2));
    }

    function log(address p0, string memory p1, bool p2) internal view {
        _sendLogPayload(abi.encodeWithSignature("log(address,string,bool)", p0, p1, p2));
    }

    function log(address p0, string memory p1, address p2) internal view {
        _sendLogPayload(abi.encodeWithSignature("log(address,string,address)", p0, p1, p2));
    }

    function log(address p0, bool p1, uint p2) internal view {
        _sendLogPayload(abi.encodeWithSignature("log(address,bool,uint)", p0, p1, p2));
    }

    function log(address p0, bool p1, string memory p2) internal view {
        _sendLogPayload(abi.encodeWithSignature("log(address,bool,string)", p0, p1, p2));
    }

    function log(address p0, bool p1, bool p2) internal view {
        _sendLogPayload(abi.encodeWithSignature("log(address,bool,bool)", p0, p1, p2));
    }

    function log(address p0, bool p1, address p2) internal view {
        _sendLogPayload(abi.encodeWithSignature("log(address,bool,address)", p0, p1, p2));
    }

    function log(address p0, address p1, uint p2) internal view {
        _sendLogPayload(abi.encodeWithSignature("log(address,address,uint)", p0, p1, p2));
    }

    function log(address p0, address p1, string memory p2) internal view {
        _sendLogPayload(abi.encodeWithSignature("log(address,address,string)", p0, p1, p2));
    }

    function log(address p0, address p1, bool p2) internal view {
        _sendLogPayload(abi.encodeWithSignature("log(address,address,bool)", p0, p1, p2));
    }

    function log(address p0, address p1, address p2) internal view {
        _sendLogPayload(abi.encodeWithSignature("log(address,address,address)", p0, p1, p2));
    }

    function log(uint p0, uint p1, uint p2, uint p3) internal view {
        _sendLogPayload(abi.encodeWithSignature("log(uint,uint,uint,uint)", p0, p1, p2, p3));
    }

    function log(uint p0, uint p1, uint p2, string memory p3) internal view {
        _sendLogPayload(abi.encodeWithSignature("log(uint,uint,uint,string)", p0, p1, p2, p3));
    }

    function log(uint p0, uint p1, uint p2, bool p3) internal view {
        _sendLogPayload(abi.encodeWithSignature("log(uint,uint,uint,bool)", p0, p1, p2, p3));
    }

    function log(uint p0, uint p1, uint p2, address p3) internal view {
        _sendLogPayload(abi.encodeWithSignature("log(uint,uint,uint,address)", p0, p1, p2, p3));
    }

    function log(uint p0, uint p1, string memory p2, uint p3) internal view {
        _sendLogPayload(abi.encodeWithSignature("log(uint,uint,string,uint)", p0, p1, p2, p3));
    }

    function log(uint p0, uint p1, string memory p2, string memory p3) internal view {
        _sendLogPayload(abi.encodeWithSignature("log(uint,uint,string,string)", p0, p1, p2, p3));
    }

    function log(uint p0, uint p1, string memory p2, bool p3) internal view {
        _sendLogPayload(abi.encodeWithSignature("log(uint,uint,string,bool)", p0, p1, p2, p3));
    }

    function log(uint p0, uint p1, string memory p2, address p3) internal view {
        _sendLogPayload(abi.encodeWithSignature("log(uint,uint,string,address)", p0, p1, p2, p3));
    }

    function log(uint p0, uint p1, bool p2, uint p3) internal view {
        _sendLogPayload(abi.encodeWithSignature("log(uint,uint,bool,uint)", p0, p1, p2, p3));
    }

    function log(uint p0, uint p1, bool p2, string memory p3) internal view {
        _sendLogPayload(abi.encodeWithSignature("log(uint,uint,bool,string)", p0, p1, p2, p3));
    }

    function log(uint p0, uint p1, bool p2, bool p3) internal view {
        _sendLogPayload(abi.encodeWithSignature("log(uint,uint,bool,bool)", p0, p1, p2, p3));
    }

    function log(uint p0, uint p1, bool p2, address p3) internal view {
        _sendLogPayload(abi.encodeWithSignature("log(uint,uint,bool,address)", p0, p1, p2, p3));
    }

    function log(uint p0, uint p1, address p2, uint p3) internal view {
        _sendLogPayload(abi.encodeWithSignature("log(uint,uint,address,uint)", p0, p1, p2, p3));
    }

    function log(uint p0, uint p1, address p2, string memory p3) internal view {
        _sendLogPayload(abi.encodeWithSignature("log(uint,uint,address,string)", p0, p1, p2, p3));
    }

    function log(uint p0, uint p1, address p2, bool p3) internal view {
        _sendLogPayload(abi.encodeWithSignature("log(uint,uint,address,bool)", p0, p1, p2, p3));
    }

    function log(uint p0, uint p1, address p2, address p3) internal view {
        _sendLogPayload(abi.encodeWithSignature("log(uint,uint,address,address)", p0, p1, p2, p3));
    }

    function log(uint p0, string memory p1, uint p2, uint p3) internal view {
        _sendLogPayload(abi.encodeWithSignature("log(uint,string,uint,uint)", p0, p1, p2, p3));
    }

    function log(uint p0, string memory p1, uint p2, string memory p3) internal view {
        _sendLogPayload(abi.encodeWithSignature("log(uint,string,uint,string)", p0, p1, p2, p3));
    }

    function log(uint p0, string memory p1, uint p2, bool p3) internal view {
        _sendLogPayload(abi.encodeWithSignature("log(uint,string,uint,bool)", p0, p1, p2, p3));
    }

    function log(uint p0, string memory p1, uint p2, address p3) internal view {
        _sendLogPayload(abi.encodeWithSignature("log(uint,string,uint,address)", p0, p1, p2, p3));
    }

    function log(uint p0, string memory p1, string memory p2, uint p3) internal view {
        _sendLogPayload(abi.encodeWithSignature("log(uint,string,string,uint)", p0, p1, p2, p3));
    }

    function log(uint p0, string memory p1, string memory p2, string memory p3) internal view {
        _sendLogPayload(abi.encodeWithSignature("log(uint,string,string,string)", p0, p1, p2, p3));
    }

    function log(uint p0, string memory p1, string memory p2, bool p3) internal view {
        _sendLogPayload(abi.encodeWithSignature("log(uint,string,string,bool)", p0, p1, p2, p3));
    }

    function log(uint p0, string memory p1, string memory p2, address p3) internal view {
        _sendLogPayload(abi.encodeWithSignature("log(uint,string,string,address)", p0, p1, p2, p3));
    }

    function log(uint p0, string memory p1, bool p2, uint p3) internal view {
        _sendLogPayload(abi.encodeWithSignature("log(uint,string,bool,uint)", p0, p1, p2, p3));
    }

    function log(uint p0, string memory p1, bool p2, string memory p3) internal view {
        _sendLogPayload(abi.encodeWithSignature("log(uint,string,bool,string)", p0, p1, p2, p3));
    }

    function log(uint p0, string memory p1, bool p2, bool p3) internal view {
        _sendLogPayload(abi.encodeWithSignature("log(uint,string,bool,bool)", p0, p1, p2, p3));
    }

    function log(uint p0, string memory p1, bool p2, address p3) internal view {
        _sendLogPayload(abi.encodeWithSignature("log(uint,string,bool,address)", p0, p1, p2, p3));
    }

    function log(uint p0, string memory p1, address p2, uint p3) internal view {
        _sendLogPayload(abi.encodeWithSignature("log(uint,string,address,uint)", p0, p1, p2, p3));
    }

    function log(uint p0, string memory p1, address p2, string memory p3) internal view {
        _sendLogPayload(abi.encodeWithSignature("log(uint,string,address,string)", p0, p1, p2, p3));
    }

    function log(uint p0, string memory p1, address p2, bool p3) internal view {
        _sendLogPayload(abi.encodeWithSignature("log(uint,string,address,bool)", p0, p1, p2, p3));
    }

    function log(uint p0, string memory p1, address p2, address p3) internal view {
        _sendLogPayload(abi.encodeWithSignature("log(uint,string,address,address)", p0, p1, p2, p3));
    }

    function log(uint p0, bool p1, uint p2, uint p3) internal view {
        _sendLogPayload(abi.encodeWithSignature("log(uint,bool,uint,uint)", p0, p1, p2, p3));
    }

    function log(uint p0, bool p1, uint p2, string memory p3) internal view {
        _sendLogPayload(abi.encodeWithSignature("log(uint,bool,uint,string)", p0, p1, p2, p3));
    }

    function log(uint p0, bool p1, uint p2, bool p3) internal view {
        _sendLogPayload(abi.encodeWithSignature("log(uint,bool,uint,bool)", p0, p1, p2, p3));
    }

    function log(uint p0, bool p1, uint p2, address p3) internal view {
        _sendLogPayload(abi.encodeWithSignature("log(uint,bool,uint,address)", p0, p1, p2, p3));
    }

    function log(uint p0, bool p1, string memory p2, uint p3) internal view {
        _sendLogPayload(abi.encodeWithSignature("log(uint,bool,string,uint)", p0, p1, p2, p3));
    }

    function log(uint p0, bool p1, string memory p2, string memory p3) internal view {
        _sendLogPayload(abi.encodeWithSignature("log(uint,bool,string,string)", p0, p1, p2, p3));
    }

    function log(uint p0, bool p1, string memory p2, bool p3) internal view {
        _sendLogPayload(abi.encodeWithSignature("log(uint,bool,string,bool)", p0, p1, p2, p3));
    }

    function log(uint p0, bool p1, string memory p2, address p3) internal view {
        _sendLogPayload(abi.encodeWithSignature("log(uint,bool,string,address)", p0, p1, p2, p3));
    }

    function log(uint p0, bool p1, bool p2, uint p3) internal view {
        _sendLogPayload(abi.encodeWithSignature("log(uint,bool,bool,uint)", p0, p1, p2, p3));
    }

    function log(uint p0, bool p1, bool p2, string memory p3) internal view {
        _sendLogPayload(abi.encodeWithSignature("log(uint,bool,bool,string)", p0, p1, p2, p3));
    }

    function log(uint p0, bool p1, bool p2, bool p3) internal view {
        _sendLogPayload(abi.encodeWithSignature("log(uint,bool,bool,bool)", p0, p1, p2, p3));
    }

    function log(uint p0, bool p1, bool p2, address p3) internal view {
        _sendLogPayload(abi.encodeWithSignature("log(uint,bool,bool,address)", p0, p1, p2, p3));
    }

    function log(uint p0, bool p1, address p2, uint p3) internal view {
        _sendLogPayload(abi.encodeWithSignature("log(uint,bool,address,uint)", p0, p1, p2, p3));
    }

    function log(uint p0, bool p1, address p2, string memory p3) internal view {
        _sendLogPayload(abi.encodeWithSignature("log(uint,bool,address,string)", p0, p1, p2, p3));
    }

    function log(uint p0, bool p1, address p2, bool p3) internal view {
        _sendLogPayload(abi.encodeWithSignature("log(uint,bool,address,bool)", p0, p1, p2, p3));
    }

    function log(uint p0, bool p1, address p2, address p3) internal view {
        _sendLogPayload(abi.encodeWithSignature("log(uint,bool,address,address)", p0, p1, p2, p3));
    }

    function log(uint p0, address p1, uint p2, uint p3) internal view {
        _sendLogPayload(abi.encodeWithSignature("log(uint,address,uint,uint)", p0, p1, p2, p3));
    }

    function log(uint p0, address p1, uint p2, string memory p3) internal view {
        _sendLogPayload(abi.encodeWithSignature("log(uint,address,uint,string)", p0, p1, p2, p3));
    }

    function log(uint p0, address p1, uint p2, bool p3) internal view {
        _sendLogPayload(abi.encodeWithSignature("log(uint,address,uint,bool)", p0, p1, p2, p3));
    }

    function log(uint p0, address p1, uint p2, address p3) internal view {
        _sendLogPayload(abi.encodeWithSignature("log(uint,address,uint,address)", p0, p1, p2, p3));
    }

    function log(uint p0, address p1, string memory p2, uint p3) internal view {
        _sendLogPayload(abi.encodeWithSignature("log(uint,address,string,uint)", p0, p1, p2, p3));
    }

    function log(uint p0, address p1, string memory p2, string memory p3) internal view {
        _sendLogPayload(abi.encodeWithSignature("log(uint,address,string,string)", p0, p1, p2, p3));
    }

    function log(uint p0, address p1, string memory p2, bool p3) internal view {
        _sendLogPayload(abi.encodeWithSignature("log(uint,address,string,bool)", p0, p1, p2, p3));
    }

    function log(uint p0, address p1, string memory p2, address p3) internal view {
        _sendLogPayload(abi.encodeWithSignature("log(uint,address,string,address)", p0, p1, p2, p3));
    }

    function log(uint p0, address p1, bool p2, uint p3) internal view {
        _sendLogPayload(abi.encodeWithSignature("log(uint,address,bool,uint)", p0, p1, p2, p3));
    }

    function log(uint p0, address p1, bool p2, string memory p3) internal view {
        _sendLogPayload(abi.encodeWithSignature("log(uint,address,bool,string)", p0, p1, p2, p3));
    }

    function log(uint p0, address p1, bool p2, bool p3) internal view {
        _sendLogPayload(abi.encodeWithSignature("log(uint,address,bool,bool)", p0, p1, p2, p3));
    }

    function log(uint p0, address p1, bool p2, address p3) internal view {
        _sendLogPayload(abi.encodeWithSignature("log(uint,address,bool,address)", p0, p1, p2, p3));
    }

    function log(uint p0, address p1, address p2, uint p3) internal view {
        _sendLogPayload(abi.encodeWithSignature("log(uint,address,address,uint)", p0, p1, p2, p3));
    }

    function log(uint p0, address p1, address p2, string memory p3) internal view {
        _sendLogPayload(abi.encodeWithSignature("log(uint,address,address,string)", p0, p1, p2, p3));
    }

    function log(uint p0, address p1, address p2, bool p3) internal view {
        _sendLogPayload(abi.encodeWithSignature("log(uint,address,address,bool)", p0, p1, p2, p3));
    }

    function log(uint p0, address p1, address p2, address p3) internal view {
        _sendLogPayload(abi.encodeWithSignature("log(uint,address,address,address)", p0, p1, p2, p3));
    }

    function log(string memory p0, uint p1, uint p2, uint p3) internal view {
        _sendLogPayload(abi.encodeWithSignature("log(string,uint,uint,uint)", p0, p1, p2, p3));
    }

    function log(string memory p0, uint p1, uint p2, string memory p3) internal view {
        _sendLogPayload(abi.encodeWithSignature("log(string,uint,uint,string)", p0, p1, p2, p3));
    }

    function log(string memory p0, uint p1, uint p2, bool p3) internal view {
        _sendLogPayload(abi.encodeWithSignature("log(string,uint,uint,bool)", p0, p1, p2, p3));
    }

    function log(string memory p0, uint p1, uint p2, address p3) internal view {
        _sendLogPayload(abi.encodeWithSignature("log(string,uint,uint,address)", p0, p1, p2, p3));
    }

    function log(string memory p0, uint p1, string memory p2, uint p3) internal view {
        _sendLogPayload(abi.encodeWithSignature("log(string,uint,string,uint)", p0, p1, p2, p3));
    }

    function log(string memory p0, uint p1, string memory p2, string memory p3) internal view {
        _sendLogPayload(abi.encodeWithSignature("log(string,uint,string,string)", p0, p1, p2, p3));
    }

    function log(string memory p0, uint p1, string memory p2, bool p3) internal view {
        _sendLogPayload(abi.encodeWithSignature("log(string,uint,string,bool)", p0, p1, p2, p3));
    }

    function log(string memory p0, uint p1, string memory p2, address p3) internal view {
        _sendLogPayload(abi.encodeWithSignature("log(string,uint,string,address)", p0, p1, p2, p3));
    }

    function log(string memory p0, uint p1, bool p2, uint p3) internal view {
        _sendLogPayload(abi.encodeWithSignature("log(string,uint,bool,uint)", p0, p1, p2, p3));
    }

    function log(string memory p0, uint p1, bool p2, string memory p3) internal view {
        _sendLogPayload(abi.encodeWithSignature("log(string,uint,bool,string)", p0, p1, p2, p3));
    }

    function log(string memory p0, uint p1, bool p2, bool p3) internal view {
        _sendLogPayload(abi.encodeWithSignature("log(string,uint,bool,bool)", p0, p1, p2, p3));
    }

    function log(string memory p0, uint p1, bool p2, address p3) internal view {
        _sendLogPayload(abi.encodeWithSignature("log(string,uint,bool,address)", p0, p1, p2, p3));
    }

    function log(string memory p0, uint p1, address p2, uint p3) internal view {
        _sendLogPayload(abi.encodeWithSignature("log(string,uint,address,uint)", p0, p1, p2, p3));
    }

    function log(string memory p0, uint p1, address p2, string memory p3) internal view {
        _sendLogPayload(abi.encodeWithSignature("log(string,uint,address,string)", p0, p1, p2, p3));
    }

    function log(string memory p0, uint p1, address p2, bool p3) internal view {
        _sendLogPayload(abi.encodeWithSignature("log(string,uint,address,bool)", p0, p1, p2, p3));
    }

    function log(string memory p0, uint p1, address p2, address p3) internal view {
        _sendLogPayload(abi.encodeWithSignature("log(string,uint,address,address)", p0, p1, p2, p3));
    }

    function log(string memory p0, string memory p1, uint p2, uint p3) internal view {
        _sendLogPayload(abi.encodeWithSignature("log(string,string,uint,uint)", p0, p1, p2, p3));
    }

    function log(string memory p0, string memory p1, uint p2, string memory p3) internal view {
        _sendLogPayload(abi.encodeWithSignature("log(string,string,uint,string)", p0, p1, p2, p3));
    }

    function log(string memory p0, string memory p1, uint p2, bool p3) internal view {
        _sendLogPayload(abi.encodeWithSignature("log(string,string,uint,bool)", p0, p1, p2, p3));
    }

    function log(string memory p0, string memory p1, uint p2, address p3) internal view {
        _sendLogPayload(abi.encodeWithSignature("log(string,string,uint,address)", p0, p1, p2, p3));
    }

    function log(string memory p0, string memory p1, string memory p2, uint p3) internal view {
        _sendLogPayload(abi.encodeWithSignature("log(string,string,string,uint)", p0, p1, p2, p3));
    }

    function log(string memory p0, string memory p1, string memory p2, string memory p3) internal view {
        _sendLogPayload(abi.encodeWithSignature("log(string,string,string,string)", p0, p1, p2, p3));
    }

    function log(string memory p0, string memory p1, string memory p2, bool p3) internal view {
        _sendLogPayload(abi.encodeWithSignature("log(string,string,string,bool)", p0, p1, p2, p3));
    }

    function log(string memory p0, string memory p1, string memory p2, address p3) internal view {
        _sendLogPayload(abi.encodeWithSignature("log(string,string,string,address)", p0, p1, p2, p3));
    }

    function log(string memory p0, string memory p1, bool p2, uint p3) internal view {
        _sendLogPayload(abi.encodeWithSignature("log(string,string,bool,uint)", p0, p1, p2, p3));
    }

    function log(string memory p0, string memory p1, bool p2, string memory p3) internal view {
        _sendLogPayload(abi.encodeWithSignature("log(string,string,bool,string)", p0, p1, p2, p3));
    }

    function log(string memory p0, string memory p1, bool p2, bool p3) internal view {
        _sendLogPayload(abi.encodeWithSignature("log(string,string,bool,bool)", p0, p1, p2, p3));
    }

    function log(string memory p0, string memory p1, bool p2, address p3) internal view {
        _sendLogPayload(abi.encodeWithSignature("log(string,string,bool,address)", p0, p1, p2, p3));
    }

    function log(string memory p0, string memory p1, address p2, uint p3) internal view {
        _sendLogPayload(abi.encodeWithSignature("log(string,string,address,uint)", p0, p1, p2, p3));
    }

    function log(string memory p0, string memory p1, address p2, string memory p3) internal view {
        _sendLogPayload(abi.encodeWithSignature("log(string,string,address,string)", p0, p1, p2, p3));
    }

    function log(string memory p0, string memory p1, address p2, bool p3) internal view {
        _sendLogPayload(abi.encodeWithSignature("log(string,string,address,bool)", p0, p1, p2, p3));
    }

    function log(string memory p0, string memory p1, address p2, address p3) internal view {
        _sendLogPayload(abi.encodeWithSignature("log(string,string,address,address)", p0, p1, p2, p3));
    }

    function log(string memory p0, bool p1, uint p2, uint p3) internal view {
        _sendLogPayload(abi.encodeWithSignature("log(string,bool,uint,uint)", p0, p1, p2, p3));
    }

    function log(string memory p0, bool p1, uint p2, string memory p3) internal view {
        _sendLogPayload(abi.encodeWithSignature("log(string,bool,uint,string)", p0, p1, p2, p3));
    }

    function log(string memory p0, bool p1, uint p2, bool p3) internal view {
        _sendLogPayload(abi.encodeWithSignature("log(string,bool,uint,bool)", p0, p1, p2, p3));
    }

    function log(string memory p0, bool p1, uint p2, address p3) internal view {
        _sendLogPayload(abi.encodeWithSignature("log(string,bool,uint,address)", p0, p1, p2, p3));
    }

    function log(string memory p0, bool p1, string memory p2, uint p3) internal view {
        _sendLogPayload(abi.encodeWithSignature("log(string,bool,string,uint)", p0, p1, p2, p3));
    }

    function log(string memory p0, bool p1, string memory p2, string memory p3) internal view {
        _sendLogPayload(abi.encodeWithSignature("log(string,bool,string,string)", p0, p1, p2, p3));
    }

    function log(string memory p0, bool p1, string memory p2, bool p3) internal view {
        _sendLogPayload(abi.encodeWithSignature("log(string,bool,string,bool)", p0, p1, p2, p3));
    }

    function log(string memory p0, bool p1, string memory p2, address p3) internal view {
        _sendLogPayload(abi.encodeWithSignature("log(string,bool,string,address)", p0, p1, p2, p3));
    }

    function log(string memory p0, bool p1, bool p2, uint p3) internal view {
        _sendLogPayload(abi.encodeWithSignature("log(string,bool,bool,uint)", p0, p1, p2, p3));
    }

    function log(string memory p0, bool p1, bool p2, string memory p3) internal view {
        _sendLogPayload(abi.encodeWithSignature("log(string,bool,bool,string)", p0, p1, p2, p3));
    }

    function log(string memory p0, bool p1, bool p2, bool p3) internal view {
        _sendLogPayload(abi.encodeWithSignature("log(string,bool,bool,bool)", p0, p1, p2, p3));
    }

    function log(string memory p0, bool p1, bool p2, address p3) internal view {
        _sendLogPayload(abi.encodeWithSignature("log(string,bool,bool,address)", p0, p1, p2, p3));
    }

    function log(string memory p0, bool p1, address p2, uint p3) internal view {
        _sendLogPayload(abi.encodeWithSignature("log(string,bool,address,uint)", p0, p1, p2, p3));
    }

    function log(string memory p0, bool p1, address p2, string memory p3) internal view {
        _sendLogPayload(abi.encodeWithSignature("log(string,bool,address,string)", p0, p1, p2, p3));
    }

    function log(string memory p0, bool p1, address p2, bool p3) internal view {
        _sendLogPayload(abi.encodeWithSignature("log(string,bool,address,bool)", p0, p1, p2, p3));
    }

    function log(string memory p0, bool p1, address p2, address p3) internal view {
        _sendLogPayload(abi.encodeWithSignature("log(string,bool,address,address)", p0, p1, p2, p3));
    }

    function log(string memory p0, address p1, uint p2, uint p3) internal view {
        _sendLogPayload(abi.encodeWithSignature("log(string,address,uint,uint)", p0, p1, p2, p3));
    }

    function log(string memory p0, address p1, uint p2, string memory p3) internal view {
        _sendLogPayload(abi.encodeWithSignature("log(string,address,uint,string)", p0, p1, p2, p3));
    }

    function log(string memory p0, address p1, uint p2, bool p3) internal view {
        _sendLogPayload(abi.encodeWithSignature("log(string,address,uint,bool)", p0, p1, p2, p3));
    }

    function log(string memory p0, address p1, uint p2, address p3) internal view {
        _sendLogPayload(abi.encodeWithSignature("log(string,address,uint,address)", p0, p1, p2, p3));
    }

    function log(string memory p0, address p1, string memory p2, uint p3) internal view {
        _sendLogPayload(abi.encodeWithSignature("log(string,address,string,uint)", p0, p1, p2, p3));
    }

    function log(string memory p0, address p1, string memory p2, string memory p3) internal view {
        _sendLogPayload(abi.encodeWithSignature("log(string,address,string,string)", p0, p1, p2, p3));
    }

    function log(string memory p0, address p1, string memory p2, bool p3) internal view {
        _sendLogPayload(abi.encodeWithSignature("log(string,address,string,bool)", p0, p1, p2, p3));
    }

    function log(string memory p0, address p1, string memory p2, address p3) internal view {
        _sendLogPayload(abi.encodeWithSignature("log(string,address,string,address)", p0, p1, p2, p3));
    }

    function log(string memory p0, address p1, bool p2, uint p3) internal view {
        _sendLogPayload(abi.encodeWithSignature("log(string,address,bool,uint)", p0, p1, p2, p3));
    }

    function log(string memory p0, address p1, bool p2, string memory p3) internal view {
        _sendLogPayload(abi.encodeWithSignature("log(string,address,bool,string)", p0, p1, p2, p3));
    }

    function log(string memory p0, address p1, bool p2, bool p3) internal view {
        _sendLogPayload(abi.encodeWithSignature("log(string,address,bool,bool)", p0, p1, p2, p3));
    }

    function log(string memory p0, address p1, bool p2, address p3) internal view {
        _sendLogPayload(abi.encodeWithSignature("log(string,address,bool,address)", p0, p1, p2, p3));
    }

    function log(string memory p0, address p1, address p2, uint p3) internal view {
        _sendLogPayload(abi.encodeWithSignature("log(string,address,address,uint)", p0, p1, p2, p3));
    }

    function log(string memory p0, address p1, address p2, string memory p3) internal view {
        _sendLogPayload(abi.encodeWithSignature("log(string,address,address,string)", p0, p1, p2, p3));
    }

    function log(string memory p0, address p1, address p2, bool p3) internal view {
        _sendLogPayload(abi.encodeWithSignature("log(string,address,address,bool)", p0, p1, p2, p3));
    }

    function log(string memory p0, address p1, address p2, address p3) internal view {
        _sendLogPayload(abi.encodeWithSignature("log(string,address,address,address)", p0, p1, p2, p3));
    }

    function log(bool p0, uint p1, uint p2, uint p3) internal view {
        _sendLogPayload(abi.encodeWithSignature("log(bool,uint,uint,uint)", p0, p1, p2, p3));
    }

    function log(bool p0, uint p1, uint p2, string memory p3) internal view {
        _sendLogPayload(abi.encodeWithSignature("log(bool,uint,uint,string)", p0, p1, p2, p3));
    }

    function log(bool p0, uint p1, uint p2, bool p3) internal view {
        _sendLogPayload(abi.encodeWithSignature("log(bool,uint,uint,bool)", p0, p1, p2, p3));
    }

    function log(bool p0, uint p1, uint p2, address p3) internal view {
        _sendLogPayload(abi.encodeWithSignature("log(bool,uint,uint,address)", p0, p1, p2, p3));
    }

    function log(bool p0, uint p1, string memory p2, uint p3) internal view {
        _sendLogPayload(abi.encodeWithSignature("log(bool,uint,string,uint)", p0, p1, p2, p3));
    }

    function log(bool p0, uint p1, string memory p2, string memory p3) internal view {
        _sendLogPayload(abi.encodeWithSignature("log(bool,uint,string,string)", p0, p1, p2, p3));
    }

    function log(bool p0, uint p1, string memory p2, bool p3) internal view {
        _sendLogPayload(abi.encodeWithSignature("log(bool,uint,string,bool)", p0, p1, p2, p3));
    }

    function log(bool p0, uint p1, string memory p2, address p3) internal view {
        _sendLogPayload(abi.encodeWithSignature("log(bool,uint,string,address)", p0, p1, p2, p3));
    }

    function log(bool p0, uint p1, bool p2, uint p3) internal view {
        _sendLogPayload(abi.encodeWithSignature("log(bool,uint,bool,uint)", p0, p1, p2, p3));
    }

    function log(bool p0, uint p1, bool p2, string memory p3) internal view {
        _sendLogPayload(abi.encodeWithSignature("log(bool,uint,bool,string)", p0, p1, p2, p3));
    }

    function log(bool p0, uint p1, bool p2, bool p3) internal view {
        _sendLogPayload(abi.encodeWithSignature("log(bool,uint,bool,bool)", p0, p1, p2, p3));
    }

    function log(bool p0, uint p1, bool p2, address p3) internal view {
        _sendLogPayload(abi.encodeWithSignature("log(bool,uint,bool,address)", p0, p1, p2, p3));
    }

    function log(bool p0, uint p1, address p2, uint p3) internal view {
        _sendLogPayload(abi.encodeWithSignature("log(bool,uint,address,uint)", p0, p1, p2, p3));
    }

    function log(bool p0, uint p1, address p2, string memory p3) internal view {
        _sendLogPayload(abi.encodeWithSignature("log(bool,uint,address,string)", p0, p1, p2, p3));
    }

    function log(bool p0, uint p1, address p2, bool p3) internal view {
        _sendLogPayload(abi.encodeWithSignature("log(bool,uint,address,bool)", p0, p1, p2, p3));
    }

    function log(bool p0, uint p1, address p2, address p3) internal view {
        _sendLogPayload(abi.encodeWithSignature("log(bool,uint,address,address)", p0, p1, p2, p3));
    }

    function log(bool p0, string memory p1, uint p2, uint p3) internal view {
        _sendLogPayload(abi.encodeWithSignature("log(bool,string,uint,uint)", p0, p1, p2, p3));
    }

    function log(bool p0, string memory p1, uint p2, string memory p3) internal view {
        _sendLogPayload(abi.encodeWithSignature("log(bool,string,uint,string)", p0, p1, p2, p3));
    }

    function log(bool p0, string memory p1, uint p2, bool p3) internal view {
        _sendLogPayload(abi.encodeWithSignature("log(bool,string,uint,bool)", p0, p1, p2, p3));
    }

    function log(bool p0, string memory p1, uint p2, address p3) internal view {
        _sendLogPayload(abi.encodeWithSignature("log(bool,string,uint,address)", p0, p1, p2, p3));
    }

    function log(bool p0, string memory p1, string memory p2, uint p3) internal view {
        _sendLogPayload(abi.encodeWithSignature("log(bool,string,string,uint)", p0, p1, p2, p3));
    }

    function log(bool p0, string memory p1, string memory p2, string memory p3) internal view {
        _sendLogPayload(abi.encodeWithSignature("log(bool,string,string,string)", p0, p1, p2, p3));
    }

    function log(bool p0, string memory p1, string memory p2, bool p3) internal view {
        _sendLogPayload(abi.encodeWithSignature("log(bool,string,string,bool)", p0, p1, p2, p3));
    }

    function log(bool p0, string memory p1, string memory p2, address p3) internal view {
        _sendLogPayload(abi.encodeWithSignature("log(bool,string,string,address)", p0, p1, p2, p3));
    }

    function log(bool p0, string memory p1, bool p2, uint p3) internal view {
        _sendLogPayload(abi.encodeWithSignature("log(bool,string,bool,uint)", p0, p1, p2, p3));
    }

    function log(bool p0, string memory p1, bool p2, string memory p3) internal view {
        _sendLogPayload(abi.encodeWithSignature("log(bool,string,bool,string)", p0, p1, p2, p3));
    }

    function log(bool p0, string memory p1, bool p2, bool p3) internal view {
        _sendLogPayload(abi.encodeWithSignature("log(bool,string,bool,bool)", p0, p1, p2, p3));
    }

    function log(bool p0, string memory p1, bool p2, address p3) internal view {
        _sendLogPayload(abi.encodeWithSignature("log(bool,string,bool,address)", p0, p1, p2, p3));
    }

    function log(bool p0, string memory p1, address p2, uint p3) internal view {
        _sendLogPayload(abi.encodeWithSignature("log(bool,string,address,uint)", p0, p1, p2, p3));
    }

    function log(bool p0, string memory p1, address p2, string memory p3) internal view {
        _sendLogPayload(abi.encodeWithSignature("log(bool,string,address,string)", p0, p1, p2, p3));
    }

    function log(bool p0, string memory p1, address p2, bool p3) internal view {
        _sendLogPayload(abi.encodeWithSignature("log(bool,string,address,bool)", p0, p1, p2, p3));
    }

    function log(bool p0, string memory p1, address p2, address p3) internal view {
        _sendLogPayload(abi.encodeWithSignature("log(bool,string,address,address)", p0, p1, p2, p3));
    }

    function log(bool p0, bool p1, uint p2, uint p3) internal view {
        _sendLogPayload(abi.encodeWithSignature("log(bool,bool,uint,uint)", p0, p1, p2, p3));
    }

    function log(bool p0, bool p1, uint p2, string memory p3) internal view {
        _sendLogPayload(abi.encodeWithSignature("log(bool,bool,uint,string)", p0, p1, p2, p3));
    }

    function log(bool p0, bool p1, uint p2, bool p3) internal view {
        _sendLogPayload(abi.encodeWithSignature("log(bool,bool,uint,bool)", p0, p1, p2, p3));
    }

    function log(bool p0, bool p1, uint p2, address p3) internal view {
        _sendLogPayload(abi.encodeWithSignature("log(bool,bool,uint,address)", p0, p1, p2, p3));
    }

    function log(bool p0, bool p1, string memory p2, uint p3) internal view {
        _sendLogPayload(abi.encodeWithSignature("log(bool,bool,string,uint)", p0, p1, p2, p3));
    }

    function log(bool p0, bool p1, string memory p2, string memory p3) internal view {
        _sendLogPayload(abi.encodeWithSignature("log(bool,bool,string,string)", p0, p1, p2, p3));
    }

    function log(bool p0, bool p1, string memory p2, bool p3) internal view {
        _sendLogPayload(abi.encodeWithSignature("log(bool,bool,string,bool)", p0, p1, p2, p3));
    }

    function log(bool p0, bool p1, string memory p2, address p3) internal view {
        _sendLogPayload(abi.encodeWithSignature("log(bool,bool,string,address)", p0, p1, p2, p3));
    }

    function log(bool p0, bool p1, bool p2, uint p3) internal view {
        _sendLogPayload(abi.encodeWithSignature("log(bool,bool,bool,uint)", p0, p1, p2, p3));
    }

    function log(bool p0, bool p1, bool p2, string memory p3) internal view {
        _sendLogPayload(abi.encodeWithSignature("log(bool,bool,bool,string)", p0, p1, p2, p3));
    }

    function log(bool p0, bool p1, bool p2, bool p3) internal view {
        _sendLogPayload(abi.encodeWithSignature("log(bool,bool,bool,bool)", p0, p1, p2, p3));
    }

    function log(bool p0, bool p1, bool p2, address p3) internal view {
        _sendLogPayload(abi.encodeWithSignature("log(bool,bool,bool,address)", p0, p1, p2, p3));
    }

    function log(bool p0, bool p1, address p2, uint p3) internal view {
        _sendLogPayload(abi.encodeWithSignature("log(bool,bool,address,uint)", p0, p1, p2, p3));
    }

    function log(bool p0, bool p1, address p2, string memory p3) internal view {
        _sendLogPayload(abi.encodeWithSignature("log(bool,bool,address,string)", p0, p1, p2, p3));
    }

    function log(bool p0, bool p1, address p2, bool p3) internal view {
        _sendLogPayload(abi.encodeWithSignature("log(bool,bool,address,bool)", p0, p1, p2, p3));
    }

    function log(bool p0, bool p1, address p2, address p3) internal view {
        _sendLogPayload(abi.encodeWithSignature("log(bool,bool,address,address)", p0, p1, p2, p3));
    }

    function log(bool p0, address p1, uint p2, uint p3) internal view {
        _sendLogPayload(abi.encodeWithSignature("log(bool,address,uint,uint)", p0, p1, p2, p3));
    }

    function log(bool p0, address p1, uint p2, string memory p3) internal view {
        _sendLogPayload(abi.encodeWithSignature("log(bool,address,uint,string)", p0, p1, p2, p3));
    }

    function log(bool p0, address p1, uint p2, bool p3) internal view {
        _sendLogPayload(abi.encodeWithSignature("log(bool,address,uint,bool)", p0, p1, p2, p3));
    }

    function log(bool p0, address p1, uint p2, address p3) internal view {
        _sendLogPayload(abi.encodeWithSignature("log(bool,address,uint,address)", p0, p1, p2, p3));
    }

    function log(bool p0, address p1, string memory p2, uint p3) internal view {
        _sendLogPayload(abi.encodeWithSignature("log(bool,address,string,uint)", p0, p1, p2, p3));
    }

    function log(bool p0, address p1, string memory p2, string memory p3) internal view {
        _sendLogPayload(abi.encodeWithSignature("log(bool,address,string,string)", p0, p1, p2, p3));
    }

    function log(bool p0, address p1, string memory p2, bool p3) internal view {
        _sendLogPayload(abi.encodeWithSignature("log(bool,address,string,bool)", p0, p1, p2, p3));
    }

    function log(bool p0, address p1, string memory p2, address p3) internal view {
        _sendLogPayload(abi.encodeWithSignature("log(bool,address,string,address)", p0, p1, p2, p3));
    }

    function log(bool p0, address p1, bool p2, uint p3) internal view {
        _sendLogPayload(abi.encodeWithSignature("log(bool,address,bool,uint)", p0, p1, p2, p3));
    }

    function log(bool p0, address p1, bool p2, string memory p3) internal view {
        _sendLogPayload(abi.encodeWithSignature("log(bool,address,bool,string)", p0, p1, p2, p3));
    }

    function log(bool p0, address p1, bool p2, bool p3) internal view {
        _sendLogPayload(abi.encodeWithSignature("log(bool,address,bool,bool)", p0, p1, p2, p3));
    }

    function log(bool p0, address p1, bool p2, address p3) internal view {
        _sendLogPayload(abi.encodeWithSignature("log(bool,address,bool,address)", p0, p1, p2, p3));
    }

    function log(bool p0, address p1, address p2, uint p3) internal view {
        _sendLogPayload(abi.encodeWithSignature("log(bool,address,address,uint)", p0, p1, p2, p3));
    }

    function log(bool p0, address p1, address p2, string memory p3) internal view {
        _sendLogPayload(abi.encodeWithSignature("log(bool,address,address,string)", p0, p1, p2, p3));
    }

    function log(bool p0, address p1, address p2, bool p3) internal view {
        _sendLogPayload(abi.encodeWithSignature("log(bool,address,address,bool)", p0, p1, p2, p3));
    }

    function log(bool p0, address p1, address p2, address p3) internal view {
        _sendLogPayload(abi.encodeWithSignature("log(bool,address,address,address)", p0, p1, p2, p3));
    }

    function log(address p0, uint p1, uint p2, uint p3) internal view {
        _sendLogPayload(abi.encodeWithSignature("log(address,uint,uint,uint)", p0, p1, p2, p3));
    }

    function log(address p0, uint p1, uint p2, string memory p3) internal view {
        _sendLogPayload(abi.encodeWithSignature("log(address,uint,uint,string)", p0, p1, p2, p3));
    }

    function log(address p0, uint p1, uint p2, bool p3) internal view {
        _sendLogPayload(abi.encodeWithSignature("log(address,uint,uint,bool)", p0, p1, p2, p3));
    }

    function log(address p0, uint p1, uint p2, address p3) internal view {
        _sendLogPayload(abi.encodeWithSignature("log(address,uint,uint,address)", p0, p1, p2, p3));
    }

    function log(address p0, uint p1, string memory p2, uint p3) internal view {
        _sendLogPayload(abi.encodeWithSignature("log(address,uint,string,uint)", p0, p1, p2, p3));
    }

    function log(address p0, uint p1, string memory p2, string memory p3) internal view {
        _sendLogPayload(abi.encodeWithSignature("log(address,uint,string,string)", p0, p1, p2, p3));
    }

    function log(address p0, uint p1, string memory p2, bool p3) internal view {
        _sendLogPayload(abi.encodeWithSignature("log(address,uint,string,bool)", p0, p1, p2, p3));
    }

    function log(address p0, uint p1, string memory p2, address p3) internal view {
        _sendLogPayload(abi.encodeWithSignature("log(address,uint,string,address)", p0, p1, p2, p3));
    }

    function log(address p0, uint p1, bool p2, uint p3) internal view {
        _sendLogPayload(abi.encodeWithSignature("log(address,uint,bool,uint)", p0, p1, p2, p3));
    }

    function log(address p0, uint p1, bool p2, string memory p3) internal view {
        _sendLogPayload(abi.encodeWithSignature("log(address,uint,bool,string)", p0, p1, p2, p3));
    }

    function log(address p0, uint p1, bool p2, bool p3) internal view {
        _sendLogPayload(abi.encodeWithSignature("log(address,uint,bool,bool)", p0, p1, p2, p3));
    }

    function log(address p0, uint p1, bool p2, address p3) internal view {
        _sendLogPayload(abi.encodeWithSignature("log(address,uint,bool,address)", p0, p1, p2, p3));
    }

    function log(address p0, uint p1, address p2, uint p3) internal view {
        _sendLogPayload(abi.encodeWithSignature("log(address,uint,address,uint)", p0, p1, p2, p3));
    }

    function log(address p0, uint p1, address p2, string memory p3) internal view {
        _sendLogPayload(abi.encodeWithSignature("log(address,uint,address,string)", p0, p1, p2, p3));
    }

    function log(address p0, uint p1, address p2, bool p3) internal view {
        _sendLogPayload(abi.encodeWithSignature("log(address,uint,address,bool)", p0, p1, p2, p3));
    }

    function log(address p0, uint p1, address p2, address p3) internal view {
        _sendLogPayload(abi.encodeWithSignature("log(address,uint,address,address)", p0, p1, p2, p3));
    }

    function log(address p0, string memory p1, uint p2, uint p3) internal view {
        _sendLogPayload(abi.encodeWithSignature("log(address,string,uint,uint)", p0, p1, p2, p3));
    }

    function log(address p0, string memory p1, uint p2, string memory p3) internal view {
        _sendLogPayload(abi.encodeWithSignature("log(address,string,uint,string)", p0, p1, p2, p3));
    }

    function log(address p0, string memory p1, uint p2, bool p3) internal view {
        _sendLogPayload(abi.encodeWithSignature("log(address,string,uint,bool)", p0, p1, p2, p3));
    }

    function log(address p0, string memory p1, uint p2, address p3) internal view {
        _sendLogPayload(abi.encodeWithSignature("log(address,string,uint,address)", p0, p1, p2, p3));
    }

    function log(address p0, string memory p1, string memory p2, uint p3) internal view {
        _sendLogPayload(abi.encodeWithSignature("log(address,string,string,uint)", p0, p1, p2, p3));
    }

    function log(address p0, string memory p1, string memory p2, string memory p3) internal view {
        _sendLogPayload(abi.encodeWithSignature("log(address,string,string,string)", p0, p1, p2, p3));
    }

    function log(address p0, string memory p1, string memory p2, bool p3) internal view {
        _sendLogPayload(abi.encodeWithSignature("log(address,string,string,bool)", p0, p1, p2, p3));
    }

    function log(address p0, string memory p1, string memory p2, address p3) internal view {
        _sendLogPayload(abi.encodeWithSignature("log(address,string,string,address)", p0, p1, p2, p3));
    }

    function log(address p0, string memory p1, bool p2, uint p3) internal view {
        _sendLogPayload(abi.encodeWithSignature("log(address,string,bool,uint)", p0, p1, p2, p3));
    }

    function log(address p0, string memory p1, bool p2, string memory p3) internal view {
        _sendLogPayload(abi.encodeWithSignature("log(address,string,bool,string)", p0, p1, p2, p3));
    }

    function log(address p0, string memory p1, bool p2, bool p3) internal view {
        _sendLogPayload(abi.encodeWithSignature("log(address,string,bool,bool)", p0, p1, p2, p3));
    }

    function log(address p0, string memory p1, bool p2, address p3) internal view {
        _sendLogPayload(abi.encodeWithSignature("log(address,string,bool,address)", p0, p1, p2, p3));
    }

    function log(address p0, string memory p1, address p2, uint p3) internal view {
        _sendLogPayload(abi.encodeWithSignature("log(address,string,address,uint)", p0, p1, p2, p3));
    }

    function log(address p0, string memory p1, address p2, string memory p3) internal view {
        _sendLogPayload(abi.encodeWithSignature("log(address,string,address,string)", p0, p1, p2, p3));
    }

    function log(address p0, string memory p1, address p2, bool p3) internal view {
        _sendLogPayload(abi.encodeWithSignature("log(address,string,address,bool)", p0, p1, p2, p3));
    }

    function log(address p0, string memory p1, address p2, address p3) internal view {
        _sendLogPayload(abi.encodeWithSignature("log(address,string,address,address)", p0, p1, p2, p3));
    }

    function log(address p0, bool p1, uint p2, uint p3) internal view {
        _sendLogPayload(abi.encodeWithSignature("log(address,bool,uint,uint)", p0, p1, p2, p3));
    }

    function log(address p0, bool p1, uint p2, string memory p3) internal view {
        _sendLogPayload(abi.encodeWithSignature("log(address,bool,uint,string)", p0, p1, p2, p3));
    }

    function log(address p0, bool p1, uint p2, bool p3) internal view {
        _sendLogPayload(abi.encodeWithSignature("log(address,bool,uint,bool)", p0, p1, p2, p3));
    }

    function log(address p0, bool p1, uint p2, address p3) internal view {
        _sendLogPayload(abi.encodeWithSignature("log(address,bool,uint,address)", p0, p1, p2, p3));
    }

    function log(address p0, bool p1, string memory p2, uint p3) internal view {
        _sendLogPayload(abi.encodeWithSignature("log(address,bool,string,uint)", p0, p1, p2, p3));
    }

    function log(address p0, bool p1, string memory p2, string memory p3) internal view {
        _sendLogPayload(abi.encodeWithSignature("log(address,bool,string,string)", p0, p1, p2, p3));
    }

    function log(address p0, bool p1, string memory p2, bool p3) internal view {
        _sendLogPayload(abi.encodeWithSignature("log(address,bool,string,bool)", p0, p1, p2, p3));
    }

    function log(address p0, bool p1, string memory p2, address p3) internal view {
        _sendLogPayload(abi.encodeWithSignature("log(address,bool,string,address)", p0, p1, p2, p3));
    }

    function log(address p0, bool p1, bool p2, uint p3) internal view {
        _sendLogPayload(abi.encodeWithSignature("log(address,bool,bool,uint)", p0, p1, p2, p3));
    }

    function log(address p0, bool p1, bool p2, string memory p3) internal view {
        _sendLogPayload(abi.encodeWithSignature("log(address,bool,bool,string)", p0, p1, p2, p3));
    }

    function log(address p0, bool p1, bool p2, bool p3) internal view {
        _sendLogPayload(abi.encodeWithSignature("log(address,bool,bool,bool)", p0, p1, p2, p3));
    }

    function log(address p0, bool p1, bool p2, address p3) internal view {
        _sendLogPayload(abi.encodeWithSignature("log(address,bool,bool,address)", p0, p1, p2, p3));
    }

    function log(address p0, bool p1, address p2, uint p3) internal view {
        _sendLogPayload(abi.encodeWithSignature("log(address,bool,address,uint)", p0, p1, p2, p3));
    }

    function log(address p0, bool p1, address p2, string memory p3) internal view {
        _sendLogPayload(abi.encodeWithSignature("log(address,bool,address,string)", p0, p1, p2, p3));
    }

    function log(address p0, bool p1, address p2, bool p3) internal view {
        _sendLogPayload(abi.encodeWithSignature("log(address,bool,address,bool)", p0, p1, p2, p3));
    }

    function log(address p0, bool p1, address p2, address p3) internal view {
        _sendLogPayload(abi.encodeWithSignature("log(address,bool,address,address)", p0, p1, p2, p3));
    }

    function log(address p0, address p1, uint p2, uint p3) internal view {
        _sendLogPayload(abi.encodeWithSignature("log(address,address,uint,uint)", p0, p1, p2, p3));
    }

    function log(address p0, address p1, uint p2, string memory p3) internal view {
        _sendLogPayload(abi.encodeWithSignature("log(address,address,uint,string)", p0, p1, p2, p3));
    }

    function log(address p0, address p1, uint p2, bool p3) internal view {
        _sendLogPayload(abi.encodeWithSignature("log(address,address,uint,bool)", p0, p1, p2, p3));
    }

    function log(address p0, address p1, uint p2, address p3) internal view {
        _sendLogPayload(abi.encodeWithSignature("log(address,address,uint,address)", p0, p1, p2, p3));
    }

    function log(address p0, address p1, string memory p2, uint p3) internal view {
        _sendLogPayload(abi.encodeWithSignature("log(address,address,string,uint)", p0, p1, p2, p3));
    }

    function log(address p0, address p1, string memory p2, string memory p3) internal view {
        _sendLogPayload(abi.encodeWithSignature("log(address,address,string,string)", p0, p1, p2, p3));
    }

    function log(address p0, address p1, string memory p2, bool p3) internal view {
        _sendLogPayload(abi.encodeWithSignature("log(address,address,string,bool)", p0, p1, p2, p3));
    }

    function log(address p0, address p1, string memory p2, address p3) internal view {
        _sendLogPayload(abi.encodeWithSignature("log(address,address,string,address)", p0, p1, p2, p3));
    }

    function log(address p0, address p1, bool p2, uint p3) internal view {
        _sendLogPayload(abi.encodeWithSignature("log(address,address,bool,uint)", p0, p1, p2, p3));
    }

    function log(address p0, address p1, bool p2, string memory p3) internal view {
        _sendLogPayload(abi.encodeWithSignature("log(address,address,bool,string)", p0, p1, p2, p3));
    }

    function log(address p0, address p1, bool p2, bool p3) internal view {
        _sendLogPayload(abi.encodeWithSignature("log(address,address,bool,bool)", p0, p1, p2, p3));
    }

    function log(address p0, address p1, bool p2, address p3) internal view {
        _sendLogPayload(abi.encodeWithSignature("log(address,address,bool,address)", p0, p1, p2, p3));
    }

    function log(address p0, address p1, address p2, uint p3) internal view {
        _sendLogPayload(abi.encodeWithSignature("log(address,address,address,uint)", p0, p1, p2, p3));
    }

    function log(address p0, address p1, address p2, string memory p3) internal view {
        _sendLogPayload(abi.encodeWithSignature("log(address,address,address,string)", p0, p1, p2, p3));
    }

    function log(address p0, address p1, address p2, bool p3) internal view {
        _sendLogPayload(abi.encodeWithSignature("log(address,address,address,bool)", p0, p1, p2, p3));
    }

    function log(address p0, address p1, address p2, address p3) internal view {
        _sendLogPayload(abi.encodeWithSignature("log(address,address,address,address)", p0, p1, p2, p3));
    }

}

Settings
{

  "remappings": [

    "@openzeppelin/contracts/=lib/openzeppelin-contracts/contracts/",

    "ds-test/=lib/openzeppelin-contracts/lib/forge-std/lib/ds-test/src/",

    "erc4626-tests/=lib/openzeppelin-contracts/lib/erc4626-tests/",

    "forge-std/=lib/forge-std/src/",

    "openzeppelin-contracts/=lib/openzeppelin-contracts/",

    "v3-core/=lib/v3-core/"

  ],

  "optimizer": {

    "enabled": true,

    "runs": 200

  },

  "metadata": {

    "useLiteralContent": false,

    "bytecodeHash": "ipfs",

    "appendCBOR": true

  },

  "outputSelection": {

    "*": {

      "*": [

        "evm.bytecode",

        "evm.deployedBytecode",

        "devdoc",

        "userdoc",

        "metadata",

        "abi"

      ]

    }

  },

  "evmVersion": "london",

  "viaIR": true,

  "libraries": {}

}

Contract Security Audit

[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[],"name":"ReentrancyGuardReentrantCall","type":"error"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"spender","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"components":[{"internalType":"uint256","name":"seed","type":"uint256"},{"internalType":"uint256","name":"extra","type":"uint256"}],"indexed":false,"internalType":"struct SeedData","name":"seed_data","type":"tuple"}],"name":"OnMushroomTransfer","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"holder","type":"address"},{"components":[{"internalType":"uint256","name":"seed","type":"uint256"},{"internalType":"uint256","name":"extra","type":"uint256"}],"indexed":false,"internalType":"struct SeedData","name":"seed_data","type":"tuple"}],"name":"OnSporesGrow","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"holder","type":"address"},{"components":[{"internalType":"uint256","name":"seed","type":"uint256"},{"internalType":"uint256","name":"extra","type":"uint256"}],"indexed":false,"internalType":"struct SeedData","name":"seed_data","type":"tuple"}],"name":"OnSporesShrink","type":"event"},{"anonymous":false,"inputs":[],"name":"RenounceOwnership","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[{"components":[{"internalType":"string[]","name":"hilt","type":"string[]"},{"internalType":"string[]","name":"beam","type":"string[]"},{"components":[{"internalType":"string[]","name":"defs","type":"string[]"},{"internalType":"string[]","name":"outline","type":"string[]"},{"internalType":"string[]","name":"radial","type":"string[]"}],"internalType":"struct glowParts","name":"beam_glow","type":"tuple"}],"internalType":"struct SaberShape","name":"shape","type":"tuple"},{"internalType":"uint8","name":"lvl","type":"uint8"}],"name":"addSaberShape","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"spender","type":"address"}],"name":"allowance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"approve","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"burnCount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"decimals","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"subtractedValue","type":"uint256"}],"name":"decreaseAllowance","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"dynamicInscription","outputs":[{"components":[{"internalType":"uint256","name":"seed","type":"uint256"},{"internalType":"uint256","name":"extra","type":"uint256"}],"internalType":"struct SeedData","name":"data","type":"tuple"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"dynamicInscriptionTotalCount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"index","type":"uint256"}],"name":"getHolderByIndex","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"getHolderIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"startIndex","type":"uint256"},{"internalType":"uint256","name":"count","type":"uint256"}],"name":"getHoldersList","outputs":[{"internalType":"address[]","name":"","type":"address[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"components":[{"internalType":"uint256","name":"seed","type":"uint256"},{"internalType":"uint256","name":"extra","type":"uint256"}],"internalType":"struct SeedData","name":"seed_data","type":"tuple"}],"name":"getMeta","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"components":[{"internalType":"uint256","name":"seed","type":"uint256"},{"internalType":"uint256","name":"extra","type":"uint256"}],"internalType":"struct SeedData","name":"seed_data","type":"tuple"}],"name":"getSvg","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"holdersCount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"addedValue","type":"uint256"}],"name":"increaseAllowance","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"inscriptionCount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"uint256","name":"index","type":"uint256"}],"name":"inscriptionOfOwnerByIndex","outputs":[{"components":[{"internalType":"uint256","name":"seed","type":"uint256"},{"internalType":"uint256","name":"extra","type":"uint256"}],"internalType":"struct SeedData","name":"data","type":"tuple"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"inscriptionsTotalCount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"uint256","name":"seed","type":"uint256"}],"name":"isOwnerOf","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"poolAddress","type":"address"}],"name":"launch","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"maxBuy","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"ownerRenounce","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"pool","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"string","name":"_stars","type":"string"}],"name":"setStars","outputs":[],"stateMutability":"nonpayable","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":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"}]

604060a0815234620021105762000015620021b7565b600490818152602090634a65646960e01b8282015262000034620021b7565b838152634a45444960e01b8382015281516001600160401b0391828211620020fb5760039162000065835462002115565b94601f95868111620020c9575b5086908683116001146200205e57620000a592916000918362001c2d575b50508160011b916000199060031b1c19161790565b82555b80519083821162001f7d57620000bf875462002115565b85811162002021575b50859085831160011462001fb657620000fa92916000918362001c2d5750508160011b916000199060031b1c19161790565b85555b336080523360018060a01b031960135416176013556200011f60165462002115565b83811162001f92575b5060086311b3333360e11b01601655855160a081018381118282101762001f7d57875262000155620021b7565b90600791828152660466272606a62760cb1b87820152815262000177620021b7565b828152662330373037314360c81b878201528682015262000197620021b7565b828152662331303234323160c81b8782015288820152620001b7620021b7565b8281526611981a9898982160c91b878201526060820152620001d8620021b7565b828152660233030303030360cc1b87820152608082015260175460056017558060051062001f00575b50601760005285600020906000905b6005821062001e0957505050865190610a0082018281108582111762001df45788526200023c620021b7565b62000246620021b7565b828152662366396532646360c81b88820152815262000264620021b7565b8281526608d99998584e4d60ca1b8882015287820152825262000286620021b7565b62000290620021b7565b828152662366376461386160c81b888201528152620002ae620021b7565b828152662366666363343160c81b888201528782015286830152620002d2620021b7565b620002dc620021b7565b82815266046c8c4c862c4760cb1b888201528152620002fa620021b7565b828152662366666464383960c81b8882015287820152888301526200031e620021b7565b62000328620021b7565b8281526611b1321cb2999960c91b88820152815262000346620021b7565b828152660236666633630360cc1b888201528782015260608301526200036b620021b7565b62000375620021b7565b828152662364616432633760c81b88820152815262000393620021b7565b828152662366666435396360c81b88820152878201526080830152620003b8620021b7565b620003c2620021b7565b82815266119bb2b1309b9960c91b888201528152620003e0620021b7565b82815266119b31b3331a3360c91b888201528782015260a083015262000405620021b7565b6200040f620021b7565b90828252662330373037303760c81b918289820152815262000430620021b7565b90838252662335333361336160c81b91828a8201528982015260c085015262000458620021b7565b62000462620021b7565b848152662337393831386360c81b8a820152815262000480620021b7565b848152660466ec2c262c8760cb1b8a8201528982015260e0850152620004a5620021b7565b620004af620021b7565b8481526611991a99b19a1960c91b8a8201528152620004cd620021b7565b848152662332353738386560c81b8a82015289820152610100850152620004f3620021b7565b620004fd620021b7565b848152662337393336393560c81b8a82015281526200051b620021b7565b848152662361333065653160c81b8a8201528982015261012085015262000541620021b7565b6200054b620021b7565b8481526608d94c5899984d60ca1b8a820152815262000569620021b7565b8481526608d99998590d9960ca1b8a820152898201526101408501526200058f620021b7565b62000599620021b7565b848152660236164373362360cc1b8a8201528152620005b7620021b7565b848152662366343539666360c81b8a82015289820152610160850152620005dd620021b7565b620005e7620021b7565b848152662361376133376560c81b8a820152815262000605620021b7565b848152662366336536366560c81b8a820152898201526101808501526200062b620021b7565b62000635620021b7565b848152662331313734623760c81b8a820152815262000653620021b7565b848152661198181c9c333360c91b8a820152898201526101a085015262000679620021b7565b62000683620021b7565b848152662334373533363360c81b8a8201528152620006a1620021b7565b84815266119a1c9b9ab0b360c91b8a820152898201526101c0850152620006c7620021b7565b620006d1620021b7565b848152662333653839346160c81b8a8201528152620006ef620021b7565b8481526608cc8c190d4cd960ca1b8a820152898201526101e085015262000715620021b7565b6200071f620021b7565b848152662365646539656160c81b8a82015281526200073d620021b7565b8481526611b33330b2b19960c91b8a8201528982015261020085015262000763620021b7565b6200076d620021b7565b8481526608cd198c598c5960ca1b8a82015281526200078b620021b7565b848152662339623130306160c81b8a82015289820152610220850152620007b1620021b7565b620007bb620021b7565b848152661199311a331ab360c91b8a8201528152620007d9620021b7565b848152661198b09bb2b0b160c91b8a82015289820152610240850152620007ff620021b7565b62000809620021b7565b8481526611b2331bb1311960c91b8a820152815262000827620021b7565b848152662366663430613960c81b8a820152898201526102608501526200084d620021b7565b62000857620021b7565b84815266046c8c2c2686e760cb1b8a820152815262000875620021b7565b8481526611b3331c9a99b360c91b8a820152898201526102808501526200089b620021b7565b620008a5620021b7565b848152662362666366366360c81b8a8201528152620008c3620021b7565b84815266046c8cacccc66760cb1b8a820152898201526102a0850152620008e9620021b7565b620008f3620021b7565b848152662335663563333360c81b8a820152815262000911620021b7565b84815266046c2c4c26464760cb1b8a820152898201526102c085015262000937620021b7565b62000941620021b7565b8481526608cc8c0ccc0d8d60ca1b8a82015281526200095f620021b7565b848152660233033326362360cc1b8a820152898201526102e085015262000985620021b7565b6200098f620021b7565b84815266119931999c9a1960c91b8a8201528152620009ad620021b7565b848152662333343639386560c81b8a82015289820152610300850152620009d3620021b7565b620009dd620021b7565b8481526611999a9a309ab160c91b8a8201528152620009fb620021b7565b848152662332663731613760c81b8a8201528982015261032085015262000a21620021b7565b62000a2b620021b7565b8481526611b09bb09a1cb160c91b8a820152815262000a49620021b7565b84815266046cc66c8c672760cb1b8a8201528982015261034085015262000a6f620021b7565b62000a79620021b7565b84815266119b9b98b2989b60c91b8a820152815262000a97620021b7565b848152660236333313030360cc1b8a8201528982015261036085015262000abd620021b7565b62000ac7620021b7565b84815266119a319bb19c9960c91b8a820152815262000ae5620021b7565b848152662333316137646560c81b8a8201528982015261038085015262000b0b620021b7565b62000b15620021b7565b8481526611b318b2199a3360c91b8a820152815262000b33620021b7565b848152662366666431303760c81b8a820152898201526103a085015262000b59620021b7565b62000b63620021b7565b848152662337393533336560c81b8a820152815262000b81620021b7565b848152662363353631323960c81b8a820152898201526103c085015262000ba7620021b7565b62000bb1620021b7565b848152660466e68c4cc68760cb1b8a820152815262000bcf620021b7565b848152662336616666313360c81b8a820152898201526103e085015262000bf5620021b7565b62000bff620021b7565b848152662332363637353160c81b8a820152815262000c1d620021b7565b848152662330636233376160c81b8a8201528982015261040085015262000c43620021b7565b62000c4d620021b7565b848152662365646563646160c81b8a820152815262000c6b620021b7565b848152662366666639396560c81b8a8201528982015261042085015262000c91620021b7565b62000c9b620021b7565b848152662337343561363360c81b8a820152815262000cb9620021b7565b848152662363303562376560c81b8a8201528982015261044085015262000cdf620021b7565b62000ce9620021b7565b848152660233330333638360cc1b8a820152815262000d07620021b7565b848152662330663164636360c81b8a8201528982015261046085015262000d2d620021b7565b62000d37620021b7565b848152662363663436336360c81b8a820152815262000d55620021b7565b848152660236666313130360cc1b8a8201528982015261048085015262000d7b620021b7565b62000d85620021b7565b848152662363323361326160c81b8a820152815262000da3620021b7565b848152660236666316130360cc1b8a820152898201526104a085015262000dc9620021b7565b62000dd3620021b7565b84815266119b98309cb19b60c91b8a820152815262000df1620021b7565b84815266119a19b133333360c91b8a820152898201526104c085015262000e17620021b7565b62000e21620021b7565b848152662333313935643360c81b8a820152815262000e3f620021b7565b848152661198181cb2333360c91b8a820152898201526104e085015262000e65620021b7565b62000e6f620021b7565b8481526608d94d0d0c8c9960ca1b8a820152815262000e8d620021b7565b848152660236666316430360cc1b8a8201528982015261050085015262000eb3620021b7565b62000ebd620021b7565b848152662335633838623760c81b8a820152815262000edb620021b7565b848152661199999c9ab33360c91b8a8201528982015261052085015262000f01620021b7565b62000f0b620021b7565b848152662366616365363160c81b8a820152815262000f29620021b7565b8481526611b3333131989b60c91b8a8201528982015261054085015262000f4f620021b7565b62000f59620021b7565b84815266119a9b191c989960c91b8a820152815262000f77620021b7565b848152660236132333630360cc1b8a8201528982015261056085015262000f9d620021b7565b62000fa7620021b7565b848152660233366366435360cc1b8a820152815262000fc5620021b7565b848152662333336239363560c81b8a8201528982015261058085015262000feb620021b7565b62000ff5620021b7565b848152662337303465333360c81b8a820152815262001013620021b7565b8481526608d898cd8ccc5960ca1b8a820152898201526105a085015262001039620021b7565b62001043620021b7565b8481526608d98c8e0d0c9960ca1b8a820152815262001061620021b7565b848152660236666373030360cc1b8a820152898201526105c085015262001087620021b7565b62001091620021b7565b848152662366656665666560c81b8a8201528152620010af620021b7565b8481526611b3333119311960c91b8a820152898201526105e0850152620010d5620021b7565b620010df620021b7565b8481526608d88c190c191960ca1b8a8201528152620010fd620021b7565b84815266119bb2b21cb33360c91b8a8201528982015261060085015262001123620021b7565b6200112d620021b7565b8481526611989a9ab3309b60c91b8a82015281526200114b620021b7565b848152661198181bb1331960c91b8a8201528982015261062085015262001171620021b7565b6200117b620021b7565b84815266046c2c864ca64760cb1b8a820152815262001199620021b7565b848152660236639306230360cc1b8a82015289820152610640850152620011bf620021b7565b620011c9620021b7565b8481526611989819981a9b60c91b8a8201528152620011e7620021b7565b848152661198181a30b09960c91b8a820152898201526106608501526200120d620021b7565b62001217620021b7565b8481526608d98d8e4d0d1960ca1b8a820152815262001235620021b7565b848152662366663664303360c81b8a820152898201526106808501526200125b620021b7565b62001265620021b7565b848152662364393431323960c81b8a820152815262001283620021b7565b848152660236666323230360cc1b8a820152898201526106a0850152620012a9620021b7565b620012b3620021b7565b848152662333643535333160c81b8a8201528152620012d1620021b7565b848152662335336131326360c81b8a820152898201526106c0850152620012f7620021b7565b62001301620021b7565b84815266119b9b193198b360c91b8a82015281526200131f620021b7565b848152660236332316430360cc1b8a820152898201526106e085015262001345620021b7565b6200134f620021b7565b848152662366306563353560c81b8a82015281526200136d620021b7565b8481526608d999998e0c1960ca1b8a8201528982015261070085015262001393620021b7565b6200139d620021b7565b848152662339386435663160c81b8a8201528152620013bb620021b7565b84815266119a9a319cb33360c91b8a82015289820152610720850152620013e1620021b7565b620013eb620021b7565b848152662364636465643360c81b8a820152815262001409620021b7565b848152662365656666613560c81b8a820152898201526107408501526200142f620021b7565b62001439620021b7565b848152662362633764326560c81b8a820152815262001457620021b7565b848152660236666386430360cc1b8a820152898201526107608501526200147d620021b7565b62001487620021b7565b848152660233730373037360cc1b8a8201528152620014a5620021b7565b848152662362633833383360c81b8a82015289820152610780850152620014cb620021b7565b620014d5620021b7565b84815266119a18989a19b160c91b8a8201528152620014f3620021b7565b848152662338643031376160c81b8a820152898201526107a085015262001519620021b7565b62001523620021b7565b848152660236630343733360cc1b8a820152815262001541620021b7565b848152660236666316530360cc1b8a820152898201526107c085015262001567620021b7565b62001571620021b7565b848152662330643063313160c81b8a82015281526200158f620021b7565b8481526608cccc4c8d4d5960ca1b8a820152898201526107e0850152620015b5620021b7565b620015bf620021b7565b8481526611b31a9cb31b1b60c91b8a8201528152620015dd620021b7565b8481526608d9998dcdcc5960ca1b8a8201528982015261080085015262001603620021b7565b6200160d620021b7565b848152662364646439646160c81b8a82015281526200162b620021b7565b8481526611b33330b2319960c91b8a8201528982015261082085015262001651620021b7565b6200165b620021b7565b848152662332663730356160c81b8a820152815262001679620021b7565b8481526608cc4d9898ce0d60ca1b8a820152898201526108408501526200169f620021b7565b620016a9620021b7565b848152662335656130633360c81b8a8201528152620016c7620021b7565b84815266119932b11b333360c91b8a82015289820152610860850152620016ed620021b7565b620016f7620021b7565b84815266119c989cb31cb360c91b8a820152815262001715620021b7565b84815266119c9832b132b160c91b8a820152898201526108808501526200173b620021b7565b62001745620021b7565b848152660466e6a66c862760cb1b8a820152815262001763620021b7565b848152660236331346330360cc1b8a820152898201526108a085015262001789620021b7565b9162001794620021b7565b90848252898201528252620017a8620021b7565b9083825288820152878201526108c0830152620017c4620021b7565b620017ce620021b7565b82815266119a1a9919189b60c91b888201528152620017ec620021b7565b82815266119c98991b981960c91b88820152878201526108e083015262001812620021b7565b6200181c620021b7565b828152662334653164306360c81b8882015281526200183a620021b7565b828152660233961323730360cc1b888201528782015261090083015262001860620021b7565b6200186a620021b7565b8281526611999c1cb2b1b160c91b88820152815262001888620021b7565b828152661198183118333360c91b8882015287820152610920830152620018ae620021b7565b620018b8620021b7565b828152660236630373035360cc1b888201528152620018d6620021b7565b82815266046cccc667260760cb1b8882015287820152610940830152620018fc620021b7565b62001906620021b7565b8281526608cc590c590c5960ca1b88820152815262001924620021b7565b828152662336393439343960c81b88820152878201526109608301526200194a620021b7565b62001954620021b7565b828152662333643761626160c81b88820152815262001972620021b7565b8281526611981b9c18333360c91b888201528782015261098083015262001998620021b7565b620019a2620021b7565b82815266119b9c1c181c3160c91b888201528152620019c0620021b7565b828152662337396131643760c81b88820152878201526109a0830152620019e6620021b7565b620019f0620021b7565b828152660466e7068c264760cb1b88820152815262001a0e620021b7565b8281526611b19a1a9b981b60c91b88820152878201526109c083015262001a34620021b7565b9062001a3f620021b7565b8181526611b1981c9c193360c91b88820152825262001a5d620021b7565b908152660236666623830360cc1b87820152868201526109e082015260185460506018558060501062001d44575b5090601860005284600020906000925b6050841062001b795750505050506001601955331562001b3a57506002546702ea11e32ad500009283820180921162001b2557506000917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9160025533835282815284832084815401905584519384523393a351613c9f9081620021ee8239608051816115b20152f35b601190634e487b7160e01b6000525260246000fd5b90606493519262461bcd60e51b845283015260248201527f45524332303a206d696e7420746f20746865207a65726f2061646472657373006044820152fd5b80518354600285558060021062001cc3575b509087918460005282600020906000905b6002821062001bba5750505060019182910193019301929162001a9b565b8091929394505180519089821162001cae5762001be48262001bdd875462002115565b876200216b565b8b908b831160011462001c39579262001c1c83600195948f94879660009262001c2d5750508160011b916000199060031b1c19161790565b86555b019301910189939262001b9c565b01519050388062000090565b90601f9e9d9e19831691866000528d6000209260005b81811062001c965750929e9f9e600195928f9492868897941062001c7d575b505050831b8301865562001c1f565b0151600019838c1b60f8161c1916905538808062001c6e565b92938f60018192878601518155019501930162001c4f565b60418d634e487b7160e01b6000525260246000fd5b8460005260028960002091820191015b81811062001ce2575062001b8b565b808962001cf26001935462002115565b8062001d02575b50500162001cd3565b8c828211851462001d1d57505050600081555b893862001cf9565b60009262001d3a918585528420920160051c820185830162002152565b8183555562001d15565b601860005260508660002091820191015b81811062001d64575062001a8b565b8054600082558062001d7b575b5060010162001d55565b8160005287600020908101905b81811062001d97575062001d71565b8062001da66001925462002115565b8062001db5575b500162001d88565b898111831462001dcc5750600081555b3862001dad565b60009082825262001dea8b8d8420920160051c820185830162002152565b8183555562001dc5565b604188634e487b7160e01b6000525260246000fd5b805180519087821162001eeb579089929162001e328262001e2b885462002115565b886200216b565b83908a831160011462001e7957826001959386959362001e699360009262001c2d5750508160011b916000199060031b1c19161790565b86555b0193019101909162000210565b90601f9493941983169187600052846000209260005b81811062001ed2575091600196939185889796941062001eb9575b505050831b8301865562001e6c565b0151600019838c1b60f8161c1916905538808062001eaa565b8284015185558e96600190950194938401930162001e8f565b60418b634e487b7160e01b6000525260246000fd5b601760005260058760002091820191015b81811062001f20575062000201565b8062001f2f6001925462002115565b8062001f3e575b500162001f11565b888111831462001f555750600081555b3862001f36565b60009082825262001f738a8c8420920160051c820185830162002152565b8183555562001f4e565b604187634e487b7160e01b6000525260246000fd5b62001faf9060166000528486600020910160051c81019062002152565b3862000128565b90601f1983169188600052876000209260005b898282106200200a57505090846001959493921062001ff1575b505050811b018555620000fd565b015160001983861b60f8161c1916905538808062001fe3565b600185968293968601518155019501930162001fc9565b6200204d9088600052876000208780860160051c8201928a871062002054575b0160051c019062002152565b38620000c8565b9250819262002041565b90601f1983169185600052886000209260005b8a828210620020b257505090846001959493921062002099575b505050811b018255620000a8565b015160001983871b60f8161c191690553880806200208b565b600185968293968601518155019501930162002071565b620020f49085600052886000208880860160051c8201928b871062002054570160051c019062002152565b3862000072565b604186634e487b7160e01b6000525260246000fd5b600080fd5b90600182811c9216801562002147575b60208310146200213157565b634e487b7160e01b600052602260045260246000fd5b91607f169162002125565b8181106200215e575050565b6000815560010162002152565b9190601f81116200217b57505050565b620021aa926000526020600020906020601f840160051c83019310620021ac575b601f0160051c019062002152565b565b90915081906200219c565b60408051919082016001600160401b03811183821017620021d757604052565b634e487b7160e01b600052604160045260246000fdfe60a0604090808252600436101561001557600080fd5b60003560e01c90816306fdde031461166d57508063095ea7b31461164457806316f0115b1461161b57806318160ddd146115fc578063214013ca1461159457806323b872dd146114cb5780632bd1a01114611473578063313ce56714611457578063333a0072146113fb57806335ad0cea1461130f57806339509351146112bf578063422b9e23146112a4578063524773ce1461125d5780636b4ed21b1461123e57806370a082311461120557806370db69d6146111e15780638da5cb5b146111b857806395d89b41146110d257806395e4b21b1461109957806399f65c8f1461107a578063a457c2d714610fd3578063a9059cbb14610fa3578063bbb1e3f814610587578063c3f4552a14610559578063c5b8f77214610510578063c7218d5b14610485578063cb8106f414610440578063cda5fefc14610271578063dd62ed3e14610224578063e0d9750214610205578063f2fde38b146101be5763fb700e5b1461018157600080fd5b346101b95760203660031901126101b9576020906001600160a01b036101a5611766565b166000526008825280600020549051908152f35b600080fd5b346101b95760203660031901126101b9576101d7611766565b601354906001600160a01b03906101f18284163314611926565b6001600160a01b0319909216911617601355005b50346101b95760003660031901126101b9576020906011549051908152f35b50346101b957806003193601126101b957602090610240611766565b61024861177c565b9060018060a01b0380911660005260018452826000209116600052825280600020549051908152f35b50346101b9576020806003193601126101b9576001600160401b03906004358281116101b957366023820112156101b9578060040135906102bd6102b48361182c565b955195866117e3565b81855236602483830101116101b95781600092602485930183880137850101526102f260018060a01b03601354163314611926565b825191821161042a57610306601454611847565b601f81116103d1575b5080601f83116001146103505750819061034093600092610345575b50508160011b916000199060031b1c19161790565b601455005b01519050388061032b565b90601f1983169360146000527fce6d7b5282bd9a3661ae061feed1dbda4e52ab073b1f9285be6e155d9c38d4ec926000905b8682106103b957505083600195106103a0575b505050811b01601455005b015160001960f88460031b161c19169055388080610395565b80600185968294968601518155019501930190610382565b61041a9060146000527fce6d7b5282bd9a3661ae061feed1dbda4e52ab073b1f9285be6e155d9c38d4ec601f850160051c810191848610610420575b601f0160051c0190611f94565b3861030f565b909150819061040d565b634e487b7160e01b600052604160045260246000fd5b50346101b95760203660031901126101b957602090610474600435600052600d60205260018060a01b036040600020541690565b90516001600160a01b039091168152f35b50346101b957806003193601126101b95761050c906104a2611766565b6000602083516104b181611792565b828152015260018060a01b0316600052600960205280600020602435600052602052806000209060018151926104e684611792565b805484520154602083015251918291829190916020806040830194805184520151910152565b0390f35b50346101b957806003193601126101b9576020906001600160a01b03610534611766565b16600052600b825280600020602435600052825260ff81600020541690519015158152f35b50346101b95761050c9061057461056f36611804565b611fe5565b9051918291602083526020830190611741565b50346101b95760031981813601126101b9576001600160401b03600435116101b957606090600435360301126101b95760243560ff81168091036101b9576105da60018060a01b03601354163314611926565b61060782516105e881611792565b600d81526c6164645361626572536861706560981b602082015261265e565b60005260156020526000208054600160401b81101561042a5761062f91600182018155611f43565b610f8d57610641600480350180611f5f565b600160401b811161042a578254818455808210610f18575b5081836000526020600020906000935b838510610df3578560018101610689602460043501600435600401611f5f565b9091600160401b821161042a578054828255808310610d7e575b506000908152602081209092805b838510610c5957600435604481013590879060028201903603606219018312156101b9576106e56004803585010180611f5f565b9091600160401b821161042a578054828255808310610be4575b506000908152602081209092805b838510610ace57868661072a600480358401602481019101611f5f565b600160401b811161042a576003830154816003850155808210610a55575b5081600384016000526020600020906000935b8385106109295760048681019061077b9080358a01604481019101611f5f565b90600160401b821161042a5782548284558083106108b4575b506000928352602083209290805b8383106107ab57005b8035601e19833603018112156101b95782018035906001600160401b0382116101b95781360360208201136101b9576107ee826107e88954611847565b89611fab565b600090601f83116001146108425792610826836001959460209487966000926108355750508160011b916000199060031b1c19161790565b88555b019501920191936107a2565b8692500101358b8061032b565b601f198316918860005260206000209260005b81811061089a575093602093600196938796938388951061087e575b505050811b018855610829565b01850135600019600384901b60f8161c191690558a8080610871565b919360206001819282888801013581550195019201610855565b8360005282602060002091820191015b8181106108d15750610794565b806108de60019254611847565b806108eb575b50016108c4565b601f908181118414610904575050600081555b866108e4565b61092060009284845260208420920160051c8201858301611f94565b818355556108fe565b8035601e19833603018112156101b9576001600160401b0381840135116101b957808301353603602082850101136101b9576109728184013561096c8654611847565b86611fab565b600090601f81850135116001146109d0576001926109b28493602093600091818901356109c1575b50870135908160011b916000199060031b1c19161790565b86555b0193019401939161075b565b8882010185013591508d61099a565b908460005260206000209060005b85840135601f19168110610a3957506001938493602093919285929088830135601f19811610610a18575b5050860135811b0186556109b5565b8560001960f8858c013560031b161c1991848b010101351690558c80610a09565b90916020600181928286888b01010135815501930191016109de565b600384016000526020600020908282015b8183018110610a76575050610748565b80610a8360019254611847565b80610a90575b5001610a66565b601f908181118414610aa9575050600081555b88610a89565b610ac560009284845260208420920160051c8201858301611f94565b81835555610aa3565b8035601e19833603018112156101b9576001600160401b0381840135116101b957808301353603602082850101136101b957610b118184013561096c8654611847565b600090601f8185013511600114610b5f57600192610b508493602093600091818901356109c15750870135908160011b916000199060031b1c19161790565b86555b0193019401939161070d565b908460005260206000209060005b85840135601f19168110610bc857506001938493602093919285929088830135601f19811610610ba7575b5050860135811b018655610b53565b8560001960f8858c013560031b161c1991848b010101351690558c80610b98565b90916020600181928286888b0101013581550193019101610b6d565b8160005282602060002091820191015b818110610c0157506106ff565b80610c0e60019254611847565b80610c1b575b5001610bf4565b601f908181118414610c34575050600081555b88610c14565b610c5060009284845260208420920160051c8201858301611f94565b81835555610c2e565b8035601e19833603018112156101b9576001600160401b0381840135116101b957808301353603602082850101136101b957610c9c8184013561096c8654611847565b600090601f8185013511600114610cf957600192610cdb849360209360009181890135610cea5750870135908160011b916000199060031b1c19161790565b86555b019301940193916106b1565b8882010185013591508c61099a565b908460005260206000209060005b85840135601f19168110610d6257506001938493602093919285929088830135601f19811610610d41575b5050860135811b018655610cde565b8560001960f8858c013560031b161c1991848b010101351690558b80610d32565b90916020600181928286888b0101013581550193019101610d07565b8160005282602060002091820191015b818110610d9b57506106a3565b80610da860019254611847565b80610db5575b5001610d8e565b601f908181118414610dce575050600081555b87610dae565b610dea60009284845260208420920160051c8201858301611f94565b81835555610dc8565b8035601e19833603018112156101b9576001600160401b0381840135116101b957808301353603602082850101136101b957610e368184013561096c8654611847565b600090601f8185013511600114610e9357600192610e75849360209360009181890135610e845750870135908160011b916000199060031b1c19161790565b86555b01930194019391610669565b8882010185013591503861099a565b908460005260206000209060005b85840135601f19168110610efc57506001938493602093919285929088830135601f19811610610edb575b5050860135811b018655610e78565b8560001960f8858c013560031b161c1991848b010101351690553880610ecc565b90916020600181928286888b0101013581550193019101610ea1565b8360005281602060002091820191015b818110610f355750610659565b80610f4260019254611847565b80610f4f575b5001610f28565b601f908181118414610f68575050600081555b38610f48565b610f8460009284845260208420920160051c8201858301611f94565b81835555610f62565b634e487b7160e01b600052600060045260246000fd5b50346101b957806003193601126101b957602090610fcc610fc2611766565b6024359033612381565b5160018152f35b50346101b957806003193601126101b957610fec611766565b906024353360005260016020528160002060018060a01b03841660005260205281600020548181106110285792610fcc9160209403903361227f565b825162461bcd60e51b815260206004820152602560248201527f45524332303a2064656372656173656420616c6c6f77616e63652062656c6f77604482015264207a65726f60d81b6064820152608490fd5b50346101b95760003660031901126101b957602090600f549051908152f35b50346101b95760203660031901126101b9576020906001600160a01b036110be611766565b16600052600e825280600020549051908152f35b50346101b95760003660031901126101b957805160045490918260006110f784611847565b80835260209460019086600182169182600014611196575050600114611139575b505061050c929161112a9103856117e3565b51928284938452830190611741565b9085925060046000527f8a35acfbc15ff81a39ae7d344fd709f28e8600b4aa8c65c6b64bfe7fe36bd19b916000925b82841061117e575050508201018161112a611118565b8054848a018601528895508794909301928101611168565b60ff19168682015292151560051b8501909201925083915061112a9050611118565b50346101b95760003660031901126101b95760135490516001600160a01b039091168152602090f35b50346101b95760003660031901126101b9576020906111fe611ec5565b9051908152f35b50346101b95760203660031901126101b9576020906001600160a01b0361122a611766565b166000526000825280600020549051908152f35b50346101b95760003660031901126101b9576020906010549051908152f35b50346101b95760003660031901126101b9576002546702ea11e32ad5000090810390811161128e5760209151908152f35b634e487b7160e01b600052601160045260246000fd5b50346101b95761050c906105746112ba36611804565b6119ca565b50346101b957806003193601126101b957602090610fcc6112de611766565b33600052600184528260002060018060a01b03821660005284526113086024358460002054611976565b903361227f565b50346101b957806003193601126101b957600435906024356113308161195f565b9261133d835194856117e3565b8184526113498261195f565b916020916020860193601f190136853760005b8281106113ae575050508251938493602085019160208652518092528401929160005b82811061138e57505050500390f35b83516001600160a01b03168552869550938101939281019260010161137f565b806113dd6113c2600193859a98999a611976565b6000908152600d60205260409020546001600160a01b031690565b6113e782886119b6565b90838060a01b03169052019594939561135c565b346101b95760003660031901126101b9576013546114236001600160a01b0382163314611926565b6001600160a01b0319166013557f6e4ee811a17215345b89e3506064ff2d62f4feedff3566e9d09219cda7e8cadb600080a1005b50346101b95760003660031901126101b9576020905160098152f35b50346101b95760203660031901126101b95761050c90611491611766565b6000602083516114a081611792565b82815201526001600160a01b03166000908152600c602052819020815191906001906104e684611792565b50346101b95760603660031901126101b9576114e5611766565b906114ee61177c565b6044359260018060a01b038116600052600160205282600020336000526020528260002054600019810361152b575b5092610fcc91602094612381565b84811061155057918491611547602096610fcc9503338361227f565b9194509161151d565b835162461bcd60e51b815260206004820152601d60248201527f45524332303a20696e73756666696369656e7420616c6c6f77616e63650000006044820152606490fd5b60203660031901126101b9576115a8611766565b6001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000811633036101b957600554918183166101b9576001600160a01b031990921691161760055542600655005b50346101b95760003660031901126101b9576020906002549051908152f35b50346101b95760003660031901126101b95760055490516001600160a01b039091168152602090f35b50346101b957806003193601126101b957602090610fcc611663611766565b602435903361227f565b82346101b95760003660031901126101b9576003549082600061168f84611847565b808352602094600190866001821691826000146111965750506001146116c157505061050c929161112a9103856117e3565b9085925060036000527fc2575a0e9e593c00f959f8c92f12db2869c3395a3b0502d05e2516446f71f85b916000925b828410611706575050508201018161112a611118565b8054848a0186015288955087949093019281016116f0565b60005b8381106117315750506000910152565b8181015183820152602001611721565b9060209161175a8151809281855285808601910161171e565b601f01601f1916010190565b600435906001600160a01b03821682036101b957565b602435906001600160a01b03821682036101b957565b604081019081106001600160401b0382111761042a57604052565b606081019081106001600160401b0382111761042a57604052565b602081019081106001600160401b0382111761042a57604052565b90601f801991011681019081106001600160401b0382111761042a57604052565b60409060031901126101b95760405161181c81611792565b6004358152602435602082015290565b6001600160401b03811161042a57601f01601f191660200190565b90600182811c92168015611877575b602083101461186157565b634e487b7160e01b600052602260045260246000fd5b91607f1691611856565b9060405191826000825461189481611847565b9081845260209460019160018116908160001461190457506001146118c5575b5050506118c3925003836117e3565b565b600090815285812095935091905b8183106118ec5750506118c393508201013880806118b4565b855488840185015294850194879450918301916118d3565b925050506118c394925060ff191682840152151560051b8201013880806118b4565b1561192d57565b60405162461bcd60e51b815260206004820152600a60248201526937b7363c9037bbb732b960b11b6044820152606490fd5b6001600160401b03811161042a5760051b60200190565b9190820180921161128e57565b8051600110156119935760400190565b634e487b7160e01b600052603260045260246000fd5b8051156119935760200190565b80518210156119935760209160051b010190565b6005546001600160a01b03166119ee57506040516119e7816117c8565b6000815290565b6119f790612b08565b60408051611a0481611792565b60058152611a2060209164746f53766760d81b8382015261265e565b611a28612eb1565b9282519282808501957f3c73766720786d6c6e733d27687474703a2f2f7777772e77332e6f72672f323087527030302f737667272076696577426f783d2760781b83870152611a80815180928460518a01910161171e565b850191611aa460538761139f60f11b958660518201520360338101895201876117e3565b611ad58151611ab281611792565b601281527119d95b995c985d19509858dad9dc9bdd5b9960721b8482015261265e565b60c08401519381519485848101917f3c7265637420783d27302720793d2730272077696474683d273130302527206883527265696768743d2731303025272066696c6c3d2760681b85830152611b34815180928860538601910161171e565b8101631390179f60e11b6053820152605760009160145491611b5583611847565b92600190818116908115611e965750600114611e37575b5050505003601f1981018752611b8290876117e3565b8251611b8d81611792565b601781527f646f6e652067656e65726174654261636b67726f756e6400000000000000000085820152611bbf9061265e565b611bc8826137c1565b908351611bd481611792565b600f81526e67656e65726174654265616d53766760881b86820152611bf89061265e565b61010083019685885101516080850151611c1191613b10565b94611c1a612eb1565b9781519582898801986d3c7376672076696577426f783d2760901b9b8c8b52805190818d602e8d01920191611c4e9261171e565b890184602e820152815191828d60308401920191611c6b9261171e565b019b88651e17b9bb339f60d11b9d8e603082015203601681018a52603601611c93908a6117e3565b8151611c9e81611792565b6014815273646f6e652067656e65726174654265616d53766760601b8c820152611cc79061265e565b8151611cd281611792565b600f81526e67656e657261746548696c7453766760881b8c820152611cf69061265e565b5151910151611d0491613b10565b825191898381808201858196519283910191611d1f9261171e565b81010380855201611d3090846117e3565b611d38612eb1565b9284519a8b948186019d8e5280518092602e8801920191611d589261171e565b840191602e83015251918260308301611d709261171e565b018a603082015203601681018852603601611d8b90886117e3565b8051611d9681611792565b6014815273646f6e652067656e657261746548696c7453766760601b8b820152611dbf9061265e565b519a8b9a5190818b8d01611dd29261171e565b8a01905191828a8301611de49261171e565b018151918289808401920191611df99261171e565b0190519182878301611e0a9261171e565b0190519182858301611e1b9261171e565b019182015203600681018252602601611e3490826117e3565b90565b909192935060146000527fce6d7b5282bd9a3661ae061feed1dbda4e52ab073b1f9285be6e155d9c38d4ec6000905b858210611e7e57505050500160570138808080611b6c565b80548583018501528d9a8d9750909101908201611e66565b925050506057935060ff92919219168383015280151502010138808080611b6c565b9190820391821161128e57565b6005546001600160a01b031615611f3757611ee260065442611eb8565b6702ea11e32ad5000081810291818304810361128e57670e92596fd629000002918083046005149015171561128e57620186a0655f7f37b390009204820180921161128e57808211611f32575090565b905090565b6702ea11e32ad5000090565b8054821015611993576000526005602060002091020190600090565b903590601e19813603018212156101b957018035906001600160401b0382116101b957602001918160051b360383136101b957565b818110611f9f575050565b60008155600101611f94565b9190601f8111611fba57505050565b6118c3926000526020600020906020601f840160051c8301931061042057601f0160051c0190611f94565b6005546001600160a01b031661200257506040516119e7816117c8565b61200b90612b08565b805161201690612eed565b604082015160808301519060a084015160c08501519460e0015161203990612eed565b94604051612046816117ad565b6027815260208097818301937f4a6564692c20244a4544492e204d61792074686520666f726365206265207769855260408401663a34103cb7ba9760c91b90526040519561209387611792565b60128752838701977168747470733a2f2f6a6564692e61726d792f60701b89526040519b8c9b818d01607b60f81b90528c67112632bb32b6111d60c11b90602101528c81519260298492019201916120ea9261171e565b8b016f1610112434b63a1021b7b637b9111d1160811b602982015281519182876039840192019161211a9261171e565b0198601160f91b998a60398201526f1610112132b0b69021b7b637b9111d1160811b603a8201528151918287604a84019201916121569261171e565b0189604a820152741610112132b0b69023b637bb9021b7b637b9111d1160591b604b8201528151918286606084019201916121909261171e565b01886060820152751610112130b1b5b3b937bab7321021b7b637b9111d1160511b60618201528151918285607784019201916121cb9261171e565b01908760778301527216101129b0b132b91029b430b8329034b2111d60691b607883015280518093608b84019201916122039261171e565b0190701610112232b9b1b934b83a34b7b7111d1160791b608b830152519182609c830161222f9261171e565b019083609c830152681610112bb2b1111d1160b91b609d83015251918260a683016122599261171e565b019060a682015260a78101607d60f81b90520360888101825260a801611e3490826117e3565b6001600160a01b0390811691821561233057169182156122e05760207f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925918360005260018252604060002085600052825280604060002055604051908152a3565b60405162461bcd60e51b815260206004820152602260248201527f45524332303a20617070726f766520746f20746865207a65726f206164647265604482015261737360f01b6064820152608490fd5b60405162461bcd60e51b8152602060048201526024808201527f45524332303a20617070726f76652066726f6d20746865207a65726f206164646044820152637265737360e01b6064820152608490fd5b6005546001600160a01b0393929190841615612608576123a081612fb2565b6123a983612fb2565b906123b58585856126ad565b6123be83612fb2565b906123c885612fb2565b91811580612601575b6125f3575b816125ea575b506125dc575b8115806125d5575b6125c7575b816125be575b506125b0575b838216156124ac578381163081146124a1576007549460ff8616156124265750506118c393506128bc565b6005541680911461243c57506118c393506128bc565b92919050612448611ec5565b821161246c5760ff19938416600117600755612463926128bc565b60075416600755565b60405162461bcd60e51b815260206004820152600d60248201526c1b585e08189d5e481b1a5b5a5d609a1b6044820152606490fd5b506118c393506128bc565b90509190911680156125615760009181835282602052604083205481811061251157817fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef926020928587528684520360408620558060025403600255604051908152a3565b60405162461bcd60e51b815260206004820152602260248201527f45524332303a206275726e20616d6f756e7420657863656564732062616c616e604482015261636560f01b6064820152608490fd5b60405162461bcd60e51b815260206004820152602160248201527f45524332303a206275726e2066726f6d20746865207a65726f206164647265736044820152607360f81b6064820152608490fd5b6125b9826130e1565b6123fb565b905015386123f5565b6125d084613087565b6123ef565b50806123ea565b6125e5836130e1565b6123e2565b905015386123dc565b6125fc85613087565b6123d6565b50806123d1565b83601354168085831614908115612652575b506123fb5760405162461bcd60e51b815260206004820152600b60248201526a1b9bdd081cdd185c9d195960aa1b6044820152606490fd5b9050848316143861261a565b6000809160405161269a8161268c602082019463104c13eb60e21b8652602060248401526044830190611741565b03601f1981018352826117e3565b51906a636f6e736f6c652e6c6f675afa50565b916001600160a01b0391908284163081146128b557633b9aca009081830494851515806128a7575b80612897575b61271a575b50612715926118c3969261270f926000526000602052806127076040600020549384611eb8565b049104611eb8565b906131a9565b61363b565b600090828252602091600c835260409088828220541480612878575b61281e57848152600b8452818120898252845260ff8282205416806127ff575b612762575050506126e0565b6127d39296507f882cd5197c658fe29ff1ed21d4a9c2c50495592e1e9337e75267eff5a3c6530297955098818a866127fa979b94969c5260098c52818120600a8d528282208583528d528282205482528c522099600185519b6127c48d611792565b80548d520154908b0152613501565b6127dd8784613458565b519283921695829190916020806040830194805184520151910152565b0390a3565b508288168152600b8452818120898252845260ff828220541615612756565b6127d39296507f882cd5197c658fe29ff1ed21d4a9c2c50495592e1e9337e75267eff5a3c6530297955098818a866127fa979b94969c52600c8c522099600185519b6128698d611792565b80548d520154908b01526131a9565b508288168152600b8452818120898252845260ff828220541615612736565b50806005541681861614156126db565b5080600554168214156126d5565b5050505050565b6001600160a01b039081169182156129815760009383855284602052604085205481811061292d577fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9360209383604093888a528987520383892055169586815220818154019055604051908152a3565b60405162461bcd60e51b815260206004820152602660248201527f45524332303a207472616e7366657220616d6f756e7420657863656564732062604482015265616c616e636560d01b6064820152608490fd5b60405162461bcd60e51b815260206004820152602560248201527f45524332303a207472616e736665722066726f6d20746865207a65726f206164604482015264647265737360d81b6064820152608490fd5b60409081519161012083018381106001600160401b0382111761042a5781526101008360008152606080602083015280848301526000818301528060808301528060a08301528060c0830152600060e0830152835193612a33856117ad565b818552816020860152805191612a48836117ad565b808352806020840152818301528401520152565b8115612a66570690565b634e487b7160e01b600052601260045260246000fd5b6018548110156119935760186000527fb13d2d76d1f4b7be834882e410b3e3a8afaf69f83600ae24db354391d2378d2e0190600090565b908154612abf8161195f565b92612acd60405194856117e3565b818452600090815260208082208186015b848410612aec575050505050565b6001838192612afa85611881565b815201920193019290612ade565b612b106129d4565b508051602090818301918251604092835190612b2b826117ad565b8152600091828483015284820152612bd7612bd0612b476129d4565b97848088612b548761372e565b80612ea3575b808d52612bb98a835192612b6d84611792565b600884526719185d184b9b1d9b60c21b82850152612ba585519485938401966309710a9d60e41b885260248501526064840190611741565b90604483015203601f1981018352826117e3565b51906a636f6e736f6c652e6c6f675afa5051612eed565b9551612eed565b9484519581612bef889351809288808701910161171e565b8201605f60f81b86820152612c0d825180938860218501910161171e565b010394612c246021600197888101845201826117e3565b83870152612c3181613770565b612c3e6017548092612a5c565b90811015612e8f57612c7590601784527fc624b66cc0138b8fabc209247f72d758e1cf3343756d543badbf24212bed8c1501611881565b60c0870152612c8381613770565b612c98612c936018548093612a5c565b612a7c565b50805415612e7b57612ccd612c93859493612cd393899752612cbb888720611881565b878c0152612cc885613770565b612a5c565b50612ab3565b83518884601654612ce381611847565b90818552898c82169182600014612e5d575050600114612e01575b50600494612d2a612d9695856080612d6696612d23612dec9c99612d549803846117e3565b0152611983565b5160a08d0152612d4f8851612d3e81611792565b8c8152601960f91b8b82015261265e565b613770565b8a518352601588528683205490612a5c565b968791612d888251612d7781611792565b8b8152603360f81b8a82015261265e565b8a5181526015885220611f43565b50612db8845197612da6896117ad565b612daf83612ab3565b89528201612ab3565b85880152835194612dc8866117ad565b612dd460028301612ab3565b8652612de260038301612ab3565b9086015201612ab3565b8183015283015260e083015261010082015290565b6016875288915086908b7fd833147d7dc355ba459fc788f669e58cfaf9dc25ddcd0702e87d69c7b51242895b828410612e41575050508301016004612cfe565b80548488018601528c9a508e95508b94909301928d9101612e2d565b60ff19168187015291151560051b8501909101915060049050612cfe565b634e487b7160e01b84526032600452602484fd5b634e487b7160e01b83526032600452602483fd5b612eac906130d4565b612b5a565b60405190612ebe82611792565b6011825270302030203332302e3235203332302e323560781b6020830152565b600019811461128e5760010190565b8015612f9457600081805b612f805750612f068161182c565b90612f1460405192836117e3565b808252601f19612f238261182c565b013660208401375b80928015612f7957600019820191821161128e578193600a92603090848406820180921161128e57855111156119935760f81b6001600160f81b03191660001a908401601f01530491612f2b565b5050905090565b90612f8c600a91612ede565b910480612ef8565b50604051612fa181611792565b60018152600360fc1b602082015290565b6001600160a01b039081169190308314908115613079575b508015613071575b61306b57600091808352600c60205260408320546040519163fb700e5b60e01b83526004830152602082602481305afa918215613060578492613021575b5061301c929350611976565b151590565b9091506020813d602011613058575b8161303d602093836117e3565b810103126130545761301c92935051908392613010565b8380fd5b3d9150613030565b6040513d86823e3d90fd5b60009150565b508115612fd2565b905060055416821438612fca565b6130cf90601054600052600d60205260406000209060018060a01b031690816001600160601b0360a01b82541617905560105490600052600e60205280604060002055612ede565b601055565b801561128e576000190190565b60105480156131a5576001600160a01b039182166000818152600e6020526040808220549094919390919060001981019081116131915780830361315a575b50505061312e6010546130d4565b6010558152600e60205280828120556010548152600d602052206001600160601b0360a01b8154169055565b8452600d6020528484205416818452848420816001600160601b0360a01b8254161790558352600e60205283832055388080613120565b634e487b7160e01b85526011600452602485fd5b5050565b91908015613453576005546001600160a01b03848116929116821461344d576000828152600c6020818152604093848420978551916131e783611792565b895483526001809a0154848401528786528484528686208054828110156133bb5750508786528484528686205461321d91611eb8565b908786528484528587812055613241613237601254612ede565b8060125582613aa9565b8887528585526001888820015560088452868620549980879b88925b613377575b505050918187969492938b6132dc9997957faa626bf76e4a6a5b23f2cd43ad5451ce8410ccdca0112dc86a79b5964f177edc9b9c9d1161332a575b5050508051151580613319575b613306575b5115806132f4575b6132e1575b878352522090518154815260019091015460208201529081906040820190565b0390a2565b6132ec601154612ede565b6011556132bc565b508783528181528383205415156132b7565b6133116011546130d4565b6011556132af565b5088845282825284842054156132aa565b6133629261333791611eb8565b8b875285855261334b888820918254611976565b9055613358601254612ede565b9081601255613aa9565b8985528383526001868620015538808061329d565b90919b818d10806133b2575b156133ac5761339e6133a49161339886613ad5565b90611976565b9c612ede565b91908161325d565b9b613262565b50848110613383565b7faa626bf76e4a6a5b23f2cd43ad5451ce8410ccdca0112dc86a79b5964f177edc999a9b50926133f99161334b8a999795946132dc9b999795611eb8565b908985528383528585209160018301555115159081613443575b5061343857878352522090518154815260019091015460208201529081906040820190565b6132ec6011546130d4565b9050541538613413565b50509050565b509050565b6005546001600160a01b0391821692911682146131a55760009082825260206008815260409384842061348b8154612ede565b9055613498600f54612ede565b600f55808452600882528484205460001981019081116131915781855260098352858520818652835285852084518155600184860151910155818552600a8352858520845186528352858520558352600b8152838320915183525220600160ff19825416179055565b6005546001600160a01b03918216911681146131a55760019060009281845260206008815260409283862061353681546130d4565b9055613543600f546130d4565b600f55808652600b8252838620838752825283862060ff198154169055808652600882528386205492600a8352848720908752825283862054818752600983528487208188528352848720908686519261359c84611792565b805484520154848301528481036135da575b50818752600a835284872090518752825285848120558552600981528285209185525282208281550155565b828852600984528588208589528452858820878751916135f983611792565b805483520154858201908152848a5260098652878a20838b52865288888b20918351835551910155838952600a855286892090518952845285882055386135ae565b9080156131a5576005546001600160a01b038381169391168314613729576136c46132dc917efb093446d003bea3dc7db8b593d37cc6a34ea254b80cd1aa5d942b828a5d6d93600090868252600c60205260409384938484209260018651946136a386611792565b8054865201546020850152898552600c60205261334b868620918254611976565b90878352600c6020528383209160018301555115908161371e575b5061370b575b858152600c60205220905191829182919091602060016040830194805484520154910152565b613716601154612ede565b6011556136e5565b9050541515386136df565b505050565b5161041a811061376a5761290481106137645762019a28811061375e57621005901161375957600490565b600390565b50600290565b50600190565b50600090565b61378d8151602083019081519161378683612ede565b9052611976565b60001981019190821161128e576040015160405190602082019283526040820152604081526137bb816117ad565b51902090565b60408051916137cf83611792565b600f83526137f56020936e67656e6572617465476c6f7753766760881b8582015261265e565b61010081018281510151515115613a9b57838201519061384e6030855180946f72616469616c2d6772616469656e742d60801b8983015261383e815180928b868601910161171e565b81010360108101855201836117e3565b613856612eb1565b926138658583510151516119a9565b5160a0613876878551015151611983565b519201805187855101515180516002101561199357606001518251918987510151518051600310156119935760808c91015194818c8a510151015190516138bc91613b10565b968b8080808c51015101516138d0906119a9565b519a51015101516138e090611983565b519a8c5160805282608051016d3c7376672076696577426f783d2760901b90528051908184608051602e019201916139179261171e565b6080510196602e880161139f60f11b905260308801651e3232b3399f60d11b905260369781519182858b840192019161394f9261171e565b8b519101613962828a8301868f0161171e565b0190805180938984019201916139779261171e565b01815191828d88840192019161398c9261171e565b01815191828c8784019201916139a19261171e565b01815191828b8684019201916139b69261171e565b01815191828a8584019201916139cb9261171e565b01908101661e17b232b3399f60c91b90528151918288603d84019201916139f19261171e565b018151918287603d8401920191613a079261171e565b018151918286603d8401920191613a1d9261171e565b018151918285603d8401920191613a339261171e565b01603d8101651e17b9bb339f60d11b90526080519003602381016080515260430160805190613a61916117e3565b5190613a6c82611792565b60148252810173646f6e652067656e6572617465476c6f7753766760601b9052613a959061265e565b60805190565b50509050516119e7816117c8565b906040519060208201926001600160601b03199060601b1683526034820152603481526137bb816117ad565b6001600160a01b03811660009081526008602052604081205415611f32576040611e3491600960205281812081805260205220548092613501565b80516060939290156131a5576000935b8251600019810190811161128e57851015613c1a57600190613c12613b4587866119b6565b516040926000808551613b5781611792565b6008815261268c613bac6020966770617274735b695d60c01b888501528951928391613b9a8a840196634b5c427760e01b88528d60248601526064850190611741565b83810360231901604485015290611741565b51906a636f6e736f6c652e6c6f675afa50613bc789886119b6565b5193519381613bdf869351809286808701910161171e565b8201613bf38251809386808501910161171e565b01865190613c0682858301868b0161171e565b010380845201826117e3565b940193613b20565b929350508051600019810190811161128e57613c3b602091611e34936119b6565b51926040519381613c55869351809286808701910161171e565b8201613c068251809386808501910161171e56fea26469706673582212208f59e6ddf88531330a563a841c3b11226b2c933bc251b5cf603630be830835cd64736f6c63430008170033

Deployed Bytecode

0x60a0604090808252600436101561001557600080fd5b60003560e01c90816306fdde031461166d57508063095ea7b31461164457806316f0115b1461161b57806318160ddd146115fc578063214013ca1461159457806323b872dd146114cb5780632bd1a01114611473578063313ce56714611457578063333a0072146113fb57806335ad0cea1461130f57806339509351146112bf578063422b9e23146112a4578063524773ce1461125d5780636b4ed21b1461123e57806370a082311461120557806370db69d6146111e15780638da5cb5b146111b857806395d89b41146110d257806395e4b21b1461109957806399f65c8f1461107a578063a457c2d714610fd3578063a9059cbb14610fa3578063bbb1e3f814610587578063c3f4552a14610559578063c5b8f77214610510578063c7218d5b14610485578063cb8106f414610440578063cda5fefc14610271578063dd62ed3e14610224578063e0d9750214610205578063f2fde38b146101be5763fb700e5b1461018157600080fd5b346101b95760203660031901126101b9576020906001600160a01b036101a5611766565b166000526008825280600020549051908152f35b600080fd5b346101b95760203660031901126101b9576101d7611766565b601354906001600160a01b03906101f18284163314611926565b6001600160a01b0319909216911617601355005b50346101b95760003660031901126101b9576020906011549051908152f35b50346101b957806003193601126101b957602090610240611766565b61024861177c565b9060018060a01b0380911660005260018452826000209116600052825280600020549051908152f35b50346101b9576020806003193601126101b9576001600160401b03906004358281116101b957366023820112156101b9578060040135906102bd6102b48361182c565b955195866117e3565b81855236602483830101116101b95781600092602485930183880137850101526102f260018060a01b03601354163314611926565b825191821161042a57610306601454611847565b601f81116103d1575b5080601f83116001146103505750819061034093600092610345575b50508160011b916000199060031b1c19161790565b601455005b01519050388061032b565b90601f1983169360146000527fce6d7b5282bd9a3661ae061feed1dbda4e52ab073b1f9285be6e155d9c38d4ec926000905b8682106103b957505083600195106103a0575b505050811b01601455005b015160001960f88460031b161c19169055388080610395565b80600185968294968601518155019501930190610382565b61041a9060146000527fce6d7b5282bd9a3661ae061feed1dbda4e52ab073b1f9285be6e155d9c38d4ec601f850160051c810191848610610420575b601f0160051c0190611f94565b3861030f565b909150819061040d565b634e487b7160e01b600052604160045260246000fd5b50346101b95760203660031901126101b957602090610474600435600052600d60205260018060a01b036040600020541690565b90516001600160a01b039091168152f35b50346101b957806003193601126101b95761050c906104a2611766565b6000602083516104b181611792565b828152015260018060a01b0316600052600960205280600020602435600052602052806000209060018151926104e684611792565b805484520154602083015251918291829190916020806040830194805184520151910152565b0390f35b50346101b957806003193601126101b9576020906001600160a01b03610534611766565b16600052600b825280600020602435600052825260ff81600020541690519015158152f35b50346101b95761050c9061057461056f36611804565b611fe5565b9051918291602083526020830190611741565b50346101b95760031981813601126101b9576001600160401b03600435116101b957606090600435360301126101b95760243560ff81168091036101b9576105da60018060a01b03601354163314611926565b61060782516105e881611792565b600d81526c6164645361626572536861706560981b602082015261265e565b60005260156020526000208054600160401b81101561042a5761062f91600182018155611f43565b610f8d57610641600480350180611f5f565b600160401b811161042a578254818455808210610f18575b5081836000526020600020906000935b838510610df3578560018101610689602460043501600435600401611f5f565b9091600160401b821161042a578054828255808310610d7e575b506000908152602081209092805b838510610c5957600435604481013590879060028201903603606219018312156101b9576106e56004803585010180611f5f565b9091600160401b821161042a578054828255808310610be4575b506000908152602081209092805b838510610ace57868661072a600480358401602481019101611f5f565b600160401b811161042a576003830154816003850155808210610a55575b5081600384016000526020600020906000935b8385106109295760048681019061077b9080358a01604481019101611f5f565b90600160401b821161042a5782548284558083106108b4575b506000928352602083209290805b8383106107ab57005b8035601e19833603018112156101b95782018035906001600160401b0382116101b95781360360208201136101b9576107ee826107e88954611847565b89611fab565b600090601f83116001146108425792610826836001959460209487966000926108355750508160011b916000199060031b1c19161790565b88555b019501920191936107a2565b8692500101358b8061032b565b601f198316918860005260206000209260005b81811061089a575093602093600196938796938388951061087e575b505050811b018855610829565b01850135600019600384901b60f8161c191690558a8080610871565b919360206001819282888801013581550195019201610855565b8360005282602060002091820191015b8181106108d15750610794565b806108de60019254611847565b806108eb575b50016108c4565b601f908181118414610904575050600081555b866108e4565b61092060009284845260208420920160051c8201858301611f94565b818355556108fe565b8035601e19833603018112156101b9576001600160401b0381840135116101b957808301353603602082850101136101b9576109728184013561096c8654611847565b86611fab565b600090601f81850135116001146109d0576001926109b28493602093600091818901356109c1575b50870135908160011b916000199060031b1c19161790565b86555b0193019401939161075b565b8882010185013591508d61099a565b908460005260206000209060005b85840135601f19168110610a3957506001938493602093919285929088830135601f19811610610a18575b5050860135811b0186556109b5565b8560001960f8858c013560031b161c1991848b010101351690558c80610a09565b90916020600181928286888b01010135815501930191016109de565b600384016000526020600020908282015b8183018110610a76575050610748565b80610a8360019254611847565b80610a90575b5001610a66565b601f908181118414610aa9575050600081555b88610a89565b610ac560009284845260208420920160051c8201858301611f94565b81835555610aa3565b8035601e19833603018112156101b9576001600160401b0381840135116101b957808301353603602082850101136101b957610b118184013561096c8654611847565b600090601f8185013511600114610b5f57600192610b508493602093600091818901356109c15750870135908160011b916000199060031b1c19161790565b86555b0193019401939161070d565b908460005260206000209060005b85840135601f19168110610bc857506001938493602093919285929088830135601f19811610610ba7575b5050860135811b018655610b53565b8560001960f8858c013560031b161c1991848b010101351690558c80610b98565b90916020600181928286888b0101013581550193019101610b6d565b8160005282602060002091820191015b818110610c0157506106ff565b80610c0e60019254611847565b80610c1b575b5001610bf4565b601f908181118414610c34575050600081555b88610c14565b610c5060009284845260208420920160051c8201858301611f94565b81835555610c2e565b8035601e19833603018112156101b9576001600160401b0381840135116101b957808301353603602082850101136101b957610c9c8184013561096c8654611847565b600090601f8185013511600114610cf957600192610cdb849360209360009181890135610cea5750870135908160011b916000199060031b1c19161790565b86555b019301940193916106b1565b8882010185013591508c61099a565b908460005260206000209060005b85840135601f19168110610d6257506001938493602093919285929088830135601f19811610610d41575b5050860135811b018655610cde565b8560001960f8858c013560031b161c1991848b010101351690558b80610d32565b90916020600181928286888b0101013581550193019101610d07565b8160005282602060002091820191015b818110610d9b57506106a3565b80610da860019254611847565b80610db5575b5001610d8e565b601f908181118414610dce575050600081555b87610dae565b610dea60009284845260208420920160051c8201858301611f94565b81835555610dc8565b8035601e19833603018112156101b9576001600160401b0381840135116101b957808301353603602082850101136101b957610e368184013561096c8654611847565b600090601f8185013511600114610e9357600192610e75849360209360009181890135610e845750870135908160011b916000199060031b1c19161790565b86555b01930194019391610669565b8882010185013591503861099a565b908460005260206000209060005b85840135601f19168110610efc57506001938493602093919285929088830135601f19811610610edb575b5050860135811b018655610e78565b8560001960f8858c013560031b161c1991848b010101351690553880610ecc565b90916020600181928286888b0101013581550193019101610ea1565b8360005281602060002091820191015b818110610f355750610659565b80610f4260019254611847565b80610f4f575b5001610f28565b601f908181118414610f68575050600081555b38610f48565b610f8460009284845260208420920160051c8201858301611f94565b81835555610f62565b634e487b7160e01b600052600060045260246000fd5b50346101b957806003193601126101b957602090610fcc610fc2611766565b6024359033612381565b5160018152f35b50346101b957806003193601126101b957610fec611766565b906024353360005260016020528160002060018060a01b03841660005260205281600020548181106110285792610fcc9160209403903361227f565b825162461bcd60e51b815260206004820152602560248201527f45524332303a2064656372656173656420616c6c6f77616e63652062656c6f77604482015264207a65726f60d81b6064820152608490fd5b50346101b95760003660031901126101b957602090600f549051908152f35b50346101b95760203660031901126101b9576020906001600160a01b036110be611766565b16600052600e825280600020549051908152f35b50346101b95760003660031901126101b957805160045490918260006110f784611847565b80835260209460019086600182169182600014611196575050600114611139575b505061050c929161112a9103856117e3565b51928284938452830190611741565b9085925060046000527f8a35acfbc15ff81a39ae7d344fd709f28e8600b4aa8c65c6b64bfe7fe36bd19b916000925b82841061117e575050508201018161112a611118565b8054848a018601528895508794909301928101611168565b60ff19168682015292151560051b8501909201925083915061112a9050611118565b50346101b95760003660031901126101b95760135490516001600160a01b039091168152602090f35b50346101b95760003660031901126101b9576020906111fe611ec5565b9051908152f35b50346101b95760203660031901126101b9576020906001600160a01b0361122a611766565b166000526000825280600020549051908152f35b50346101b95760003660031901126101b9576020906010549051908152f35b50346101b95760003660031901126101b9576002546702ea11e32ad5000090810390811161128e5760209151908152f35b634e487b7160e01b600052601160045260246000fd5b50346101b95761050c906105746112ba36611804565b6119ca565b50346101b957806003193601126101b957602090610fcc6112de611766565b33600052600184528260002060018060a01b03821660005284526113086024358460002054611976565b903361227f565b50346101b957806003193601126101b957600435906024356113308161195f565b9261133d835194856117e3565b8184526113498261195f565b916020916020860193601f190136853760005b8281106113ae575050508251938493602085019160208652518092528401929160005b82811061138e57505050500390f35b83516001600160a01b03168552869550938101939281019260010161137f565b806113dd6113c2600193859a98999a611976565b6000908152600d60205260409020546001600160a01b031690565b6113e782886119b6565b90838060a01b03169052019594939561135c565b346101b95760003660031901126101b9576013546114236001600160a01b0382163314611926565b6001600160a01b0319166013557f6e4ee811a17215345b89e3506064ff2d62f4feedff3566e9d09219cda7e8cadb600080a1005b50346101b95760003660031901126101b9576020905160098152f35b50346101b95760203660031901126101b95761050c90611491611766565b6000602083516114a081611792565b82815201526001600160a01b03166000908152600c602052819020815191906001906104e684611792565b50346101b95760603660031901126101b9576114e5611766565b906114ee61177c565b6044359260018060a01b038116600052600160205282600020336000526020528260002054600019810361152b575b5092610fcc91602094612381565b84811061155057918491611547602096610fcc9503338361227f565b9194509161151d565b835162461bcd60e51b815260206004820152601d60248201527f45524332303a20696e73756666696369656e7420616c6c6f77616e63650000006044820152606490fd5b60203660031901126101b9576115a8611766565b6001600160a01b037f000000000000000000000000e454971f7f1ac59d0251f1803e6d240ed199aad6811633036101b957600554918183166101b9576001600160a01b031990921691161760055542600655005b50346101b95760003660031901126101b9576020906002549051908152f35b50346101b95760003660031901126101b95760055490516001600160a01b039091168152602090f35b50346101b957806003193601126101b957602090610fcc611663611766565b602435903361227f565b82346101b95760003660031901126101b9576003549082600061168f84611847565b808352602094600190866001821691826000146111965750506001146116c157505061050c929161112a9103856117e3565b9085925060036000527fc2575a0e9e593c00f959f8c92f12db2869c3395a3b0502d05e2516446f71f85b916000925b828410611706575050508201018161112a611118565b8054848a0186015288955087949093019281016116f0565b60005b8381106117315750506000910152565b8181015183820152602001611721565b9060209161175a8151809281855285808601910161171e565b601f01601f1916010190565b600435906001600160a01b03821682036101b957565b602435906001600160a01b03821682036101b957565b604081019081106001600160401b0382111761042a57604052565b606081019081106001600160401b0382111761042a57604052565b602081019081106001600160401b0382111761042a57604052565b90601f801991011681019081106001600160401b0382111761042a57604052565b60409060031901126101b95760405161181c81611792565b6004358152602435602082015290565b6001600160401b03811161042a57601f01601f191660200190565b90600182811c92168015611877575b602083101461186157565b634e487b7160e01b600052602260045260246000fd5b91607f1691611856565b9060405191826000825461189481611847565b9081845260209460019160018116908160001461190457506001146118c5575b5050506118c3925003836117e3565b565b600090815285812095935091905b8183106118ec5750506118c393508201013880806118b4565b855488840185015294850194879450918301916118d3565b925050506118c394925060ff191682840152151560051b8201013880806118b4565b1561192d57565b60405162461bcd60e51b815260206004820152600a60248201526937b7363c9037bbb732b960b11b6044820152606490fd5b6001600160401b03811161042a5760051b60200190565b9190820180921161128e57565b8051600110156119935760400190565b634e487b7160e01b600052603260045260246000fd5b8051156119935760200190565b80518210156119935760209160051b010190565b6005546001600160a01b03166119ee57506040516119e7816117c8565b6000815290565b6119f790612b08565b60408051611a0481611792565b60058152611a2060209164746f53766760d81b8382015261265e565b611a28612eb1565b9282519282808501957f3c73766720786d6c6e733d27687474703a2f2f7777772e77332e6f72672f323087527030302f737667272076696577426f783d2760781b83870152611a80815180928460518a01910161171e565b850191611aa460538761139f60f11b958660518201520360338101895201876117e3565b611ad58151611ab281611792565b601281527119d95b995c985d19509858dad9dc9bdd5b9960721b8482015261265e565b60c08401519381519485848101917f3c7265637420783d27302720793d2730272077696474683d273130302527206883527265696768743d2731303025272066696c6c3d2760681b85830152611b34815180928860538601910161171e565b8101631390179f60e11b6053820152605760009160145491611b5583611847565b92600190818116908115611e965750600114611e37575b5050505003601f1981018752611b8290876117e3565b8251611b8d81611792565b601781527f646f6e652067656e65726174654261636b67726f756e6400000000000000000085820152611bbf9061265e565b611bc8826137c1565b908351611bd481611792565b600f81526e67656e65726174654265616d53766760881b86820152611bf89061265e565b61010083019685885101516080850151611c1191613b10565b94611c1a612eb1565b9781519582898801986d3c7376672076696577426f783d2760901b9b8c8b52805190818d602e8d01920191611c4e9261171e565b890184602e820152815191828d60308401920191611c6b9261171e565b019b88651e17b9bb339f60d11b9d8e603082015203601681018a52603601611c93908a6117e3565b8151611c9e81611792565b6014815273646f6e652067656e65726174654265616d53766760601b8c820152611cc79061265e565b8151611cd281611792565b600f81526e67656e657261746548696c7453766760881b8c820152611cf69061265e565b5151910151611d0491613b10565b825191898381808201858196519283910191611d1f9261171e565b81010380855201611d3090846117e3565b611d38612eb1565b9284519a8b948186019d8e5280518092602e8801920191611d589261171e565b840191602e83015251918260308301611d709261171e565b018a603082015203601681018852603601611d8b90886117e3565b8051611d9681611792565b6014815273646f6e652067656e657261746548696c7453766760601b8b820152611dbf9061265e565b519a8b9a5190818b8d01611dd29261171e565b8a01905191828a8301611de49261171e565b018151918289808401920191611df99261171e565b0190519182878301611e0a9261171e565b0190519182858301611e1b9261171e565b019182015203600681018252602601611e3490826117e3565b90565b909192935060146000527fce6d7b5282bd9a3661ae061feed1dbda4e52ab073b1f9285be6e155d9c38d4ec6000905b858210611e7e57505050500160570138808080611b6c565b80548583018501528d9a8d9750909101908201611e66565b925050506057935060ff92919219168383015280151502010138808080611b6c565b9190820391821161128e57565b6005546001600160a01b031615611f3757611ee260065442611eb8565b6702ea11e32ad5000081810291818304810361128e57670e92596fd629000002918083046005149015171561128e57620186a0655f7f37b390009204820180921161128e57808211611f32575090565b905090565b6702ea11e32ad5000090565b8054821015611993576000526005602060002091020190600090565b903590601e19813603018212156101b957018035906001600160401b0382116101b957602001918160051b360383136101b957565b818110611f9f575050565b60008155600101611f94565b9190601f8111611fba57505050565b6118c3926000526020600020906020601f840160051c8301931061042057601f0160051c0190611f94565b6005546001600160a01b031661200257506040516119e7816117c8565b61200b90612b08565b805161201690612eed565b604082015160808301519060a084015160c08501519460e0015161203990612eed565b94604051612046816117ad565b6027815260208097818301937f4a6564692c20244a4544492e204d61792074686520666f726365206265207769855260408401663a34103cb7ba9760c91b90526040519561209387611792565b60128752838701977168747470733a2f2f6a6564692e61726d792f60701b89526040519b8c9b818d01607b60f81b90528c67112632bb32b6111d60c11b90602101528c81519260298492019201916120ea9261171e565b8b016f1610112434b63a1021b7b637b9111d1160811b602982015281519182876039840192019161211a9261171e565b0198601160f91b998a60398201526f1610112132b0b69021b7b637b9111d1160811b603a8201528151918287604a84019201916121569261171e565b0189604a820152741610112132b0b69023b637bb9021b7b637b9111d1160591b604b8201528151918286606084019201916121909261171e565b01886060820152751610112130b1b5b3b937bab7321021b7b637b9111d1160511b60618201528151918285607784019201916121cb9261171e565b01908760778301527216101129b0b132b91029b430b8329034b2111d60691b607883015280518093608b84019201916122039261171e565b0190701610112232b9b1b934b83a34b7b7111d1160791b608b830152519182609c830161222f9261171e565b019083609c830152681610112bb2b1111d1160b91b609d83015251918260a683016122599261171e565b019060a682015260a78101607d60f81b90520360888101825260a801611e3490826117e3565b6001600160a01b0390811691821561233057169182156122e05760207f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925918360005260018252604060002085600052825280604060002055604051908152a3565b60405162461bcd60e51b815260206004820152602260248201527f45524332303a20617070726f766520746f20746865207a65726f206164647265604482015261737360f01b6064820152608490fd5b60405162461bcd60e51b8152602060048201526024808201527f45524332303a20617070726f76652066726f6d20746865207a65726f206164646044820152637265737360e01b6064820152608490fd5b6005546001600160a01b0393929190841615612608576123a081612fb2565b6123a983612fb2565b906123b58585856126ad565b6123be83612fb2565b906123c885612fb2565b91811580612601575b6125f3575b816125ea575b506125dc575b8115806125d5575b6125c7575b816125be575b506125b0575b838216156124ac578381163081146124a1576007549460ff8616156124265750506118c393506128bc565b6005541680911461243c57506118c393506128bc565b92919050612448611ec5565b821161246c5760ff19938416600117600755612463926128bc565b60075416600755565b60405162461bcd60e51b815260206004820152600d60248201526c1b585e08189d5e481b1a5b5a5d609a1b6044820152606490fd5b506118c393506128bc565b90509190911680156125615760009181835282602052604083205481811061251157817fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef926020928587528684520360408620558060025403600255604051908152a3565b60405162461bcd60e51b815260206004820152602260248201527f45524332303a206275726e20616d6f756e7420657863656564732062616c616e604482015261636560f01b6064820152608490fd5b60405162461bcd60e51b815260206004820152602160248201527f45524332303a206275726e2066726f6d20746865207a65726f206164647265736044820152607360f81b6064820152608490fd5b6125b9826130e1565b6123fb565b905015386123f5565b6125d084613087565b6123ef565b50806123ea565b6125e5836130e1565b6123e2565b905015386123dc565b6125fc85613087565b6123d6565b50806123d1565b83601354168085831614908115612652575b506123fb5760405162461bcd60e51b815260206004820152600b60248201526a1b9bdd081cdd185c9d195960aa1b6044820152606490fd5b9050848316143861261a565b6000809160405161269a8161268c602082019463104c13eb60e21b8652602060248401526044830190611741565b03601f1981018352826117e3565b51906a636f6e736f6c652e6c6f675afa50565b916001600160a01b0391908284163081146128b557633b9aca009081830494851515806128a7575b80612897575b61271a575b50612715926118c3969261270f926000526000602052806127076040600020549384611eb8565b049104611eb8565b906131a9565b61363b565b600090828252602091600c835260409088828220541480612878575b61281e57848152600b8452818120898252845260ff8282205416806127ff575b612762575050506126e0565b6127d39296507f882cd5197c658fe29ff1ed21d4a9c2c50495592e1e9337e75267eff5a3c6530297955098818a866127fa979b94969c5260098c52818120600a8d528282208583528d528282205482528c522099600185519b6127c48d611792565b80548d520154908b0152613501565b6127dd8784613458565b519283921695829190916020806040830194805184520151910152565b0390a3565b508288168152600b8452818120898252845260ff828220541615612756565b6127d39296507f882cd5197c658fe29ff1ed21d4a9c2c50495592e1e9337e75267eff5a3c6530297955098818a866127fa979b94969c52600c8c522099600185519b6128698d611792565b80548d520154908b01526131a9565b508288168152600b8452818120898252845260ff828220541615612736565b50806005541681861614156126db565b5080600554168214156126d5565b5050505050565b6001600160a01b039081169182156129815760009383855284602052604085205481811061292d577fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9360209383604093888a528987520383892055169586815220818154019055604051908152a3565b60405162461bcd60e51b815260206004820152602660248201527f45524332303a207472616e7366657220616d6f756e7420657863656564732062604482015265616c616e636560d01b6064820152608490fd5b60405162461bcd60e51b815260206004820152602560248201527f45524332303a207472616e736665722066726f6d20746865207a65726f206164604482015264647265737360d81b6064820152608490fd5b60409081519161012083018381106001600160401b0382111761042a5781526101008360008152606080602083015280848301526000818301528060808301528060a08301528060c0830152600060e0830152835193612a33856117ad565b818552816020860152805191612a48836117ad565b808352806020840152818301528401520152565b8115612a66570690565b634e487b7160e01b600052601260045260246000fd5b6018548110156119935760186000527fb13d2d76d1f4b7be834882e410b3e3a8afaf69f83600ae24db354391d2378d2e0190600090565b908154612abf8161195f565b92612acd60405194856117e3565b818452600090815260208082208186015b848410612aec575050505050565b6001838192612afa85611881565b815201920193019290612ade565b612b106129d4565b508051602090818301918251604092835190612b2b826117ad565b8152600091828483015284820152612bd7612bd0612b476129d4565b97848088612b548761372e565b80612ea3575b808d52612bb98a835192612b6d84611792565b600884526719185d184b9b1d9b60c21b82850152612ba585519485938401966309710a9d60e41b885260248501526064840190611741565b90604483015203601f1981018352826117e3565b51906a636f6e736f6c652e6c6f675afa5051612eed565b9551612eed565b9484519581612bef889351809288808701910161171e565b8201605f60f81b86820152612c0d825180938860218501910161171e565b010394612c246021600197888101845201826117e3565b83870152612c3181613770565b612c3e6017548092612a5c565b90811015612e8f57612c7590601784527fc624b66cc0138b8fabc209247f72d758e1cf3343756d543badbf24212bed8c1501611881565b60c0870152612c8381613770565b612c98612c936018548093612a5c565b612a7c565b50805415612e7b57612ccd612c93859493612cd393899752612cbb888720611881565b878c0152612cc885613770565b612a5c565b50612ab3565b83518884601654612ce381611847565b90818552898c82169182600014612e5d575050600114612e01575b50600494612d2a612d9695856080612d6696612d23612dec9c99612d549803846117e3565b0152611983565b5160a08d0152612d4f8851612d3e81611792565b8c8152601960f91b8b82015261265e565b613770565b8a518352601588528683205490612a5c565b968791612d888251612d7781611792565b8b8152603360f81b8a82015261265e565b8a5181526015885220611f43565b50612db8845197612da6896117ad565b612daf83612ab3565b89528201612ab3565b85880152835194612dc8866117ad565b612dd460028301612ab3565b8652612de260038301612ab3565b9086015201612ab3565b8183015283015260e083015261010082015290565b6016875288915086908b7fd833147d7dc355ba459fc788f669e58cfaf9dc25ddcd0702e87d69c7b51242895b828410612e41575050508301016004612cfe565b80548488018601528c9a508e95508b94909301928d9101612e2d565b60ff19168187015291151560051b8501909101915060049050612cfe565b634e487b7160e01b84526032600452602484fd5b634e487b7160e01b83526032600452602483fd5b612eac906130d4565b612b5a565b60405190612ebe82611792565b6011825270302030203332302e3235203332302e323560781b6020830152565b600019811461128e5760010190565b8015612f9457600081805b612f805750612f068161182c565b90612f1460405192836117e3565b808252601f19612f238261182c565b013660208401375b80928015612f7957600019820191821161128e578193600a92603090848406820180921161128e57855111156119935760f81b6001600160f81b03191660001a908401601f01530491612f2b565b5050905090565b90612f8c600a91612ede565b910480612ef8565b50604051612fa181611792565b60018152600360fc1b602082015290565b6001600160a01b039081169190308314908115613079575b508015613071575b61306b57600091808352600c60205260408320546040519163fb700e5b60e01b83526004830152602082602481305afa918215613060578492613021575b5061301c929350611976565b151590565b9091506020813d602011613058575b8161303d602093836117e3565b810103126130545761301c92935051908392613010565b8380fd5b3d9150613030565b6040513d86823e3d90fd5b60009150565b508115612fd2565b905060055416821438612fca565b6130cf90601054600052600d60205260406000209060018060a01b031690816001600160601b0360a01b82541617905560105490600052600e60205280604060002055612ede565b601055565b801561128e576000190190565b60105480156131a5576001600160a01b039182166000818152600e6020526040808220549094919390919060001981019081116131915780830361315a575b50505061312e6010546130d4565b6010558152600e60205280828120556010548152600d602052206001600160601b0360a01b8154169055565b8452600d6020528484205416818452848420816001600160601b0360a01b8254161790558352600e60205283832055388080613120565b634e487b7160e01b85526011600452602485fd5b5050565b91908015613453576005546001600160a01b03848116929116821461344d576000828152600c6020818152604093848420978551916131e783611792565b895483526001809a0154848401528786528484528686208054828110156133bb5750508786528484528686205461321d91611eb8565b908786528484528587812055613241613237601254612ede565b8060125582613aa9565b8887528585526001888820015560088452868620549980879b88925b613377575b505050918187969492938b6132dc9997957faa626bf76e4a6a5b23f2cd43ad5451ce8410ccdca0112dc86a79b5964f177edc9b9c9d1161332a575b5050508051151580613319575b613306575b5115806132f4575b6132e1575b878352522090518154815260019091015460208201529081906040820190565b0390a2565b6132ec601154612ede565b6011556132bc565b508783528181528383205415156132b7565b6133116011546130d4565b6011556132af565b5088845282825284842054156132aa565b6133629261333791611eb8565b8b875285855261334b888820918254611976565b9055613358601254612ede565b9081601255613aa9565b8985528383526001868620015538808061329d565b90919b818d10806133b2575b156133ac5761339e6133a49161339886613ad5565b90611976565b9c612ede565b91908161325d565b9b613262565b50848110613383565b7faa626bf76e4a6a5b23f2cd43ad5451ce8410ccdca0112dc86a79b5964f177edc999a9b50926133f99161334b8a999795946132dc9b999795611eb8565b908985528383528585209160018301555115159081613443575b5061343857878352522090518154815260019091015460208201529081906040820190565b6132ec6011546130d4565b9050541538613413565b50509050565b509050565b6005546001600160a01b0391821692911682146131a55760009082825260206008815260409384842061348b8154612ede565b9055613498600f54612ede565b600f55808452600882528484205460001981019081116131915781855260098352858520818652835285852084518155600184860151910155818552600a8352858520845186528352858520558352600b8152838320915183525220600160ff19825416179055565b6005546001600160a01b03918216911681146131a55760019060009281845260206008815260409283862061353681546130d4565b9055613543600f546130d4565b600f55808652600b8252838620838752825283862060ff198154169055808652600882528386205492600a8352848720908752825283862054818752600983528487208188528352848720908686519261359c84611792565b805484520154848301528481036135da575b50818752600a835284872090518752825285848120558552600981528285209185525282208281550155565b828852600984528588208589528452858820878751916135f983611792565b805483520154858201908152848a5260098652878a20838b52865288888b20918351835551910155838952600a855286892090518952845285882055386135ae565b9080156131a5576005546001600160a01b038381169391168314613729576136c46132dc917efb093446d003bea3dc7db8b593d37cc6a34ea254b80cd1aa5d942b828a5d6d93600090868252600c60205260409384938484209260018651946136a386611792565b8054865201546020850152898552600c60205261334b868620918254611976565b90878352600c6020528383209160018301555115908161371e575b5061370b575b858152600c60205220905191829182919091602060016040830194805484520154910152565b613716601154612ede565b6011556136e5565b9050541515386136df565b505050565b5161041a811061376a5761290481106137645762019a28811061375e57621005901161375957600490565b600390565b50600290565b50600190565b50600090565b61378d8151602083019081519161378683612ede565b9052611976565b60001981019190821161128e576040015160405190602082019283526040820152604081526137bb816117ad565b51902090565b60408051916137cf83611792565b600f83526137f56020936e67656e6572617465476c6f7753766760881b8582015261265e565b61010081018281510151515115613a9b57838201519061384e6030855180946f72616469616c2d6772616469656e742d60801b8983015261383e815180928b868601910161171e565b81010360108101855201836117e3565b613856612eb1565b926138658583510151516119a9565b5160a0613876878551015151611983565b519201805187855101515180516002101561199357606001518251918987510151518051600310156119935760808c91015194818c8a510151015190516138bc91613b10565b968b8080808c51015101516138d0906119a9565b519a51015101516138e090611983565b519a8c5160805282608051016d3c7376672076696577426f783d2760901b90528051908184608051602e019201916139179261171e565b6080510196602e880161139f60f11b905260308801651e3232b3399f60d11b905260369781519182858b840192019161394f9261171e565b8b519101613962828a8301868f0161171e565b0190805180938984019201916139779261171e565b01815191828d88840192019161398c9261171e565b01815191828c8784019201916139a19261171e565b01815191828b8684019201916139b69261171e565b01815191828a8584019201916139cb9261171e565b01908101661e17b232b3399f60c91b90528151918288603d84019201916139f19261171e565b018151918287603d8401920191613a079261171e565b018151918286603d8401920191613a1d9261171e565b018151918285603d8401920191613a339261171e565b01603d8101651e17b9bb339f60d11b90526080519003602381016080515260430160805190613a61916117e3565b5190613a6c82611792565b60148252810173646f6e652067656e6572617465476c6f7753766760601b9052613a959061265e565b60805190565b50509050516119e7816117c8565b906040519060208201926001600160601b03199060601b1683526034820152603481526137bb816117ad565b6001600160a01b03811660009081526008602052604081205415611f32576040611e3491600960205281812081805260205220548092613501565b80516060939290156131a5576000935b8251600019810190811161128e57851015613c1a57600190613c12613b4587866119b6565b516040926000808551613b5781611792565b6008815261268c613bac6020966770617274735b695d60c01b888501528951928391613b9a8a840196634b5c427760e01b88528d60248601526064850190611741565b83810360231901604485015290611741565b51906a636f6e736f6c652e6c6f675afa50613bc789886119b6565b5193519381613bdf869351809286808701910161171e565b8201613bf38251809386808501910161171e565b01865190613c0682858301868b0161171e565b010380845201826117e3565b940193613b20565b929350508051600019810190811161128e57613c3b602091611e34936119b6565b51926040519381613c55869351809286808701910161171e565b8201613c068251809386808501910161171e56fea26469706673582212208f59e6ddf88531330a563a841c3b11226b2c933bc251b5cf603630be830835cd64736f6c63430008170033

Loading