Contract 0xAD015a006755b389d8e5BC2680cc5081dc1d0abd

Contract Overview

Balance:
0 Ether

Token:
Txn Hash
Method
Block
From
To
Value
0x397afe901520130487db1d10f5fdbefe104f528afb942c5fa0b6f4e6c3b42519Stake114068702022-09-19 9:32:0569 days 8 hrs ago0xe142f2dfc98b8c3f19ef81e8773a7132a08be8c2 IN  0xad015a006755b389d8e5bc2680cc5081dc1d0abd0 Ether0.00009282 2.50000001
0xe539091065b19e3bff992876d53b42bc757d7f097221cb8a21b4aa7109dee4fdStake114036072022-09-18 19:51:0469 days 22 hrs ago0xd0c7de5acec31a12549e957f47089d3d374f609e IN  0xad015a006755b389d8e5bc2680cc5081dc1d0abd0 Ether0.00009294 2.5
0x8ca67c00ee97aab5d3eb0e8ffdd4b2c0418c4288be6d50783a15841a5c57ddddStake114035872022-09-18 19:46:0169 days 22 hrs ago0xd0c7de5acec31a12549e957f47089d3d374f609e IN  0xad015a006755b389d8e5bc2680cc5081dc1d0abd0 Ether0.00009291 2.5
0x1699c70bfd8b7b032525e5dcb55ff9a33becf60e5a424f51614609e5ae80a5f1Stake114035582022-09-18 19:38:4669 days 22 hrs ago0xd0c7de5acec31a12549e957f47089d3d374f609e IN  0xad015a006755b389d8e5bc2680cc5081dc1d0abd0 Ether0.0000928 2.5
0x0a2585449fc601ba674ca6b33e3d0d1ec06c41be09f7c6a5ecaf30bd09bb44d9Stake114035352022-09-18 19:32:5869 days 22 hrs ago0xd0c7de5acec31a12549e957f47089d3d374f609e IN  0xad015a006755b389d8e5bc2680cc5081dc1d0abd0 Ether0.0000928 2.5
0xa7c32d4bfc08c502bd9bf0db95f13d8bdccd5aae408ad55a858c79d344bacb16Stake114035112022-09-18 19:26:4969 days 22 hrs ago0xd0c7de5acec31a12549e957f47089d3d374f609e IN  0xad015a006755b389d8e5bc2680cc5081dc1d0abd0 Ether0.0000928 2.5
0xe6ca9230b835bdd9de02142f9c1ad12065ac3c682ef46ff87b60fdcd62efc9e1Stake114034932022-09-18 19:22:1969 days 22 hrs ago0xd0c7de5acec31a12549e957f47089d3d374f609e IN  0xad015a006755b389d8e5bc2680cc5081dc1d0abd0 Ether0.00009286 2.5
0xbcc11bb07c1aba32a15ce6cd5ae0718fbeb64560517510bcfae4beceb8eb438aStake114034842022-09-18 19:20:0469 days 22 hrs ago0xf58e1aa343eb66e64c8c4484a4ecf1cd79c32f18 IN  0xad015a006755b389d8e5bc2680cc5081dc1d0abd0 Ether0.00009277 2.5
0x3cbd6181e265a4a27e914a9115771fd50ad6d9864abb727f23a37813ab30f44bStake114034262022-09-18 19:05:3469 days 23 hrs ago0xd0c7de5acec31a12549e957f47089d3d374f609e IN  0xad015a006755b389d8e5bc2680cc5081dc1d0abd0 Ether0.00009288 2.5
0x46d07273da760ff4a2e558511cbd733dd9086aca1341e239a314805e38f105f7Stake114034062022-09-18 19:00:3369 days 23 hrs ago0xd0c7de5acec31a12549e957f47089d3d374f609e IN  0xad015a006755b389d8e5bc2680cc5081dc1d0abd0 Ether0.00009279 2.5
0x1536f280ae2bc9a5f728fac0c5ba375a30b5e00090bd950ad1920a2187b1295cStake114019852022-09-18 13:03:0870 days 5 hrs ago0xd0c7de5acec31a12549e957f47089d3d374f609e IN  0xad015a006755b389d8e5bc2680cc5081dc1d0abd0 Ether0.0000928 2.5
0x400c030d7cf522cf59712465a1ed908f5670b317afbaf06c22e7c29adc00188fStake114019552022-09-18 12:55:3170 days 5 hrs ago0xd0c7de5acec31a12549e957f47089d3d374f609e IN  0xad015a006755b389d8e5bc2680cc5081dc1d0abd0 Ether0.00009277 2.5
0x42e684abc052b6b9c6f78c122eff06c4abd952780bc178e1db3ae4b429ba0407Stake113966732022-09-17 14:48:1371 days 3 hrs ago0xcf70e93b75bc5d94652445282dec2ddab223aac1 IN  0xad015a006755b389d8e5bc2680cc5081dc1d0abd0 Ether0.00009285 2.5
0x77fd6751994d2b43759ce5d63644fc9081b97ee24f1d4d09e6cb6f130562be39Stake113966592022-09-17 14:44:4371 days 3 hrs ago0xcf70e93b75bc5d94652445282dec2ddab223aac1 IN  0xad015a006755b389d8e5bc2680cc5081dc1d0abd0 Ether0.00009282 2.5
0x6bbe6758088fecb5cde42ff6d75af146fd6e54ea476f9c7bbc6f218aef32296dStake113966432022-09-17 14:40:4371 days 3 hrs ago0xcf70e93b75bc5d94652445282dec2ddab223aac1 IN  0xad015a006755b389d8e5bc2680cc5081dc1d0abd0 Ether0.00009285 2.5
0xfda4b1d3bcce36287b8d7c95fd1747b9766493dbec4c10960eb0f9a356af0307Stake113966402022-09-17 14:39:5871 days 3 hrs ago0xcf70e93b75bc5d94652445282dec2ddab223aac1 IN  0xad015a006755b389d8e5bc2680cc5081dc1d0abd0 Ether0.00009277 2.5
0x5101c407ad24e265aecbdf9069cddcf349dcbf13e7d04097ce61b23b62223a57Stake113909522022-09-16 14:50:3472 days 3 hrs ago0x469ac0f185c11763dedc0e3fc52f77de39a46b9b IN  0xad015a006755b389d8e5bc2680cc5081dc1d0abd0 Ether0.00009282 2.5
0x5c478ed086eb65d5817758d8f20c7f4baf11be0dcd2964aa12262d4c7c47df59Stake113898772022-09-16 10:21:2072 days 7 hrs ago0x7943d0ed3bff7269d2327850cf2a0be17ec544f6 IN  0xad015a006755b389d8e5bc2680cc5081dc1d0abd0 Ether0.00078581 2.5
0x83f9ea64679eb9fb69a4b246a1310633d1d0f8446d7329606598d01825a7e422Exit113885452022-09-16 4:47:4572 days 13 hrs ago0x469ac0f185c11763dedc0e3fc52f77de39a46b9b IN  0xad015a006755b389d8e5bc2680cc5081dc1d0abd0 Ether0.00046174 2.5
0x3af929001c5c7c3358439bf170469a9c635bcf7d17e50a0e1c9c6c6468a4651cExit113885412022-09-16 4:46:4572 days 13 hrs ago0x469ac0f185c11763dedc0e3fc52f77de39a46b9b IN  0xad015a006755b389d8e5bc2680cc5081dc1d0abd0 Ether0.00046176 2.5
0x5afd2da59ebb37fd5db31660513e45e930b64c8aecb72d4708cde3271982c636Exit113885352022-09-16 4:45:1572 days 13 hrs ago0x469ac0f185c11763dedc0e3fc52f77de39a46b9b IN  0xad015a006755b389d8e5bc2680cc5081dc1d0abd0 Ether0.00041893 2.5
0x47e34d913867806ccb2ff31758df609fd9271f3a34cb75dd4a516a4c885b8f7bExit113885292022-09-16 4:43:4572 days 13 hrs ago0x469ac0f185c11763dedc0e3fc52f77de39a46b9b IN  0xad015a006755b389d8e5bc2680cc5081dc1d0abd0 Ether0.00046171 2.5
0xa6e7b0d29783d68ad0e1cd8696bed317b6e3a1bb3b3fe0783c238848b29c1806Stake113852392022-09-15 15:00:1673 days 3 hrs ago0x469ac0f185c11763dedc0e3fc52f77de39a46b9b IN  0xad015a006755b389d8e5bc2680cc5081dc1d0abd0 Ether0.00078485 2.5
0x5f075af604ddbb0100d46c9d7f0dfe228928342790aafbfabef6f3637cb683ddStake113849972022-09-15 13:59:3973 days 4 hrs ago0x4c701d94572ecd5464aa95cfd4e6aa70615aad80 IN  0xad015a006755b389d8e5bc2680cc5081dc1d0abd0 Ether0.00078482 2.5
0x96ae324f1ac55863d280e39225e88f3c8fba9dc2cd001bc01c9d08f40d375287Stake113849882022-09-15 13:57:2373 days 4 hrs ago0x4c701d94572ecd5464aa95cfd4e6aa70615aad80 IN  0xad015a006755b389d8e5bc2680cc5081dc1d0abd0 Ether0.00078485 2.5
[ Download CSV Export 
Latest 25 internal transaction
Parent Txn Hash Block From To Value
0x397afe901520130487db1d10f5fdbefe104f528afb942c5fa0b6f4e6c3b42519114068702022-09-19 9:32:0569 days 8 hrs ago 0xad015a006755b389d8e5bc2680cc5081dc1d0abd0x00000000000000000000000000000000000000010 Ether
0xe539091065b19e3bff992876d53b42bc757d7f097221cb8a21b4aa7109dee4fd114036072022-09-18 19:51:0469 days 22 hrs ago 0xad015a006755b389d8e5bc2680cc5081dc1d0abd0x00000000000000000000000000000000000000010 Ether
0x8ca67c00ee97aab5d3eb0e8ffdd4b2c0418c4288be6d50783a15841a5c57dddd114035872022-09-18 19:46:0169 days 22 hrs ago 0xad015a006755b389d8e5bc2680cc5081dc1d0abd0x00000000000000000000000000000000000000010 Ether
0x1699c70bfd8b7b032525e5dcb55ff9a33becf60e5a424f51614609e5ae80a5f1114035582022-09-18 19:38:4669 days 22 hrs ago 0xad015a006755b389d8e5bc2680cc5081dc1d0abd0x00000000000000000000000000000000000000010 Ether
0x0a2585449fc601ba674ca6b33e3d0d1ec06c41be09f7c6a5ecaf30bd09bb44d9114035352022-09-18 19:32:5869 days 22 hrs ago 0xad015a006755b389d8e5bc2680cc5081dc1d0abd0x00000000000000000000000000000000000000010 Ether
0xa7c32d4bfc08c502bd9bf0db95f13d8bdccd5aae408ad55a858c79d344bacb16114035112022-09-18 19:26:4969 days 22 hrs ago 0xad015a006755b389d8e5bc2680cc5081dc1d0abd0x00000000000000000000000000000000000000010 Ether
0xe6ca9230b835bdd9de02142f9c1ad12065ac3c682ef46ff87b60fdcd62efc9e1114034932022-09-18 19:22:1969 days 22 hrs ago 0xad015a006755b389d8e5bc2680cc5081dc1d0abd0x00000000000000000000000000000000000000010 Ether
0xbcc11bb07c1aba32a15ce6cd5ae0718fbeb64560517510bcfae4beceb8eb438a114034842022-09-18 19:20:0469 days 22 hrs ago 0xad015a006755b389d8e5bc2680cc5081dc1d0abd0x00000000000000000000000000000000000000010 Ether
0x3cbd6181e265a4a27e914a9115771fd50ad6d9864abb727f23a37813ab30f44b114034262022-09-18 19:05:3469 days 23 hrs ago 0xad015a006755b389d8e5bc2680cc5081dc1d0abd0x00000000000000000000000000000000000000010 Ether
0x46d07273da760ff4a2e558511cbd733dd9086aca1341e239a314805e38f105f7114034062022-09-18 19:00:3369 days 23 hrs ago 0xad015a006755b389d8e5bc2680cc5081dc1d0abd0x00000000000000000000000000000000000000010 Ether
0x1536f280ae2bc9a5f728fac0c5ba375a30b5e00090bd950ad1920a2187b1295c114019852022-09-18 13:03:0870 days 5 hrs ago 0xad015a006755b389d8e5bc2680cc5081dc1d0abd0x00000000000000000000000000000000000000010 Ether
0x400c030d7cf522cf59712465a1ed908f5670b317afbaf06c22e7c29adc00188f114019552022-09-18 12:55:3170 days 5 hrs ago 0xad015a006755b389d8e5bc2680cc5081dc1d0abd0x00000000000000000000000000000000000000010 Ether
0x42e684abc052b6b9c6f78c122eff06c4abd952780bc178e1db3ae4b429ba0407113966732022-09-17 14:48:1371 days 3 hrs ago 0xad015a006755b389d8e5bc2680cc5081dc1d0abd0x00000000000000000000000000000000000000010 Ether
0x77fd6751994d2b43759ce5d63644fc9081b97ee24f1d4d09e6cb6f130562be39113966592022-09-17 14:44:4371 days 3 hrs ago 0xad015a006755b389d8e5bc2680cc5081dc1d0abd0x00000000000000000000000000000000000000010 Ether
0x6bbe6758088fecb5cde42ff6d75af146fd6e54ea476f9c7bbc6f218aef32296d113966432022-09-17 14:40:4371 days 3 hrs ago 0xad015a006755b389d8e5bc2680cc5081dc1d0abd0x00000000000000000000000000000000000000010 Ether
0xfda4b1d3bcce36287b8d7c95fd1747b9766493dbec4c10960eb0f9a356af0307113966402022-09-17 14:39:5871 days 3 hrs ago 0xad015a006755b389d8e5bc2680cc5081dc1d0abd0x00000000000000000000000000000000000000010 Ether
0x5101c407ad24e265aecbdf9069cddcf349dcbf13e7d04097ce61b23b62223a57113909522022-09-16 14:50:3472 days 3 hrs ago 0xad015a006755b389d8e5bc2680cc5081dc1d0abd0x00000000000000000000000000000000000000010 Ether
0x5c478ed086eb65d5817758d8f20c7f4baf11be0dcd2964aa12262d4c7c47df59113898772022-09-16 10:21:2072 days 7 hrs ago 0xad015a006755b389d8e5bc2680cc5081dc1d0abd 0xd99b4bb049a6dd490901cdfa33f15c4fac097ef00 Ether
0x5c478ed086eb65d5817758d8f20c7f4baf11be0dcd2964aa12262d4c7c47df59113898772022-09-16 10:21:2072 days 7 hrs ago 0xad015a006755b389d8e5bc2680cc5081dc1d0abd0x00000000000000000000000000000000000000010 Ether
0x83f9ea64679eb9fb69a4b246a1310633d1d0f8446d7329606598d01825a7e422113885452022-09-16 4:47:4572 days 13 hrs ago 0xad015a006755b389d8e5bc2680cc5081dc1d0abd 0xd99b4bb049a6dd490901cdfa33f15c4fac097ef00 Ether
0x83f9ea64679eb9fb69a4b246a1310633d1d0f8446d7329606598d01825a7e422113885452022-09-16 4:47:4572 days 13 hrs ago 0xad015a006755b389d8e5bc2680cc5081dc1d0abd 0xd99b4bb049a6dd490901cdfa33f15c4fac097ef00 Ether
0x83f9ea64679eb9fb69a4b246a1310633d1d0f8446d7329606598d01825a7e422113885452022-09-16 4:47:4572 days 13 hrs ago 0xad015a006755b389d8e5bc2680cc5081dc1d0abd0x00000000000000000000000000000000000000010 Ether
0x3af929001c5c7c3358439bf170469a9c635bcf7d17e50a0e1c9c6c6468a4651c113885412022-09-16 4:46:4572 days 13 hrs ago 0xad015a006755b389d8e5bc2680cc5081dc1d0abd 0xd99b4bb049a6dd490901cdfa33f15c4fac097ef00 Ether
0x3af929001c5c7c3358439bf170469a9c635bcf7d17e50a0e1c9c6c6468a4651c113885412022-09-16 4:46:4572 days 13 hrs ago 0xad015a006755b389d8e5bc2680cc5081dc1d0abd 0xd99b4bb049a6dd490901cdfa33f15c4fac097ef00 Ether
0x3af929001c5c7c3358439bf170469a9c635bcf7d17e50a0e1c9c6c6468a4651c113885412022-09-16 4:46:4572 days 13 hrs ago 0xad015a006755b389d8e5bc2680cc5081dc1d0abd0x00000000000000000000000000000000000000010 Ether
[ Download CSV Export 
Loading

Contract Source Code Verified (Exact Match)

Contract Name:
doxaStake

Compiler Version
v0.8.13+commit.abaa5c0e

Optimization Enabled:
Yes with 200 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity)

/**
 *Submitted for verification at Etherscan.io on 2022-05-09
*/

/**
 *Submitted for verification at Etherscan.io on 2022-05-09
*/

// File: @openzeppelin/contracts-upgradeable/utils/AddressUpgradeable.sol


// OpenZeppelin Contracts (last updated v4.5.0) (utils/Address.sol)

pragma solidity ^0.8.1;

/**
 * @dev Collection of functions related to the address type
 */
library AddressUpgradeable {
    /**
     * @dev Returns true if `account` is a contract.
     *
     * [IMPORTANT]
     * ====
     * It is unsafe to assume that an address for which this function returns
     * false is an externally-owned account (EOA) and not a contract.
     *
     * Among others, `isContract` will return false for the following
     * types of addresses:
     *
     *  - an externally-owned account
     *  - a contract in construction
     *  - an address where a contract will be created
     *  - an address where a contract lived, but was destroyed
     * ====
     *
     * [IMPORTANT]
     * ====
     * You shouldn't rely on `isContract` to protect against flash loan attacks!
     *
     * Preventing calls from contracts is highly discouraged. It breaks composability, breaks support for smart wallets
     * like Gnosis Safe, and does not provide security since it can be circumvented by calling from a contract
     * constructor.
     * ====
     */
    function isContract(address account) internal view returns (bool) {
        // This method relies on extcodesize/address.code.length, which returns 0
        // for contracts in construction, since the code is only stored at the end
        // of the constructor execution.

        return account.code.length > 0;
    }

    /**
     * @dev Replacement for Solidity's `transfer`: sends `amount` wei to
     * `recipient`, forwarding all available gas and reverting on errors.
     *
     * https://eips.ethereum.org/EIPS/eip-1884[EIP1884] increases the gas cost
     * of certain opcodes, possibly making contracts go over the 2300 gas limit
     * imposed by `transfer`, making them unable to receive funds via
     * `transfer`. {sendValue} removes this limitation.
     *
     * https://diligence.consensys.net/posts/2019/09/stop-using-soliditys-transfer-now/[Learn more].
     *
     * IMPORTANT: because control is transferred to `recipient`, care must be
     * taken to not create reentrancy vulnerabilities. Consider using
     * {ReentrancyGuard} or the
     * https://solidity.readthedocs.io/en/v0.5.11/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern].
     */
    function sendValue(address payable recipient, uint256 amount) internal {
        require(address(this).balance >= amount, "Address: insufficient balance");

        (bool success, ) = recipient.call{value: amount}("");
        require(success, "Address: unable to send value, recipient may have reverted");
    }

    /**
     * @dev Performs a Solidity function call using a low level `call`. A
     * plain `call` is an unsafe replacement for a function call: use this
     * function instead.
     *
     * If `target` reverts with a revert reason, it is bubbled up by this
     * function (like regular Solidity function calls).
     *
     * Returns the raw returned data. To convert to the expected return value,
     * use https://solidity.readthedocs.io/en/latest/units-and-global-variables.html?highlight=abi.decode#abi-encoding-and-decoding-functions[`abi.decode`].
     *
     * Requirements:
     *
     * - `target` must be a contract.
     * - calling `target` with `data` must not revert.
     *
     * _Available since v3.1._
     */
    function functionCall(address target, bytes memory data) internal returns (bytes memory) {
        return functionCall(target, data, "Address: low-level call failed");
    }

    /**
     * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], but with
     * `errorMessage` as a fallback revert reason when `target` reverts.
     *
     * _Available since v3.1._
     */
    function functionCall(
        address target,
        bytes memory data,
        string memory errorMessage
    ) internal returns (bytes memory) {
        return functionCallWithValue(target, data, 0, errorMessage);
    }

    /**
     * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],
     * but also transferring `value` wei to `target`.
     *
     * Requirements:
     *
     * - the calling contract must have an ETH balance of at least `value`.
     * - the called Solidity function must be `payable`.
     *
     * _Available since v3.1._
     */
    function functionCallWithValue(
        address target,
        bytes memory data,
        uint256 value
    ) internal returns (bytes memory) {
        return functionCallWithValue(target, data, value, "Address: low-level call with value failed");
    }

    /**
     * @dev Same as {xref-Address-functionCallWithValue-address-bytes-uint256-}[`functionCallWithValue`], but
     * with `errorMessage` as a fallback revert reason when `target` reverts.
     *
     * _Available since v3.1._
     */
    function functionCallWithValue(
        address target,
        bytes memory data,
        uint256 value,
        string memory errorMessage
    ) internal returns (bytes memory) {
        require(address(this).balance >= value, "Address: insufficient balance for call");
        require(isContract(target), "Address: call to non-contract");

        (bool success, bytes memory returndata) = target.call{value: value}(data);
        return verifyCallResult(success, returndata, errorMessage);
    }

    /**
     * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],
     * but performing a static call.
     *
     * _Available since v3.3._
     */
    function functionStaticCall(address target, bytes memory data) internal view returns (bytes memory) {
        return functionStaticCall(target, data, "Address: low-level static call failed");
    }

    /**
     * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`],
     * but performing a static call.
     *
     * _Available since v3.3._
     */
    function functionStaticCall(
        address target,
        bytes memory data,
        string memory errorMessage
    ) internal view returns (bytes memory) {
        require(isContract(target), "Address: static call to non-contract");

        (bool success, bytes memory returndata) = target.staticcall(data);
        return verifyCallResult(success, returndata, errorMessage);
    }

    /**
     * @dev Tool to verifies that a low level call was successful, and revert if it wasn't, either by bubbling the
     * revert reason using the provided one.
     *
     * _Available since v4.3._
     */
    function verifyCallResult(
        bool success,
        bytes memory returndata,
        string memory errorMessage
    ) internal pure returns (bytes memory) {
        if (success) {
            return returndata;
        } else {
            // Look for revert reason and bubble it up if present
            if (returndata.length > 0) {
                // The easiest way to bubble the revert reason is using memory via assembly

                assembly {
                    let returndata_size := mload(returndata)
                    revert(add(32, returndata), returndata_size)
                }
            } else {
                revert(errorMessage);
            }
        }
    }
}

// File: @openzeppelin/contracts-upgradeable/proxy/utils/Initializable.sol


// OpenZeppelin Contracts (last updated v4.5.0) (proxy/utils/Initializable.sol)

pragma solidity ^0.8.0;


/**
 * @dev This is a base contract to aid in writing upgradeable contracts, or any kind of contract that will be deployed
 * behind a proxy. Since proxied contracts do not make use of a constructor, it's common to move constructor logic to an
 * external initializer function, usually called `initialize`. It then becomes necessary to protect this initializer
 * function so it can only be called once. The {initializer} modifier provided by this contract will have this effect.
 *
 * TIP: To avoid leaving the proxy in an uninitialized state, the initializer function should be called as early as
 * possible by providing the encoded function call as the `_data` argument to {ERC1967Proxy-constructor}.
 *
 * CAUTION: When used with inheritance, manual care must be taken to not invoke a parent initializer twice, or to ensure
 * that all initializers are idempotent. This is not verified automatically as constructors are by Solidity.
 *
 * [CAUTION]
 * ====
 * Avoid leaving a contract uninitialized.
 *
 * An uninitialized contract can be taken over by an attacker. This applies to both a proxy and its implementation
 * contract, which may impact the proxy. To initialize the implementation contract, you can either invoke the
 * initializer manually, or you can include a constructor to automatically mark it as initialized when it is deployed:
 *
 * [.hljs-theme-light.nopadding]
 * ```
 * /// @custom:oz-upgrades-unsafe-allow constructor
 * constructor() initializer {}
 * ```
 * ====
 */
abstract contract Initializable {
    /**
     * @dev Indicates that the contract has been initialized.
     */
    bool private _initialized;

    /**
     * @dev Indicates that the contract is in the process of being initialized.
     */
    bool private _initializing;

    /**
     * @dev Modifier to protect an initializer function from being invoked twice.
     */
    modifier initializer() {
        // If the contract is initializing we ignore whether _initialized is set in order to support multiple
        // inheritance patterns, but we only do this in the context of a constructor, because in other contexts the
        // contract may have been reentered.
        require(_initializing ? _isConstructor() : !_initialized, "Initializable: contract is already initialized");

        bool isTopLevelCall = !_initializing;
        if (isTopLevelCall) {
            _initializing = true;
            _initialized = true;
        }

        _;

        if (isTopLevelCall) {
            _initializing = false;
        }
    }

    /**
     * @dev Modifier to protect an initialization function so that it can only be invoked by functions with the
     * {initializer} modifier, directly or indirectly.
     */
    modifier onlyInitializing() {
        require(_initializing, "Initializable: contract is not initializing");
        _;
    }

    function _isConstructor() private view returns (bool) {
        return !AddressUpgradeable.isContract(address(this));
    }
}

// File: @openzeppelin/contracts-upgradeable/utils/ContextUpgradeable.sol


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

pragma solidity ^0.8.0;


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

    function __Context_init_unchained() internal onlyInitializing {
    }
    function _msgSender() internal view virtual returns (address) {
        return msg.sender;
    }

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

    /**
     * @dev This empty reserved space is put in place to allow future versions to add new
     * variables without shifting down storage in the inheritance chain.
     * See https://docs.openzeppelin.com/contracts/4.x/upgradeable#storage_gaps
     */
    uint256[50] private __gap;
}

