Contract 0x2E768E86F691AFe8a6F9277bBCD9c570Ab868FC0 2

Txn Hash Method
Block
From
To
Value [Txn Fee]
0x5a84ef8e2795c5d82a3a3e48ce9208f9784b39327ede0685cf7234f1cc31e4f6Cashout All231489812022-12-03 5:42:197 mins ago0x38fa9b79a6fb4e79392540e1cb27c47a7829f396 IN  0x2e768e86f691afe8a6f9277bbcd9c570ab868fc00 AVAX0.0389451685 26.5
0x74c9f07b5aeee8ebee574c59c50ad682b48be57210d601fc79cd7d5b424cf352Compound231480432022-12-03 5:10:0539 mins ago0x71776c916cd6792c24a8f0a16f6f6ce6e6884fa0 IN  0x2e768e86f691afe8a6f9277bbcd9c570ab868fc00 AVAX0.0072486245 26.5
0x77215ec8a12ee261be3c091ebdabe8823f6d14c4b4cc5e34afe074b6d957968aCompound231466292022-12-03 4:21:301 hr 27 mins ago0xdc49bea6f527e7c889969c9380c5232cea90a3ed IN  0x2e768e86f691afe8a6f9277bbcd9c570ab868fc00 AVAX0.1330572685 26.5
0x1b5bea32613f349d034b950800c4a0a59449ac6063682d09ebbad6aabd543f66Pay Mainteneance231462632022-12-03 4:09:021 hr 40 mins ago0x32353661361596642b25f1c0e8006174d3a5b476 IN  0x2e768e86f691afe8a6f9277bbcd9c570ab868fc00 AVAX0.037330340025 26.175
0x19b4039301bfb7daa6589854fda2b9556cb49f8456c3b48d4a6efd13d9643fa9Compound231459322022-12-03 3:57:411 hr 51 mins ago0x2a7d0c62149cbb2673f854943bf1258f45ec33a3 IN  0x2e768e86f691afe8a6f9277bbcd9c570ab868fc00 AVAX0.0429668085 26.5
0xc377947dbcb106d7b187f940879036e9fc8af05a7a4be0c4c7499841c238e75fPay Mainteneance231444332022-12-03 3:06:052 hrs 43 mins ago0x32353661361596642b25f1c0e8006174d3a5b476 IN  0x2e768e86f691afe8a6f9277bbcd9c570ab868fc00 AVAX0.037063728 26
0xa12fd0ebe9051f75ce7f95bd91437aef2aadbb5505ca9a89a569ff0fc7df2213Pay Mainteneance231443832022-12-03 3:04:252 hrs 44 mins ago0x32353661361596642b25f1c0e8006174d3a5b476 IN  0x2e768e86f691afe8a6f9277bbcd9c570ab868fc00 AVAX0.03766538739 26.41
0xe7ccc850430c12d02fec11a03dbcde23a553458a7726c5eafcfdf43c96ad57c2Pay Mainteneance231443422022-12-03 3:03:012 hrs 46 mins ago0x32353661361596642b25f1c0e8006174d3a5b476 IN  0x2e768e86f691afe8a6f9277bbcd9c570ab868fc00 AVAX0.037510351674 26.3254
0xe4e9557579ccc8c9d6b6884d33ec7ee52801b9847c215cb3bca6564ece4aa75cPay Mainteneance231443092022-12-03 3:01:542 hrs 47 mins ago0x32353661361596642b25f1c0e8006174d3a5b476 IN  0x2e768e86f691afe8a6f9277bbcd9c570ab868fc00 AVAX0.037080654 26
0x4ef73bcc8cc2a205e491d2aad1dee16d8d5de742b03a559003359c128650780eCashout All231432822022-12-03 2:26:133 hrs 23 mins ago0x32353661361596642b25f1c0e8006174d3a5b476 IN  0x2e768e86f691afe8a6f9277bbcd9c570ab868fc00 AVAX0.07040029188 26.41
0xefcbe28798f5dd946be167c0fce9f236bc9281432c37a5c8229b10965e9bbbacPay Mainteneance231424232022-12-03 1:56:473 hrs 52 mins ago0x46e9b39248b8edbc78cd8ee550f71875e5297319 IN  0x2e768e86f691afe8a6f9277bbcd9c570ab868fc00 AVAX0.004920255 26.5
0xb239c672c6775e5984eac0d81d7a01a8fd86bc8c20ccc6380495e77bcfc9e6b9Pay Mainteneance231423822022-12-03 1:55:253 hrs 53 mins ago0x46e9b39248b8edbc78cd8ee550f71875e5297319 IN  0x2e768e86f691afe8a6f9277bbcd9c570ab868fc00 AVAX0.004903295 26.5
0xdb48852e9bf99f0b17745f6982e4f6871b8f1041357c8cf4ffd8bdf6e4d6b6f7Approve231423442022-12-03 1:54:093 hrs 55 mins ago0x46e9b39248b8edbc78cd8ee550f71875e5297319 IN  0x2e768e86f691afe8a6f9277bbcd9c570ab868fc00 AVAX0.00124688004 26.6975
0xb016941cfac5efa4d5da086621680000ab06e8bb6e99207bd9952a0b8c53a2c7Pay Mainteneance231382802022-12-02 23:35:106 hrs 14 mins ago0x399892816e873eb1a5e2ee62aff73350f188e285 IN  0x2e768e86f691afe8a6f9277bbcd9c570ab868fc00 AVAX0.0081512145 26.5
0xd3c97325f8876b66a189e3c424f578cc77e2ed9801c182eaf54aae9440c96f0fPay Mainteneance231382492022-12-02 23:34:066 hrs 15 mins ago0x399892816e873eb1a5e2ee62aff73350f188e285 IN  0x2e768e86f691afe8a6f9277bbcd9c570ab868fc00 AVAX0.0081514265 26.5
0x7b0f9cb12323fe3e6bdb4c8e00eaeba821f315e115b9f5da04d0b2accf4f3be5Pay Mainteneance231382202022-12-02 23:33:066 hrs 16 mins ago0x399892816e873eb1a5e2ee62aff73350f188e285 IN  0x2e768e86f691afe8a6f9277bbcd9c570ab868fc00 AVAX0.0081513205 26.5
0x408e91d9b214c7cb3e73e7359d795d5a4bd5bb18cf45953fe004396dfd4b666cPay Mainteneance231381912022-12-02 23:32:056 hrs 17 mins ago0x399892816e873eb1a5e2ee62aff73350f188e285 IN  0x2e768e86f691afe8a6f9277bbcd9c570ab868fc00 AVAX0.008185744 26.5
0xb71a27e3828c7c12d9037b3e55e15a4ac07cd9b8cff17d1531f6c02d3dcc84ffPay Mainteneance231381542022-12-02 23:30:486 hrs 18 mins ago0x399892816e873eb1a5e2ee62aff73350f188e285 IN  0x2e768e86f691afe8a6f9277bbcd9c570ab868fc00 AVAX0.0081685455 26.5
0xe5b63eb508c2bcb26a8eb064a706d8e37f4383a64bdde43dda6099f1daf4f1e4Pay Mainteneance231380992022-12-02 23:28:476 hrs 20 mins ago0x399892816e873eb1a5e2ee62aff73350f188e285 IN  0x2e768e86f691afe8a6f9277bbcd9c570ab868fc00 AVAX0.0081513205 26.5
0xf4f02e9f971b539dce683d2a074a1aeb048bef4678e8bd25f58c37b07a34d00ePay Mainteneance231380112022-12-02 23:25:476 hrs 23 mins ago0x399892816e873eb1a5e2ee62aff73350f188e285 IN  0x2e768e86f691afe8a6f9277bbcd9c570ab868fc00 AVAX0.0081684395 26.5
0x029078ffdcf2f47ae5ad3e83bfb7ce3477069cb86b27ce87e8c816b20b465e65Pay Mainteneance231378982022-12-02 23:21:536 hrs 27 mins ago0x399892816e873eb1a5e2ee62aff73350f188e285 IN  0x2e768e86f691afe8a6f9277bbcd9c570ab868fc00 AVAX0.008134122 26.5
0xcc207770006549514ae8f849ccf83a20a23744f1345b3e7b75fe08faccbb158aPay Mainteneance...231373772022-12-02 23:03:566 hrs 45 mins ago0x8640442592a2212abfb6e8268dadba5035e57fef IN  0x2e768e86f691afe8a6f9277bbcd9c570ab868fc00 AVAX0.0068930475 26.5
0x0a6c8b29a8e7543254675e2b883b51d4cd2853f520b50df7efbe89757508e679Pay Mainteneance231370712022-12-02 22:53:286 hrs 55 mins ago0x0616302b63596cd0155c8c6fd2ce98e8f9881967 IN  0x2e768e86f691afe8a6f9277bbcd9c570ab868fc00 AVAX0.017164103 26.5
0xbf886d7ce209864f0dd54ea34cd3a09f850f8269bd0c91e1de6852b42660063bPay Mainteneance231370132022-12-02 22:51:256 hrs 57 mins ago0x84f0cee6916d7bdceb696ff8d8dd6f1ef0d18e9f IN  0x2e768e86f691afe8a6f9277bbcd9c570ab868fc00 AVAX0.013931209 26.5
0x7492ccb66259559e2e53386a3f81ab7acb31e7c53e36c8ee63baf3d7ce138497Pay Mainteneance231369292022-12-02 22:48:247 hrs ago0x84f0cee6916d7bdceb696ff8d8dd6f1ef0d18e9f IN  0x2e768e86f691afe8a6f9277bbcd9c570ab868fc00 AVAX0.013931315 26.5
[ Download CSV Export 
Latest 25 internal transaction
Parent Txn Hash Block From To Value
0x6a7092d7527949d11e1c3e76f0732927a14fd715b1bcd6469499dd3f2390b939231312282022-12-02 19:35:5310 hrs 13 mins ago 0x8aa8e24b5d70ee45861315cf692e98751489c614 0x2e768e86f691afe8a6f9277bbcd9c570ab868fc00.000124092343022836 AVAX
0x6a7092d7527949d11e1c3e76f0732927a14fd715b1bcd6469499dd3f2390b939231312282022-12-02 19:35:5310 hrs 13 mins ago 0x2e768e86f691afe8a6f9277bbcd9c570ab868fc0 0x8aa8e24b5d70ee45861315cf692e98751489c6140.075330346331894785 AVAX
0x6a7092d7527949d11e1c3e76f0732927a14fd715b1bcd6469499dd3f2390b939231312282022-12-02 19:35:5310 hrs 13 mins ago 0x8aa8e24b5d70ee45861315cf692e98751489c614 0x2e768e86f691afe8a6f9277bbcd9c570ab868fc00.075330346331894785 AVAX
0x6a7092d7527949d11e1c3e76f0732927a14fd715b1bcd6469499dd3f2390b939231312282022-12-02 19:35:5310 hrs 13 mins ago 0x2e768e86f691afe8a6f9277bbcd9c570ab868fc0 0x2db8d878d206c070dfbc325bc43f23a55511c87b0.152324816017738106 AVAX
0x6a7092d7527949d11e1c3e76f0732927a14fd715b1bcd6469499dd3f2390b939231312282022-12-02 19:35:5310 hrs 13 mins ago 0x8aa8e24b5d70ee45861315cf692e98751489c614 0x2e768e86f691afe8a6f9277bbcd9c570ab868fc00.152324816017738106 AVAX
0x3e582ac9c44a6bfaa1b66f791b66e0170cac973932cd952dd22cded02c97dee0230525662022-11-30 22:51:412 days 6 hrs ago 0x2e768e86f691afe8a6f9277bbcd9c570ab868fc0 0x8aa8e24b5d70ee45861315cf692e98751489c6140.003654125073080062 AVAX
0x3e582ac9c44a6bfaa1b66f791b66e0170cac973932cd952dd22cded02c97dee0230525662022-11-30 22:51:412 days 6 hrs ago 0x8aa8e24b5d70ee45861315cf692e98751489c614 0x2e768e86f691afe8a6f9277bbcd9c570ab868fc00.003654125073080062 AVAX
0x3e582ac9c44a6bfaa1b66f791b66e0170cac973932cd952dd22cded02c97dee0230525662022-11-30 22:51:412 days 6 hrs ago 0x2e768e86f691afe8a6f9277bbcd9c570ab868fc0 0x2db8d878d206c070dfbc325bc43f23a55511c87b0.007312096844975565 AVAX
0x3e582ac9c44a6bfaa1b66f791b66e0170cac973932cd952dd22cded02c97dee0230525662022-11-30 22:51:412 days 6 hrs ago 0x8aa8e24b5d70ee45861315cf692e98751489c614 0x2e768e86f691afe8a6f9277bbcd9c570ab868fc00.007312096844975565 AVAX
0x5b0ce61f21f651c6801cbfaa3ffe0add6d5399524243fbd7e5d5f39abec35f42230525432022-11-30 22:50:532 days 6 hrs ago 0x2e768e86f691afe8a6f9277bbcd9c570ab868fc0 0x8aa8e24b5d70ee45861315cf692e98751489c6140.00365797194823375 AVAX
0x5b0ce61f21f651c6801cbfaa3ffe0add6d5399524243fbd7e5d5f39abec35f42230525432022-11-30 22:50:532 days 6 hrs ago 0x8aa8e24b5d70ee45861315cf692e98751489c614 0x2e768e86f691afe8a6f9277bbcd9c570ab868fc00.00365797194823375 AVAX
0x5b0ce61f21f651c6801cbfaa3ffe0add6d5399524243fbd7e5d5f39abec35f42230525432022-11-30 22:50:532 days 6 hrs ago 0x2e768e86f691afe8a6f9277bbcd9c570ab868fc0 0x2db8d878d206c070dfbc325bc43f23a55511c87b0.00731979734981129 AVAX
0x5b0ce61f21f651c6801cbfaa3ffe0add6d5399524243fbd7e5d5f39abec35f42230525432022-11-30 22:50:532 days 6 hrs ago 0x8aa8e24b5d70ee45861315cf692e98751489c614 0x2e768e86f691afe8a6f9277bbcd9c570ab868fc00.00731979734981129 AVAX
0x278a6514d8a46ac15d0a00debb554e19f6d480ce38ba659c3ed556040e3fdf40230525292022-11-30 22:50:202 days 6 hrs ago 0x2e768e86f691afe8a6f9277bbcd9c570ab868fc0 0x8aa8e24b5d70ee45861315cf692e98751489c6140.003661792169367097 AVAX
0x278a6514d8a46ac15d0a00debb554e19f6d480ce38ba659c3ed556040e3fdf40230525292022-11-30 22:50:202 days 6 hrs ago 0x8aa8e24b5d70ee45861315cf692e98751489c614 0x2e768e86f691afe8a6f9277bbcd9c570ab868fc00.003661792169367097 AVAX
0x278a6514d8a46ac15d0a00debb554e19f6d480ce38ba659c3ed556040e3fdf40230525292022-11-30 22:50:202 days 6 hrs ago 0x2e768e86f691afe8a6f9277bbcd9c570ab868fc0 0x2db8d878d206c070dfbc325bc43f23a55511c87b0.007327444492765963 AVAX
0x278a6514d8a46ac15d0a00debb554e19f6d480ce38ba659c3ed556040e3fdf40230525292022-11-30 22:50:202 days 6 hrs ago 0x8aa8e24b5d70ee45861315cf692e98751489c614 0x2e768e86f691afe8a6f9277bbcd9c570ab868fc00.007327444492765963 AVAX
0x75c4ebdbd315d72345779d478feebdcc089ff7bc635b1e7bf84aa948d6d85a82230525142022-11-30 22:49:502 days 6 hrs ago 0x8aa8e24b5d70ee45861315cf692e98751489c614 0x2e768e86f691afe8a6f9277bbcd9c570ab868fc00.000013914645865144 AVAX
0x75c4ebdbd315d72345779d478feebdcc089ff7bc635b1e7bf84aa948d6d85a82230525142022-11-30 22:49:502 days 6 hrs ago 0x2e768e86f691afe8a6f9277bbcd9c570ab868fc0 0x8aa8e24b5d70ee45861315cf692e98751489c6140.047754498838345005 AVAX
0x75c4ebdbd315d72345779d478feebdcc089ff7bc635b1e7bf84aa948d6d85a82230525142022-11-30 22:49:502 days 6 hrs ago 0x8aa8e24b5d70ee45861315cf692e98751489c614 0x2e768e86f691afe8a6f9277bbcd9c570ab868fc00.047754498838345005 AVAX
0x75c4ebdbd315d72345779d478feebdcc089ff7bc635b1e7bf84aa948d6d85a82230525142022-11-30 22:49:502 days 6 hrs ago 0x2e768e86f691afe8a6f9277bbcd9c570ab868fc0 0x2db8d878d206c070dfbc325bc43f23a55511c87b0.096169474028661368 AVAX
0x75c4ebdbd315d72345779d478feebdcc089ff7bc635b1e7bf84aa948d6d85a82230525142022-11-30 22:49:502 days 6 hrs ago 0x8aa8e24b5d70ee45861315cf692e98751489c614 0x2e768e86f691afe8a6f9277bbcd9c570ab868fc00.096169474028661368 AVAX
0x63c73b0d78930025923628f609028d6c903995c4416534a61b1d17f92928efdc230357442022-11-30 13:22:172 days 16 hrs ago 0x8aa8e24b5d70ee45861315cf692e98751489c614 0x2e768e86f691afe8a6f9277bbcd9c570ab868fc00.000025619965639161 AVAX
0x63c73b0d78930025923628f609028d6c903995c4416534a61b1d17f92928efdc230357442022-11-30 13:22:172 days 16 hrs ago 0x2e768e86f691afe8a6f9277bbcd9c570ab868fc0 0x8aa8e24b5d70ee45861315cf692e98751489c6140.052151953273988398 AVAX
0x63c73b0d78930025923628f609028d6c903995c4416534a61b1d17f92928efdc230357442022-11-30 13:22:172 days 16 hrs ago 0x8aa8e24b5d70ee45861315cf692e98751489c614 0x2e768e86f691afe8a6f9277bbcd9c570ab868fc00.052151953273988398 AVAX
[ Download CSV Export 
Loading

Contract Source Code Verified (Exact Match)

Contract Name:
APEX

Compiler Version
v0.8.7+commit.e28d00a7

Optimization Enabled:
Yes with 50 runs

Other Settings:
default evmVersion, None license

Contract Source Code (Solidity)

/**
 *Submitted for verification at snowtrace.io on 2022-07-29
*/

// SPDX-License-Identifier: UNLICENSED

pragma solidity ^0.8.0;

library SafeMathUint {
    function toInt256Safe(uint256 a) internal pure returns (int256) {
        int256 b = int256(a);
        require(b >= 0, "toInt256Safe: B LESS THAN ZERO");
        return b;
    }
}

pragma solidity ^0.8.0;

library SafeMathInt {
    int256 private constant MIN_INT256 = int256(1) << 255;
    int256 private constant MAX_INT256 = ~(int256(1) << 255);

    /**
     * @dev Multiplies two int256 variables and fails on overflow.
     */
    function mul(int256 a, int256 b) internal pure returns (int256) {
        int256 c = a * b;

        // Detect overflow when multiplying MIN_INT256 with -1
        require(
            c != MIN_INT256 || (a & MIN_INT256) != (b & MIN_INT256),
            "mul: A B C combi values invalid with MIN_INT256"
        );
        require((b == 0) || (c / b == a), "mul: A B C combi values invalid");
        return c;
    }

    /**
     * @dev Division of two int256 variables and fails on overflow.
     */
    function div(int256 a, int256 b) internal pure returns (int256) {
        // Prevent overflow when dividing MIN_INT256 by -1
        require(b != -1 || a != MIN_INT256, "div: b == 1 OR A == MIN_INT256");

        // Solidity already throws when dividing by 0.
        return a / b;
    }

    /**
     * @dev Subtracts two int256 variables and fails on overflow.
     */
    function sub(int256 a, int256 b) internal pure returns (int256) {
        int256 c = a - b;
        require(
            (b >= 0 && c <= a) || (b < 0 && c > a),
            "sub: A B C combi values invalid"
        );
        return c;
    }

    /**
     * @dev Adds two int256 variables and fails on overflow.
     */
    function add(int256 a, int256 b) internal pure returns (int256) {
        int256 c = a + b;
        require(
            (b >= 0 && c >= a) || (b < 0 && c < a),
            "add: A B C combi values invalid"
        );
        return c;
    }

    /**
     * @dev Converts to absolute value, and fails on overflow.
     */
    function abs(int256 a) internal pure returns (int256) {
        require(a != MIN_INT256, "abs: A EQUAL MIN INT256");
        return a < 0 ? -a : a;
    }

    function toUint256Safe(int256 a) internal pure returns (uint256) {
        require(a >= 0, "toUint256Safe: A LESS THAN ZERO");
        return uint256(a);
    }
}

pragma solidity ^0.8.0;

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

        return c;
    }

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

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

        return c;
    }

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

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

        return c;
    }

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

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

        return c;
    }

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

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

library Strings {
    function indexOf(string memory _base, string memory _value, uint _offset) internal pure returns (int) {
        bytes memory _baseBytes = bytes(_base);
        bytes memory _valueBytes = bytes(_value);

        assert(_valueBytes.length == 1);

        for (uint i = _offset; i < _baseBytes.length; i++) {
            if (_baseBytes[i] == _valueBytes[0]) {
                return int(i);
            }
        }
        return -1;
    }
}

library IterableMapping {
    // Iterable mapping from address to uint;
    struct Map {
        address[] keys;
        mapping(address => uint256) values;
        mapping(address => uint256) indexOf;
        mapping(address => bool) inserted;
    }

    function get(Map storage map, address key) public view returns (uint256) {
        return map.values[key];
    }

    function getIndexOfKey(Map storage map, address key)
    public
    view
    returns (int256)
    {
        if (!map.inserted[key]) {
            return -1;
        }
        return int256(map.indexOf[key]);
    }

    function getKeyAtIndex(Map storage map, uint256 index)
    public
    view
    returns (address)
    {
        return map.keys[index];
    }

    function size(Map storage map) public view returns (uint256) {
        return map.keys.length;
    }

    function set(
        Map storage map,
        address key,
        uint256 val
    ) public {
        if (map.inserted[key]) {
            map.values[key] = val;
        } else {
            map.inserted[key] = true;
            map.values[key] = val;
            map.indexOf[key] = map.keys.length;
            map.keys.push(key);
        }
    }

    function remove(Map storage map, address key) public {
        if (!map.inserted[key]) {
            return;
        }

        delete map.inserted[key];
        delete map.values[key];

        uint256 index = map.indexOf[key];
        uint256 lastIndex = map.keys.length - 1;
        address lastKey = map.keys[lastIndex];

        map.indexOf[lastKey] = index;
        delete map.indexOf[key];

        map.keys[index] = lastKey;
        map.keys.pop();
    }
}

// OpenZeppelin Contracts v4.3.2 (utils/Address.sol)

pragma solidity ^0.8.0;

/**
 * @dev Collection of functions related to the address type
 */
library Address {

    function isContract(address account) internal view returns (bool) {
        uint256 size;
        assembly {
            size := extcodesize(account)
        }
        return size > 0;
    }

    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"
        );
    }

    function functionCall(address target, bytes memory data)
    internal
    returns (bytes memory)
    {
        return functionCall(target, data, "Address: low-level call failed");
    }

    function functionCall(
        address target,
        bytes memory data,
        string memory errorMessage
    ) internal returns (bytes memory) {
        return functionCallWithValue(target, data, 0, errorMessage);
    }

    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"
        );
    }

    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);
    }

    function functionStaticCall(address target, bytes memory data)
    internal
    view
    returns (bytes memory)
    {
        return
        functionStaticCall(
            target,
            data,
            "Address: low-level static call failed"
        );
    }

    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);
    }

    function functionDelegateCall(address target, bytes memory data)
    internal
    returns (bytes memory)
    {
        return
        functionDelegateCall(
            target,
            data,
            "Address: low-level delegate call failed"
        );
    }

    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);
    }

    function verifyCallResult(
        bool success,
        bytes memory returndata,
        string memory errorMessage
    ) internal pure returns (bytes memory) {
        if (success) {
            return returndata;
        } else {
            if (returndata.length > 0) {
                assembly {
                    let returndata_size := mload(returndata)
                    revert(add(32, returndata), returndata_size)
                }
            } else {
                revert(errorMessage);
            }
        }
    }
}

interface IJoeRouter01 {
    function factory() external pure returns (address);

    function WAVAX() external pure returns (address);

    function addLiquidityAVAX(
        address token,
        uint256 amountTokenDesired,
        uint256 amountTokenMin,
        uint256 amountAVAXMin,
        address to,
        uint256 deadline
    )
    external
    payable
    returns (
        uint256 amountToken,
        uint256 amountAVAX,
        uint256 liquidity
    );

}


// pragma solidity >=0.6.2;

interface IJoeRouter02 is IJoeRouter01 {
    function swapExactTokensForAVAXSupportingFeeOnTransferTokens(
        uint256 amountIn,
        uint256 amountOutMin,
        address[] calldata path,
        address to,
        uint256 deadline
    ) external;
}

interface IJoeFactory {
    function createPair(address tokenA, address tokenB) external returns (address pair);
}


pragma solidity ^0.8.0;

abstract contract Context {
    function _msgSender() internal view virtual returns (address) {
        return msg.sender;
    }

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

contract Ownable is Context {
    address private _owner;

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

    constructor() {
        address msgSender = _msgSender();
        _owner = msgSender;
        emit OwnershipTransferred(address(0), msgSender);
    }

    function owner() public view returns (address) {
        return _owner;
    }

    modifier onlyOwner() {
        require(_owner == _msgSender(), "Ownable: caller is not the owner");
        _;
    }

    function renounceOwnership() public virtual onlyOwner {
        emit OwnershipTransferred(_owner, address(0));
        _owner = address(0);
    }

    function transferOwnership(address newOwner) public virtual onlyOwner {
        require(
            newOwner != address(0),
            "Ownable: new owner is the zero address"
        );
        emit OwnershipTransferred(_owner, newOwner);
        _owner = newOwner;
    }
}

interface IERC20 {

    function totalSupply() external view returns (uint256);

    function balanceOf(address account) external view returns (uint256);

    function transfer(address recipient, uint256 amount)
    external
    returns (bool);

    function allowance(address owner, address spender)
    external
    view
    returns (uint256);

    function approve(address spender, uint256 amount) external returns (bool);

    function transferFrom(
        address sender,
        address recipient,
        uint256 amount
    ) external returns (bool);

    event Transfer(address indexed from, address indexed to, uint256 value);

    event Approval(
        address indexed owner,
        address indexed spender,
        uint256 value
    );
}

interface IERC20Metadata is IERC20 {

    function name() external view returns (string memory);

    function symbol() external view returns (string memory);

    function decimals() external view returns (uint8);
}

// OpenZeppelin Contracts v4.3.2 (token/ERC20/utils/SafeERC20.sol)

pragma solidity ^0.8.0;

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)
        );
    }

    function safeApprove(
        IERC20 token,
        address spender,
        uint256 value
    ) internal {
        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
            )
        );
        //}
    }

    function _callOptionalReturn(IERC20 token, bytes memory data) private {
        bytes memory returndata = address(token).functionCall(
            data,
            "SafeERC20: low-level call failed"
        );
        if (returndata.length > 0) {
            // Return data is optional
            require(
                abi.decode(returndata, (bool)),
                "SafeERC20: ERC20 operation did not succeed"
            );
        }
    }
}

