Contract 0x431dca8b2cce105bde47df6eaadc6c8b4dfd9eb7

Txn Hash Method
Block
From
To
Value [Txn Fee]
0x329ece3bd018443c0f889d7a7044097f12724578f6dd284fd8da026739e0a319Approve58097732022-12-01 3:39:593 hrs 15 mins ago0xb45c6bfb18bd516af6ceb3db34c1ce24852e75b3 IN  0x431dca8b2cce105bde47df6eaadc6c8b4dfd9eb70 CRO0.2599938508670
0x6700afc1f171208e842769b15c439c95990abcd256d9d23a1b6a39090287e822Transfer From57879482022-11-29 17:07:041 day 13 hrs ago0x14b24a96e55adb12d19551be5837f8262d79dd3e IN  0x431dca8b2cce105bde47df6eaadc6c8b4dfd9eb70 CRO0.3738678715820
0xc5ee265d1f93ad0a993c3420eb772a75e73400e52c297e493314956720492d86Approve57859242022-11-29 13:53:491 day 17 hrs ago0x5413834178017aa5b8ce34c0a2a888b96b956daf IN  0x431dca8b2cce105bde47df6eaadc6c8b4dfd9eb70 CRO0.2601107176680
0x107005876bd77f741dc3a0d24f9c3c28911ae46a9f95b3177f963f2eebc7e75aApprove57853232022-11-29 12:56:351 day 17 hrs ago0xfc292b9b3b2eba8ecd499e08ba4d816a363f2e21 IN  0x431dca8b2cce105bde47df6eaadc6c8b4dfd9eb70 CRO0.2601122209590
0x518f217990c7093626db1ef2907aadb8a0ca02e2d37e22493344fe44d1b24301Approve57609412022-11-27 22:09:543 days 8 hrs ago0x29a0b2499b08f59595403311f93253f264db191f IN  0x431dca8b2cce105bde47df6eaadc6c8b4dfd9eb70 CRO0.2601726786440
0xf5e68259ce1ba2460f165ec870283050fec95a039a9bd4b5f9955797184fe8e3Approve57601552022-11-27 20:54:443 days 10 hrs ago0x75b9c229e46a89c29fb8ca3e46e9d58fd9e8b9a2 IN  0x431dca8b2cce105bde47df6eaadc6c8b4dfd9eb70 CRO0.2601745977960
0xb23fcb16c95f28d8accabce80a651fbd52b0a1bb4061d118ee841ce6f44e1b6aApprove57537012022-11-27 10:38:233 days 20 hrs ago0xb1219f99eaf2e527150fe88678f93980b9f3e1ad IN  0x431dca8b2cce105bde47df6eaadc6c8b4dfd9eb70 CRO0.260324125962 4,869.87664552
0x2a9e5c7d33223c73e4d4aa736ccbc5a336898298ba44434020afef9cf960e231Approve57536932022-11-27 10:37:383 days 20 hrs ago0xb1219f99eaf2e527150fe88678f93980b9f3e1ad IN  0x431dca8b2cce105bde47df6eaadc6c8b4dfd9eb70 CRO0.260324146126 4,869.877022712
0x95d805c0792eb899a456c20363f0942e4820c2e4b924d37d40528a597ecd183fApprove57536752022-11-27 10:35:563 days 20 hrs ago0xb1219f99eaf2e527150fe88678f93980b9f3e1ad IN  0x431dca8b2cce105bde47df6eaadc6c8b4dfd9eb70 CRO0.260324191066 4,869.877863415
0xc4bccd5d99ef6edfbb8e189f54486ac196c135226fbf87961f94cd0ad3ff4fafApprove57054542022-11-24 6:23:217 days 31 mins ago0x97e24b6d2d54981a8301ce9e99a7ba951dd2dd04 IN  0x431dca8b2cce105bde47df6eaadc6c8b4dfd9eb70 CRO0.2603101665420
0xbc9bc7542261c68ad8d146a0c9b977374115acb073e591ed54c31e1dabc9f572Approve57038992022-11-24 3:56:387 days 2 hrs ago0xf722f53117eb7fe47a3459d4a52a5272c10720a6 IN  0x431dca8b2cce105bde47df6eaadc6c8b4dfd9eb70 CRO0.26044765844 4,872.187564369
0xc5d2b92ef6fac73943ad4fed780e7f3b8070e75d9d186fcb0979a6422bd17eafTransfer From56811032022-11-22 16:03:238 days 14 hrs ago0xf161d1ce634aac9d16badb887756b07ad43fa0cc IN  0x431dca8b2cce105bde47df6eaadc6c8b4dfd9eb70 CRO0.374498631303 4,873.238487707
0x350bed6ac943169860c4db9c448fca07785feebd411f7408a7c72ed6d44fe1e7Approve56762792022-11-22 8:27:298 days 22 hrs ago0xeff34e035baf14d8817e75a5806b0d6c073a7923 IN  0x431dca8b2cce105bde47df6eaadc6c8b4dfd9eb70 CRO0.2603237104240
0xb686e29af7de8cf38d840ba0a031a5a69f7ccfbbfcb169fa6e54efc621781e71Approve56486012022-11-20 12:52:2610 days 18 hrs ago0x428abeadbb9728c7b583ca9eb9c1cd2ce061ddac IN  0x431dca8b2cce105bde47df6eaadc6c8b4dfd9eb70 CRO0.260584222105 4,874.742257295
0xe5ba5e408a7301eacfc450ae66f20cd834feb40988d4f6a2f9ccb5edd8a30f2aApprove56259702022-11-19 1:15:2112 days 5 hrs ago0xe75f3c4d9fefc6cc14319cfb04ff8aa1c652df54 IN  0x431dca8b2cce105bde47df6eaadc6c8b4dfd9eb70 CRO0.2605067760690
0xf24832383c789d61418e970291fd859abf6090f91d1bdfc3b055bc8d57147177Approve56085342022-11-17 21:49:1213 days 9 hrs ago0xaa84a7665c6dcd77d0a0a2e9a2a3817bd6b7c58f IN  0x431dca8b2cce105bde47df6eaadc6c8b4dfd9eb70 CRO0.2605499795530
0xd8b5d6d52336cb92d8eb936fac8eea534df1622b05b7242962665de098120a68Set Approval For...56070662022-11-17 19:30:3013 days 11 hrs ago0x2f7a9a37ec33ff39b1a3deb7c27b77f556835252 IN  0x431dca8b2cce105bde47df6eaadc6c8b4dfd9eb70 CRO0.229229572925 4,875.66889132
0xbe1e3cc5d63244a977b437714d4884c90d782a33df8688e9f337611185800b3bSet Approval For...56041402022-11-17 14:54:0013 days 16 hrs ago0x5a8ff44fba53d76e7aae9d4f163e8d042eea989d IN  0x431dca8b2cce105bde47df6eaadc6c8b4dfd9eb70 CRO0.2291654120250
0x2fae98d8c6ba358e9a0da5187c382a8dd780e4ed8698b9d2fd20d474b8ea21a2Approve55753022022-11-15 17:26:5115 days 13 hrs ago0x48cda818540da0161988d000fae48613a93cd2a3 IN  0x431dca8b2cce105bde47df6eaadc6c8b4dfd9eb70 CRO0.2606316124580
0x61fc25dd8935d5df04c3b7b8ad0776f6f1574fcc0e901b17360344ec9ae36539Approve55740512022-11-15 15:28:1115 days 15 hrs ago0xbd5404c5a7d1dd52d406b309804dd139515b7c6a IN  0x431dca8b2cce105bde47df6eaadc6c8b4dfd9eb70 CRO0.2606346324760
0xfab861907fb18df35f8980fd7c905c30fb4468f9bd9cb767495a84aeff1ada5eApprove55733632022-11-15 14:22:5815 days 16 hrs ago0x1c8d00ce6763c0c9a24b4f56346bdfac3a0733f7 IN  0x431dca8b2cce105bde47df6eaadc6c8b4dfd9eb70 CRO0.2606362886280
0x28a68e9ba36ca64cfa9eb7173707eab51acda5ac0fcf55de713034724c2f8c5dApprove55713172022-11-15 11:08:5815 days 19 hrs ago0xb3f8fbee560eba087b29010fb1c2f150b895c3ed IN  0x431dca8b2cce105bde47df6eaadc6c8b4dfd9eb70 CRO0.260641324130
0xe6a6d72ba8ab678ea06221d54e81eb7d1fa28dba70276dc34272cc5ad13f4bfeApprove55657162022-11-15 2:17:1916 days 4 hrs ago0x68ae0451f9bc93079d3687e54c3a3fe21b2d109c IN  0x431dca8b2cce105bde47df6eaadc6c8b4dfd9eb70 CRO0.2606549619050
0x4f47b5d7d29196a3a66279c529eda109273b1100fa6d50b66adc2bcb7ae85519Approve55653552022-11-15 1:43:0216 days 5 hrs ago0x68ae0451f9bc93079d3687e54c3a3fe21b2d109c IN  0x431dca8b2cce105bde47df6eaadc6c8b4dfd9eb70 CRO0.2606558271090
0x86ea2317737b450cd885c9580bbb190201dc81ed62d55cbb9ac00fa00469f2b3Approve55653472022-11-15 1:42:1616 days 5 hrs ago0x68ae0451f9bc93079d3687e54c3a3fe21b2d109c IN  0x431dca8b2cce105bde47df6eaadc6c8b4dfd9eb70 CRO0.2605973361350
[ Download CSV Export 
Latest 25 internal transaction
Parent Txn Hash Block From To Value
0xf6cf1349ec1c9d2be2d6c073b196173b176418537d7d85fa95927cf82d65ef7c46007122022-09-12 15:31:1879 days 15 hrs ago 0x431dca8b2cce105bde47df6eaadc6c8b4dfd9eb7 Cronos: WCRO Token6,000 CRO
0xaea12927e377e0d8c8967f3d0f6dcd052a5f04dbefe62a772b5009b2da2f635a46006932022-09-12 15:29:3079 days 15 hrs ago 0x431dca8b2cce105bde47df6eaadc6c8b4dfd9eb7 Cronos: WCRO Token3,000 CRO
0xcd2171f8fcd7a76c5c34731a1463b9a83493cc7fe4384361c1b25ad76aaef37a46006822022-09-12 15:28:2779 days 15 hrs ago 0x431dca8b2cce105bde47df6eaadc6c8b4dfd9eb7 Cronos: WCRO Token9,000 CRO
0xb2fce9910ab36706fa4aca791868c09d0c7fcc8ae7ecfdc9af785dcf52d4f24e46006472022-09-12 15:25:0979 days 15 hrs ago 0x431dca8b2cce105bde47df6eaadc6c8b4dfd9eb7 Cronos: WCRO Token7,500 CRO
0x7775f474ce259bf4bea969748942242c84c8c708076c3c5c6994575a035aed5646004252022-09-12 15:04:1079 days 15 hrs ago 0x431dca8b2cce105bde47df6eaadc6c8b4dfd9eb7 Cronos: WCRO Token1,500 CRO
0x5bd88bd2d61e1d33709fbfd7c17a155165e6ae073b54f631da7e66d372bd0a5d46004182022-09-12 15:03:3079 days 15 hrs ago 0x431dca8b2cce105bde47df6eaadc6c8b4dfd9eb7 Cronos: WCRO Token6,000 CRO
0xdb8b76366b922f605eb58b429fbbe39da0de0521779ab51a2619258e9c5bb68545999332022-09-12 14:17:3979 days 16 hrs ago 0x431dca8b2cce105bde47df6eaadc6c8b4dfd9eb7 Cronos: WCRO Token500 CRO
0x4508cd7307916f6c9c7eb3e32ece86cb0f7d96c12e48d3e5bfd4294336e903c945998912022-09-12 14:13:4179 days 16 hrs ago 0x431dca8b2cce105bde47df6eaadc6c8b4dfd9eb7 Cronos: WCRO Token500 CRO
0x92777fb29b6d047ae742af9730802243a2b4c1c7932312bf65a6c797ce1c1f2f45997282022-09-12 13:58:1679 days 16 hrs ago 0x431dca8b2cce105bde47df6eaadc6c8b4dfd9eb7 Cronos: WCRO Token500 CRO
0xd2288c094cc88aaafb9e7dbb3c2296413258327767cd2e0ec4d7cbecd958954845996132022-09-12 13:47:2279 days 17 hrs ago 0x431dca8b2cce105bde47df6eaadc6c8b4dfd9eb7 Cronos: WCRO Token1,000 CRO
0x3c1d97d4e3061b91465e4964b01016568152740c98ae6542fa1fc75f184b75cb45995212022-09-12 13:38:4279 days 17 hrs ago 0x431dca8b2cce105bde47df6eaadc6c8b4dfd9eb7 Cronos: WCRO Token500 CRO
0x6fac6d3bbf933e392af5cc60a14379683b290d22be32c48a1ef118ab001d0cbe45993682022-09-12 13:24:1579 days 17 hrs ago 0x431dca8b2cce105bde47df6eaadc6c8b4dfd9eb7 Cronos: WCRO Token1,000 CRO
0xbe1524f07e429787d1e508d58e59f0bd00c5af97f9467d96c1a6ad4a334d1c8d45992902022-09-12 13:16:5479 days 17 hrs ago 0x431dca8b2cce105bde47df6eaadc6c8b4dfd9eb7 Cronos: WCRO Token500 CRO
0x2b6dc8437d4b66f8a625f313c9c92a93ead5d9b9e34a3fdc7f5fdbffcc76177945992662022-09-12 13:14:3879 days 17 hrs ago 0x431dca8b2cce105bde47df6eaadc6c8b4dfd9eb7 Cronos: WCRO Token500 CRO
0x1bbbbe4d3c0c8a53d7f613a403da3cb080a5cef5dc31ccc317b4af1318828e5945992562022-09-12 13:13:4279 days 17 hrs ago 0x431dca8b2cce105bde47df6eaadc6c8b4dfd9eb7 Cronos: WCRO Token500 CRO
0x81eb458ee8b00587ccd9f55f3a659901b35d8ede3ec266f7bef1a5c9311b233e45991622022-09-12 13:04:5179 days 17 hrs ago 0x431dca8b2cce105bde47df6eaadc6c8b4dfd9eb7 Cronos: WCRO Token500 CRO
0x2ce2fa29c739e127ac4c7cdf35d89297c34ace5ff873a1c2042e442855bd9cfb45990572022-09-12 12:54:5579 days 18 hrs ago 0x431dca8b2cce105bde47df6eaadc6c8b4dfd9eb7 Cronos: WCRO Token500 CRO
0x8a3efaa1a2b57b5e25f833b2f71d74b3bf196415e3a950f9c8a40eda8f74109945989742022-09-12 12:47:0779 days 18 hrs ago 0x431dca8b2cce105bde47df6eaadc6c8b4dfd9eb7 Cronos: WCRO Token500 CRO
0x9fb550c7bd7726df739c19ca5abae4e936b46e5acb57a24209ad1577a77e6e8e45989112022-09-12 12:41:1079 days 18 hrs ago 0x431dca8b2cce105bde47df6eaadc6c8b4dfd9eb7 Cronos: WCRO Token1,000 CRO
0xdd26c30903648f2e53987682540b422d813701ac7123c250581d46ae275861b945988052022-09-12 12:31:1279 days 18 hrs ago 0x431dca8b2cce105bde47df6eaadc6c8b4dfd9eb7 Cronos: WCRO Token500 CRO
0x7d494210140c988e6b1f776e8973db690f680ce09838c6123cc0fc5f97e77deb45986482022-09-12 12:16:2179 days 18 hrs ago 0x431dca8b2cce105bde47df6eaadc6c8b4dfd9eb7 Cronos: WCRO Token500 CRO
0x454c84c6f118ec882e7ac90a7952a15236979100231aca448c0c20fa90a9f60445981752022-09-12 11:31:4079 days 19 hrs ago 0x431dca8b2cce105bde47df6eaadc6c8b4dfd9eb7 Cronos: WCRO Token500 CRO
0x2ac50706ebebd40715e367366394d10238c34c22e4d50a9de0b04b21c85a26a545977342022-09-12 10:50:0679 days 20 hrs ago 0x431dca8b2cce105bde47df6eaadc6c8b4dfd9eb7 Cronos: WCRO Token500 CRO
0x0bc4296962ce83648ff563e1b08e98adb984bd49fdf00749c68aec4982f4dd9745977062022-09-12 10:47:2779 days 20 hrs ago 0x431dca8b2cce105bde47df6eaadc6c8b4dfd9eb7 Cronos: WCRO Token500 CRO
0x6e3734e052c7a8a11427ef73f06b68090350ce34bf546bd88da61f8ee540381c45976862022-09-12 10:45:3379 days 20 hrs ago 0x431dca8b2cce105bde47df6eaadc6c8b4dfd9eb7 Cronos: WCRO Token500 CRO
[ Download CSV Export 
Loading

Contract Source Code Verified (Exact Match)

Contract Name:
CROSEANFT

Compiler Version
v0.8.15+commit.e14f2714

Optimization Enabled:
Yes with 200 runs

Other Settings:
default evmVersion, None license

Contract Source Code (Solidity)

/**
 *Submitted for verification at cronoscan.com on 2022-08-21
*/

pragma solidity 0.8.15;
interface IERC20 {
    /**
     * @dev Returns the amount of tokens in existence.
     */
    function totalSupply() external view returns (uint256);
 
    /**
     * @dev Returns the amount of tokens owned by `account`.
     */
    function balanceOf(address account) external view returns (uint256);
 
    /**
     * @dev Moves `amount` tokens from the caller's account to `to`.
     *
     * Returns a boolean value indicating whether the operation succeeded.
     *
     * Emits a {Transfer} event.
     */
    function transfer(address to, uint256 amount) external returns (bool);
 
    /**
     * @dev Returns the remaining number of tokens that `spender` will be
     * allowed to spend on behalf of `owner` through {transferFrom}. This is
     * zero by default.
     *
     * This value changes when {approve} or {transferFrom} are called.
     */
    function allowance(address owner, address spender)
        external
        view
        returns (uint256);
 
    /**
     * @dev Sets `amount` as the allowance of `spender` over the caller's tokens.
     *
     * Returns a boolean value indicating whether the operation succeeded.
     *
     * IMPORTANT: Beware that changing an allowance with this method brings the risk
     * that someone may use both the old and the new allowance by unfortunate
     * transaction ordering. One possible solution to mitigate this race
     * condition is to first reduce the spender's allowance to 0 and set the
     * desired value afterwards:
     * https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729
     *
     * Emits an {Approval} event.
     */
    function approve(address spender, uint256 amount) external returns (bool);
 
    /**
     * @dev Moves `amount` tokens from `from` to `to` using the
     * allowance mechanism. `amount` is then deducted from the caller's
     * allowance.
     *
     * Returns a boolean value indicating whether the operation succeeded.
     *
     * Emits a {Transfer} event.
     */
    function transferFrom(
        address from,
        address to,
        uint256 amount
    ) external returns (bool);
 
    /**
     * @dev Emitted when `value` tokens are moved from one account (`from`) to
     * another (`to`).
     *
     * Note that `value` may be zero.
     */
    event Transfer(address indexed from, address indexed to, uint256 value);
 
    /**
     * @dev Emitted when the allowance of a `spender` for an `owner` is set by
     * a call to {approve}. `value` is the new allowance.
     */
    event Approval(
        address indexed owner,
        address indexed spender,
        uint256 value
    );
}
interface IWETH {
    function deposit() external payable;
    function withdraw(uint) external;
}
library SafeERC20 {
    using Address for address;

    function safeTransfer(IERC20 token, address to, uint256 value) internal {
        _callOptionalReturn(token, abi.encodeWithSelector(token.transfer.selector, to, value));
    }

    function safeTransferFrom(IERC20 token, address from, address to, uint256 value) internal {
        _callOptionalReturn(token, abi.encodeWithSelector(token.transferFrom.selector, from, to, value));
    }

    /**
     * @dev Deprecated. This function has issues similar to the ones found in
     * {IERC20-approve}, and its usage is discouraged.
     *
     * Whenever possible, use {safeIncreaseAllowance} and
     * {safeDecreaseAllowance} instead.
     */
    function safeApprove(IERC20 token, address spender, uint256 value) internal {
        // safeApprove should only be called when setting an initial allowance,
        // or when resetting it to zero. To increase and decrease it, use
        // 'safeIncreaseAllowance' and 'safeDecreaseAllowance'
        // solhint-disable-next-line max-line-length
        require((value == 0) || (token.allowance(address(this), spender) == 0),
            "SafeERC20: approve from non-zero to non-zero allowance"
        );
        _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, value));
    }

    function safeIncreaseAllowance(IERC20 token, address spender, uint256 value) internal {
        uint256 newAllowance = token.allowance(address(this), spender) + value;
        _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, newAllowance));
    }

    function safeDecreaseAllowance(IERC20 token, address spender, uint256 value) internal {
    unchecked {
        uint256 oldAllowance = token.allowance(address(this), spender);
        require(oldAllowance >= value, "SafeERC20: decreased allowance below zero");
        uint256 newAllowance = oldAllowance - value;
        _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, newAllowance));
    }
    }

    /**
     * @dev Imitates a Solidity high-level call (i.e. a regular function call to a contract), relaxing the requirement
     * on the return value: the return value is optional (but if data is returned, it must not be false).
     * @param token The token targeted by the call.
     * @param data The call data (encoded using abi.encode or one of its variants).
     */
    function _callOptionalReturn(IERC20 token, bytes memory data) private {
        // We need to perform a low level call here, to bypass Solidity's return data size checking mechanism, since
        // we're implementing it ourselves. We use {Address.functionCall} to perform this call, which verifies that
        // the target address contains contract code and also asserts for success in the low-level call.

        bytes memory returndata = address(token).functionCall(data, "SafeERC20: low-level call failed");
        if (returndata.length > 0) { // Return data is optional
            // solhint-disable-next-line max-line-length
            require(abi.decode(returndata, (bool)), "SafeERC20: ERC20 operation did not succeed");
        }
    }
}
library SafeMath {
    /**
     * @dev Returns the addition of two unsigned integers, with an overflow flag.
     *
     * _Available since v3.4._
     */
    function tryAdd(uint256 a, uint256 b)
        internal
        pure
        returns (bool, uint256)
    {
        unchecked {
            uint256 c = a + b;
            if (c < a) return (false, 0);
            return (true, c);
        }
    }
 
    /**
     * @dev Returns the substraction of two unsigned integers, with an overflow flag.
     *
     * _Available since v3.4._
     */
    function trySub(uint256 a, uint256 b)
        internal
        pure
        returns (bool, uint256)
    {
        unchecked {
            if (b > a) return (false, 0);
            return (true, a - b);
        }
    }
 
    /**
     * @dev Returns the multiplication of two unsigned integers, with an overflow flag.
     *
     * _Available since v3.4._
     */
    function tryMul(uint256 a, uint256 b)
        internal
        pure
        returns (bool, uint256)
    {
        unchecked {
            // Gas optimization: this is cheaper than requiring 'a' not being zero, but the
            // benefit is lost if 'b' is also tested.
            // See: https://github.com/OpenZeppelin/openzeppelin-contracts/pull/522
            if (a == 0) return (true, 0);
            uint256 c = a * b;
            if (c / a != b) return (false, 0);
            return (true, c);
        }
    }
 
    /**
     * @dev Returns the division of two unsigned integers, with a division by zero flag.
     *
     * _Available since v3.4._
     */
    function tryDiv(uint256 a, uint256 b)
        internal
        pure
        returns (bool, uint256)
    {
        unchecked {
            if (b == 0) return (false, 0);
            return (true, a / b);
        }
    }
 
    /**
     * @dev Returns the remainder of dividing two unsigned integers, with a division by zero flag.
     *
     * _Available since v3.4._
     */
    function tryMod(uint256 a, uint256 b)
        internal
        pure
        returns (bool, uint256)
    {
        unchecked {
            if (b == 0) return (false, 0);
            return (true, a % b);
        }
    }
 
    /**
     * @dev Returns the addition of two unsigned integers, reverting on
     * overflow.
     *
     * Counterpart to Solidity's `+` operator.
     *
     * Requirements:
     *
     * - Addition cannot overflow.
     */
    function add(uint256 a, uint256 b) internal pure returns (uint256) {
        return a + b;
    }
 
    /**
     * @dev Returns the subtraction of two unsigned integers, reverting on
     * overflow (when the result is negative).
     *
     * Counterpart to Solidity's `-` operator.
     *
     * Requirements:
     *
     * - Subtraction cannot overflow.
     */
    function sub(uint256 a, uint256 b) internal pure returns (uint256) {
        return a - b;
    }
 
    /**
     * @dev Returns the multiplication of two unsigned integers, reverting on
     * overflow.
     *
     * Counterpart to Solidity's `*` operator.
     *
     * Requirements:
     *
     * - Multiplication cannot overflow.
     */
    function mul(uint256 a, uint256 b) internal pure returns (uint256) {
        return a * b;
    }
 
    /**
     * @dev Returns the integer division of two unsigned integers, reverting on
     * division by zero. The result is rounded towards zero.
     *
     * Counterpart to Solidity's `/` operator.
     *
     * Requirements:
     *
     * - The divisor cannot be zero.
     */
    function div(uint256 a, uint256 b) internal pure returns (uint256) {
        return a / b;
    }
 
    /**
     * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo),
     * reverting when dividing by zero.
     *
     * Counterpart to Solidity's `%` operator. This function uses a `revert`
     * opcode (which leaves remaining gas untouched) while Solidity uses an
     * invalid opcode to revert (consuming all remaining gas).
     *
     * Requirements:
     *
     * - The divisor cannot be zero.
     */
    function mod(uint256 a, uint256 b) internal pure returns (uint256) {
        return a % b;
    }
 
    /**
     * @dev Returns the subtraction of two unsigned integers, reverting with custom message on
     * overflow (when the result is negative).
     *
     * CAUTION: This function is deprecated because it requires allocating memory for the error
     * message unnecessarily. For custom revert reasons use {trySub}.
     *
     * Counterpart to Solidity's `-` operator.
     *
     * Requirements:
     *
     * - Subtraction cannot overflow.
     */
    function sub(
        uint256 a,
        uint256 b,
        string memory errorMessage
    ) internal pure returns (uint256) {
        unchecked {
            require(b <= a, errorMessage);
            return a - b;
        }
    }
 
    /**
     * @dev Returns the integer division of two unsigned integers, reverting with custom message on
     * division by zero. The result is rounded towards zero.
     *
     * Counterpart to Solidity's `/` operator. Note: this function uses a
     * `revert` opcode (which leaves remaining gas untouched) while Solidity
     * uses an invalid opcode to revert (consuming all remaining gas).
     *
     * Requirements:
     *
     * - The divisor cannot be zero.
     */
    function div(
        uint256 a,
        uint256 b,
        string memory errorMessage
    ) internal pure returns (uint256) {
        unchecked {
            require(b > 0, errorMessage);
            return a / b;
        }
    }
 
    /**
     * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo),
     * reverting with custom message when dividing by zero.
     *
     * CAUTION: This function is deprecated because it requires allocating memory for the error
     * message unnecessarily. For custom revert reasons use {tryMod}.
     *
     * Counterpart to Solidity's `%` operator. This function uses a `revert`
     * opcode (which leaves remaining gas untouched) while Solidity uses an
     * invalid opcode to revert (consuming all remaining gas).
     *
     * Requirements:
     *
     * - The divisor cannot be zero.
     */
    function mod(
        uint256 a,
        uint256 b,
        string memory errorMessage
    ) internal pure returns (uint256) {
        unchecked {
            require(b > 0, errorMessage);
            return a % b;
        }
    }
}
library Strings {
    bytes16 private constant _HEX_SYMBOLS = "0123456789abcdef";
 
    /**
     * @dev Converts a `uint256` to its ASCII `string` decimal representation.
     */
    function toString(uint256 value) internal pure returns (string memory) {
        // Inspired by OraclizeAPI's implementation - MIT licence
        // https://github.com/oraclize/ethereum-api/blob/b42146b063c7d6ee1358846c198246239e9360e8/oraclizeAPI_0.4.25.sol
 
        if (value == 0) {
            return "0";
        }
        uint256 temp = value;
        uint256 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);
    }
 
    /**
     * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation.
     */
    function toHexString(uint256 value) internal pure returns (string memory) {
        if (value == 0) {
            return "0x00";
        }
        uint256 temp = value;
        uint256 length = 0;
        while (temp != 0) {
            length++;
            temp >>= 8;
        }
        return toHexString(value, length);
    }
 
    /**
     * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation with fixed length.
     */
    function toHexString(uint256 value, uint256 length)
        internal
        pure
        returns (string memory)
    {
        bytes memory buffer = new bytes(2 * length + 2);
        buffer[0] = "0";
        buffer[1] = "x";
        for (uint256 i = 2 * length + 1; i > 1; --i) {
            buffer[i] = _HEX_SYMBOLS[value & 0xf];
            value >>= 4;
        }
        require(value == 0, "Strings: hex length insufficient");
        return string(buffer);
    }
}
abstract contract Context {
    function _msgSender() internal view virtual returns (address) {
        return msg.sender;
    }
 
    function _msgData() internal view virtual returns (bytes calldata) {
        return msg.data;
    }
}
abstract contract Ownable is Context {
    address private _owner;
 
    event OwnershipTransferred(
        address indexed previousOwner,
        address indexed newOwner
    );
 
    /**
     * @dev Initializes the contract setting the deployer as the initial owner.
     */
    constructor() {
        _transferOwnership(_msgSender());
    }
 
    /**
     * @dev Returns the address of the current owner.
     */
    function owner() public view virtual returns (address) {
        return _owner;
    }
 
    /**
     * @dev Throws if called by any account other than the owner.
     */
    modifier onlyOwner() {
        require(owner() == _msgSender(), "Ownable: caller is not the owner");
        _;
    }
 
    /**
     * @dev Leaves the contract without owner. It will not be possible to call
     * `onlyOwner` functions anymore. Can only be called by the current owner.
     *
     * NOTE: Renouncing ownership will leave the contract without an owner,
     * thereby removing any functionality that is only available to the owner.
     */
    function renounceOwnership() public virtual onlyOwner {
        _transferOwnership(address(0));
    }
 
    /**
     * @dev Transfers ownership of the contract to a new account (`newOwner`).
     * Can only be called by the current owner.
     */
    function transferOwnership(address newOwner) public virtual onlyOwner {
        require(
            newOwner != address(0),
            "Ownable: new owner is the zero address"
        );
        _transferOwnership(newOwner);
    }
 
    /**
     * @dev Transfers ownership of the contract to a new account (`newOwner`).
     * Internal function without access restriction.
     */
    function _transferOwnership(address newOwner) internal virtual {
        address oldOwner = _owner;
        _owner = newOwner;
        emit OwnershipTransferred(oldOwner, newOwner);
    }
}
library Address {
    /**
     * @dev Returns true if `account` is a contract.
     *
     * [IMPORTANT]
     * ====
     * It is unsafe to assume that an address for which this function returns
     * false is an externally-owned account (EOA) and not a contract.
     *
     * Among others, `isContract` will return false for the following
     * types of addresses:
     *
     *  - an externally-owned account
     *  - a contract in construction
     *  - an address where a contract will be created
     *  - an address where a contract lived, but was destroyed
     * ====
     *
     * [IMPORTANT]
     * ====
     * You shouldn't rely on `isContract` to protect against flash loan attacks!
     *
     * Preventing calls from contracts is highly discouraged. It breaks composability, breaks support for smart wallets
     * like Gnosis Safe, and does not provide security since it can be circumvented by calling from a contract
     * constructor.
     * ====
     */
    function isContract(address account) internal view returns (bool) {
        // This method relies on extcodesize/address.code.length, which returns 0
        // for contracts in construction, since the code is only stored at the end
        // of the constructor execution.
 
        return account.code.length > 0;
    }
 
    /**
     * @dev Replacement for Solidity's `transfer`: sends `amount` wei to
     * `recipient`, forwarding all available gas and reverting on errors.
     *
     * https://eips.ethereum.org/EIPS/eip-1884[EIP1884] increases the gas cost
     * of certain opcodes, possibly making contracts go over the 2300 gas limit
     * imposed by `transfer`, making them unable to receive funds via
     * `transfer`. {sendValue} removes this limitation.
     *
     * https://diligence.consensys.net/posts/2019/09/stop-using-soliditys-transfer-now/[Learn more].
     *
     * IMPORTANT: because control is transferred to `recipient`, care must be
     * taken to not create reentrancy vulnerabilities. Consider using
     * {ReentrancyGuard} or the
     * https://solidity.readthedocs.io/en/v0.5.11/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern].
     */
    function sendValue(address payable recipient, uint256 amount) internal {
        require(
            address(this).balance >= amount,
            "Address: insufficient balance"
        );
 
        (bool success, ) = recipient.call{value: amount}("");
        require(
            success,
            "Address: unable to send value, recipient may have reverted"
        );
    }
 
    /**
     * @dev Performs a Solidity function call using a low level `call`. A
     * plain `call` is an unsafe replacement for a function call: use this
     * function instead.
     *
     * If `target` reverts with a revert reason, it is bubbled up by this
     * function (like regular Solidity function calls).
     *
     * Returns the raw returned data. To convert to the expected return value,
     * use https://solidity.readthedocs.io/en/latest/units-and-global-variables.html?highlight=abi.decode#abi-encoding-and-decoding-functions[`abi.decode`].
     *
     * Requirements:
     *
     * - `target` must be a contract.
     * - calling `target` with `data` must not revert.
     *
     * _Available since v3.1._
     */
    function functionCall(address target, bytes memory data)
        internal
        returns (bytes memory)
    {
        return functionCall(target, data, "Address: low-level call failed");
    }
 
    /**
     * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], but with
     * `errorMessage` as a fallback revert reason when `target` reverts.
     *
     * _Available since v3.1._
     */
    function functionCall(
        address target,
        bytes memory data,
        string memory errorMessage
    ) internal returns (bytes memory) {
        return functionCallWithValue(target, data, 0, errorMessage);
    }
 
    /**
     * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],
     * but also transferring `value` wei to `target`.
     *
     * Requirements:
     *
     * - the calling contract must have an ETH balance of at least `value`.
     * - the called Solidity function must be `payable`.
     *
     * _Available since v3.1._
     */
    function functionCallWithValue(
        address target,
        bytes memory data,
        uint256 value
    ) internal returns (bytes memory) {
        return
            functionCallWithValue(
                target,
                data,
                value,
                "Address: low-level call with value failed"
            );
    }
 
    /**
     * @dev Same as {xref-Address-functionCallWithValue-address-bytes-uint256-}[`functionCallWithValue`], but
     * with `errorMessage` as a fallback revert reason when `target` reverts.
     *
     * _Available since v3.1._
     */
    function functionCallWithValue(
        address target,
        bytes memory data,
        uint256 value,
        string memory errorMessage
    ) internal returns (bytes memory) {
        require(
            address(this).balance >= value,
            "Address: insufficient balance for call"
        );
        require(isContract(target), "Address: call to non-contract");
 
        (bool success, bytes memory returndata) = target.call{value: value}(
            data
        );
        return verifyCallResult(success, returndata, errorMessage);
    }
 
    /**
     * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],
     * but performing a static call.
     *
     * _Available since v3.3._
     */
    function functionStaticCall(address target, bytes memory data)
        internal
        view
        returns (bytes memory)
    {
        return
            functionStaticCall(
                target,
                data,
                "Address: low-level static call failed"
            );
    }
 
    /**
     * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`],
     * but performing a static call.
     *
     * _Available since v3.3._
     */
    function functionStaticCall(
        address target,
        bytes memory data,
        string memory errorMessage
    ) internal view returns (bytes memory) {
        require(isContract(target), "Address: static call to non-contract");
 
        (bool success, bytes memory returndata) = target.staticcall(data);
        return verifyCallResult(success, returndata, errorMessage);
    }
 
    /**
     * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],
     * but performing a delegate call.
     *
     * _Available since v3.4._
     */
    function functionDelegateCall(address target, bytes memory data)
        internal
        returns (bytes memory)
    {
        return
            functionDelegateCall(
                target,
                data,
                "Address: low-level delegate call failed"
            );
    }
 
    /**
     * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`],
     * but performing a delegate call.
     *
     * _Available since v3.4._
     */
    function functionDelegateCall(
        address target,
        bytes memory data,
        string memory errorMessage
    ) internal returns (bytes memory) {
        require(isContract(target), "Address: delegate call to non-contract");
 
        (bool success, bytes memory returndata) = target.delegatecall(data);
        return verifyCallResult(success, returndata, errorMessage);
    }
 
    /**
     * @dev Tool to verifies that a low level call was successful, and revert if it wasn't, either by bubbling the
     * revert reason using the provided one.
     *
     * _Available since v4.3._
     */
    function verifyCallResult(
        bool success,
        bytes memory returndata,
        string memory errorMessage
    ) internal pure returns (bytes memory) {
        if (success) {
            return returndata;
        } else {
            // Look for revert reason and bubble it up if present
            if (returndata.length > 0) {
                // The easiest way to bubble the revert reason is using memory via assembly
 
                assembly {
                    let returndata_size := mload(returndata)
                    revert(add(32, returndata), returndata_size)
                }
            } else {
                revert(errorMessage);
            }
        }
    }
}
interface IERC721Receiver {
    /**
     * @dev Whenever an {IERC721} `tokenId` token is transferred to this contract via {IERC721-safeTransferFrom}
     * by `operator` from `from`, this function is called.
     *
     * It must return its Solidity selector to confirm the token transfer.
     * If any other value is returned or the interface is not implemented by the recipient, the transfer will be reverted.
     *
     * The selector can be obtained in Solidity with `IERC721.onERC721Received.selector`.
     */
    function onERC721Received(
        address operator,
        address from,
        uint256 tokenId,
        bytes calldata data
    ) external returns (bytes4);
}
interface IERC165 {
    /**
     * @dev Returns true if this contract implements the interface defined by
     * `interfaceId`. See the corresponding
     * https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified[EIP section]
     * to learn more about how these ids are created.
     *
     * This function call must use less than 30 000 gas.
     */
    function supportsInterface(bytes4 interfaceId) external view returns (bool);
}
abstract contract ERC165 is IERC165 {
    /**
     * @dev See {IERC165-supportsInterface}.
     */
    function supportsInterface(bytes4 interfaceId)
        public
        view
        virtual
        override
        returns (bool)
    {
        return interfaceId == type(IERC165).interfaceId;
    }
}
interface IERC721 is IERC165 {
    /**
     * @dev Emitted when `tokenId` token is transferred from `from` to `to`.
     */
    event Transfer(
        address indexed from,
        address indexed to,
        uint256 indexed tokenId
    );
 