// File: @openzeppelin/contracts-upgradeable/access/OwnableUpgradeable.sol


// OpenZeppelin Contracts v4.4.1 (access/Ownable.sol)

pragma solidity ^0.8.0;



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

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

    /**
     * @dev Initializes the contract setting the deployer as the initial owner.
     */
    function __Ownable_init() internal onlyInitializing {
        __Ownable_init_unchained();
    }

    function __Ownable_init_unchained() internal onlyInitializing {
        _transferOwnership(_msgSender());
    }

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

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

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

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

    /**
     * @dev Transfers ownership of the contract to a new account (`newOwner`).
     * Internal function without access restriction.
     */
    function _transferOwnership(address newOwner) internal virtual {
        address oldOwner = _owner;
        _owner = newOwner;
        emit OwnershipTransferred(oldOwner, newOwner);
    }

    /**
     * @dev This empty reserved space is put in place to allow future versions to add new
     * variables without shifting down storage in the inheritance chain.
     * See https://docs.openzeppelin.com/contracts/4.x/upgradeable#storage_gaps
     */
    uint256[49] private __gap;
}

// File: @openzeppelin/contracts-upgradeable/token/ERC20/IERC20Upgradeable.sol


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

pragma solidity ^0.8.0;

/**
 * @dev Interface of the ERC20 standard as defined in the EIP.
 */
interface IERC20Upgradeable {
    /**
     * @dev Returns the amount of tokens in existence.
     */
    function totalSupply() external view returns (uint256);

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

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

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

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

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

    /**
     * @dev Emitted when `value` tokens are moved from one account (`from`) to
     * another (`to`).
     *
     * Note that `value` may be zero.
     */
    event Transfer(address indexed from, address indexed to, uint256 value);

    /**
     * @dev Emitted when the allowance of a `spender` for an `owner` is set by
     * a call to {approve}. `value` is the new allowance.
     */
    event Approval(address indexed owner, address indexed spender, uint256 value);
}

// File: random.sol





/**
 * @dev String operations.
 */
library Strings {
    bytes16 private constant _HEX_SYMBOLS = "0123456789abcdef";

    /**
     * @dev Converts a `uint256` to its ASCII `string` decimal representation.
     */
    function toString(uint256 value) internal pure returns (string memory) {
        // Inspired by OraclizeAPI's implementation - MIT licence
        // https://github.com/oraclize/ethereum-api/blob/b42146b063c7d6ee1358846c198246239e9360e8/oraclizeAPI_0.4.25.sol

        if (value == 0) {
            return "0";
        }
        uint256 temp = value;
        uint256 digits;
        while (temp != 0) {
            digits++;
            temp /= 10;
        }
        bytes memory buffer = new bytes(digits);
        while (value != 0) {
            digits -= 1;
            buffer[digits] = bytes1(uint8(48 + uint256(value % 10)));
            value /= 10;
        }
        return string(buffer);
    }

    /**
     * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation.
     */
    function toHexString(uint256 value) internal pure returns (string memory) {
        if (value == 0) {
            return "0x00";
        }
        uint256 temp = value;
        uint256 length = 0;
        while (temp != 0) {
            length++;
            temp >>= 8;
        }
        return toHexString(value, length);
    }

    /**
     * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation with fixed length.
     */
    function toHexString(uint256 value, uint256 length) internal pure returns (string memory) {
        bytes memory buffer = new bytes(2 * length + 2);
        buffer[0] = "0";
        buffer[1] = "x";
        for (uint256 i = 2 * length + 1; i > 1; --i) {
            buffer[i] = _HEX_SYMBOLS[value & 0xf];
            value >>= 4;
        }
        require(value == 0, "Strings: hex length insufficient");
        return string(buffer);
    }
}