contract NODERewardManagement {
    using SafeMath for uint256;
    using IterableMapping for IterableMapping.Map;
    using Strings for string;

    struct NodeEntity {
        string name;
        uint256 creationTime;
        uint256 lastClaimTime;
        uint256 mainteneanceTime; // when the mainteneance was paid last time
        uint256 insuranceTime; // when the insurance was paid last time
        uint256 rewardAvailable;
    }

    IterableMapping.Map private nodeOwners;
    mapping(address => NodeEntity[]) private _nodesOfUser;

    uint256 public nodePrice;
    uint256 public rewardPerNode;
    uint256 public claimTime;

    address public gateKeeper;
    address public token;

    uint256 public totalNodesCreated = 0;
    uint256 public totalRewardStaked = 0;

    uint256 public maxNodesPerWallet = 100;

    uint256 public mainteneancePeriod = 30 days;
    uint256 public insurancePeriod = 30 days;
    uint256 public gracePeriod = 30 days;

    constructor(
        uint256 _nodePrice,
        uint256 _rewardPerNode,
        uint256 _claimTime,
        address _gateKeeper,
        address _token
    ) {
        nodePrice = _nodePrice;
        rewardPerNode = _rewardPerNode;
        claimTime = _claimTime;
        gateKeeper = _gateKeeper;
        token = _token;
    }

    modifier onlySentry() {
        require(msg.sender == token || msg.sender == gateKeeper, "NOT AUTHORIZED");
        _;
    }

    function setMaxNodesPerWallet(uint256 _max) external onlySentry {
        maxNodesPerWallet = _max;
    }

    function setToken (address token_) external onlySentry {
        token = token_;
    }

    function _updateMainteneancePeriod(uint256 value) external onlySentry {
        mainteneancePeriod = value;
    }

    function _updateInsurancePeriod(uint256 value) external onlySentry {
        insurancePeriod = value;
    }

    function _updateGracePeriod(uint256 value) external onlySentry {
        gracePeriod = value;
    }

    function createNode(address account, string memory nodeName) external onlySentry {
        require(_nodesOfUser[account].length < maxNodesPerWallet, "You reached Max Nodes limit!");

        require(nodeName.indexOf("#", 0) == -1, "# is not allowed!");
        require(!_existsNodeWithCreatime(account, block.timestamp), "You have already a node with the current timestamp!");

        _nodesOfUser[account].push(
            NodeEntity({
                name: nodeName,
                creationTime: block.timestamp,
                lastClaimTime: block.timestamp,
                mainteneanceTime: block.timestamp,
                insuranceTime: 0,
                rewardAvailable: 0
            })
        );
        nodeOwners.set(account, _nodesOfUser[account].length);
        totalNodesCreated++;
    }

    function changeNodeName(address account, string memory nodeName, uint256 _creationTime) external onlySentry {
        require(
            bytes(nodeName).length > 3 && bytes(nodeName).length < 32,
            "NODE CREATION: NAME SIZE INVALID"
        );

        require(nodeName.indexOf("#", 0) == -1, "# is not allowed!");

        require(_creationTime > 0, "NODE: CREATIME must be higher than zero");
        NodeEntity[] storage nodes = _nodesOfUser[account];
        uint256 numberOfNodes = nodes.length;
        require(
            numberOfNodes > 0,
            "CASHOUT ERROR: You don't have nodes to rename"
        );
        (,uint256 index) = _getNodeWithCreatime(nodes, _creationTime);

        nodes[index].name = nodeName;

    }

    function createNodeWithTimestamp(address account, string memory nodeName, uint256 timestamp) external onlySentry {
        require(_nodesOfUser[account].length < maxNodesPerWallet, "You reached Max Nodes limit!");
        
        require(
            bytes(nodeName).length > 3 && bytes(nodeName).length < 32,
            "NODE CREATION: NAME SIZE INVALID"
        );

        require(nodeName.indexOf("#", 0) == -1, "# is not allowed!");
        require(!_existsNodeWithCreatime(account, timestamp), "You have already a node with the current timestamp!");

        _nodesOfUser[account].push(
            NodeEntity({
                name: nodeName,
                creationTime: timestamp,
                lastClaimTime: timestamp,
                mainteneanceTime: timestamp,
                insuranceTime: 0,
                rewardAvailable: 0
            })
        );
        nodeOwners.set(account, _nodesOfUser[account].length);
        totalNodesCreated++;
    }

    function isNameAvailable(address account, string memory nodeName) private view returns (bool) {
        NodeEntity[] memory nodes = _nodesOfUser[account];
        for (uint256 i = 0; i < nodes.length; i++) {
            if (keccak256(bytes(nodes[i].name)) == keccak256(bytes(nodeName))) {
                return false;
            }
        }
        return true;
    }

    function _burn(uint256 index) internal {
        require(index < nodeOwners.size());
        nodeOwners.remove(nodeOwners.getKeyAtIndex(index));
    }

    function _existsNodeWithCreatime(address account, uint256 _creationTime) private view returns (bool) {
        NodeEntity[] storage nodes = _nodesOfUser[account];
        uint256 numberOfNodes = nodes.length;

        if(numberOfNodes == 0) return false;

        if(nodes[numberOfNodes - 1].creationTime >= _creationTime) return true;

        return false;
    }

    function _getNodeWithCreatime(NodeEntity[] storage nodes, uint256 _creationTime) private view returns (NodeEntity storage, uint256) {
        uint256 numberOfNodes = nodes.length;
        require(
            numberOfNodes > 0,
            "CASHOUT ERROR: You don't have nodes to cash-out"
        );
        bool found = false;
        int256 index = binary_search(nodes, 0, numberOfNodes, _creationTime);
        uint256 validIndex;
        if (index >= 0) {
            found = true;
            validIndex = uint256(index);
        }
        require(found, "NODE SEARCH: No NODE Found with this blocktime");
        return (nodes[validIndex], validIndex);
    }

    function binary_search(NodeEntity[] memory arr, uint256 low, uint256 high, uint256 x) private view returns (int256) {
        if (high >= low) {
            uint256 mid = (high + low).div(2);
            if (arr[mid].creationTime == x) {
                return int256(mid);
            } else if (arr[mid].creationTime > x) {
                return binary_search(arr, low, mid - 1, x);
            } else {
                return binary_search(arr, mid + 1, high, x);
            }
        } else {
            return -1;
        }
    }

    function _calculateReward(NodeEntity memory node) private view returns (uint256) {
        uint256 lastClaim = node.lastClaimTime;
        uint256 claims = 0;

        if (lastClaim == 0) {
            claims = claims.add(1);
            lastClaim = node.creationTime;
        }

        uint256 currentTime = block.timestamp;
        uint256 _claims = (currentTime.sub(lastClaim)).div(claimTime);
        claims = claims.add(_claims);

        return rewardPerNode.mul(claims);
    }

    function _calculateRewardWithFixedTimestamp(NodeEntity memory node, uint256 timestamp) private view returns (uint256) {
        uint256 lastClaim = node.lastClaimTime;
        uint256 claims = 0;

        if (lastClaim == 0) {
            claims = claims.add(1);
            lastClaim = node.creationTime;
        }

        uint256 currentTime = timestamp;
        uint256 _claims = (currentTime.sub(lastClaim)).div(claimTime);
        claims = claims.add(_claims);

        return rewardPerNode.mul(claims);
    }

    function _cashoutNodeReward(address account, uint256 _creationTime) external onlySentry returns (uint256) {
        require(_creationTime > 0, "NODE: CREATIME must be higher than zero");
        NodeEntity[] storage nodes = _nodesOfUser[account];
        uint256 numberOfNodes = nodes.length;
        require(
            numberOfNodes > 0,
            "CASHOUT ERROR: You don't have nodes to cash-out"
        );
        (NodeEntity storage node, uint256 index) = _getNodeWithCreatime(nodes, _creationTime);

        uint256 rewardNode;

        if(block.timestamp < node.mainteneanceTime + mainteneancePeriod) {
            rewardNode = _calculateReward(node) + node.rewardAvailable;

            nodes[index].lastClaimTime = block.timestamp;
            nodes[index].rewardAvailable = 0;
        } else {

            if(nodes[index].lastClaimTime > nodes[index].mainteneanceTime + mainteneancePeriod) {
                rewardNode = 0;

                nodes[index].lastClaimTime = block.timestamp;
                nodes[index].rewardAvailable = 0;
            } else {
                rewardNode = _calculateRewardWithFixedTimestamp(nodes[index], nodes[index].mainteneanceTime + mainteneancePeriod).add(nodes[index].rewardAvailable);

                nodes[index].rewardAvailable = 0;
                nodes[index].lastClaimTime = block.timestamp;
            }

        }

        totalRewardStaked += rewardNode;

        return rewardNode;
    }

    function _cashoutAllNodesReward(address account) external onlySentry returns (uint256) {
        NodeEntity[] storage nodes = _nodesOfUser[account];
        uint256 nodesCount = nodes.length;
        uint256 rewardsTotal = 0;
        require(nodesCount > 0, "NODE: CREATIME must be higher than zero");
        for (uint256 i = 0; i < nodesCount; i++) {

            if(block.timestamp < nodes[i].mainteneanceTime + mainteneancePeriod) {
                rewardsTotal += _calculateReward(nodes[i]).add(
                    nodes[i].rewardAvailable
                );
                nodes[i].lastClaimTime = block.timestamp;
                nodes[i].rewardAvailable = 0;
            } else {

                if(nodes[i].lastClaimTime > nodes[i].mainteneanceTime + mainteneancePeriod) {
                    rewardsTotal += 0;

                    nodes[i].lastClaimTime = block.timestamp;
                    nodes[i].rewardAvailable = 0;
                } else {
                    rewardsTotal += _calculateRewardWithFixedTimestamp(nodes[i], nodes[i].mainteneanceTime + mainteneancePeriod).add(nodes[i].rewardAvailable);

                    nodes[i].rewardAvailable = 0;
                    nodes[i].lastClaimTime = block.timestamp;
                }

            }

        }

        totalRewardStaked += rewardsTotal;
        return rewardsTotal;
    }

    function _payInsurance(address account, uint256 _creationTime) external onlySentry {
        require(_creationTime > 0, "NODE: CREATIME must be higher than zero");
        NodeEntity[] storage nodes = _nodesOfUser[account];
        uint256 numberOfNodes = nodes.length;
        require(
            numberOfNodes > 0,
            "CASHOUT ERROR: You don't have nodes to pay insurance of"
        );
        (,uint256 index) = _getNodeWithCreatime(nodes, _creationTime);

        if(block.timestamp > nodes[index].mainteneanceTime + mainteneancePeriod + gracePeriod) {
            return;
        }

        if(block.timestamp < nodes[index].insuranceTime + insurancePeriod) {
            nodes[index].insuranceTime += insurancePeriod;
        } else {
            nodes[index].insuranceTime = block.timestamp;
        }

    }

    function _payInsuranceAll(address account) external onlySentry {
        NodeEntity[] storage nodes = _nodesOfUser[account];
        uint256 numberOfNodes = nodes.length;
        require(
            numberOfNodes > 0,
            "CASHOUT ERROR: You don't have nodes to pay insurance of"
        );

        for (uint256 i = 0; i < numberOfNodes; i++) {

            if(block.timestamp > nodes[i].mainteneanceTime + mainteneancePeriod + gracePeriod) {
                continue;
            }

            if(block.timestamp < nodes[i].insuranceTime + insurancePeriod) {
                nodes[i].insuranceTime += insurancePeriod;
            } else {
                nodes[i].insuranceTime = block.timestamp;
            }

        }

    }

    function _payMainteneance(address account, uint256 _creationTime) external onlySentry {
        require(_creationTime > 0, "NODE: CREATIME must be higher than zero");
        NodeEntity[] storage nodes = _nodesOfUser[account];
        uint256 numberOfNodes = nodes.length;
        require(
            numberOfNodes > 0,
            "CASHOUT ERROR: You don't have nodes to pay mainteneance of"
        );
        (,uint256 index) = _getNodeWithCreatime(nodes, _creationTime);

        if(block.timestamp > nodes[index].mainteneanceTime + mainteneancePeriod + gracePeriod) {
            return;
        }

        if(block.timestamp < nodes[index].mainteneanceTime + mainteneancePeriod) {
            nodes[index].mainteneanceTime += mainteneancePeriod;
        } else {

            if(nodes[index].lastClaimTime > nodes[index].mainteneanceTime + mainteneancePeriod) {
                nodes[index].mainteneanceTime = block.timestamp;
                nodes[index].lastClaimTime = block.timestamp;
                nodes[index].rewardAvailable = 0;
            } else {
                nodes[index].rewardAvailable = _calculateRewardWithFixedTimestamp(nodes[index], nodes[index].mainteneanceTime + mainteneancePeriod).add(nodes[index].rewardAvailable);
                nodes[index].mainteneanceTime = block.timestamp;
                nodes[index].lastClaimTime = block.timestamp;
            }

        }

    }

    function _payMainteneanceAll(address account) external onlySentry {
        NodeEntity[] storage nodes = _nodesOfUser[account];
        uint256 numberOfNodes = nodes.length;
        require(
            numberOfNodes > 0,
            "CASHOUT ERROR: You don't have nodes to pay mainteneance of"
        );

        for (uint256 i = 0; i < numberOfNodes; i++) {

            if(block.timestamp > nodes[i].mainteneanceTime + mainteneancePeriod + gracePeriod) {
                continue;
            }

            if(block.timestamp < nodes[i].mainteneanceTime + mainteneancePeriod) {
                nodes[i].mainteneanceTime += mainteneancePeriod;
            } else {
                if(nodes[i].lastClaimTime > nodes[i].mainteneanceTime + mainteneancePeriod) {
                    nodes[i].mainteneanceTime = block.timestamp;
                    nodes[i].lastClaimTime = block.timestamp;
                    nodes[i].rewardAvailable = 0;
                } else {
                    nodes[i].rewardAvailable = _calculateRewardWithFixedTimestamp(nodes[i], nodes[i].mainteneanceTime + mainteneancePeriod).add(nodes[i].rewardAvailable);
                    nodes[i].mainteneanceTime = block.timestamp;
                    nodes[i].lastClaimTime = block.timestamp;
                }
            }

        }

    }

    function claimable(NodeEntity memory node) private view returns (bool) {
        return node.lastClaimTime + claimTime <= block.timestamp;
    }

    function _getRewardAmountOf(address account) external view returns (uint256) {
        uint256 nodesCount;
        uint256 rewardCount = 0;

        NodeEntity[] storage nodes = _nodesOfUser[account];
        nodesCount = nodes.length;

        for (uint256 i = 0; i < nodesCount; i++) {
            rewardCount += _calculateReward(nodes[i]).add(
                nodes[i].rewardAvailable
            );
        }

        return rewardCount;
    }

    function _getValidRewardAmountOf(address account) external view returns (uint256) {
        uint256 nodesCount;
        uint256 rewardCount = 0;

        NodeEntity[] storage nodes = _nodesOfUser[account];
        nodesCount = nodes.length;

        for (uint256 i = 0; i < nodesCount; i++) {
            if(block.timestamp < nodes[i].mainteneanceTime + mainteneancePeriod) {
                rewardCount += _calculateReward(nodes[i]).add(
                    nodes[i].rewardAvailable
                );
            } else {
                if(nodes[i].lastClaimTime > nodes[i].mainteneanceTime + mainteneancePeriod) {
                    rewardCount += 0;
                } else {
                    rewardCount += _calculateRewardWithFixedTimestamp(nodes[i], nodes[i].mainteneanceTime + mainteneancePeriod).add(nodes[i].rewardAvailable);
                }
            }
        }

        return rewardCount;
    }

    function _getRewardAmountOf(address account, uint256 _creationTime) public view returns (uint256) {
        NodeEntity[] storage nodes = _nodesOfUser[account];
        (NodeEntity storage node, ) = _getNodeWithCreatime(
            nodes,
            _creationTime
        );
        uint256 rewardNode = _calculateReward(node).add(node.rewardAvailable);
        return rewardNode;
    }

    function _getValidRewardAmountOf(address account, uint256 _creationTime) public view returns (uint256) {
        NodeEntity[] storage nodes = _nodesOfUser[account];
        (NodeEntity storage node, ) = _getNodeWithCreatime(
            nodes,
            _creationTime
        );

        uint256 rewardNode;

        if(block.timestamp < node.mainteneanceTime + mainteneancePeriod) {  
            rewardNode = _calculateReward(node).add(node.rewardAvailable);
        } else {

            if(node.lastClaimTime > node.mainteneanceTime + mainteneancePeriod) {
                rewardNode = 0;
            } else {
                rewardNode = _calculateRewardWithFixedTimestamp(node, node.mainteneanceTime + mainteneancePeriod).add(node.rewardAvailable);
            }

        }

        return rewardNode;
    }

    function _getMaintainableNodeNumberOf(address account) external view returns (uint256) {

        uint256 nodesCount;
        uint256 validNodesCount = 0;

        NodeEntity[] storage nodes = _nodesOfUser[account];
        nodesCount = nodes.length;

        for (uint256 i = 0; i < nodesCount; i++) {
            if(block.timestamp < nodes[i].mainteneanceTime + mainteneancePeriod + gracePeriod) {
                validNodesCount++;
            }
        }

        return validNodesCount;

    }

    function _getValidNodeNumberOf(address account) external view returns (uint256) {

        uint256 nodesCount;
        uint256 validNodesCount = 0;

        NodeEntity[] storage nodes = _nodesOfUser[account];
        nodesCount = nodes.length;

        for (uint256 i = 0; i < nodesCount; i++) {
            if(block.timestamp < nodes[i].mainteneanceTime + mainteneancePeriod) {
                if(_calculateReward(nodes[i]).add(nodes[i].rewardAvailable) > 0) {
                    validNodesCount++;
                }
            } else {
                if(nodes[i].lastClaimTime > nodes[i].mainteneanceTime + mainteneancePeriod) {
                } else {
                    if(_calculateRewardWithFixedTimestamp(nodes[i], nodes[i].mainteneanceTime + mainteneancePeriod).add(nodes[i].rewardAvailable) > 0) {
                        validNodesCount++;
                    } 
                }
            }
        }

        return validNodesCount;

    }

    function _getNodesNames(address account) external view returns (string memory) {
        require(isNodeOwner(account), "GET NAMES: NO NODE OWNER");
        NodeEntity[] memory nodes = _nodesOfUser[account];
        uint256 nodesCount = nodes.length;
        NodeEntity memory _node;
        string memory names = nodes[0].name;
        string memory separator = "#";
        for (uint256 i = 1; i < nodesCount; i++) {
            _node = nodes[i];
            names = string(abi.encodePacked(names, separator, _node.name));
        }
        return names;
    }

    function _getNodesCreationTime(address account) external view returns (string memory) {
        NodeEntity[] memory nodes = _nodesOfUser[account];
        uint256 nodesCount = nodes.length;
        NodeEntity memory _node;
        string memory _creationTimes = uint2str(nodes[0].creationTime);
        string memory separator = "#";

        for (uint256 i = 1; i < nodesCount; i++) {
            _node = nodes[i];

            _creationTimes = string(
                abi.encodePacked(
                    _creationTimes,
                    separator,
                    uint2str(_node.creationTime)
                )
            );
        }
        return _creationTimes;
    }

    function _getNodesRewardAvailable(address account) external view returns (string memory) {
        NodeEntity[] memory nodes = _nodesOfUser[account];
        uint256 nodesCount = nodes.length;
        NodeEntity memory _node;
        string memory _rewardsAvailable = uint2str(_getRewardAmountOf(account,nodes[0].creationTime));
        string memory separator = "#";

        for (uint256 i = 1; i < nodesCount; i++) {
            _node = nodes[i];

            _rewardsAvailable = string(
                abi.encodePacked(
                    _rewardsAvailable,
                    separator,
                    uint2str(_getRewardAmountOf(account,_node.creationTime))
                )
            );
        }
        return _rewardsAvailable;
    }

    function _getNodesValidRewardAvailable(address account) external view returns (string memory) {
        NodeEntity[] memory nodes = _nodesOfUser[account];
        uint256 nodesCount = nodes.length;
        NodeEntity memory _node;
        string memory _rewardsAvailable = uint2str(_getValidRewardAmountOf(account,nodes[0].creationTime));
        string memory separator = "#";

        for (uint256 i = 1; i < nodesCount; i++) {
            _node = nodes[i];

            _rewardsAvailable = string(
                abi.encodePacked(
                    _rewardsAvailable,
                    separator,
                    uint2str(_getValidRewardAmountOf(account,_node.creationTime))
                )
            );
        }
        return _rewardsAvailable;
    }

    function _getNodesLastClaimTime(address account) external view returns (string memory) {
        NodeEntity[] memory nodes = _nodesOfUser[account];
        uint256 nodesCount = nodes.length;
        NodeEntity memory _node;
        string memory _lastClaimTimes = uint2str(nodes[0].lastClaimTime);
        string memory separator = "#";

        for (uint256 i = 1; i < nodesCount; i++) {
            _node = nodes[i];

            _lastClaimTimes = string(
                abi.encodePacked(
                    _lastClaimTimes,
                    separator,
                    uint2str(_node.lastClaimTime)
                )
            );
        }
        return _lastClaimTimes;
    }

    function _getNodesMainteneanceTime(address account) external view returns (string memory) {
        NodeEntity[] memory nodes = _nodesOfUser[account];
        uint256 nodesCount = nodes.length;
        NodeEntity memory _node;
        string memory _mainteneanceTimes = uint2str(nodes[0].mainteneanceTime);
        string memory separator = "#";

        for (uint256 i = 1; i < nodesCount; i++) {
            _node = nodes[i];

            _mainteneanceTimes = string(
                abi.encodePacked(
                    _mainteneanceTimes,
                    separator,
                    uint2str(_node.mainteneanceTime)
                )
            );
        }
        return _mainteneanceTimes;
    }

    function _getNodesInsuranceTime(address account) external view returns (string memory) {
        NodeEntity[] memory nodes = _nodesOfUser[account];
        uint256 nodesCount = nodes.length;
        NodeEntity memory _node;
        string memory _insuranceTimes = uint2str(nodes[0].insuranceTime);
        string memory separator = "#";

        for (uint256 i = 1; i < nodesCount; i++) {
            _node = nodes[i];

            _insuranceTimes = string(
                abi.encodePacked(
                    _insuranceTimes,
                    separator,
                    uint2str(_node.insuranceTime)
                )
            );
        }
        return _insuranceTimes;
    }

    function uint2str(uint256 _i) internal pure returns (string memory _uintAsString) {
        if (_i == 0) {
            return "0";
        }
        uint256 j = _i;
        uint256 len;
        while (j != 0) {
            len++;
            j /= 10;
        }
        bytes memory bstr = new bytes(len);
        uint256 k = len;
        while (_i != 0) {
            k = k - 1;
            uint8 temp = (48 + uint8(_i - (_i / 10) * 10));
            bytes1 b1 = bytes1(temp);
            bstr[k] = b1;
            _i /= 10;
        }
        return string(bstr);
    }

    function _changeNodePrice(uint256 newNodePrice) external onlySentry {
        nodePrice = newNodePrice;
    }

    function _changeRewardPerNode(uint256 newPrice) external onlySentry {
        rewardPerNode = newPrice;
    }

    function _changeClaimTime(uint256 newTime) external onlySentry {
        claimTime = newTime;
    }

    function _getNodeNumberOf(address account) public view returns (uint256) {
        return nodeOwners.get(account);
    }

    function isNodeOwner(address account) private view returns (bool) {
        return nodeOwners.get(account) > 0;
    }

    function _isNodeOwner(address account) external view returns (bool) {
        return isNodeOwner(account);
    }
}

pragma solidity ^0.8.0;