    /**
     * @dev Emitted when `owner` enables `approved` to manage the `tokenId` token.
     */
    event Approval(
        address indexed owner,
        address indexed approved,
        uint256 indexed tokenId
    );
 
    /**
     * @dev Emitted when `owner` enables or disables (`approved`) `operator` to manage all of its assets.
     */
    event ApprovalForAll(
        address indexed owner,
        address indexed operator,
        bool approved
    );
 
    /**
     * @dev Returns the number of tokens in ``owner``'s account.
     */
    function balanceOf(address owner) external view returns (uint256 balance);
 
    /**
     * @dev Returns the owner of the `tokenId` token.
     *
     * Requirements:
     *
     * - `tokenId` must exist.
     */
    function ownerOf(uint256 tokenId) external view returns (address owner);
 
    /**
     * @dev Safely transfers `tokenId` token from `from` to `to`, checking first that contract recipients
     * are aware of the ERC721 protocol to prevent tokens from being forever locked.
     *
     * Requirements:
     *
     * - `from` cannot be the zero address.
     * - `to` cannot be the zero address.
     * - `tokenId` token must exist and be owned by `from`.
     * - If the caller is not `from`, it must be have been allowed to move this token by either {approve} or {setApprovalForAll}.
     * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer.
     *
     * Emits a {Transfer} event.
     */
    function safeTransferFrom(
        address from,
        address to,
        uint256 tokenId
    ) external;
 