// File: @openzeppelin/contracts/utils/cryptography/ECDSA.sol





/**
 * @dev Elliptic Curve Digital Signature Algorithm (ECDSA) operations.
 *
 * These functions can be used to verify that a message was signed by the holder
 * of the private keys of a given address.
 */
library ECDSA {
    enum RecoverError {
        NoError,
        InvalidSignature,
        InvalidSignatureLength,
        InvalidSignatureS,
        InvalidSignatureV
    }

    function _throwError(RecoverError error) private pure {
        if (error == RecoverError.NoError) {
            return; // no error: do nothing
        } else if (error == RecoverError.InvalidSignature) {
            revert("ECDSA: invalid signature");
        } else if (error == RecoverError.InvalidSignatureLength) {
            revert("ECDSA: invalid signature length");
        } else if (error == RecoverError.InvalidSignatureS) {
            revert("ECDSA: invalid signature 's' value");
        } else if (error == RecoverError.InvalidSignatureV) {
            revert("ECDSA: invalid signature 'v' value");
        }
    }

    /**
     * @dev Returns the address that signed a hashed message (`hash`) with
     * `signature` or error string. This address can then be used for verification purposes.
     *
     * The `ecrecover` EVM opcode allows for malleable (non-unique) signatures:
     * this function rejects them by requiring the `s` value to be in the lower
     * half order, and the `v` value to be either 27 or 28.
     *
     * IMPORTANT: `hash` _must_ be the result of a hash operation for the
     * verification to be secure: it is possible to craft signatures that
     * recover to arbitrary addresses for non-hashed data. A safe way to ensure
     * this is by receiving a hash of the original message (which may otherwise
     * be too long), and then calling {toEthSignedMessageHash} on it.
     *
     * Documentation for signature generation:
     * - with https://web3js.readthedocs.io/en/v1.3.4/web3-eth-accounts.html#sign[Web3.js]
     * - with https://docs.ethers.io/v5/api/signer/#Signer-signMessage[ethers]
     *
     * _Available since v4.3._
     */
    function tryRecover(bytes32 hash, bytes memory signature) internal pure returns (address, RecoverError) {
        // Check the signature length
        // - case 65: r,s,v signature (standard)
        // - case 64: r,vs signature (cf https://eips.ethereum.org/EIPS/eip-2098) _Available since v4.1._
        if (signature.length == 65) {
            bytes32 r;
            bytes32 s;
            uint8 v;
            // ecrecover takes the signature parameters, and the only way to get them
            // currently is to use assembly.
            assembly {
                r := mload(add(signature, 0x20))
                s := mload(add(signature, 0x40))
                v := byte(0, mload(add(signature, 0x60)))
            }
            return tryRecover(hash, v, r, s);
        } else if (signature.length == 64) {
            bytes32 r;
            bytes32 vs;
            // ecrecover takes the signature parameters, and the only way to get them
            // currently is to use assembly.
            assembly {
                r := mload(add(signature, 0x20))
                vs := mload(add(signature, 0x40))
            }
            return tryRecover(hash, r, vs);
        } else {
            return (address(0), RecoverError.InvalidSignatureLength);
        }
    }

    /**
     * @dev Returns the address that signed a hashed message (`hash`) with
     * `signature`. This address can then be used for verification purposes.
     *
     * The `ecrecover` EVM opcode allows for malleable (non-unique) signatures:
     * this function rejects them by requiring the `s` value to be in the lower
     * half order, and the `v` value to be either 27 or 28.
     *
     * IMPORTANT: `hash` _must_ be the result of a hash operation for the
     * verification to be secure: it is possible to craft signatures that
     * recover to arbitrary addresses for non-hashed data. A safe way to ensure
     * this is by receiving a hash of the original message (which may otherwise
     * be too long), and then calling {toEthSignedMessageHash} on it.
     */
    function recover(bytes32 hash, bytes memory signature) internal pure returns (address) {
        (address recovered, RecoverError error) = tryRecover(hash, signature);
        _throwError(error);
        return recovered;
    }

    /**
     * @dev Overload of {ECDSA-tryRecover} that receives the `r` and `vs` short-signature fields separately.
     *
     * See https://eips.ethereum.org/EIPS/eip-2098[EIP-2098 short signatures]
     *
     * _Available since v4.3._
     */
    function tryRecover(
        bytes32 hash,
        bytes32 r,
        bytes32 vs
    ) internal pure returns (address, RecoverError) {
        bytes32 s = vs & bytes32(0x7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff);
        uint8 v = uint8((uint256(vs) >> 255) + 27);
        return tryRecover(hash, v, r, s);
    }

    /**
     * @dev Overload of {ECDSA-recover} that receives the `r and `vs` short-signature fields separately.
     *
     * _Available since v4.2._
     */
    function recover(
        bytes32 hash,
        bytes32 r,
        bytes32 vs
    ) internal pure returns (address) {
        (address recovered, RecoverError error) = tryRecover(hash, r, vs);
        _throwError(error);
        return recovered;
    }

    /**
     * @dev Overload of {ECDSA-tryRecover} that receives the `v`,
     * `r` and `s` signature fields separately.
     *
     * _Available since v4.3._
     */
    function tryRecover(
        bytes32 hash,
        uint8 v,
        bytes32 r,
        bytes32 s
    ) internal pure returns (address, RecoverError) {
        // EIP-2 still allows signature malleability for ecrecover(). Remove this possibility and make the signature
        // unique. Appendix F in the Ethereum Yellow paper (https://ethereum.github.io/yellowpaper/paper.pdf), defines
        // the valid range for s in (301): 0 < s < secp256k1n ÷ 2 + 1, and for v in (302): v ∈ {27, 28}. Most
        // signatures from current libraries generate a unique signature with an s-value in the lower half order.
        //
        // If your library generates malleable signatures, such as s-values in the upper range, calculate a new s-value
        // with 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEBAAEDCE6AF48A03BBFD25E8CD0364141 - s1 and flip v from 27 to 28 or
        // vice versa. If your library also generates signatures with 0/1 for v instead 27/28, add 27 to v to accept
        // these malleable signatures as well.
        if (uint256(s) > 0x7FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5D576E7357A4501DDFE92F46681B20A0) {
            return (address(0), RecoverError.InvalidSignatureS);
        }
        if (v != 27 && v != 28) {
            return (address(0), RecoverError.InvalidSignatureV);
        }

        // If the signature is valid (and not malleable), return the signer address
        address signer = ecrecover(hash, v, r, s);
        if (signer == address(0)) {
            return (address(0), RecoverError.InvalidSignature);
        }

        return (signer, RecoverError.NoError);
    }

    /**
     * @dev Overload of {ECDSA-recover} that receives the `v`,
     * `r` and `s` signature fields separately.
     */
    function recover(
        bytes32 hash,
        uint8 v,
        bytes32 r,
        bytes32 s
    ) internal pure returns (address) {
        (address recovered, RecoverError error) = tryRecover(hash, v, r, s);
        _throwError(error);
        return recovered;
    }

    /**
     * @dev Returns an Ethereum Signed Message, created from a `hash`. This
     * produces hash corresponding to the one signed with the
     * https://eth.wiki/json-rpc/API#eth_sign[`eth_sign`]
     * JSON-RPC method as part of EIP-191.
     *
     * See {recover}.
     */
    function toEthSignedMessageHash(bytes32 hash) internal pure returns (bytes32) {
        // 32 is the length in bytes of hash,
        // enforced by the type signature above
        return keccak256(abi.encodePacked("\x19Ethereum Signed Message:\n32", hash));
    }

    /**
     * @dev Returns an Ethereum Signed Message, created from `s`. This
     * produces hash corresponding to the one signed with the
     * https://eth.wiki/json-rpc/API#eth_sign[`eth_sign`]
     * JSON-RPC method as part of EIP-191.
     *
     * See {recover}.
     */
    function toEthSignedMessageHash(bytes memory s) internal pure returns (bytes32) {
        return keccak256(abi.encodePacked("\x19Ethereum Signed Message:\n", Strings.toString(s.length), s));
    }

    /**
     * @dev Returns an Ethereum Signed Typed Data, created from a
     * `domainSeparator` and a `structHash`. This produces hash corresponding
     * to the one signed with the
     * https://eips.ethereum.org/EIPS/eip-712[`eth_signTypedData`]
     * JSON-RPC method as part of EIP-712.
     *
     * See {recover}.
     */
    function toTypedDataHash(bytes32 domainSeparator, bytes32 structHash) internal pure returns (bytes32) {
        return keccak256(abi.encodePacked("\x19\x01", domainSeparator, structHash));
    }
}

// File: @openzeppelin/contracts/utils/cryptography/draft-EIP712.sol


// OpenZeppelin Contracts v4.4.1 (utils/cryptography/draft-EIP712.sol)



/**
 * @dev https://eips.ethereum.org/EIPS/eip-712[EIP 712] is a standard for hashing and signing of typed structured data.
 *
 * The encoding specified in the EIP is very generic, and such a generic implementation in Solidity is not feasible,
 * thus this contract does not implement the encoding itself. Protocols need to implement the type-specific encoding
 * they need in their contracts using a combination of `abi.encode` and `keccak256`.
 *
 * This contract implements the EIP 712 domain separator ({_domainSeparatorV4}) that is used as part of the encoding
 * scheme, and the final step of the encoding to obtain the message digest that is then signed via ECDSA
 * ({_hashTypedDataV4}).
 *
 * The implementation of the domain separator was designed to be as efficient as possible while still properly updating
 * the chain id to protect against replay attacks on an eventual fork of the chain.
 *
 * NOTE: This contract implements the version of the encoding known as "v4", as implemented by the JSON RPC method
 * https://docs.metamask.io/guide/signing-data.html[`eth_signTypedDataV4` in MetaMask].
 *
 * _Available since v3.4._
 */
abstract contract EIP712 {
    /* solhint-disable var-name-mixedcase */
    // Cache the domain separator as an immutable value, but also store the chain id that it corresponds to, in order to
    // invalidate the cached domain separator if the chain id changes.
    bytes32 private immutable _CACHED_DOMAIN_SEPARATOR;
    uint256 private immutable _CACHED_CHAIN_ID;
    address private immutable _CACHED_THIS;

    bytes32 private immutable _HASHED_NAME;
    bytes32 private immutable _HASHED_VERSION;
    bytes32 private immutable _TYPE_HASH;

    /* solhint-enable var-name-mixedcase */

    /**
     * @dev Initializes the domain separator and parameter caches.
     *
     * The meaning of `name` and `version` is specified in
     * https://eips.ethereum.org/EIPS/eip-712#definition-of-domainseparator[EIP 712]:
     *
     * - `name`: the user readable name of the signing domain, i.e. the name of the DApp or the protocol.
     * - `version`: the current major version of the signing domain.
     *
     * NOTE: These parameters cannot be changed except through a xref:learn::upgrading-smart-contracts.adoc[smart
     * contract upgrade].
     */
    constructor(string memory name, string memory version) {
        bytes32 hashedName = keccak256(bytes(name));
        bytes32 hashedVersion = keccak256(bytes(version));
        bytes32 typeHash = keccak256(
            "EIP712Domain(string name,string version,uint256 chainId,address verifyingContract)"
        );
        _HASHED_NAME = hashedName;
        _HASHED_VERSION = hashedVersion;
        _CACHED_CHAIN_ID = block.chainid;
        _CACHED_DOMAIN_SEPARATOR = _buildDomainSeparator(typeHash, hashedName, hashedVersion);
        _CACHED_THIS = address(this);
        _TYPE_HASH = typeHash;
    }

    /**
     * @dev Returns the domain separator for the current chain.
     */
    function _domainSeparatorV4() internal view returns (bytes32) {
        if (address(this) == _CACHED_THIS && block.chainid == _CACHED_CHAIN_ID) {
            return _CACHED_DOMAIN_SEPARATOR;
        } else {
            return _buildDomainSeparator(_TYPE_HASH, _HASHED_NAME, _HASHED_VERSION);
        }
    }

    function _buildDomainSeparator(
        bytes32 typeHash,
        bytes32 nameHash,
        bytes32 versionHash
    ) private view returns (bytes32) {
        return keccak256(abi.encode(typeHash, nameHash, versionHash, block.chainid, address(this)));
    }

    /**
     * @dev Given an already https://eips.ethereum.org/EIPS/eip-712#definition-of-hashstruct[hashed struct], this
     * function returns the hash of the fully encoded EIP712 message for this domain.
     *
     * This hash can be used together with {ECDSA-recover} to obtain the signer of a message. For example:
     *
     * ```solidity
     * bytes32 digest = _hashTypedDataV4(keccak256(abi.encode(
     *     keccak256("Mail(address to,string contents)"),
     *     mailTo,
     *     keccak256(bytes(mailContents))
     * )));
     * address signer = ECDSA.recover(digest, signature);
     * ```
     */
    function _hashTypedDataV4(bytes32 structHash) internal view virtual returns (bytes32) {
        return ECDSA.toTypedDataHash(_domainSeparatorV4(), structHash);
    }
}






contract whitelistChecker is EIP712 {

    string private constant SIGNING_DOMAIN = "Azo_Staking";
    string private constant SIGNATURE_VERSION = "1";

     struct Whitelist {
        address userAddress;
        address contractAddress;
        uint256 amount;
        uint256 id;
        uint256 noOfDays ;
        uint256 timestamp;
        bytes signature;
    }
    constructor() EIP712(SIGNING_DOMAIN, SIGNATURE_VERSION){

    }

    function getSigner(Whitelist memory whitelist) public view returns(address){
        return _verify(whitelist);
    }

    /// @notice Returns a hash of the given whitelist, prepared using EIP712 typed data hashing rules.

function _hash(Whitelist memory whitelist) internal view returns (bytes32) {
        return _hashTypedDataV4(keccak256(abi.encode(
                keccak256("Whitelist(address userAddress,address contractAddress,uint256 amount,uint256 id,uint256 noOfDays,uint256 timestamp)"),
                whitelist.userAddress,
                whitelist.contractAddress,
                whitelist.amount,
                whitelist.id,
                whitelist.noOfDays,
                whitelist.timestamp
            )));
    }
    function _verify(Whitelist memory whitelist) internal view returns (address) {
        bytes32 digest = _hash(whitelist);
        return ECDSA.recover(digest, whitelist.signature);
    }

}