contract APEX is IERC20, Ownable {
    using SafeMath for uint256;

    NODERewardManagement public nodeRewardManager;

    
    mapping(address => uint256) private _balances;

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

    uint256 private _totalSupply;

    string private _name = "Apex";
    string private _symbol = "APEX";

    IJoeRouter02 public uniswapV2Router;

    address public receiptAddress;
    address public usdcAddress = 0xB97EF9Ef8734C71904D8002F8b6Bc66Dd9c48a6E;

    address public uniswapV2Pair;
    address public treasuryPool;
    address public claimPool;
    address public distributionPool;
    address public mainteneancePool;
    address public insurancePool;

    address public deadWallet = 0x000000000000000000000000000000000000dEaD;

    uint256 public rewardsFee;
    uint256 public liquidityPoolFee;
    uint256 public treasuryFee;
    uint256 public totalFees;

    uint256 public cashoutFee;

    bool private swapping = false;
    bool private swapLiquify = true;
    uint256 public swapTokensAmount;
    bool public isTradingEnabled = false;
    mapping (address => bool) public isFeeExempt;

    uint256 public claimTax = 50000000000000000; // AVAX
    uint256 public mainteneanceTax = 35000000; // USDC
    uint256 public insuranceTax = 3000000; // USDC

    uint256 public maxClaimableNodes = 4;
    bool public sellProtection = true;

    uint256 public sellFee = 30;
    uint256 public feeDenominator = 100;

    uint256 public maxTxnAmount = 100000000000000000000;

    mapping (address => bool) public isTxLimitExempt;
    mapping(address => bool) public isExcludedFromClaim;
    mapping(address => bool) public _isBlacklisted;
    mapping(address => bool) public automatedMarketMakerPairs;
    mapping(address => uint256) public claimedNodes;

    event UpdateUniswapV2Router(
        address indexed newAddress,
        address indexed oldAddress
    );

    event SetAutomatedMarketMakerPair(address indexed pair, bool indexed value);

    event LiquidityWalletUpdated(
        address indexed newLiquidityWallet,
        address indexed oldLiquidityWallet
    );

    event SwapAndLiquify(
        uint256 tokensSwapped,
        uint256 ethReceived,
        uint256 tokensIntoLiqudity
    );

    event Cashout(
        address indexed account,
        uint256 amount,
        uint256 indexed blockTime
    );

    event Compound(
        address indexed account
    );

    constructor(
        address _treasuryPool,
        address _distributionPool,
        address _claimPool,
        address _mainteneancePool,
        address _insurancePool,
        address _receiptAddress,
        uint256[] memory fees,
        uint256 swapAmount,
        address uniV2Router
    ) {

        isFeeExempt[msg.sender] = true;
        isFeeExempt[address(this)] = true;
        isTxLimitExempt[msg.sender] = true;

        treasuryPool = _treasuryPool;
        distributionPool = _distributionPool;
        claimPool = _claimPool;
        mainteneancePool = _mainteneancePool;
        insurancePool = _insurancePool;
        receiptAddress = _receiptAddress;

        require(treasuryPool != address(0) && distributionPool != address(0) && receiptAddress != address(0), "TREASURY, REWARD & RECEIPT ADDRESS CANNOT BE ZERO");

        require(uniV2Router != address(0), "ROUTER CANNOT BE ZERO");
        IJoeRouter02 _uniswapV2Router = IJoeRouter02(uniV2Router);

        address _uniswapV2Pair = IJoeFactory(_uniswapV2Router.factory())
        .createPair(address(this), _uniswapV2Router.WAVAX());

        uniswapV2Router = _uniswapV2Router;
        uniswapV2Pair = _uniswapV2Pair;

        _setAutomatedMarketMakerPair(_uniswapV2Pair, true);

        require(
            fees[0] != 0 && fees[1] != 0 && fees[2] != 0,
            "CONSTR: Fees equal 0"
        );
        treasuryFee = fees[0];
        rewardsFee = fees[1];
        liquidityPoolFee = fees[2];
        cashoutFee = fees[3];

        totalFees = rewardsFee.add(liquidityPoolFee).add(treasuryFee);

        _mint(msg.sender, 1_200_000 * 10**18);

        require(totalSupply() == 1_200_000 * 10**18, "CONSTR: totalSupply is different!");
        require(swapAmount > 0, "CONSTR: Swap amount incorrect");
        swapTokensAmount = swapAmount;
    }

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

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

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

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

    function balanceOf(address account)
    public
    view
    virtual
    override
    returns (uint256)
    {
        return _balances[account];
    }

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

    function approve(address spender, uint256 amount)
    public
    virtual
    override
    returns (bool)
    {
        _approve(_msgSender(), spender, amount);
        return true;
    }

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

    function decreaseAllowance(address spender, uint256 subtractedValue)
    public
    virtual
    returns (bool)
    {
        _approve(
            _msgSender(),
            spender,
            _allowances[_msgSender()][spender].sub(
                subtractedValue,
                "ERC20: decreased allowance below zero"
            )
        );
        return true;
    }

    function _mint(address account, uint256 amount) internal virtual {
        require(account != address(0), "ERC20: mint to the zero address");

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

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

    function _burn(address account, uint256 amount) internal virtual {
        require(account != address(0), "ERC20: burn from the zero address");

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

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

    function _approve(
        address owner,
        address spender,
        uint256 amount
    ) internal virtual {
        require(owner != address(0), "ERC20: approve from the zero address");
        require(spender != address(0), "ERC20: approve to the zero address");

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

    function _beforeTokenTransfer(
        address from,
        address to,
        uint256 amount
    ) internal virtual {}

    function setNodeManagement(address nodeManagement) external onlyOwner {
        nodeRewardManager = NODERewardManagement(nodeManagement);
    }

    function updateUniswapV2Router(address newAddress) public onlyOwner {
        require(newAddress != address(uniswapV2Router), "TKN: The router already has that address");
        emit UpdateUniswapV2Router(newAddress, address(uniswapV2Router));
        uniswapV2Router = IJoeRouter02(newAddress);
        address _uniswapV2Pair = IJoeFactory(uniswapV2Router.factory())
        .createPair(address(this), uniswapV2Router.WAVAX());
        uniswapV2Pair = _uniswapV2Pair;
    }

    function updateSwapTokensAmount(uint256 newVal) external onlyOwner {
        swapTokensAmount = newVal;
    }

    function updateMaxClaimableNodes(uint256 newVal) external onlyOwner {
        maxClaimableNodes = newVal;
    }

    function updateClaimInfo(address payable wall, uint256 value) external onlyOwner {
        claimPool = wall;
        claimTax = value;
    }

    function updateTreasuryInfo(address payable wall) external onlyOwner {
        treasuryPool = wall;
    }

    function updateMainteneanceInfo(address payable wall, uint256 value) external onlyOwner {
        mainteneancePool = wall;
        mainteneanceTax = value;
    }

    function updateInsuranceInfo(address payable wall, uint256 value) external onlyOwner {
        insurancePool = wall;
        insuranceTax = value;
    }

    function updateRewardsInfo(address payable wall) external onlyOwner {
        distributionPool = wall;
    }

    function updateUSDCAddress(address token) external onlyOwner {
        usdcAddress = token;
    }

    function updateSellProtection(bool status) external onlyOwner {
        sellProtection = status;
    }

    function updateMaxTxnAmount(uint256 maxBuy) public onlyOwner {
        maxTxnAmount = maxBuy;
    }


    function updatePeriods(uint256 mainteneancePeriod, uint256 gracePeriod, uint256 insurancePeriod) external onlyOwner {
        nodeRewardManager._updateMainteneancePeriod(mainteneancePeriod);
        nodeRewardManager._updateGracePeriod(gracePeriod);
        nodeRewardManager._updateInsurancePeriod(insurancePeriod);
    }
    
    function updateFees(uint256 _rewardsFee, uint256 _liquidityFee, uint256 _treasuryFee, uint256 _cashoutFee) external onlyOwner {
        rewardsFee = _rewardsFee;
        liquidityPoolFee = _liquidityFee;
        treasuryFee = _treasuryFee;
        cashoutFee = _cashoutFee;
        totalFees = rewardsFee.add(liquidityPoolFee).add(treasuryFee);
    }

    function updateIsTradingEnabled(bool newVal) external onlyOwner {
        isTradingEnabled = newVal;
    }

    function setReceiptAddress(address _receipt) external onlyOwner {
        receiptAddress = _receipt;
    }

    function updateSellFee(uint256 _sellFee, uint256 _feeDenominator) external onlyOwner {
        sellFee = _sellFee;
        feeDenominator = _feeDenominator;
    }

    function setAutomatedMarketMakerPair(address pair, bool value) public onlyOwner {
        require(
            pair != uniswapV2Pair,
            "TKN: The PancakeSwap pair cannot be removed from automatedMarketMakerPairs"
        );

        _setAutomatedMarketMakerPair(pair, value);
    }

    function blacklistMalicious(address account, bool value) external onlyOwner {
        _isBlacklisted[account] = value;
    }

    function setIsTxLimitExempt(address holder, bool exempt) external onlyOwner {
        isTxLimitExempt[holder] = exempt;
    }

    function _setAutomatedMarketMakerPair(address pair, bool value) private {
        require(
            automatedMarketMakerPairs[pair] != value,
            "TKN: Automated market maker pair is already set to that value"
        );
        automatedMarketMakerPairs[pair] = value;

        emit SetAutomatedMarketMakerPair(pair, value);
    }

    function transfer(address recipient, uint256 amount) external override returns (bool) {
        return _transferFrom(msg.sender, recipient, amount);
    }

    function transferFrom(address sender, address recipient, uint256 amount) external override returns (bool) {
        _allowances[sender][msg.sender] = _allowances[sender][msg.sender].sub(amount, "Insufficient Allowance");

        return _transferFrom(sender, recipient, amount);
    }

    function _transferFrom(address sender, address recipient, uint256 amount) internal returns (bool) {        
        require(
            !_isBlacklisted[sender] && !_isBlacklisted[recipient],
            "Blacklisted address"
        );

        if (!isFeeExempt[sender]) {
            require(isTradingEnabled, "TRADING_DISABLED");
        }
        
        if(swapping){ return _basicTransfer(sender, recipient, amount); }

        _balances[sender] = _balances[sender].sub(amount, "Insufficient Balance");

        uint256 amountReceived = shouldTakeFee(sender, recipient, amount) ? takeFee(sender, recipient, amount) : amount;

        uint256 feeAmount = amount - amountReceived;

        if (feeAmount > 0) {
            if(swapLiquify){ 
                swapping = true;
                
                swapAndSendToFee(treasuryPool, feeAmount);

                swapping = false;
            }
        }

        _balances[recipient] = _balances[recipient].add(amountReceived);

        emit Transfer(sender, recipient, amountReceived);
        return true;
    }

    function _basicTransfer(address sender, address recipient, uint256 amount) internal returns (bool) {
        _balances[sender] = _balances[sender].sub(amount, "Insufficient Balance");
        _balances[recipient] = _balances[recipient].add(amount);
        emit Transfer(sender, recipient, amount);
        return true;
    }

    function shouldTakeFee(address sender, address recipient, uint256 amount) internal view returns (bool) {

        address routerAddress = address(uniswapV2Router);
        bool isSell = automatedMarketMakerPairs[recipient] || recipient == routerAddress;
        bool isBuy = automatedMarketMakerPairs[sender] || sender == routerAddress;

        if(isSell) {

            if(sellProtection && !isFeeExempt[sender]) require(nodeRewardManager._getNodeNumberOf(sender) > 0, "You don't own any node!");

            return !isFeeExempt[sender] && !isFeeExempt[recipient];
        } else if(isBuy) {
            require(
                amount <= maxTxnAmount || isTxLimitExempt[sender] || isTxLimitExempt[recipient], 
                "Transfer amount exceeds the maxTxAmount."
            );
            return false;
        } else {
            return false;
        }

    }

    function takeFee(address sender, address receiver, uint256 amount) internal returns (uint256) {
        uint256 feeAmount = amount.mul(sellFee).div(feeDenominator);

        if(feeAmount > 0) {
            _balances[address(this)] = _balances[address(this)].add(feeAmount);
            emit Transfer(sender, address(this), feeAmount);
        }

        return amount.sub(feeAmount);
    }

    function swapAndSendToFee(address destination, uint256 tokens) private {
        uint256 initialETHBalance = address(this).balance;
        swapTokensForEth(tokens);
        uint256 newBalance = (address(this).balance).sub(initialETHBalance);
        (bool success, ) = destination.call{value: newBalance}("");
    }

    function swapAndLiquify(uint256 tokens) private {
        uint256 half = tokens.div(2);
        uint256 otherHalf = tokens.sub(half);

        uint256 initialBalance = address(this).balance;

        swapTokensForEth(half);

        uint256 newBalance = address(this).balance.sub(initialBalance);

        addLiquidity(otherHalf, newBalance);

        emit SwapAndLiquify(half, newBalance, otherHalf);
    }

    function swapTokensForEth(uint256 tokenAmount) private {
        address[] memory path = new address[](2);
        path[0] = address(this);
        path[1] = uniswapV2Router.WAVAX();

        _approve(address(this), address(uniswapV2Router), tokenAmount);

        uniswapV2Router.swapExactTokensForAVAXSupportingFeeOnTransferTokens(
            tokenAmount,
            0, // accept any amount of ETH
            path,
            address(this),
            block.timestamp
        );
    }

    function addLiquidity(uint256 tokenAmount, uint256 ethAmount) private {
        // approve token transfer to cover all possible scenarios
        _approve(address(this), address(uniswapV2Router), tokenAmount);

        // add the liquidity
        uniswapV2Router.addLiquidityAVAX{value: ethAmount}(
            address(this),
            tokenAmount,
            0, // slippage is unavoidable
            0, // slippage is unavoidable
            treasuryPool,
            block.timestamp
        );
    }

    function createNodeWithTokens(string memory nodeName) public {
        require(
            bytes(nodeName).length > 3 && bytes(nodeName).length < 32,
            "NODE CREATION: NAME SIZE INVALID"
        );
        address sender = _msgSender();
        require(
            sender != address(0),
            "NODE CREATION:  creation from the zero address"
        );
        require(!_isBlacklisted[sender], "NODE CREATION: Blacklisted address");
        require(
            sender != treasuryPool && sender != distributionPool,
            "NODE CREATION: treasury and rewardsPool cannot create node"
        );
        uint256 nodePrice = nodeRewardManager.nodePrice();
        require(
            balanceOf(sender) >= nodePrice,
            "NODE CREATION: Balance too low for creation."
        );
        uint256 contractTokenBalance = balanceOf(address(this));
        bool swapAmountOk = contractTokenBalance >= swapTokensAmount;
        if (
            swapAmountOk &&
            swapLiquify &&
            !swapping &&
            sender != owner() &&
            !automatedMarketMakerPairs[sender]
        ) {
            swapping = true;

            uint256 treasuryTokens = contractTokenBalance.mul(treasuryFee).div(100);

            swapAndSendToFee(treasuryPool, treasuryTokens);

            uint256 rewardsPoolTokens = contractTokenBalance
            .mul(rewardsFee)
            .div(100);

            _basicTransfer(
                address(this),
                distributionPool,
                rewardsPoolTokens
            );

            uint256 swapTokens = contractTokenBalance.mul(liquidityPoolFee).div(
                100
            );

            swapAndLiquify(swapTokens);

            swapping = false;
        }
        _basicTransfer(sender, address(this), nodePrice);
        nodeRewardManager.createNode(sender, nodeName);
    }

    function changeNodeName(string memory nodeName, uint256 creationTime) public {
        address sender = _msgSender();

        nodeRewardManager.changeNodeName(sender, nodeName, creationTime);
    }

    receive() external payable {}

    function compound(string memory nodeName) public payable {
        address sender = _msgSender();

        require(
            sender != address(0),
            "MANIA COMPOUND:  creation from the zero address"
        );
        require(!_isBlacklisted[sender], "MANIA COMPOUND: Blacklisted address");
        require(
            sender != treasuryPool && sender != distributionPool,
            "MANIA COMPOUND: treasury and rewardsPool cannot compound rewards"
        );
        uint256 rewardAmount = nodeRewardManager._getValidRewardAmountOf(sender);

        uint256 nodePrice = nodeRewardManager.nodePrice();

        require(
            rewardAmount >= nodePrice,
            "MANIA COMPOUND: You don't have enough reward to compound"
        );

        uint256 compoundedNodesAmount = rewardAmount / nodePrice;

        _basicTransfer(distributionPool, sender, rewardAmount - nodePrice * compoundedNodesAmount);
        nodeRewardManager._cashoutAllNodesReward(sender);
    
        _basicTransfer(distributionPool, address(this), nodePrice * compoundedNodesAmount);

        for(uint i = 0; i < compoundedNodesAmount; i++) {
            nodeRewardManager.createNodeWithTimestamp(sender, nodeName, block.timestamp + i);
        }

        emit Cashout(sender, rewardAmount - nodePrice * compoundedNodesAmount, 0);
        emit Compound(sender);
    }

    function claimNodes(string memory nodeName, uint256 amount) public {
        require(claimedNodes[msg.sender] + amount <= maxClaimableNodes || isExcludedFromClaim[msg.sender], "Max claimable nodes reached!");

        claimedNodes[msg.sender] += amount;

        require(IERC20(receiptAddress).balanceOf(msg.sender) >= amount, "You have not enough receipt tokens!");
        require(IERC20(receiptAddress).allowance(msg.sender, address(this)) >= amount, "You have not approved receipt token yet!");

        IERC20(receiptAddress).transferFrom(msg.sender, deadWallet, amount);

        for(uint i = 0; i < amount; i++) {
            nodeRewardManager.createNodeWithTimestamp(msg.sender, nodeName, block.timestamp + i);
        } 
    }

    function payInsurance(uint256 _creationTime) public payable {

        if(insuranceTax > 0) {

            require(IERC20(usdcAddress).balanceOf(msg.sender) >= insuranceTax, "You have not enough USDC to pay tax!");
            require(IERC20(usdcAddress).allowance(msg.sender, address(this)) >= insuranceTax, "You have not approved USDC yet!");
            IERC20(usdcAddress).transferFrom(msg.sender, insurancePool, insuranceTax);

        }

        address sender = _msgSender();

        nodeRewardManager._payInsurance(sender, _creationTime); 
    }

    function payInsuranceAll() public payable {
        address sender = _msgSender();

        if(insuranceTax > 0) {

            uint256 nodesNumber = nodeRewardManager._getMaintainableNodeNumberOf(sender);

            require(IERC20(usdcAddress).balanceOf(msg.sender) >= insuranceTax * nodesNumber, "You have not enough USDC to pay tax!");
            require(IERC20(usdcAddress).allowance(msg.sender, address(this)) >= insuranceTax * nodesNumber, "You have not approved USDC yet!");
            IERC20(usdcAddress).transferFrom(msg.sender, insurancePool, insuranceTax * nodesNumber);

        }

        nodeRewardManager._payInsuranceAll(sender); 
    }

    function payMainteneance(uint256 _creationTime) public payable {

        if(mainteneanceTax > 0) {

            require(IERC20(usdcAddress).balanceOf(msg.sender) >= mainteneanceTax, "You have not enough USDC to pay tax!");
            require(IERC20(usdcAddress).allowance(msg.sender, address(this)) >= mainteneanceTax, "You have not approved USDC yet!");
            IERC20(usdcAddress).transferFrom(msg.sender, mainteneancePool, mainteneanceTax);

        }

        address sender = _msgSender();

        nodeRewardManager._payMainteneance(sender, _creationTime); 
    }

    function payMainteneanceAll() public payable {
        address sender = _msgSender();

        if(mainteneanceTax > 0) {

            uint256 nodesNumber = nodeRewardManager._getMaintainableNodeNumberOf(sender);

            require(IERC20(usdcAddress).balanceOf(msg.sender) >= mainteneanceTax * nodesNumber, "You have not enough USDC to pay tax!");
            require(IERC20(usdcAddress).allowance(msg.sender, address(this)) >= mainteneanceTax * nodesNumber, "You have not approved USDC yet!");
            IERC20(usdcAddress).transferFrom(msg.sender, mainteneancePool, mainteneanceTax * nodesNumber);

        }

        nodeRewardManager._payMainteneanceAll(sender); 
    }

    function cashoutReward(uint256 blocktime) public payable {
        require(msg.value == claimTax, "You have to pay the claim tax!");
        if(msg.value > 0) claimPool.call{value: msg.value}("");
        address sender = _msgSender();
        require(sender != address(0), "CSHT:  creation from the zero address");
        require(!_isBlacklisted[sender], "MANIA CSHT: Blacklisted address");
        require(
            sender != treasuryPool && sender != distributionPool,
            "CSHT: treasury and rewardsPool cannot cashout rewards"
        );
        uint256 rewardAmount = nodeRewardManager._getValidRewardAmountOf(
            sender,
            blocktime
        );
        require(
            rewardAmount > 0,
            "CSHT: You don't have enough reward to cash out"
        );

        if (swapLiquify) {
            uint256 feeAmount;
            if (cashoutFee > 0) {
                feeAmount = rewardAmount.mul(cashoutFee).div(100);
                _basicTransfer(distributionPool, address(this), feeAmount);
                swapAndSendToFee(treasuryPool, feeAmount);
            }
            rewardAmount -= feeAmount;
        }

        _basicTransfer(distributionPool, sender, rewardAmount);
        nodeRewardManager._cashoutNodeReward(sender, blocktime);

        emit Cashout(sender, rewardAmount, blocktime);
    }

    function cashoutAll() public payable {
        address sender = _msgSender();

        require(msg.value == claimTax * nodeRewardManager._getValidNodeNumberOf(sender), "You have to pay the claim tax!");
        if(msg.value > 0) claimPool.call{value: msg.value}("");

        require(
            sender != address(0),
            "MANIA CSHT:  creation from the zero address"
        );
        require(!_isBlacklisted[sender], "MANIA CSHT: Blacklisted address");
        require(
            sender != treasuryPool && sender != distributionPool,
            "MANIA CSHT: treasury and rewardsPool cannot cashout rewards"
        );
        uint256 rewardAmount = nodeRewardManager._getValidRewardAmountOf(sender);

        require(
            rewardAmount > 0,
            "MANIA CSHT: You don't have enough reward to cash out"
        );
        if (swapLiquify) {
            uint256 feeAmount;
            if (cashoutFee > 0) {
                feeAmount = rewardAmount.mul(cashoutFee).div(100);
                _basicTransfer(distributionPool, address(this), feeAmount);
                swapAndSendToFee(treasuryPool, feeAmount);
            }
            rewardAmount -= feeAmount;
        }
        _basicTransfer(distributionPool, sender, rewardAmount);
        nodeRewardManager._cashoutAllNodesReward(sender);
    
        emit Cashout(sender, rewardAmount, 0);
    }

    function Sweep(uint amount) public onlyOwner {
        if (amount > address(this).balance) amount = address(this).balance;
        (bool success, ) = owner().call{value: amount}("");
    }

    function changeSwapLiquify(bool newVal) public onlyOwner {
        swapLiquify = newVal;
    }

    function changeNodePrice(uint256 newNodePrice) public onlyOwner {
        nodeRewardManager._changeNodePrice(newNodePrice);
    }

    function setIsFeeExempt(address holder, bool exempt) external onlyOwner {
        isFeeExempt[holder] = exempt;
    }

    function setIsExcludedFromClaim(address holder, bool exempt) external onlyOwner {
        isExcludedFromClaim[holder] = exempt;
    }

    function changeRewardPerNode(uint256 newPrice) public onlyOwner {
        nodeRewardManager._changeRewardPerNode(newPrice);
    }

    function changeClaimTime(uint256 newTime) public onlyOwner {
        nodeRewardManager._changeClaimTime(newTime);
    }

    function getNodeNumberOf(address account) public view returns (uint256) {
        return nodeRewardManager._getNodeNumberOf(account);
    }

    function getMaintainableNodeNumberOf(address account) public view returns (uint256) {
        return nodeRewardManager._getMaintainableNodeNumberOf(account);
    }

    function getValidNodeNumberOf(address account) public view returns (uint256) {
        return nodeRewardManager._getValidNodeNumberOf(account);
    }

    function getValidRewardAmount() public view returns (uint256) {
        require(_msgSender() != address(0), "SENDER CAN'T BE ZERO");
        require(
            nodeRewardManager._isNodeOwner(_msgSender()),
            "NO NODE OWNER"
        );
        return nodeRewardManager._getValidRewardAmountOf(_msgSender());
    }

    function getNodesNames() public view returns (string memory) {
        require(_msgSender() != address(0), "SENDER CAN'T BE ZERO");
        require(
            nodeRewardManager._isNodeOwner(_msgSender()),
            "NO NODE OWNER"
        );
        return nodeRewardManager._getNodesNames(_msgSender());
    }

    function getNodesCreatime() public view returns (string memory) {
        require(_msgSender() != address(0), "SENDER CAN'T BE ZERO");
        require(
            nodeRewardManager._isNodeOwner(_msgSender()),
            "NO NODE OWNER"
        );
        return nodeRewardManager._getNodesCreationTime(_msgSender());
    }

    function getNodesValidRewards() public view returns (string memory) {
        require(_msgSender() != address(0), "SENDER CAN'T BE ZERO");
        require(
            nodeRewardManager._isNodeOwner(_msgSender()),
            "NO NODE OWNER"
        );
        return nodeRewardManager._getNodesValidRewardAvailable(_msgSender());
    }

    function getNodesMainteneanceTime() public view returns (string memory) {
        require(_msgSender() != address(0), "SENDER CAN'T BE ZERO");
        require(
            nodeRewardManager._isNodeOwner(_msgSender()),
            "NO NODE OWNER"
        );
        return nodeRewardManager._getNodesMainteneanceTime(_msgSender());
    }

    function getNodesInsuranceTime() public view returns (string memory) {
        require(_msgSender() != address(0), "SENDER CAN'T BE ZERO");
        require(
            nodeRewardManager._isNodeOwner(_msgSender()),
            "NO NODE OWNER"
        );
        return nodeRewardManager._getNodesInsuranceTime(_msgSender());
    }

    function getNodesLastClaims() public view returns (string memory) {
        require(_msgSender() != address(0), "SENDER CAN'T BE ZERO");
        require(
            nodeRewardManager._isNodeOwner(_msgSender()),
            "NO NODE OWNER"
        );
        return nodeRewardManager._getNodesLastClaimTime(_msgSender());
    }
}

Contract ABI

[{"inputs":[{"internalType":"address","name":"_treasuryPool","type":"address"},{"internalType":"address","name":"_distributionPool","type":"address"},{"internalType":"address","name":"_claimPool","type":"address"},{"internalType":"address","name":"_mainteneancePool","type":"address"},{"internalType":"address","name":"_insurancePool","type":"address"},{"internalType":"address","name":"_receiptAddress","type":"address"},{"internalType":"uint256[]","name":"fees","type":"uint256[]"},{"internalType":"uint256","name":"swapAmount","type":"uint256"},{"internalType":"address","name":"uniV2Router","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"spender","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"account","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"},{"indexed":true,"internalType":"uint256","name":"blockTime","type":"uint256"}],"name":"Cashout","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"account","type":"address"}],"name":"Compound","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"newLiquidityWallet","type":"address"},{"indexed":true,"internalType":"address","name":"oldLiquidityWallet","type":"address"}],"name":"LiquidityWalletUpdated","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":"pair","type":"address"},{"indexed":true,"internalType":"bool","name":"value","type":"bool"}],"name":"SetAutomatedMarketMakerPair","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"tokensSwapped","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"ethReceived","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"tokensIntoLiqudity","type":"uint256"}],"name":"SwapAndLiquify","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Transfer","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"newAddress","type":"address"},{"indexed":true,"internalType":"address","name":"oldAddress","type":"address"}],"name":"UpdateUniswapV2Router","type":"event"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"Sweep","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"_isBlacklisted","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"spender","type":"address"}],"name":"allowance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"approve","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"automatedMarketMakerPairs","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"bool","name":"value","type":"bool"}],"name":"blacklistMalicious","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"cashoutAll","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"cashoutFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"blocktime","type":"uint256"}],"name":"cashoutReward","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint256","name":"newTime","type":"uint256"}],"name":"changeClaimTime","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"nodeName","type":"string"},{"internalType":"uint256","name":"creationTime","type":"uint256"}],"name":"changeNodeName","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"newNodePrice","type":"uint256"}],"name":"changeNodePrice","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"newPrice","type":"uint256"}],"name":"changeRewardPerNode","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"newVal","type":"bool"}],"name":"changeSwapLiquify","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"nodeName","type":"string"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"claimNodes","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"claimPool","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"claimTax","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"claimedNodes","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"string","name":"nodeName","type":"string"}],"name":"compound","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"string","name":"nodeName","type":"string"}],"name":"createNodeWithTokens","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"deadWallet","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"decimals","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"subtractedValue","type":"uint256"}],"name":"decreaseAllowance","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"distributionPool","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"feeDenominator","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"getMaintainableNodeNumberOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"getNodeNumberOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getNodesCreatime","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getNodesInsuranceTime","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getNodesLastClaims","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getNodesMainteneanceTime","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getNodesNames","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getNodesValidRewards","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"getValidNodeNumberOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getValidRewardAmount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"addedValue","type":"uint256"}],"name":"increaseAllowance","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"insurancePool","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"insuranceTax","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"isExcludedFromClaim","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"isFeeExempt","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"isTradingEnabled","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"isTxLimitExempt","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"liquidityPoolFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"mainteneancePool","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"mainteneanceTax","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxClaimableNodes","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxTxnAmount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"nodeRewardManager","outputs":[{"internalType":"contract NODERewardManagement","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_creationTime","type":"uint256"}],"name":"payInsurance","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"payInsuranceAll","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_creationTime","type":"uint256"}],"name":"payMainteneance","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"payMainteneanceAll","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"receiptAddress","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"rewardsFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"sellFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"sellProtection","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"pair","type":"address"},{"internalType":"bool","name":"value","type":"bool"}],"name":"setAutomatedMarketMakerPair","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"holder","type":"address"},{"internalType":"bool","name":"exempt","type":"bool"}],"name":"setIsExcludedFromClaim","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"holder","type":"address"},{"internalType":"bool","name":"exempt","type":"bool"}],"name":"setIsFeeExempt","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"holder","type":"address"},{"internalType":"bool","name":"exempt","type":"bool"}],"name":"setIsTxLimitExempt","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"nodeManagement","type":"address"}],"name":"setNodeManagement","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_receipt","type":"address"}],"name":"setReceiptAddress","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"swapTokensAmount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalFees","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"recipient","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transfer","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"sender","type":"address"},{"internalType":"address","name":"recipient","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transferFrom","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"treasuryFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"treasuryPool","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"uniswapV2Pair","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"uniswapV2Router","outputs":[{"internalType":"contract IJoeRouter02","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address payable","name":"wall","type":"address"},{"internalType":"uint256","name":"value","type":"uint256"}],"name":"updateClaimInfo","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_rewardsFee","type":"uint256"},{"internalType":"uint256","name":"_liquidityFee","type":"uint256"},{"internalType":"uint256","name":"_treasuryFee","type":"uint256"},{"internalType":"uint256","name":"_cashoutFee","type":"uint256"}],"name":"updateFees","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address payable","name":"wall","type":"address"},{"internalType":"uint256","name":"value","type":"uint256"}],"name":"updateInsuranceInfo","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"newVal","type":"bool"}],"name":"updateIsTradingEnabled","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address payable","name":"wall","type":"address"},{"internalType":"uint256","name":"value","type":"uint256"}],"name":"updateMainteneanceInfo","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"newVal","type":"uint256"}],"name":"updateMaxClaimableNodes","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"maxBuy","type":"uint256"}],"name":"updateMaxTxnAmount","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"mainteneancePeriod","type":"uint256"},{"internalType":"uint256","name":"gracePeriod","type":"uint256"},{"internalType":"uint256","name":"insurancePeriod","type":"uint256"}],"name":"updatePeriods","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address payable","name":"wall","type":"address"}],"name":"updateRewardsInfo","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_sellFee","type":"uint256"},{"internalType":"uint256","name":"_feeDenominator","type":"uint256"}],"name":"updateSellFee","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"status","type":"bool"}],"name":"updateSellProtection","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"newVal","type":"uint256"}],"name":"updateSwapTokensAmount","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address payable","name":"wall","type":"address"}],"name":"updateTreasuryInfo","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"token","type":"address"}],"name":"updateUSDCAddress","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newAddress","type":"address"}],"name":"updateUniswapV2Router","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"usdcAddress","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"stateMutability":"payable","type":"receive"}]