    /**
     * @dev Transfers `tokenId` token from `from` to `to`.
     *
     * WARNING: Usage of this method is discouraged, use {safeTransferFrom} whenever possible.
     *
     * Requirements:
     *
     * - `from` cannot be the zero address.
     * - `to` cannot be the zero address.
     * - `tokenId` token must be owned by `from`.
     * - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}.
     *
     * Emits a {Transfer} event.
     */
    function transferFrom(
        address from,
        address to,
        uint256 tokenId
    ) external;
 
    /**
     * @dev Gives permission to `to` to transfer `tokenId` token to another account.
     * The approval is cleared when the token is transferred.
     *
     * Only a single account can be approved at a time, so approving the zero address clears previous approvals.
     *
     * Requirements:
     *
     * - The caller must own the token or be an approved operator.
     * - `tokenId` must exist.
     *
     * Emits an {Approval} event.
     */
    function approve(address to, uint256 tokenId) external;
 
    /**
     * @dev Returns the account approved for `tokenId` token.
     *
     * Requirements:
     *
     * - `tokenId` must exist.
     */
    function getApproved(uint256 tokenId)
        external
        view
        returns (address operator);
 
    /**
     * @dev Approve or remove `operator` as an operator for the caller.
     * Operators can call {transferFrom} or {safeTransferFrom} for any token owned by the caller.
     *
     * Requirements:
     *
     * - The `operator` cannot be the caller.
     *
     * Emits an {ApprovalForAll} event.
     */
    function setApprovalForAll(address operator, bool _approved) external;
 
    /**
     * @dev Returns if the `operator` is allowed to manage all of the assets of `owner`.
     *
     * See {setApprovalForAll}
     */
    function isApprovedForAll(address owner, address operator)
        external
        view
        returns (bool);
 
    /**
     * @dev Safely transfers `tokenId` token from `from` to `to`.
     *
     * Requirements:
     *
     * - `from` cannot be the zero address.
     * - `to` cannot be the zero address.
     * - `tokenId` token must exist and be owned by `from`.
     * - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}.
     * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer.
     *
     * Emits a {Transfer} event.
     */
    function safeTransferFrom(
        address from,
        address to,
        uint256 tokenId,
        bytes calldata data
    ) external;
}
interface IERC721Enumerable is IERC721 {
    /**
     * @dev Returns the total amount of tokens stored by the contract.
     */
    function totalSupply() external view returns (uint256);
 
    /**
     * @dev Returns a token ID owned by `owner` at a given `index` of its token list.
     * Use along with {balanceOf} to enumerate all of ``owner``'s tokens.
     */
    function tokenOfOwnerByIndex(address owner, uint256 index)
        external
        view
        returns (uint256);
 
    /**
     * @dev Returns a token ID at a given `index` of all the tokens stored by the contract.
     * Use along with {totalSupply} to enumerate all tokens.
     */
    function tokenByIndex(uint256 index) external view returns (uint256);
}
interface IUniswapV2Pair {
   event Approval(address indexed owner, address indexed spender, uint value);
   event Transfer(address indexed from, address indexed to, uint value);
 
   function name() external pure returns (string memory);
   function symbol() external pure returns (string memory);
   function decimals() external pure returns (uint8);
   function totalSupply() external view returns (uint);
   function balanceOf(address owner) external view returns (uint);
   function allowance(address owner, address spender) external view returns (uint);
 
   function approve(address spender, uint value) external returns (bool);
   function transfer(address to, uint value) external returns (bool);
   function transferFrom(address from, address to, uint value) external returns (bool);
 
   function DOMAIN_SEPARATOR() external view returns (bytes32);
   function PERMIT_TYPEHASH() external pure returns (bytes32);
   function nonces(address owner) external view returns (uint);
 
   function permit(address owner, address spender, uint value, uint deadline, uint8 v, bytes32 r, bytes32 s) external;
 
   event Mint(address indexed sender, uint amount0, uint amount1);
   event Burn(address indexed sender, uint amount0, uint amount1, address indexed to);
   event Swap(
       address indexed sender,
       uint amount0In,
       uint amount1In,
       uint amount0Out,
       uint amount1Out,
       address indexed to
   );
   event Sync(uint112 reserve0, uint112 reserve1);
 
   function MINIMUM_LIQUIDITY() external pure returns (uint);
   function factory() external view returns (address);
   function token0() external view returns (address);
   function token1() external view returns (address);
   function getReserves() external view returns (uint112 reserve0, uint112 reserve1, uint32 blockTimestampLast);
   function price0CumulativeLast() external view returns (uint);
   function price1CumulativeLast() external view returns (uint);
   function kLast() external view returns (uint);
 
   function mint(address to) external returns (uint liquidity);
   function burn(address to) external returns (uint amount0, uint amount1);
   function swap(uint amount0Out, uint amount1Out, address to, bytes calldata data) external;
   function skim(address to) external;
   function sync() external;
 
   function initialize(address, address) external;
}
interface IUniswapV2Factory {
   event PairCreated(address indexed token0, address indexed token1, address pair, uint);
 
   function feeTo() external view returns (address);
   function feeToSetter() external view returns (address);
 
   function getPair(address tokenA, address tokenB) external view returns (address pair);
   function allPairs(uint) external view returns (address pair);
   function allPairsLength() external view returns (uint);
 
   function createPair(address tokenA, address tokenB) external returns (address pair);
 
   function setFeeTo(address) external;
   function setFeeToSetter(address) external;
}
interface IUniswapV2Router01 {
   function factory() external pure returns (address);
   function WETH() external pure returns (address);
 
   function addLiquidity(
       address tokenA,
       address tokenB,
       uint amountADesired,
       uint amountBDesired,
       uint amountAMin,
       uint amountBMin,
       address to,
       uint deadline
   ) external returns (uint amountA, uint amountB, uint liquidity);
   function addLiquidityETH(
       address token,
       uint amountTokenDesired,
       uint amountTokenMin,
       uint amountETHMin,
       address to,
       uint deadline
   ) external payable returns (uint amountToken, uint amountETH, uint liquidity);
   function removeLiquidity(
       address tokenA,
       address tokenB,
       uint liquidity,
       uint amountAMin,
       uint amountBMin,
       address to,
       uint deadline
   ) external returns (uint amountA, uint amountB);
   function removeLiquidityETH(
       address token,
       uint liquidity,
       uint amountTokenMin,
       uint amountETHMin,
       address to,
       uint deadline
   ) external returns (uint amountToken, uint amountETH);
   function removeLiquidityWithPermit(
       address tokenA,
       address tokenB,
       uint liquidity,
       uint amountAMin,
       uint amountBMin,
       address to,
       uint deadline,
       bool approveMax, uint8 v, bytes32 r, bytes32 s
   ) external returns (uint amountA, uint amountB);
   function removeLiquidityETHWithPermit(
       address token,
       uint liquidity,
       uint amountTokenMin,
       uint amountETHMin,
       address to,
       uint deadline,
       bool approveMax, uint8 v, bytes32 r, bytes32 s
   ) external returns (uint amountToken, uint amountETH);
   function swapExactTokensForTokens(
       uint amountIn,
       uint amountOutMin,
       address[] calldata path,
       address to,
       uint deadline
   ) external returns (uint[] memory amounts);
   function swapTokensForExactTokens(
       uint amountOut,
       uint amountInMax,
       address[] calldata path,
       address to,
       uint deadline
   ) external returns (uint[] memory amounts);
   function swapExactETHForTokens(uint amountOutMin, address[] calldata path, address to, uint deadline)
       external
       payable
       returns (uint[] memory amounts);
   function swapTokensForExactETH(uint amountOut, uint amountInMax, address[] calldata path, address to, uint deadline)
       external
       returns (uint[] memory amounts);
   function swapExactTokensForETH(uint amountIn, uint amountOutMin, address[] calldata path, address to, uint deadline)
       external
       returns (uint[] memory amounts);
   function swapETHForExactTokens(uint amountOut, address[] calldata path, address to, uint deadline)
       external
       payable
       returns (uint[] memory amounts);
 
   function quote(uint amountA, uint reserveA, uint reserveB) external pure returns (uint amountB);
   function getAmountOut(uint amountIn, uint reserveIn, uint reserveOut) external pure returns (uint amountOut);
   function getAmountIn(uint amountOut, uint reserveIn, uint reserveOut) external pure returns (uint amountIn);
   function getAmountsOut(uint amountIn, address[] calldata path) external view returns (uint[] memory amounts);
   function getAmountsIn(uint amountOut, address[] calldata path) external view returns (uint[] memory amounts);
} 
interface IUniswapV2Router02 is IUniswapV2Router01 {
   function removeLiquidityETHSupportingFeeOnTransferTokens(
       address token,
       uint liquidity,
       uint amountTokenMin,
       uint amountETHMin,
       address to,
       uint deadline
   ) external returns (uint amountETH);
   function removeLiquidityETHWithPermitSupportingFeeOnTransferTokens(
       address token,
       uint liquidity,
       uint amountTokenMin,
       uint amountETHMin,
       address to,
       uint deadline,
       bool approveMax, uint8 v, bytes32 r, bytes32 s
   ) external returns (uint amountETH);
 
   function swapExactTokensForTokensSupportingFeeOnTransferTokens(
       uint amountIn,
       uint amountOutMin,
       address[] calldata path,
       address to,
       uint deadline
   ) external;
   function swapExactETHForTokensSupportingFeeOnTransferTokens(
       uint amountOutMin,
       address[] calldata path,
       address to,
       uint deadline
   ) external payable;
   function swapExactTokensForETHSupportingFeeOnTransferTokens(
       uint amountIn,
       uint amountOutMin,
       address[] calldata path,
       address to,
       uint deadline
   ) external;
}
interface IERC721Metadata is IERC721 {
    /**
     * @dev Returns the token collection name.
     */
    function name() external view returns (string memory);
 
    /**
     * @dev Returns the token collection symbol.
     */
    function symbol() external view returns (string memory);
 