contract doxaStake is OwnableUpgradeable,whitelistChecker{

    IERC20Upgradeable public stakeToken;
    IERC20Upgradeable public rewardToken;

    uint256 private _totalSupply;
    address public signer;
    uint256 public givenRewards;

    uint256 public totalRewardFunds;
    uint256 public rewardBalance = totalRewardFunds;

    uint day = 60;
    uint accuracyFactor = 10 ** 10;

    mapping(address => uint256) public totalStakeRecords;
    mapping(address => mapping (uint => bool)) private usedNonce;
    mapping(address => stakerDetails[]) public Stakers;
    mapping(address=>bool) public isBlocklisted;
       modifier isblocklist(address _addr){
        require(!isBlocklisted[_addr],"wallet is blocklisted");
        _;
    }

      struct stakerDetails {
        uint id;
        uint balance;
        uint totalRewards;
        uint lockingPeriod;
        uint lastUpdatedTime;
        uint maxTime;
        uint rewardEarned;
        uint rewardPaidOut;
        uint apr;
    }

    event RewardAdded(uint256 reward);
    event Staked(address indexed user, uint256 amount, uint256 noOfDays);
    event Unstaked(address indexed user, uint256 amount);
    event RewardPaid(address indexed user, uint256 reward);
    event RecoverToken(address indexed token, uint256 indexed amount);
    modifier updateReward(address account, uint id) {
        Stakers[account][id].rewardEarned = earned(account, id);
        _;
    }

    function getRewardRate(address account, uint id) public view returns (uint256) {
        uint daysInTimestamp = Stakers[account][id].lockingPeriod * day;

        uint amount = getAmountWithApr(account, id);

        return (amount*(Stakers[account][id].lockingPeriod))/(daysInTimestamp*(365));
    }

    function getAmountWithApr(address account, uint id) internal view returns(uint) {
        return ((Stakers[account][id].balance) * (Stakers[account][id].apr))/(100 *accuracyFactor);
    }

    function earned(address account, uint id) public view returns (uint256) {
        if(Stakers[account][id].rewardPaidOut < Stakers[account][id].totalRewards) {
            if(block.timestamp >= Stakers[account][id].maxTime) {
              return (Stakers[account][id].totalRewards)-(Stakers[account][id].rewardPaidOut);
            }

            return
               (getRewardRate(account, id)) * ((block.timestamp)-(Stakers[account][id].lastUpdatedTime));
        } else {
            return 0;
        } 
    }

    function isRewardAvailable(uint rewardAmount) public view returns (bool) {
        if(rewardBalance >= rewardAmount) {
            return true;
        }
        return false;
    }

    function getAPR(uint noOfDays) public view returns(uint) {
         require(noOfDays <=365,"Only 1 year");
      return ((noOfDays * (5 * (noOfDays * accuracyFactor)) /(10000)) + (50 * accuracyFactor));
    }

    function rewardForPeriod(uint amount, uint noOfDays) public view returns (uint) {
         require(noOfDays <=365,"Only 1 year");
        uint apr = getAPR(noOfDays);
        uint reward = (amount *apr)/((100) * (accuracyFactor));
        uint totalRewardForPeriod = (reward/365) *(noOfDays);
        require(isRewardAvailable(totalRewardForPeriod), "Not enought reward available");
        return totalRewardForPeriod;
    }

    function stake(uint256 amount, uint noOfDays,  Whitelist memory stakeo) external isblocklist(msg.sender){
        require(noOfDays <=365,"Only 1 year");
        require(!usedNonce[msg.sender][stakeo.timestamp],"Nonce : Invalid Nonce");
        require (getSigner(stakeo) == signer,'!Signer');
        usedNonce[msg.sender][stakeo.timestamp] = true;
        require(amount > 0, "Cannot stake 0");
        stakerDetails memory staker;

        uint daysInTimestamp = noOfDays * day;

        uint rewardForUser = rewardForPeriod(amount, noOfDays);
        totalStakeRecords[msg.sender] += 1;
        staker.id = totalStakeRecords[msg.sender];
        staker.lockingPeriod = noOfDays;
        staker.totalRewards = rewardForUser;
        staker.lastUpdatedTime = block.timestamp;
        staker.maxTime = block.timestamp + (daysInTimestamp);
        staker.balance = amount;
        staker.apr = getAPR(noOfDays);

        Stakers[msg.sender].push(staker);
        rewardBalance -= rewardForUser;
        _totalSupply +=amount;
        stakeToken.transferFrom(msg.sender, address(this), amount);
        emit Staked(msg.sender, amount, noOfDays);
    }

    function unstake(uint id, Whitelist memory stakeo) internal {
        require(!usedNonce[msg.sender][stakeo.timestamp],"Nonce : Invalid Nonce");
        require (getSigner(stakeo) == signer,'!Signer');
        usedNonce[msg.sender][stakeo.timestamp] = true;
        require(block.timestamp >= Stakers[msg.sender][id].maxTime, "Tokens are locked! Try unstaking after locking period");
        uint amount = Stakers[msg.sender][id].balance;
        _totalSupply -=amount;
        Stakers[msg.sender][id].balance = 0;
        stakeToken.transfer(msg.sender, amount);
        emit Unstaked(msg.sender, amount);
    }


    function getReward(uint id,Whitelist memory stakeo) external  updateReward(msg.sender, id) isblocklist(msg.sender){
        require(!usedNonce[msg.sender][stakeo.timestamp],"Nonce : Invalid Nonce");
        require (getSigner(stakeo) == signer,'!Signer');
        usedNonce[msg.sender][stakeo.timestamp] = true;
        uint256 reward = earned(msg.sender, id);
        require(reward>0,"no Rewards Available");
        Stakers[msg.sender][id].lastUpdatedTime = block.timestamp;
        if (reward > 0) {
            Stakers[msg.sender][id].rewardEarned = 0;
            Stakers[msg.sender][id].rewardPaidOut += reward;
            givenRewards+=reward;
            rewardToken.transfer(msg.sender, reward);
            emit RewardPaid(msg.sender, reward);
        }
    }

     function exit(uint id,Whitelist memory stakeo) external isblocklist(msg.sender){
        require(!usedNonce[msg.sender][stakeo.timestamp],"Nonce : Invalid Nonce");
        require (getSigner(stakeo) == signer,'!Signer');
        usedNonce[msg.sender][stakeo.timestamp] = true;
        require(block.timestamp >= Stakers[msg.sender][id].maxTime, "Tokens are locked! Try unstaking after locking period");
         uint amount = Stakers[msg.sender][id].balance;
        require(amount>0,"No staked Balance");
        uint256 reward = earned(msg.sender, id);
        Stakers[msg.sender][id].lastUpdatedTime = block.timestamp;
        if (reward > 0) {
            Stakers[msg.sender][id].rewardEarned = 0;
            givenRewards+=reward;
            Stakers[msg.sender][id].rewardPaidOut += reward;
            rewardToken.transfer(msg.sender, reward);
            emit RewardPaid(msg.sender, reward);
        }
         _totalSupply -=amount;
        Stakers[msg.sender][id].balance = 0;
        stakeToken.transfer(msg.sender, amount);
          emit Unstaked(msg.sender, amount);
    }


    function TotalValueLocked() public view returns (uint256) {
        return _totalSupply;
    }

    function setsigner(address _addr) external onlyOwner{
        signer=_addr;
    }

    function balanceOf(address account, uint id) public view returns (uint256) {
        return Stakers[account][id].balance;
    }

    function recoverExcessToken(address token, uint256 amount) external onlyOwner {
        IERC20Upgradeable(token).transfer(msg.sender, amount);
        emit RecoverToken(token, amount);
    }

    function depositRewards(uint amount) public onlyOwner {
        stakeToken.transferFrom(msg.sender, address(this), amount);
        totalRewardFunds += amount;
        rewardBalance += amount;
    }
    function TotalRewards() public view returns(uint256){
        uint256 tRewards = totalRewardFunds - rewardBalance;
        return tRewards;
    }
    
    function blocklistUsers(address _addr) external onlyOwner{
        isBlocklisted[_addr]=true;
    }
    function unblockUsers(address _addr) external onlyOwner{
         isBlocklisted[_addr]=false;
    }
	function initialize(address _stakeToken, address _RewardToken) external initializer{
          stakeToken=IERC20Upgradeable(_stakeToken);
		  rewardToken=IERC20Upgradeable(_RewardToken);
		      __Ownable_init();
	       signer=msg.sender;
	}
	function setTokens(address _addr) external onlyOwner{
		 stakeToken=IERC20Upgradeable(_addr);
		 rewardToken=IERC20Upgradeable(_addr);
	}

}

Contract ABI

[{"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":"token","type":"address"},{"indexed":true,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"RecoverToken","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"reward","type":"uint256"}],"name":"RewardAdded","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"user","type":"address"},{"indexed":false,"internalType":"uint256","name":"reward","type":"uint256"}],"name":"RewardPaid","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"user","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"noOfDays","type":"uint256"}],"name":"Staked","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"user","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"Unstaked","type":"event"},{"inputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"uint256","name":"","type":"uint256"}],"name":"Stakers","outputs":[{"internalType":"uint256","name":"id","type":"uint256"},{"internalType":"uint256","name":"balance","type":"uint256"},{"internalType":"uint256","name":"totalRewards","type":"uint256"},{"internalType":"uint256","name":"lockingPeriod","type":"uint256"},{"internalType":"uint256","name":"lastUpdatedTime","type":"uint256"},{"internalType":"uint256","name":"maxTime","type":"uint256"},{"internalType":"uint256","name":"rewardEarned","type":"uint256"},{"internalType":"uint256","name":"rewardPaidOut","type":"uint256"},{"internalType":"uint256","name":"apr","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"TotalRewards","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"TotalValueLocked","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"uint256","name":"id","type":"uint256"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_addr","type":"address"}],"name":"blocklistUsers","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"depositRewards","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"uint256","name":"id","type":"uint256"}],"name":"earned","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"id","type":"uint256"},{"components":[{"internalType":"address","name":"userAddress","type":"address"},{"internalType":"address","name":"contractAddress","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"uint256","name":"id","type":"uint256"},{"internalType":"uint256","name":"noOfDays","type":"uint256"},{"internalType":"uint256","name":"timestamp","type":"uint256"},{"internalType":"bytes","name":"signature","type":"bytes"}],"internalType":"struct whitelistChecker.Whitelist","name":"stakeo","type":"tuple"}],"name":"exit","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"noOfDays","type":"uint256"}],"name":"getAPR","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"id","type":"uint256"},{"components":[{"internalType":"address","name":"userAddress","type":"address"},{"internalType":"address","name":"contractAddress","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"uint256","name":"id","type":"uint256"},{"internalType":"uint256","name":"noOfDays","type":"uint256"},{"internalType":"uint256","name":"timestamp","type":"uint256"},{"internalType":"bytes","name":"signature","type":"bytes"}],"internalType":"struct whitelistChecker.Whitelist","name":"stakeo","type":"tuple"}],"name":"getReward","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"uint256","name":"id","type":"uint256"}],"name":"getRewardRate","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"components":[{"internalType":"address","name":"userAddress","type":"address"},{"internalType":"address","name":"contractAddress","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"uint256","name":"id","type":"uint256"},{"internalType":"uint256","name":"noOfDays","type":"uint256"},{"internalType":"uint256","name":"timestamp","type":"uint256"},{"internalType":"bytes","name":"signature","type":"bytes"}],"internalType":"struct whitelistChecker.Whitelist","name":"whitelist","type":"tuple"}],"name":"getSigner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"givenRewards","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_stakeToken","type":"address"},{"internalType":"address","name":"_RewardToken","type":"address"}],"name":"initialize","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"isBlocklisted","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"rewardAmount","type":"uint256"}],"name":"isRewardAvailable","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"token","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"recoverExcessToken","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"rewardBalance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"uint256","name":"noOfDays","type":"uint256"}],"name":"rewardForPeriod","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"rewardToken","outputs":[{"internalType":"contract IERC20Upgradeable","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_addr","type":"address"}],"name":"setTokens","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_addr","type":"address"}],"name":"setsigner","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"signer","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"uint256","name":"noOfDays","type":"uint256"},{"components":[{"internalType":"address","name":"userAddress","type":"address"},{"internalType":"address","name":"contractAddress","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"uint256","name":"id","type":"uint256"},{"internalType":"uint256","name":"noOfDays","type":"uint256"},{"internalType":"uint256","name":"timestamp","type":"uint256"},{"internalType":"bytes","name":"signature","type":"bytes"}],"internalType":"struct whitelistChecker.Whitelist","name":"stakeo","type":"tuple"}],"name":"stake","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"stakeToken","outputs":[{"internalType":"contract IERC20Upgradeable","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalRewardFunds","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"totalStakeRecords","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_addr","type":"address"}],"name":"unblockUsers","outputs":[],"stateMutability":"nonpayable","type":"function"}]