60c06040526004608081905263082e0caf60e31b60a090815262000027916005919062000984565b5060408051808201909152600480825263082a08ab60e31b6020909201918252620000559160069162000984565b50600980546001600160a01b031990811673b97ef9ef8734c71904d8002f8b6bc66dd9c48a6e179091556010805490911661dead1790556016805461ffff19166101001790556018805460ff1990811690915566b1a2bc2ec50000601a556302160ec0601b55622dc6c0601c556004601d55601e80549091166001178155601f55606460205568056bc75e2d63100000602155348015620000f557600080fd5b506040516200676938038062006769833981016040819052620001189162000a65565b600080546001600160a01b031916339081178255604051909182917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908290a3503360008181526019602090815260408083208054600160ff199182168117909255308552828520805482168317905594845260229092529091208054909216179055600b80546001600160a01b03199081166001600160a01b038c8116918217909355600d805483168c8516179055600c805483168b8516179055600e805483168a8516179055600f805483168985161790556008805490921692871692909217905515801590620002155750600d546001600160a01b031615155b80156200022c57506008546001600160a01b031615155b620002985760405162461bcd60e51b815260206004820152603160248201527f54524541535552592c205245574152442026205245434549505420414444524560448201527053532043414e4e4f54204245205a45524f60781b60648201526084015b60405180910390fd5b6001600160a01b038116620002f05760405162461bcd60e51b815260206004820152601560248201527f524f555445522043414e4e4f54204245205a45524f000000000000000000000060448201526064016200028f565b60008190506000816001600160a01b031663c45a01556040518163ffffffff1660e01b815260040160206040518083038186803b1580156200033157600080fd5b505afa15801562000346573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906200036c919062000a47565b6001600160a01b031663c9c6539630846001600160a01b03166373b295c26040518163ffffffff1660e01b815260040160206040518083038186803b158015620003b557600080fd5b505afa158015620003ca573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620003f0919062000a47565b6040516001600160e01b031960e085901b1681526001600160a01b03928316600482015291166024820152604401602060405180830381600087803b1580156200043957600080fd5b505af11580156200044e573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019062000474919062000a47565b600780546001600160a01b038086166001600160a01b031992831617909255600a8054928416929091169190911790559050620004b381600162000728565b84600081518110620004c957620004c962000c31565b602002602001015160001415801562000500575084600181518110620004f357620004f362000c31565b6020026020010151600014155b80156200052b5750846002815181106200051e576200051e62000c31565b6020026020010151600014155b620005795760405162461bcd60e51b815260206004820152601460248201527f434f4e5354523a204665657320657175616c203000000000000000000000000060448201526064016200028f565b846000815181106200058f576200058f62000c31565b602002602001015160138190555084600181518110620005b357620005b362000c31565b602002602001015160118190555084600281518110620005d757620005d762000c31565b602002602001015160128190555084600381518110620005fb57620005fb62000c31565b6020026020010151601581905550620006426013546200062e6012546011546200081360201b620045581790919060201c565b6200081360201b620045581790919060201c565b6014556200065b3369fe1c215e8f838e0000006200087d565b60045469fe1c215e8f838e00000014620006c25760405162461bcd60e51b815260206004820152602160248201527f434f4e5354523a20746f74616c537570706c7920697320646966666572656e746044820152602160f81b60648201526084016200028f565b60008411620007145760405162461bcd60e51b815260206004820152601d60248201527f434f4e5354523a205377617020616d6f756e7420696e636f727265637400000060448201526064016200028f565b5050506017555062000c5d95505050505050565b6001600160a01b03821660009081526025602052604090205460ff1615158115151415620007bf5760405162461bcd60e51b815260206004820152603d60248201527f544b4e3a204175746f6d61746564206d61726b6574206d616b6572207061697260448201527f20697320616c72656164792073657420746f20746861742076616c756500000060648201526084016200028f565b6001600160a01b038216600081815260256020526040808220805460ff191685151590811790915590519092917fffa9187bf1f18bf477bd0ea1bcbb64e93b6a98132473929edfce215cd9b16fab91a35050565b60008062000822838562000bcd565b905083811015620008765760405162461bcd60e51b815260206004820152601b60248201527f536166654d6174683a206164646974696f6e206f766572666c6f77000000000060448201526064016200028f565b9392505050565b6001600160a01b038216620008d55760405162461bcd60e51b815260206004820152601f60248201527f45524332303a206d696e7420746f20746865207a65726f20616464726573730060448201526064016200028f565b620008f1816004546200081360201b620045581790919060201c565b6004556001600160a01b038216600090815260026020908152604090912054620009269183906200455862000813821b17901c565b6001600160a01b0383166000818152600260205260408082209390935591519091907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef90620009789085815260200190565b60405180910390a35050565b828054620009929062000bf4565b90600052602060002090601f016020900481019282620009b6576000855562000a01565b82601f10620009d157805160ff191683800117855562000a01565b8280016001018555821562000a01579182015b8281111562000a01578251825591602001919060010190620009e4565b5062000a0f92915062000a13565b5090565b5b8082111562000a0f576000815560010162000a14565b80516001600160a01b038116811462000a4257600080fd5b919050565b60006020828403121562000a5a57600080fd5b620008768262000a2a565b60008060008060008060008060006101208a8c03121562000a8557600080fd5b62000a908a62000a2a565b985062000aa060208b0162000a2a565b975062000ab060408b0162000a2a565b965062000ac060608b0162000a2a565b955062000ad060808b0162000a2a565b945062000ae060a08b0162000a2a565b60c08b01519094506001600160401b038082111562000afe57600080fd5b818c0191508c601f83011262000b1357600080fd5b81518181111562000b285762000b2862000c47565b604051601f19603f8360051b01168101818110848211171562000b4f5762000b4f62000c47565b8060405250809250818152602081019250602084018f60208460051b870101111562000b7a57600080fd5b600094505b8285101562000ba05780518452600194909401936020938401930162000b7f565b508096505050505060e08a0151915062000bbe6101008b0162000a2a565b90509295985092959850929598565b6000821982111562000bef57634e487b7160e01b600052601160045260246000fd5b500190565b600181811c9082168062000c0957607f821691505b6020821081141562000c2b57634e487b7160e01b600052602260045260246000fd5b50919050565b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052604160045260246000fd5b615afc8062000c6d6000396000f3fe6080604052600436106104865760003560e01c80636d9ae0be11610257578063a457c2d711610145578063d6f8a5c1116100bc578063d6f8a5c114610de6578063d892934214610e06578063dd62ed3e14610e26578063e6a0d3b914610e6c578063e7096d5614610e82578063e8a68c8a14610e97578063ee1afdbf14610ead578063f2e5cfae14610ec2578063f2fde38b14610ee2578063f74c993414610f02578063f84ba65d14610f22578063fb0a749414610f4257600080fd5b8063a457c2d714610c7b578063a9059cbb14610c9b578063ab2adc0014610cbb578063b62496f514610cdb578063b6bfd24b14610d0b578063bdf24a5314610d2b578063beffc7d414610d40578063c5a9902914610d60578063c5ca7d6d14610d7a578063c6616ba114610d9a578063cc32d17614610dba578063cf46f24c14610dd057600080fd5b806386a686a7116101d957806386a686a714610b3b5780638b42507f14610b435780638d9409c414610b735780638da5cb5b14610b935780638f0ba4ca14610ba85780638f4b6f1014610bc857806395d89b4114610bd05780639a7a23d614610be55780639b03ed9e14610c055780639c82751c14610c255780639caf03ff14610c455780639d9eb16314610c6557600080fd5b80636d9ae0be146109fd5780636e5f640514610a1357806370a0823114610a26578063715018a614610a465780637628b3d714610a5b5780637a8942fc14610a7b5780637b77039214610a9b5780637cf707fc14610abb5780637d81c4c114610adb5780638013858b14610afb57806385141a7714610b1b57600080fd5b8063448883d7116103745780635a5a989a116102f65780635a5a989a146108925780635a6da6e0146108a75780635a8483e0146108c75780635f1c3182146108f45780636138a6061461090a578063658d4b7f1461092a57806365b8dbc01461094a57806365bfe4301461096a578063663719181461097d5780636770474b1461099d57806367b60249146109bd57806369229aa1146109dd57600080fd5b8063448883d71461078357806345b1b0081461079957806348df5829146107b957806349bd5a5e146107d9578063508e264e146107f957806352a1552d1461080c578063545579731461082157806354f12f1f14610829578063583bd7a61461083f57806358fd264a1461085f578063595934551461087f57600080fd5b8063187f003b11610408578063187f003b146105e95780631cc93849146106195780631cdd3be31461063b578063203e727e1461066b57806323b872dd1461068b5780632ae883fd146106ab5780632b14ca56146106cb5780632bb14e1d146106e15780632db7c965146106f7578063313ce5671461071757806339509351146107335780633f4218e01461075357600080fd5b80630259282f1461049257806302d45457146104ba578063064a59d0146104e757806306fdde0314610511578063077bd3c314610533578063095ea7b31461055357806313114a9d14610573578063138a634a146105895780631694505e1461059e578063180b0d7e146105be57806318160ddd146105d457600080fd5b3661048d57005b600080fd5b34801561049e57600080fd5b506104a7610f62565b6040519081526020015b60405180910390f35b3480156104c657600080fd5b506009546104da906001600160a01b031681565b6040516104b191906155f2565b3480156104f357600080fd5b506018546105019060ff1681565b60405190151581526020016104b1565b34801561051d57600080fd5b506105266110a7565b6040516104b191906156b5565b34801561053f57600080fd5b50600e546104da906001600160a01b031681565b34801561055f57600080fd5b5061050161056e3660046152eb565b611139565b34801561057f57600080fd5b506104a760145481565b34801561059557600080fd5b50610526611150565b3480156105aa57600080fd5b506007546104da906001600160a01b031681565b3480156105ca57600080fd5b506104a760205481565b3480156105e057600080fd5b506004546104a7565b3480156105f557600080fd5b506105016106043660046152b1565b60236020526000908152604090205460ff1681565b34801561062557600080fd5b5061063961063436600461553a565b61128c565b005b34801561064757600080fd5b506105016106563660046152b1565b60246020526000908152604090205460ff1681565b34801561067757600080fd5b506106396106863660046154e6565b6113d6565b34801561069757600080fd5b506105016106a6366004615350565b611405565b3480156106b757600080fd5b506106396106c63660046153bf565b611499565b3480156106d757600080fd5b506104a7601f5481565b3480156106ed57600080fd5b506104a760115481565b34801561070357600080fd5b50610639610712366004615391565b6114d6565b34801561072357600080fd5b50604051601281526020016104b1565b34801561073f57600080fd5b5061050161074e3660046152eb565b61152b565b34801561075f57600080fd5b5061050161076e3660046152b1565b60196020526000908152604090205460ff1681565b34801561078f57600080fd5b506104a7601a5481565b3480156107a557600080fd5b506106396107b43660046152b1565b611566565b3480156107c557600080fd5b50600b546104da906001600160a01b031681565b3480156107e557600080fd5b50600a546104da906001600160a01b031681565b6106396108073660046154e6565b6115b2565b34801561081857600080fd5b506105266117f5565b6106396118c5565b34801561083557600080fd5b506104a760125481565b34801561084b57600080fd5b5061063961085a3660046153bf565b611d47565b34801561086b57600080fd5b5061063961087a3660046152eb565b611d8b565b61063961088d3660046153f9565b611ddb565b34801561089e57600080fd5b506105266122b4565b3480156108b357600080fd5b506104a76108c23660046152b1565b612384565b3480156108d357600080fd5b506104a76108e23660046152b1565b60266020526000908152604090205481565b34801561090057600080fd5b506104a760175481565b34801561091657600080fd5b506106396109253660046152b1565b612405565b34801561093657600080fd5b50610639610945366004615391565b612451565b34801561095657600080fd5b506106396109653660046152b1565b6124a6565b6106396109783660046154e6565b612731565b34801561098957600080fd5b506106396109983660046152eb565b612b0d565b3480156109a957600080fd5b506106396109b83660046154e6565b612b5d565b3480156109c957600080fd5b506106396109d83660046152eb565b612b8c565b3480156109e957600080fd5b506106396109f83660046153bf565b612bdc565b348015610a0957600080fd5b506104a760155481565b610639610a213660046154e6565b612c19565b348015610a3257600080fd5b506104a7610a413660046152b1565b612e26565b348015610a5257600080fd5b50610639612e41565b348015610a6757600080fd5b506001546104da906001600160a01b031681565b348015610a8757600080fd5b506104a7610a963660046152b1565b612eb5565b348015610aa757600080fd5b50610639610ab63660046154e6565b612ee6565b348015610ac757600080fd5b506008546104da906001600160a01b031681565b348015610ae757600080fd5b50610639610af63660046152b1565b612f72565b348015610b0757600080fd5b50610639610b163660046154e6565b612fbe565b348015610b2757600080fd5b506010546104da906001600160a01b031681565b610639613019565b348015610b4f57600080fd5b50610501610b5e3660046152b1565b60226020526000908152604090205460ff1681565b348015610b7f57600080fd5b50610639610b8e3660046154a2565b6132ce565b348015610b9f57600080fd5b506104da613302565b348015610bb457600080fd5b50610639610bc33660046153f9565b613311565b610639613778565b348015610bdc57600080fd5b50610526613a2d565b348015610bf157600080fd5b50610639610c00366004615391565b613a3c565b348015610c1157600080fd5b50610639610c203660046154a2565b613b0b565b348015610c3157600080fd5b50610639610c403660046154e6565b613e8c565b348015610c5157600080fd5b50610639610c603660046154e6565b613ee7565b348015610c7157600080fd5b506104a7601d5481565b348015610c8757600080fd5b50610501610c963660046152eb565b613f16565b348015610ca757600080fd5b50610501610cb63660046152eb565b613f65565b348015610cc757600080fd5b50600f546104da906001600160a01b031681565b348015610ce757600080fd5b50610501610cf63660046152b1565b60256020526000908152604090205460ff1681565b348015610d1757600080fd5b50600c546104da906001600160a01b031681565b348015610d3757600080fd5b50610526613f72565b348015610d4c57600080fd5b50610639610d5b366004615518565b614042565b348015610d6c57600080fd5b50601e546105019060ff1681565b348015610d8657600080fd5b50600d546104da906001600160a01b031681565b348015610da657600080fd5b50610639610db5366004615594565b614077565b348015610dc657600080fd5b506104a760135481565b348015610ddc57600080fd5b506104a760215481565b348015610df257600080fd5b50610639610e013660046152b1565b6140d2565b348015610e1257600080fd5b50610639610e21366004615391565b61411e565b348015610e3257600080fd5b506104a7610e41366004615317565b6001600160a01b03918216600090815260036020908152604080832093909416825291909152205490565b348015610e7857600080fd5b506104a7601b5481565b348015610e8e57600080fd5b50610526614173565b348015610ea357600080fd5b506104a7601c5481565b348015610eb957600080fd5b50610526614243565b348015610ece57600080fd5b50610639610edd3660046154e6565b614313565b348015610eee57600080fd5b50610639610efd3660046152b1565b61439c565b348015610f0e57600080fd5b506104a7610f1d3660046152b1565b614486565b348015610f2e57600080fd5b50610639610f3d366004615391565b6144b7565b348015610f4e57600080fd5b50610639610f5d3660046152b1565b61450c565b600033610f8a5760405162461bcd60e51b8152600401610f8190615733565b60405180910390fd5b6001546001600160a01b03166341ac82b0336040518263ffffffff1660e01b8152600401610fb891906155f2565b60206040518083038186803b158015610fd057600080fd5b505afa158015610fe4573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061100891906153dc565b6110245760405162461bcd60e51b8152600401610f81906156c8565b6001546001600160a01b03166310afd86e336040518263ffffffff1660e01b815260040161105291906155f2565b60206040518083038186803b15801561106a57600080fd5b505afa15801561107e573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906110a291906154ff565b905090565b6060600580546110b6906159a3565b80601f01602080910402602001604051908101604052809291908181526020018280546110e2906159a3565b801561112f5780601f106111045761010080835404028352916020019161112f565b820191906000526020600020905b81548152906001019060200180831161111257829003601f168201915b5050505050905090565b60006111463384846145b5565b5060015b92915050565b60603361116f5760405162461bcd60e51b8152600401610f8190615733565b6001546001600160a01b03166341ac82b0336040518263ffffffff1660e01b815260040161119d91906155f2565b60206040518083038186803b1580156111b557600080fd5b505afa1580156111c9573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906111ed91906153dc565b6112095760405162461bcd60e51b8152600401610f81906156c8565b6001546001600160a01b031663334de3a2335b6040518263ffffffff1660e01b815260040161123891906155f2565b60006040518083038186803b15801561125057600080fd5b505afa158015611264573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526110a29190810190615435565b6000546001600160a01b031633146112b65760405162461bcd60e51b8152600401610f8190615806565b60015460405163efe342ef60e01b8152600481018590526001600160a01b039091169063efe342ef90602401600060405180830381600087803b1580156112fc57600080fd5b505af1158015611310573d6000803e3d6000fd5b5050600154604051633060c13b60e11b8152600481018690526001600160a01b0390911692506360c182769150602401600060405180830381600087803b15801561135a57600080fd5b505af115801561136e573d6000803e3d6000fd5b5050600154604051630222a87f60e31b8152600481018590526001600160a01b03909116925063111543f891506024015b600060405180830381600087803b1580156113b957600080fd5b505af11580156113cd573d6000803e3d6000fd5b50505050505050565b6000546001600160a01b031633146114005760405162461bcd60e51b8152600401610f8190615806565b602155565b6040805180820182526016815275496e73756666696369656e7420416c6c6f77616e636560501b6020808301919091526001600160a01b038616600090815260038252838120338252909152918220546114609184906146d1565b6001600160a01b038516600090815260036020908152604080832033845290915290205561148f84848461470b565b90505b9392505050565b6000546001600160a01b031633146114c35760405162461bcd60e51b8152600401610f8190615806565b6018805460ff1916911515919091179055565b6000546001600160a01b031633146115005760405162461bcd60e51b8152600401610f8190615806565b6001600160a01b03919091166000908152602360205260409020805460ff1916911515919091179055565b3360008181526003602090815260408083206001600160a01b038716845290915281205490916111469185906115619086614558565b6145b5565b6000546001600160a01b031633146115905760405162461bcd60e51b8152600401610f8190615806565b600880546001600160a01b0319166001600160a01b0392909216919091179055565b601c541561178d57601c546009546040516370a0823160e01b81526001600160a01b03909116906370a08231906115ed9033906004016155f2565b60206040518083038186803b15801561160557600080fd5b505afa158015611619573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061163d91906154ff565b101561165b5760405162461bcd60e51b8152600401610f81906156ef565b601c54600954604051636eb1769f60e11b81526001600160a01b039091169063dd62ed3e906116909033903090600401615606565b60206040518083038186803b1580156116a857600080fd5b505afa1580156116bc573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906116e091906154ff565b10156116fe5760405162461bcd60e51b8152600401610f8190615798565b600954600f54601c546040516323b872dd60e01b81526001600160a01b03938416936323b872dd936117399333939290911691600401615620565b602060405180830381600087803b15801561175357600080fd5b505af1158015611767573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061178b91906153dc565b505b600154604051636b9901d760e11b815233916001600160a01b03169063d73203ae906117bf908490869060040161569c565b600060405180830381600087803b1580156117d957600080fd5b505af11580156117ed573d6000803e3d6000fd5b505050505050565b6060336118145760405162461bcd60e51b8152600401610f8190615733565b6001546001600160a01b03166341ac82b0336040518263ffffffff1660e01b815260040161184291906155f2565b60206040518083038186803b15801561185a57600080fd5b505afa15801561186e573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061189291906153dc565b6118ae5760405162461bcd60e51b8152600401610f81906156c8565b6001546001600160a01b0316635c71eea63361121c565b600154604051630a77ddb560e31b815233916001600160a01b0316906353beeda8906118f59084906004016155f2565b60206040518083038186803b15801561190d57600080fd5b505afa158015611921573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061194591906154ff565b601a54611952919061593d565b34146119705760405162461bcd60e51b8152600401610f8190615761565b34156119cc57600c546040516001600160a01b03909116903490600081818185875af1925050503d80600081146119c3576040519150601f19603f3d011682016040523d82523d6000602084013e6119c8565b606091505b5050505b6001600160a01b038116611a365760405162461bcd60e51b815260206004820152602b60248201527f4d414e494120435348543a20206372656174696f6e2066726f6d20746865207a60448201526a65726f206164647265737360a81b6064820152608401610f81565b6001600160a01b03811660009081526024602052604090205460ff1615611a6f5760405162461bcd60e51b8152600401610f81906157cf565b600b546001600160a01b03828116911614801590611a9b5750600d546001600160a01b03828116911614155b611b0b5760405162461bcd60e51b815260206004820152603b60248201527f4d414e494120435348543a20747265617375727920616e64207265776172647360448201527a506f6f6c2063616e6e6f7420636173686f7574207265776172647360281b6064820152608401610f81565b600154604051630857ec3760e11b81526000916001600160a01b0316906310afd86e90611b3c9085906004016155f2565b60206040518083038186803b158015611b5457600080fd5b505afa158015611b68573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611b8c91906154ff565b905060008111611bfb5760405162461bcd60e51b815260206004820152603460248201527f4d414e494120435348543a20596f7520646f6e2774206861766520656e6f75676044820152731a081c995dd85c99081d1bc818d85cda081bdd5d60621b6064820152608401610f81565b601654610100900460ff1615611c755760155460009015611c6757611c366064611c306015548561496c90919063ffffffff16565b906149eb565b600d54909150611c50906001600160a01b03163083614a2a565b50600b54611c67906001600160a01b031682614afe565b611c71818361595c565b9150505b600d54611c8c906001600160a01b03168383614a2a565b5060015460405163170a62c760e21b81526001600160a01b0390911690635c298b1c90611cbd9085906004016155f2565b602060405180830381600087803b158015611cd757600080fd5b505af1158015611ceb573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611d0f91906154ff565b506000826001600160a01b0316600080516020615a6283398151915283604051611d3b91815260200190565b60405180910390a35050565b6000546001600160a01b03163314611d715760405162461bcd60e51b8152600401610f8190615806565b601680549115156101000261ff0019909216919091179055565b6000546001600160a01b03163314611db55760405162461bcd60e51b8152600401610f8190615806565b600f80546001600160a01b0319166001600160a01b039390931692909217909155601c55565b3380611e415760405162461bcd60e51b815260206004820152602f60248201527f4d414e494120434f4d504f554e443a20206372656174696f6e2066726f6d207460448201526e6865207a65726f206164647265737360881b6064820152608401610f81565b6001600160a01b03811660009081526024602052604090205460ff1615611eb65760405162461bcd60e51b815260206004820152602360248201527f4d414e494120434f4d504f554e443a20426c61636b6c6973746564206164647260448201526265737360e81b6064820152608401610f81565b600b546001600160a01b03828116911614801590611ee25750600d546001600160a01b03828116911614155b611f56576040805162461bcd60e51b81526020600482015260248101919091527f4d414e494120434f4d504f554e443a20747265617375727920616e642072657760448201527f61726473506f6f6c2063616e6e6f7420636f6d706f756e6420726577617264736064820152608401610f81565b600154604051630857ec3760e11b81526000916001600160a01b0316906310afd86e90611f879085906004016155f2565b60206040518083038186803b158015611f9f57600080fd5b505afa158015611fb3573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611fd791906154ff565b90506000600160009054906101000a90046001600160a01b03166001600160a01b031663f1fec2b86040518163ffffffff1660e01b815260040160206040518083038186803b15801561202957600080fd5b505afa15801561203d573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061206191906154ff565b9050808210156120d45760405162461bcd60e51b815260206004820152603860248201527f4d414e494120434f4d504f554e443a20596f7520646f6e2774206861766520656044820152771b9bdd59da081c995dd85c99081d1bc818dbdb5c1bdd5b9960421b6064820152608401610f81565b60006120e0828461591b565b600d5490915061210d906001600160a01b0316856120fe848661593d565b612108908761595c565b614a2a565b5060015460405163170a62c760e21b81526001600160a01b0390911690635c298b1c9061213e9087906004016155f2565b602060405180830381600087803b15801561215857600080fd5b505af115801561216c573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061219091906154ff565b50600d546121ac906001600160a01b031630612108848661593d565b5060005b81811015612238576001546001600160a01b031663068cc69d86886121d58542615903565b6040518463ffffffff1660e01b81526004016121f393929190615668565b600060405180830381600087803b15801561220d57600080fd5b505af1158015612221573d6000803e3d6000fd5b505050508080612230906159de565b9150506121b0565b5060006001600160a01b038516600080516020615a6283398151915261225e848661593d565b612268908761595c565b60405190815260200160405180910390a36040516001600160a01b038516907fda323bd96658b18a6ce813e824305dc61760462bad6aaf52c65aebb8c8c9faa190600090a25050505050565b6060336122d35760405162461bcd60e51b8152600401610f8190615733565b6001546001600160a01b03166341ac82b0336040518263ffffffff1660e01b815260040161230191906155f2565b60206040518083038186803b15801561231957600080fd5b505afa15801561232d573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061235191906153dc565b61236d5760405162461bcd60e51b8152600401610f81906156c8565b6001546001600160a01b031663216cc0e63361121c565b6001546040516348031c5d60e01b81526000916001600160a01b0316906348031c5d906123b59085906004016155f2565b60206040518083038186803b1580156123cd57600080fd5b505afa1580156123e1573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061114a91906154ff565b6000546001600160a01b0316331461242f5760405162461bcd60e51b8152600401610f8190615806565b600d80546001600160a01b0319166001600160a01b0392909216919091179055565b6000546001600160a01b0316331461247b5760405162461bcd60e51b8152600401610f8190615806565b6001600160a01b03919091166000908152601960205260409020805460ff1916911515919091179055565b6000546001600160a01b031633146124d05760405162461bcd60e51b8152600401610f8190615806565b6007546001600160a01b038281169116141561253f5760405162461bcd60e51b815260206004820152602860248201527f544b4e3a2054686520726f7574657220616c7265616479206861732074686174604482015267206164647265737360c01b6064820152608401610f81565b6007546040516001600160a01b03918216918316907f8fc842bbd331dfa973645f4ed48b11683d501ebf1352708d77a5da2ab49a576e90600090a3600780546001600160a01b0319166001600160a01b0383169081179091556040805163c45a015560e01b815290516000929163c45a0155916004808301926020929190829003018186803b1580156125d157600080fd5b505afa1580156125e5573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061260991906152ce565b6001600160a01b031663c9c6539630600760009054906101000a90046001600160a01b03166001600160a01b03166373b295c26040518163ffffffff1660e01b815260040160206040518083038186803b15801561266657600080fd5b505afa15801561267a573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061269e91906152ce565b6040518363ffffffff1660e01b81526004016126bb929190615606565b602060405180830381600087803b1580156126d557600080fd5b505af11580156126e9573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061270d91906152ce565b600a80546001600160a01b0319166001600160a01b03929092169190911790555050565b601a5434146127525760405162461bcd60e51b8152600401610f8190615761565b34156127ae57600c546040516001600160a01b03909116903490600081818185875af1925050503d80600081146127a5576040519150601f19603f3d011682016040523d82523d6000602084013e6127aa565b606091505b5050505b338061280a5760405162461bcd60e51b815260206004820152602560248201527f435348543a20206372656174696f6e2066726f6d20746865207a65726f206164604482015264647265737360d81b6064820152608401610f81565b6001600160a01b03811660009081526024602052604090205460ff16156128435760405162461bcd60e51b8152600401610f81906157cf565b600b546001600160a01b0382811691161480159061286f5750600d546001600160a01b03828116911614155b6128d95760405162461bcd60e51b815260206004820152603560248201527f435348543a20747265617375727920616e642072657761726473506f6f6c2063604482015274616e6e6f7420636173686f7574207265776172647360581b6064820152608401610f81565b600154604051630179a34160e41b81526000916001600160a01b03169063179a34109061290c908590879060040161569c565b60206040518083038186803b15801561292457600080fd5b505afa158015612938573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061295c91906154ff565b9050600081116129c55760405162461bcd60e51b815260206004820152602e60248201527f435348543a20596f7520646f6e2774206861766520656e6f756768207265776160448201526d1c99081d1bc818d85cda081bdd5d60921b6064820152608401610f81565b601654610100900460ff1615612a395760155460009015612a2b576129fa6064611c306015548561496c90919063ffffffff16565b600d54909150612a14906001600160a01b03163083614a2a565b50600b54612a2b906001600160a01b031682614afe565b612a35818361595c565b9150505b600d54612a50906001600160a01b03168383614a2a565b5060015460405163376db80160e11b81526001600160a01b0390911690636edb700290612a83908590879060040161569c565b602060405180830381600087803b158015612a9d57600080fd5b505af1158015612ab1573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612ad591906154ff565b5082826001600160a01b0316600080516020615a6283398151915283604051612b0091815260200190565b60405180910390a3505050565b6000546001600160a01b03163314612b375760405162461bcd60e51b8152600401610f8190615806565b600e80546001600160a01b0319166001600160a01b039390931692909217909155601b55565b6000546001600160a01b03163314612b875760405162461bcd60e51b8152600401610f8190615806565b601755565b6000546001600160a01b03163314612bb65760405162461bcd60e51b8152600401610f8190615806565b600c80546001600160a01b0319166001600160a01b039390931692909217909155601a55565b6000546001600160a01b03163314612c065760405162461bcd60e51b8152600401610f8190615806565b601e805460ff1916911515919091179055565b601b5415612df457601b546009546040516370a0823160e01b81526001600160a01b03909116906370a0823190612c549033906004016155f2565b60206040518083038186803b158015612c6c57600080fd5b505afa158015612c80573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612ca491906154ff565b1015612cc25760405162461bcd60e51b8152600401610f81906156ef565b601b54600954604051636eb1769f60e11b81526001600160a01b039091169063dd62ed3e90612cf79033903090600401615606565b60206040518083038186803b158015612d0f57600080fd5b505afa158015612d23573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612d4791906154ff565b1015612d655760405162461bcd60e51b8152600401610f8190615798565b600954600e54601b546040516323b872dd60e01b81526001600160a01b03938416936323b872dd93612da09333939290911691600401615620565b602060405180830381600087803b158015612dba57600080fd5b505af1158015612dce573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612df291906153dc565b505b600154604051630e7811cd60e21b815233916001600160a01b0316906339e04734906117bf908490869060040161569c565b6001600160a01b031660009081526002602052604090205490565b6000546001600160a01b03163314612e6b5760405162461bcd60e51b8152600401610f8190615806565b600080546040516001600160a01b03909116907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908390a3600080546001600160a01b0319169055565b600154604051630a77ddb560e31b81526000916001600160a01b0316906353beeda8906123b59085906004016155f2565b6000546001600160a01b03163314612f105760405162461bcd60e51b8152600401610f8190615806565b6001546040516318df5db960e31b8152600481018390526001600160a01b039091169063c6faedc8906024015b600060405180830381600087803b158015612f5757600080fd5b505af1158015612f6b573d6000803e3d6000fd5b5050505050565b6000546001600160a01b03163314612f9c5760405162461bcd60e51b8152600401610f8190615806565b600980546001600160a01b0319166001600160a01b0392909216919091179055565b6000546001600160a01b03163314612fe85760405162461bcd60e51b8152600401610f8190615806565b60015460405163cece91eb60e01b8152600481018390526001600160a01b039091169063cece91eb90602401612f3d565b601c5433901561329e576001546040516348031c5d60e01b81526000916001600160a01b0316906348031c5d906130549085906004016155f2565b60206040518083038186803b15801561306c57600080fd5b505afa158015613080573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906130a491906154ff565b905080601c546130b4919061593d565b6009546040516370a0823160e01b81526001600160a01b03909116906370a08231906130e49033906004016155f2565b60206040518083038186803b1580156130fc57600080fd5b505afa158015613110573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061313491906154ff565b10156131525760405162461bcd60e51b8152600401610f81906156ef565b80601c54613160919061593d565b600954604051636eb1769f60e11b81526001600160a01b039091169063dd62ed3e906131929033903090600401615606565b60206040518083038186803b1580156131aa57600080fd5b505afa1580156131be573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906131e291906154ff565b10156132005760405162461bcd60e51b8152600401610f8190615798565b600954600f54601c546001600160a01b03928316926323b872dd92339291169061322b90869061593d565b6040518463ffffffff1660e01b815260040161324993929190615620565b602060405180830381600087803b15801561326357600080fd5b505af1158015613277573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061329b91906153dc565b50505b600154604051632047aefb60e21b81526001600160a01b039091169063811ebbec90612f3d9084906004016155f2565b60015460405163863b929360e01b815233916001600160a01b03169063863b92939061139f90849087908790600401615668565b6000546001600160a01b031690565b60038151118015613323575060208151105b61336f5760405162461bcd60e51b815260206004820181905260248201527f4e4f4445204352454154494f4e3a204e414d452053495a4520494e56414c49446044820152606401610f81565b33806133d45760405162461bcd60e51b815260206004820152602e60248201527f4e4f4445204352454154494f4e3a20206372656174696f6e2066726f6d20746860448201526d65207a65726f206164647265737360901b6064820152608401610f81565b6001600160a01b03811660009081526024602052604090205460ff16156134485760405162461bcd60e51b815260206004820152602260248201527f4e4f4445204352454154494f4e3a20426c61636b6c6973746564206164647265604482015261737360f01b6064820152608401610f81565b600b546001600160a01b038281169116148015906134745750600d546001600160a01b03828116911614155b6134e35760405162461bcd60e51b815260206004820152603a60248201527f4e4f4445204352454154494f4e3a20747265617375727920616e642072657761604482015279726473506f6f6c2063616e6e6f7420637265617465206e6f646560301b6064820152608401610f81565b60015460408051631e3fd85760e31b815290516000926001600160a01b03169163f1fec2b8916004808301926020929190829003018186803b15801561352857600080fd5b505afa15801561353c573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061356091906154ff565b90508061356c83612e26565b10156135cf5760405162461bcd60e51b815260206004820152602c60248201527f4e4f4445204352454154494f4e3a2042616c616e636520746f6f206c6f77206660448201526b37b91031b932b0ba34b7b71760a11b6064820152608401610f81565b60006135da30612e26565b601754909150811080159081906135f85750601654610100900460ff165b8015613607575060165460ff16155b801561362c5750613616613302565b6001600160a01b0316846001600160a01b031614155b801561365157506001600160a01b03841660009081526025602052604090205460ff16155b15613701576016805460ff1916600117905560135460009061367b90606490611c3090869061496c565b600b54909150613694906001600160a01b031682614afe565b60006136b06064611c306011548761496c90919063ffffffff16565b600d549091506136cb9030906001600160a01b031683614a2a565b5060006136e86064611c306012548861496c90919063ffffffff16565b90506136f381614b72565b50506016805460ff19169055505b61370c843085614a2a565b506001546040516312b8603f60e01b81526001600160a01b03909116906312b8603f9061373f9087908990600401615644565b600060405180830381600087803b15801561375957600080fd5b505af115801561376d573d6000803e3d6000fd5b505050505050505050565b601b543390156139fd576001546040516348031c5d60e01b81526000916001600160a01b0316906348031c5d906137b39085906004016155f2565b60206040518083038186803b1580156137cb57600080fd5b505afa1580156137df573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061380391906154ff565b905080601b54613813919061593d565b6009546040516370a0823160e01b81526001600160a01b03909116906370a08231906138439033906004016155f2565b60206040518083038186803b15801561385b57600080fd5b505afa15801561386f573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061389391906154ff565b10156138b15760405162461bcd60e51b8152600401610f81906156ef565b80601b546138bf919061593d565b600954604051636eb1769f60e11b81526001600160a01b039091169063dd62ed3e906138f19033903090600401615606565b60206040518083038186803b15801561390957600080fd5b505afa15801561391d573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061394191906154ff565b101561395f5760405162461bcd60e51b8152600401610f8190615798565b600954600e54601b546001600160a01b03928316926323b872dd92339291169061398a90869061593d565b6040518463ffffffff1660e01b81526004016139a893929190615620565b602060405180830381600087803b1580156139c257600080fd5b505af11580156139d6573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906139fa91906153dc565b50505b600154604051630a40ec8960e01b81526001600160a01b0390911690630a40ec8990612f3d9084906004016155f2565b6060600680546110b6906159a3565b6000546001600160a01b03163314613a665760405162461bcd60e51b8152600401610f8190615806565b600a546001600160a01b0383811691161415613afd5760405162461bcd60e51b815260206004820152604a60248201527f544b4e3a205468652050616e63616b655377617020706169722063616e6e6f7460448201527f2062652072656d6f7665642066726f6d206175746f6d617465644d61726b65746064820152694d616b6572506169727360b01b608482015260a401610f81565b613b078282614bf9565b5050565b601d5433600090815260266020526040902054613b29908390615903565b111580613b4557503360009081526023602052604090205460ff165b613b915760405162461bcd60e51b815260206004820152601c60248201527f4d617820636c61696d61626c65206e6f646573207265616368656421000000006044820152606401610f81565b3360009081526026602052604081208054839290613bb0908490615903565b90915550506008546040516370a0823160e01b815282916001600160a01b0316906370a0823190613be59033906004016155f2565b60206040518083038186803b158015613bfd57600080fd5b505afa158015613c11573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613c3591906154ff565b1015613c8f5760405162461bcd60e51b815260206004820152602360248201527f596f752068617665206e6f7420656e6f756768207265636569707420746f6b656044820152626e732160e81b6064820152608401610f81565b600854604051636eb1769f60e11b815282916001600160a01b03169063dd62ed3e90613cc19033903090600401615606565b60206040518083038186803b158015613cd957600080fd5b505afa158015613ced573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613d1191906154ff565b1015613d705760405162461bcd60e51b815260206004820152602860248201527f596f752068617665206e6f7420617070726f766564207265636569707420746f6044820152676b656e207965742160c01b6064820152608401610f81565b6008546010546040516323b872dd60e01b81526001600160a01b03928316926323b872dd92613da9923392909116908690600401615620565b602060405180830381600087803b158015613dc357600080fd5b505af1158015613dd7573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613dfb91906153dc565b5060005b81811015613e87576001546001600160a01b031663068cc69d3385613e248542615903565b6040518463ffffffff1660e01b8152600401613e4293929190615668565b600060405180830381600087803b158015613e5c57600080fd5b505af1158015613e70573d6000803e3d6000fd5b505050508080613e7f906159de565b915050613dff565b505050565b6000546001600160a01b03163314613eb65760405162461bcd60e51b8152600401610f8190615806565b60015460405163d1871a8960e01b8152600481018390526001600160a01b039091169063d1871a8990602401612f3d565b6000546001600160a01b03163314613f115760405162461bcd60e51b8152600401610f8190615806565b601d55565b6000611146338461156185604051806060016040528060258152602001615aa2602591393360009081526003602090815260408083206001600160a01b038d16845290915290205491906146d1565b600061149233848461470b565b606033613f915760405162461bcd60e51b8152600401610f8190615733565b6001546001600160a01b03166341ac82b0336040518263ffffffff1660e01b8152600401613fbf91906155f2565b60206040518083038186803b158015613fd757600080fd5b505afa158015613feb573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061400f91906153dc565b61402b5760405162461bcd60e51b8152600401610f81906156c8565b6001546001600160a01b031663c92819ce3361121c565b6000546001600160a01b0316331461406c5760405162461bcd60e51b8152600401610f8190615806565b601f91909155602055565b6000546001600160a01b031633146140a15760405162461bcd60e51b8152600401610f8190615806565b60118490556012839055601382905560158190556140c9826140c38686614558565b90614558565b60145550505050565b6000546001600160a01b031633146140fc5760405162461bcd60e51b8152600401610f8190615806565b600b80546001600160a01b0319166001600160a01b0392909216919091179055565b6000546001600160a01b031633146141485760405162461bcd60e51b8152600401610f8190615806565b6001600160a01b03919091166000908152602460205260409020805460ff1916911515919091179055565b6060336141925760405162461bcd60e51b8152600401610f8190615733565b6001546001600160a01b03166341ac82b0336040518263ffffffff1660e01b81526004016141c091906155f2565b60206040518083038186803b1580156141d857600080fd5b505afa1580156141ec573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061421091906153dc565b61422c5760405162461bcd60e51b8152600401610f81906156c8565b6001546001600160a01b031663a7b757673361121c565b6060336142625760405162461bcd60e51b8152600401610f8190615733565b6001546001600160a01b03166341ac82b0336040518263ffffffff1660e01b815260040161429091906155f2565b60206040518083038186803b1580156142a857600080fd5b505afa1580156142bc573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906142e091906153dc565b6142fc5760405162461bcd60e51b8152600401610f81906156c8565b6001546001600160a01b0316635759fb023361121c565b6000546001600160a01b0316331461433d5760405162461bcd60e51b8152600401610f8190615806565b478111156143485750475b6000614352613302565b6001600160a01b03168260405160006040518083038185875af1925050503d8060008114612f6b576040519150601f19603f3d011682016040523d82523d6000602084013e612f6b565b6000546001600160a01b031633146143c65760405162461bcd60e51b8152600401610f8190615806565b6001600160a01b03811661442b5760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610f81565b600080546040516001600160a01b03808516939216917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e091a3600080546001600160a01b0319166001600160a01b0392909216919091179055565b60015460405163112469f960e21b81526000916001600160a01b031690634491a7e4906123b59085906004016155f2565b6000546001600160a01b031633146144e15760405162461bcd60e51b8152600401610f8190615806565b6001600160a01b03919091166000908152602260205260409020805460ff1916911515919091179055565b6000546001600160a01b031633146145365760405162461bcd60e51b8152600401610f8190615806565b600180546001600160a01b0319166001600160a01b0392909216919091179055565b6000806145658385615903565b9050838110156114925760405162461bcd60e51b815260206004820152601b60248201527a536166654d6174683a206164646974696f6e206f766572666c6f7760281b6044820152606401610f81565b6001600160a01b0383166146175760405162461bcd60e51b8152602060048201526024808201527f45524332303a20617070726f76652066726f6d20746865207a65726f206164646044820152637265737360e01b6064820152608401610f81565b6001600160a01b0382166146785760405162461bcd60e51b815260206004820152602260248201527f45524332303a20617070726f766520746f20746865207a65726f206164647265604482015261737360f01b6064820152608401610f81565b6001600160a01b0383811660008181526003602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b9259101612b00565b600081848411156146f55760405162461bcd60e51b8152600401610f8191906156b5565b506000614702848661595c565b95945050505050565b6001600160a01b03831660009081526024602052604081205460ff1615801561474d57506001600160a01b03831660009081526024602052604090205460ff16155b61478f5760405162461bcd60e51b8152602060048201526013602482015272426c61636b6c6973746564206164647265737360681b6044820152606401610f81565b6001600160a01b03841660009081526019602052604090205460ff166147f45760185460ff166147f45760405162461bcd60e51b815260206004820152601060248201526f15149051125391d7d11254d05093115160821b6044820152606401610f81565b60165460ff16156148115761480a848484614a2a565b9050611492565b6040805180820182526014815273496e73756666696369656e742042616c616e636560601b6020808301919091526001600160a01b0387166000908152600290915291909120546148639184906146d1565b6001600160a01b03851660009081526002602052604081209190915561488a858585614ce2565b614894578261489f565b61489f858585614f6a565b905060006148ad828561595c565b905080156148f357601654610100900460ff16156148f3576016805460ff19166001179055600b546148e8906001600160a01b031682614afe565b6016805460ff191690555b6001600160a01b0385166000908152600260205260409020546149169083614558565b6001600160a01b038087166000818152600260205260409081902093909355915190881690600080516020615a82833981519152906149589086815260200190565b60405180910390a350600195945050505050565b60008261497b5750600061114a565b6000614987838561593d565b905082614994858361591b565b146114925760405162461bcd60e51b815260206004820152602160248201527f536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f6044820152607760f81b6064820152608401610f81565b600061149283836040518060400160405280601a815260200179536166654d6174683a206469766973696f6e206279207a65726f60301b815250614ffc565b6040805180820182526014815273496e73756666696369656e742042616c616e636560601b6020808301919091526001600160a01b0386166000908152600290915291822054614a7b9184906146d1565b6001600160a01b038086166000908152600260205260408082209390935590851681522054614aaa9083614558565b6001600160a01b038085166000818152600260205260409081902093909355915190861690600080516020615a8283398151915290614aec9086815260200190565b60405180910390a35060019392505050565b47614b088261502a565b6000614b14478361515d565b90506000846001600160a01b03168260405160006040518083038185875af1925050503d8060008114614b63576040519150601f19603f3d011682016040523d82523d6000602084013e614b68565b606091505b5050505050505050565b6000614b7f8260026149eb565b90506000614b8d838361515d565b905047614b998361502a565b6000614ba5478361515d565b9050614bb1838261519f565b60408051858152602081018390529081018490527f17bbfb9a6069321b6ded73bd96327c9e6b7212a5cd51ff219cd61370acafb5619060600160405180910390a15050505050565b6001600160a01b03821660009081526025602052604090205460ff1615158115151415614c8e5760405162461bcd60e51b815260206004820152603d60248201527f544b4e3a204175746f6d61746564206d61726b6574206d616b6572207061697260448201527f20697320616c72656164792073657420746f20746861742076616c75650000006064820152608401610f81565b6001600160a01b038216600081815260256020526040808220805460ff191685151590811790915590519092917fffa9187bf1f18bf477bd0ea1bcbb64e93b6a98132473929edfce215cd9b16fab91a35050565b6007546001600160a01b0383811660009081526025602052604081205490929190911690829060ff1680614d275750816001600160a01b0316856001600160a01b0316145b6001600160a01b0387166000908152602560205260408120549192509060ff1680614d635750826001600160a01b0316876001600160a01b0316145b90508115614eaf57601e5460ff168015614d9657506001600160a01b03871660009081526019602052604090205460ff16155b15614e635760015460405163112469f960e21b81526000916001600160a01b031690634491a7e490614dcc908b906004016155f2565b60206040518083038186803b158015614de457600080fd5b505afa158015614df8573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190614e1c91906154ff565b11614e635760405162461bcd60e51b8152602060048201526017602482015276596f7520646f6e2774206f776e20616e79206e6f64652160481b6044820152606401610f81565b6001600160a01b03871660009081526019602052604090205460ff16158015614ea557506001600160a01b03861660009081526019602052604090205460ff16155b9350505050611492565b8015614f5e5760215485111580614ede57506001600160a01b03871660009081526022602052604090205460ff165b80614f0157506001600160a01b03861660009081526022602052604090205460ff165b614f5e5760405162461bcd60e51b815260206004820152602860248201527f5472616e7366657220616d6f756e74206578636565647320746865206d6178546044820152673c20b6b7bab73a1760c11b6064820152608401610f81565b60009350505050611492565b600080614f88602054611c30601f548661496c90919063ffffffff16565b90508015614ff25730600090815260026020526040902054614faa9082614558565b30600081815260026020526040908190209290925590516001600160a01b03871690600080516020615a8283398151915290614fe99085815260200190565b60405180910390a35b614702838261515d565b6000818361501d5760405162461bcd60e51b8152600401610f8191906156b5565b506000614702848661591b565b604080516002808252606082018352600092602083019080368337019050509050308160008151811061505f5761505f615a0f565b6001600160a01b03928316602091820292909201810191909152600754604080516339d94ae160e11b8152905191909316926373b295c2926004808301939192829003018186803b1580156150b357600080fd5b505afa1580156150c7573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906150eb91906152ce565b816001815181106150fe576150fe615a0f565b6001600160a01b03928316602091820292909201015260075461512491309116846145b5565b600754604051633b158ab160e11b81526001600160a01b039091169063762b1562906117bf90859060009086903090429060040161583b565b600061149283836040518060400160405280601e81526020017f536166654d6174683a207375627472616374696f6e206f766572666c6f7700008152506146d1565b6007546151b79030906001600160a01b0316846145b5565b600754600b54604051637c8d9fb960e11b81523060048201526024810185905260006044820181905260648201526001600160a01b0391821660848201524260a482015291169063f91b3f7290839060c4016060604051808303818588803b15801561522257600080fd5b505af1158015615236573d6000803e3d6000fd5b50505050506040513d601f19601f82011682018060405250810190612f6b9190615566565b600082601f83011261526c57600080fd5b813561527f61527a826158dc565b6158ac565b81815284602083860101111561529457600080fd5b816020850160208301376000918101602001919091529392505050565b6000602082840312156152c357600080fd5b813561149281615a3b565b6000602082840312156152e057600080fd5b815161149281615a3b565b600080604083850312156152fe57600080fd5b823561530981615a3b565b946020939093013593505050565b6000806040838503121561532a57600080fd5b823561533581615a3b565b9150602083013561534581615a3b565b809150509250929050565b60008060006060848603121561536557600080fd5b833561537081615a3b565b9250602084013561538081615a3b565b929592945050506040919091013590565b600080604083850312156153a457600080fd5b82356153af81615a3b565b9150602083013561534581615a53565b6000602082840312156153d157600080fd5b813561149281615a53565b6000602082840312156153ee57600080fd5b815161149281615a53565b60006020828403121561540b57600080fd5b81356001600160401b0381111561542157600080fd5b61542d8482850161525b565b949350505050565b60006020828403121561544757600080fd5b81516001600160401b0381111561545d57600080fd5b8201601f8101841361546e57600080fd5b805161547c61527a826158dc565b81815285602083850101111561549157600080fd5b614702826020830160208601615973565b600080604083850312156154b557600080fd5b82356001600160401b038111156154cb57600080fd5b6154d78582860161525b565b95602094909401359450505050565b6000602082840312156154f857600080fd5b5035919050565b60006020828403121561551157600080fd5b5051919050565b6000806040838503121561552b57600080fd5b50508035926020909101359150565b60008060006060848603121561554f57600080fd5b505081359360208301359350604090920135919050565b60008060006060848603121561557b57600080fd5b8351925060208401519150604084015190509250925092565b600080600080608085870312156155aa57600080fd5b5050823594602084013594506040840135936060013592509050565b600081518084526155de816020860160208601615973565b601f01601f19169290920160200192915050565b6001600160a01b0391909116815260200190565b6001600160a01b0392831681529116602082015260400190565b6001600160a01b039384168152919092166020820152604081019190915260600190565b6001600160a01b038316815260406020820181905260009061148f908301846155c6565b6001600160a01b038416815260606020820181905260009061568c908301856155c6565b9050826040830152949350505050565b6001600160a01b03929092168252602082015260400190565b60208152600061149260208301846155c6565b6020808252600d908201526c2727902727a2229027aba722a960991b604082015260600190565b60208082526024908201527f596f752068617665206e6f7420656e6f756768205553444320746f20706179206040820152637461782160e01b606082015260800190565b60208082526014908201527353454e4445522043414e2754204245205a45524f60601b604082015260600190565b6020808252601e908201527f596f75206861766520746f207061792074686520636c61696d20746178210000604082015260600190565b6020808252601f908201527f596f752068617665206e6f7420617070726f7665642055534443207965742100604082015260600190565b6020808252601f908201527f4d414e494120435348543a20426c61636b6c6973746564206164647265737300604082015260600190565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b600060a082018783526020878185015260a0604085015281875180845260c086019150828901935060005b8181101561588b5784516001600160a01b031683529383019391830191600101615866565b50506001600160a01b03969096166060850152505050608001529392505050565b604051601f8201601f191681016001600160401b03811182821017156158d4576158d4615a25565b604052919050565b60006001600160401b038211156158f5576158f5615a25565b50601f01601f191660200190565b60008219821115615916576159166159f9565b500190565b60008261593857634e487b7160e01b600052601260045260246000fd5b500490565b6000816000190483118215151615615957576159576159f9565b500290565b60008282101561596e5761596e6159f9565b500390565b60005b8381101561598e578181015183820152602001615976565b8381111561599d576000848401525b50505050565b600181811c908216806159b757607f821691505b602082108114156159d857634e487b7160e01b600052602260045260246000fd5b50919050565b60006000198214156159f2576159f26159f9565b5060010190565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052604160045260246000fd5b6001600160a01b0381168114615a5057600080fd5b50565b8015158114615a5057600080fdfe4f32a1005fcf45a64a68bc4258b4e0f5522b7aa6a06506781aa4e6c6395c48d0ddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef45524332303a2064656372656173656420616c6c6f77616e63652062656c6f77207a65726fa26469706673582212208387faecafa31c991fa6581e5af31b99362805b2f28babb47abd9983139fcc3964736f6c634300080700330000000000000000000000002db8d878d206c070dfbc325bc43f23a55511c87b000000000000000000000000e7dad192e84f8987ef1839238b55bfe7a4eae2c9000000000000000000000000c3edd89f6306a9329c2f2c907a67d00c2d201a3c00000000000000000000000031cad5ba6d160632f158b0f4e48693d87d6a26bb000000000000000000000000844e162246eac2b65e582f544c16ad7061d0b2f0000000000000000000000000706fc384268e9f312f3f7b827576c76c683ef163000000000000000000000000000000000000000000000000000000000000012000000000000000000000000000000000000000000000000000000000000003e80000000000000000000000008aa8e24b5d70ee45861315cf692e98751489c614000000000000000000000000000000000000000000000000000000000000000400000000000000000000000000000000000000000000000000000000000000140000000000000000000000000000000000000000000000000000000000000046000000000000000000000000000000000000000000000000000000000000000a0000000000000000000000000000000000000000000000000000000000000000

Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)