    /**
     * @dev Returns the Uniform Resource Identifier (URI) for `tokenId` token.
     */
    function tokenURI(uint256 tokenId) external view returns (string memory);
} 
error ApprovalCallerNotOwnerNorApproved();
error ApprovalQueryForNonexistentToken();
error ApproveToCaller();
error ApprovalToCurrentOwner();
error BalanceQueryForZeroAddress();
error MintedQueryForZeroAddress();
error BurnedQueryForZeroAddress();
error MintToZeroAddress();
error MintZeroQuantity();
error OwnerIndexOutOfBounds();
error OwnerQueryForNonexistentToken();
error TokenIndexOutOfBounds();
error TransferCallerNotOwnerNorApproved();
error TransferFromIncorrectOwner();
error TransferToNonERC721ReceiverImplementer();
error TransferToZeroAddress();
error URIQueryForNonexistentToken();
contract ERC721A is
    Context,
    ERC165,
    IERC721,
    IERC721Metadata,
    IERC721Enumerable
{
    using Address for address;
    using Strings for uint256;
 
    // Compiler will pack this into a single 256bit word.
    struct TokenOwnership {
        // The address of the owner.
        address addr;
        // Keeps track of the start time of ownership with minimal overhead for tokenomics.
        uint64 startTimestamp;
        // Whether the token has been burned.
        bool burned;
    }
 
    // Compiler will pack this into a single 256bit word.
    struct AddressData {
        // Realistically, 2**64-1 is more than enough.
        uint64 balance;
        // Keeps track of mint count with minimal overhead for tokenomics.
        uint64 numberMinted;
        // Keeps track of burn count with minimal overhead for tokenomics.
        uint64 numberBurned;
    }
 
    // Compiler will pack the following
    // _currentIndex and _burnCounter into a single 256bit word.
 
    // The tokenId of the next token to be minted.
    uint128 internal _currentIndex = 1;
 
    // The number of tokens burned.
    uint128 internal _burnCounter;
 
    // Token name
    string private _name;
 
    // Token symbol
    string private _symbol;
 
    // Mapping from token ID to ownership details
    // An empty struct value does not necessarily mean the token is unowned. See ownershipOf implementation for details.
    mapping(uint256 => TokenOwnership) internal _ownerships;
 
    // Mapping owner address to address data
    mapping(address => AddressData) private _addressData;
 
    // Mapping from token ID to approved address
    mapping(uint256 => address) private _tokenApprovals;
 
    // Mapping from owner to operator approvals
    mapping(address => mapping(address => bool)) private _operatorApprovals;
 
    constructor(string memory name_, string memory symbol_) {
        _name = name_;
        _symbol = symbol_;
    }
 
    /**
     * @dev See {IERC721Enumerable-totalSupply}.
     */
    function totalSupply() public view override returns (uint256) {
        // Counter underflow is impossible as _burnCounter cannot be incremented
        // more than _currentIndex times
        unchecked {
            return (_currentIndex - 1) - _burnCounter;
        }
    }
 
    /**
     * @dev See {IERC721Enumerable-tokenByIndex}.
     * This read function is O(totalSupply). If calling from a separate contract, be sure to test gas first.
     * It may also degrade with extremely large collection sizes (e.g >> 10000), test for your use case.
     */
    function tokenByIndex(uint256 index)
        public
        view
        override
        returns (uint256)
    {
        uint256 numMintedSoFar = _currentIndex - 1;
        uint256 tokenIdsIdx;
 
        // Counter overflow is impossible as the loop breaks when
        // uint256 i is equal to another uint256 numMintedSoFar.
        unchecked {
            for (uint256 i; i < numMintedSoFar; i++) {
                TokenOwnership memory ownership = _ownerships[i];
                if (!ownership.burned) {
                    if (tokenIdsIdx == index) {
                        return i;
                    }
                    tokenIdsIdx++;
                }
            }
        }
        revert TokenIndexOutOfBounds();
    }
 
    /**
     * @dev See {IERC721Enumerable-tokenOfOwnerByIndex}.
     * This read function is O(totalSupply). If calling from a separate contract, be sure to test gas first.
     * It may also degrade with extremely large collection sizes (e.g >> 10000), test for your use case.
     */
    function tokenOfOwnerByIndex(address owner, uint256 index)
        public
        view
        override
        returns (uint256)
    {
        if (index >= balanceOf(owner)) revert OwnerIndexOutOfBounds();
        uint256 numMintedSoFar = _currentIndex;
        uint256 tokenIdsIdx;
        address currOwnershipAddr;
 
        // Counter overflow is impossible as the loop breaks when
        // uint256 i is equal to another uint256 numMintedSoFar.
        unchecked {
            for (uint256 i; i < numMintedSoFar; i++) {
                TokenOwnership memory ownership = _ownerships[i];
                if (ownership.burned) {
                    continue;
                }
                if (ownership.addr != address(0)) {
                    currOwnershipAddr = ownership.addr;
                }
                if (currOwnershipAddr == owner) {
                    if (tokenIdsIdx == index) {
                        return i;
                    }
                    tokenIdsIdx++;
                }
            }
        }
 
        // Execution should never reach this point.
        revert();
    }
 
    /**
     * @dev See {IERC165-supportsInterface}.
     */
    function supportsInterface(bytes4 interfaceId)
        public
        view
        virtual
        override(ERC165, IERC165)
        returns (bool)
    {
        return
            interfaceId == type(IERC721).interfaceId ||
            interfaceId == type(IERC721Metadata).interfaceId ||
            interfaceId == type(IERC721Enumerable).interfaceId ||
            super.supportsInterface(interfaceId);
    }
 
    /**
     * @dev See {IERC721-balanceOf}.
     */
    function balanceOf(address owner) public view override returns (uint256) {
        if (owner == address(0)) revert BalanceQueryForZeroAddress();
        return uint256(_addressData[owner].balance);
    }
 
    function _numberMinted(address owner) internal view returns (uint256) {
        if (owner == address(0)) revert MintedQueryForZeroAddress();
        return uint256(_addressData[owner].numberMinted);
    }
 
    function _numberBurned(address owner) internal view returns (uint256) {
        if (owner == address(0)) revert BurnedQueryForZeroAddress();
        return uint256(_addressData[owner].numberBurned);
    }
 
    /**
     * Gas spent here starts off proportional to the maximum mint batch size.
     * It gradually moves to O(1) as tokens get transferred around in the collection over time.
     */
    function ownershipOf(uint256 tokenId)
        internal
        view
        returns (TokenOwnership memory)
    {
        uint256 curr = tokenId;
 
        unchecked {
            if (curr < _currentIndex) {
                TokenOwnership memory ownership = _ownerships[curr];
                if (!ownership.burned) {
                    if (ownership.addr != address(0)) {
                        return ownership;
                    }
                    // Invariant:
                    // There will always be an ownership that has an address and is not burned
                    // before an ownership that does not have an address and is not burned.
                    // Hence, curr will not underflow.
                    while (true) {
                        curr--;
                        ownership = _ownerships[curr];
                        if (ownership.addr != address(0)) {
                            return ownership;
                        }
                    }
                }
            }
        }
        revert OwnerQueryForNonexistentToken();
    }
 
    /**
     * @dev See {IERC721-ownerOf}.
     */
    function ownerOf(uint256 tokenId) public view override returns (address) {
        return ownershipOf(tokenId).addr;
    }
 
    /**
     * @dev See {IERC721Metadata-name}.
     */
    function name() public view virtual override returns (string memory) {
        return _name;
    }
 
    /**
     * @dev See {IERC721Metadata-symbol}.
     */
    function symbol() public view virtual override returns (string memory) {
        return _symbol;
    }
 
    /**
     * @dev See {IERC721Metadata-tokenURI}.
     */
    function tokenURI(uint256 tokenId)
        public
        view
        virtual
        override
        returns (string memory)
    {
        if (!_exists(tokenId)) revert URIQueryForNonexistentToken();
 
        string memory baseURI = _baseURI();
        return
            bytes(baseURI).length != 0
                ? string(abi.encodePacked(baseURI, tokenId.toString()))
                : "";
    }
 
    /**
     * @dev Base URI for computing {tokenURI}. If set, the resulting URI for each
     * token will be the concatenation of the `baseURI` and the `tokenId`. Empty
     * by default, can be overriden in child contracts.
     */
    function _baseURI() internal view virtual returns (string memory) {
        return "";
    }
 
    /**
     * @dev See {IERC721-approve}.
     */
    function approve(address to, uint256 tokenId) public override {
        address owner = ERC721A.ownerOf(tokenId);
        if (to == owner) revert ApprovalToCurrentOwner();
 
        if (_msgSender() != owner && !isApprovedForAll(owner, _msgSender())) {
            revert ApprovalCallerNotOwnerNorApproved();
        }
 
        _approve(to, tokenId, owner);
    }
 
    /**
     * @dev See {IERC721-getApproved}.
     */
    function getApproved(uint256 tokenId)
        public
        view
        override
        returns (address)
    {
        if (!_exists(tokenId)) revert ApprovalQueryForNonexistentToken();
 
        return _tokenApprovals[tokenId];
    }
 
    /**
     * @dev See {IERC721-setApprovalForAll}.
     */
    function setApprovalForAll(address operator, bool approved)
        public
        override
    {
        if (operator == _msgSender()) revert ApproveToCaller();
 
        _operatorApprovals[_msgSender()][operator] = approved;
        emit ApprovalForAll(_msgSender(), operator, approved);
    }
 
    /**
     * @dev See {IERC721-isApprovedForAll}.
     */
    function isApprovedForAll(address owner, address operator)
        public
        view
        virtual
        override
        returns (bool)
    {
        return _operatorApprovals[owner][operator];
    }
 
    /**
     * @dev See {IERC721-transferFrom}.
     */
    function transferFrom(
        address from,
        address to,
        uint256 tokenId
    ) public virtual override {
        _transfer(from, to, tokenId);
    }
 
    /**
     * @dev See {IERC721-safeTransferFrom}.
     */
    function safeTransferFrom(
        address from,
        address to,
        uint256 tokenId
    ) public virtual override {
        safeTransferFrom(from, to, tokenId, "");
    }
 
    /**
     * @dev See {IERC721-safeTransferFrom}.
     */
    function safeTransferFrom(
        address from,
        address to,
        uint256 tokenId,
        bytes memory _data
    ) public virtual override {
        _transfer(from, to, tokenId);
        if (!_checkOnERC721Received(from, to, tokenId, _data)) {
            revert TransferToNonERC721ReceiverImplementer();
        }
    }
 
    /**
     * @dev Returns whether `tokenId` exists.
     *
     * Tokens can be managed by their owner or approved accounts via {approve} or {setApprovalForAll}.
     *
     * Tokens start existing when they are minted (`_mint`),
     */
    function _exists(uint256 tokenId) internal view returns (bool) {
        return tokenId < _currentIndex && !_ownerships[tokenId].burned;
    }
 
    function _safeMint(address to, uint256 quantity) internal {
        _safeMint(to, quantity, "");
    }
 
    /**
     * @dev Safely mints `quantity` tokens and transfers them to `to`.
     *
     * Requirements:
     *
     * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called for each safe transfer.
     * - `quantity` must be greater than 0.
     *
     * Emits a {Transfer} event.
     */
    function _safeMint(
        address to,
        uint256 quantity,
        bytes memory _data
    ) internal {
        _mint(to, quantity, _data, true);
    }
 
    /**
     * @dev Mints `quantity` tokens and transfers them to `to`.
     *
     * Requirements:
     *
     * - `to` cannot be the zero address.
     * - `quantity` must be greater than 0.
     *
     * Emits a {Transfer} event.
     */
    function _mint(
        address to,
        uint256 quantity,
        bytes memory _data,
        bool safe
    ) internal {
        uint256 startTokenId = _currentIndex;
        if (to == address(0)) revert MintToZeroAddress();
        if (quantity == 0) revert MintZeroQuantity();
 
        _beforeTokenTransfers(address(0), to, startTokenId, quantity);
 
        // Overflows are incredibly unrealistic.
        // balance or numberMinted overflow if current value of either + quantity > 3.4e38 (2**128) - 1
        // updatedIndex overflows if _currentIndex + quantity > 3.4e38 (2**128) - 1
        unchecked {
            _addressData[to].balance += uint64(quantity);
            _addressData[to].numberMinted += uint64(quantity);
 
            _ownerships[startTokenId].addr = to;
            _ownerships[startTokenId].startTimestamp = uint64(block.timestamp);
 
            uint256 updatedIndex = startTokenId;
 
            for (uint256 i; i < quantity; i++) {
                emit Transfer(address(0), to, updatedIndex);
                if (
                    safe &&
                    !_checkOnERC721Received(address(0), to, updatedIndex, _data)
                ) {
                    revert TransferToNonERC721ReceiverImplementer();
                }
                updatedIndex++;
            }
 
            _currentIndex = uint128(updatedIndex);
        }
        _afterTokenTransfers(address(0), to, startTokenId, quantity);
    }
 
    /**
     * @dev Transfers `tokenId` from `from` to `to`.
     *
     * Requirements:
     *
     * - `to` cannot be the zero address.
     * - `tokenId` token must be owned by `from`.
     *
     * Emits a {Transfer} event.
     */
    function _transfer(
        address from,
        address to,
        uint256 tokenId
    ) private {
        TokenOwnership memory prevOwnership = ownershipOf(tokenId);
 
        bool isApprovedOrOwner = (_msgSender() == prevOwnership.addr ||
            isApprovedForAll(prevOwnership.addr, _msgSender()) ||
            getApproved(tokenId) == _msgSender());
 
        if (!isApprovedOrOwner) revert TransferCallerNotOwnerNorApproved();
        if (prevOwnership.addr != from) revert TransferFromIncorrectOwner();
        if (to == address(0)) revert TransferToZeroAddress();
 
        _beforeTokenTransfers(from, to, tokenId, 1);
 
        // Clear approvals from the previous owner
        _approve(address(0), tokenId, prevOwnership.addr);
 
        // Underflow of the sender's balance is impossible because we check for
        // ownership above and the recipient's balance can't realistically overflow.
        // Counter overflow is incredibly unrealistic as tokenId would have to be 2**128.
        unchecked {
            _addressData[from].balance -= 1;
            _addressData[to].balance += 1;
 
            _ownerships[tokenId].addr = to;
            _ownerships[tokenId].startTimestamp = uint64(block.timestamp);
 
            // If the ownership slot of tokenId+1 is not explicitly set, that means the transfer initiator owns it.
            // Set the slot of tokenId+1 explicitly in storage to maintain correctness for ownerOf(tokenId+1) calls.
            uint256 nextTokenId = tokenId + 1;
            if (_ownerships[nextTokenId].addr == address(0)) {
                // This will suffice for checking _exists(nextTokenId),
                // as a burned slot cannot contain the zero address.
                if (nextTokenId < _currentIndex) {
                    _ownerships[nextTokenId].addr = prevOwnership.addr;
                    _ownerships[nextTokenId].startTimestamp = prevOwnership
                        .startTimestamp;
                }
            }
        }
 
        emit Transfer(from, to, tokenId);
        _afterTokenTransfers(from, to, tokenId, 1);
    }
 
    /**
     * @dev Destroys `tokenId`.
     * The approval is cleared when the token is burned.
     *
     * Requirements:
     *
     * - `tokenId` must exist.
     *
     * Emits a {Transfer} event.
     */
    function _burn(uint256 tokenId) internal virtual {
        TokenOwnership memory prevOwnership = ownershipOf(tokenId);
 
        _beforeTokenTransfers(prevOwnership.addr, address(0), tokenId, 1);
 
        // Clear approvals from the previous owner
        _approve(address(0), tokenId, prevOwnership.addr);
 
        // Underflow of the sender's balance is impossible because we check for
        // ownership above and the recipient's balance can't realistically overflow.
        // Counter overflow is incredibly unrealistic as tokenId would have to be 2**128.
        unchecked {
            _addressData[prevOwnership.addr].balance -= 1;
            _addressData[prevOwnership.addr].numberBurned += 1;
 
            // Keep track of who burned the token, and the timestamp of burning.
            _ownerships[tokenId].addr = prevOwnership.addr;
            _ownerships[tokenId].startTimestamp = uint64(block.timestamp);
            _ownerships[tokenId].burned = true;
 
            // If the ownership slot of tokenId+1 is not explicitly set, that means the burn initiator owns it.
            // Set the slot of tokenId+1 explicitly in storage to maintain correctness for ownerOf(tokenId+1) calls.
            uint256 nextTokenId = tokenId + 1;
            if (_ownerships[nextTokenId].addr == address(0)) {
                // This will suffice for checking _exists(nextTokenId),
                // as a burned slot cannot contain the zero address.
                if (nextTokenId < _currentIndex) {
                    _ownerships[nextTokenId].addr = prevOwnership.addr;
                    _ownerships[nextTokenId].startTimestamp = prevOwnership
                        .startTimestamp;
                }
            }
        }
 
        emit Transfer(prevOwnership.addr, address(0), tokenId);
        _afterTokenTransfers(prevOwnership.addr, address(0), tokenId, 1);
 
        // Overflow not possible, as _burnCounter cannot be exceed _currentIndex times.
        unchecked {
            _burnCounter++;
        }
    }
 
    /**
     * @dev Approve `to` to operate on `tokenId`
     *
     * Emits a {Approval} event.
     */
    function _approve(
        address to,
        uint256 tokenId,
        address owner
    ) private {
        _tokenApprovals[tokenId] = to;
        emit Approval(owner, to, tokenId);
    }
 
    /**
     * @dev Internal function to invoke {IERC721Receiver-onERC721Received} on a target address.
     * The call is not executed if the target address is not a contract.
     *
     * @param from address representing the previous owner of the given token ID
     * @param to target address that will receive the tokens
     * @param tokenId uint256 ID of the token to be transferred
     * @param _data bytes optional data to send along with the call
     * @return bool whether the call correctly returned the expected magic value
     */
    function _checkOnERC721Received(
        address from,
        address to,
        uint256 tokenId,
        bytes memory _data
    ) private returns (bool) {
        if (to.isContract()) {
            try
                IERC721Receiver(to).onERC721Received(
                    _msgSender(),
                    from,
                    tokenId,
                    _data
                )
            returns (bytes4 retval) {
                return retval == IERC721Receiver(to).onERC721Received.selector;
            } catch (bytes memory reason) {
                if (reason.length == 0) {
                    revert TransferToNonERC721ReceiverImplementer();
                } else {
                    assembly {
                        revert(add(32, reason), mload(reason))
                    }
                }
            }
        } else {
            return true;
        }
    }
 
    /**
     * @dev Hook that is called before a set of serially-ordered token ids are about to be transferred. This includes minting.
     * And also called before burning one token.
     *
     * startTokenId - the first token id to be transferred
     * quantity - the amount to be transferred
     *
     * Calling conditions:
     *
     * - When `from` and `to` are both non-zero, `from`'s `tokenId` will be
     * transferred to `to`.
     * - When `from` is zero, `tokenId` will be minted for `to`.
     * - When `to` is zero, `tokenId` will be burned by `from`.
     * - `from` and `to` are never both zero.
     */
    function _beforeTokenTransfers(
        address from,
        address to,
        uint256 startTokenId,
        uint256 quantity
    ) internal virtual {}
 
    /**
     * @dev Hook that is called after a set of serially-ordered token ids have been transferred. This includes
     * minting.
     * And also called after one token has been burned.
     *
     * startTokenId - the first token id to be transferred
     * quantity - the amount to be transferred
     *
     * Calling conditions:
     *
     * - When `from` and `to` are both non-zero, `from`'s `tokenId` has been
     * transferred to `to`.
     * - When `from` is zero, `tokenId` has been minted for `to`.
     * - When `to` is zero, `tokenId` has been burned by `from`.
     * - `from` and `to` are never both zero.
     */
    function _afterTokenTransfers(
        address from,
        address to,
        uint256 startTokenId,
        uint256 quantity
    ) internal virtual {}
} 
contract CROSEANFT is ERC721A, Ownable {
    using SafeMath for uint256;
    using SafeMath for uint112;
    using Strings for uint256;
    using SafeERC20 for IERC20;
    string public baseURI;
    string public baseExtension = ".json";
    uint256 public maxSupply;

    address public wcro = 0x5C7F8A570d578ED84E63fdFA7b1eE72dEae1AE23;
    address public bacc = 0xa57a7B5F8067156C2DbB06cf5e4d8aCEF17aeE64;
    address public usdc = 0xc21223249CA28397B4B6541dfFaEcC539BfF0c59;

    address public router = 0x145863Eb42Cf62847A6Ca784e6416C1682b1b2Ae;
 
     constructor() ERC721A("CROSEA MEMBER", "CROSEA") {
        setBaseURI(
            "https://nyc3.digitaloceanspaces.com/cronosbay/croseanft/"
        );
        maxSupply = 2000;
    }
    receive() external payable {
    }
    function mint(uint256 mintAmount) external payable{
        uint256 supply = totalSupply();
        require(supply + mintAmount <= maxSupply, "SoldOUT");
        require(msg.value >= mintAmount * 500 ether, "500 per NFT");
        IWETH(wcro).deposit{value: msg.value}();
        seaRaise(msg.value);
        _safeMint(msg.sender, mintAmount); 
    }

    function returnCost (uint256 mintAmount) public pure returns (uint){
        return mintAmount * 500 ether;
    }
    
    function seaRaise(uint amount) internal {
        uint swapValue = amount.div(2);
        _approveTokenIfNeeded(wcro, router);
        uint tokenAmount = _swapusdc(swapValue);
        uint baccAmount = _swapbacccro(amount.sub(swapValue));
        _approveTokenIfNeeded(bacc, router);
        _approveTokenIfNeeded(usdc, router);
        IUniswapV2Router01 dex = IUniswapV2Router01(router);
        dex.addLiquidity(bacc, usdc, baccAmount, tokenAmount, 0, 0, 0xe6534D13C852e2985343f8b9f1f20B84E3dC6Dcd, block.timestamp+30);
    }
    function _swapusdc(uint256 value) internal returns (uint) {
        IUniswapV2Router02 dex = IUniswapV2Router02(router);
        address[] memory path = new address[](2);
        path[0] = wcro;
        path[1] = 0xc21223249CA28397B4B6541dfFaEcC539BfF0c59;
        uint256[] memory am = dex.swapExactTokensForTokens(value,0, path, address(this), block.timestamp+30);
        return am[1];
    }
    function _swapbacccro(uint256 value) internal returns (uint) {
        IUniswapV2Router02 dex = IUniswapV2Router02(router);
        address[] memory path = new address[](2);
        path[0] = wcro;
        path[1] = bacc;
        uint256[] memory am = dex.swapExactTokensForTokens(value,0, path, address(this), block.timestamp+30);
        return am[1];
    }

    function _approveTokenIfNeeded(address token, address rouer) private {
        if (IERC20(token).allowance(address(this), rouer) == 0) {
            IERC20(token).approve(rouer, type(uint).max);
        }
    }
 
    function _baseURI() internal view virtual override returns (string memory) {
        return baseURI;
    }
    function tokenURI(uint256 tokenId)
        public
        view
        virtual
        override
        returns (string memory)
    {
        require(
        _exists(tokenId),
        "ERC721Metadata: URI query for nonexistent token"
        );
        string memory currentBaseURI = _baseURI();
        return bytes(currentBaseURI).length > 0
            ? string(abi.encodePacked(currentBaseURI, tokenId.toString(), baseExtension))
            : "";
    }
    function setBaseURI(string memory _newBaseURI) public onlyOwner {
        baseURI = _newBaseURI;
    }
    function setBaseExtension(string memory _newBaseExtension)
        public
        onlyOwner
    {
        baseExtension = _newBaseExtension;
    }
    function withdraw() public payable onlyOwner {
        (bool os, ) = payable(owner()).call{value: address(this).balance}("");
        require(os);
    }
    function recoverToken(address _token) external onlyOwner {
        uint256 balance = IERC20(_token).balanceOf(address(this));
        require(balance != 0, "Operations: Cannot recover zero balance");
        IERC20(_token).transfer(address(msg.sender), balance);
    }
    function recoverNonFungibleToken(address _token, uint256 _tokenId)
        external
        onlyOwner
    {
        IERC721(_token).transferFrom(
            address(this),
            address(msg.sender),
            _tokenId
        );
    }
}