610140604052606a54606b55603c606c556402540be400606d5534801561002557600080fd5b50604080518082018252600b81526a417a6f5f5374616b696e6760a81b6020808301918252835180850190945260018452603160f81b908401528151902060e08190527fc89efdaa54c0f20c7adf612882df0950f5a951637e0307cdcb4c672f298b8bc66101008190524660a0529192917f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f6101068184846040805160208101859052908101839052606081018290524660808201523060a082015260009060c0016040516020818303038152906040528051906020012090509392505050565b6080523060c052610120525061011b92505050565b60805160a05160c05160e051610100516101205161254c61016a6000396000611e5a01526000611ea901526000611e8401526000611ddd01526000611e0701526000611e31015261254c6000f3fe608060405234801561001057600080fd5b50600436106101e45760003560e01c80638bdf67f21161010f578063cf78417d116100a2578063f64bef5511610071578063f64bef5514610452578063f7c618c11461045a578063f8cd98861461046d578063ff16d5491461048057600080fd5b8063cf78417d146103cd578063d105cd5d146103e0578063ef9c8e03146103e8578063f2fde38b1461043f57600080fd5b8063a639eb4d116100de578063a639eb4d14610395578063aa5c3ab4146103a8578063aa9700c5146103b1578063c4b6f60f146103c457600080fd5b80638bdf67f21461033b5780638da5cb5b1461034e5780638e204c431461035f5780638e670e3e1461038257600080fd5b8063386429731161018757806351ed6a301161015657806351ed6a30146102dd5780636b34dd67146102f05780636cf2b1b714610310578063715018a61461033357600080fd5b806338642973146102915780633a1eeb0e146102a45780633e491d47146102b7578063485cc955146102ca57600080fd5b806326bda9dc116101c357806326bda9dc1461024d5780632c0bb50c14610262578063320cb1f61461027557806336b7016c1461028857600080fd5b8062fdd58e146101e95780631fc038121461020f578063238ac93314610222575b600080fd5b6101fc6101f7366004612039565b610493565b6040519081526020015b60405180910390f35b6101fc61021d366004612063565b6104d8565b606854610235906001600160a01b031681565b6040516001600160a01b039091168152602001610206565b61026061025b3660046121da565b61054d565b005b6101fc610270366004612039565b6108d0565b61026061028336600461222a565b61099e565b6101fc60695481565b61026061029f366004612271565b610cb0565b6102606102b236600461222a565b610cfc565b6101fc6102c5366004612039565b61116d565b6102606102d836600461228c565b611331565b606554610235906001600160a01b031681565b6101fc6102fe366004612271565b606e6020526000908152604090205481565b61032361031e366004612063565b611436565b6040519015158152602001610206565b610260611451565b610260610349366004612063565b611487565b6033546001600160a01b0316610235565b61032361036d366004612271565b60716020526000908152604090205460ff1681565b6101fc6103903660046122bf565b611560565b6102606103a3366004612271565b611628565b6101fc606b5481565b6102606103bf366004612039565b61167e565b6101fc606a5481565b6102356103db3660046122e1565b611754565b6067546101fc565b6103fb6103f6366004612039565b61175f565b60408051998a5260208a0198909852968801959095526060870193909352608086019190915260a085015260c084015260e083015261010082015261012001610206565b61026061044d366004612271565b6117ca565b6101fc611865565b606654610235906001600160a01b031681565b61026061047b366004612271565b611878565b61026061048e366004612271565b6118c3565b6001600160a01b03821660009081526070602052604081208054839081106104bd576104bd61231e565b90600052602060002090600902016001015490505b92915050565b600061016d8211156105055760405162461bcd60e51b81526004016104fc90612334565b60405180910390fd5b606d5461051390603261236f565b612710606d5484610524919061236f565b61052f90600561236f565b610539908561236f565b610543919061238e565b6104d291906123b0565b3360008181526071602052604090205460ff161561057d5760405162461bcd60e51b81526004016104fc906123c8565b61016d83111561059f5760405162461bcd60e51b81526004016104fc90612334565b336000908152606f6020908152604080832060a0860151845290915290205460ff16156105de5760405162461bcd60e51b81526004016104fc906123f7565b6068546001600160a01b03166105f383611754565b6001600160a01b0316146106195760405162461bcd60e51b81526004016104fc90612426565b336000908152606f6020908152604080832060a086015184529091529020805460ff19166001179055836106805760405162461bcd60e51b815260206004820152600e60248201526d043616e6e6f74207374616b6520360941b60448201526064016104fc565b6106cf6040518061012001604052806000815260200160008152602001600081526020016000815260200160008152602001600081526020016000815260200160008152602001600081525090565b6000606c54856106df919061236f565b905060006106ed8787611560565b336000908152606e6020526040812080549293506001929091906107129084906123b0565b9091555050336000908152606e602052604090819020548452606084018790528301819052426080840181905261074a9083906123b0565b60a08401526020830187905261075f866104d8565b6101008401908152336000908152607060209081526040808320805460018181018355918552838520895160099092020190815592880151908301558601516002820155606086015160038201556080860151600482015560a0860151600582015560c0860151600682015560e086015160078201559151600890920191909155606b80548392906107f2908490612447565b92505081905550866067600082825461080b91906123b0565b90915550506065546040516323b872dd60e01b8152336004820152306024820152604481018990526001600160a01b03909116906323b872dd906064016020604051808303816000875af1158015610867573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061088b919061245e565b50604080518881526020810188905233917f1449c6dd7851abc30abf37f57715f492010519147cc2652fbc38202c18a6ee90910160405180910390a250505050505050565b600080606c5460706000866001600160a01b03166001600160a01b03168152602001908152602001600020848154811061090c5761090c61231e565b906000526020600020906009020160030154610928919061236f565b905060006109368585611911565b90506109448261016d61236f565b6001600160a01b038616600090815260706020526040902080548690811061096e5761096e61231e565b9060005260206000209060090201600301548261098b919061236f565b610995919061238e565b95945050505050565b33826109aa828261116d565b6001600160a01b03831660009081526070602052604090208054839081106109d4576109d461231e565b6000918252602080832060066009909302019190910192909255338082526071909252604090205460ff1615610a1c5760405162461bcd60e51b81526004016104fc906123c8565b336000908152606f6020908152604080832060a0880151845290915290205460ff1615610a5b5760405162461bcd60e51b81526004016104fc906123f7565b6068546001600160a01b0316610a7085611754565b6001600160a01b031614610a965760405162461bcd60e51b81526004016104fc90612426565b336000818152606f6020908152604080832060a089015184529091528120805460ff1916600117905590610aca908761116d565b905060008111610b135760405162461bcd60e51b81526020600482015260146024820152736e6f205265776172647320417661696c61626c6560601b60448201526064016104fc565b336000908152607060205260409020805442919088908110610b3757610b3761231e565b60009182526020909120600460099092020101558015610ca857336000908152607060205260408120805488908110610b7257610b7261231e565b9060005260206000209060090201600601819055508060706000336001600160a01b03166001600160a01b031681526020019081526020016000208781548110610bbe57610bbe61231e565b90600052602060002090600902016007016000828254610bde91906123b0565b925050819055508060696000828254610bf791906123b0565b909155505060665460405163a9059cbb60e01b8152336004820152602481018390526001600160a01b039091169063a9059cbb906044016020604051808303816000875af1158015610c4d573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610c71919061245e565b5060405181815233907fe2403640ba68fed3a2f88b7557551d1993f84b99bb10ff833f0cf8db0c5e04869060200160405180910390a25b505050505050565b6033546001600160a01b03163314610cda5760405162461bcd60e51b81526004016104fc90612480565b606880546001600160a01b0319166001600160a01b0392909216919091179055565b3360008181526071602052604090205460ff1615610d2c5760405162461bcd60e51b81526004016104fc906123c8565b336000908152606f6020908152604080832060a0860151845290915290205460ff1615610d6b5760405162461bcd60e51b81526004016104fc906123f7565b6068546001600160a01b0316610d8083611754565b6001600160a01b031614610da65760405162461bcd60e51b81526004016104fc90612426565b336000818152606f6020908152604080832060a087015184528252808320805460ff191660011790559282526070905220805484908110610de957610de961231e565b906000526020600020906009020160050154421015610e685760405162461bcd60e51b815260206004820152603560248201527f546f6b656e7320617265206c6f636b6564212054727920756e7374616b696e676044820152740818599d195c881b1bd8dada5b99c81c195c9a5bd9605a1b60648201526084016104fc565b336000908152607060205260408120805485908110610e8957610e8961231e565b906000526020600020906009020160010154905060008111610ee15760405162461bcd60e51b81526020600482015260116024820152704e6f207374616b65642042616c616e636560781b60448201526064016104fc565b6000610eed338661116d565b3360009081526070602052604090208054919250429187908110610f1357610f1361231e565b6000918252602090912060046009909202010155801561106f57336000908152607060205260408120805487908110610f4e57610f4e61231e565b9060005260206000209060090201600601819055508060696000828254610f7591906123b0565b9091555050336000908152607060205260409020805482919087908110610f9e57610f9e61231e565b90600052602060002090600902016007016000828254610fbe91906123b0565b909155505060665460405163a9059cbb60e01b8152336004820152602481018390526001600160a01b039091169063a9059cbb906044016020604051808303816000875af1158015611014573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611038919061245e565b5060405181815233907fe2403640ba68fed3a2f88b7557551d1993f84b99bb10ff833f0cf8db0c5e04869060200160405180910390a25b81606760008282546110819190612447565b90915550503360009081526070602052604081208054879081106110a7576110a761231e565b600091825260209091206009909102016001015560655460405163a9059cbb60e01b8152336004820152602481018490526001600160a01b039091169063a9059cbb906044016020604051808303816000875af115801561110c573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611130919061245e565b5060405182815233907f0f5bb82176feb1b5e747e28471aa92156a04d9f3ab9f45f28e2d704232b93f759060200160405180910390a25050505050565b6001600160a01b03821660009081526070602052604081208054839081106111975761119761231e565b90600052602060002090600902016002015460706000856001600160a01b03166001600160a01b0316815260200190815260200160002083815481106111df576111df61231e565b9060005260206000209060090201600701541015611329576001600160a01b03831660009081526070602052604090208054839081106112215761122161231e565b90600052602060002090600902016005015442106112ce576001600160a01b03831660009081526070602052604090208054839081106112635761126361231e565b90600052602060002090600902016007015460706000856001600160a01b03166001600160a01b0316815260200190815260200160002083815481106112ab576112ab61231e565b9060005260206000209060090201600201546112c79190612447565b90506104d2565b6001600160a01b03831660009081526070602052604090208054839081106112f8576112f861231e565b906000526020600020906009020160040154426113159190612447565b61131f84846108d0565b6112c7919061236f565b5060006104d2565b600054610100900460ff1661134c5760005460ff1615611350565b303b155b6113b35760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201526d191e481a5b9a5d1a585b1a5e995960921b60648201526084016104fc565b600054610100900460ff161580156113d5576000805461ffff19166101011790555b606580546001600160a01b038086166001600160a01b031992831617909255606680549285169290911691909117905561140d6119c1565b606880546001600160a01b031916331790558015611431576000805461ff00191690555b505050565b600081606b541061144957506001919050565b506000919050565b6033546001600160a01b0316331461147b5760405162461bcd60e51b81526004016104fc90612480565b61148560006119f0565b565b6033546001600160a01b031633146114b15760405162461bcd60e51b81526004016104fc90612480565b6065546040516323b872dd60e01b8152336004820152306024820152604481018390526001600160a01b03909116906323b872dd906064016020604051808303816000875af1158015611508573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061152c919061245e565b5080606a600082825461153f91906123b0565b9250508190555080606b600082825461155891906123b0565b909155505050565b600061016d8211156115845760405162461bcd60e51b81526004016104fc90612334565b600061158f836104d8565b90506000606d5460646115a2919061236f565b6115ac838761236f565b6115b6919061238e565b90506000846115c761016d8461238e565b6115d1919061236f565b90506115dc81611436565b6109955760405162461bcd60e51b815260206004820152601c60248201527f4e6f7420656e6f756768742072657761726420617661696c61626c650000000060448201526064016104fc565b6033546001600160a01b031633146116525760405162461bcd60e51b81526004016104fc90612480565b606580546001600160a01b039092166001600160a01b0319928316811790915560668054909216179055565b6033546001600160a01b031633146116a85760405162461bcd60e51b81526004016104fc90612480565b60405163a9059cbb60e01b8152336004820152602481018290526001600160a01b0383169063a9059cbb906044016020604051808303816000875af11580156116f5573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611719919061245e565b5060405181906001600160a01b038416907ffba2d3bdfb2d601eb66a89783a2c614856101cadce71556753c2edadd60c831c90600090a35050565b60006104d282611a42565b6070602052816000526040600020818154811061177b57600080fd5b9060005260206000209060090201600091509150508060000154908060010154908060020154908060030154908060040154908060050154908060060154908060070154908060080154905089565b6033546001600160a01b031633146117f45760405162461bcd60e51b81526004016104fc90612480565b6001600160a01b0381166118595760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b60648201526084016104fc565b611862816119f0565b50565b600080606b54606a546104d29190612447565b6033546001600160a01b031633146118a25760405162461bcd60e51b81526004016104fc90612480565b6001600160a01b03166000908152607160205260409020805460ff19169055565b6033546001600160a01b031633146118ed5760405162461bcd60e51b81526004016104fc90612480565b6001600160a01b03166000908152607160205260409020805460ff19166001179055565b6000606d546064611922919061236f565b6001600160a01b038416600090815260706020526040902080548490811061194c5761194c61231e565b90600052602060002090600902016008015460706000866001600160a01b03166001600160a01b0316815260200190815260200160002084815481106119945761199461231e565b9060005260206000209060090201600101546119b0919061236f565b6119ba919061238e565b9392505050565b600054610100900460ff166119e85760405162461bcd60e51b81526004016104fc906124b5565b611485611a5e565b603380546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b600080611a4e83611a8e565b90506119ba818460c00151611b3a565b600054610100900460ff16611a855760405162461bcd60e51b81526004016104fc906124b5565b611485336119f0565b60006104d27fa54965b0f8eee42cd9993c578f57c1d479bec59958b68c5864c283a160fe1ecc836000015184602001518560400151866060015187608001518860a00151604051602001611b1f97969594939291909687526001600160a01b0395861660208801529390941660408601526060850191909152608084015260a083019190915260c082015260e00190565b60405160208183030381529060405280519060200120611b5e565b6000806000611b498585611bac565b91509150611b5681611c1a565b509392505050565b60006104d2611b6b611dd0565b8360405161190160f01b6020820152602281018390526042810182905260009060620160405160208183030381529060405280519060200120905092915050565b6000808251604103611be25760208301516040840151606085015160001a611bd687828585611ef7565b94509450505050611c13565b8251604003611c0b5760208301516040840151611c00868383611fe4565b935093505050611c13565b506000905060025b9250929050565b6000816004811115611c2e57611c2e612500565b03611c365750565b6001816004811115611c4a57611c4a612500565b03611c975760405162461bcd60e51b815260206004820152601860248201527f45434453413a20696e76616c6964207369676e6174757265000000000000000060448201526064016104fc565b6002816004811115611cab57611cab612500565b03611cf85760405162461bcd60e51b815260206004820152601f60248201527f45434453413a20696e76616c6964207369676e6174757265206c656e6774680060448201526064016104fc565b6003816004811115611d0c57611d0c612500565b03611d645760405162461bcd60e51b815260206004820152602260248201527f45434453413a20696e76616c6964207369676e6174757265202773272076616c604482015261756560f01b60648201526084016104fc565b6004816004811115611d7857611d78612500565b036118625760405162461bcd60e51b815260206004820152602260248201527f45434453413a20696e76616c6964207369676e6174757265202776272076616c604482015261756560f01b60648201526084016104fc565b6000306001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016148015611e2957507f000000000000000000000000000000000000000000000000000000000000000046145b15611e5357507f000000000000000000000000000000000000000000000000000000000000000090565b50604080517f00000000000000000000000000000000000000000000000000000000000000006020808301919091527f0000000000000000000000000000000000000000000000000000000000000000828401527f000000000000000000000000000000000000000000000000000000000000000060608301524660808301523060a0808401919091528351808403909101815260c0909201909252805191012090565b6000807f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a0831115611f2e5750600090506003611fdb565b8460ff16601b14158015611f4657508460ff16601c14155b15611f575750600090506004611fdb565b6040805160008082526020820180845289905260ff881692820192909252606081018690526080810185905260019060a0016020604051602081039080840390855afa158015611fab573d6000803e3d6000fd5b5050604051601f1901519150506001600160a01b038116611fd457600060019250925050611fdb565b9150600090505b94509492505050565b6000806001600160ff1b0383168161200160ff86901c601b6123b0565b905061200f87828885611ef7565b935093505050935093915050565b80356001600160a01b038116811461203457600080fd5b919050565b6000806040838503121561204c57600080fd5b6120558361201d565b946020939093013593505050565b60006020828403121561207557600080fd5b5035919050565b634e487b7160e01b600052604160045260246000fd5b60405160e0810167ffffffffffffffff811182821017156120b5576120b561207c565b60405290565b600082601f8301126120cc57600080fd5b813567ffffffffffffffff808211156120e7576120e761207c565b604051601f8301601f19908116603f0116810190828211818310171561210f5761210f61207c565b8160405283815286602085880101111561212857600080fd5b836020870160208301376000602085830101528094505050505092915050565b600060e0828403121561215a57600080fd5b612162612092565b905061216d8261201d565b815261217b6020830161201d565b602082015260408201356040820152606082013560608201526080820135608082015260a082013560a082015260c082013567ffffffffffffffff8111156121c257600080fd5b6121ce848285016120bb565b60c08301525092915050565b6000806000606084860312156121ef57600080fd5b8335925060208401359150604084013567ffffffffffffffff81111561221457600080fd5b61222086828701612148565b9150509250925092565b6000806040838503121561223d57600080fd5b82359150602083013567ffffffffffffffff81111561225b57600080fd5b61226785828601612148565b9150509250929050565b60006020828403121561228357600080fd5b6119ba8261201d565b6000806040838503121561229f57600080fd5b6122a88361201d565b91506122b66020840161201d565b90509250929050565b600080604083850312156122d257600080fd5b50508035926020909101359150565b6000602082840312156122f357600080fd5b813567ffffffffffffffff81111561230a57600080fd5b61231684828501612148565b949350505050565b634e487b7160e01b600052603260045260246000fd5b6020808252600b908201526a27b7363c9018903cb2b0b960a91b604082015260600190565b634e487b7160e01b600052601160045260246000fd5b600081600019048311821515161561238957612389612359565b500290565b6000826123ab57634e487b7160e01b600052601260045260246000fd5b500490565b600082198211156123c3576123c3612359565b500190565b6020808252601590820152741dd85b1b195d081a5cc8189b1bd8dadb1a5cdd1959605a1b604082015260600190565b6020808252601590820152744e6f6e6365203a20496e76616c6964204e6f6e636560581b604082015260600190565b60208082526007908201526610a9b4b3b732b960c91b604082015260600190565b60008282101561245957612459612359565b500390565b60006020828403121561247057600080fd5b815180151581146119ba57600080fd5b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b6020808252602b908201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960408201526a6e697469616c697a696e6760a81b606082015260800190565b634e487b7160e01b600052602160045260246000fdfea2646970667358221220d81bb75007420b4e8580745d64291b152f83c3c43ac0033b141532cc7fc8ae9d64736f6c634300080d0033