0000000000000000000000002db8d878d206c070dfbc325bc43f23a55511c87b000000000000000000000000e7dad192e84f8987ef1839238b55bfe7a4eae2c9000000000000000000000000c3edd89f6306a9329c2f2c907a67d00c2d201a3c00000000000000000000000031cad5ba6d160632f158b0f4e48693d87d6a26bb000000000000000000000000844e162246eac2b65e582f544c16ad7061d0b2f0000000000000000000000000706fc384268e9f312f3f7b827576c76c683ef163000000000000000000000000000000000000000000000000000000000000012000000000000000000000000000000000000000000000000000000000000003e80000000000000000000000008aa8e24b5d70ee45861315cf692e98751489c614000000000000000000000000000000000000000000000000000000000000000400000000000000000000000000000000000000000000000000000000000000140000000000000000000000000000000000000000000000000000000000000046000000000000000000000000000000000000000000000000000000000000000a0000000000000000000000000000000000000000000000000000000000000000

-----Decoded View---------------
Arg [0] : _treasuryPool (address): 0x2db8d878d206c070dfbc325bc43f23a55511c87b
Arg [1] : _distributionPool (address): 0xe7dad192e84f8987ef1839238b55bfe7a4eae2c9
Arg [2] : _claimPool (address): 0xc3edd89f6306a9329c2f2c907a67d00c2d201a3c
Arg [3] : _mainteneancePool (address): 0x31cad5ba6d160632f158b0f4e48693d87d6a26bb
Arg [4] : _insurancePool (address): 0x844e162246eac2b65e582f544c16ad7061d0b2f0
Arg [5] : _receiptAddress (address): 0x706fc384268e9f312f3f7b827576c76c683ef163
Arg [6] : fees (uint256[]): 20,70,10,0
Arg [7] : swapAmount (uint256): 1000
Arg [8] : uniV2Router (address): 0x8aa8e24b5d70ee45861315cf692e98751489c614