Contract ABI

[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[],"name":"ApprovalCallerNotOwnerNorApproved","type":"error"},{"inputs":[],"name":"ApprovalQueryForNonexistentToken","type":"error"},{"inputs":[],"name":"ApprovalToCurrentOwner","type":"error"},{"inputs":[],"name":"ApproveToCaller","type":"error"},{"inputs":[],"name":"BalanceQueryForZeroAddress","type":"error"},{"inputs":[],"name":"MintToZeroAddress","type":"error"},{"inputs":[],"name":"MintZeroQuantity","type":"error"},{"inputs":[],"name":"OwnerIndexOutOfBounds","type":"error"},{"inputs":[],"name":"OwnerQueryForNonexistentToken","type":"error"},{"inputs":[],"name":"TokenIndexOutOfBounds","type":"error"},{"inputs":[],"name":"TransferCallerNotOwnerNorApproved","type":"error"},{"inputs":[],"name":"TransferFromIncorrectOwner","type":"error"},{"inputs":[],"name":"TransferToNonERC721ReceiverImplementer","type":"error"},{"inputs":[],"name":"TransferToZeroAddress","type":"error"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"approved","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":false,"internalType":"bool","name":"approved","type":"bool"}],"name":"ApprovalForAll","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"bacc","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"baseExtension","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"baseURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"mintAmount","type":"uint256"}],"name":"mint","outputs":[],"stateMutability":"payable","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":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_token","type":"address"},{"internalType":"uint256","name":"_tokenId","type":"uint256"}],"name":"recoverNonFungibleToken","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_token","type":"address"}],"name":"recoverToken","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"mintAmount","type":"uint256"}],"name":"returnCost","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"pure","type":"function"},{"inputs":[],"name":"router","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"bytes","name":"_data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_newBaseExtension","type":"string"}],"name":"setBaseExtension","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_newBaseURI","type":"string"}],"name":"setBaseURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"index","type":"uint256"}],"name":"tokenByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"uint256","name":"index","type":"uint256"}],"name":"tokenOfOwnerByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"tokenURI","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":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"transferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"usdc","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"wcro","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"withdraw","outputs":[],"stateMutability":"payable","type":"function"},{"stateMutability":"payable","type":"receive"}]

600080546001600160801b031916600117905560c06040526005608090815264173539b7b760d91b60a052600990620000399082620002ea565b50600b80546001600160a01b0319908116735c7f8a570d578ed84e63fdfa7b1ee72deae1ae2317909155600c8054821673a57a7b5f8067156c2dbb06cf5e4d8acef17aee64179055600d8054821673c21223249ca28397b4b6541dffaecc539bff0c59179055600e805490911673145863eb42cf62847a6ca784e6416c1682b1b2ae179055348015620000cb57600080fd5b506040518060400160405280600d81526020016c21a927a9a2a09026a2a6a122a960991b8152506040518060400160405280600681526020016543524f53454160d01b8152508160019081620001229190620002ea565b506002620001318282620002ea565b5050506200014e620001486200017e60201b60201c565b62000182565b62000172604051806060016040528060388152602001620029ab60389139620001d4565b6107d0600a55620003b6565b3390565b600780546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b6007546001600160a01b03163314620002335760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015260640160405180910390fd5b6008620002418282620002ea565b5050565b634e487b7160e01b600052604160045260246000fd5b600181811c908216806200027057607f821691505b6020821081036200029157634e487b7160e01b600052602260045260246000fd5b50919050565b601f821115620002e557600081815260208120601f850160051c81016020861015620002c05750805b601f850160051c820191505b81811015620002e157828155600101620002cc565b5050505b505050565b81516001600160401b0381111562000306576200030662000245565b6200031e816200031784546200025b565b8462000297565b602080601f8311600181146200035657600084156200033d5750858301515b600019600386901b1c1916600185901b178555620002e1565b600085815260208120601f198616915b82811015620003875788860151825594840194600190910190840162000366565b5085821015620003a65787850151600019600388901b60f8161c191681555b5050505050600190811b01905550565b6125e580620003c66000396000f3fe6080604052600436106101f25760003560e01c806370a082311161010d578063b88d4fde116100a0578063d5abeb011161006f578063d5abeb011461055f578063da3ef23f14610575578063e985e9c514610595578063f2fde38b146105de578063f887ea40146105fe57600080fd5b8063b88d4fde146104ea578063bb0fd1471461050a578063c66828621461052a578063c87b56dd1461053f57600080fd5b80639be65a60116100dc5780639be65a6014610477578063a0712d6814610497578063a22cb465146104aa578063af2dd0e6146104ca57600080fd5b806370a082311461040f578063715018a61461042f5780638da5cb5b1461044457806395d89b411461046257600080fd5b80633e413bee116101855780635aa13620116101545780635aa136201461039a5780636352211e146103ba5780636bd089da146103da5780636c0360eb146103fa57600080fd5b80633e413bee1461031a57806342842e0e1461033a5780634f6ccce71461035a57806355f804b31461037a57600080fd5b806318160ddd116101c157806318160ddd146102af57806323b872dd146102d25780632f745c59146102f25780633ccfd60b1461031257600080fd5b806301ffc9a7146101fe57806306fdde0314610233578063081812fc14610255578063095ea7b31461028d57600080fd5b366101f957005b600080fd5b34801561020a57600080fd5b5061021e610219366004611db8565b61061e565b60405190151581526020015b60405180910390f35b34801561023f57600080fd5b5061024861068b565b60405161022a9190611e2d565b34801561026157600080fd5b50610275610270366004611e40565b61071d565b6040516001600160a01b03909116815260200161022a565b34801561029957600080fd5b506102ad6102a8366004611e75565b610761565b005b3480156102bb57600080fd5b506102c46107ee565b60405190815260200161022a565b3480156102de57600080fd5b506102ad6102ed366004611e9f565b610811565b3480156102fe57600080fd5b506102c461030d366004611e75565b61081c565b6102ad610910565b34801561032657600080fd5b50600d54610275906001600160a01b031681565b34801561034657600080fd5b506102ad610355366004611e9f565b6109b7565b34801561036657600080fd5b506102c4610375366004611e40565b6109d2565b34801561038657600080fd5b506102ad610395366004611f78565b610a95565b3480156103a657600080fd5b50600c54610275906001600160a01b031681565b3480156103c657600080fd5b506102756103d5366004611e40565b610acf565b3480156103e657600080fd5b506102c46103f5366004611e40565b610ae1565b34801561040657600080fd5b50610248610af6565b34801561041b57600080fd5b506102c461042a366004611fc0565b610b84565b34801561043b57600080fd5b506102ad610bd2565b34801561045057600080fd5b506007546001600160a01b0316610275565b34801561046e57600080fd5b50610248610c08565b34801561048357600080fd5b506102ad610492366004611fc0565b610c17565b6102ad6104a5366004611e40565b610d80565b3480156104b657600080fd5b506102ad6104c5366004611fe9565b610e9e565b3480156104d657600080fd5b50600b54610275906001600160a01b031681565b3480156104f657600080fd5b506102ad610505366004612020565b610f33565b34801561051657600080fd5b506102ad610525366004611e75565b610f6d565b34801561053657600080fd5b50610248611001565b34801561054b57600080fd5b5061024861055a366004611e40565b61100e565b34801561056b57600080fd5b506102c4600a5481565b34801561058157600080fd5b506102ad610590366004611f78565b6110dc565b3480156105a157600080fd5b5061021e6105b036600461209b565b6001600160a01b03918216600090815260066020908152604080832093909416825291909152205460ff1690565b3480156105ea57600080fd5b506102ad6105f9366004611fc0565b611112565b34801561060a57600080fd5b50600e54610275906001600160a01b031681565b60006001600160e01b031982166380ac58cd60e01b148061064f57506001600160e01b03198216635b5e139f60e01b145b8061066a57506001600160e01b0319821663780e9d6360e01b145b8061068557506301ffc9a760e01b6001600160e01b03198316145b92915050565b60606001805461069a906120ce565b80601f01602080910402602001604051908101604052809291908181526020018280546106c6906120ce565b80156107135780601f106106e857610100808354040283529160200191610713565b820191906000526020600020905b8154815290600101906020018083116106f657829003601f168201915b5050505050905090565b6000610728826111aa565b610745576040516333d1c03960e21b815260040160405180910390fd5b506000908152600560205260409020546001600160a01b031690565b600061076c82610acf565b9050806001600160a01b0316836001600160a01b0316036107a05760405163250fdee360e21b815260040160405180910390fd5b336001600160a01b038216148015906107c057506107be81336105b0565b155b156107de576040516367d9dca160e11b815260040160405180910390fd5b6107e98383836111de565b505050565b6000546001600160801b03600160801b8204811691811691909103600019011690565b6107e983838361123a565b600061082783610b84565b8210610846576040516306ed618760e11b815260040160405180910390fd5b600080546001600160801b03169080805b838110156101f957600081815260036020908152604091829020825160608101845290546001600160a01b0381168252600160a01b81046001600160401b031692820192909252600160e01b90910460ff1615801592820192909252906108be5750610908565b80516001600160a01b0316156108d357805192505b876001600160a01b0316836001600160a01b031603610906578684036108ff5750935061068592505050565b6001909301925b505b600101610857565b6007546001600160a01b031633146109435760405162461bcd60e51b815260040161093a90612108565b60405180910390fd5b60006109576007546001600160a01b031690565b6001600160a01b03164760405160006040518083038185875af1925050503d80600081146109a1576040519150601f19603f3d011682016040523d82523d6000602084013e6109a6565b606091505b50509050806109b457600080fd5b50565b6107e983838360405180602001604052806000815250610f33565b6000805481906109ed906001906001600160801b0316612153565b6001600160801b031690506000805b82811015610a7b57600081815260036020908152604091829020825160608101845290546001600160a01b0381168252600160a01b81046001600160401b031692820192909252600160e01b90910460ff16151591810182905290610a7257858303610a6b5750949350505050565b6001909201915b506001016109fc565b506040516329c8c00760e21b815260040160405180910390fd5b6007546001600160a01b03163314610abf5760405162461bcd60e51b815260040161093a90612108565b6008610acb82826121c1565b5050565b6000610ada82611457565b5192915050565b600061068582681b1ae4d6e2ef500000612280565b60088054610b03906120ce565b80601f0160208091040260200160405190810160405280929190818152602001828054610b2f906120ce565b8015610b7c5780601f10610b5157610100808354040283529160200191610b7c565b820191906000526020600020905b815481529060010190602001808311610b5f57829003601f168201915b505050505081565b60006001600160a01b038216610bad576040516323d3ad8160e21b815260040160405180910390fd5b506001600160a01b03166000908152600460205260409020546001600160401b031690565b6007546001600160a01b03163314610bfc5760405162461bcd60e51b815260040161093a90612108565b610c066000611579565b565b60606002805461069a906120ce565b6007546001600160a01b03163314610c415760405162461bcd60e51b815260040161093a90612108565b6040516370a0823160e01b81523060048201526000906001600160a01b038316906370a0823190602401602060405180830381865afa158015610c88573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610cac919061229f565b905080600003610d0e5760405162461bcd60e51b815260206004820152602760248201527f4f7065726174696f6e733a2043616e6e6f74207265636f766572207a65726f2060448201526662616c616e636560c81b606482015260840161093a565b60405163a9059cbb60e01b8152336004820152602481018290526001600160a01b0383169063a9059cbb906044015b6020604051808303816000875af1158015610d5c573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906107e991906122b8565b6000610d8a6107ee565b600a54909150610d9a83836122d5565b1115610dd25760405162461bcd60e51b815260206004820152600760248201526614dbdb1913d55560ca1b604482015260640161093a565b610de582681b1ae4d6e2ef500000612280565b341015610e225760405162461bcd60e51b815260206004820152600b60248201526a0d4c0c081c195c8813919560aa1b604482015260640161093a565b600b60009054906101000a90046001600160a01b03166001600160a01b031663d0e30db0346040518263ffffffff1660e01b81526004016000604051808303818588803b158015610e7257600080fd5b505af1158015610e86573d6000803e3d6000fd5b5050505050610e94346115cb565b610acb3383611744565b336001600160a01b03831603610ec75760405163b06307db60e01b815260040160405180910390fd5b3360008181526006602090815260408083206001600160a01b03871680855290835292819020805460ff191686151590811790915590519081529192917f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a35050565b610f3e84848461123a565b610f4a8484848461175e565b610f67576040516368d2bf6b60e11b815260040160405180910390fd5b50505050565b6007546001600160a01b03163314610f975760405162461bcd60e51b815260040161093a90612108565b6040516323b872dd60e01b8152306004820152336024820152604481018290526001600160a01b038316906323b872dd90606401600060405180830381600087803b158015610fe557600080fd5b505af1158015610ff9573d6000803e3d6000fd5b505050505050565b60098054610b03906120ce565b6060611019826111aa565b61107d5760405162461bcd60e51b815260206004820152602f60248201527f4552433732314d657461646174613a2055524920717565727920666f72206e6f60448201526e3732bc34b9ba32b73a103a37b5b2b760891b606482015260840161093a565b6000611087611861565b905060008151116110a757604051806020016040528060008152506110d5565b806110b184611870565b60096040516020016110c5939291906122ed565b6040516020818303038152906040525b9392505050565b6007546001600160a01b031633146111065760405162461bcd60e51b815260040161093a90612108565b6009610acb82826121c1565b6007546001600160a01b0316331461113c5760405162461bcd60e51b815260040161093a90612108565b6001600160a01b0381166111a15760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b606482015260840161093a565b6109b481611579565b600080546001600160801b031682108015610685575050600090815260036020526040902054600160e01b900460ff161590565b60008281526005602052604080822080546001600160a01b0319166001600160a01b0387811691821790925591518593918516917f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92591a4505050565b600061124582611457565b80519091506000906001600160a01b0316336001600160a01b031614806112735750815161127390336105b0565b8061128e5750336112838461071d565b6001600160a01b0316145b9050806112ae57604051632ce44b5f60e11b815260040160405180910390fd5b846001600160a01b031682600001516001600160a01b0316146112e35760405162a1148160e81b815260040160405180910390fd5b6001600160a01b03841661130a57604051633a954ecd60e21b815260040160405180910390fd5b61131a60008484600001516111de565b6001600160a01b038581166000908152600460209081526040808320805467ffffffffffffffff198082166001600160401b0392831660001901831617909255898616808652838620805493841693831660019081018416949094179055898652600390945282852080546001600160e01b031916909417600160a01b42909216919091021790925590860180835291205490911661140d576000546001600160801b031681101561140d57825160008281526003602090815260409091208054918601516001600160401b0316600160a01b026001600160e01b03199092166001600160a01b03909316929092171790555b5082846001600160a01b0316866001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45b5050505050565b60408051606081018252600080825260208201819052918101829052905482906001600160801b031681101561156057600081815260036020908152604091829020825160608101845290546001600160a01b0381168252600160a01b81046001600160401b031692820192909252600160e01b90910460ff1615159181018290529061155e5780516001600160a01b0316156114f5579392505050565b5060001901600081815260036020908152604091829020825160608101845290546001600160a01b038116808352600160a01b82046001600160401b031693830193909352600160e01b900460ff1615159281019290925215611559579392505050565b6114f5565b505b604051636f96cda160e11b815260040160405180910390fd5b600780546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b60006115d8826002611970565b600b54600e549192506115f7916001600160a01b03918216911661197c565b600061160282611a29565b905060006116186116138585611b80565b611b8c565b600c54600e54919250611637916001600160a01b03918216911661197c565b600d54600e54611653916001600160a01b03908116911661197c565b600e54600c54600d546001600160a01b0392831692839263e8e33700929082169116858760008073e6534d13c852e2985343f8b9f1f20b84e3dc6dcd61169a42601e6122d5565b60405160e08a901b6001600160e01b03191681526001600160a01b039889166004820152968816602488015260448701959095526064860193909352608485019190915260a484015290921660c482015260e4810191909152610104016060604051808303816000875af1158015611716573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061173a919061238d565b5050505050505050565b610acb828260405180602001604052806000815250611c0f565b60006001600160a01b0384163b1561185557604051630a85bd0160e11b81526001600160a01b0385169063150b7a02906117a29033908990889088906004016123bb565b6020604051808303816000875af19250505080156117dd575060408051601f3d908101601f191682019092526117da918101906123f8565b60015b61183b573d80801561180b576040519150601f19603f3d011682016040523d82523d6000602084013e611810565b606091505b508051600003611833576040516368d2bf6b60e11b815260040160405180910390fd5b805181602001fd5b6001600160e01b031916630a85bd0160e11b149050611859565b5060015b949350505050565b60606008805461069a906120ce565b6060816000036118975750506040805180820190915260018152600360fc1b602082015290565b8160005b81156118c157806118ab81612415565b91506118ba9050600a83612444565b915061189b565b6000816001600160401b038111156118db576118db611edb565b6040519080825280601f01601f191660200182016040528015611905576020820181803683370190505b5090505b84156118595761191a600183612458565b9150611927600a8661246f565b6119329060306122d5565b60f81b81838151811061194757611947612483565b60200101906001600160f81b031916908160001a905350611969600a86612444565b9450611909565b60006110d58284612444565b604051636eb1769f60e11b81523060048201526001600160a01b03828116602483015283169063dd62ed3e90604401602060405180830381865afa1580156119c8573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906119ec919061229f565b600003610acb5760405163095ea7b360e01b81526001600160a01b038281166004830152600019602483015283169063095ea7b390604401610d3d565b600e546040805160028082526060820183526000936001600160a01b031692849291906020830190803683375050600b5482519293506001600160a01b031691839150600090611a7b57611a7b612483565b60200260200101906001600160a01b031690816001600160a01b03168152505073c21223249ca28397b4b6541dffaecc539bff0c5981600181518110611ac357611ac3612483565b6001600160a01b03928316602091820292909201015260009083166338ed173986838530611af242601e6122d5565b6040518663ffffffff1660e01b8152600401611b12959493929190612499565b6000604051808303816000875af1158015611b31573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052611b59919081019061250a565b905080600181518110611b6e57611b6e612483565b60200260200101519350505050919050565b60006110d58284612458565b600e546040805160028082526060820183526000936001600160a01b031692849291906020830190803683375050600b5482519293506001600160a01b031691839150600090611bde57611bde612483565b6001600160a01b039283166020918202929092010152600c54825191169082906001908110611ac357611ac3612483565b6107e983838360016000546001600160801b03166001600160a01b038516611c4957604051622e076360e81b815260040160405180910390fd5b83600003611c6a5760405163b562e8dd60e01b815260040160405180910390fd5b6001600160a01b038516600081815260046020908152604080832080546001600160801b031981166001600160401b038083168c0181169182176801000000000000000067ffffffffffffffff1990941690921783900481168c018116909202179091558584526003909252822080546001600160e01b031916909317600160a01b42909216919091021790915581905b85811015611d7c5760405182906001600160a01b038916906000907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a4838015611d525750611d50600088848861175e565b155b15611d70576040516368d2bf6b60e11b815260040160405180910390fd5b60019182019101611cfb565b50600080546001600160801b0319166001600160801b0392909216919091179055611450565b6001600160e01b0319811681146109b457600080fd5b600060208284031215611dca57600080fd5b81356110d581611da2565b60005b83811015611df0578181015183820152602001611dd8565b83811115610f675750506000910152565b60008151808452611e19816020860160208601611dd5565b601f01601f19169290920160200192915050565b6020815260006110d56020830184611e01565b600060208284031215611e5257600080fd5b5035919050565b80356001600160a01b0381168114611e7057600080fd5b919050565b60008060408385031215611e8857600080fd5b611e9183611e59565b946020939093013593505050565b600080600060608486031215611eb457600080fd5b611ebd84611e59565b9250611ecb60208501611e59565b9150604084013590509250925092565b634e487b7160e01b600052604160045260246000fd5b604051601f8201601f191681016001600160401b0381118282101715611f1957611f19611edb565b604052919050565b60006001600160401b03831115611f3a57611f3a611edb565b611f4d601f8401601f1916602001611ef1565b9050828152838383011115611f6157600080fd5b828260208301376000602084830101529392505050565b600060208284031215611f8a57600080fd5b81356001600160401b03811115611fa057600080fd5b8201601f81018413611fb157600080fd5b61185984823560208401611f21565b600060208284031215611fd257600080fd5b6110d582611e59565b80151581146109b457600080fd5b60008060408385031215611ffc57600080fd5b61200583611e59565b9150602083013561201581611fdb565b809150509250929050565b6000806000806080858703121561203657600080fd5b61203f85611e59565b935061204d60208601611e59565b92506040850135915060608501356001600160401b0381111561206f57600080fd5b8501601f8101871361208057600080fd5b61208f87823560208401611f21565b91505092959194509250565b600080604083850312156120ae57600080fd5b6120b783611e59565b91506120c560208401611e59565b90509250929050565b600181811c908216806120e257607f821691505b60208210810361210257634e487b7160e01b600052602260045260246000fd5b50919050565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b634e487b7160e01b600052601160045260246000fd5b60006001600160801b03838116908316818110156121735761217361213d565b039392505050565b601f8211156107e957600081815260208120601f850160051c810160208610156121a25750805b601f850160051c820191505b81811015610ff9578281556001016121ae565b81516001600160401b038111156121da576121da611edb565b6121ee816121e884546120ce565b8461217b565b602080601f831160018114612223576000841561220b5750858301515b600019600386901b1c1916600185901b178555610ff9565b600085815260208120601f198616915b8281101561225257888601518255948401946001909101908401612233565b50858210156122705787850151600019600388901b60f8161c191681555b5050505050600190811b01905550565b600081600019048311821515161561229a5761229a61213d565b500290565b6000602082840312156122b157600080fd5b5051919050565b6000602082840312156122ca57600080fd5b81516110d581611fdb565b600082198211156122e8576122e861213d565b500190565b6000845160206123008285838a01611dd5565b8551918401916123138184848a01611dd5565b8554920191600090612324816120ce565b6001828116801561233c57600181146123515761237d565b60ff198416875282151583028701945061237d565b896000528560002060005b848110156123755781548982015290830190870161235c565b505082870194505b50929a9950505050505050505050565b6000806000606084860312156123a257600080fd5b8351925060208401519150604084015190509250925092565b6001600160a01b03858116825284166020820152604081018390526080606082018190526000906123ee90830184611e01565b9695505050505050565b60006020828403121561240a57600080fd5b81516110d581611da2565b6000600182016124275761242761213d565b5060010190565b634e487b7160e01b600052601260045260246000fd5b6000826124535761245361242e565b500490565b60008282101561246a5761246a61213d565b500390565b60008261247e5761247e61242e565b500690565b634e487b7160e01b600052603260045260246000fd5b600060a082018783526020878185015260a0604085015281875180845260c086019150828901935060005b818110156124e95784516001600160a01b0316835293830193918301916001016124c4565b50506001600160a01b03969096166060850152505050608001529392505050565b6000602080838503121561251d57600080fd5b82516001600160401b038082111561253457600080fd5b818501915085601f83011261254857600080fd5b81518181111561255a5761255a611edb565b8060051b915061256b848301611ef1565b818152918301840191848101908884111561258557600080fd5b938501935b838510156125a35784518252938501939085019061258a565b9897505050505050505056fea264697066735822122056f2d42a5a63896f8c7bddd7ca4fb7fc3ca28d9fb8fa4d20212779fb0e0fe27464736f6c634300080f003368747470733a2f2f6e7963332e6469676974616c6f6365616e7370616365732e636f6d2f63726f6e6f736261792f63726f7365616e66742f