Deployed ByteCode Sourcemap

35705:8614:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;43007:129;;;;;;:::i;:::-;;:::i;:::-;;;597:25:1;;;585:2;570:18;43007:129:0;;;;;;;;38429:211;;;;;;:::i;:::-;;:::i;35893:21::-;;;;;-1:-1:-1;;;;;35893:21:0;;;;;;-1:-1:-1;;;;;982:32:1;;;964:51;;952:2;937:18;35893:21:0;818:203:1;39088:1174:0;;;;;;:::i;:::-;;:::i;:::-;;37190:306;;;;;;:::i;:::-;;:::i;40902:785::-;;;;;;:::i;:::-;;:::i;35921:27::-;;;;;;42916:83;;;;;;:::i;:::-;;:::i;41696:1106::-;;;;;;:::i;:::-;;:::i;37701:526::-;;;;;;:::i;:::-;;:::i;43924:247::-;;;;;;:::i;:::-;;:::i;35771:35::-;;;;;-1:-1:-1;;;;;35771:35:0;;;36110:52;;;;;;:::i;:::-;;;;;;;;;;;;;;38235:186;;;;;;:::i;:::-;;:::i;:::-;;;4654:14:1;;4647:22;4629:41;;4617:2;4602:18;38235:186:0;4489:187:1;14193:103:0;;;:::i;43345:202::-;;;;;;:::i;:::-;;:::i;13542:87::-;13615:6;;-1:-1:-1;;;;;13615:6:0;13542:87;;36293:43;;;;;;:::i;:::-;;;;;;;;;;;;;;;;38648:432;;;;;;:::i;:::-;;:::i;44174:140::-;;;;;;:::i;:::-;;:::i;35995:47::-;;;;;;43144:193;;;;;;:::i;:::-;;:::i;35957:31::-;;;;;;34741:119;;;;;;:::i;:::-;;:::i;42812:96::-;42888:12;;42812:96;;36236:50;;;;;;:::i;:::-;;:::i;:::-;;;;5659:25:1;;;5715:2;5700:18;;5693:34;;;;5743:18;;;5736:34;;;;5801:2;5786:18;;5779:34;;;;5844:3;5829:19;;5822:35;;;;5888:3;5873:19;;5866:35;5932:3;5917:19;;5910:35;5976:3;5961:19;;5954:35;6020:3;6005:19;;5998:35;5646:3;5631:19;36236:50:0;5288:751:1;14451:201:0;;;;;;:::i;:::-;;:::i;43553:148::-;;;:::i;35813:36::-;;;;;-1:-1:-1;;;;;35813:36:0;;;43820:101;;;;;;:::i;:::-;;:::i;43713:::-;;;;;;:::i;:::-;;:::i;43007:129::-;-1:-1:-1;;;;;43100:16:0;;43073:7;43100:16;;;:7;:16;;;;;:20;;43117:2;;43100:20;;;;;;:::i;:::-;;;;;;;;;;;:28;;;43093:35;;43007:129;;;;;:::o;38429:211::-;38480:4;38517:3;38506:8;:14;;38498:37;;;;-1:-1:-1;;;38498:37:0;;;;;;;:::i;:::-;;;;;;;;;38616:14;;38611:19;;:2;:19;:::i;:::-;38600:5;38581:14;;38570:8;:25;;;;:::i;:::-;38565:31;;:1;:31;:::i;:::-;38553:44;;:8;:44;:::i;:::-;:53;;;;:::i;:::-;38552:79;;;;:::i;39088:1174::-;39181:10;36401:20;;;;:13;:20;;;;;;;;36400:21;36392:54;;;;-1:-1:-1;;;36392:54:0;;;;;;;:::i;:::-;39222:3:::1;39211:8;:14;;39203:37;;;;-1:-1:-1::0;;;39203:37:0::1;;;;;;;:::i;:::-;39270:10;39260:21;::::0;;;:9:::1;:21;::::0;;;;;;;39282:16:::1;::::0;::::1;::::0;39260:39;;;;;;;;::::1;;39259:40;39251:73;;;;-1:-1:-1::0;;;39251:73:0::1;;;;;;;:::i;:::-;39365:6;::::0;-1:-1:-1;;;;;39365:6:0::1;39344:17;39354:6:::0;39344:9:::1;:17::i;:::-;-1:-1:-1::0;;;;;39344:27:0::1;;39335:47;;;;-1:-1:-1::0;;;39335:47:0::1;;;;;;;:::i;:::-;39403:10;39393:21;::::0;;;:9:::1;:21;::::0;;;;;;;39415:16:::1;::::0;::::1;::::0;39393:39;;;;;;;:46;;-1:-1:-1;;39393:46:0::1;39435:4;39393:46;::::0;;39458:10;39450:37:::1;;;::::0;-1:-1:-1;;;39450:37:0;;8413:2:1;39450:37:0::1;::::0;::::1;8395:21:1::0;8452:2;8432:18;;;8425:30;-1:-1:-1;;;8471:18:1;;;8464:44;8525:18;;39450:37:0::1;8211:338:1::0;39450:37:0::1;39498:27;-1:-1:-1::0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;39498:27:0::1;39538:20;39572:3;;39561:8;:14;;;;:::i;:::-;39538:37;;39588:18;39609:33;39625:6;39633:8;39609:15;:33::i;:::-;39671:10;39653:29;::::0;;;:17:::1;:29;::::0;;;;:34;;39588:54;;-1:-1:-1;39686:1:0::1;::::0;39653:29;;;:34:::1;::::0;39686:1;;39653:34:::1;:::i;:::-;::::0;;;-1:-1:-1;;39728:10:0::1;39710:29;::::0;;;:17:::1;:29;::::0;;;;;;;39698:41;;39750:20:::1;::::0;::::1;:31:::0;;;39792:19;::::1;:35:::0;;;39863:15:::1;39838:22;::::0;::::1;:40:::0;;;39906:35:::1;::::0;39925:15;;39906:35:::1;:::i;:::-;39889:14;::::0;::::1;:52:::0;39952:14:::1;::::0;::::1;:23:::0;;;39999:16:::1;40006:8:::0;39999:6:::1;:16::i;:::-;39986:10;::::0;::::1;:29:::0;;;40036:10:::1;40028:19;::::0;;;:7:::1;:19;::::0;;;;;;;:32;;::::1;::::0;;::::1;::::0;;;;;;;;;;::::1;::::0;;::::1;;::::0;;;;;::::1;::::0;;;::::1;::::0;;::::1;::::0;::::1;::::0;::::1;::::0;::::1;::::0;::::1;::::0;::::1;::::0;::::1;::::0;::::1;::::0;::::1;::::0;::::1;::::0;::::1;::::0;::::1;::::0;::::1;::::0;::::1;::::0;::::1;::::0;::::1;::::0;::::1;::::0;::::1;::::0;::::1;::::0;::::1;::::0;::::1;::::0;::::1;::::0;::::1;::::0;;;::::1;::::0;;::::1;::::0;;;;40071:13:::1;:30:::0;;40088:13;;40028:19;40071:30:::1;::::0;40088:13;;40071:30:::1;:::i;:::-;;;;;;;;40127:6;40112:12;;:21;;;;;;;:::i;:::-;::::0;;;-1:-1:-1;;40144:10:0::1;::::0;:58:::1;::::0;-1:-1:-1;;;40144:58:0;;40168:10:::1;40144:58;::::0;::::1;8924:34:1::0;40188:4:0::1;8974:18:1::0;;;8967:43;9026:18;;;9019:34;;;-1:-1:-1;;;;;40144:10:0;;::::1;::::0;:23:::1;::::0;8859:18:1;;40144:58:0::1;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1::0;40218:36:0::1;::::0;;9520:25:1;;;9576:2;9561:18;;9554:34;;;40225:10:0::1;::::0;40218:36:::1;::::0;9493:18:1;40218:36:0::1;;;;;;;39192:1070;;;39088:1174:::0;;;;:::o;37190:306::-;37260:7;37280:20;37340:3;;37303:7;:16;37311:7;-1:-1:-1;;;;;37303:16:0;-1:-1:-1;;;;;37303:16:0;;;;;;;;;;;;37320:2;37303:20;;;;;;;;:::i;:::-;;;;;;;;;;;:34;;;:40;;;;:::i;:::-;37280:63;;37356:11;37370:29;37387:7;37396:2;37370:16;:29::i;:::-;37356:43;-1:-1:-1;37466:21:0;:15;37483:3;37466:21;:::i;:::-;-1:-1:-1;;;;;37428:16:0;;;;;;:7;:16;;;;;:20;;37445:2;;37428:20;;;;;;:::i;:::-;;;;;;;;;;;:34;;;37420:6;:43;;;;:::i;:::-;37419:69;;;;:::i;:::-;37412:76;37190:306;-1:-1:-1;;;;;37190:306:0:o;40902:785::-;40977:10;40989:2;37143:19;37150:7;37159:2;37143:6;:19::i;:::-;-1:-1:-1;;;;;37107:16:0;;;;;;:7;:16;;;;;:20;;37124:2;;37107:20;;;;;;:::i;:::-;;;;;;;;;:33;:20;;;;;:33;;;;:55;;;;41005:10:::1;36401:20:::0;;;:13:::1;:20:::0;;;;;;;::::1;;36400:21;36392:54;;;;-1:-1:-1::0;;;36392:54:0::1;;;;;;;:::i;:::-;41046:10:::2;41036:21;::::0;;;:9:::2;:21;::::0;;;;;;;41058:16:::2;::::0;::::2;::::0;41036:39;;;;;;;;::::2;;41035:40;41027:73;;;;-1:-1:-1::0;;;41027:73:0::2;;;;;;;:::i;:::-;41141:6;::::0;-1:-1:-1;;;;;41141:6:0::2;41120:17;41130:6:::0;41120:9:::2;:17::i;:::-;-1:-1:-1::0;;;;;41120:27:0::2;;41111:47;;;;-1:-1:-1::0;;;41111:47:0::2;;;;;;;:::i;:::-;41179:10;41169:21;::::0;;;:9:::2;:21;::::0;;;;;;;41191:16:::2;::::0;::::2;::::0;41169:39;;;;;;;:46;;-1:-1:-1;;41169:46:0::2;41211:4;41169:46;::::0;;:21;41243:22:::2;::::0;41262:2;41243:6:::2;:22::i;:::-;41226:39;;41291:1;41284:6;:8;41276:40;;;::::0;-1:-1:-1;;;41276:40:0;;9801:2:1;41276:40:0::2;::::0;::::2;9783:21:1::0;9840:2;9820:18;;;9813:30;-1:-1:-1;;;9859:18:1;;;9852:50;9919:18;;41276:40:0::2;9599:344:1::0;41276:40:0::2;41335:10;41327:19;::::0;;;:7:::2;:19;::::0;;;;:23;;41369:15:::2;::::0;41327:19;41347:2;;41327:23;::::2;;;;;:::i;:::-;;::::0;;;::::2;::::0;;;:39:::2;:23;::::0;;::::2;;:39;:57:::0;41399:10;;41395:285:::2;;41434:10;41465:1;41426:19:::0;;;:7:::2;:19;::::0;;;;:23;;41446:2;;41426:23;::::2;;;;;:::i;:::-;;;;;;;;;;;:36;;:40;;;;41522:6;41481:7;:19;41489:10;-1:-1:-1::0;;;;;41481:19:0::2;-1:-1:-1::0;;;;;41481:19:0::2;;;;;;;;;;;;41501:2;41481:23;;;;;;;;:::i;:::-;;;;;;;;;;;:37;;;:47;;;;;;;:::i;:::-;;;;;;;;41557:6;41543:12;;:20;;;;;;;:::i;:::-;::::0;;;-1:-1:-1;;41578:11:0::2;::::0;:40:::2;::::0;-1:-1:-1;;;41578:40:0;;41599:10:::2;41578:40;::::0;::::2;10122:51:1::0;10189:18;;;10182:34;;;-1:-1:-1;;;;;41578:11:0;;::::2;::::0;:20:::2;::::0;10095:18:1;;41578:40:0::2;;;;;;;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1::0;41638:30:0::2;::::0;597:25:1;;;41649:10:0::2;::::0;41638:30:::2;::::0;585:2:1;570:18;41638:30:0::2;;;;;;;41395:285;41016:671;37173:1:::1;40902:785:::0;;;;:::o;42916:83::-;13615:6;;-1:-1:-1;;;;;13615:6:0;11833:10;13762:23;13754:68;;;;-1:-1:-1;;;13754:68:0;;;;;;;:::i;:::-;42979:6:::1;:12:::0;;-1:-1:-1;;;;;;42979:12:0::1;-1:-1:-1::0;;;;;42979:12:0;;;::::1;::::0;;;::::1;::::0;;42916:83::o;41696:1106::-;41764:10;36401:20;;;;:13;:20;;;;;;;;36400:21;36392:54;;;;-1:-1:-1;;;36392:54:0;;;;;;;:::i;:::-;41805:10:::1;41795:21;::::0;;;:9:::1;:21;::::0;;;;;;;41817:16:::1;::::0;::::1;::::0;41795:39;;;;;;;;::::1;;41794:40;41786:73;;;;-1:-1:-1::0;;;41786:73:0::1;;;;;;;:::i;:::-;41900:6;::::0;-1:-1:-1;;;;;41900:6:0::1;41879:17;41889:6:::0;41879:9:::1;:17::i;:::-;-1:-1:-1::0;;;;;41879:27:0::1;;41870:47;;;;-1:-1:-1::0;;;41870:47:0::1;;;;;;;:::i;:::-;41938:10;41928:21;::::0;;;:9:::1;:21;::::0;;;;;;;41950:16:::1;::::0;::::1;::::0;41928:39;;;;;;;:46;;-1:-1:-1;;41928:46:0::1;41970:4;41928:46;::::0;;42012:19;;;:7:::1;:19:::0;;;:23;;42032:2;;42012:23;::::1;;;;;:::i;:::-;;;;;;;;;;;:31;;;41993:15;:50;;41985:116;;;::::0;-1:-1:-1;;;41985:116:0;;10790:2:1;41985:116:0::1;::::0;::::1;10772:21:1::0;10829:2;10809:18;;;10802:30;10868:34;10848:18;;;10841:62;-1:-1:-1;;;10919:18:1;;;10912:51;10980:19;;41985:116:0::1;10588:417:1::0;41985:116:0::1;42135:10;42113:11;42127:19:::0;;;:7:::1;:19;::::0;;;;:23;;42147:2;;42127:23;::::1;;;;;:::i;:::-;;;;;;;;;;;:31;;;42113:45;;42184:1;42177:6;:8;42169:37;;;::::0;-1:-1:-1;;;42169:37:0;;11212:2:1;42169:37:0::1;::::0;::::1;11194:21:1::0;11251:2;11231:18;;;11224:30;-1:-1:-1;;;11270:18:1;;;11263:47;11327:18;;42169:37:0::1;11010:341:1::0;42169:37:0::1;42217:14;42234:22;42241:10;42253:2;42234:6;:22::i;:::-;42275:10;42267:19;::::0;;;:7:::1;:19;::::0;;;;:23;;42217:39;;-1:-1:-1;42309:15:0::1;::::0;42287:2;;42267:23;::::1;;;;;:::i;:::-;;::::0;;;::::1;::::0;;;:39:::1;:23;::::0;;::::1;;:39;:57:::0;42339:10;;42335:285:::1;;42374:10;42405:1;42366:19:::0;;;:7:::1;:19;::::0;;;;:23;;42386:2;;42366:23;::::1;;;;;:::i;:::-;;;;;;;;;;;:36;;:40;;;;42435:6;42421:12;;:20;;;;;;;:::i;:::-;::::0;;;-1:-1:-1;;42464:10:0::1;42456:19;::::0;;;:7:::1;:19;::::0;;;;:23;;42497:6;;42456:19;42476:2;;42456:23;::::1;;;;;:::i;:::-;;;;;;;;;;;:37;;;:47;;;;;;;:::i;:::-;::::0;;;-1:-1:-1;;42518:11:0::1;::::0;:40:::1;::::0;-1:-1:-1;;;42518:40:0;;42539:10:::1;42518:40;::::0;::::1;10122:51:1::0;10189:18;;;10182:34;;;-1:-1:-1;;;;;42518:11:0;;::::1;::::0;:20:::1;::::0;10095:18:1;;42518:40:0::1;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1::0;42578:30:0::1;::::0;597:25:1;;;42589:10:0::1;::::0;42578:30:::1;::::0;585:2:1;570:18;42578:30:0::1;;;;;;;42335:285;42646:6;42631:12;;:21;;;;;;;:::i;:::-;::::0;;;-1:-1:-1;;42671:10:0::1;42697:1;42663:19:::0;;;:7:::1;:19;::::0;;;;:23;;42683:2;;42663:23;::::1;;;;;:::i;:::-;;::::0;;;::::1;::::0;;;::::1;::::0;;::::1;;:31;;:35:::0;42709:10:::1;::::0;:39:::1;::::0;-1:-1:-1;;;42709:39:0;;42729:10:::1;42709:39;::::0;::::1;10122:51:1::0;10189:18;;;10182:34;;;-1:-1:-1;;;;;42709:10:0;;::::1;::::0;:19:::1;::::0;10095:18:1;;42709:39:0::1;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1::0;42766:28:0::1;::::0;597:25:1;;;42775:10:0::1;::::0;42766:28:::1;::::0;585:2:1;570:18;42766:28:0::1;;;;;;;41775:1027;;41696:1106:::0;;;:::o;37701:526::-;-1:-1:-1;;;;;37824:16:0;;37764:7;37824:16;;;:7;:16;;;;;:20;;37841:2;;37824:20;;;;;;:::i;:::-;;;;;;;;;;;:33;;;37787:7;:16;37795:7;-1:-1:-1;;;;;37787:16:0;-1:-1:-1;;;;;37787:16:0;;;;;;;;;;;;37804:2;37787:20;;;;;;;;:::i;:::-;;;;;;;;;;;:34;;;:70;37784:435;;;-1:-1:-1;;;;;37896:16:0;;;;;;:7;:16;;;;;:20;;37913:2;;37896:20;;;;;;:::i;:::-;;;;;;;;;;;:28;;;37877:15;:47;37874:164;;-1:-1:-1;;;;;37987:16:0;;;;;;:7;:16;;;;;:20;;38004:2;;37987:20;;;;;;:::i;:::-;;;;;;;;;;;:34;;;37951:7;:16;37959:7;-1:-1:-1;;;;;37951:16:0;-1:-1:-1;;;;;37951:16:0;;;;;;;;;;;;37968:2;37951:20;;;;;;;;:::i;:::-;;;;;;;;;;;:33;;;37950:72;;;;:::i;:::-;37943:79;;;;37874:164;-1:-1:-1;;;;;38128:16:0;;;;;;:7;:16;;;;;:20;;38145:2;;38128:20;;;;;;:::i;:::-;;;;;;;;;;;:36;;;38110:15;38109:56;;;;:::i;:::-;38078:26;38092:7;38101:2;38078:13;:26::i;:::-;38077:89;;;;:::i;37784:435::-;-1:-1:-1;38206:1:0;38199:8;;43924:247;10053:13;;;;;;;:48;;10089:12;;;;10088:13;10053:48;;;10856:4;1633:19;:23;10069:16;10045:107;;;;-1:-1:-1;;;10045:107:0;;11558:2:1;10045:107:0;;;11540:21:1;11597:2;11577:18;;;11570:30;11636:34;11616:18;;;11609:62;-1:-1:-1;;;11687:18:1;;;11680:44;11741:19;;10045:107:0;11356:410:1;10045:107:0;10165:19;10188:13;;;;;;10187:14;10212:101;;;;10247:13;:20;;-1:-1:-1;;10282:19:0;;;;;10212:101;44020:10:::1;:41:::0;;-1:-1:-1;;;;;44020:41:0;;::::1;-1:-1:-1::0;;;;;;44020:41:0;;::::1;;::::0;;;44068:11:::1;:43:::0;;;;::::1;::::0;;;::::1;::::0;;;::::1;::::0;;44122:16:::1;:14;:16::i;:::-;44149:6;:17:::0;;-1:-1:-1;;;;;;44149:17:0::1;44156:10;44149:17;::::0;;10339:68;;;;10390:5;10374:21;;-1:-1:-1;;10374:21:0;;;10339:68;9760:654;43924:247;;:::o;38235:186::-;38302:4;38339:12;38322:13;;:29;38319:72;;-1:-1:-1;38375:4:0;;38235:186;-1:-1:-1;38235:186:0:o;38319:72::-;-1:-1:-1;38408:5:0;;38235:186;-1:-1:-1;38235:186:0:o;14193:103::-;13615:6;;-1:-1:-1;;;;;13615:6:0;11833:10;13762:23;13754:68;;;;-1:-1:-1;;;13754:68:0;;;;;;;:::i;:::-;14258:30:::1;14285:1;14258:18;:30::i;:::-;14193:103::o:0;43345:202::-;13615:6;;-1:-1:-1;;;;;13615:6:0;11833:10;13762:23;13754:68;;;;-1:-1:-1;;;13754:68:0;;;;;;;:::i;:::-;43410:10:::1;::::0;:58:::1;::::0;-1:-1:-1;;;43410:58:0;;43434:10:::1;43410:58;::::0;::::1;8924:34:1::0;43454:4:0::1;8974:18:1::0;;;8967:43;9026:18;;;9019:34;;;-1:-1:-1;;;;;43410:10:0;;::::1;::::0;:23:::1;::::0;8859:18:1;;43410:58:0::1;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;43499:6;43479:16;;:26;;;;;;;:::i;:::-;;;;;;;;43533:6;43516:13;;:23;;;;;;;:::i;:::-;::::0;;;-1:-1:-1;;;43345:202:0:o;38648:432::-;38722:4;38759:3;38748:8;:14;;38740:37;;;;-1:-1:-1;;;38740:37:0;;;;;;;:::i;:::-;38788:8;38799:16;38806:8;38799:6;:16::i;:::-;38788:27;;38826:11;38864:14;;38856:3;38855:24;;;;:::i;:::-;38841:11;38849:3;38841:6;:11;:::i;:::-;38840:40;;;;:::i;:::-;38826:54;-1:-1:-1;38891:25:0;38934:8;38920:10;38927:3;38826:54;38920:10;:::i;:::-;38919:24;;;;:::i;:::-;38891:52;;38962:39;38980:20;38962:17;:39::i;:::-;38954:80;;;;-1:-1:-1;;;38954:80:0;;11973:2:1;38954:80:0;;;11955:21:1;12012:2;11992:18;;;11985:30;12051;12031:18;;;12024:58;12099:18;;38954:80:0;11771:352:1;44174:140:0;13615:6;;-1:-1:-1;;;;;13615:6:0;11833:10;13762:23;13754:68;;;;-1:-1:-1;;;13754:68:0;;;;;;;:::i;:::-;44232:10:::1;:35:::0;;-1:-1:-1;;;;;44232:35:0;;::::1;-1:-1:-1::0;;;;;;44232:35:0;;::::1;::::0;::::1;::::0;;;44273:11:::1;:36:::0;;;;::::1;;::::0;;44174:140::o;43144:193::-;13615:6;;-1:-1:-1;;;;;13615:6:0;11833:10;13762:23;13754:68;;;;-1:-1:-1;;;13754:68:0;;;;;;;:::i;:::-;43233:53:::1;::::0;-1:-1:-1;;;43233:53:0;;43267:10:::1;43233:53;::::0;::::1;10122:51:1::0;10189:18;;;10182:34;;;-1:-1:-1;;;;;43233:33:0;::::1;::::0;::::1;::::0;10095:18:1;;43233:53:0::1;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1::0;43302:27:0::1;::::0;43322:6;;-1:-1:-1;;;;;43302:27:0;::::1;::::0;::::1;::::0;;;::::1;43144:193:::0;;:::o;34741:119::-;34808:7;34834:18;34842:9;34834:7;:18::i;36236:50::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;14451:201::-;13615:6;;-1:-1:-1;;;;;13615:6:0;11833:10;13762:23;13754:68;;;;-1:-1:-1;;;13754:68:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;14540:22:0;::::1;14532:73;;;::::0;-1:-1:-1;;;14532:73:0;;12330:2:1;14532:73:0::1;::::0;::::1;12312:21:1::0;12369:2;12349:18;;;12342:30;12408:34;12388:18;;;12381:62;-1:-1:-1;;;12459:18:1;;;12452:36;12505:19;;14532:73:0::1;12128:402:1::0;14532:73:0::1;14616:28;14635:8;14616:18;:28::i;:::-;14451:201:::0;:::o;43553:148::-;43597:7;43616:16;43654:13;;43635:16;;:32;;;;:::i;43820:101::-;13615:6;;-1:-1:-1;;;;;13615:6:0;11833:10;13762:23;13754:68;;;;-1:-1:-1;;;13754:68:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;43887:20:0::1;43908:5;43887:20:::0;;;:13:::1;:20;::::0;;;;:26;;-1:-1:-1;;43887:26:0::1;::::0;;43820:101::o;43713:::-;13615:6;;-1:-1:-1;;;;;13615:6:0;11833:10;13762:23;13754:68;;;;-1:-1:-1;;;13754:68:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;43781:20:0::1;;::::0;;;:13:::1;:20;::::0;;;;:25;;-1:-1:-1;;43781:25:0::1;43802:4;43781:25;::::0;;43713:101::o;37504:189::-;37578:4;37670:14;;37665:3;:19;;;;:::i;:::-;-1:-1:-1;;;;;37637:16:0;;;;;;:7;:16;;;;;:20;;37654:2;;37637:20;;;;;;:::i;:::-;;;;;;;;;;;:24;;;37604:7;:16;37612:7;-1:-1:-1;;;;;37604:16:0;-1:-1:-1;;;;;37604:16:0;;;;;;;;;;;;37621:2;37604:20;;;;;;;;:::i;:::-;;;;;;;;;;;:28;;;37603:59;;;;:::i;:::-;37602:83;;;;:::i;:::-;37595:90;37504:189;-1:-1:-1;;;37504:189:0:o;13243:97::-;10656:13;;;;;;;10648:69;;;;-1:-1:-1;;;10648:69:0;;;;;;;:::i;:::-;13306:26:::1;:24;:26::i;14812:191::-:0;14905:6;;;-1:-1:-1;;;;;14922:17:0;;;-1:-1:-1;;;;;;14922:17:0;;;;;;;14955:40;;14905:6;;;14922:17;14905:6;;14955:40;;14886:16;;14955:40;14875:128;14812:191;:::o;35503:189::-;35571:7;35591:14;35608:16;35614:9;35608:5;:16::i;:::-;35591:33;;35642:42;35656:6;35664:9;:19;;;35642:13;:42::i;13348:113::-;10656:13;;;;;;;10648:69;;;;-1:-1:-1;;;10648:69:0;;;;;;;:::i;:::-;13421:32:::1;11833:10:::0;13421:18:::1;:32::i;34970:527::-:0;35036:7;35063:426;35119:128;35266:9;:21;;;35306:9;:25;;;35350:9;:16;;;35385:9;:12;;;35416:9;:18;;;35453:9;:19;;;35090:397;;;;;;;;;;;;;13262:25:1;;;-1:-1:-1;;;;;13361:15:1;;;13356:2;13341:18;;13334:43;13413:15;;;;13408:2;13393:18;;13386:43;13460:2;13445:18;;13438:34;;;;13503:3;13488:19;;13481:35;13314:3;13532:19;;13525:35;;;;13591:3;13576:19;;13569:35;13249:3;13234:19;;12947:663;35090:397:0;;;;;;;;;;;;;35080:408;;;;;;35063:16;:426::i;24549:231::-;24627:7;24648:17;24667:18;24689:27;24700:4;24706:9;24689:10;:27::i;:::-;24647:69;;;;24727:18;24739:5;24727:11;:18::i;:::-;-1:-1:-1;24763:9:0;24549:231;-1:-1:-1;;;24549:231:0:o;34098:167::-;34175:7;34202:55;34224:20;:18;:20::i;:::-;34246:10;29593:57;;-1:-1:-1;;;29593:57:0;;;15524:27:1;15567:11;;;15560:27;;;15603:12;;;15596:28;;;29556:7:0;;15640:12:1;;29593:57:0;;;;;;;;;;;;29583:68;;;;;;29576:75;;29463:196;;;;;22439:1308;22520:7;22529:12;22754:9;:16;22774:2;22754:22;22750:990;;23050:4;23035:20;;23029:27;23100:4;23085:20;;23079:27;23158:4;23143:20;;23137:27;22793:9;23129:36;23201:25;23212:4;23129:36;23029:27;23079;23201:10;:25::i;:::-;23194:32;;;;;;;;;22750:990;23248:9;:16;23268:2;23248:22;23244:496;;23523:4;23508:20;;23502:27;23574:4;23559:20;;23553:27;23616:23;23627:4;23502:27;23553;23616:10;:23::i;:::-;23609:30;;;;;;;;23244:496;-1:-1:-1;23688:1:0;;-1:-1:-1;23692:35:0;23244:496;22439:1308;;;;;:::o;20710:643::-;20788:20;20779:5;:29;;;;;;;;:::i;:::-;;20775:571;;20710:643;:::o;20775:571::-;20886:29;20877:5;:38;;;;;;;;:::i;:::-;;20873:473;;20932:34;;-1:-1:-1;;;20932:34:0;;13949:2:1;20932:34:0;;;13931:21:1;13988:2;13968:18;;;13961:30;14027:26;14007:18;;;14000:54;14071:18;;20932:34:0;13747:348:1;20873:473:0;20997:35;20988:5;:44;;;;;;;;:::i;:::-;;20984:362;;21049:41;;-1:-1:-1;;;21049:41:0;;14302:2:1;21049:41:0;;;14284:21:1;14341:2;14321:18;;;14314:30;14380:33;14360:18;;;14353:61;14431:18;;21049:41:0;14100:355:1;20984:362:0;21121:30;21112:5;:39;;;;;;;;:::i;:::-;;21108:238;;21168:44;;-1:-1:-1;;;21168:44:0;;14662:2:1;21168:44:0;;;14644:21:1;14701:2;14681:18;;;14674:30;14740:34;14720:18;;;14713:62;-1:-1:-1;;;14791:18:1;;;14784:32;14833:19;;21168:44:0;14460:398:1;21108:238:0;21243:30;21234:5;:39;;;;;;;;:::i;:::-;;21230:116;;21290:44;;-1:-1:-1;;;21290:44:0;;15065:2:1;21290:44:0;;;15047:21:1;15104:2;15084:18;;;15077:30;15143:34;15123:18;;;15116:62;-1:-1:-1;;;15194:18:1;;;15187:32;15236:19;;21290:44:0;14863:398:1;32871:314:0;32924:7;32956:4;-1:-1:-1;;;;;32965:12:0;32948:29;;:66;;;;;32998:16;32981:13;:33;32948:66;32944:234;;;-1:-1:-1;33038:24:0;;32871:314::o;32944:234::-;-1:-1:-1;33374:73:0;;;33124:10;33374:73;;;;16325:25:1;;;;33136:12:0;16366:18:1;;;16359:34;33150:15:0;16409:18:1;;;16402:34;33418:13:0;16452:18:1;;;16445:34;33441:4:0;16495:19:1;;;;16488:61;;;;33374:73:0;;;;;;;;;;16297:19:1;;;;33374:73:0;;;33364:84;;;;;;32871:314::o;26001:1632::-;26132:7;;27066:66;27053:79;;27049:163;;;-1:-1:-1;27165:1:0;;-1:-1:-1;27169:30:0;27149:51;;27049:163;27226:1;:7;;27231:2;27226:7;;:18;;;;;27237:1;:7;;27242:2;27237:7;;27226:18;27222:102;;;-1:-1:-1;27277:1:0;;-1:-1:-1;27281:30:0;27261:51;;27222:102;27438:24;;;27421:14;27438:24;;;;;;;;;15890:25:1;;;15963:4;15951:17;;15931:18;;;15924:45;;;;15985:18;;;15978:34;;;16028:18;;;16021:34;;;27438:24:0;;15862:19:1;;27438:24:0;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;27438:24:0;;-1:-1:-1;;27438:24:0;;;-1:-1:-1;;;;;;;27477:20:0;;27473:103;;27530:1;27534:29;27514:50;;;;;;;27473:103;27596:6;-1:-1:-1;27604:20:0;;-1:-1:-1;26001:1632:0;;;;;;;;:::o;25043:344::-;25157:7;;-1:-1:-1;;;;;25203:80:0;;25157:7;25310:25;25326:3;25311:18;;;25333:2;25310:25;:::i;:::-;25294:42;;25354:25;25365:4;25371:1;25374;25377;25354:10;:25::i;:::-;25347:32;;;;;;25043:344;;;;;;:::o;14:173:1:-;82:20;;-1:-1:-1;;;;;131:31:1;;121:42;;111:70;;177:1;174;167:12;111:70;14:173;;;:::o;192:254::-;260:6;268;321:2;309:9;300:7;296:23;292:32;289:52;;;337:1;334;327:12;289:52;360:29;379:9;360:29;:::i;:::-;350:39;436:2;421:18;;;;408:32;;-1:-1:-1;;;192:254:1:o;633:180::-;692:6;745:2;733:9;724:7;720:23;716:32;713:52;;;761:1;758;751:12;713:52;-1:-1:-1;784:23:1;;633:180;-1:-1:-1;633:180:1:o;1026:127::-;1087:10;1082:3;1078:20;1075:1;1068:31;1118:4;1115:1;1108:15;1142:4;1139:1;1132:15;1158:248;1225:2;1219:9;1267:4;1255:17;;1302:18;1287:34;;1323:22;;;1284:62;1281:88;;;1349:18;;:::i;:::-;1385:2;1378:22;1158:248;:::o;1411:718::-;1453:5;1506:3;1499:4;1491:6;1487:17;1483:27;1473:55;;1524:1;1521;1514:12;1473:55;1560:6;1547:20;1586:18;1623:2;1619;1616:10;1613:36;;;1629:18;;:::i;:::-;1704:2;1698:9;1672:2;1758:13;;-1:-1:-1;;1754:22:1;;;1778:2;1750:31;1746:40;1734:53;;;1802:18;;;1822:22;;;1799:46;1796:72;;;1848:18;;:::i;:::-;1888:10;1884:2;1877:22;1923:2;1915:6;1908:18;1969:3;1962:4;1957:2;1949:6;1945:15;1941:26;1938:35;1935:55;;;1986:1;1983;1976:12;1935:55;2050:2;2043:4;2035:6;2031:17;2024:4;2016:6;2012:17;1999:54;2097:1;2090:4;2085:2;2077:6;2073:15;2069:26;2062:37;2117:6;2108:15;;;;;;1411:718;;;;:::o;2134:749::-;2190:5;2238:4;2226:9;2221:3;2217:19;2213:30;2210:50;;;2256:1;2253;2246:12;2210:50;2278:17;;:::i;:::-;2269:26;;2318:29;2337:9;2318:29;:::i;:::-;2311:5;2304:44;2380:38;2414:2;2403:9;2399:18;2380:38;:::i;:::-;2375:2;2368:5;2364:14;2357:62;2479:2;2468:9;2464:18;2451:32;2446:2;2439:5;2435:14;2428:56;2544:2;2533:9;2529:18;2516:32;2511:2;2504:5;2500:14;2493:56;2610:3;2599:9;2595:19;2582:33;2576:3;2569:5;2565:15;2558:58;2677:3;2666:9;2662:19;2649:33;2643:3;2636:5;2632:15;2625:58;2734:3;2723:9;2719:19;2706:33;2762:18;2754:6;2751:30;2748:50;;;2794:1;2791;2784:12;2748:50;2831:45;2872:3;2863:6;2852:9;2848:22;2831:45;:::i;:::-;2825:3;2818:5;2814:15;2807:70;;2134:749;;;;:::o;2888:485::-;2992:6;3000;3008;3061:2;3049:9;3040:7;3036:23;3032:32;3029:52;;;3077:1;3074;3067:12;3029:52;3113:9;3100:23;3090:33;;3170:2;3159:9;3155:18;3142:32;3132:42;;3225:2;3214:9;3210:18;3197:32;3252:18;3244:6;3241:30;3238:50;;;3284:1;3281;3274:12;3238:50;3307:60;3359:7;3350:6;3339:9;3335:22;3307:60;:::i;:::-;3297:70;;;2888:485;;;;;:::o;3378:417::-;3473:6;3481;3534:2;3522:9;3513:7;3509:23;3505:32;3502:52;;;3550:1;3547;3540:12;3502:52;3586:9;3573:23;3563:33;;3647:2;3636:9;3632:18;3619:32;3674:18;3666:6;3663:30;3660:50;;;3706:1;3703;3696:12;3660:50;3729:60;3781:7;3772:6;3761:9;3757:22;3729:60;:::i;:::-;3719:70;;;3378:417;;;;;:::o;3800:186::-;3859:6;3912:2;3900:9;3891:7;3887:23;3883:32;3880:52;;;3928:1;3925;3918:12;3880:52;3951:29;3970:9;3951:29;:::i;3991:260::-;4059:6;4067;4120:2;4108:9;4099:7;4095:23;4091:32;4088:52;;;4136:1;4133;4126:12;4088:52;4159:29;4178:9;4159:29;:::i;:::-;4149:39;;4207:38;4241:2;4230:9;4226:18;4207:38;:::i;:::-;4197:48;;3991:260;;;;;:::o;4681:248::-;4749:6;4757;4810:2;4798:9;4789:7;4785:23;4781:32;4778:52;;;4826:1;4823;4816:12;4778:52;-1:-1:-1;;4849:23:1;;;4919:2;4904:18;;;4891:32;;-1:-1:-1;4681:248:1:o;4934:349::-;5020:6;5073:2;5061:9;5052:7;5048:23;5044:32;5041:52;;;5089:1;5086;5079:12;5041:52;5129:9;5116:23;5162:18;5154:6;5151:30;5148:50;;;5194:1;5191;5184:12;5148:50;5217:60;5269:7;5260:6;5249:9;5245:22;5217:60;:::i;:::-;5207:70;4934:349;-1:-1:-1;;;;4934:349:1:o;6044:127::-;6105:10;6100:3;6096:20;6093:1;6086:31;6136:4;6133:1;6126:15;6160:4;6157:1;6150:15;6176:335;6378:2;6360:21;;;6417:2;6397:18;;;6390:30;-1:-1:-1;;;6451:2:1;6436:18;;6429:41;6502:2;6487:18;;6176:335::o;6516:127::-;6577:10;6572:3;6568:20;6565:1;6558:31;6608:4;6605:1;6598:15;6632:4;6629:1;6622:15;6648:168;6688:7;6754:1;6750;6746:6;6742:14;6739:1;6736:21;6731:1;6724:9;6717:17;6713:45;6710:71;;;6761:18;;:::i;:::-;-1:-1:-1;6801:9:1;;6648:168::o;6821:217::-;6861:1;6887;6877:132;;6931:10;6926:3;6922:20;6919:1;6912:31;6966:4;6963:1;6956:15;6994:4;6991:1;6984:15;6877:132;-1:-1:-1;7023:9:1;;6821:217::o;7043:128::-;7083:3;7114:1;7110:6;7107:1;7104:13;7101:39;;;7120:18;;:::i;:::-;-1:-1:-1;7156:9:1;;7043:128::o;7176:345::-;7378:2;7360:21;;;7417:2;7397:18;;;7390:30;-1:-1:-1;;;7451:2:1;7436:18;;7429:51;7512:2;7497:18;;7176:345::o;7526:::-;7728:2;7710:21;;;7767:2;7747:18;;;7740:30;-1:-1:-1;;;7801:2:1;7786:18;;7779:51;7862:2;7847:18;;7526:345::o;7876:330::-;8078:2;8060:21;;;8117:1;8097:18;;;8090:29;-1:-1:-1;;;8150:2:1;8135:18;;8128:37;8197:2;8182:18;;7876:330::o;8554:125::-;8594:4;8622:1;8619;8616:8;8613:34;;;8627:18;;:::i;:::-;-1:-1:-1;8664:9:1;;8554:125::o;9064:277::-;9131:6;9184:2;9172:9;9163:7;9159:23;9155:32;9152:52;;;9200:1;9197;9190:12;9152:52;9232:9;9226:16;9285:5;9278:13;9271:21;9264:5;9261:32;9251:60;;9307:1;9304;9297:12;10227:356;10429:2;10411:21;;;10448:18;;;10441:30;10507:34;10502:2;10487:18;;10480:62;10574:2;10559:18;;10227:356::o;12535:407::-;12737:2;12719:21;;;12776:2;12756:18;;;12749:30;12815:34;12810:2;12795:18;;12788:62;-1:-1:-1;;;12881:2:1;12866:18;;12859:41;12932:3;12917:19;;12535:407::o;13615:127::-;13676:10;13671:3;13667:20;13664:1;13657:31;13707:4;13704:1;13697:15;13731:4;13728:1;13721:15

Swarm Source

ipfs://d81bb75007420b4e8580745d64291b152f83c3c43ac0033b141532cc7fc8ae9d
Block Transaction Difficulty Gas Used Reward
Block Uncle Number Difficulty Gas Used Reward
Loading

A contract address hosts a smart contract, which is a set of code stored on the blockchain that runs when predetermined conditions are met. Learn more about addresses in our Knowledge Base.