-----Encoded View---------------
14 Constructor Arguments found :
Arg [0] : 0000000000000000000000002db8d878d206c070dfbc325bc43f23a55511c87b
Arg [1] : 000000000000000000000000e7dad192e84f8987ef1839238b55bfe7a4eae2c9
Arg [2] : 000000000000000000000000c3edd89f6306a9329c2f2c907a67d00c2d201a3c
Arg [3] : 00000000000000000000000031cad5ba6d160632f158b0f4e48693d87d6a26bb
Arg [4] : 000000000000000000000000844e162246eac2b65e582f544c16ad7061d0b2f0
Arg [5] : 000000000000000000000000706fc384268e9f312f3f7b827576c76c683ef163
Arg [6] : 0000000000000000000000000000000000000000000000000000000000000120
Arg [7] : 00000000000000000000000000000000000000000000000000000000000003e8
Arg [8] : 0000000000000000000000008aa8e24b5d70ee45861315cf692e98751489c614
Arg [9] : 0000000000000000000000000000000000000000000000000000000000000004
Arg [10] : 0000000000000000000000000000000000000000000000000000000000000014
Arg [11] : 0000000000000000000000000000000000000000000000000000000000000046
Arg [12] : 000000000000000000000000000000000000000000000000000000000000000a
Arg [13] : 0000000000000000000000000000000000000000000000000000000000000000


Deployed ByteCode Sourcemap