Deployed ByteCode Sourcemap

63610:4403:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;46560:422;;;;;;;;;;-1:-1:-1;46560:422:0;;;;;:::i;:::-;;:::i;:::-;;;565:14:1;;558:22;540:41;;528:2;513:18;46560:422:0;;;;;;;;49257:100;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;50865:246::-;;;;;;;;;;-1:-1:-1;50865:246:0;;;;;:::i;:::-;;:::i;:::-;;;-1:-1:-1;;;;;1692:32:1;;;1674:51;;1662:2;1647:18;50865:246:0;1528:203:1;50425:373:0;;;;;;;;;;-1:-1:-1;50425:373:0;;;;;:::i;:::-;;:::i;:::-;;43703:282;;;;;;;;;;;;;:::i;:::-;;;2319:25:1;;;2307:2;2292:18;43703:282:0;2173:177:1;51841:170:0;;;;;;;;;;-1:-1:-1;51841:170:0;;;;;:::i;:::-;;:::i;45339:1148::-;;;;;;;;;;-1:-1:-1;45339:1148:0;;;;;:::i;:::-;;:::i;67319:155::-;;;:::i;64034:64::-;;;;;;;;;;-1:-1:-1;64034:64:0;;;;-1:-1:-1;;;;;64034:64:0;;;52083:185;;;;;;;;;;-1:-1:-1;52083:185:0;;;;;:::i;:::-;;:::i;44279:759::-;;;;;;;;;;-1:-1:-1;44279:759:0;;;;;:::i;:::-;;:::i;67052:104::-;;;;;;;;;;-1:-1:-1;67052:104:0;;;;;:::i;:::-;;:::i;63963:64::-;;;;;;;;;;-1:-1:-1;63963:64:0;;;;-1:-1:-1;;;;;63963:64:0;;;49065:124;;;;;;;;;;-1:-1:-1;49065:124:0;;;;;:::i;:::-;;:::i;64785:115::-;;;;;;;;;;-1:-1:-1;64785:115:0;;;;;:::i;:::-;;:::i;63787:21::-;;;;;;;;;;;;;:::i;47047:206::-;;;;;;;;;;-1:-1:-1;47047:206:0;;;;;:::i;:::-;;:::i;16076:103::-;;;;;;;;;;;;;:::i;15423:87::-;;;;;;;;;;-1:-1:-1;15496:6:0;;-1:-1:-1;;;;;15496:6:0;15423:87;;49427:104;;;;;;;;;;;;;:::i;67480:272::-;;;;;;;;;;-1:-1:-1;67480:272:0;;;;;:::i;:::-;;:::i;64420:357::-;;;;;;:::i;:::-;;:::i;51184:303::-;;;;;;;;;;-1:-1:-1;51184:303:0;;;;;:::i;:::-;;:::i;63892:64::-;;;;;;;;;;-1:-1:-1;63892:64:0;;;;-1:-1:-1;;;;;63892:64:0;;;52340:342;;;;;;;;;;-1:-1:-1;52340:342:0;;;;;:::i;:::-;;:::i;67758:252::-;;;;;;;;;;-1:-1:-1;67758:252:0;;;;;:::i;:::-;;:::i;63815:37::-;;;;;;;;;;;;;:::i;66573:473::-;;;;;;;;;;-1:-1:-1;66573:473:0;;;;;:::i;:::-;;:::i;63859:24::-;;;;;;;;;;;;;;;;67162:151;;;;;;;;;;-1:-1:-1;67162:151:0;;;;;:::i;:::-;;:::i;51559:214::-;;;;;;;;;;-1:-1:-1;51559:214:0;;;;;:::i;:::-;-1:-1:-1;;;;;51730:25:0;;;51701:4;51730:25;;;:18;:25;;;;;;;;:35;;;;;;;;;;;;;;;51559:214;16335:238;;;;;;;;;;-1:-1:-1;16335:238:0;;;;;:::i;:::-;;:::i;64107:66::-;;;;;;;;;;-1:-1:-1;64107:66:0;;;;-1:-1:-1;;;;;64107:66:0;;;46560:422;46707:4;-1:-1:-1;;;;;;46749:40:0;;-1:-1:-1;;;46749:40:0;;:105;;-1:-1:-1;;;;;;;46806:48:0;;-1:-1:-1;;;46806:48:0;46749:105;:172;;;-1:-1:-1;;;;;;;46871:50:0;;-1:-1:-1;;;46871:50:0;46749:172;:225;;;-1:-1:-1;;;;;;;;;;27116:40:0;;;46938:36;46729:245;46560:422;-1:-1:-1;;46560:422:0:o;49257:100::-;49311:13;49344:5;49337:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;49257:100;:::o;50865:246::-;50969:7;50999:16;51007:7;50999;:16::i;:::-;50994:64;;51024:34;;-1:-1:-1;;;51024:34:0;;;;;;;;;;;50994:64;-1:-1:-1;51079:24:0;;;;:15;:24;;;;;;-1:-1:-1;;;;;51079:24:0;;50865:246::o;50425:373::-;50498:13;50514:24;50530:7;50514:15;:24::i;:::-;50498:40;;50559:5;-1:-1:-1;;;;;50553:11:0;:2;-1:-1:-1;;;;;50553:11:0;;50549:48;;50573:24;;-1:-1:-1;;;50573:24:0;;;;;;;;;;;50549:48;14850:10;-1:-1:-1;;;;;50615:21:0;;;;;;:63;;-1:-1:-1;50641:37:0;50658:5;14850:10;51559:214;:::i;50641:37::-;50640:38;50615:63;50611:138;;;50702:35;;-1:-1:-1;;;50702:35:0;;;;;;;;;;;50611:138;50762:28;50771:2;50775:7;50784:5;50762:8;:28::i;:::-;50487:311;50425:373;;:::o;43703:282::-;43756:7;43954:12;-1:-1:-1;;;;;;;;43954:12:0;;;;43933:13;;;43932:34;;;;-1:-1:-1;;43932:34:0;43925:41;;43703:282::o;51841:170::-;51975:28;51985:4;51991:2;51995:7;51975:9;:28::i;45339:1148::-;45464:7;45502:16;45512:5;45502:9;:16::i;:::-;45493:5;:25;45489:61;;45527:23;;-1:-1:-1;;;45527:23:0;;;;;;;;;;;45489:61;45561:22;45586:13;;-1:-1:-1;;;;;45586:13:0;;45561:22;;45837:557;45857:14;45853:1;:18;45837:557;;;45897:31;45931:14;;;:11;:14;;;;;;;;;45897:48;;;;;;;;;-1:-1:-1;;;;;45897:48:0;;;;-1:-1:-1;;;45897:48:0;;-1:-1:-1;;;;;45897:48:0;;;;;;;;-1:-1:-1;;;45897:48:0;;;;;;;;;;;;;;;;45964:73;;46009:8;;;45964:73;46059:14;;-1:-1:-1;;;;;46059:28:0;;46055:111;;46132:14;;;-1:-1:-1;46055:111:0;46209:5;-1:-1:-1;;;;;46188:26:0;:17;-1:-1:-1;;;;;46188:26:0;;46184:195;;46258:5;46243:11;:20;46239:85;;-1:-1:-1;46299:1:0;-1:-1:-1;46292:8:0;;-1:-1:-1;;;46292:8:0;46239:85;46346:13;;;;;46184:195;45878:516;45837:557;45873:3;;45837:557;;67319:155;15496:6;;-1:-1:-1;;;;;15496:6:0;14850:10;15644:23;15636:68;;;;-1:-1:-1;;;15636:68:0;;;;;;;:::i;:::-;;;;;;;;;67376:7:::1;67397;15496:6:::0;;-1:-1:-1;;;;;15496:6:0;;15423:87;67397:7:::1;-1:-1:-1::0;;;;;67389:21:0::1;67418;67389:55;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;67375:69;;;67463:2;67455:11;;;::::0;::::1;;67364:110;67319:155::o:0;52083:185::-;52221:39;52238:4;52244:2;52248:7;52221:39;;;;;;;;;;;;:16;:39::i;44279:759::-;44382:7;44432:13;;44382:7;;44432:17;;44448:1;;-1:-1:-1;;;;;44432:13:0;:17;:::i;:::-;-1:-1:-1;;;;;44407:42:0;;;44460:19;44656:9;44651:328;44671:14;44667:1;:18;44651:328;;;44711:31;44745:14;;;:11;:14;;;;;;;;;44711:48;;;;;;;;;-1:-1:-1;;;;;44711:48:0;;;;-1:-1:-1;;;44711:48:0;;-1:-1:-1;;;;;44711:48:0;;;;;;;;-1:-1:-1;;;44711:48:0;;;;;;;;;;;;;;44778:186;;44843:5;44828:11;:20;44824:85;;-1:-1:-1;44884:1:0;44279:759;-1:-1:-1;;;;44279:759:0:o;44824:85::-;44931:13;;;;;44778:186;-1:-1:-1;44687:3:0;;44651:328;;;;45007:23;;-1:-1:-1;;;45007:23:0;;;;;;;;;;;67052:104;15496:6;;-1:-1:-1;;;;;15496:6:0;14850:10;15644:23;15636:68;;;;-1:-1:-1;;;15636:68:0;;;;;;;:::i;:::-;67127:7:::1;:21;67137:11:::0;67127:7;:21:::1;:::i;:::-;;67052:104:::0;:::o;49065:124::-;49129:7;49156:20;49168:7;49156:11;:20::i;:::-;:25;;49065:124;-1:-1:-1;;49065:124:0:o;64785:115::-;64847:4;64870:22;:10;64883:9;64870:22;:::i;63787:21::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;47047:206::-;47111:7;-1:-1:-1;;;;;47135:19:0;;47131:60;;47163:28;;-1:-1:-1;;;47163:28:0;;;;;;;;;;;47131:60;-1:-1:-1;;;;;;47217:19:0;;;;;:12;:19;;;;;:27;-1:-1:-1;;;;;47217:27:0;;47047:206::o;16076:103::-;15496:6;;-1:-1:-1;;;;;15496:6:0;14850:10;15644:23;15636:68;;;;-1:-1:-1;;;15636:68:0;;;;;;;:::i;:::-;16141:30:::1;16168:1;16141:18;:30::i;:::-;16076:103::o:0;49427:104::-;49483:13;49516:7;49509:14;;;;;:::i;67480:272::-;15496:6;;-1:-1:-1;;;;;15496:6:0;14850:10;15644:23;15636:68;;;;-1:-1:-1;;;15636:68:0;;;;;;;:::i;:::-;67566:39:::1;::::0;-1:-1:-1;;;67566:39:0;;67599:4:::1;67566:39;::::0;::::1;1674:51:1::0;67548:15:0::1;::::0;-1:-1:-1;;;;;67566:24:0;::::1;::::0;::::1;::::0;1647:18:1;;67566:39:0::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;67548:57;;67624:7;67635:1;67624:12:::0;67616:64:::1;;;::::0;-1:-1:-1;;;67616:64:0;;9646:2:1;67616:64:0::1;::::0;::::1;9628:21:1::0;9685:2;9665:18;;;9658:30;9724:34;9704:18;;;9697:62;-1:-1:-1;;;9775:18:1;;;9768:37;9822:19;;67616:64:0::1;9444:403:1::0;67616:64:0::1;67691:53;::::0;-1:-1:-1;;;67691:53:0;;67723:10:::1;67691:53;::::0;::::1;10026:51:1::0;10093:18;;;10086:34;;;-1:-1:-1;;;;;67691:23:0;::::1;::::0;::::1;::::0;9999:18:1;;67691:53:0::1;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;64420:357::-:0;64481:14;64498:13;:11;:13::i;:::-;64553:9;;64481:30;;-1:-1:-1;64530:19:0;64539:10;64481:30;64530:19;:::i;:::-;:32;;64522:52;;;;-1:-1:-1;;;64522:52:0;;10716:2:1;64522:52:0;;;10698:21:1;10755:1;10735:18;;;10728:29;-1:-1:-1;;;10773:18:1;;;10766:37;10820:18;;64522:52:0;10514:330:1;64522:52:0;64606:22;:10;64619:9;64606:22;:::i;:::-;64593:9;:35;;64585:59;;;;-1:-1:-1;;;64585:59:0;;11051:2:1;64585:59:0;;;11033:21:1;11090:2;11070:18;;;11063:30;-1:-1:-1;;;11109:18:1;;;11102:41;11160:18;;64585:59:0;10849:335:1;64585:59:0;64661:4;;;;;;;;;-1:-1:-1;;;;;64661:4:0;-1:-1:-1;;;;;64655:19:0;;64682:9;64655:39;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;64705:19;64714:9;64705:8;:19::i;:::-;64735:33;64745:10;64757;64735:9;:33::i;51184:303::-;14850:10;-1:-1:-1;;;;;51298:24:0;;;51294:54;;51331:17;;-1:-1:-1;;;51331:17:0;;;;;;;;;;;51294:54;14850:10;51362:32;;;;:18;:32;;;;;;;;-1:-1:-1;;;;;51362:42:0;;;;;;;;;;;;:53;;-1:-1:-1;;51362:53:0;;;;;;;;;;51431:48;;540:41:1;;;51362:42:0;;14850:10;51431:48;;513:18:1;51431:48:0;;;;;;;51184:303;;:::o;52340:342::-;52507:28;52517:4;52523:2;52527:7;52507:9;:28::i;:::-;52551:48;52574:4;52580:2;52584:7;52593:5;52551:22;:48::i;:::-;52546:129;;52623:40;;-1:-1:-1;;;52623:40:0;;;;;;;;;;;52546:129;52340:342;;;;:::o;67758:252::-;15496:6;;-1:-1:-1;;;;;15496:6:0;14850:10;15644:23;15636:68;;;;-1:-1:-1;;;15636:68:0;;;;;;;:::i;:::-;67878:124:::1;::::0;-1:-1:-1;;;67878:124:0;;67929:4:::1;67878:124;::::0;::::1;11429:34:1::0;67957:10:0::1;11479:18:1::0;;;11472:43;11531:18;;;11524:34;;;-1:-1:-1;;;;;67878:28:0;::::1;::::0;::::1;::::0;11364:18:1;;67878:124:0::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;67758:252:::0;;:::o;63815:37::-;;;;;;;:::i;66573:473::-;66691:13;66740:16;66748:7;66740;:16::i;:::-;66722:105;;;;-1:-1:-1;;;66722:105:0;;11771:2:1;66722:105:0;;;11753:21:1;11810:2;11790:18;;;11783:30;11849:34;11829:18;;;11822:62;-1:-1:-1;;;11900:18:1;;;11893:45;11955:19;;66722:105:0;11569:411:1;66722:105:0;66838:28;66869:10;:8;:10::i;:::-;66838:41;;66928:1;66903:14;66897:28;:32;:141;;;;;;;;;;;;;;;;;66969:14;66985:18;:7;:16;:18::i;:::-;67005:13;66952:67;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;66897:141;66890:148;66573:473;-1:-1:-1;;;66573:473:0:o;67162:151::-;15496:6;;-1:-1:-1;;;;;15496:6:0;14850:10;15644:23;15636:68;;;;-1:-1:-1;;;15636:68:0;;;;;;;:::i;:::-;67272:13:::1;:33;67288:17:::0;67272:13;:33:::1;:::i;16335:238::-:0;15496:6;;-1:-1:-1;;;;;15496:6:0;14850:10;15644:23;15636:68;;;;-1:-1:-1;;;15636:68:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;16438:22:0;::::1;16416:110;;;::::0;-1:-1:-1;;;16416:110:0;;13422:2:1;16416:110:0::1;::::0;::::1;13404:21:1::0;13461:2;13441:18;;;13434:30;13500:34;13480:18;;;13473:62;-1:-1:-1;;;13551:18:1;;;13544:36;13597:19;;16416:110:0::1;13220:402:1::0;16416:110:0::1;16537:28;16556:8;16537:18;:28::i;52938:144::-:0;52995:4;53029:13;;-1:-1:-1;;;;;53029:13:0;53019:23;;:55;;;;-1:-1:-1;;53047:20:0;;;;:11;:20;;;;;:27;-1:-1:-1;;;53047:27:0;;;;53046:28;;52938:144::o;60293:196::-;60408:24;;;;:15;:24;;;;;;:29;;-1:-1:-1;;;;;;60408:29:0;-1:-1:-1;;;;;60408:29:0;;;;;;;;;60453:28;;60408:24;;60453:28;;;;;;;60293:196;;;:::o;55726:2146::-;55841:35;55879:20;55891:7;55879:11;:20::i;:::-;55955:18;;55841:58;;-1:-1:-1;55913:22:0;;-1:-1:-1;;;;;55939:34:0;14850:10;-1:-1:-1;;;;;55939:34:0;;:101;;;-1:-1:-1;56007:18:0;;55990:50;;14850:10;51559:214;:::i;55990:50::-;55939:154;;;-1:-1:-1;14850:10:0;56057:20;56069:7;56057:11;:20::i;:::-;-1:-1:-1;;;;;56057:36:0;;55939:154;55913:181;;56113:17;56108:66;;56139:35;;-1:-1:-1;;;56139:35:0;;;;;;;;;;;56108:66;56211:4;-1:-1:-1;;;;;56189:26:0;:13;:18;;;-1:-1:-1;;;;;56189:26:0;;56185:67;;56224:28;;-1:-1:-1;;;56224:28:0;;;;;;;;;;;56185:67;-1:-1:-1;;;;;56267:16:0;;56263:52;;56292:23;;-1:-1:-1;;;56292:23:0;;;;;;;;;;;56263:52;56438:49;56455:1;56459:7;56468:13;:18;;;56438:8;:49::i;:::-;-1:-1:-1;;;;;56784:18:0;;;;;;;:12;:18;;;;;;;;:31;;-1:-1:-1;;56784:31:0;;;-1:-1:-1;;;;;56784:31:0;;;-1:-1:-1;;56784:31:0;;;;;;;56830:16;;;;;;;;;:29;;;;;;;;-1:-1:-1;56830:29:0;;;;;;;;;;;56877:20;;;:11;:20;;;;;;:30;;-1:-1:-1;;;;;;56922:61:0;;;;-1:-1:-1;;;56967:15:0;56922:61;;;;;;;;;;;57258:11;;;57288:24;;;;;:29;57258:11;;57288:29;57284:471;;57513:13;;-1:-1:-1;;;;;57513:13:0;57499:27;;57495:245;;;57583:18;;;57551:24;;;:11;:24;;;;;;;;:50;;57666:54;;;;-1:-1:-1;;;;;57624:96:0;-1:-1:-1;;;57624:96:0;-1:-1:-1;;;;;;57624:96:0;;;-1:-1:-1;;;;;57551:50:0;;;57624:96;;;;;;;57495:245;56759:1007;57803:7;57799:2;-1:-1:-1;;;;;57784:27:0;57793:4;-1:-1:-1;;;;;57784:27:0;;;;;;;;;;;57822:42;55830:2042;;55726:2146;;;:::o;47888:1114::-;-1:-1:-1;;;;;;;;;;;;;;;;;;;;;;;;48087:13:0;;48030:7;;-1:-1:-1;;;;;48087:13:0;48080:20;;48076:859;;;48121:31;48155:17;;;:11;:17;;;;;;;;;48121:51;;;;;;;;;-1:-1:-1;;;;;48121:51:0;;;;-1:-1:-1;;;48121:51:0;;-1:-1:-1;;;;;48121:51:0;;;;;;;;-1:-1:-1;;;48121:51:0;;;;;;;;;;;;;;48191:729;;48241:14;;-1:-1:-1;;;;;48241:28:0;;48237:101;;48305:9;47888:1114;-1:-1:-1;;;47888:1114:0:o;48237:101::-;-1:-1:-1;;;48680:6:0;48725:17;;;;:11;:17;;;;;;;;;48713:29;;;;;;;;;-1:-1:-1;;;;;48713:29:0;;;;;-1:-1:-1;;;48713:29:0;;-1:-1:-1;;;;;48713:29:0;;;;;;;;-1:-1:-1;;;48713:29:0;;;;;;;;;;;;;48773:28;48769:109;;48841:9;47888:1114;-1:-1:-1;;;47888:1114:0:o;48769:109::-;48640:261;;;48102:833;48076:859;48963:31;;-1:-1:-1;;;48963:31:0;;;;;;;;;;;16734:191;16827:6;;;-1:-1:-1;;;;;16844:17:0;;;-1:-1:-1;;;;;;16844:17:0;;;;;;;16877:40;;16827:6;;;16844:17;16827:6;;16877:40;;16808:16;;16877:40;16797:128;16734:191;:::o;64912:537::-;64963:14;64980:13;:6;64991:1;64980:10;:13::i;:::-;65026:4;;65032:6;;64963:30;;-1:-1:-1;65004:35:0;;-1:-1:-1;;;;;65026:4:0;;;;65032:6;65004:21;:35::i;:::-;65050:16;65069:20;65079:9;65069;:20::i;:::-;65050:39;-1:-1:-1;65100:15:0;65118:35;65131:21;:6;65142:9;65131:10;:21::i;:::-;65118:12;:35::i;:::-;65186:4;;65192:6;;65100:53;;-1:-1:-1;65164:35:0;;-1:-1:-1;;;;;65186:4:0;;;;65192:6;65164:21;:35::i;:::-;65232:4;;65238:6;;65210:35;;-1:-1:-1;;;;;65232:4:0;;;;65238:6;65210:21;:35::i;:::-;65300:6;;65335:4;;65341;;-1:-1:-1;;;;;65300:6:0;;;;;;65318:16;;65335:4;;;;65341;65347:10;65359:11;65256:22;;65378:42;65422:18;:15;65438:2;65422:18;:::i;:::-;65318:123;;;;;;-1:-1:-1;;;;;;65318:123:0;;;-1:-1:-1;;;;;14042:15:1;;;65318:123:0;;;14024:34:1;14094:15;;;14074:18;;;14067:43;14126:18;;;14119:34;;;;14169:18;;;14162:34;;;;14212:19;;;14205:35;;;;14256:19;;;14249:35;14321:15;;;14300:19;;;14293:44;14353:19;;;14346:35;;;;13958:19;;65318:123:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;64952:497;;;;64912:537;:::o;53091:104::-;53160:27;53170:2;53174:8;53160:27;;;;;;;;;;;;:9;:27::i;61055:923::-;61210:4;-1:-1:-1;;;;;61231:13:0;;18234:19;:23;61227:744;;61284:175;;-1:-1:-1;;;61284:175:0;;-1:-1:-1;;;;;61284:36:0;;;;;:175;;14850:10;;61378:4;;61405:7;;61435:5;;61284:175;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;-1:-1:-1;61284:175:0;;;;;;;;-1:-1:-1;;61284:175:0;;;;;;;;;;;;:::i;:::-;;;61263:653;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;61646:6;:13;61663:1;61646:18;61642:259;;61696:40;;-1:-1:-1;;;61696:40:0;;;;;;;;;;;61642:259;61851:6;61845:13;61836:6;61832:2;61828:15;61821:38;61263:653;-1:-1:-1;;;;;;61523:55:0;-1:-1:-1;;;61523:55:0;;-1:-1:-1;61516:62:0;;61227:744;-1:-1:-1;61955:4:0;61227:744;61055:923;;;;;;:::o;66459:108::-;66519:13;66552:7;66545:14;;;;;:::i;12945:724::-;13001:13;13223:5;13232:1;13223:10;13219:53;;-1:-1:-1;;13250:10:0;;;;;;;;;;;;-1:-1:-1;;;13250:10:0;;;;;12945:724::o;13219:53::-;13297:5;13282:12;13338:78;13345:9;;13338:78;;13371:8;;;;:::i;:::-;;-1:-1:-1;13394:10:0;;-1:-1:-1;13402:2:0;13394:10;;:::i;:::-;;;13338:78;;;13426:19;13458:6;-1:-1:-1;;;;;13448:17:0;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;13448:17:0;;13426:39;;13476:154;13483:10;;13476:154;;13510:11;13520:1;13510:11;;:::i;:::-;;-1:-1:-1;13579:10:0;13587:2;13579:5;:10;:::i;:::-;13566:24;;:2;:24;:::i;:::-;13553:39;;13536:6;13543;13536:14;;;;;;;;:::i;:::-;;;;:56;-1:-1:-1;;;;;13536:56:0;;;;;;;;-1:-1:-1;13607:11:0;13616:2;13607:11;;:::i;:::-;;;13476:154;;9726:98;9784:7;9811:5;9815:1;9811;:5;:::i;66236:214::-;66320:45;;-1:-1:-1;;;66320:45:0;;66352:4;66320:45;;;16439:34:1;-1:-1:-1;;;;;16509:15:1;;;16489:18;;;16482:43;66320:23:0;;;;;16374:18:1;;66320:45:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;66369:1;66320:50;66316:127;;66387:44;;-1:-1:-1;;;66387:44:0;;-1:-1:-1;;;;;10044:32:1;;;66387:44:0;;;10026:51:1;-1:-1:-1;;10093:18:1;;;10086:34;66387:21:0;;;;;9999:18:1;;66387:44:0;9852:274:1;65455:401:0;65568:6;;65610:16;;;65624:1;65610:16;;;;;;;;65507:4;;-1:-1:-1;;;;;65568:6:0;;65507:4;;65610:16;65624:1;65610:16;;;;;;;;-1:-1:-1;;65647:4:0;;65637:7;;;;-1:-1:-1;;;;;;65647:4:0;;65637:7;;-1:-1:-1;65647:4:0;;65637:7;;;;:::i;:::-;;;;;;:14;-1:-1:-1;;;;;65637:14:0;;;-1:-1:-1;;;;;65637:14:0;;;;;65672:42;65662:4;65667:1;65662:7;;;;;;;;:::i;:::-;-1:-1:-1;;;;;65662:52:0;;;:7;;;;;;;;;:52;65725:19;;65747:28;;;65776:5;65725:19;65785:4;65799;65806:18;:15;65822:2;65806:18;:::i;:::-;65747:78;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;65747:78:0;;;;;;;;;;;;:::i;:::-;65725:100;;65843:2;65846:1;65843:5;;;;;;;;:::i;:::-;;;;;;;65836:12;;;;;65455:401;;;:::o;8968:98::-;9026:7;9053:5;9057:1;9053;:5;:::i;65862:366::-;65978:6;;66020:16;;;66034:1;66020:16;;;;;;;;65917:4;;-1:-1:-1;;;;;65978:6:0;;65917:4;;66020:16;66034:1;66020:16;;;;;;;;-1:-1:-1;;66057:4:0;;66047:7;;;;-1:-1:-1;;;;;;66057:4:0;;66047:7;;-1:-1:-1;66057:4:0;;66047:7;;;;:::i;:::-;-1:-1:-1;;;;;66047:14:0;;;:7;;;;;;;;;:14;66082:4;;66072:7;;66082:4;;;66072;;66082;;66072:7;;;;;;:::i;53559:163::-;53682:32;53688:2;53692:8;53702:5;53709:4;54121:20;54144:13;-1:-1:-1;;;;;54144:13:0;-1:-1:-1;;;;;54172:16:0;;54168:48;;54197:19;;-1:-1:-1;;;54197:19:0;;;;;;;;;;;54168:48;54231:8;54243:1;54231:13;54227:44;;54253:18;;-1:-1:-1;;;54253:18:0;;;;;;;;;;;54227:44;-1:-1:-1;;;;;54625:16:0;;;;;;:12;:16;;;;;;;;:44;;-1:-1:-1;;;;;;54684:49:0;;-1:-1:-1;;;;;54625:44:0;;;;;;;54684:49;;;;-1:-1:-1;;54625:44:0;;;;;;54684:49;;;;;;;;;;;;;;;;54751:25;;;:11;:25;;;;;:35;;-1:-1:-1;;;;;;54801:66:0;;;;-1:-1:-1;;;54851:15:0;54801:66;;;;;;;;;;;54751:25;;54938:389;54958:8;54954:1;:12;54938:389;;;54997:38;;55022:12;;-1:-1:-1;;;;;54997:38:0;;;55014:1;;54997:38;;55014:1;;54997:38;55080:4;:89;;;;;55110:59;55141:1;55145:2;55149:12;55163:5;55110:22;:59::i;:::-;55109:60;55080:89;55054:225;;;55219:40;;-1:-1:-1;;;55219:40:0;;;;;;;;;;;55054:225;55297:14;;;;;54968:3;54938:389;;;-1:-1:-1;55344:13:0;:37;;-1:-1:-1;;;;;;55344:37:0;-1:-1:-1;;;;;55344:37:0;;;;;;;;;;55403:60;52340:342;14:131:1;-1:-1:-1;;;;;;88:32:1;;78:43;;68:71;;135:1;132;125:12;150:245;208:6;261:2;249:9;240:7;236:23;232:32;229:52;;;277:1;274;267:12;229:52;316:9;303:23;335:30;359:5;335:30;:::i;592:258::-;664:1;674:113;688:6;685:1;682:13;674:113;;;764:11;;;758:18;745:11;;;738:39;710:2;703:10;674:113;;;805:6;802:1;799:13;796:48;;;-1:-1:-1;;840:1:1;822:16;;815:27;592:258::o;855:::-;897:3;935:5;929:12;962:6;957:3;950:19;978:63;1034:6;1027:4;1022:3;1018:14;1011:4;1004:5;1000:16;978:63;:::i;:::-;1095:2;1074:15;-1:-1:-1;;1070:29:1;1061:39;;;;1102:4;1057:50;;855:258;-1:-1:-1;;855:258:1:o;1118:220::-;1267:2;1256:9;1249:21;1230:4;1287:45;1328:2;1317:9;1313:18;1305:6;1287:45;:::i;1343:180::-;1402:6;1455:2;1443:9;1434:7;1430:23;1426:32;1423:52;;;1471:1;1468;1461:12;1423:52;-1:-1:-1;1494:23:1;;1343:180;-1:-1:-1;1343:180:1:o;1736:173::-;1804:20;;-1:-1:-1;;;;;1853:31:1;;1843:42;;1833:70;;1899:1;1896;1889:12;1833:70;1736:173;;;:::o;1914:254::-;1982:6;1990;2043:2;2031:9;2022:7;2018:23;2014:32;2011:52;;;2059:1;2056;2049:12;2011:52;2082:29;2101:9;2082:29;:::i;:::-;2072:39;2158:2;2143:18;;;;2130:32;;-1:-1:-1;;;1914:254:1:o;2355:328::-;2432:6;2440;2448;2501:2;2489:9;2480:7;2476:23;2472:32;2469:52;;;2517:1;2514;2507:12;2469:52;2540:29;2559:9;2540:29;:::i;:::-;2530:39;;2588:38;2622:2;2611:9;2607:18;2588:38;:::i;:::-;2578:48;;2673:2;2662:9;2658:18;2645:32;2635:42;;2355:328;;;;;:::o;2688:127::-;2749:10;2744:3;2740:20;2737:1;2730:31;2780:4;2777:1;2770:15;2804:4;2801:1;2794:15;2820:275;2891:2;2885:9;2956:2;2937:13;;-1:-1:-1;;2933:27:1;2921:40;;-1:-1:-1;;;;;2976:34:1;;3012:22;;;2973:62;2970:88;;;3038:18;;:::i;:::-;3074:2;3067:22;2820:275;;-1:-1:-1;2820:275:1:o;3100:407::-;3165:5;-1:-1:-1;;;;;3191:6:1;3188:30;3185:56;;;3221:18;;:::i;:::-;3259:57;3304:2;3283:15;;-1:-1:-1;;3279:29:1;3310:4;3275:40;3259:57;:::i;:::-;3250:66;;3339:6;3332:5;3325:21;3379:3;3370:6;3365:3;3361:16;3358:25;3355:45;;;3396:1;3393;3386:12;3355:45;3445:6;3440:3;3433:4;3426:5;3422:16;3409:43;3499:1;3492:4;3483:6;3476:5;3472:18;3468:29;3461:40;3100:407;;;;;:::o;3512:451::-;3581:6;3634:2;3622:9;3613:7;3609:23;3605:32;3602:52;;;3650:1;3647;3640:12;3602:52;3690:9;3677:23;-1:-1:-1;;;;;3715:6:1;3712:30;3709:50;;;3755:1;3752;3745:12;3709:50;3778:22;;3831:4;3823:13;;3819:27;-1:-1:-1;3809:55:1;;3860:1;3857;3850:12;3809:55;3883:74;3949:7;3944:2;3931:16;3926:2;3922;3918:11;3883:74;:::i;3968:186::-;4027:6;4080:2;4068:9;4059:7;4055:23;4051:32;4048:52;;;4096:1;4093;4086:12;4048:52;4119:29;4138:9;4119:29;:::i;4159:118::-;4245:5;4238:13;4231:21;4224:5;4221:32;4211:60;;4267:1;4264;4257:12;4282:315;4347:6;4355;4408:2;4396:9;4387:7;4383:23;4379:32;4376:52;;;4424:1;4421;4414:12;4376:52;4447:29;4466:9;4447:29;:::i;:::-;4437:39;;4526:2;4515:9;4511:18;4498:32;4539:28;4561:5;4539:28;:::i;:::-;4586:5;4576:15;;;4282:315;;;;;:::o;4602:667::-;4697:6;4705;4713;4721;4774:3;4762:9;4753:7;4749:23;4745:33;4742:53;;;4791:1;4788;4781:12;4742:53;4814:29;4833:9;4814:29;:::i;:::-;4804:39;;4862:38;4896:2;4885:9;4881:18;4862:38;:::i;:::-;4852:48;;4947:2;4936:9;4932:18;4919:32;4909:42;;5002:2;4991:9;4987:18;4974:32;-1:-1:-1;;;;;5021:6:1;5018:30;5015:50;;;5061:1;5058;5051:12;5015:50;5084:22;;5137:4;5129:13;;5125:27;-1:-1:-1;5115:55:1;;5166:1;5163;5156:12;5115:55;5189:74;5255:7;5250:2;5237:16;5232:2;5228;5224:11;5189:74;:::i;:::-;5179:84;;;4602:667;;;;;;;:::o;5274:260::-;5342:6;5350;5403:2;5391:9;5382:7;5378:23;5374:32;5371:52;;;5419:1;5416;5409:12;5371:52;5442:29;5461:9;5442:29;:::i;:::-;5432:39;;5490:38;5524:2;5513:9;5509:18;5490:38;:::i;:::-;5480:48;;5274:260;;;;;:::o;5539:380::-;5618:1;5614:12;;;;5661;;;5682:61;;5736:4;5728:6;5724:17;5714:27;;5682:61;5789:2;5781:6;5778:14;5758:18;5755:38;5752:161;;5835:10;5830:3;5826:20;5823:1;5816:31;5870:4;5867:1;5860:15;5898:4;5895:1;5888:15;5752:161;;5539:380;;;:::o;5924:356::-;6126:2;6108:21;;;6145:18;;;6138:30;6204:34;6199:2;6184:18;;6177:62;6271:2;6256:18;;5924:356::o;6495:127::-;6556:10;6551:3;6547:20;6544:1;6537:31;6587:4;6584:1;6577:15;6611:4;6608:1;6601:15;6627:246;6667:4;-1:-1:-1;;;;;6780:10:1;;;;6750;;6802:12;;;6799:38;;;6817:18;;:::i;:::-;6854:13;;6627:246;-1:-1:-1;;;6627:246:1:o;7004:545::-;7106:2;7101:3;7098:11;7095:448;;;7142:1;7167:5;7163:2;7156:17;7212:4;7208:2;7198:19;7282:2;7270:10;7266:19;7263:1;7259:27;7253:4;7249:38;7318:4;7306:10;7303:20;7300:47;;;-1:-1:-1;7341:4:1;7300:47;7396:2;7391:3;7387:12;7384:1;7380:20;7374:4;7370:31;7360:41;;7451:82;7469:2;7462:5;7459:13;7451:82;;;7514:17;;;7495:1;7484:13;7451:82;;7725:1352;7851:3;7845:10;-1:-1:-1;;;;;7870:6:1;7867:30;7864:56;;;7900:18;;:::i;:::-;7929:97;8019:6;7979:38;8011:4;8005:11;7979:38;:::i;:::-;7973:4;7929:97;:::i;:::-;8081:4;;8145:2;8134:14;;8162:1;8157:663;;;;8864:1;8881:6;8878:89;;;-1:-1:-1;8933:19:1;;;8927:26;8878:89;-1:-1:-1;;7682:1:1;7678:11;;;7674:24;7670:29;7660:40;7706:1;7702:11;;;7657:57;8980:81;;8127:944;;8157:663;6951:1;6944:14;;;6988:4;6975:18;;-1:-1:-1;;8193:20:1;;;8311:236;8325:7;8322:1;8319:14;8311:236;;;8414:19;;;8408:26;8393:42;;8506:27;;;;8474:1;8462:14;;;;8341:19;;8311:236;;;8315:3;8575:6;8566:7;8563:19;8560:201;;;8636:19;;;8630:26;-1:-1:-1;;8719:1:1;8715:14;;;8731:3;8711:24;8707:37;8703:42;8688:58;8673:74;;8560:201;-1:-1:-1;;;;;8807:1:1;8791:14;;;8787:22;8774:36;;-1:-1:-1;7725:1352:1:o;9082:168::-;9122:7;9188:1;9184;9180:6;9176:14;9173:1;9170:21;9165:1;9158:9;9151:17;9147:45;9144:71;;;9195:18;;:::i;:::-;-1:-1:-1;9235:9:1;;9082:168::o;9255:184::-;9325:6;9378:2;9366:9;9357:7;9353:23;9349:32;9346:52;;;9394:1;9391;9384:12;9346:52;-1:-1:-1;9417:16:1;;9255:184;-1:-1:-1;9255:184:1:o;10131:245::-;10198:6;10251:2;10239:9;10230:7;10226:23;10222:32;10219:52;;;10267:1;10264;10257:12;10219:52;10299:9;10293:16;10318:28;10340:5;10318:28;:::i;10381:128::-;10421:3;10452:1;10448:6;10445:1;10442:13;10439:39;;;10458:18;;:::i;:::-;-1:-1:-1;10494:9:1;;10381:128::o;11985:1230::-;12209:3;12247:6;12241:13;12273:4;12286:51;12330:6;12325:3;12320:2;12312:6;12308:15;12286:51;:::i;:::-;12400:13;;12359:16;;;;12422:55;12400:13;12359:16;12444:15;;;12422:55;:::i;:::-;12566:13;;12499:20;;;12539:1;;12604:36;12566:13;12604:36;:::i;:::-;12659:1;12676:18;;;12703:141;;;;12858:1;12853:337;;;;12669:521;;12703:141;-1:-1:-1;;12738:24:1;;12724:39;;12815:16;;12808:24;12794:39;;12783:51;;;-1:-1:-1;12703:141:1;;12853:337;12884:6;12881:1;12874:17;12932:2;12929:1;12919:16;12957:1;12971:169;12985:8;12982:1;12979:15;12971:169;;;13067:14;;13052:13;;;13045:37;13110:16;;;;13002:10;;12971:169;;;12975:3;;13171:8;13164:5;13160:20;13153:27;;12669:521;-1:-1:-1;13206:3:1;;11985:1230;-1:-1:-1;;;;;;;;;;11985:1230:1:o;14392:306::-;14480:6;14488;14496;14549:2;14537:9;14528:7;14524:23;14520:32;14517:52;;;14565:1;14562;14555:12;14517:52;14594:9;14588:16;14578:26;;14644:2;14633:9;14629:18;14623:25;14613:35;;14688:2;14677:9;14673:18;14667:25;14657:35;;14392:306;;;;;:::o;14703:489::-;-1:-1:-1;;;;;14972:15:1;;;14954:34;;15024:15;;15019:2;15004:18;;14997:43;15071:2;15056:18;;15049:34;;;15119:3;15114:2;15099:18;;15092:31;;;14897:4;;15140:46;;15166:19;;15158:6;15140:46;:::i;:::-;15132:54;14703:489;-1:-1:-1;;;;;;14703:489:1:o;15197:249::-;15266:6;15319:2;15307:9;15298:7;15294:23;15290:32;15287:52;;;15335:1;15332;15325:12;15287:52;15367:9;15361:16;15386:30;15410:5;15386:30;:::i;15451:135::-;15490:3;15511:17;;;15508:43;;15531:18;;:::i;:::-;-1:-1:-1;15578:1:1;15567:13;;15451:135::o;15591:127::-;15652:10;15647:3;15643:20;15640:1;15633:31;15683:4;15680:1;15673:15;15707:4;15704:1;15697:15;15723:120;15763:1;15789;15779:35;;15794:18;;:::i;:::-;-1:-1:-1;15828:9:1;;15723:120::o;15848:125::-;15888:4;15916:1;15913;15910:8;15907:34;;;15921:18;;:::i;:::-;-1:-1:-1;15958:9:1;;15848:125::o;15978:112::-;16010:1;16036;16026:35;;16041:18;;:::i;:::-;-1:-1:-1;16075:9:1;;15978:112::o;16095:127::-;16156:10;16151:3;16147:20;16144:1;16137:31;16187:4;16184:1;16177:15;16211:4;16208:1;16201:15;16536:980;16798:4;16846:3;16835:9;16831:19;16877:6;16866:9;16859:25;16903:2;16941:6;16936:2;16925:9;16921:18;16914:34;16984:3;16979:2;16968:9;16964:18;16957:31;17008:6;17043;17037:13;17074:6;17066;17059:22;17112:3;17101:9;17097:19;17090:26;;17151:2;17143:6;17139:15;17125:29;;17172:1;17182:195;17196:6;17193:1;17190:13;17182:195;;;17261:13;;-1:-1:-1;;;;;17257:39:1;17245:52;;17352:15;;;;17317:12;;;;17293:1;17211:9;17182:195;;;-1:-1:-1;;;;;;;17433:32:1;;;;17428:2;17413:18;;17406:60;-1:-1:-1;;;17497:3:1;17482:19;17475:35;17394:3;16536:980;-1:-1:-1;;;16536:980:1:o;17521:936::-;17616:6;17647:2;17690;17678:9;17669:7;17665:23;17661:32;17658:52;;;17706:1;17703;17696:12;17658:52;17739:9;17733:16;-1:-1:-1;;;;;17809:2:1;17801:6;17798:14;17795:34;;;17825:1;17822;17815:12;17795:34;17863:6;17852:9;17848:22;17838:32;;17908:7;17901:4;17897:2;17893:13;17889:27;17879:55;;17930:1;17927;17920:12;17879:55;17959:2;17953:9;17981:2;17977;17974:10;17971:36;;;17987:18;;:::i;:::-;18033:2;18030:1;18026:10;18016:20;;18056:28;18080:2;18076;18072:11;18056:28;:::i;:::-;18118:15;;;18188:11;;;18184:20;;;18149:12;;;;18216:19;;;18213:39;;;18248:1;18245;18238:12;18213:39;18272:11;;;;18292:135;18308:6;18303:3;18300:15;18292:135;;;18374:10;;18362:23;;18325:12;;;;18405;;;;18292:135;;;18446:5;17521:936;-1:-1:-1;;;;;;;;17521:936:1:o

Swarm Source

ipfs://56f2d42a5a63896f8c7bddd7ca4fb7fc3ca28d9fb8fa4d20212779fb0e0fe274
Block Transaction Gas Used Reward
Age Block Fee Address BC Fee Address Voting Power Jailed Incoming
Block Uncle Number Difficulty Gas Used Reward
Loading
Make sure to use the "Vote Down" button for any spammy posts, and the "Vote Up" for interesting conversations.