45405:30010:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;73024:331;;;;;;;;;;;;;:::i;:::-;;;25309:25:1;;;25297:2;25282:18;73024:331:0;;;;;;;;45863:71;;;;;;;;;;-1:-1:-1;45863:71:0;;;;-1:-1:-1;;;;;45863:71:0;;;;;;;;;;:::i;46517:36::-;;;;;;;;;;-1:-1:-1;46517:36:0;;;;;;;;;;;9789:14:1;;9782:22;9764:41;;9752:2;9737:18;46517:36:0;9624:187:1;49838:91:0;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;46081:31::-;;;;;;;;;;-1:-1:-1;46081:31:0;;;;-1:-1:-1;;;;;46081:31:0;;;50602:194;;;;;;;;;;-1:-1:-1;50602:194:0;;;;;:::i;:::-;;:::i;46338:24::-;;;;;;;;;;;;;;;;73363:321;;;;;;;;;;;;;:::i;45783:35::-;;;;;;;;;;-1:-1:-1;45783:35:0;;;;-1:-1:-1;;;;;45783:35:0;;;46900;;;;;;;;;;;;;;;;50132:108;;;;;;;;;;-1:-1:-1;50220:12:0;;50132:108;;47059:51;;;;;;;;;;-1:-1:-1;47059:51:0;;;;;:::i;:::-;;;;;;;;;;;;;;;;54798:326;;;;;;;;;;-1:-1:-1;54798:326:0;;;;;:::i;:::-;;:::i;:::-;;47117:46;;;;;;;;;;-1:-1:-1;47117:46:0;;;;;:::i;:::-;;;;;;;;;;;;;;;;54687:101;;;;;;;;;;-1:-1:-1;54687:101:0;;;;;:::i;:::-;;:::i;57002:288::-;;;;;;;;;;-1:-1:-1;57002:288:0;;;;;:::i;:::-;;:::i;55500:108::-;;;;;;;;;;-1:-1:-1;55500:108:0;;;;;:::i;:::-;;:::i;46866:27::-;;;;;;;;;;;;;;;;46235:25;;;;;;;;;;;;;;;;72132:135;;;;;;;;;;-1:-1:-1;72132:135:0;;;;;:::i;:::-;;:::i;50040:84::-;;;;;;;;;;-1:-1:-1;50040:84:0;;50114:2;26796:36:1;;26784:2;26769:18;50040:84:0;26654:184:1;50804:288:0;;;;;;;;;;-1:-1:-1;50804:288:0;;;;;:::i;:::-;;:::i;46560:44::-;;;;;;;;;;-1:-1:-1;46560:44:0;;;;;:::i;:::-;;;;;;;;;;;;;;;;46613:43;;;;;;;;;;;;;;;;55616:108;;;;;;;;;;-1:-1:-1;55616:108:0;;;;;:::i;:::-;;:::i;45978:27::-;;;;;;;;;;-1:-1:-1;45978:27:0;;;;-1:-1:-1;;;;;45978:27:0;;;45943:28;;;;;;;;;;-1:-1:-1;45943:28:0;;;;-1:-1:-1;;;;;45943:28:0;;;66205:567;;;;;;:::i;:::-;;:::i;74031:343::-;;;;;;;;;;;;;:::i;70144:1411::-;;;:::i;46267:31::-;;;;;;;;;;;;;;;;71762:96;;;;;;;;;;-1:-1:-1;71762:96:0;;;;;:::i;:::-;;:::i;54187:155::-;;;;;;;;;;-1:-1:-1;54187:155:0;;;;;:::i;:::-;;:::i;64043:1398::-;;;;;;:::i;:::-;;:::i;74382:343::-;;;;;;;;;;;;;:::i;72692:165::-;;;;;;;;;;-1:-1:-1;72692:165:0;;;;;:::i;:::-;;:::i;47234:47::-;;;;;;;;;;-1:-1:-1;47234:47:0;;;;;:::i;:::-;;;;;;;;;;;;;;46479:31;;;;;;;;;;;;;;;;54350:110;;;;;;;;;;-1:-1:-1;54350:110:0;;;;;:::i;:::-;;:::i;72005:119::-;;;;;;;;;;-1:-1:-1;72005:119:0;;;;;:::i;:::-;;:::i;53019:482::-;;;;;;;;;;-1:-1:-1;53019:482:0;;;;;:::i;:::-;;:::i;68753:1383::-;;;;;;:::i;:::-;;:::i;54015:164::-;;;;;;;;;;-1:-1:-1;54015:164:0;;;;;:::i;:::-;;:::i;53509:111::-;;;;;;;;;;-1:-1:-1;53509:111:0;;;;;:::i;:::-;;:::i;53749:143::-;;;;;;;;;;-1:-1:-1;53749:143:0;;;;;:::i;:::-;;:::i;54575:104::-;;;;;;;;;;-1:-1:-1;54575:104:0;;;;;:::i;:::-;;:::i;46371:25::-;;;;;;;;;;;;;;;;67458:588;;;;;;:::i;:::-;;:::i;50248:157::-;;;;;;;;;;-1:-1:-1;50248:157:0;;;;;:::i;:::-;;:::i;15366:148::-;;;;;;;;;;;;;:::i;45480:45::-;;;;;;;;;;-1:-1:-1;45480:45:0;;;;-1:-1:-1;;;;;45480:45:0;;;72865:151;;;;;;;;;;-1:-1:-1;72865:151:0;;;;;:::i;:::-;;:::i;72275:131::-;;;;;;;;;;-1:-1:-1;72275:131:0;;;;;:::i;:::-;;:::i;45827:29::-;;;;;;;;;;-1:-1:-1;45827:29:0;;;;-1:-1:-1;;;;;45827:29:0;;;54468:99;;;;;;;;;;-1:-1:-1;54468:99:0;;;;;:::i;:::-;;:::i;71866:131::-;;;;;;;;;;-1:-1:-1;71866:131:0;;;;;:::i;:::-;;:::i;46156:70::-;;;;;;;;;;-1:-1:-1;46156:70:0;;;;-1:-1:-1;;;;;46156:70:0;;;66780:670;;;:::i;47004:48::-;;;;;;;;;;-1:-1:-1;47004:48:0;;;;;:::i;:::-;;;;;;;;;;;;;;;;63796:202;;;;;;;;;;-1:-1:-1;63796:202:0;;;;;:::i;:::-;;:::i;15152:79::-;;;;;;;;;;;;;:::i;61854:1934::-;;;;;;;;;;-1:-1:-1;61854:1934:0;;;;;:::i;:::-;;:::i;68054:691::-;;;:::i;49937:95::-;;;;;;;;;;;;;:::i;55905:298::-;;;;;;;;;;-1:-1:-1;55905:298:0;;;;;:::i;:::-;;:::i;65449:748::-;;;;;;;;;;-1:-1:-1;65449:748:0;;;;;:::i;:::-;;:::i;72414:121::-;;;;;;;;;;-1:-1:-1;72414:121:0;;;;;:::i;:::-;;:::i;53628:113::-;;;;;;;;;;-1:-1:-1;53628:113:0;;;;;:::i;:::-;;:::i;46781:36::-;;;;;;;;;;;;;;;;51100:388;;;;;;;;;;-1:-1:-1;51100:388:0;;;;;:::i;:::-;;:::i;56838:156::-;;;;;;;;;;-1:-1:-1;56838:156:0;;;;;:::i;:::-;;:::i;46119:28::-;;;;;;;;;;-1:-1:-1;46119:28:0;;;;-1:-1:-1;;;;;46119:28:0;;;47170:57;;;;;;;;;;-1:-1:-1;47170:57:0;;;;;:::i;:::-;;;;;;;;;;;;;;;;46012:24;;;;;;;;;;-1:-1:-1;46012:24:0;;;;-1:-1:-1;;;;;46012:24:0;;;73692:331;;;;;;;;;;;;;:::i;55732:165::-;;;;;;;;;;-1:-1:-1;55732:165:0;;;;;:::i;:::-;;:::i;46824:33::-;;;;;;;;;;-1:-1:-1;46824:33:0;;;;;;;;46043:31;;;;;;;;;;-1:-1:-1;46043:31:0;;;;-1:-1:-1;;;;;46043:31:0;;;55136:356;;;;;;;;;;-1:-1:-1;55136:356:0;;;;;:::i;:::-;;:::i;46305:26::-;;;;;;;;;;;;;;;;46944:51;;;;;;;;;;;;;;;;53900:107;;;;;;;;;;-1:-1:-1;53900:107:0;;;;;:::i;:::-;;:::i;56211:126::-;;;;;;;;;;-1:-1:-1;56211:126:0;;;;;:::i;:::-;;:::i;50413:181::-;;;;;;;;;;-1:-1:-1;50413:181:0;;;;;:::i;:::-;-1:-1:-1;;;;;50559:18:0;;;50527:7;50559:18;;;:11;:18;;;;;;;;:27;;;;;;;;;;;;;50413:181;46671:41;;;;;;;;;;;;;;;;74733:337;;;;;;;;;;;;;:::i;46727:37::-;;;;;;;;;;;;;;;;75078:334;;;;;;;;;;;;;:::i;71563:191::-;;;;;;;;;;-1:-1:-1;71563:191:0;;;;;:::i;:::-;;:::i;15522:281::-;;;;;;;;;;-1:-1:-1;15522:281:0;;;;;:::i;:::-;;:::i;72543:141::-;;;;;;;;;;-1:-1:-1;72543:141:0;;;;;:::i;:::-;;:::i;56345:127::-;;;;;;;;;;-1:-1:-1;56345:127:0;;;;;:::i;:::-;;:::i;52866:145::-;;;;;;;;;;-1:-1:-1;52866:145:0;;;;;:::i;:::-;;:::i;73024:331::-;73077:7;14661:10;73097:59;;;;-1:-1:-1;;;73097:59:0;;;;;;;:::i;:::-;;;;;;;;;73189:17;;-1:-1:-1;;;;;73189:17:0;:30;14661:10;73189:44;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;73167:107;;;;-1:-1:-1;;;73167:107:0;;;;;;;:::i;:::-;73292:17;;-1:-1:-1;;;;;73292:17:0;:41;14661:10;73292:55;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;73285:62;;73024:331;:::o;49838:91::-;49883:13;49916:5;49909:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;49838:91;:::o;50602:194::-;50705:4;50727:39;14661:10;50750:7;50759:6;50727:8;:39::i;:::-;-1:-1:-1;50784:4:0;50602:194;;;;;:::o;73363:321::-;73409:13;14661:10;73435:59;;;;-1:-1:-1;;;73435:59:0;;;;;;;:::i;:::-;73527:17;;-1:-1:-1;;;;;73527:17:0;:30;14661:10;73527:44;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;73505:107;;;;-1:-1:-1;;;73505:107:0;;;;;;;:::i;:::-;73630:17;;-1:-1:-1;;;;;73630:17:0;:32;14661:10;73663:12;73630:46;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;73630:46:0;;;;;;;;;;;;:::i;54798:326::-;15279:6;;-1:-1:-1;;;;;15279:6:0;14661:10;15279:22;15271:67;;;;-1:-1:-1;;;15271:67:0;;;;;;;:::i;:::-;54925:17:::1;::::0;:63:::1;::::0;-1:-1:-1;;;54925:63:0;;::::1;::::0;::::1;25309:25:1::0;;;-1:-1:-1;;;;;54925:17:0;;::::1;::::0;:43:::1;::::0;25282:18:1;;54925:63:0::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;-1:-1:-1::0;;54999:17:0::1;::::0;:49:::1;::::0;-1:-1:-1;;;54999:49:0;;::::1;::::0;::::1;25309:25:1::0;;;-1:-1:-1;;;;;54999:17:0;;::::1;::::0;-1:-1:-1;54999:36:0::1;::::0;-1:-1:-1;25282:18:1;;54999:49:0::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;-1:-1:-1::0;;55059:17:0::1;::::0;:57:::1;::::0;-1:-1:-1;;;55059:57:0;;::::1;::::0;::::1;25309:25:1::0;;;-1:-1:-1;;;;;55059:17:0;;::::1;::::0;-1:-1:-1;55059:40:0::1;::::0;-1:-1:-1;25282:18:1;;55059:57:0::1;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;54798:326:::0;;;:::o;54687:101::-;15279:6;;-1:-1:-1;;;;;15279:6:0;14661:10;15279:22;15271:67;;;;-1:-1:-1;;;15271:67:0;;;;;;;:::i;:::-;54759:12:::1;:21:::0;54687:101::o;57002:288::-;57153:69;;;;;;;;;;;-1:-1:-1;;;57153:69:0;;;;;;;;-1:-1:-1;;;;;57153:19:0;;57102:4;57153:19;;;:11;:19;;;;;57173:10;57153:31;;;;;;;;;:69;;57189:6;;57153:35;:69::i;:::-;-1:-1:-1;;;;;57119:19:0;;;;;;:11;:19;;;;;;;;57139:10;57119:31;;;;;;;:103;57242:40;57131:6;57264:9;57275:6;57242:13;:40::i;:::-;57235:47;;57002:288;;;;;;:::o;55500:108::-;15279:6;;-1:-1:-1;;;;;15279:6:0;14661:10;15279:22;15271:67;;;;-1:-1:-1;;;15271:67:0;;;;;;;:::i;:::-;55575:16:::1;:25:::0;;-1:-1:-1;;55575:25:0::1;::::0;::::1;;::::0;;;::::1;::::0;;55500:108::o;72132:135::-;15279:6;;-1:-1:-1;;;;;15279:6:0;14661:10;15279:22;15271:67;;;;-1:-1:-1;;;15271:67:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;72223:27:0;;;::::1;;::::0;;;:19:::1;:27;::::0;;;;:36;;-1:-1:-1;;72223:36:0::1;::::0;::::1;;::::0;;;::::1;::::0;;72132:135::o;50804:288::-;14661:10;50907:4;51001:25;;;:11;:25;;;;;;;;-1:-1:-1;;;;;51001:34:0;;;;;;;;;;50907:4;;50929:133;;50979:7;;51001:50;;51040:10;51001:38;:50::i;:::-;50929:8;:133::i;55616:108::-;15279:6;;-1:-1:-1;;;;;15279:6:0;14661:10;15279:22;15271:67;;;;-1:-1:-1;;;15271:67:0;;;;;;;:::i;:::-;55691:14:::1;:25:::0;;-1:-1:-1;;;;;;55691:25:0::1;-1:-1:-1::0;;;;;55691:25:0;;;::::1;::::0;;;::::1;::::0;;55616:108::o;66205:567::-;66281:12;;:16;66278:377;;66369:12;;66331:11;;66324:41;;-1:-1:-1;;;66324:41:0;;-1:-1:-1;;;;;66331:11:0;;;;66324:29;;:41;;66354:10;;66324:41;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:57;;66316:106;;;;-1:-1:-1;;;66316:106:0;;;;;;;:::i;:::-;66505:12;;66452:11;;66445:56;;-1:-1:-1;;;66445:56:0;;-1:-1:-1;;;;;66452:11:0;;;;66445:29;;:56;;66475:10;;66495:4;;66445:56;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:72;;66437:116;;;;-1:-1:-1;;;66437:116:0;;;;;;;:::i;:::-;66575:11;;66613:13;;66628:12;;66568:73;;-1:-1:-1;;;66568:73:0;;-1:-1:-1;;;;;66575:11:0;;;;66568:32;;:73;;66601:10;;66613:13;;;;;66568:73;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;66278:377;66709:17;;:54;;-1:-1:-1;;;66709:54:0;;14661:10;;-1:-1:-1;;;;;66709:17:0;;:31;;:54;;14661:10;;66749:13;;66709:54;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;66265:507;66205:567;:::o;74031:343::-;74084:13;14661:10;74110:59;;;;-1:-1:-1;;;74110:59:0;;;;;;;:::i;:::-;74202:17;;-1:-1:-1;;;;;74202:17:0;:30;14661:10;74202:44;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;74180:107;;;;-1:-1:-1;;;74180:107:0;;;;;;;:::i;:::-;74305:17;;-1:-1:-1;;;;;74305:17:0;:47;14661:10;74353:12;14581:98;70144:1411;70266:17;;:47;;-1:-1:-1;;;70266:47:0;;14661:10;;-1:-1:-1;;;;;70266:17:0;;:39;;:47;;14661:10;;70266:47;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;70255:8;;:58;;;;:::i;:::-;70242:9;:71;70234:114;;;;-1:-1:-1;;;70234:114:0;;;;;;;:::i;:::-;70362:9;:13;70359:54;;70377:9;;:36;;-1:-1:-1;;;;;70377:9:0;;;;70399;;70377:36;;;;70399:9;70377;:36;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;70359:54;-1:-1:-1;;;;;70448:20:0;;70426:113;;;;-1:-1:-1;;;70426:113:0;;23778:2:1;70426:113:0;;;23760:21:1;23817:2;23797:18;;;23790:30;23856:34;23836:18;;;23829:62;-1:-1:-1;;;23907:18:1;;;23900:41;23958:19;;70426:113:0;23576:407:1;70426:113:0;-1:-1:-1;;;;;70559:22:0;;;;;;:14;:22;;;;;;;;70558:23;70550:67;;;;-1:-1:-1;;;70550:67:0;;;;;;;:::i;:::-;70660:12;;-1:-1:-1;;;;;70650:22:0;;;70660:12;;70650:22;;;;:52;;-1:-1:-1;70686:16:0;;-1:-1:-1;;;;;70676:26:0;;;70686:16;;70676:26;;70650:52;70628:161;;;;-1:-1:-1;;;70628:161:0;;21735:2:1;70628:161:0;;;21717:21:1;21774:2;21754:18;;;21747:30;21813:34;21793:18;;;21786:62;-1:-1:-1;;;21864:18:1;;;21857:57;21931:19;;70628:161:0;21533:423:1;70628:161:0;70823:17;;:49;;-1:-1:-1;;;70823:49:0;;70800:20;;-1:-1:-1;;;;;70823:17:0;;:41;;:49;;70865:6;;70823:49;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;70800:72;;70922:1;70907:12;:16;70885:118;;;;-1:-1:-1;;;70885:118:0;;24599:2:1;70885:118:0;;;24581:21:1;24638:2;24618:18;;;24611:30;24677:34;24657:18;;;24650:62;-1:-1:-1;;;24728:18:1;;;24721:50;24788:19;;70885:118:0;24397:416:1;70885:118:0;71018:11;;;;;;;71014:356;;;71082:10;;71046:17;;71082:14;71078:241;;71129:37;71162:3;71129:28;71146:10;;71129:12;:16;;:28;;;;:::i;:::-;:32;;:37::i;:::-;71200:16;;71117:49;;-1:-1:-1;71185:58:0;;-1:-1:-1;;;;;71200:16:0;71226:4;71117:49;71185:14;:58::i;:::-;-1:-1:-1;71279:12:0;;71262:41;;-1:-1:-1;;;;;71279:12:0;71293:9;71262:16;:41::i;:::-;71333:25;71349:9;71333:25;;:::i;:::-;;;71031:339;71014:356;71395:16;;71380:54;;-1:-1:-1;;;;;71395:16:0;71413:6;71421:12;71380:14;:54::i;:::-;-1:-1:-1;71445:17:0;;:48;;-1:-1:-1;;;71445:48:0;;-1:-1:-1;;;;;71445:17:0;;;;:40;;:48;;71486:6;;71445:48;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;71545:1;71523:6;-1:-1:-1;;;;;71515:32:0;-1:-1:-1;;;;;;;;;;;71531:12:0;71515:32;;;;25309:25:1;;25297:2;25282:18;;25163:177;71515:32:0;;;;;;;;70181:1374;;70144:1411::o;71762:96::-;15279:6;;-1:-1:-1;;;;;15279:6:0;14661:10;15279:22;15271:67;;;;-1:-1:-1;;;15271:67:0;;;;;;;:::i;:::-;71830:11:::1;:20:::0;;;::::1;;;;-1:-1:-1::0;;71830:20:0;;::::1;::::0;;;::::1;::::0;;71762:96::o;54187:155::-;15279:6;;-1:-1:-1;;;;;15279:6:0;14661:10;15279:22;15271:67;;;;-1:-1:-1;;;15271:67:0;;;;;;;:::i;:::-;54283:13:::1;:20:::0;;-1:-1:-1;;;;;;54283:20:0::1;-1:-1:-1::0;;;;;54283:20:0;;;::::1;::::0;;;::::1;::::0;;;54314:12:::1;:20:::0;54187:155::o;64043:1398::-;14661:10;;64153:117;;;;-1:-1:-1;;;64153:117:0;;11066:2:1;64153:117:0;;;11048:21:1;11105:2;11085:18;;;11078:30;11144:34;11124:18;;;11117:62;-1:-1:-1;;;11195:18:1;;;11188:45;11250:19;;64153:117:0;10864:411:1;64153:117:0;-1:-1:-1;;;;;64290:22:0;;;;;;:14;:22;;;;;;;;64289:23;64281:71;;;;-1:-1:-1;;;64281:71:0;;12995:2:1;64281:71:0;;;12977:21:1;13034:2;13014:18;;;13007:30;13073:34;13053:18;;;13046:62;-1:-1:-1;;;13124:18:1;;;13117:33;13167:19;;64281:71:0;12793:399:1;64281:71:0;64395:12;;-1:-1:-1;;;;;64385:22:0;;;64395:12;;64385:22;;;;:52;;-1:-1:-1;64421:16:0;;-1:-1:-1;;;;;64411:26:0;;;64421:16;;64411:26;;64385:52;64363:166;;;;;-1:-1:-1;;;64363:166:0;;22515:2:1;64363:166:0;;;22497:21:1;22534:18;;;22527:30;;;;22593:34;22573:18;;;22566:62;22664:34;22644:18;;;22637:62;22716:19;;64363:166:0;22313:428:1;64363:166:0;64563:17;;:49;;-1:-1:-1;;;64563:49:0;;64540:20;;-1:-1:-1;;;;;64563:17:0;;:41;;:49;;64605:6;;64563:49;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;64540:72;;64625:17;64645;;;;;;;;;-1:-1:-1;;;;;64645:17:0;-1:-1:-1;;;;;64645:27:0;;:29;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;64625:49;;64725:9;64709:12;:25;;64687:131;;;;-1:-1:-1;;;64687:131:0;;22948:2:1;64687:131:0;;;22930:21:1;22987:2;22967:18;;;22960:30;23026:34;23006:18;;;22999:62;-1:-1:-1;;;23077:18:1;;;23070:54;23141:19;;64687:131:0;22746:420:1;64687:131:0;64831:29;64863:24;64878:9;64863:12;:24;:::i;:::-;64915:16;;64831:56;;-1:-1:-1;64900:90:0;;-1:-1:-1;;;;;64915:16:0;64933:6;64956:33;64831:56;64956:9;:33;:::i;:::-;64941:48;;:12;:48;:::i;:::-;64900:14;:90::i;:::-;-1:-1:-1;65001:17:0;;:48;;-1:-1:-1;;;65001:48:0;;-1:-1:-1;;;;;65001:17:0;;;;:40;;:48;;65042:6;;65001:48;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;65081:16:0;;65066:82;;-1:-1:-1;;;;;65081:16:0;65107:4;65114:33;65126:21;65114:9;:33;:::i;65066:82::-;;65165:6;65161:155;65181:21;65177:1;:25;65161:155;;;65224:17;;-1:-1:-1;;;;;65224:17:0;:41;65266:6;65274:8;65284:19;65302:1;65284:15;:19;:::i;:::-;65224:80;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;65204:3;;;;;:::i;:::-;;;;65161:155;;;-1:-1:-1;65399:1:0;-1:-1:-1;;;;;65333:68:0;;-1:-1:-1;;;;;;;;;;;65364:33:0;65376:21;65364:9;:33;:::i;:::-;65349:48;;:12;:48;:::i;:::-;65333:68;;25309:25:1;;;25297:2;25282:18;65333:68:0;;;;;;;65417:16;;-1:-1:-1;;;;;65417:16:0;;;;;;;;64100:1341;;;;64043:1398;:::o;74382:343::-;74439:13;14661:10;74465:59;;;;-1:-1:-1;;;74465:59:0;;;;;;;:::i;:::-;74557:17;;-1:-1:-1;;;;;74557:17:0;:30;14661:10;74557:44;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;74535:107;;;;-1:-1:-1;;;74535:107:0;;;;;;;:::i;:::-;74660:17;;-1:-1:-1;;;;;74660:17:0;:43;14661:10;74704:12;14581:98;72692:165;72794:17;;:55;;-1:-1:-1;;;72794:55:0;;72767:7;;-1:-1:-1;;;;;72794:17:0;;:46;;:55;;72841:7;;72794:55;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;54350:110::-;15279:6;;-1:-1:-1;;;;;15279:6:0;14661:10;15279:22;15271:67;;;;-1:-1:-1;;;15271:67:0;;;;;;;:::i;:::-;54429:16:::1;:23:::0;;-1:-1:-1;;;;;;54429:23:0::1;-1:-1:-1::0;;;;;54429:23:0;;;::::1;::::0;;;::::1;::::0;;54350:110::o;72005:119::-;15279:6;;-1:-1:-1;;;;;15279:6:0;14661:10;15279:22;15271:67;;;;-1:-1:-1;;;15271:67:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;72088:19:0;;;::::1;;::::0;;;:11:::1;:19;::::0;;;;:28;;-1:-1:-1;;72088:28:0::1;::::0;::::1;;::::0;;;::::1;::::0;;72005:119::o;53019:482::-;15279:6;;-1:-1:-1;;;;;15279:6:0;14661:10;15279:22;15271:67;;;;-1:-1:-1;;;15271:67:0;;;;;;;:::i;:::-;53128:15:::1;::::0;-1:-1:-1;;;;;53106:38:0;;::::1;53128:15:::0;::::1;53106:38;;53098:91;;;::::0;-1:-1:-1;;;53098:91:0;;17235:2:1;53098:91:0::1;::::0;::::1;17217:21:1::0;17274:2;17254:18;;;17247:30;17313:34;17293:18;;;17286:62;-1:-1:-1;;;17364:18:1;;;17357:38;17412:19;;53098:91:0::1;17033:404:1::0;53098:91:0::1;53247:15;::::0;53205:59:::1;::::0;-1:-1:-1;;;;;53247:15:0;;::::1;::::0;53205:59;::::1;::::0;::::1;::::0;53247:15:::1;::::0;53205:59:::1;53275:15;:42:::0;;-1:-1:-1;;;;;;53275:42:0::1;-1:-1:-1::0;;;;;53275:42:0;::::1;::::0;;::::1;::::0;;;53365:25:::1;::::0;;-1:-1:-1;;;53365:25:0;;;;-1:-1:-1;;53275:42:0;53365:23:::1;::::0;:25:::1;::::0;;::::1;::::0;::::1;::::0;;;;;;;;53275:42;53365:25;::::1;;::::0;::::1;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1::0;;;;;53353:59:0::1;;53421:4;53428:15;;;;;;;;;-1:-1:-1::0;;;;;53428:15:0::1;-1:-1:-1::0;;;;;53428:21:0::1;;:23;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;53353:99;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;53463:13;:30:::0;;-1:-1:-1;;;;;;53463:30:0::1;-1:-1:-1::0;;;;;53463:30:0;;;::::1;::::0;;;::::1;::::0;;-1:-1:-1;;53019:482:0:o;68753:1383::-;68842:8;;68829:9;:21;68821:64;;;;-1:-1:-1;;;68821:64:0;;;;;;;:::i;:::-;68899:9;:13;68896:54;;68914:9;;:36;;-1:-1:-1;;;;;68914:9:0;;;;68936;;68914:36;;;;68936:9;68914;:36;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;68896:54;14661:10;;69001:70;;;;-1:-1:-1;;;69001:70:0;;14160:2:1;69001:70:0;;;14142:21:1;14199:2;14179:18;;;14172:30;14238:34;14218:18;;;14211:62;-1:-1:-1;;;14289:18:1;;;14282:35;14334:19;;69001:70:0;13958:401:1;69001:70:0;-1:-1:-1;;;;;69091:22:0;;;;;;:14;:22;;;;;;;;69090:23;69082:67;;;;-1:-1:-1;;;69082:67:0;;;;;;;:::i;:::-;69192:12;;-1:-1:-1;;;;;69182:22:0;;;69192:12;;69182:22;;;;:52;;-1:-1:-1;69218:16:0;;-1:-1:-1;;;;;69208:26:0;;;69218:16;;69208:26;;69182:52;69160:155;;;;-1:-1:-1;;;69160:155:0;;15274:2:1;69160:155:0;;;15256:21:1;15313:2;15293:18;;;15286:30;15352:34;15332:18;;;15325:62;-1:-1:-1;;;15403:18:1;;;15396:51;15464:19;;69160:155:0;15072:417:1;69160:155:0;69349:17;;:97;;-1:-1:-1;;;69349:97:0;;69326:20;;-1:-1:-1;;;;;69349:17:0;;:41;;:97;;69405:6;;69426:9;;69349:97;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;69326:120;;69494:1;69479:12;:16;69457:112;;;;-1:-1:-1;;;69457:112:0;;15696:2:1;69457:112:0;;;15678:21:1;15735:2;15715:18;;;15708:30;15774:34;15754:18;;;15747:62;-1:-1:-1;;;15825:18:1;;;15818:44;15879:19;;69457:112:0;15494:410:1;69457:112:0;69586:11;;;;;;;69582:356;;;69650:10;;69614:17;;69650:14;69646:241;;69697:37;69730:3;69697:28;69714:10;;69697:12;:16;;:28;;;;:::i;:37::-;69768:16;;69685:49;;-1:-1:-1;69753:58:0;;-1:-1:-1;;;;;69768:16:0;69794:4;69685:49;69753:14;:58::i;:::-;-1:-1:-1;69847:12:0;;69830:41;;-1:-1:-1;;;;;69847:12:0;69861:9;69830:16;:41::i;:::-;69901:25;69917:9;69901:25;;:::i;:::-;;;69599:339;69582:356;69965:16;;69950:54;;-1:-1:-1;;;;;69965:16:0;69983:6;69991:12;69950:14;:54::i;:::-;-1:-1:-1;70015:17:0;;:55;;-1:-1:-1;;;70015:55:0;;-1:-1:-1;;;;;70015:17:0;;;;:36;;:55;;70052:6;;70060:9;;70015:55;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;70118:9;70096:6;-1:-1:-1;;;;;70088:40:0;-1:-1:-1;;;;;;;;;;;70104:12:0;70088:40;;;;25309:25:1;;25297:2;25282:18;;25163:177;70088:40:0;;;;;;;;68810:1326;;68753:1383;:::o;54015:164::-;15279:6;;-1:-1:-1;;;;;15279:6:0;14661:10;15279:22;15271:67;;;;-1:-1:-1;;;15271:67:0;;;;;;;:::i;:::-;54114:16:::1;:23:::0;;-1:-1:-1;;;;;;54114:23:0::1;-1:-1:-1::0;;;;;54114:23:0;;;::::1;::::0;;;::::1;::::0;;;54148:15:::1;:23:::0;54015:164::o;53509:111::-;15279:6;;-1:-1:-1;;;;;15279:6:0;14661:10;15279:22;15271:67;;;;-1:-1:-1;;;15271:67:0;;;;;;;:::i;:::-;53587:16:::1;:25:::0;53509:111::o;53749:143::-;15279:6;;-1:-1:-1;;;;;15279:6:0;14661:10;15279:22;15271:67;;;;-1:-1:-1;;;15271:67:0;;;;;;;:::i;:::-;53841:9:::1;:16:::0;;-1:-1:-1;;;;;;53841:16:0::1;-1:-1:-1::0;;;;;53841:16:0;;;::::1;::::0;;;::::1;::::0;;;53868:8:::1;:16:::0;53749:143::o;54575:104::-;15279:6;;-1:-1:-1;;;;;15279:6:0;14661:10;15279:22;15271:67;;;;-1:-1:-1;;;15271:67:0;;;;;;;:::i;:::-;54648:14:::1;:23:::0;;-1:-1:-1;;54648:23:0::1;::::0;::::1;;::::0;;;::::1;::::0;;54575:104::o;67458:588::-;67537:15;;:19;67534:392;;67628:15;;67590:11;;67583:41;;-1:-1:-1;;;67583:41:0;;-1:-1:-1;;;;;67590:11:0;;;;67583:29;;:41;;67613:10;;67583:41;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:60;;67575:109;;;;-1:-1:-1;;;67575:109:0;;;;;;;:::i;:::-;67767:15;;67714:11;;67707:56;;-1:-1:-1;;;67707:56:0;;-1:-1:-1;;;;;67714:11:0;;;;67707:29;;:56;;67737:10;;67757:4;;67707:56;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:75;;67699:119;;;;-1:-1:-1;;;67699:119:0;;;;;;;:::i;:::-;67840:11;;67878:16;;67896:15;;67833:79;;-1:-1:-1;;;67833:79:0;;-1:-1:-1;;;;;67840:11:0;;;;67833:32;;:79;;67866:10;;67878:16;;;;;67833:79;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;67534:392;67980:17;;:57;;-1:-1:-1;;;67980:57:0;;14661:10;;-1:-1:-1;;;;;67980:17:0;;:34;;:57;;14661:10;;68023:13;;67980:57;;;:::i;50248:157::-;-1:-1:-1;;;;;50379:18:0;50347:7;50379:18;;;:9;:18;;;;;;;50248:157::o;15366:148::-;15279:6;;-1:-1:-1;;;;;15279:6:0;14661:10;15279:22;15271:67;;;;-1:-1:-1;;;15271:67:0;;;;;;;:::i;:::-;15473:1:::1;15457:6:::0;;15436:40:::1;::::0;-1:-1:-1;;;;;15457:6:0;;::::1;::::0;15436:40:::1;::::0;15473:1;;15436:40:::1;15504:1;15487:19:::0;;-1:-1:-1;;;;;;15487:19:0::1;::::0;;15366:148::o;72865:151::-;72960:17;;:48;;-1:-1:-1;;;72960:48:0;;72933:7;;-1:-1:-1;;;;;72960:17:0;;:39;;:48;;73000:7;;72960:48;;;:::i;72275:131::-;15279:6;;-1:-1:-1;;;;;15279:6:0;14661:10;15279:22;15271:67;;;;-1:-1:-1;;;15271:67:0;;;;;;;:::i;:::-;72350:17:::1;::::0;:48:::1;::::0;-1:-1:-1;;;72350:48:0;;::::1;::::0;::::1;25309:25:1::0;;;-1:-1:-1;;;;;72350:17:0;;::::1;::::0;:38:::1;::::0;25282:18:1;;72350:48:0::1;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;72275:131:::0;:::o;54468:99::-;15279:6;;-1:-1:-1;;;;;15279:6:0;14661:10;15279:22;15271:67;;;;-1:-1:-1;;;15271:67:0;;;;;;;:::i;:::-;54540:11:::1;:19:::0;;-1:-1:-1;;;;;;54540:19:0::1;-1:-1:-1::0;;;;;54540:19:0;;;::::1;::::0;;;::::1;::::0;;54468:99::o;71866:131::-;15279:6;;-1:-1:-1;;;;;15279:6:0;14661:10;15279:22;15271:67;;;;-1:-1:-1;;;15271:67:0;;;;;;;:::i;:::-;71941:17:::1;::::0;:48:::1;::::0;-1:-1:-1;;;71941:48:0;;::::1;::::0;::::1;25309:25:1::0;;;-1:-1:-1;;;;;71941:17:0;;::::1;::::0;:34:::1;::::0;25282:18:1;;71941:48:0::1;25163:177:1::0;66780:670:0;66878:12;;14661:10;;66878:16;66875:512;;66935:17;;:54;;-1:-1:-1;;;66935:54:0;;66913:19;;-1:-1:-1;;;;;66935:17:0;;:46;;:54;;66982:6;;66935:54;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;66913:76;;67074:11;67059:12;;:26;;;;:::i;:::-;67021:11;;67014:41;;-1:-1:-1;;;67014:41:0;;-1:-1:-1;;;;;67021:11:0;;;;67014:29;;:41;;67044:10;;67014:41;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:71;;67006:120;;;;-1:-1:-1;;;67006:120:0;;;;;;;:::i;:::-;67224:11;67209:12;;:26;;;;:::i;:::-;67156:11;;67149:56;;-1:-1:-1;;;67149:56:0;;-1:-1:-1;;;;;67156:11:0;;;;67149:29;;:56;;67179:10;;67199:4;;67149:56;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:86;;67141:130;;;;-1:-1:-1;;;67141:130:0;;;;;;;:::i;:::-;67293:11;;67331:13;;67346:12;;-1:-1:-1;;;;;67293:11:0;;;;67286:32;;67319:10;;67331:13;;;67346:26;;67361:11;;67346:26;:::i;:::-;67286:87;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;66896:491;66875:512;67399:17;;:42;;-1:-1:-1;;;67399:42:0;;-1:-1:-1;;;;;67399:17:0;;;;:34;;:42;;67434:6;;67399:42;;;:::i;63796:202::-;63926:17;;:64;;-1:-1:-1;;;63926:64:0;;14661:10;;-1:-1:-1;;;;;63926:17:0;;:32;;:64;;14661:10;;63967:8;;63977:12;;63926:64;;;:::i;15152:79::-;15190:7;15217:6;-1:-1:-1;;;;;15217:6:0;;15152:79::o;61854:1934::-;61973:1;61954:8;61948:22;:26;:57;;;;;62003:2;61984:8;61978:22;:27;61948:57;61926:139;;;;-1:-1:-1;;;61926:139:0;;11824:2:1;61926:139:0;;;11806:21:1;;;11843:18;;;11836:30;11902:34;11882:18;;;11875:62;11954:18;;61926:139:0;11622:356:1;61926:139:0;14661:10;;62116:116;;;;-1:-1:-1;;;62116:116:0;;20557:2:1;62116:116:0;;;20539:21:1;20596:2;20576:18;;;20569:30;20635:34;20615:18;;;20608:62;-1:-1:-1;;;20686:18:1;;;20679:44;20740:19;;62116:116:0;20355:410:1;62116:116:0;-1:-1:-1;;;;;62252:22:0;;;;;;:14;:22;;;;;;;;62251:23;62243:70;;;;-1:-1:-1;;;62243:70:0;;20154:2:1;62243:70:0;;;20136:21:1;20193:2;20173:18;;;20166:30;20232:34;20212:18;;;20205:62;-1:-1:-1;;;20283:18:1;;;20276:32;20325:19;;62243:70:0;19952:398:1;62243:70:0;62356:12;;-1:-1:-1;;;;;62346:22:0;;;62356:12;;62346:22;;;;:52;;-1:-1:-1;62382:16:0;;-1:-1:-1;;;;;62372:26:0;;;62382:16;;62372:26;;62346:52;62324:160;;;;-1:-1:-1;;;62324:160:0;;19727:2:1;62324:160:0;;;19709:21:1;19766:2;19746:18;;;19739:30;19805:34;19785:18;;;19778:62;-1:-1:-1;;;19856:18:1;;;19849:56;19922:19;;62324:160:0;19525:422:1;62324:160:0;62515:17;;:29;;;-1:-1:-1;;;62515:29:0;;;;62495:17;;-1:-1:-1;;;;;62515:17:0;;:27;;:29;;;;;;;;;;;;;;:17;:29;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;62495:49;;62598:9;62577:17;62587:6;62577:9;:17::i;:::-;:30;;62555:124;;;;-1:-1:-1;;;62555:124:0;;17644:2:1;62555:124:0;;;17626:21:1;17683:2;17663:18;;;17656:30;17722:34;17702:18;;;17695:62;-1:-1:-1;;;17773:18:1;;;17766:42;17825:19;;62555:124:0;17442:408:1;62555:124:0;62690:28;62721:24;62739:4;62721:9;:24::i;:::-;62800:16;;62690:55;;-1:-1:-1;62776:40:0;;;;;;;62845;;-1:-1:-1;62874:11:0;;;;;;;62845:40;:66;;;;-1:-1:-1;62903:8:0;;;;62902:9;62845:66;:100;;;;;62938:7;:5;:7::i;:::-;-1:-1:-1;;;;;62928:17:0;:6;-1:-1:-1;;;;;62928:17:0;;;62845:100;:151;;;;-1:-1:-1;;;;;;62963:33:0;;;;;;:25;:33;;;;;;;;62962:34;62845:151;62827:838;;;63023:8;:15;;-1:-1:-1;;63023:15:0;63034:4;63023:15;;;63105:11;;63023:8;;63080:46;;63122:3;;63080:37;;:20;;:24;:37::i;:46::-;63160:12;;63055:71;;-1:-1:-1;63143:46:0;;-1:-1:-1;;;;;63160:12:0;63055:71;63143:16;:46::i;:::-;63206:25;63234:73;63303:3;63234:50;63273:10;;63234:20;:38;;:50;;;;:::i;:73::-;63389:16;;63206:101;;-1:-1:-1;63324:132:0;;63365:4;;-1:-1:-1;;;;;63389:16:0;63206:101;63324:14;:132::i;:::-;;63473:18;63494:83;63559:3;63494:42;63519:16;;63494:20;:24;;:42;;;;:::i;:83::-;63473:104;;63594:26;63609:10;63594:14;:26::i;:::-;-1:-1:-1;;63637:8:0;:16;;-1:-1:-1;;63637:16:0;;;-1:-1:-1;62827:838:0;63675:48;63690:6;63706:4;63713:9;63675:14;:48::i;:::-;-1:-1:-1;63734:17:0;;:46;;-1:-1:-1;;;63734:46:0;;-1:-1:-1;;;;;63734:17:0;;;;:28;;:46;;63763:6;;63771:8;;63734:46;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;61915:1873;;;;61854:1934;:::o;68054:691::-;68155:15;;14661:10;;68155:19;68152:527;;68215:17;;:54;;-1:-1:-1;;;68215:54:0;;68193:19;;-1:-1:-1;;;;;68215:17:0;;:46;;:54;;68262:6;;68215:54;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;68193:76;;68357:11;68339:15;;:29;;;;:::i;:::-;68301:11;;68294:41;;-1:-1:-1;;;68294:41:0;;-1:-1:-1;;;;;68301:11:0;;;;68294:29;;:41;;68324:10;;68294:41;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:74;;68286:123;;;;-1:-1:-1;;;68286:123:0;;;;;;;:::i;:::-;68510:11;68492:15;;:29;;;;:::i;:::-;68439:11;;68432:56;;-1:-1:-1;;;68432:56:0;;-1:-1:-1;;;;;68439:11:0;;;;68432:29;;:56;;68462:10;;68482:4;;68432:56;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:89;;68424:133;;;;-1:-1:-1;;;68424:133:0;;;;;;;:::i;:::-;68579:11;;68617:16;;68635:15;;-1:-1:-1;;;;;68579:11:0;;;;68572:32;;68605:10;;68617:16;;;68635:29;;68653:11;;68635:29;:::i;:::-;68572:93;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;68176:503;68152:527;68691:17;;:45;;-1:-1:-1;;;68691:45:0;;-1:-1:-1;;;;;68691:17:0;;;;:37;;:45;;68729:6;;68691:45;;;:::i;49937:95::-;49984:13;50017:7;50010:14;;;;;:::i;55905:298::-;15279:6;;-1:-1:-1;;;;;15279:6:0;14661:10;15279:22;15271:67;;;;-1:-1:-1;;;15271:67:0;;;;;;;:::i;:::-;56026:13:::1;::::0;-1:-1:-1;;;;;56018:21:0;;::::1;56026:13:::0;::::1;56018:21;;55996:145;;;::::0;-1:-1:-1;;;55996:145:0;;19244:2:1;55996:145:0::1;::::0;::::1;19226:21:1::0;19283:2;19263:18;;;19256:30;19322:34;19302:18;;;19295:62;19393:34;19373:18;;;19366:62;-1:-1:-1;;;19444:19:1;;;19437:41;19495:19;;55996:145:0::1;19042:478:1::0;55996:145:0::1;56154:41;56183:4;56189:5;56154:28;:41::i;:::-;55905:298:::0;;:::o;65449:748::-;65572:17;;65548:10;65535:24;;;;:12;:24;;;;;;:33;;65562:6;;65535:33;:::i;:::-;:54;;:89;;;-1:-1:-1;65613:10:0;65593:31;;;;:19;:31;;;;;;;;65535:89;65527:130;;;;-1:-1:-1;;;65527:130:0;;10709:2:1;65527:130:0;;;10691:21:1;10748:2;10728:18;;;10721:30;10787;10767:18;;;10760:58;10835:18;;65527:130:0;10507:352:1;65527:130:0;65683:10;65670:24;;;;:12;:24;;;;;:34;;65698:6;;65670:24;:34;;65698:6;;65670:34;:::i;:::-;;;;-1:-1:-1;;65732:14:0;;65725:44;;-1:-1:-1;;;65725:44:0;;65773:6;;-1:-1:-1;;;;;65732:14:0;;65725:32;;:44;;65758:10;;65725:44;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:54;;65717:102;;;;-1:-1:-1;;;65717:102:0;;16471:2:1;65717:102:0;;;16453:21:1;16510:2;16490:18;;;16483:30;16549:34;16529:18;;;16522:62;-1:-1:-1;;;16600:18:1;;;16593:33;16643:19;;65717:102:0;16269:399:1;65717:102:0;65845:14;;65838:59;;-1:-1:-1;;;65838:59:0;;65901:6;;-1:-1:-1;;;;;65845:14:0;;65838:32;;:59;;65871:10;;65891:4;;65838:59;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:69;;65830:122;;;;-1:-1:-1;;;65830:122:0;;24190:2:1;65830:122:0;;;24172:21:1;24229:2;24209:18;;;24202:30;24268:34;24248:18;;;24241:62;-1:-1:-1;;;24319:18:1;;;24312:38;24367:19;;65830:122:0;23988:404:1;65830:122:0;65972:14;;66013:10;;65965:67;;-1:-1:-1;;;65965:67:0;;-1:-1:-1;;;;;65972:14:0;;;;65965:35;;:67;;66001:10;;66013;;;;66025:6;;65965:67;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;66049:6;66045:144;66065:6;66061:1;:10;66045:144;;;66093:17;;-1:-1:-1;;;;;66093:17:0;:41;66135:10;66147:8;66157:19;66175:1;66157:15;:19;:::i;:::-;66093:84;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;66073:3;;;;;:::i;:::-;;;;66045:144;;;;65449:748;;:::o;72414:121::-;15279:6;;-1:-1:-1;;;;;15279:6:0;14661:10;15279:22;15271:67;;;;-1:-1:-1;;;15271:67:0;;;;;;;:::i;:::-;72484:17:::1;::::0;:43:::1;::::0;-1:-1:-1;;;72484:43:0;;::::1;::::0;::::1;25309:25:1::0;;;-1:-1:-1;;;;;72484:17:0;;::::1;::::0;:34:::1;::::0;25282:18:1;;72484:43:0::1;25163:177:1::0;53628:113:0;15279:6;;-1:-1:-1;;;;;15279:6:0;14661:10;15279:22;15271:67;;;;-1:-1:-1;;;15271:67:0;;;;;;;:::i;:::-;53707:17:::1;:26:::0;53628:113::o;51100:388::-;51208:4;51230:228;14661:10;51280:7;51302:145;51359:15;51302:145;;;;;;;;;;;;;;;;;14661:10;51302:25;;;;:11;:25;;;;;;;;-1:-1:-1;;;;;51302:34:0;;;;;;;;;;;;:38;:145::i;56838:156::-;56918:4;56942:44;56956:10;56968:9;56979:6;56942:13;:44::i;73692:331::-;73741:13;14661:10;73767:59;;;;-1:-1:-1;;;73767:59:0;;;;;;;:::i;:::-;73859:17;;-1:-1:-1;;;;;73859:17:0;:30;14661:10;73859:44;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;73837:107;;;;-1:-1:-1;;;73837:107:0;;;;;;;:::i;:::-;73962:17;;-1:-1:-1;;;;;73962:17:0;:39;14661:10;74002:12;14581:98;55732:165;15279:6;;-1:-1:-1;;;;;15279:6:0;14661:10;15279:22;15271:67;;;;-1:-1:-1;;;15271:67:0;;;;;;;:::i;:::-;55828:7:::1;:18:::0;;;;55857:14:::1;:32:::0;55732:165::o;55136:356::-;15279:6;;-1:-1:-1;;;;;15279:6:0;14661:10;15279:22;15271:67;;;;-1:-1:-1;;;15271:67:0;;;;;;;:::i;:::-;55273:10:::1;:24:::0;;;55308:16:::1;:32:::0;;;55351:11:::1;:26:::0;;;55388:10:::1;:24:::0;;;55435:49:::1;55365:12:::0;55435:32:::1;55286:11:::0;55327:13;55435:14:::1;:32::i;:::-;:36:::0;::::1;:49::i;:::-;55423:9;:61:::0;-1:-1:-1;;;;55136:356:0:o;53900:107::-;15279:6;;-1:-1:-1;;;;;15279:6:0;14661:10;15279:22;15271:67;;;;-1:-1:-1;;;15271:67:0;;;;;;;:::i;:::-;53980:12:::1;:19:::0;;-1:-1:-1;;;;;;53980:19:0::1;-1:-1:-1::0;;;;;53980:19:0;;;::::1;::::0;;;::::1;::::0;;53900:107::o;56211:126::-;15279:6;;-1:-1:-1;;;;;15279:6:0;14661:10;15279:22;15271:67;;;;-1:-1:-1;;;15271:67:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;56298:23:0;;;::::1;;::::0;;;:14:::1;:23;::::0;;;;:31;;-1:-1:-1;;56298:31:0::1;::::0;::::1;;::::0;;;::::1;::::0;;56211:126::o;74733:337::-;74787:13;14661:10;74813:59;;;;-1:-1:-1;;;74813:59:0;;;;;;;:::i;:::-;74905:17;;-1:-1:-1;;;;;74905:17:0;:30;14661:10;74905:44;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;74883:107;;;;-1:-1:-1;;;74883:107:0;;;;;;;:::i;:::-;75008:17;;-1:-1:-1;;;;;75008:17:0;:40;14661:10;75049:12;14581:98;75078:334;75129:13;14661:10;75155:59;;;;-1:-1:-1;;;75155:59:0;;;;;;;:::i;:::-;75247:17;;-1:-1:-1;;;;;75247:17:0;:30;14661:10;75247:44;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;75225:107;;;;-1:-1:-1;;;75225:107:0;;;;;;;:::i;:::-;75350:17;;-1:-1:-1;;;;;75350:17:0;:40;14661:10;75391:12;14581:98;71563:191;15279:6;;-1:-1:-1;;;;;15279:6:0;14661:10;15279:22;15271:67;;;;-1:-1:-1;;;15271:67:0;;;;;;;:::i;:::-;71632:21:::1;71623:6;:30;71619:66;;;-1:-1:-1::0;71664:21:0::1;71619:66;71697:12;71715:7;:5;:7::i;:::-;-1:-1:-1::0;;;;;71715:12:0::1;71735:6;71715:31;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;15522:281:::0;15279:6;;-1:-1:-1;;;;;15279:6:0;14661:10;15279:22;15271:67;;;;-1:-1:-1;;;15271:67:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;15625:22:0;::::1;15603:110;;;::::0;-1:-1:-1;;;15603:110:0;;12185:2:1;15603:110:0::1;::::0;::::1;12167:21:1::0;12224:2;12204:18;;;12197:30;12263:34;12243:18;;;12236:62;-1:-1:-1;;;12314:18:1;;;12307:36;12360:19;;15603:110:0::1;11983:402:1::0;15603:110:0::1;15750:6;::::0;;15729:38:::1;::::0;-1:-1:-1;;;;;15729:38:0;;::::1;::::0;15750:6;::::1;::::0;15729:38:::1;::::0;::::1;15778:6;:17:::0;;-1:-1:-1;;;;;;15778:17:0::1;-1:-1:-1::0;;;;;15778:17:0;;;::::1;::::0;;;::::1;::::0;;15522:281::o;72543:141::-;72633:17;;:43;;-1:-1:-1;;;72633:43:0;;72606:7;;-1:-1:-1;;;;;72633:17:0;;:34;;:43;;72668:7;;72633:43;;;:::i;56345:127::-;15279:6;;-1:-1:-1;;;;;15279:6:0;14661:10;15279:22;15271:67;;;;-1:-1:-1;;;15271:67:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;56432:23:0;;;::::1;;::::0;;;:15:::1;:23;::::0;;;;:32;;-1:-1:-1;;56432:32:0::1;::::0;::::1;;::::0;;;::::1;::::0;;56345:127::o;52866:145::-;15279:6;;-1:-1:-1;;;;;15279:6:0;14661:10;15279:22;15271:67;;;;-1:-1:-1;;;15271:67:0;;;;;;;:::i;:::-;52947:17:::1;:56:::0;;-1:-1:-1;;;;;;52947:56:0::1;-1:-1:-1::0;;;;;52947:56:0;;;::::1;::::0;;;::::1;::::0;;52866:145::o;2755:181::-;2813:7;;2845:5;2849:1;2845;:5;:::i;:::-;2833:17;;2874:1;2869;:6;;2861:46;;;;-1:-1:-1;;;2861:46:0;;13804:2:1;2861:46:0;;;13786:21:1;13843:2;13823:18;;;13816:30;-1:-1:-1;;;13862:18:1;;;13855:57;13929:18;;2861:46:0;13602:351:1;52345:380:0;-1:-1:-1;;;;;52481:19:0;;52473:68;;;;-1:-1:-1;;;52473:68:0;;23373:2:1;52473:68:0;;;23355:21:1;23412:2;23392:18;;;23385:30;23451:34;23431:18;;;23424:62;-1:-1:-1;;;23502:18:1;;;23495:34;23546:19;;52473:68:0;23171:400:1;52473:68:0;-1:-1:-1;;;;;52560:21:0;;52552:68;;;;-1:-1:-1;;;52552:68:0;;12592:2:1;52552:68:0;;;12574:21:1;12631:2;12611:18;;;12604:30;12670:34;12650:18;;;12643:62;-1:-1:-1;;;12721:18:1;;;12714:32;12763:19;;52552:68:0;12390:398:1;52552:68:0;-1:-1:-1;;;;;52633:18:0;;;;;;;:11;:18;;;;;;;;:27;;;;;;;;;;;;;:36;;;52685:32;;25309:25:1;;;52685:32:0;;25282:18:1;52685:32:0;25163:177:1;3658:226:0;3778:7;3814:12;3806:6;;;;3798:29;;;;-1:-1:-1;;;3798:29:0;;;;;;;;:::i;:::-;-1:-1:-1;3838:9:0;3850:5;3854:1;3850;:5;:::i;:::-;3838:17;3658:226;-1:-1:-1;;;;;3658:226:0:o;57298:1105::-;-1:-1:-1;;;;;57438:22:0;;57390:4;57438:22;;;:14;:22;;;;;;;;57437:23;:53;;;;-1:-1:-1;;;;;;57465:25:0;;;;;;:14;:25;;;;;;;;57464:26;57437:53;57415:122;;;;-1:-1:-1;;;57415:122:0;;18487:2:1;57415:122:0;;;18469:21:1;18526:2;18506:18;;;18499:30;-1:-1:-1;;;18545:18:1;;;18538:49;18604:18;;57415:122:0;18285:343:1;57415:122:0;-1:-1:-1;;;;;57555:19:0;;;;;;:11;:19;;;;;;;;57550:98;;57599:16;;;;57591:45;;;;-1:-1:-1;;;57591:45:0;;25020:2:1;57591:45:0;;;25002:21:1;25059:2;25039:18;;;25032:30;-1:-1:-1;;;25078:18:1;;;25071:46;25134:18;;57591:45:0;24818:340:1;57591:45:0;57671:8;;;;57668:65;;;57689:41;57704:6;57712:9;57723:6;57689:14;:41::i;:::-;57682:48;;;;57668:65;57765:53;;;;;;;;;;;-1:-1:-1;;;57765:53:0;;;;;;;;-1:-1:-1;;;;;57765:17:0;;-1:-1:-1;57765:17:0;;;:9;:17;;;;;;;;:53;;57787:6;;57765:21;:53::i;:::-;-1:-1:-1;;;;;57745:17:0;;;;;;:9;:17;;;;;:73;;;;57856:40;57755:6;57878:9;57889:6;57856:13;:40::i;:::-;:86;;57936:6;57856:86;;;57899:34;57907:6;57915:9;57926:6;57899:7;:34::i;:::-;57831:111;-1:-1:-1;57955:17:0;57975:23;57831:111;57975:6;:23;:::i;:::-;57955:43;-1:-1:-1;58015:13:0;;58011:226;;58048:11;;;;;;;58045:181;;;58080:8;:15;;-1:-1:-1;;58080:15:0;58091:4;58080:15;;;58149:12;;58132:41;;-1:-1:-1;;;;;58149:12:0;58163:9;58132:16;:41::i;:::-;58194:8;:16;;-1:-1:-1;;58194:16:0;;;58045:181;-1:-1:-1;;;;;58272:20:0;;;;;;:9;:20;;;;;;:40;;58297:14;58272:24;:40::i;:::-;-1:-1:-1;;;;;58249:20:0;;;;;;;:9;:20;;;;;;;:63;;;;58330:43;;;;;;-1:-1:-1;;;;;;;;;;;58330:43:0;;;58358:14;25309:25:1;;25297:2;25282:18;;25163:177;58330:43:0;;;;;;;;-1:-1:-1;58391:4:0;;57298:1105;-1:-1:-1;;;;;57298:1105:0:o;4143:471::-;4201:7;4446:6;4442:47;;-1:-1:-1;4476:1:0;4469:8;;4442:47;4501:9;4513:5;4517:1;4513;:5;:::i;:::-;4501:17;-1:-1:-1;4546:1:0;4537:5;4541:1;4501:17;4537:5;:::i;:::-;:10;4529:56;;;;-1:-1:-1;;;4529:56:0;;20972:2:1;4529:56:0;;;20954:21:1;21011:2;20991:18;;;20984:30;21050:34;21030:18;;;21023:62;-1:-1:-1;;;21101:18:1;;;21094:31;21142:19;;4529:56:0;20770:397:1;5090:132:0;5148:7;5175:39;5179:1;5182;5175:39;;;;;;;;;;;;;-1:-1:-1;;;5175:39:0;;;:3;:39::i;58411:330::-;58541:53;;;;;;;;;;;-1:-1:-1;;;58541:53:0;;;;;;;;-1:-1:-1;;;;;58541:17:0;;58504:4;58541:17;;;:9;:17;;;;;;;:53;;58563:6;;58541:21;:53::i;:::-;-1:-1:-1;;;;;58521:17:0;;;;;;;:9;:17;;;;;;:73;;;;58628:20;;;;;;;:32;;58653:6;58628:24;:32::i;:::-;-1:-1:-1;;;;;58605:20:0;;;;;;;:9;:20;;;;;;;:55;;;;58676:35;;;;;;-1:-1:-1;;;;;;;;;;;58676:35:0;;;58704:6;25309:25:1;;25297:2;25282:18;;25163:177;58676:35:0;;;;;;;;-1:-1:-1;58729:4:0;58411:330;;;;;:::o;60057:321::-;60167:21;60199:24;60216:6;60199:16;:24::i;:::-;60234:18;60255:46;60256:21;60283:17;60255:27;:46::i;:::-;60234:67;;60313:12;60331:11;-1:-1:-1;;;;;60331:16:0;60355:10;60331:39;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;;;60057:321:0:o;60386:420::-;60445:12;60460:13;:6;60471:1;60460:10;:13::i;:::-;60445:28;-1:-1:-1;60484:17:0;60504:16;:6;60445:28;60504:10;:16::i;:::-;60484:36;-1:-1:-1;60558:21:0;60592:22;60609:4;60592:16;:22::i;:::-;60627:18;60648:41;:21;60674:14;60648:25;:41::i;:::-;60627:62;;60702:35;60715:9;60726:10;60702:12;:35::i;:::-;60755:43;;;26532:25:1;;;26588:2;26573:18;;26566:34;;;26616:18;;;26609:34;;;60755:43:0;;26520:2:1;26505:18;60755:43:0;;;;;;;60434:372;;;;60386:420;:::o;56480:350::-;-1:-1:-1;;;;;56585:31:0;;;;;;:25;:31;;;;;;;;:40;;;;;;;56563:151;;;;-1:-1:-1;;;56563:151:0;;18057:2:1;56563:151:0;;;18039:21:1;18096:2;18076:18;;;18069:30;18135:34;18115:18;;;18108:62;18206:31;18186:18;;;18179:59;18255:19;;56563:151:0;17855:425:1;56563:151:0;-1:-1:-1;;;;;56725:31:0;;;;;;:25;:31;;;;;;:39;;-1:-1:-1;;56725:39:0;;;;;;;;;;56782:40;;56725:39;;:31;56782:40;;;56480:350;;:::o;58749:894::-;58897:15;;-1:-1:-1;;;;;58938:36:0;;;58846:4;58938:36;;;:25;:36;;;;;;58846:4;;58897:15;;;;;58846:4;;58938:36;;;:66;;;58991:13;-1:-1:-1;;;;;58978:26:0;:9;-1:-1:-1;;;;;58978:26:0;;58938:66;-1:-1:-1;;;;;59028:33:0;;59015:10;59028:33;;;:25;:33;;;;;;58924:80;;-1:-1:-1;59015:10:0;59028:33;;;:60;;;59075:13;-1:-1:-1;;;;;59065:23:0;:6;-1:-1:-1;;;;;59065:23:0;;59028:60;59015:73;;59104:6;59101:533;;;59132:14;;;;:38;;;;-1:-1:-1;;;;;;59151:19:0;;;;;;:11;:19;;;;;;;;59150:20;59132:38;59129:125;;;59180:17;;:42;;-1:-1:-1;;;59180:42:0;;59225:1;;-1:-1:-1;;;;;59180:17:0;;:34;;:42;;59215:6;;59180:42;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:46;59172:82;;;;-1:-1:-1;;;59172:82:0;;22163:2:1;59172:82:0;;;22145:21:1;22202:2;22182:18;;;22175:30;-1:-1:-1;;;22221:18:1;;;22214:53;22284:18;;59172:82:0;21961:347:1;59172:82:0;-1:-1:-1;;;;;59279:19:0;;;;;;:11;:19;;;;;;;;59278:20;:47;;;;-1:-1:-1;;;;;;59303:22:0;;;;;;:11;:22;;;;;;;;59302:23;59278:47;59271:54;;;;;;;59101:533;59346:5;59343:291;;;59404:12;;59394:6;:22;;:49;;;-1:-1:-1;;;;;;59420:23:0;;;;;;:15;:23;;;;;;;;59394:49;:79;;;-1:-1:-1;;;;;;59447:26:0;;;;;;:15;:26;;;;;;;;59394:79;59368:182;;;;-1:-1:-1;;;59368:182:0;;18835:2:1;59368:182:0;;;18817:21:1;18874:2;18854:18;;;18847:30;18913:34;18893:18;;;18886:62;-1:-1:-1;;;18964:18:1;;;18957:38;19012:19;;59368:182:0;18633:404:1;59368:182:0;59572:5;59565:12;;;;;;;59651:398;59736:7;59756:17;59776:39;59800:14;;59776:19;59787:7;;59776:6;:10;;:19;;;;:::i;:39::-;59756:59;-1:-1:-1;59831:13:0;;59828:173;;59906:4;59888:24;;;;:9;:24;;;;;;:39;;59917:9;59888:28;:39::i;:::-;59879:4;59861:24;;;;:9;:24;;;;;;;:66;;;;59947:42;;-1:-1:-1;;;;;59947:42:0;;;-1:-1:-1;;;;;;;;;;;59947:42:0;;;59979:9;25309:25:1;;25297:2;25282:18;;25163:177;59947:42:0;;;;;;;;59828:173;60020:21;:6;60031:9;60020:10;:21::i;5718:312::-;5838:7;5873:12;5866:5;5858:28;;;;-1:-1:-1;;;5858:28:0;;;;;;;;:::i;:::-;-1:-1:-1;5897:9:0;5909:5;5913:1;5909;:5;:::i;60814:505::-;60904:16;;;60918:1;60904:16;;;;;;;;60880:21;;60904:16;;;;;;;;;;-1:-1:-1;60904:16:0;60880:40;;60949:4;60931;60936:1;60931:7;;;;;;;;:::i;:::-;-1:-1:-1;;;;;60931:23:0;;;:7;;;;;;;;;;:23;;;;60975:15;;:23;;;-1:-1:-1;;;60975:23:0;;;;:15;;;;;:21;;:23;;;;;60931:7;;60975:23;;;;;:15;:23;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;60965:4;60970:1;60965:7;;;;;;;;:::i;:::-;-1:-1:-1;;;;;60965:33:0;;;:7;;;;;;;;;:33;61043:15;;61011:62;;61028:4;;61043:15;61061:11;61011:8;:62::i;:::-;61086:15;;:225;;-1:-1:-1;;;61086:225:0;;-1:-1:-1;;;;;61086:15:0;;;;:67;;:225;;61168:11;;61086:15;;61238:4;;61265;;61285:15;;61086:225;;;:::i;3219:136::-;3277:7;3304:43;3308:1;3311;3304:43;;;;;;;;;;;;;;;;;:3;:43::i;61327:519::-;61507:15;;61475:62;;61492:4;;-1:-1:-1;;;;;61507:15:0;61525:11;61475:8;:62::i;:::-;61580:15;;61785:12;;61580:258;;-1:-1:-1;;;61580:258:0;;61653:4;61580:258;;;9353:34:1;9403:18;;;9396:34;;;61580:15:0;9446:18:1;;;9439:34;;;9489:18;;;9482:34;-1:-1:-1;;;;;61785:12:0;;;9532:19:1;;;9525:44;61812:15:0;9585:19:1;;;9578:35;61580:15:0;;;:32;;61620:9;;9287:19:1;;61580:258:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;14:464:1:-;57:5;110:3;103:4;95:6;91:17;87:27;77:55;;128:1;125;118:12;77:55;164:6;151:20;195:49;211:32;240:2;211:32;:::i;:::-;195:49;:::i;:::-;269:2;260:7;253:19;315:3;308:4;303:2;295:6;291:15;287:26;284:35;281:55;;;332:1;329;322:12;281:55;397:2;390:4;382:6;378:17;371:4;362:7;358:18;345:55;445:1;420:16;;;438:4;416:27;409:38;;;;424:7;14:464;-1:-1:-1;;;14:464:1:o;483:247::-;542:6;595:2;583:9;574:7;570:23;566:32;563:52;;;611:1;608;601:12;563:52;650:9;637:23;669:31;694:5;669:31;:::i;735:251::-;805:6;858:2;846:9;837:7;833:23;829:32;826:52;;;874:1;871;864:12;826:52;906:9;900:16;925:31;950:5;925:31;:::i;1251:323::-;1327:6;1335;1388:2;1376:9;1367:7;1363:23;1359:32;1356:52;;;1404:1;1401;1394:12;1356:52;1443:9;1430:23;1462:31;1487:5;1462:31;:::i;:::-;1512:5;1564:2;1549:18;;;;1536:32;;-1:-1:-1;;;1251:323:1:o;1579:388::-;1647:6;1655;1708:2;1696:9;1687:7;1683:23;1679:32;1676:52;;;1724:1;1721;1714:12;1676:52;1763:9;1750:23;1782:31;1807:5;1782:31;:::i;:::-;1832:5;-1:-1:-1;1889:2:1;1874:18;;1861:32;1902:33;1861:32;1902:33;:::i;:::-;1954:7;1944:17;;;1579:388;;;;;:::o;1972:456::-;2049:6;2057;2065;2118:2;2106:9;2097:7;2093:23;2089:32;2086:52;;;2134:1;2131;2124:12;2086:52;2173:9;2160:23;2192:31;2217:5;2192:31;:::i;:::-;2242:5;-1:-1:-1;2299:2:1;2284:18;;2271:32;2312:33;2271:32;2312:33;:::i;:::-;1972:456;;2364:7;;-1:-1:-1;;;2418:2:1;2403:18;;;;2390:32;;1972:456::o;2433:382::-;2498:6;2506;2559:2;2547:9;2538:7;2534:23;2530:32;2527:52;;;2575:1;2572;2565:12;2527:52;2614:9;2601:23;2633:31;2658:5;2633:31;:::i;:::-;2683:5;-1:-1:-1;2740:2:1;2725:18;;2712:32;2753:30;2712:32;2753:30;:::i;3140:241::-;3196:6;3249:2;3237:9;3228:7;3224:23;3220:32;3217:52;;;3265:1;3262;3255:12;3217:52;3304:9;3291:23;3323:28;3345:5;3323:28;:::i;3386:245::-;3453:6;3506:2;3494:9;3485:7;3481:23;3477:32;3474:52;;;3522:1;3519;3512:12;3474:52;3554:9;3548:16;3573:28;3595:5;3573:28;:::i;3636:322::-;3705:6;3758:2;3746:9;3737:7;3733:23;3729:32;3726:52;;;3774:1;3771;3764:12;3726:52;3814:9;3801:23;-1:-1:-1;;;;;3839:6:1;3836:30;3833:50;;;3879:1;3876;3869:12;3833:50;3902;3944:7;3935:6;3924:9;3920:22;3902:50;:::i;:::-;3892:60;3636:322;-1:-1:-1;;;;3636:322:1:o;3963:636::-;4043:6;4096:2;4084:9;4075:7;4071:23;4067:32;4064:52;;;4112:1;4109;4102:12;4064:52;4145:9;4139:16;-1:-1:-1;;;;;4170:6:1;4167:30;4164:50;;;4210:1;4207;4200:12;4164:50;4233:22;;4286:4;4278:13;;4274:27;-1:-1:-1;4264:55:1;;4315:1;4312;4305:12;4264:55;4344:2;4338:9;4369:49;4385:32;4414:2;4385:32;:::i;4369:49::-;4441:2;4434:5;4427:17;4481:7;4476:2;4471;4467;4463:11;4459:20;4456:33;4453:53;;;4502:1;4499;4492:12;4453:53;4515:54;4566:2;4561;4554:5;4550:14;4545:2;4541;4537:11;4515:54;:::i;4604:390::-;4682:6;4690;4743:2;4731:9;4722:7;4718:23;4714:32;4711:52;;;4759:1;4756;4749:12;4711:52;4799:9;4786:23;-1:-1:-1;;;;;4824:6:1;4821:30;4818:50;;;4864:1;4861;4854:12;4818:50;4887;4929:7;4920:6;4909:9;4905:22;4887:50;:::i;:::-;4877:60;4984:2;4969:18;;;;4956:32;;-1:-1:-1;;;;4604:390:1:o;4999:180::-;5058:6;5111:2;5099:9;5090:7;5086:23;5082:32;5079:52;;;5127:1;5124;5117:12;5079:52;-1:-1:-1;5150:23:1;;4999:180;-1:-1:-1;4999:180:1:o;5184:184::-;5254:6;5307:2;5295:9;5286:7;5282:23;5278:32;5275:52;;;5323:1;5320;5313:12;5275:52;-1:-1:-1;5346:16:1;;5184:184;-1:-1:-1;5184:184:1:o;5373:248::-;5441:6;5449;5502:2;5490:9;5481:7;5477:23;5473:32;5470:52;;;5518:1;5515;5508:12;5470:52;-1:-1:-1;;5541:23:1;;;5611:2;5596:18;;;5583:32;;-1:-1:-1;5373:248:1:o;5626:316::-;5703:6;5711;5719;5772:2;5760:9;5751:7;5747:23;5743:32;5740:52;;;5788:1;5785;5778:12;5740:52;-1:-1:-1;;5811:23:1;;;5881:2;5866:18;;5853:32;;-1:-1:-1;5932:2:1;5917:18;;;5904:32;;5626:316;-1:-1:-1;5626:316:1:o;5947:306::-;6035:6;6043;6051;6104:2;6092:9;6083:7;6079:23;6075:32;6072:52;;;6120:1;6117;6110:12;6072:52;6149:9;6143:16;6133:26;;6199:2;6188:9;6184:18;6178:25;6168:35;;6243:2;6232:9;6228:18;6222:25;6212:35;;5947:306;;;;;:::o;6258:385::-;6344:6;6352;6360;6368;6421:3;6409:9;6400:7;6396:23;6392:33;6389:53;;;6438:1;6435;6428:12;6389:53;-1:-1:-1;;6461:23:1;;;6531:2;6516:18;;6503:32;;-1:-1:-1;6582:2:1;6567:18;;6554:32;;6633:2;6618:18;6605:32;;-1:-1:-1;6258:385:1;-1:-1:-1;6258:385:1:o;6648:258::-;6690:3;6728:5;6722:12;6755:6;6750:3;6743:19;6771:63;6827:6;6820:4;6815:3;6811:14;6804:4;6797:5;6793:16;6771:63;:::i;:::-;6888:2;6867:15;-1:-1:-1;;6863:29:1;6854:39;;;;6895:4;6850:50;;6648:258;-1:-1:-1;;6648:258:1:o;7121:203::-;-1:-1:-1;;;;;7285:32:1;;;;7267:51;;7255:2;7240:18;;7121:203::o;7329:304::-;-1:-1:-1;;;;;7559:15:1;;;7541:34;;7611:15;;7606:2;7591:18;;7584:43;7491:2;7476:18;;7329:304::o;7638:375::-;-1:-1:-1;;;;;7896:15:1;;;7878:34;;7948:15;;;;7943:2;7928:18;;7921:43;7995:2;7980:18;;7973:34;;;;7828:2;7813:18;;7638:375::o;8018:317::-;-1:-1:-1;;;;;8195:32:1;;8177:51;;8264:2;8259;8244:18;;8237:30;;;-1:-1:-1;;8284:45:1;;8310:18;;8302:6;8284:45;:::i;8340:388::-;-1:-1:-1;;;;;8545:32:1;;8527:51;;8614:2;8609;8594:18;;8587:30;;;-1:-1:-1;;8634:45:1;;8660:18;;8652:6;8634:45;:::i;:::-;8626:53;;8715:6;8710:2;8699:9;8695:18;8688:34;8340:388;;;;;;:::o;8733:274::-;-1:-1:-1;;;;;8925:32:1;;;;8907:51;;8989:2;8974:18;;8967:34;8895:2;8880:18;;8733:274::o;10282:220::-;10431:2;10420:9;10413:21;10394:4;10451:45;10492:2;10481:9;10477:18;10469:6;10451:45;:::i;11280:337::-;11482:2;11464:21;;;11521:2;11501:18;;;11494:30;-1:-1:-1;;;11555:2:1;11540:18;;11533:43;11608:2;11593:18;;11280:337::o;13197:400::-;13399:2;13381:21;;;13438:2;13418:18;;;13411:30;13477:34;13472:2;13457:18;;13450:62;-1:-1:-1;;;13543:2:1;13528:18;;13521:34;13587:3;13572:19;;13197:400::o;14364:344::-;14566:2;14548:21;;;14605:2;14585:18;;;14578:30;-1:-1:-1;;;14639:2:1;14624:18;;14617:50;14699:2;14684:18;;14364:344::o;14713:354::-;14915:2;14897:21;;;14954:2;14934:18;;;14927:30;14993:32;14988:2;14973:18;;14966:60;15058:2;15043:18;;14713:354::o;15909:355::-;16111:2;16093:21;;;16150:2;16130:18;;;16123:30;16189:33;16184:2;16169:18;;16162:61;16255:2;16240:18;;15909:355::o;16673:::-;16875:2;16857:21;;;16914:2;16894:18;;;16887:30;16953:33;16948:2;16933:18;;16926:61;17019:2;17004:18;;16673:355::o;21172:356::-;21374:2;21356:21;;;21393:18;;;21386:30;21452:34;21447:2;21432:18;;21425:62;21519:2;21504:18;;21172:356::o;25345:980::-;25607:4;25655:3;25644:9;25640:19;25686:6;25675:9;25668:25;25712:2;25750:6;25745:2;25734:9;25730:18;25723:34;25793:3;25788:2;25777:9;25773:18;25766:31;25817:6;25852;25846:13;25883:6;25875;25868:22;25921:3;25910:9;25906:19;25899:26;;25960:2;25952:6;25948:15;25934:29;;25981:1;25991:195;26005:6;26002:1;25999:13;25991:195;;;26070:13;;-1:-1:-1;;;;;26066:39:1;26054:52;;26161:15;;;;26126:12;;;;26102:1;26020:9;25991:195;;;-1:-1:-1;;;;;;;26242:32:1;;;;26237:2;26222:18;;26215:60;-1:-1:-1;;;26306:3:1;26291:19;26284:35;26203:3;25345:980;-1:-1:-1;;;25345:980:1:o;26843:275::-;26914:2;26908:9;26979:2;26960:13;;-1:-1:-1;;26956:27:1;26944:40;;-1:-1:-1;;;;;26999:34:1;;27035:22;;;26996:62;26993:88;;;27061:18;;:::i;:::-;27097:2;27090:22;26843:275;;-1:-1:-1;26843:275:1:o;27123:187::-;27172:4;-1:-1:-1;;;;;27197:6:1;27194:30;27191:56;;;27227:18;;:::i;:::-;-1:-1:-1;27293:2:1;27272:15;-1:-1:-1;;27268:29:1;27299:4;27264:40;;27123:187::o;27315:128::-;27355:3;27386:1;27382:6;27379:1;27376:13;27373:39;;;27392:18;;:::i;:::-;-1:-1:-1;27428:9:1;;27315:128::o;27448:217::-;27488:1;27514;27504:132;;27558:10;27553:3;27549:20;27546:1;27539:31;27593:4;27590:1;27583:15;27621:4;27618:1;27611:15;27504:132;-1:-1:-1;27650:9:1;;27448:217::o;27670:168::-;27710:7;27776:1;27772;27768:6;27764:14;27761:1;27758:21;27753:1;27746:9;27739:17;27735:45;27732:71;;;27783:18;;:::i;:::-;-1:-1:-1;27823:9:1;;27670:168::o;27843:125::-;27883:4;27911:1;27908;27905:8;27902:34;;;27916:18;;:::i;:::-;-1:-1:-1;27953:9:1;;27843:125::o;27973:258::-;28045:1;28055:113;28069:6;28066:1;28063:13;28055:113;;;28145:11;;;28139:18;28126:11;;;28119:39;28091:2;28084:10;28055:113;;;28186:6;28183:1;28180:13;28177:48;;;28221:1;28212:6;28207:3;28203:16;28196:27;28177:48;;27973:258;;;:::o;28236:380::-;28315:1;28311:12;;;;28358;;;28379:61;;28433:4;28425:6;28421:17;28411:27;;28379:61;28486:2;28478:6;28475:14;28455:18;28452:38;28449:161;;;28532:10;28527:3;28523:20;28520:1;28513:31;28567:4;28564:1;28557:15;28595:4;28592:1;28585:15;28449:161;;28236:380;;;:::o;28621:135::-;28660:3;-1:-1:-1;;28681:17:1;;28678:43;;;28701:18;;:::i;:::-;-1:-1:-1;28748:1:1;28737:13;;28621:135::o;28761:127::-;28822:10;28817:3;28813:20;28810:1;28803:31;28853:4;28850:1;28843:15;28877:4;28874:1;28867:15;28893:127;28954:10;28949:3;28945:20;28942:1;28935:31;28985:4;28982:1;28975:15;29009:4;29006:1;28999:15;29025:127;29086:10;29081:3;29077:20;29074:1;29067:31;29117:4;29114:1;29107:15;29141:4;29138:1;29131:15;29157:131;-1:-1:-1;;;;;29232:31:1;;29222:42;;29212:70;;29278:1;29275;29268:12;29212:70;29157:131;:::o;29293:118::-;29379:5;29372:13;29365:21;29358:5;29355:32;29345:60;;29401:1;29398;29391:12

Swarm Source

ipfs://8387faecafa31c991fa6581e5af31b99362805b2f28babb47abd9983139fcc39
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.