Contract 0xb2cb696fe5244fb9004877e58dcb680cb86ba444

Contract Overview

Balance:
0 ETH

Token:
Txn Hash Method
Block
From
To
Value [Txn Fee]
0xc76202194ad591b45c7e6c38cd7c4e05ffc0d7908b29dd7fcf94057afe51dce0Submit Value227742362023-05-29 10:41:232 hrs 1 min ago0xf3fa4536396a486c0490ea506dd4630f73d1ab9d IN  0xb2cb696fe5244fb9004877e58dcb680cb86ba4440 ETH0.00019917 0.88511
0x6d7143b213fda96a72d259f459ea9651119459697e89e6de58c208ec38428ca2Submit Value227400332023-05-29 6:48:025 hrs 55 mins ago0xf3fa4536396a486c0490ea506dd4630f73d1ab9d IN  0xb2cb696fe5244fb9004877e58dcb680cb86ba4440 ETH0.0000225 0.1
0x3f5c7e30576ff47668848b8a2227785e5a34c5a256d12f3effa9643f409cddb9Submit Value227099022023-05-29 2:54:419 hrs 48 mins ago0xf3fa4536396a486c0490ea506dd4630f73d1ab9d IN  0xb2cb696fe5244fb9004877e58dcb680cb86ba4440 ETH0.0000225 0.1
0x99860696ff59d3257ca9bc1af6fd2c39388d71463d5f7ca43816f7ec3c1ec43bSubmit Value226772172023-05-28 23:01:2013 hrs 41 mins ago0xf3fa4536396a486c0490ea506dd4630f73d1ab9d IN  0xb2cb696fe5244fb9004877e58dcb680cb86ba4440 ETH0.00239135 10.62559
0x84420fcb4de65a1804042c39ca51ce782ef90376d6c76e12ebab4f8e42d7b66fSubmit Value226453842023-05-28 19:07:5917 hrs 35 mins ago0xf3fa4536396a486c0490ea506dd4630f73d1ab9d IN  0xb2cb696fe5244fb9004877e58dcb680cb86ba4440 ETH0.0000225 0.1
0xd63c20ae422788dc4413f6d0f73e94ca77dc1768534809e84c1f8a0b881456c2Submit Value226157812023-05-28 15:14:3821 hrs 28 mins ago0xf3fa4536396a486c0490ea506dd4630f73d1ab9d IN  0xb2cb696fe5244fb9004877e58dcb680cb86ba4440 ETH0.00366666 16.29222
0x06e6512a2bee715c4f05b7dac0cc24bf61f027c78f3e021ce3d1a882b1550a69Submit Value225801042023-05-28 11:21:171 day 1 hr ago0xf3fa4536396a486c0490ea506dd4630f73d1ab9d IN  0xb2cb696fe5244fb9004877e58dcb680cb86ba4440 ETH0.0000225 0.1
0xae262aab37ae4f48107189f4ba88b8dee634f168a8e6c49c17ba92e0000cd2e2Submit Value225455522023-05-28 7:27:561 day 5 hrs ago0xf3fa4536396a486c0490ea506dd4630f73d1ab9d IN  0xb2cb696fe5244fb9004877e58dcb680cb86ba4440 ETH0.0000225 0.1
0x7bef9b2c979b0fa9d698ad83025f6acd4bbf16de545be8d9eec9494857adb1afSubmit Value225137432023-05-28 3:34:351 day 9 hrs ago0xf3fa4536396a486c0490ea506dd4630f73d1ab9d IN  0xb2cb696fe5244fb9004877e58dcb680cb86ba4440 ETH0.0000225 0.1
0xdeec9126627b0ca43c1b5ab95bb425587abed6437b5f26562e33135d9ddb0f33Submit Value224561442023-05-27 19:47:541 day 16 hrs ago0xf3fa4536396a486c0490ea506dd4630f73d1ab9d IN  0xb2cb696fe5244fb9004877e58dcb680cb86ba4440 ETH0.0000225 0.1
0x57a7f28fbc58563b770fa715e8d353a4f2a48c4f995ffd1ee80e10fde343c602Submit Value224225052023-05-27 15:54:331 day 20 hrs ago0xf3fa4536396a486c0490ea506dd4630f73d1ab9d IN  0xb2cb696fe5244fb9004877e58dcb680cb86ba4440 ETH0.00002786 0.12381
0xc66aa72fdc24f1b9c75b4078550020831e34fa8a5b210eea623176d48c478a29Submit Value223852652023-05-27 12:01:112 days 41 mins ago0xf3fa4536396a486c0490ea506dd4630f73d1ab9d IN  0xb2cb696fe5244fb9004877e58dcb680cb86ba4440 ETH0.0000225 0.1
0x544438b84e05029457e9d0d2a38ec640cf2f9442eb1e66b76a081aa8a64cec71Submit Value223482882023-05-27 8:07:512 days 4 hrs ago0xf3fa4536396a486c0490ea506dd4630f73d1ab9d IN  0xb2cb696fe5244fb9004877e58dcb680cb86ba4440 ETH0.0000225 0.1
0x1a95a01085a2ce0d4a63413a122181138cd90ea664e1c3eb981fd072abe031b2Submit Value223126942023-05-27 4:14:302 days 8 hrs ago0xf3fa4536396a486c0490ea506dd4630f73d1ab9d IN  0xb2cb696fe5244fb9004877e58dcb680cb86ba4440 ETH0.0000225 0.1
0xf79d2a63a2c7f3a923b91570565b283345ef1b31128c7e48152e0146f430a9f5Submit Value222790512023-05-27 0:21:092 days 12 hrs ago0xf3fa4536396a486c0490ea506dd4630f73d1ab9d IN  0xb2cb696fe5244fb9004877e58dcb680cb86ba4440 ETH0.0000225 0.1
0x4e4f066df4e8307f2a699b2c969984bffa807f5518ab8b96298c68b8df916dc7Submit Value222471402023-05-26 20:27:482 days 16 hrs ago0xf3fa4536396a486c0490ea506dd4630f73d1ab9d IN  0xb2cb696fe5244fb9004877e58dcb680cb86ba4440 ETH0.0000225 0.1
0x1e303f70d0d8e0fa547d6c737179f4109c5b4650b72221c6d79db6a743d8aeaeSubmit Value222105472023-05-26 16:34:262 days 20 hrs ago0xf3fa4536396a486c0490ea506dd4630f73d1ab9d IN  0xb2cb696fe5244fb9004877e58dcb680cb86ba4440 ETH0.0000225 0.1
0xb888d8b0c7eccff08101b2b8d07972dc14036233edc1e214d0568339429443f8Submit Value221702272023-05-26 12:41:053 days 2 mins ago0xf3fa4536396a486c0490ea506dd4630f73d1ab9d IN  0xb2cb696fe5244fb9004877e58dcb680cb86ba4440 ETH0.00002573 0.11433
0x820dee1a22dbe37baf86c19241938cf969477f26e3ee468782700b1eb4aa037fSubmit Value221288832023-05-26 8:47:443 days 3 hrs ago0xf3fa4536396a486c0490ea506dd4630f73d1ab9d IN  0xb2cb696fe5244fb9004877e58dcb680cb86ba4440 ETH0.00021628 0.96101
0xbbb4182c9f59a8431f113fea615cd1992815adbd90dbbe4e663dd2f2f6845f14Submit Value220902872023-05-26 4:54:233 days 7 hrs ago0xf3fa4536396a486c0490ea506dd4630f73d1ab9d IN  0xb2cb696fe5244fb9004877e58dcb680cb86ba4440 ETH0.0000225 0.1
0x231da9eea00db18106705e36c7539fc5e4c793171f51f8b87fbd8a1081a6c4e5Submit Value220534792023-05-26 1:01:023 days 11 hrs ago0xf3fa4536396a486c0490ea506dd4630f73d1ab9d IN  0xb2cb696fe5244fb9004877e58dcb680cb86ba4440 ETH0.0000225 0.1
0x1f59296712704261d87bab1e9b9c7e7ac73f0e576ba4fdb1696109c326ea7d91Submit Value220155442023-05-25 21:07:413 days 15 hrs ago0xf3fa4536396a486c0490ea506dd4630f73d1ab9d IN  0xb2cb696fe5244fb9004877e58dcb680cb86ba4440 ETH0.0000225 0.1
0xe8ceb2923095e105a2119af082ee018cbf32a30308976c776e461ee85105c5a3Submit Value219778022023-05-25 17:14:203 days 19 hrs ago0xf3fa4536396a486c0490ea506dd4630f73d1ab9d IN  0xb2cb696fe5244fb9004877e58dcb680cb86ba4440 ETH0.00002837 0.1
0x69840929b80117e6255956251817d100365f89962bed2525275f29d6bf89ffd5Submit Value219395832023-05-25 13:20:593 days 23 hrs ago0xf3fa4536396a486c0490ea506dd4630f73d1ab9d IN  0xb2cb696fe5244fb9004877e58dcb680cb86ba4440 ETH0.00340129 14.75378
0x1e1a050cd46551831a422aec91e021fd32510cd84cb4bcb5adf1316e17a0d7adSubmit Value218987422023-05-25 9:27:384 days 3 hrs ago0xf3fa4536396a486c0490ea506dd4630f73d1ab9d IN  0xb2cb696fe5244fb9004877e58dcb680cb86ba4440 ETH0.00138081 4.73944
[ Download CSV Export 
Latest 25 internal transaction
Parent Txn Hash Block From To Value
0xc76202194ad591b45c7e6c38cd7c4e05ffc0d7908b29dd7fcf94057afe51dce0227742362023-05-29 10:41:232 hrs 1 min ago 0xb2cb696fe5244fb9004877e58dcb680cb86ba444 0x8d1bb5eddfce08b92dd47c9871d1805211c3eb3c0 ETH
0x6d7143b213fda96a72d259f459ea9651119459697e89e6de58c208ec38428ca2227400332023-05-29 6:48:025 hrs 55 mins ago 0xb2cb696fe5244fb9004877e58dcb680cb86ba444 0x8d1bb5eddfce08b92dd47c9871d1805211c3eb3c0 ETH
0x3f5c7e30576ff47668848b8a2227785e5a34c5a256d12f3effa9643f409cddb9227099022023-05-29 2:54:419 hrs 48 mins ago 0xb2cb696fe5244fb9004877e58dcb680cb86ba444 0x8d1bb5eddfce08b92dd47c9871d1805211c3eb3c0 ETH
0x99860696ff59d3257ca9bc1af6fd2c39388d71463d5f7ca43816f7ec3c1ec43b226772172023-05-28 23:01:2013 hrs 41 mins ago 0xb2cb696fe5244fb9004877e58dcb680cb86ba444 0x8d1bb5eddfce08b92dd47c9871d1805211c3eb3c0 ETH
0x84420fcb4de65a1804042c39ca51ce782ef90376d6c76e12ebab4f8e42d7b66f226453842023-05-28 19:07:5917 hrs 35 mins ago 0xb2cb696fe5244fb9004877e58dcb680cb86ba444 0x8d1bb5eddfce08b92dd47c9871d1805211c3eb3c0 ETH
0xd63c20ae422788dc4413f6d0f73e94ca77dc1768534809e84c1f8a0b881456c2226157812023-05-28 15:14:3821 hrs 28 mins ago 0xb2cb696fe5244fb9004877e58dcb680cb86ba444 0x8d1bb5eddfce08b92dd47c9871d1805211c3eb3c0 ETH
0x06e6512a2bee715c4f05b7dac0cc24bf61f027c78f3e021ce3d1a882b1550a69225801042023-05-28 11:21:171 day 1 hr ago 0xb2cb696fe5244fb9004877e58dcb680cb86ba444 0x8d1bb5eddfce08b92dd47c9871d1805211c3eb3c0 ETH
0xae262aab37ae4f48107189f4ba88b8dee634f168a8e6c49c17ba92e0000cd2e2225455522023-05-28 7:27:561 day 5 hrs ago 0xb2cb696fe5244fb9004877e58dcb680cb86ba444 0x8d1bb5eddfce08b92dd47c9871d1805211c3eb3c0 ETH
0x7bef9b2c979b0fa9d698ad83025f6acd4bbf16de545be8d9eec9494857adb1af225137432023-05-28 3:34:351 day 9 hrs ago 0xb2cb696fe5244fb9004877e58dcb680cb86ba444 0x8d1bb5eddfce08b92dd47c9871d1805211c3eb3c0 ETH
0xdeec9126627b0ca43c1b5ab95bb425587abed6437b5f26562e33135d9ddb0f33224561442023-05-27 19:47:541 day 16 hrs ago 0xb2cb696fe5244fb9004877e58dcb680cb86ba444 0x8d1bb5eddfce08b92dd47c9871d1805211c3eb3c0 ETH
0x57a7f28fbc58563b770fa715e8d353a4f2a48c4f995ffd1ee80e10fde343c602224225052023-05-27 15:54:331 day 20 hrs ago 0xb2cb696fe5244fb9004877e58dcb680cb86ba444 0x8d1bb5eddfce08b92dd47c9871d1805211c3eb3c0 ETH
0xc66aa72fdc24f1b9c75b4078550020831e34fa8a5b210eea623176d48c478a29223852652023-05-27 12:01:112 days 41 mins ago 0xb2cb696fe5244fb9004877e58dcb680cb86ba444 0x8d1bb5eddfce08b92dd47c9871d1805211c3eb3c0 ETH
0x544438b84e05029457e9d0d2a38ec640cf2f9442eb1e66b76a081aa8a64cec71223482882023-05-27 8:07:512 days 4 hrs ago 0xb2cb696fe5244fb9004877e58dcb680cb86ba444 0x8d1bb5eddfce08b92dd47c9871d1805211c3eb3c0 ETH
0x1a95a01085a2ce0d4a63413a122181138cd90ea664e1c3eb981fd072abe031b2223126942023-05-27 4:14:302 days 8 hrs ago 0xb2cb696fe5244fb9004877e58dcb680cb86ba444 0x8d1bb5eddfce08b92dd47c9871d1805211c3eb3c0 ETH
0xf79d2a63a2c7f3a923b91570565b283345ef1b31128c7e48152e0146f430a9f5222790512023-05-27 0:21:092 days 12 hrs ago 0xb2cb696fe5244fb9004877e58dcb680cb86ba444 0x8d1bb5eddfce08b92dd47c9871d1805211c3eb3c0 ETH
0x4e4f066df4e8307f2a699b2c969984bffa807f5518ab8b96298c68b8df916dc7222471402023-05-26 20:27:482 days 16 hrs ago 0xb2cb696fe5244fb9004877e58dcb680cb86ba444 0x8d1bb5eddfce08b92dd47c9871d1805211c3eb3c0 ETH
0x1e303f70d0d8e0fa547d6c737179f4109c5b4650b72221c6d79db6a743d8aeae222105472023-05-26 16:34:262 days 20 hrs ago 0xb2cb696fe5244fb9004877e58dcb680cb86ba444 0x8d1bb5eddfce08b92dd47c9871d1805211c3eb3c0 ETH
0xb888d8b0c7eccff08101b2b8d07972dc14036233edc1e214d0568339429443f8221702272023-05-26 12:41:053 days 2 mins ago 0xb2cb696fe5244fb9004877e58dcb680cb86ba444 0x8d1bb5eddfce08b92dd47c9871d1805211c3eb3c0 ETH
0x820dee1a22dbe37baf86c19241938cf969477f26e3ee468782700b1eb4aa037f221288832023-05-26 8:47:443 days 3 hrs ago 0xb2cb696fe5244fb9004877e58dcb680cb86ba444 0x8d1bb5eddfce08b92dd47c9871d1805211c3eb3c0 ETH
0xbbb4182c9f59a8431f113fea615cd1992815adbd90dbbe4e663dd2f2f6845f14220902872023-05-26 4:54:233 days 7 hrs ago 0xb2cb696fe5244fb9004877e58dcb680cb86ba444 0x8d1bb5eddfce08b92dd47c9871d1805211c3eb3c0 ETH
0x231da9eea00db18106705e36c7539fc5e4c793171f51f8b87fbd8a1081a6c4e5220534792023-05-26 1:01:023 days 11 hrs ago 0xb2cb696fe5244fb9004877e58dcb680cb86ba444 0x8d1bb5eddfce08b92dd47c9871d1805211c3eb3c0 ETH
0x1f59296712704261d87bab1e9b9c7e7ac73f0e576ba4fdb1696109c326ea7d91220155442023-05-25 21:07:413 days 15 hrs ago 0xb2cb696fe5244fb9004877e58dcb680cb86ba444 0x8d1bb5eddfce08b92dd47c9871d1805211c3eb3c0 ETH
0xe8ceb2923095e105a2119af082ee018cbf32a30308976c776e461ee85105c5a3219778022023-05-25 17:14:203 days 19 hrs ago 0xb2cb696fe5244fb9004877e58dcb680cb86ba444 0x8d1bb5eddfce08b92dd47c9871d1805211c3eb3c0 ETH
0x69840929b80117e6255956251817d100365f89962bed2525275f29d6bf89ffd5219395832023-05-25 13:20:593 days 23 hrs ago 0xb2cb696fe5244fb9004877e58dcb680cb86ba444 0x8d1bb5eddfce08b92dd47c9871d1805211c3eb3c0 ETH
0x1e1a050cd46551831a422aec91e021fd32510cd84cb4bcb5adf1316e17a0d7ad218987422023-05-25 9:27:384 days 3 hrs ago 0xb2cb696fe5244fb9004877e58dcb680cb86ba444 0x8d1bb5eddfce08b92dd47c9871d1805211c3eb3c0 ETH
[ Download CSV Export 
Loading

Similar Match Source Code
Note: This contract matches the deployed ByteCode of the Source Code for Contract 0x46038969D7DC0b17BC72137D07b4eDe43859DA45

Contract Name:
TellorFlex

Compiler Version
v0.8.3+commit.8d00100c

Optimization Enabled:
Yes with 300 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity)

/**
 *Submitted for verification at Arbiscan on 2023-02-13
*/

// SPDX-License-Identifier: MIT
pragma solidity 0.8.3;


interface IERC20 {
    function balanceOf(address account) external view returns (uint256);

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

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

/**
 @author Tellor Inc.
 @title TellorFlex
 @dev This is a streamlined Tellor oracle system which handles staking, reporting,
 * slashing, and user data getters in one contract. This contract is controlled
 * by a single address known as 'governance', which could be an externally owned
 * account or a contract, allowing for a flexible, modular design.
*/
contract TellorFlex {
    // Storage
    IERC20 public token; // token used for staking and rewards
    address public governance; // address with ability to remove values and slash reporters
    address public owner; // contract deployer, can call init function once
    uint256 public accumulatedRewardPerShare; // accumulated staking reward per staked token
    uint256 public minimumStakeAmount; // minimum amount of tokens required to stake
    uint256 public reportingLock; // base amount of time before a reporter is able to submit a value again
    uint256 public rewardRate; // total staking rewards released per second
    uint256 public stakeAmount; // minimum amount required to be a staker
    uint256 public stakeAmountDollarTarget; // amount of US dollars required to be a staker
    uint256 public stakingRewardsBalance; // total amount of staking rewards
    bytes32 public stakingTokenPriceQueryId; // staking token SpotPrice queryId, used for updating stakeAmount
    uint256 public timeBasedReward = 5e17; // amount of TB rewards released per 5 minutes
    uint256 public timeOfLastAllocation; // time of last update to accumulatedRewardPerShare
    uint256 public timeOfLastNewValue = block.timestamp; // time of the last new submitted value, originally set to the block timestamp
    uint256 public totalRewardDebt; // staking reward debt, used to calculate real staking rewards balance
    uint256 public totalStakeAmount; // total amount of tokens locked in contract (via stake)
    uint256 public totalStakers; // total number of stakers with at least stakeAmount staked, not exact
    uint256 public toWithdraw; //amountLockedForWithdrawal

    mapping(bytes32 => Report) private reports; // mapping of query IDs to a report
    mapping(address => StakeInfo) private stakerDetails; // mapping from a persons address to their staking info

    // Structs
    struct Report {
        uint256[] timestamps; // array of all newValueTimestamps reported
        mapping(uint256 => uint256) timestampIndex; // mapping of timestamps to respective indices
        mapping(uint256 => uint256) timestampToBlockNum; // mapping of timestamp to block number
        mapping(uint256 => bytes) valueByTimestamp; // mapping of timestamps to values
        mapping(uint256 => address) reporterByTimestamp; // mapping of timestamps to reporters
        mapping(uint256 => bool) isDisputed;
    }

    struct StakeInfo {
        uint256 startDate; // stake or withdrawal request start date
        uint256 stakedBalance; // staked token balance
        uint256 lockedBalance; // amount locked for withdrawal
        uint256 rewardDebt; // used for staking reward calculation
        uint256 reporterLastTimestamp; // timestamp of reporter's last reported value
        uint256 reportsSubmitted; // total number of reports submitted by reporter
        uint256 startVoteCount; // total number of governance votes when stake deposited
        uint256 startVoteTally; // staker vote tally when stake deposited
        bool staked; // used to keep track of total stakers
        mapping(bytes32 => uint256) reportsSubmittedByQueryId; // mapping of queryId to number of reports submitted by reporter
    }

    // Events
    event NewReport(
        bytes32 indexed _queryId,
        uint256 indexed _time,
        bytes _value,
        uint256 _nonce,
        bytes _queryData,
        address indexed _reporter
    );
    event NewStakeAmount(uint256 _newStakeAmount);
    event NewStaker(address indexed _staker, uint256 indexed _amount);
    event ReporterSlashed(
        address indexed _reporter,
        address _recipient,
        uint256 _slashAmount
    );
    event StakeWithdrawn(address _staker);
    event StakeWithdrawRequested(address _staker, uint256 _amount);
    event ValueRemoved(bytes32 _queryId, uint256 _timestamp);

    // Functions
    /**
     * @dev Initializes system parameters
     * @param _token address of token used for staking and rewards
     * @param _reportingLock base amount of time (seconds) before reporter is able to report again
     * @param _stakeAmountDollarTarget fixed USD amount that stakeAmount targets on updateStakeAmount
     * @param _stakingTokenPrice current price of staking token in USD (18 decimals)
     * @param _stakingTokenPriceQueryId queryId where staking token price is reported
     */
    constructor(
        address _token,
        uint256 _reportingLock,
        uint256 _stakeAmountDollarTarget,
        uint256 _stakingTokenPrice,
        uint256 _minimumStakeAmount,
        bytes32 _stakingTokenPriceQueryId
    ) {
        require(_token != address(0), "must set token address");
        require(_stakingTokenPrice > 0, "must set staking token price");
        require(_reportingLock > 0, "must set reporting lock");
        require(_stakingTokenPriceQueryId != bytes32(0), "must set staking token price queryId");
        token = IERC20(_token);
        owner = msg.sender;
        reportingLock = _reportingLock;
        stakeAmountDollarTarget = _stakeAmountDollarTarget;
        minimumStakeAmount = _minimumStakeAmount;
        uint256 _potentialStakeAmount = (_stakeAmountDollarTarget * 1e18) / _stakingTokenPrice;
        if(_potentialStakeAmount < _minimumStakeAmount) {
            stakeAmount = _minimumStakeAmount;
        } else {
            stakeAmount = _potentialStakeAmount;
        }
        stakingTokenPriceQueryId = _stakingTokenPriceQueryId;
    }

    /**
     * @dev Allows the owner to initialize the governance (flex addy needed for governance deployment)
     * @param _governanceAddress address of governance contract (github.com/tellor-io/governance)
     */
    function init(address _governanceAddress) external {
        require(msg.sender == owner, "only owner can set governance address");
        require(governance == address(0), "governance address already set");
        require(
            _governanceAddress != address(0),
            "governance address can't be zero address"
        );
        governance = _governanceAddress;
    }

    /**
     * @dev Funds the Flex contract with staking rewards (paid by autopay and minting)
     * @param _amount amount of tokens to fund contract with
     */
    function addStakingRewards(uint256 _amount) external {
        require(token.transferFrom(msg.sender, address(this), _amount));
        _updateRewards();
        stakingRewardsBalance += _amount;
        // update reward rate = real staking rewards balance / 30 days
        rewardRate =
            (stakingRewardsBalance -
                ((accumulatedRewardPerShare * totalStakeAmount) /
                    1e18 -
                    totalRewardDebt)) /
            30 days;
    }

    /**
     * @dev Allows a reporter to submit stake
     * @param _amount amount of tokens to stake
     */
    function depositStake(uint256 _amount) external {
        require(governance != address(0), "governance address not set");
        StakeInfo storage _staker = stakerDetails[msg.sender];
        uint256 _stakedBalance = _staker.stakedBalance;
        uint256 _lockedBalance = _staker.lockedBalance;
        if (_lockedBalance > 0) {
            if (_lockedBalance >= _amount) {
                // if staker's locked balance covers full _amount, use that
                _staker.lockedBalance -= _amount;
                toWithdraw -= _amount;
            } else {
                // otherwise, stake the whole locked balance and transfer the
                // remaining amount from the staker's address
                require(
                    token.transferFrom(
                        msg.sender,
                        address(this),
                        _amount - _lockedBalance
                    )
                );
                toWithdraw -= _staker.lockedBalance;
                _staker.lockedBalance = 0;
            }
        } else {
            if (_stakedBalance == 0) {
                // if staked balance and locked balance equal 0, save current vote tally.
                // voting participation used for calculating rewards
                (bool _success, bytes memory _returnData) = governance.call(
                    abi.encodeWithSignature("getVoteCount()")
                );
                if (_success) {
                    _staker.startVoteCount = uint256(abi.decode(_returnData, (uint256)));
                }
                (_success,_returnData) = governance.call(
                    abi.encodeWithSignature("getVoteTallyByAddress(address)",msg.sender)
                );
                if(_success){
                    _staker.startVoteTally =  abi.decode(_returnData,(uint256));
                }
            }
            require(token.transferFrom(msg.sender, address(this), _amount));
        }
        _updateStakeAndPayRewards(msg.sender, _stakedBalance + _amount);
        _staker.startDate = block.timestamp; // This resets the staker start date to now
        emit NewStaker(msg.sender, _amount);
    }

    /**
     * @dev Removes a value from the oracle.
     * Note: this function is only callable by the Governance contract.
     * @param _queryId is ID of the specific data feed
     * @param _timestamp is the timestamp of the data value to remove
     */
    function removeValue(bytes32 _queryId, uint256 _timestamp) external {
        require(msg.sender == governance, "caller must be governance address");
        Report storage _report = reports[_queryId];
        require(!_report.isDisputed[_timestamp], "value already disputed");
        uint256 _index = _report.timestampIndex[_timestamp];
        require(_timestamp == _report.timestamps[_index], "invalid timestamp");
        _report.valueByTimestamp[_timestamp] = "";
        _report.isDisputed[_timestamp] = true;
        emit ValueRemoved(_queryId, _timestamp);
    }

    /**
     * @dev Allows a reporter to request to withdraw their stake
     * @param _amount amount of staked tokens requesting to withdraw
     */
    function requestStakingWithdraw(uint256 _amount) external {
        StakeInfo storage _staker = stakerDetails[msg.sender];
        require(
            _staker.stakedBalance >= _amount,
            "insufficient staked balance"
        );
        _updateStakeAndPayRewards(msg.sender, _staker.stakedBalance - _amount);
        _staker.startDate = block.timestamp;
        _staker.lockedBalance += _amount;
        toWithdraw += _amount;
        emit StakeWithdrawRequested(msg.sender, _amount);
    }

    /**
     * @dev Slashes a reporter and transfers their stake amount to the given recipient
     * Note: this function is only callable by the governance address.
     * @param _reporter is the address of the reporter being slashed
     * @param _recipient is the address receiving the reporter's stake
     * @return _slashAmount uint256 amount of token slashed and sent to recipient address
     */
    function slashReporter(address _reporter, address _recipient)
        external
        returns (uint256 _slashAmount)
    {
        require(msg.sender == governance, "only governance can slash reporter");
        StakeInfo storage _staker = stakerDetails[_reporter];
        uint256 _stakedBalance = _staker.stakedBalance;
        uint256 _lockedBalance = _staker.lockedBalance;
        require(_stakedBalance + _lockedBalance > 0, "zero staker balance");
        if (_lockedBalance >= stakeAmount) {
            // if locked balance is at least stakeAmount, slash from locked balance
            _slashAmount = stakeAmount;
            _staker.lockedBalance -= stakeAmount;
            toWithdraw -= stakeAmount;
        } else if (_lockedBalance + _stakedBalance >= stakeAmount) {
            // if locked balance + staked balance is at least stakeAmount,
            // slash from locked balance and slash remainder from staked balance
            _slashAmount = stakeAmount;
            _updateStakeAndPayRewards(
                _reporter,
                _stakedBalance - (stakeAmount - _lockedBalance)
            );
            toWithdraw -= _lockedBalance;
            _staker.lockedBalance = 0;
        } else {
            // if sum(locked balance + staked balance) is less than stakeAmount,
            // slash sum
            _slashAmount = _stakedBalance + _lockedBalance;
            toWithdraw -= _lockedBalance;
            _updateStakeAndPayRewards(_reporter, 0);
            _staker.lockedBalance = 0;
        }
        require(token.transfer(_recipient, _slashAmount));
        emit ReporterSlashed(_reporter, _recipient, _slashAmount);
    }

    /**
     * @dev Allows a reporter to submit a value to the oracle
     * @param _queryId is ID of the specific data feed. Equals keccak256(_queryData) for non-legacy IDs
     * @param _value is the value the user submits to the oracle
     * @param _nonce is the current value count for the query id
     * @param _queryData is the data used to fulfill the data query
     */
    function submitValue(
        bytes32 _queryId,
        bytes calldata _value,
        uint256 _nonce,
        bytes calldata _queryData
    ) external {
        require(keccak256(_value) != keccak256(""), "value must be submitted");
        Report storage _report = reports[_queryId];
        require(
            _nonce == _report.timestamps.length || _nonce == 0,
            "nonce must match timestamp index"
        );
        StakeInfo storage _staker = stakerDetails[msg.sender];
        require(
            _staker.stakedBalance >= stakeAmount,
            "balance must be greater than stake amount"
        );
        // Require reporter to abide by given reporting lock
        require(
            (block.timestamp - _staker.reporterLastTimestamp) * 1000 >
                (reportingLock * 1000) / (_staker.stakedBalance / stakeAmount),
            "still in reporter time lock, please wait!"
        );
        require(
            _queryId == keccak256(_queryData),
            "query id must be hash of query data"
        );
        _staker.reporterLastTimestamp = block.timestamp;
        // Checks for no double reporting of timestamps
        require(
            _report.reporterByTimestamp[block.timestamp] == address(0),
            "timestamp already reported for"
        );
        // Update number of timestamps, value for given timestamp, and reporter for timestamp
        _report.timestampIndex[block.timestamp] = _report.timestamps.length;
        _report.timestamps.push(block.timestamp);
        _report.timestampToBlockNum[block.timestamp] = block.number;
        _report.valueByTimestamp[block.timestamp] = _value;
        _report.reporterByTimestamp[block.timestamp] = msg.sender;
        // Disperse Time Based Reward
        uint256 _reward = ((block.timestamp - timeOfLastNewValue) * timeBasedReward) / 300; //.5 TRB per 5 minutes
        uint256 _totalTimeBasedRewardsBalance =
            token.balanceOf(address(this)) -
            (totalStakeAmount + stakingRewardsBalance + toWithdraw);
        if (_totalTimeBasedRewardsBalance > 0 && _reward > 0) {
            if (_totalTimeBasedRewardsBalance < _reward) {
                token.transfer(msg.sender, _totalTimeBasedRewardsBalance);
            } else {
                token.transfer(msg.sender, _reward);
            }
        }
        // Update last oracle value and number of values submitted by a reporter
        timeOfLastNewValue = block.timestamp;
        _staker.reportsSubmitted++;
        _staker.reportsSubmittedByQueryId[_queryId]++;
        emit NewReport(
            _queryId,
            block.timestamp,
            _value,
            _nonce,
            _queryData,
            msg.sender
        );
    }

    /**
     * @dev Updates the stake amount after retrieving the latest
     * 12+-hour-old staking token price from the oracle
     */
    function updateStakeAmount() external {
        // get staking token price
        (bool _valFound, bytes memory _val, ) = getDataBefore(
            stakingTokenPriceQueryId,
            block.timestamp - 12 hours
        );
        if (_valFound) {
            uint256 _stakingTokenPrice = abi.decode(_val, (uint256));
            require(
                _stakingTokenPrice >= 0.01 ether && _stakingTokenPrice < 1000000 ether,
                "invalid staking token price"
            );

            uint256 _adjustedStakeAmount = (stakeAmountDollarTarget * 1e18) / _stakingTokenPrice;
            if(_adjustedStakeAmount < minimumStakeAmount) {
                stakeAmount = minimumStakeAmount;
            } else {
                stakeAmount = _adjustedStakeAmount;
            }
            emit NewStakeAmount(stakeAmount);
        }
    }

    /**
     * @dev Withdraws a reporter's stake after the lock period expires
     */
    function withdrawStake() external {
        StakeInfo storage _staker = stakerDetails[msg.sender];
        // Ensure reporter is locked and that enough time has passed
        require(
            block.timestamp - _staker.startDate >= 7 days,
            "7 days didn't pass"
        );
        require(
            _staker.lockedBalance > 0,
            "reporter not locked for withdrawal"
        );
        require(token.transfer(msg.sender, _staker.lockedBalance));
        toWithdraw -= _staker.lockedBalance;
        _staker.lockedBalance = 0;
        emit StakeWithdrawn(msg.sender);
    }

    // *****************************************************************************
    // *                                                                           *
    // *                               Getters                                     *
    // *                                                                           *
    // *****************************************************************************

    /**
     * @dev Returns the block number at a given timestamp
     * @param _queryId is ID of the specific data feed
     * @param _timestamp is the timestamp to find the corresponding block number for
     * @return uint256 block number of the timestamp for the given data ID
     */
    function getBlockNumberByTimestamp(bytes32 _queryId, uint256 _timestamp)
        external
        view
        returns (uint256)
    {
        return reports[_queryId].timestampToBlockNum[_timestamp];
    }

    /**
     * @dev Returns the current value of a data feed given a specific ID
     * @param _queryId is the ID of the specific data feed
     * @return _value the latest submitted value for the given queryId
     */
    function getCurrentValue(bytes32 _queryId)
        external
        view
        returns (bytes memory _value)
    {
        bool _didGet;
        (_didGet, _value, ) = getDataBefore(_queryId, block.timestamp + 1);
        if(!_didGet){revert();}
    }

    /**
     * @dev Retrieves the latest value for the queryId before the specified timestamp
     * @param _queryId is the queryId to look up the value for
     * @param _timestamp before which to search for latest value
     * @return _ifRetrieve bool true if able to retrieve a non-zero value
     * @return _value the value retrieved
     * @return _timestampRetrieved the value's timestamp
     */
    function getDataBefore(bytes32 _queryId, uint256 _timestamp)
        public
        view
        returns (
            bool _ifRetrieve,
            bytes memory _value,
            uint256 _timestampRetrieved
        )
    {
        (bool _found, uint256 _index) = getIndexForDataBefore(
            _queryId,
            _timestamp
        );
        if (!_found) return (false, bytes(""), 0);
        _timestampRetrieved = getTimestampbyQueryIdandIndex(_queryId, _index);
        _value = retrieveData(_queryId, _timestampRetrieved);
        return (true, _value, _timestampRetrieved);
    }

    /**
     * @dev Returns governance address
     * @return address governance
     */
    function getGovernanceAddress() external view returns (address) {
        return governance;
    }

    /**
     * @dev Counts the number of values that have been submitted for the request.
     * @param _queryId the id to look up
     * @return uint256 count of the number of values received for the id
     */
    function getNewValueCountbyQueryId(bytes32 _queryId)
        public
        view
        returns (uint256)
    {
        return reports[_queryId].timestamps.length;
    }

    /**
     * @dev Returns the pending staking reward for a given address
     * @param _stakerAddress staker address to look up
     * @return _pendingReward - pending reward for given staker
     */
    function getPendingRewardByStaker(address _stakerAddress)
        external
        returns (uint256 _pendingReward)
    {
        StakeInfo storage _staker = stakerDetails[_stakerAddress];
        _pendingReward = (_staker.stakedBalance *
            _getUpdatedAccumulatedRewardPerShare()) /
            1e18 -
            _staker.rewardDebt;
        (bool _success, bytes memory _returnData) = governance.call(
            abi.encodeWithSignature("getVoteCount()")
        );
        uint256 _numberOfVotes;
        if (_success) {
                _numberOfVotes = uint256(abi.decode(_returnData, (uint256))) - _staker.startVoteCount;
        }
        if (_numberOfVotes > 0) {
                (_success,_returnData) = governance.call(
                    abi.encodeWithSignature("getVoteTallyByAddress(address)",_stakerAddress)
                );
                if(_success){
                    _pendingReward =
                        (_pendingReward * (abi.decode(_returnData,(uint256)) - _staker.startVoteTally)) 
                        / _numberOfVotes;
                }
        }
    }

    /**
     * @dev Returns the real staking rewards balance after accounting for unclaimed rewards
     * @return uint256 real staking rewards balance
     */
    function getRealStakingRewardsBalance() external view returns (uint256) {
        uint256 _pendingRewards = (_getUpdatedAccumulatedRewardPerShare() *
            totalStakeAmount) /
            1e18 -
            totalRewardDebt;
        return (stakingRewardsBalance - _pendingRewards);
    }

    /**
     * @dev Returns reporter address and whether a value was removed for a given queryId and timestamp
     * @param _queryId the id to look up
     * @param _timestamp is the timestamp of the value to look up
     * @return address reporter who submitted the value
     * @return bool true if the value was removed
     */
    function getReportDetails(bytes32 _queryId, uint256 _timestamp)
        external
        view
        returns (address, bool)
    {
        return (reports[_queryId].reporterByTimestamp[_timestamp], reports[_queryId].isDisputed[_timestamp]);
    }

    /**
     * @dev Returns the address of the reporter who submitted a value for a data ID at a specific time
     * @param _queryId is ID of the specific data feed
     * @param _timestamp is the timestamp to find a corresponding reporter for
     * @return address of the reporter who reported the value for the data ID at the given timestamp
     */
    function getReporterByTimestamp(bytes32 _queryId, uint256 _timestamp)
        external
        view
        returns (address)
    {
        return reports[_queryId].reporterByTimestamp[_timestamp];
    }

    /**
     * @dev Returns the timestamp of the reporter's last submission
     * @param _reporter is address of the reporter
     * @return uint256 timestamp of the reporter's last submission
     */
    function getReporterLastTimestamp(address _reporter)
        external
        view
        returns (uint256)
    {
        return stakerDetails[_reporter].reporterLastTimestamp;
    }

    /**
     * @dev Returns the reporting lock time, the amount of time a reporter must wait to submit again
     * @return uint256 reporting lock time
     */
    function getReportingLock() external view returns (uint256) {
        return reportingLock;
    }

    /**
     * @dev Returns the number of values submitted by a specific reporter address
     * @param _reporter is the address of a reporter
     * @return uint256 the number of values submitted by the given reporter
     */
    function getReportsSubmittedByAddress(address _reporter)
        external
        view
        returns (uint256)
    {
        return stakerDetails[_reporter].reportsSubmitted;
    }

    /**
     * @dev Returns the number of values submitted to a specific queryId by a specific reporter address
     * @param _reporter is the address of a reporter
     * @param _queryId is the ID of the specific data feed
     * @return uint256 the number of values submitted by the given reporter to the given queryId
     */
    function getReportsSubmittedByAddressAndQueryId(
        address _reporter,
        bytes32 _queryId
    ) external view returns (uint256) {
        return stakerDetails[_reporter].reportsSubmittedByQueryId[_queryId];
    }

    /**
     * @dev Returns amount required to report oracle values
     * @return uint256 stake amount
     */
    function getStakeAmount() external view returns (uint256) {
        return stakeAmount;
    }

    /**
     * @dev Returns all information about a staker
     * @param _stakerAddress address of staker inquiring about
     * @return uint startDate of staking
     * @return uint current amount staked
     * @return uint current amount locked for withdrawal
     * @return uint reward debt used to calculate staking rewards
     * @return uint reporter's last reported timestamp
     * @return uint total number of reports submitted by reporter
     * @return uint governance vote count when first staked
     * @return uint number of votes cast by staker when first staked
     * @return bool whether staker is counted in totalStakers
     */
    function getStakerInfo(address _stakerAddress)
        external
        view
        returns (
            uint256,
            uint256,
            uint256,
            uint256,
            uint256,
            uint256,
            uint256,
            uint256,
            bool
        )
    {
        StakeInfo storage _staker = stakerDetails[_stakerAddress];
        return (
            _staker.startDate,
            _staker.stakedBalance,
            _staker.lockedBalance,
            _staker.rewardDebt,
            _staker.reporterLastTimestamp,
            _staker.reportsSubmitted,
            _staker.startVoteCount,
            _staker.startVoteTally,
            _staker.staked
        );
    }

    /**
     * @dev Returns the timestamp for the last value of any ID from the oracle
     * @return uint256 timestamp of the last oracle value
     */
    function getTimeOfLastNewValue() external view returns (uint256) {
        return timeOfLastNewValue;
    }

    /**
     * @dev Gets the timestamp for the value based on their index
     * @param _queryId is the id to look up
     * @param _index is the value index to look up
     * @return uint256 timestamp
     */
    function getTimestampbyQueryIdandIndex(bytes32 _queryId, uint256 _index)
        public
        view
        returns (uint256)
    {
        return reports[_queryId].timestamps[_index];
    }

    /**
     * @dev Retrieves latest array index of data before the specified timestamp for the queryId
     * @param _queryId is the queryId to look up the index for
     * @param _timestamp is the timestamp before which to search for the latest index
     * @return _found whether the index was found
     * @return _index the latest index found before the specified timestamp
     */
    // slither-disable-next-line calls-loop
    function getIndexForDataBefore(bytes32 _queryId, uint256 _timestamp)
        public
        view
        returns (bool _found, uint256 _index)
    {
        uint256 _count = getNewValueCountbyQueryId(_queryId);
        if (_count > 0) {
            uint256 _middle;
            uint256 _start = 0;
            uint256 _end = _count - 1;
            uint256 _time;
            //Checking Boundaries to short-circuit the algorithm
            _time = getTimestampbyQueryIdandIndex(_queryId, _start);
            if (_time >= _timestamp) return (false, 0);
            _time = getTimestampbyQueryIdandIndex(_queryId, _end);
            if (_time < _timestamp) {
                while(isInDispute(_queryId, _time) && _end > 0) {
                    _end--;
                    _time = getTimestampbyQueryIdandIndex(_queryId, _end);
                }
                if(_end == 0 && isInDispute(_queryId, _time)) {
                    return (false, 0);
                }
                return (true, _end);
            }
            //Since the value is within our boundaries, do a binary search
            while (true) {
                _middle = (_end - _start) / 2 + 1 + _start;
                _time = getTimestampbyQueryIdandIndex(_queryId, _middle);
                if (_time < _timestamp) {
                    //get immediate next value
                    uint256 _nextTime = getTimestampbyQueryIdandIndex(
                        _queryId,
                        _middle + 1
                    );
                    if (_nextTime >= _timestamp) {
                        if(!isInDispute(_queryId, _time)) {
                            // _time is correct
                            return (true, _middle);
                        } else {
                            // iterate backwards until we find a non-disputed value
                            while(isInDispute(_queryId, _time) && _middle > 0) {
                                _middle--;
                                _time = getTimestampbyQueryIdandIndex(_queryId, _middle);
                            }
                            if(_middle == 0 && isInDispute(_queryId, _time)) {
                                return (false, 0);
                            }
                            // _time is correct
                            return (true, _middle);
                        }
                    } else {
                        //look from middle + 1(next value) to end
                        _start = _middle + 1;
                    }
                } else {
                    uint256 _prevTime = getTimestampbyQueryIdandIndex(
                        _queryId,
                        _middle - 1
                    );
                    if (_prevTime < _timestamp) {
                        if(!isInDispute(_queryId, _prevTime)) {
                            // _prevTime is correct
                            return (true, _middle - 1);
                        } else {
                            // iterate backwards until we find a non-disputed value
                            _middle--;
                            while(isInDispute(_queryId, _prevTime) && _middle > 0) {
                                _middle--;
                                _prevTime = getTimestampbyQueryIdandIndex(
                                    _queryId,
                                    _middle
                                );
                            }
                            if(_middle == 0 && isInDispute(_queryId, _prevTime)) {
                                return (false, 0);
                            }
                            // _prevtime is correct
                            return (true, _middle);
                        }
                    } else {
                        //look from start to middle -1(prev value)
                        _end = _middle - 1;
                    }
                }
            }
        }
        return (false, 0);
    }

    /**
     * @dev Returns the index of a reporter timestamp in the timestamp array for a specific data ID
     * @param _queryId is ID of the specific data feed
     * @param _timestamp is the timestamp to find in the timestamps array
     * @return uint256 of the index of the reporter timestamp in the array for specific ID
     */
    function getTimestampIndexByTimestamp(bytes32 _queryId, uint256 _timestamp)
        external
        view
        returns (uint256)
    {
        return reports[_queryId].timestampIndex[_timestamp];
    }

    /**
     * @dev Returns the address of the token used for staking
     * @return address of the token used for staking
     */
    function getTokenAddress() external view returns (address) {
        return address(token);
    }

    /**
     * @dev Returns total amount of token staked for reporting
     * @return uint256 total amount of token staked
     */
    function getTotalStakeAmount() external view returns (uint256) {
        return totalStakeAmount;
    }

    /**
     * @dev Returns total number of current stakers. Reporters with stakedBalance less than stakeAmount are excluded from this total
     * @return uint256 total stakers
     */
    function getTotalStakers() external view returns (uint256) {
        return totalStakers;
    }

    /**
     * @dev Returns total balance of time based rewards in contract
     * @return uint256 amount of trb
     */
    function getTotalTimeBasedRewardsBalance() external view returns (uint256) {
        return token.balanceOf(address(this)) - (totalStakeAmount + stakingRewardsBalance + toWithdraw);
    }

    /**
     * @dev Returns whether a given value is disputed
     * @param _queryId unique ID of the data feed
     * @param _timestamp timestamp of the value
     * @return bool whether the value is disputed
     */
    function isInDispute(bytes32 _queryId, uint256 _timestamp)
        public
        view
        returns (bool)
    {
        return reports[_queryId].isDisputed[_timestamp];
    }

    /**
     * @dev Retrieve value from oracle based on timestamp
     * @param _queryId being requested
     * @param _timestamp to retrieve data/value from
     * @return bytes value for timestamp submitted
     */
    function retrieveData(bytes32 _queryId, uint256 _timestamp)
        public
        view
        returns (bytes memory)
    {
        return reports[_queryId].valueByTimestamp[_timestamp];
    }

    /**
     * @dev Used during the upgrade process to verify valid Tellor contracts
     * @return bool value used to verify valid Tellor contracts
     */
    function verify() external pure returns (uint256) {
        return 9999;
    }

    // *****************************************************************************
    // *                                                                           *
    // *                          Internal functions                               *
    // *                                                                           *
    // *****************************************************************************

    /**
     * @dev Updates accumulated staking rewards per staked token
     */
    function _updateRewards() internal {
        if (timeOfLastAllocation == block.timestamp) {
            return;
        }
        if (totalStakeAmount == 0 || rewardRate == 0) {
            timeOfLastAllocation = block.timestamp;
            return;
        }
        // calculate accumulated reward per token staked
        uint256 _newAccumulatedRewardPerShare = accumulatedRewardPerShare +
            ((block.timestamp - timeOfLastAllocation) * rewardRate * 1e18) /
            totalStakeAmount;
        // calculate accumulated reward with _newAccumulatedRewardPerShare
        uint256 _accumulatedReward = (_newAccumulatedRewardPerShare *
            totalStakeAmount) /
            1e18 -
            totalRewardDebt;
        if (_accumulatedReward >= stakingRewardsBalance) {
            // if staking rewards run out, calculate remaining reward per staked
            // token and set rewardRate to 0
            uint256 _newPendingRewards = stakingRewardsBalance -
                ((accumulatedRewardPerShare * totalStakeAmount) /
                    1e18 -
                    totalRewardDebt);
            accumulatedRewardPerShare +=
                (_newPendingRewards * 1e18) /
                totalStakeAmount;
            rewardRate = 0;
        } else {
            accumulatedRewardPerShare = _newAccumulatedRewardPerShare;
        }
        timeOfLastAllocation = block.timestamp;
    }

    /**
     * @dev Called whenever a user's stake amount changes. First updates staking rewards,
     * transfers pending rewards to user's address, and finally updates user's stake amount
     * and other relevant variables.
     * @param _stakerAddress address of user whose stake is being updated
     * @param _newStakedBalance new staked balance of user
     */
    function _updateStakeAndPayRewards(
        address _stakerAddress,
        uint256 _newStakedBalance
    ) internal {
        _updateRewards();
        StakeInfo storage _staker = stakerDetails[_stakerAddress];
        if (_staker.stakedBalance > 0) {
            // if address already has a staked balance, calculate and transfer pending rewards
            uint256 _pendingReward = (_staker.stakedBalance *
                accumulatedRewardPerShare) /
                1e18 -
                _staker.rewardDebt;
            // get staker voting participation rate
            uint256 _numberOfVotes;
            (bool _success, bytes memory _returnData) = governance.call(
                abi.encodeWithSignature("getVoteCount()")
            );
            if (_success) {
                _numberOfVotes =
                    uint256(abi.decode(_returnData, (uint256))) -
                    _staker.startVoteCount;
            }
            if (_numberOfVotes > 0) {
                // staking reward = pending reward * voting participation rate
                (_success, _returnData) = governance.call(
                    abi.encodeWithSignature("getVoteTallyByAddress(address)",_stakerAddress)
                );
                if(_success){
                    uint256 _voteTally = abi.decode(_returnData,(uint256));
                    uint256 _tempPendingReward =
                        (_pendingReward *
                            (_voteTally - _staker.startVoteTally)) /
                        _numberOfVotes;
                    if (_tempPendingReward < _pendingReward) {
                        _pendingReward = _tempPendingReward;
                    }
                }
            }
            stakingRewardsBalance -= _pendingReward;
            require(token.transfer(msg.sender, _pendingReward));
            totalRewardDebt -= _staker.rewardDebt;
            totalStakeAmount -= _staker.stakedBalance;
        }
        _staker.stakedBalance = _newStakedBalance;
        // Update total stakers
        if (_staker.stakedBalance >= stakeAmount) {
            if (_staker.staked == false) {
                totalStakers++;
            }
            _staker.staked = true;
        } else {
            if (_staker.staked == true && totalStakers > 0) {
                totalStakers--;
            }
            _staker.staked = false;
        }
        // tracks rewards accumulated before stake amount updated
        _staker.rewardDebt =
            (_staker.stakedBalance * accumulatedRewardPerShare) /
            1e18;
        totalRewardDebt += _staker.rewardDebt;
        totalStakeAmount += _staker.stakedBalance;
        // update reward rate if staking rewards are available 
        // given staker's updated parameters
        if(rewardRate == 0) {
            rewardRate =
            (stakingRewardsBalance -
                ((accumulatedRewardPerShare * totalStakeAmount) /
                    1e18 -
                    totalRewardDebt)) /
            30 days;
        }
    }

    /**
     * @dev Internal function retrieves updated accumulatedRewardPerShare
     * @return uint256 up-to-date accumulated reward per share
     */
    function _getUpdatedAccumulatedRewardPerShare()
        internal
        view
        returns (uint256)
    {
        if (totalStakeAmount == 0) {
            return accumulatedRewardPerShare;
        }
        uint256 _newAccumulatedRewardPerShare = accumulatedRewardPerShare +
            ((block.timestamp - timeOfLastAllocation) * rewardRate * 1e18) /
            totalStakeAmount;
        uint256 _accumulatedReward = (_newAccumulatedRewardPerShare *
            totalStakeAmount) /
            1e18 -
            totalRewardDebt;
        if (_accumulatedReward >= stakingRewardsBalance) {
            uint256 _newPendingRewards = stakingRewardsBalance -
                ((accumulatedRewardPerShare * totalStakeAmount) /
                    1e18 -
                    totalRewardDebt);
            _newAccumulatedRewardPerShare =
                accumulatedRewardPerShare +
                (_newPendingRewards * 1e18) /
                totalStakeAmount;
        }
        return _newAccumulatedRewardPerShare;
    }
}

Contract ABI

[{"inputs":[{"internalType":"address","name":"_token","type":"address"},{"internalType":"uint256","name":"_reportingLock","type":"uint256"},{"internalType":"uint256","name":"_stakeAmountDollarTarget","type":"uint256"},{"internalType":"uint256","name":"_stakingTokenPrice","type":"uint256"},{"internalType":"uint256","name":"_minimumStakeAmount","type":"uint256"},{"internalType":"bytes32","name":"_stakingTokenPriceQueryId","type":"bytes32"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"_queryId","type":"bytes32"},{"indexed":true,"internalType":"uint256","name":"_time","type":"uint256"},{"indexed":false,"internalType":"bytes","name":"_value","type":"bytes"},{"indexed":false,"internalType":"uint256","name":"_nonce","type":"uint256"},{"indexed":false,"internalType":"bytes","name":"_queryData","type":"bytes"},{"indexed":true,"internalType":"address","name":"_reporter","type":"address"}],"name":"NewReport","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"_newStakeAmount","type":"uint256"}],"name":"NewStakeAmount","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"_staker","type":"address"},{"indexed":true,"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"NewStaker","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"_reporter","type":"address"},{"indexed":false,"internalType":"address","name":"_recipient","type":"address"},{"indexed":false,"internalType":"uint256","name":"_slashAmount","type":"uint256"}],"name":"ReporterSlashed","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"_staker","type":"address"},{"indexed":false,"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"StakeWithdrawRequested","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"_staker","type":"address"}],"name":"StakeWithdrawn","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"bytes32","name":"_queryId","type":"bytes32"},{"indexed":false,"internalType":"uint256","name":"_timestamp","type":"uint256"}],"name":"ValueRemoved","type":"event"},{"inputs":[],"name":"accumulatedRewardPerShare","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"addStakingRewards","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"depositStake","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"_queryId","type":"bytes32"},{"internalType":"uint256","name":"_timestamp","type":"uint256"}],"name":"getBlockNumberByTimestamp","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"_queryId","type":"bytes32"}],"name":"getCurrentValue","outputs":[{"internalType":"bytes","name":"_value","type":"bytes"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"_queryId","type":"bytes32"},{"internalType":"uint256","name":"_timestamp","type":"uint256"}],"name":"getDataBefore","outputs":[{"internalType":"bool","name":"_ifRetrieve","type":"bool"},{"internalType":"bytes","name":"_value","type":"bytes"},{"internalType":"uint256","name":"_timestampRetrieved","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getGovernanceAddress","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"_queryId","type":"bytes32"},{"internalType":"uint256","name":"_timestamp","type":"uint256"}],"name":"getIndexForDataBefore","outputs":[{"internalType":"bool","name":"_found","type":"bool"},{"internalType":"uint256","name":"_index","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"_queryId","type":"bytes32"}],"name":"getNewValueCountbyQueryId","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_stakerAddress","type":"address"}],"name":"getPendingRewardByStaker","outputs":[{"internalType":"uint256","name":"_pendingReward","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"getRealStakingRewardsBalance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"_queryId","type":"bytes32"},{"internalType":"uint256","name":"_timestamp","type":"uint256"}],"name":"getReportDetails","outputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"_queryId","type":"bytes32"},{"internalType":"uint256","name":"_timestamp","type":"uint256"}],"name":"getReporterByTimestamp","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_reporter","type":"address"}],"name":"getReporterLastTimestamp","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getReportingLock","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_reporter","type":"address"}],"name":"getReportsSubmittedByAddress","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_reporter","type":"address"},{"internalType":"bytes32","name":"_queryId","type":"bytes32"}],"name":"getReportsSubmittedByAddressAndQueryId","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getStakeAmount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_stakerAddress","type":"address"}],"name":"getStakerInfo","outputs":[{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getTimeOfLastNewValue","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"_queryId","type":"bytes32"},{"internalType":"uint256","name":"_timestamp","type":"uint256"}],"name":"getTimestampIndexByTimestamp","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"_queryId","type":"bytes32"},{"internalType":"uint256","name":"_index","type":"uint256"}],"name":"getTimestampbyQueryIdandIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getTokenAddress","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getTotalStakeAmount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getTotalStakers","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getTotalTimeBasedRewardsBalance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"governance","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_governanceAddress","type":"address"}],"name":"init","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"_queryId","type":"bytes32"},{"internalType":"uint256","name":"_timestamp","type":"uint256"}],"name":"isInDispute","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"minimumStakeAmount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"_queryId","type":"bytes32"},{"internalType":"uint256","name":"_timestamp","type":"uint256"}],"name":"removeValue","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"reportingLock","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"requestStakingWithdraw","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"_queryId","type":"bytes32"},{"internalType":"uint256","name":"_timestamp","type":"uint256"}],"name":"retrieveData","outputs":[{"internalType":"bytes","name":"","type":"bytes"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"rewardRate","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_reporter","type":"address"},{"internalType":"address","name":"_recipient","type":"address"}],"name":"slashReporter","outputs":[{"internalType":"uint256","name":"_slashAmount","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"stakeAmount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"stakeAmountDollarTarget","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"stakingRewardsBalance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"stakingTokenPriceQueryId","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"_queryId","type":"bytes32"},{"internalType":"bytes","name":"_value","type":"bytes"},{"internalType":"uint256","name":"_nonce","type":"uint256"},{"internalType":"bytes","name":"_queryData","type":"bytes"}],"name":"submitValue","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"timeBasedReward","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"timeOfLastAllocation","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"timeOfLastNewValue","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"toWithdraw","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"token","outputs":[{"internalType":"contract IERC20","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalRewardDebt","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalStakeAmount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalStakers","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"updateStakeAmount","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"verify","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"pure","type":"function"},{"inputs":[],"name":"withdrawStake","outputs":[],"stateMutability":"nonpayable","type":"function"}]

60806040526706f05b59d3b20000600b5542600d553480156200002157600080fd5b506040516200331438038062003314833981016040819052620000449162000223565b6001600160a01b038616620000a05760405162461bcd60e51b815260206004820152601660248201527f6d7573742073657420746f6b656e20616464726573730000000000000000000060448201526064015b60405180910390fd5b60008311620000f25760405162461bcd60e51b815260206004820152601c60248201527f6d75737420736574207374616b696e6720746f6b656e20707269636500000000604482015260640162000097565b60008511620001445760405162461bcd60e51b815260206004820152601760248201527f6d75737420736574207265706f7274696e67206c6f636b000000000000000000604482015260640162000097565b806200019f5760405162461bcd60e51b8152602060048201526024808201527f6d75737420736574207374616b696e6720746f6b656e207072696365207175656044820152631c9e525960e21b606482015260840162000097565b600080546001600160a01b0388166001600160a01b0319918216178255600280549091163317905560058690556008859055600483905583620001eb86670de0b6b3a7640000620002a3565b620001f7919062000282565b9050828110156200020d57600783905562000213565b60078190555b50600a5550620002cf9350505050565b60008060008060008060c087890312156200023c578182fd5b86516001600160a01b038116811462000253578283fd5b6020880151604089015160608a015160808b015160a0909b0151939c929b509099909850965090945092505050565b6000826200029e57634e487b7160e01b81526012600452602481fd5b500490565b6000816000190483118215151615620002ca57634e487b7160e01b81526011600452602481fd5b500290565b61303580620002df6000396000f3fe608060405234801561001057600080fd5b50600436106103575760003560e01c806373252494116101c8578063adf1639d11610104578063ce5e11bf116100a2578063d9c51cd41161007c578063d9c51cd4146107fe578063e07c548614610811578063fc0c546a14610849578063fc735e991461085c57610357565b8063ce5e11bf146107da578063cecb0647146107ed578063d75174e1146107f657610357565b8063c0d416b8116100de578063c0d416b8146107a3578063c0f95d52146107ac578063c5958af9146107b4578063cb82cc8f146107c757610357565b8063adf1639d14610768578063bed9d86114610788578063bf5745d61461079057610357565b80638929f4c61161017157806394409a561161014b57806394409a561461070557806396426d971461070e5780639d9b16ed14610717578063a792765f1461074657610357565b80638929f4c6146106b05780638da5cb5b146106c3578063935408d0146106d657610357565b80637b0a47ee116101a25780637b0a47ee1461069557806383bb38771461069e57806386989038146106a757610357565b806373252494146105b8578063733bdef0146105c957806377b03e0d1461067557610357565b80633a0ce342116102975780635b5edcfc116102405780636b036f451161021a5780636b036f45146105965780636dd0a70f1461059f5780636fd4f229146105a7578063722580b6146105b057610357565b80635b5edcfc146105675780635eaa9ced1461057a57806360c7dc471461058d57610357565b80634dfc2a34116102715780634dfc2a341461051557806350005b83146105285780635aa6e6751461055457610357565b80633a0ce342146104c357806344e87f91146104cb578063460c33a21461050d57610357565b80632b6696a7116103045780633321fc41116102de5780633321fc4114610495578063347f23361461049e57806336d42195146104a75780633878293e146104b057610357565b80632b6696a7146104195780632e206cd71461048457806331ed0db41461048d57610357565b806314c2a1bc1161033557806314c2a1bc146103d257806319ab453c146103da57806329449085146103ef57610357565b806304d932e21461035c57806310fe9ae81461037857806311938e0814610398575b600080fd5b61036560095481565b6040519081526020015b60405180910390f35b610380610864565b6040516001600160a01b03909116815260200161036f565b6103656103a6366004612cd1565b6001600160a01b0391909116600090815260136020908152604080832093835260099093019052205490565b600f54610365565b6103ed6103e8366004612c7e565b610874565b005b6104026103fd366004612db2565b6109c3565b60408051921515835260208301919091520161036f565b610465610427366004612db2565b6000918252601260209081526040808420928452600483018252808420546005909301909152909120546001600160a01b039091169160ff90911690565b604080516001600160a01b03909316835290151560208301520161036f565b610365600c5481565b601054610365565b61036560055481565b61036560115481565b61036560035481565b6103656104be366004612c7e565b610d15565b6103ed610d37565b6104fd6104d9366004612db2565b60009182526012602090815260408084209284526005909201905290205460ff1690565b604051901515815260200161036f565b600554610365565b610365610523366004612c9f565b610e5f565b610365610536366004612c7e565b6001600160a01b031660009081526013602052604090206004015490565b600154610380906001600160a01b031681565b6103ed610575366004612db2565b6110f0565b6103ed610588366004612d32565b6112c4565b61036560075481565b61036560045481565b6103656118af565b610365600d5481565b600754610365565b6001546001600160a01b0316610380565b61062f6105d7366004612c7e565b6001600160a01b0316600090815260136020526040902080546001820154600283015460038401546004850154600586015460068701546007880154600890980154969895979496939592949193909260ff90911690565b60408051998a5260208a0198909852968801959095526060870193909352608086019190915260a085015260c084015260e083015215156101008201526101200161036f565b610365610683366004612d1a565b60009081526012602052604090205490565b61036560065481565b610365600e5481565b61036560105481565b6103ed6106be366004612d1a565b6118fd565b600254610380906001600160a01b031681565b6103656106e4366004612db2565b60009182526012602090815260408084209284526002909201905290205490565b610365600f5481565b610365600b5481565b610365610725366004612db2565b60009182526012602090815260408084209284526001909201905290205490565b610759610754366004612db2565b6119e9565b60405161036f93929190612e6d565b61077b610776366004612d1a565b611a4c565b60405161036f9190612ed1565b6103ed611a74565b61036561079e366004612c7e565b611c21565b61036560085481565b600d54610365565b61077b6107c2366004612db2565b611e19565b6103ed6107d5366004612d1a565b611eca565b6103656107e8366004612db2565b61229b565b610365600a5481565b6103656122dc565b6103ed61080c366004612d1a565b612385565b61038061081f366004612db2565b6000918252601260209081526040808420928452600490920190529020546001600160a01b031690565b600054610380906001600160a01b031681565b61270f610365565b6000546001600160a01b03165b90565b6002546001600160a01b031633146108e15760405162461bcd60e51b815260206004820152602560248201527f6f6e6c79206f776e65722063616e2073657420676f7665726e616e6365206164604482015264647265737360d81b60648201526084015b60405180910390fd5b6001546001600160a01b03161561093a5760405162461bcd60e51b815260206004820152601e60248201527f676f7665726e616e6365206164647265737320616c726561647920736574000060448201526064016108d8565b6001600160a01b0381166109a15760405162461bcd60e51b815260206004820152602860248201527f676f7665726e616e636520616464726573732063616e2774206265207a65726f604482015267206164647265737360c01b60648201526084016108d8565b600180546001600160a01b0319166001600160a01b0392909216919091179055565b60008281526012602052604081205481908015610d0557600080806109e9600185612f3b565b905060006109f7898461229b565b9050878110610a1157600080965096505050505050610d0e565b610a1b898361229b565b905087811015610ac5575b600089815260126020908152604080832084845260050190915290205460ff168015610a525750600082115b15610a755781610a6181612f82565b925050610a6e898361229b565b9050610a26565b81158015610a9f5750600089815260126020908152604080832084845260050190915290205460ff165b15610ab557600080965096505050505050610d0e565b50600195509350610d0e92505050565b826002610ad28285612f3b565b610adc9190612efc565b610ae7906001612ee4565b610af19190612ee4565b9350610afd898561229b565b905087811015610c0c576000610b188a6107e8876001612ee4565b9050888110610bf95760008a815260126020908152604080832085845260050190915290205460ff16610b575760018597509750505050505050610d0e565b60008a815260126020908152604080832085845260050190915290205460ff168015610b835750600085115b15610ba65784610b9281612f82565b955050610b9f8a8661229b565b9150610b57565b84158015610bd0575060008a815260126020908152604080832085845260050190915290205460ff165b15610be75760008097509750505050505050610d0e565b60018597509750505050505050610d0e565b610c04856001612ee4565b935050610d00565b6000610c1d8a6107e8600188612f3b565b905088811015610cf15760008a815260126020908152604080832084845260050190915290205460ff16610c66576001610c578187612f3b565b97509750505050505050610d0e565b84610c7081612f82565b9550505b60008a815260126020908152604080832084845260050190915290205460ff168015610ca05750600085115b15610cc35784610caf81612f82565b955050610cbc8a8661229b565b9050610c74565b84158015610bd0575060008a815260126020908152604080832084845260050190915290205460ff16610bd0565b610cfc600186612f3b565b9250505b610ac5565b60008092509250505b9250929050565b6001600160a01b0381166000908152601360205260409020600501545b919050565b600080610d4e600a5461a8c0426107549190612f3b565b50915091508115610e5b57600081806020019051810190610d6f9190612dd3565b9050662386f26fc100008110158015610d91575069d3c21bcecceda100000081105b610ddd5760405162461bcd60e51b815260206004820152601b60248201527f696e76616c6964207374616b696e6720746f6b656e207072696365000000000060448201526064016108d8565b600081600854670de0b6b3a7640000610df69190612f1c565b610e009190612efc565b9050600454811015610e1757600454600755610e1d565b60078190555b7f1af37d6aaef3c5ef293c3c63d0ac302f60db7fde22eb9f5e96ebd56992832110600754604051610e5091815260200190565b60405180910390a150505b5050565b6001546000906001600160a01b03163314610ec75760405162461bcd60e51b815260206004820152602260248201527f6f6e6c7920676f7665726e616e63652063616e20736c617368207265706f727460448201526132b960f11b60648201526084016108d8565b6001600160a01b0383166000908152601360205260408120600181015460028201549192909190610ef88284612ee4565b11610f3b5760405162461bcd60e51b81526020600482015260136024820152727a65726f207374616b65722062616c616e636560681b60448201526064016108d8565b6007548110610f84576007549350600754836002016000828254610f5f9190612f3b565b909155505060075460118054600090610f79908490612f3b565b909155506110129050565b600754610f918383612ee4565b10610fdb576007549350610fb886610fa98387612f3b565b610fb39085612f3b565b61248a565b8060116000828254610fca9190612f3b565b909155505060006002840155611012565b610fe58183612ee4565b93508060116000828254610ff99190612f3b565b9091555061100a905086600061248a565b600060028401555b60005460405163a9059cbb60e01b81526001600160a01b038781166004830152602482018790529091169063a9059cbb90604401602060405180830381600087803b15801561106057600080fd5b505af1158015611074573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906110989190612cfa565b6110a157600080fd5b604080516001600160a01b038781168252602082018790528816917f4317784407a22e643706ef000f5c0eea399dea3632613786167ab71c9446e3ac910160405180910390a250505092915050565b6001546001600160a01b031633146111545760405162461bcd60e51b815260206004820152602160248201527f63616c6c6572206d75737420626520676f7665726e616e6365206164647265736044820152607360f81b60648201526084016108d8565b6000828152601260209081526040808320848452600581019092529091205460ff16156111c35760405162461bcd60e51b815260206004820152601660248201527f76616c756520616c72656164792064697370757465640000000000000000000060448201526064016108d8565b600082815260018201602052604090205481548290829081106111f657634e487b7160e01b600052603260045260246000fd5b906000526020600020015483146112435760405162461bcd60e51b81526020600482015260116024820152700696e76616c69642074696d657374616d7607c1b60448201526064016108d8565b604080516020808201808452600080845287815260038701909252929020905161126d9290612b1a565b50600083815260058301602052604090819020805460ff19166001179055517fb326db0e54476c677e2b35b75856ac6f4d8bbfb0a6de6690582ebe4dabce0de790610e509086908690918252602082015260400190565b7fc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a47085856040516112f5929190612e41565b6040518091039020141561134b5760405162461bcd60e51b815260206004820152601760248201527f76616c7565206d757374206265207375626d697474656400000000000000000060448201526064016108d8565b60008681526012602052604090208054841480611366575083155b6113b25760405162461bcd60e51b815260206004820181905260248201527f6e6f6e6365206d757374206d617463682074696d657374616d7020696e64657860448201526064016108d8565b336000908152601360205260409020600754600182015410156114295760405162461bcd60e51b815260206004820152602960248201527f62616c616e6365206d7573742062652067726561746572207468616e207374616044820152681ad948185b5bdd5b9d60ba1b60648201526084016108d8565b600754816001015461143b9190612efc565b60055461144a906103e8612f1c565b6114549190612efc565b60048201546114639042612f3b565b61146f906103e8612f1c565b116114ce5760405162461bcd60e51b815260206004820152602960248201527f7374696c6c20696e207265706f727465722074696d65206c6f636b2c20706c6560448201526861736520776169742160b81b60648201526084016108d8565b83836040516114de929190612e41565b604051809103902088146115405760405162461bcd60e51b815260206004820152602360248201527f7175657279206964206d7573742062652068617368206f66207175657279206460448201526261746160e81b60648201526084016108d8565b4260048083018290556000918252830160205260409020546001600160a01b0316156115ae5760405162461bcd60e51b815260206004820152601e60248201527f74696d657374616d7020616c7265616479207265706f7274656420666f72000060448201526064016108d8565b815442600081815260018086016020908152604080842086905591850187558683528083209094018390559181526002850183528181204390556003850190925290206115fc908888612b9e565b50426000818152600484016020526040812080546001600160a01b03191633179055600b54600d54919261012c9261163391612f3b565b61163d9190612f1c565b6116479190612efc565b90506000601154600954600f5461165e9190612ee4565b6116689190612ee4565b6000546040516370a0823160e01b81523060048201526001600160a01b03909116906370a082319060240160206040518083038186803b1580156116ab57600080fd5b505afa1580156116bf573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906116e39190612dd3565b6116ed9190612f3b565b90506000811180156116ff5750600082115b1561181c57818110156117965760005460405163a9059cbb60e01b8152336004820152602481018390526001600160a01b039091169063a9059cbb90604401602060405180830381600087803b15801561175857600080fd5b505af115801561176c573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906117909190612cfa565b5061181c565b60005460405163a9059cbb60e01b8152336004820152602481018490526001600160a01b039091169063a9059cbb90604401602060405180830381600087803b1580156117e257600080fd5b505af11580156117f6573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061181a9190612cfa565b505b42600d5560058301805490600061183283612fce565b909155505060008a8152600984016020526040812080549161185383612fce565b9190505550336001600160a01b0316428b7f48e9e2c732ba278de6ac88a3a57a5c5ba13d3d8370e709b3b98333a57876ca958c8c8c8c8c60405161189b959493929190612e98565b60405180910390a450505050505050505050565b600080600e54670de0b6b3a7640000600f546118c96128c3565b6118d39190612f1c565b6118dd9190612efc565b6118e79190612f3b565b9050806009546118f79190612f3b565b91505090565b33600090815260136020526040902060018101548211156119605760405162461bcd60e51b815260206004820152601b60248201527f696e73756666696369656e74207374616b65642062616c616e6365000000000060448201526064016108d8565b61197433838360010154610fb39190612f3b565b42815560028101805483919060009061198e908490612ee4565b9250508190555081601160008282546119a79190612ee4565b909155505060408051338152602081018490527f3d8d9df4bd0172df32e557fa48e96435cd7f2cac06aaffacfaee608e6f7898ef910160405180910390a15050565b6000606060008060006119fc87876109c3565b9150915081611a265760006040518060200160405280600081525060009450945094505050611a45565b611a30878261229b565b9250611a3c8784611e19565b93506001945050505b9250925092565b60606000611a5f83610754426001612ee4565b509250905080611a6e57600080fd5b50919050565b336000908152601360205260409020805462093a8090611a949042612f3b565b1015611ad75760405162461bcd60e51b8152602060048201526012602482015271372064617973206469646e2774207061737360701b60448201526064016108d8565b6000816002015411611b365760405162461bcd60e51b815260206004820152602260248201527f7265706f72746572206e6f74206c6f636b656420666f72207769746864726177604482015261185b60f21b60648201526084016108d8565b600054600282015460405163a9059cbb60e01b815233600482015260248101919091526001600160a01b039091169063a9059cbb90604401602060405180830381600087803b158015611b8857600080fd5b505af1158015611b9c573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611bc09190612cfa565b611bc957600080fd5b806002015460116000828254611bdf9190612f3b565b9091555050600060028201556040513381527f4a7934670bd8304e7da22378be1368f7c4fef17c5aee81804beda8638fe428ec9060200160405180910390a150565b6001600160a01b03811660009081526013602052604081206003810154670de0b6b3a7640000611c4f6128c3565b8360010154611c5e9190612f1c565b611c689190612efc565b611c729190612f3b565b60015460408051600481526024810182526020810180516001600160e01b03166339ecce1f60e21b179052905192945060009283926001600160a01b031691611cba91612e51565b6000604051808303816000865af19150503d8060008114611cf7576040519150601f19603f3d011682016040523d82523d6000602084013e611cfc565b606091505b509150915060008215611d2f57836006015482806020019051810190611d229190612dd3565b611d2c9190612f3b565b90505b8015611e10576001546040516001600160a01b0388811660248301529091169060440160408051601f198184030181529181526020820180516001600160e01b03166317b8fb3b60e31b17905251611d879190612e51565b6000604051808303816000865af19150503d8060008114611dc4576040519150601f19603f3d011682016040523d82523d6000602084013e611dc9565b606091505b5090935091508215611e105780846007015483806020019051810190611def9190612dd3565b611df99190612f3b565b611e039087612f1c565b611e0d9190612efc565b94505b50505050919050565b60008281526012602090815260408083208484526003019091529020805460609190611e4490612f99565b80601f0160208091040260200160405190810160405280929190818152602001828054611e7090612f99565b8015611ebd5780601f10611e9257610100808354040283529160200191611ebd565b820191906000526020600020905b815481529060010190602001808311611ea057829003601f168201915b5050505050905092915050565b6001546001600160a01b0316611f225760405162461bcd60e51b815260206004820152601a60248201527f676f7665726e616e63652061646472657373206e6f742073657400000000000060448201526064016108d8565b33600090815260136020526040902060018101546002820154801561205557838110611f805783836002016000828254611f5c9190612f3b565b925050819055508360116000828254611f759190612f3b565b909155506120509050565b6000546001600160a01b03166323b872dd3330611f9d8589612f3b565b6040516001600160e01b031960e086901b1681526001600160a01b0393841660048201529290911660248301526044820152606401602060405180830381600087803b158015611fec57600080fd5b505af1158015612000573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906120249190612cfa565b61202d57600080fd5b8260020154601160008282546120439190612f3b565b9091555050600060028401555b612257565b816121c45760015460408051600481526024810182526020810180516001600160e01b03166339ecce1f60e21b179052905160009283926001600160a01b03909116916120a29190612e51565b6000604051808303816000865af19150503d80600081146120df576040519150601f19603f3d011682016040523d82523d6000602084013e6120e4565b606091505b5091509150811561210957808060200190518101906121039190612dd3565b60068601555b6001546040513360248201526001600160a01b039091169060440160408051601f198184030181529181526020820180516001600160e01b03166317b8fb3b60e31b179052516121599190612e51565b6000604051808303816000865af19150503d8060008114612196576040519150601f19603f3d011682016040523d82523d6000602084013e61219b565b606091505b50909250905081156121c157808060200190518101906121bb9190612dd3565b60078601555b50505b6000546040516323b872dd60e01b8152336004820152306024820152604481018690526001600160a01b03909116906323b872dd90606401602060405180830381600087803b15801561221657600080fd5b505af115801561222a573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061224e9190612cfa565b61225757600080fd5b61226533610fb38685612ee4565b428355604051849033907fa96c2cce65119a2170d1711a6e82f18f2006448828483ba7545e59547654364790600090a350505050565b60008281526012602052604081208054839081106122c957634e487b7160e01b600052603260045260246000fd5b9060005260206000200154905092915050565b6000601154600954600f546122f19190612ee4565b6122fb9190612ee4565b6000546040516370a0823160e01b81523060048201526001600160a01b03909116906370a082319060240160206040518083038186803b15801561233e57600080fd5b505afa158015612352573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906123769190612dd3565b6123809190612f3b565b905090565b6000546040516323b872dd60e01b8152336004820152306024820152604481018390526001600160a01b03909116906323b872dd90606401602060405180830381600087803b1580156123d757600080fd5b505af11580156123eb573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061240f9190612cfa565b61241857600080fd5b6124206129d7565b80600960008282546124329190612ee4565b9250508190555062278d00600e54670de0b6b3a7640000600f546003546124599190612f1c565b6124639190612efc565b61246d9190612f3b565b60095461247a9190612f3b565b6124849190612efc565b60065550565b6124926129d7565b6001600160a01b03821660009081526013602052604090206001810154156127805760008160030154670de0b6b3a764000060035484600101546124d69190612f1c565b6124e09190612efc565b6124ea9190612f3b565b60015460408051600481526024810182526020810180516001600160e01b03166339ecce1f60e21b1790529051929350600092839283926001600160a01b03909116916125379190612e51565b6000604051808303816000865af19150503d8060008114612574576040519150601f19603f3d011682016040523d82523d6000602084013e612579565b606091505b509150915081156125aa5784600601548180602001905181019061259d9190612dd3565b6125a79190612f3b565b92505b82156126a0576001546040516001600160a01b0389811660248301529091169060440160408051601f198184030181529181526020820180516001600160e01b03166317b8fb3b60e31b179052516126029190612e51565b6000604051808303816000865af19150503d806000811461263f576040519150601f19603f3d011682016040523d82523d6000602084013e612644565b606091505b50909250905081156126a0576000818060200190518101906126669190612dd3565b905060008487600701548361267b9190612f3b565b6126859088612f1c565b61268f9190612efc565b90508581101561269d578095505b50505b83600960008282546126b29190612f3b565b909155505060005460405163a9059cbb60e01b8152336004820152602481018690526001600160a01b039091169063a9059cbb90604401602060405180830381600087803b15801561270357600080fd5b505af1158015612717573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061273b9190612cfa565b61274457600080fd5b8460030154600e600082825461275a9190612f3b565b90915550506001850154600f8054600090612776908490612f3b565b9091555050505050505b6001810182905560075482106127c657600881015460ff166127b257601080549060006127ac83612fce565b91905055505b60088101805460ff19166001179055612809565b600881015460ff16151560011480156127e157506000601054115b156127fc57601080549060006127f683612f82565b91905055505b60088101805460ff191690555b670de0b6b3a764000060035482600101546128249190612f1c565b61282e9190612efc565b60038201819055600e8054600090612847908490612ee4565b90915550506001810154600f8054600090612863908490612ee4565b90915550506006546128be5762278d00600e54670de0b6b3a7640000600f5460035461288f9190612f1c565b6128999190612efc565b6128a39190612f3b565b6009546128b09190612f3b565b6128ba9190612efc565b6006555b505050565b6000600f54600014156128d95750600354610871565b6000600f54600654600c54426128ef9190612f3b565b6128f99190612f1c565b61290b90670de0b6b3a7640000612f1c565b6129159190612efc565b6003546129229190612ee4565b90506000600e54670de0b6b3a7640000600f54846129409190612f1c565b61294a9190612efc565b6129549190612f3b565b905060095481106129d1576000600e54670de0b6b3a7640000600f5460035461297d9190612f1c565b6129879190612efc565b6129919190612f3b565b60095461299e9190612f3b565b600f549091506129b682670de0b6b3a7640000612f1c565b6129c09190612efc565b6003546129cd9190612ee4565b9250505b50905090565b42600c5414156129e657612b18565b600f5415806129f55750600654155b15612a035742600c55612b18565b6000600f54600654600c5442612a199190612f3b565b612a239190612f1c565b612a3590670de0b6b3a7640000612f1c565b612a3f9190612efc565b600354612a4c9190612ee4565b90506000600e54670de0b6b3a7640000600f5484612a6a9190612f1c565b612a749190612efc565b612a7e9190612f3b565b90506009548110612b0b576000600e54670de0b6b3a7640000600f54600354612aa79190612f1c565b612ab19190612efc565b612abb9190612f3b565b600954612ac89190612f3b565b600f54909150612ae082670de0b6b3a7640000612f1c565b612aea9190612efc565b60036000828254612afb9190612ee4565b9091555050600060065550612b11565b60038290555b505042600c555b565b828054612b2690612f99565b90600052602060002090601f016020900481019282612b485760008555612b8e565b82601f10612b6157805160ff1916838001178555612b8e565b82800160010185558215612b8e579182015b82811115612b8e578251825591602001919060010190612b73565b50612b9a929150612c12565b5090565b828054612baa90612f99565b90600052602060002090601f016020900481019282612bcc5760008555612b8e565b82601f10612be55782800160ff19823516178555612b8e565b82800160010185558215612b8e579182015b82811115612b8e578235825591602001919060010190612bf7565b5b80821115612b9a5760008155600101612c13565b80356001600160a01b0381168114610d3257600080fd5b60008083601f840112612c4f578182fd5b50813567ffffffffffffffff811115612c66578182fd5b602083019150836020828501011115610d0e57600080fd5b600060208284031215612c8f578081fd5b612c9882612c27565b9392505050565b60008060408385031215612cb1578081fd5b612cba83612c27565b9150612cc860208401612c27565b90509250929050565b60008060408385031215612ce3578182fd5b612cec83612c27565b946020939093013593505050565b600060208284031215612d0b578081fd5b81518015158114612c98578182fd5b600060208284031215612d2b578081fd5b5035919050565b60008060008060008060808789031215612d4a578182fd5b86359550602087013567ffffffffffffffff80821115612d68578384fd5b612d748a838b01612c3e565b9097509550604089013594506060890135915080821115612d93578384fd5b50612da089828a01612c3e565b979a9699509497509295939492505050565b60008060408385031215612dc4578182fd5b50508035926020909101359150565b600060208284031215612de4578081fd5b5051919050565b60008284528282602086013780602084860101526020601f19601f85011685010190509392505050565b60008151808452612e2d816020860160208601612f52565b601f01601f19169290920160200192915050565b6000828483379101908152919050565b60008251612e63818460208701612f52565b9190910192915050565b6000841515825260606020830152612e886060830185612e15565b9050826040830152949350505050565b600060608252612eac606083018789612deb565b8560208401528281036040840152612ec5818587612deb565b98975050505050505050565b600060208252612c986020830184612e15565b60008219821115612ef757612ef7612fe9565b500190565b600082612f1757634e487b7160e01b81526012600452602481fd5b500490565b6000816000190483118215151615612f3657612f36612fe9565b500290565b600082821015612f4d57612f4d612fe9565b500390565b60005b83811015612f6d578181015183820152602001612f55565b83811115612f7c576000848401525b50505050565b600081612f9157612f91612fe9565b506000190190565b600181811c90821680612fad57607f821691505b60208210811415611a6e57634e487b7160e01b600052602260045260246000fd5b6000600019821415612fe257612fe2612fe9565b5060010190565b634e487b7160e01b600052601160045260246000fdfea2646970667358221220268f9e82824a9050611227d9c7f68f2327bead04bdf2781127992b30b477ef0c64736f6c634300080300330000000000000000000000008d1bb5eddfce08b92dd47c9871d1805211c3eb3c000000000000000000000000000000000000000000000000000000000000a8c00000000000000000000000000000000000000000000000056bc75e2d63100000000000000000000000000000000000000000000000000000d02ab486cedc00000000000000000000000000000000000000000000000000008ac7230489e800005c13cd9c97dbb98f2429c101a2a8150e6c7a0ddaff6124ee176a3a411067ded0

Deployed ByteCode Sourcemap

768:41703:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1578:36;;;;;;;;;6698:25:1;;;6686:2;6671:18;1578:36:0;;;;;;;;33765:99;;;:::i;:::-;;;-1:-1:-1;;;;;4639:55:1;;;4621:74;;4609:2;4594:18;33765:99:0;4576:125:1;25997:228:0;;;;;;:::i;:::-;-1:-1:-1;;;;;26157:24:0;;;;26130:7;26157:24;;;:13;:24;;;;;;;;:60;;;:50;;;;:60;;;;;25997:228;34007:105;34088:16;;34007:105;;6546:392;;;;;;:::i;:::-;;:::i;:::-;;28991:4071;;;;;;:::i;:::-;;:::i;:::-;;;;6482:14:1;;6475:22;6457:41;;6529:2;6514:18;;6507:34;;;;6430:18;28991:4071:0;6412:135:1;23721:253:0;;;;;;:::i;:::-;23835:7;23874:17;;;:7;:17;;;;;;;;:49;;;:37;;;:49;;;;;;23925:28;;;;:40;;;;;;;-1:-1:-1;;;;;23874:49:0;;;;23925:40;;;;;23721:253;;;;;-1:-1:-1;;;;;5295:55:1;;;5277:74;;5394:14;;5387:22;5382:2;5367:18;;5360:50;5250:18;23721:253:0;5232:184:1;1859:35:0;;;;;;34310:97;34387:12;;34310:97;;1225:28;;;;;;2398:25;;;;;;1045:40;;;;;;25466:188;;;;;;:::i;:::-;;:::i;16913:869::-;;;:::i;34961:184::-;;;;;;:::i;:::-;35068:4;35097:17;;;:7;:17;;;;;;;;:40;;;:28;;;;:40;;;;;;;;34961:184;;;;5888:14:1;;5881:22;5863:41;;5851:2;5836:18;34961:184:0;5818:92:1;25127:99:0;25205:13;;25127:99;;11884:1697;;;;;;:::i;:::-;;:::i;24766:189::-;;;;;;:::i;:::-;-1:-1:-1;;;;;24901:24:0;24869:7;24901:24;;;:13;:24;;;;;:46;;;;24766:189;875:25;;;;;-1:-1:-1;;;;;875:25:0;;;10212:580;;;;;;:::i;:::-;;:::i;13976:2788::-;;;;;;:::i;:::-;;:::i;1410:26::-;;;;;;1139:33;;;;;;23075:299;;;:::i;1953:51::-;;;;;;26349:95;26425:11;;26349:95;;21063:100;21145:10;;-1:-1:-1;;;;;21145:10:0;21063:100;;27113:736;;;;;;:::i;:::-;-1:-1:-1;;;;;27460:29:0;27224:7;27460:29;;;:13;:29;;;;;27522:17;;27554:21;;;;27590;;;;27626:18;;;;27659:29;;;;27703:24;;;;27742:22;;;;27779;;;;27816:14;;;;;27522:17;;27554:21;;27590;;27626:18;;27659:29;;27703:24;;27742:22;;27816:14;;;;;27113:736;;;;;15644:25:1;;;15700:2;15685:18;;15678:34;;;;15728:18;;;15721:34;;;;15786:2;15771:18;;15764:34;;;;15829:3;15814:19;;15807:35;;;;15873:3;15858:19;;15851:35;15917:3;15902:19;;15895:35;15961:3;15946:19;;15939:35;16018:14;16011:22;16005:3;15990:19;;15983:51;15631:3;15616:19;27113:736:0;15598:442:1;21388:176:0;;;;;;:::i;:::-;21489:7;21521:17;;;:7;:17;;;;;:35;;21388:176;1333:25;;;;;;2090:30;;;;;;2293:27;;;;;;10954:511;;;;;;:::i;:::-;;:::i;968:20::-;;;;;-1:-1:-1;;;;;968:20:0;;;19228:212;;;;;;:::i;:::-;19351:7;19383:17;;;:7;:17;;;;;;;;:49;;;:37;;;;:49;;;;;;19228:212;2198:31;;;;;;1768:37;;;;;;33412:210;;;;;;:::i;:::-;33538:7;33570:17;;;:7;:17;;;;;;;;:44;;;:32;;;;:44;;;;;;33412:210;20351:611;;;;;;:::i;:::-;;:::i;:::-;;;;;;;;;:::i;19672:260::-;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;17880:613::-;;;:::i;21779:1124::-;;;;;;:::i;:::-;;:::i;1485:38::-;;;;;;28014:109;28097:18;;28014:109;;35376:199;;;;;;:::i;:::-;;:::i;7731:2209::-;;;;;;:::i;:::-;;:::i;28347:197::-;;;;;;:::i;:::-;;:::i;1656:39::-;;;;;;34540:189;;;:::i;7114:495::-;;;;;;:::i;:::-;;:::i;24342:209::-;;;;;;:::i;:::-;24462:7;24494:17;;;:7;:17;;;;;;;;:49;;;:37;;;;:49;;;;;-1:-1:-1;;;;;24494:49:0;;24342:209;811:19;;;;;-1:-1:-1;;;;;811:19:0;;;35744:80;35812:4;35744:80;;33765:99;33815:7;33850:5;-1:-1:-1;;;;;33850:5:0;33765:99;;:::o;6546:392::-;6630:5;;-1:-1:-1;;;;;6630:5:0;6616:10;:19;6608:69;;;;-1:-1:-1;;;6608:69:0;;11139:2:1;6608:69:0;;;11121:21:1;11178:2;11158:18;;;11151:30;11217:34;11197:18;;;11190:62;-1:-1:-1;;;11268:18:1;;;11261:35;11313:19;;6608:69:0;;;;;;;;;6696:10;;-1:-1:-1;;;;;6696:10:0;:24;6688:67;;;;-1:-1:-1;;;6688:67:0;;13776:2:1;6688:67:0;;;13758:21:1;13815:2;13795:18;;;13788:30;13854:32;13834:18;;;13827:60;13904:18;;6688:67:0;13748:180:1;6688:67:0;-1:-1:-1;;;;;6788:32:0;;6766:122;;;;-1:-1:-1;;;6766:122:0;;14890:2:1;6766:122:0;;;14872:21:1;14929:2;14909:18;;;14902:30;14968:34;14948:18;;;14941:62;-1:-1:-1;;;15019:18:1;;;15012:38;15067:19;;6766:122:0;14862:230:1;6766:122:0;6899:10;:31;;-1:-1:-1;;;;;;6899:31:0;-1:-1:-1;;;;;6899:31:0;;;;;;;;;;6546:392::o;28991:4071::-;29108:11;21521:17;;;:7;:17;;;;;:35;29108:11;;29220:10;;29216:3811;;29247:15;;;29325:10;29334:1;29325:6;:10;:::i;:::-;29310:25;;29350:13;29452:47;29482:8;29492:6;29452:29;:47::i;:::-;29444:55;;29527:10;29518:5;:19;29514:42;;29547:5;29554:1;29539:17;;;;;;;;;;;29514:42;29579:45;29609:8;29619:4;29579:29;:45::i;:::-;29571:53;;29651:10;29643:5;:18;29639:393;;;29682:173;35068:4;35097:17;;;:7;:17;;;;;;;;:40;;;:28;;:40;;;;;;;;29688;;;;;29727:1;29720:4;:8;29688:40;29682:173;;;29753:6;;;;:::i;:::-;;;;29790:45;29820:8;29830:4;29790:29;:45::i;:::-;29782:53;;29682:173;;;29876:9;;:41;;;;-1:-1:-1;35068:4:0;35097:17;;;:7;:17;;;;;;;;:40;;;:28;;:40;;;;;;;;29889:28;29873:106;;;29950:5;29957:1;29942:17;;;;;;;;;;;29873:106;-1:-1:-1;30005:4:0;;-1:-1:-1;30011:4:0;-1:-1:-1;29997:19:0;;-1:-1:-1;;;29997:19:0;29639:393;30190:6;30182:1;30165:13;30190:6;30165:4;:13;:::i;:::-;30164:19;;;;:::i;:::-;:23;;30186:1;30164:23;:::i;:::-;:32;;;;:::i;:::-;30154:42;;30223:48;30253:8;30263:7;30223:29;:48::i;:::-;30215:56;;30302:10;30294:5;:18;30290:2711;;;30385:17;30405:125;30461:8;30496:11;:7;30506:1;30496:11;:::i;30405:125::-;30385:145;;30570:10;30557:9;:23;30553:1019;;35068:4;35097:17;;;:7;:17;;;;;;;;:40;;;:28;;:40;;;;;;;;30609:796;;30731:4;30737:7;30723:22;;;;;;;;;;;;30609:796;35068:4;35097:17;;;:7;:17;;;;;;;;:40;;;:28;;:40;;;;;;;;30901:43;;;;;30943:1;30933:7;:11;30901:43;30895:218;;;30981:9;;;;:::i;:::-;;;;31033:48;31063:8;31073:7;31033:29;:48::i;:::-;31025:56;;30895:218;;;31146:12;;:44;;;;-1:-1:-1;35068:4:0;35097:17;;;:7;:17;;;;;;;;:40;;;:28;;:40;;;;;;;;31162:28;31143:133;;;31235:5;31242:1;31227:17;;;;;;;;;;;;31143:133;31363:4;31369:7;31355:22;;;;;;;;;;;;30553:1019;31537:11;:7;31547:1;31537:11;:::i;:::-;31528:20;;30290:2711;;;;31620:17;31640:125;31696:8;31731:11;31741:1;31731:7;:11;:::i;31640:125::-;31620:145;;31804:10;31792:9;:22;31788:1194;;;35068:4;35097:17;;;:7;:17;;;;;;;;:40;;;:28;;:40;;;;;;;;31843:973;;31973:4;31979:11;31973:4;31979:7;:11;:::i;:::-;31965:26;;;;;;;;;;;;31843:973;32141:9;;;;:::i;:::-;;;;32181:335;35068:4;35097:17;;;:7;:17;;;;;;;;:40;;;:28;;:40;;;;;;;;32187:47;;;;;32233:1;32223:7;:11;32187:47;32181:335;;;32271:9;;;;:::i;:::-;;;;32327:157;32395:8;32442:7;32327:29;:157::i;:::-;32315:169;;32181:335;;;32549:12;;:48;;;;-1:-1:-1;35068:4:0;35097:17;;;:7;:17;;;;;;;;:40;;;:28;;:40;;;;;;;;32565:32;34961:184;31788:1194;32947:11;32957:1;32947:7;:11;:::i;:::-;32940:18;;30290:2711;;30122:2894;;29216:3811;33045:5;33052:1;33037:17;;;;;28991:4071;;;;;;:::o;25466:188::-;-1:-1:-1;;;;;25605:24:0;;25573:7;25605:24;;;:13;:24;;;;;:41;;;25466:188;;;;:::o;16913:869::-;16999:14;17015:17;17038:104;17066:24;;17123:8;17105:15;:26;;;;:::i;17038:104::-;16998:144;;;;;17157:9;17153:622;;;17183:26;17223:4;17212:27;;;;;;;;;;;;:::i;:::-;17183:56;;17302:10;17280:18;:32;;:70;;;;;17337:13;17316:18;:34;17280:70;17254:159;;;;-1:-1:-1;;;17254:159:0;;8565:2:1;17254:159:0;;;8547:21:1;8604:2;8584:18;;;8577:30;8643:29;8623:18;;;8616:57;8690:18;;17254:159:0;8537:177:1;17254:159:0;17430:28;17496:18;17462:23;;17488:4;17462:30;;;;:::i;:::-;17461:53;;;;:::i;:::-;17430:84;;17555:18;;17532:20;:41;17529:188;;;17608:18;;17594:11;:32;17529:188;;;17667:11;:34;;;17529:188;17736:27;17751:11;;17736:27;;;;6698:25:1;;6686:2;6671:18;;6653:76;17736:27:0;;;;;;;;17153:622;;;16913:869;;:::o;11884:1697::-;12042:10;;11982:20;;-1:-1:-1;;;;;12042:10:0;12028;:24;12020:71;;;;-1:-1:-1;;;12020:71:0;;8162:2:1;12020:71:0;;;8144:21:1;8201:2;8181:18;;;8174:30;8240:34;8220:18;;;8213:62;-1:-1:-1;;;8291:18:1;;;8284:32;8333:19;;12020:71:0;8134:224:1;12020:71:0;-1:-1:-1;;;;;12130:24:0;;12102:25;12130:24;;;:13;:24;;;;;12190:21;;;;12247;;;;12130:24;;12190:21;;12247;12287:31;12247:21;12190;12287:31;:::i;:::-;:35;12279:67;;;;-1:-1:-1;;;12279:67:0;;11545:2:1;12279:67:0;;;11527:21:1;11584:2;11564:18;;;11557:30;-1:-1:-1;;;11603:18:1;;;11596:49;11662:18;;12279:67:0;11517:169:1;12279:67:0;12379:11;;12361:14;:29;12357:1089;;12507:11;;12492:26;;12558:11;;12533:7;:21;;;:36;;;;;;;:::i;:::-;;;;-1:-1:-1;;12598:11:0;;12584:10;:25;;:10;;:25;;12598:11;;12584:25;:::i;:::-;;;;-1:-1:-1;12357:1089:0;;-1:-1:-1;12357:1089:0;;12666:11;;12631:31;12648:14;12631;:31;:::i;:::-;:46;12627:819;;12867:11;;;-1:-1:-1;12893:134:0;12937:9;12983:28;12997:14;12867:11;12983:28;:::i;:::-;12965:47;;:14;:47;:::i;:::-;12893:25;:134::i;:::-;13056:14;13042:10;;:28;;;;;;;:::i;:::-;;;;-1:-1:-1;;13109:1:0;13085:21;;;:25;12627:819;;;13266:31;13283:14;13266;:31;:::i;:::-;13251:46;;13326:14;13312:10;;:28;;;;;;;:::i;:::-;;;;-1:-1:-1;13355:39:0;;-1:-1:-1;13381:9:0;13392:1;13355:25;:39::i;:::-;13433:1;13409:21;;;:25;12627:819;13464:5;;:40;;-1:-1:-1;;;13464:40:0;;-1:-1:-1;;;;;5613:55:1;;;13464:40:0;;;5595:74:1;5685:18;;;5678:34;;;13464:5:0;;;;:14;;5568:18:1;;13464:40:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;13456:49;;;;;;13521:52;;;-1:-1:-1;;;;;5613:55:1;;;5595:74;;5700:2;5685:18;;5678:34;;;13521:52:0;;;;;5568:18:1;13521:52:0;;;;;;;11884:1697;;;;;;;:::o;10212:580::-;10313:10;;-1:-1:-1;;;;;10313:10:0;10299;:24;10291:70;;;;-1:-1:-1;;;10291:70:0;;8921:2:1;10291:70:0;;;8903:21:1;8960:2;8940:18;;;8933:30;8999:34;8979:18;;;8972:62;-1:-1:-1;;;9050:18:1;;;9043:31;9091:19;;10291:70:0;8893:223:1;10291:70:0;10372:22;10397:17;;;:7;:17;;;;;;;;10434:30;;;:18;;;:30;;;;;;;;;10433:31;10425:66;;;;-1:-1:-1;;;10425:66:0;;14135:2:1;10425:66:0;;;14117:21:1;14174:2;14154:18;;;14147:30;14213:24;14193:18;;;14186:52;14255:18;;10425:66:0;14107:172:1;10425:66:0;10502:14;10519:34;;;:22;;;:34;;;;;;10586:26;;10519:7;;:34;;10586:26;;;;-1:-1:-1;;;10586:26:0;;;;;;;;;;;;;;;;;10572:10;:40;10564:70;;;;-1:-1:-1;;;10564:70:0;;9323:2:1;10564:70:0;;;9305:21:1;9362:2;9342:18;;;9335:30;-1:-1:-1;;;9381:18:1;;;9374:47;9438:18;;10564:70:0;9295:167:1;10564:70:0;10645:41;;;;;;;;;;-1:-1:-1;10645:41:0;;;:36;;;:24;;;:36;;;;;;:41;;;;;;:::i;:::-;-1:-1:-1;10697:30:0;;;;:18;;;:30;;;;;;;:37;;-1:-1:-1;;10697:37:0;10730:4;10697:37;;;10750:34;;;;;10763:8;;10716:10;;6908:25:1;;;6964:2;6949:18;;6942:34;6896:2;6881:18;;6863:119;13976:2788:0;14173:13;14162:6;;14152:17;;;;;;;:::i;:::-;;;;;;;;:34;;14144:70;;;;-1:-1:-1;;;14144:70:0;;10016:2:1;14144:70:0;;;9998:21:1;10055:2;10035:18;;;10028:30;10094:25;10074:18;;;10067:53;10137:18;;14144:70:0;9988:173:1;14144:70:0;14225:22;14250:17;;;:7;:17;;;;;14310:25;;14300:35;;;:50;;-1:-1:-1;14339:11:0;;14300:50;14278:132;;;;-1:-1:-1;;;14278:132:0;;10368:2:1;14278:132:0;;;10350:21:1;;;10387:18;;;10380:30;10446:34;10426:18;;;10419:62;10498:18;;14278:132:0;10340:182:1;14278:132:0;14463:10;14421:25;14449;;;:13;:25;;;;;14532:11;;14507:21;;;;:36;;14485:127;;;;-1:-1:-1;;;14485:127:0;;10729:2:1;14485:127:0;;;10711:21:1;10768:2;10748:18;;;10741:30;10807:34;10787:18;;;10780:62;-1:-1:-1;;;10858:18:1;;;10851:39;10907:19;;14485:127:0;10701:231:1;14485:127:0;14833:11;;14809:7;:21;;;:35;;;;:::i;:::-;14784:13;;:20;;14800:4;14784:20;:::i;:::-;14783:62;;;;:::i;:::-;14726:29;;;;14708:47;;:15;:47;:::i;:::-;14707:56;;14759:4;14707:56;:::i;:::-;:138;14685:229;;;;-1:-1:-1;;;14685:229:0;;13010:2:1;14685:229:0;;;12992:21:1;13049:2;13029:18;;;13022:30;13088:34;13068:18;;;13061:62;-1:-1:-1;;;13139:18:1;;;13132:39;13188:19;;14685:229:0;12982:231:1;14685:229:0;14969:10;;14959:21;;;;;;;:::i;:::-;;;;;;;;14947:8;:33;14925:118;;;;-1:-1:-1;;;14925:118:0;;14486:2:1;14925:118:0;;;14468:21:1;14525:2;14505:18;;;14498:30;14564:34;14544:18;;;14537:62;-1:-1:-1;;;14615:18:1;;;14608:33;14658:19;;14925:118:0;14458:225:1;14925:118:0;15086:15;15054:29;;;;:47;;;15247:1;15191:44;;;:27;;:44;;;;;;-1:-1:-1;;;;;15191:44:0;:58;15169:138;;;;-1:-1:-1;;;15169:138:0;;12651:2:1;15169:138:0;;;12633:21:1;12690:2;12670:18;;;12663:30;12729:32;12709:18;;;12702:60;12779:18;;15169:138:0;12623:180:1;15169:138:0;15455:25;;15436:15;15455:18;15413:39;;;:22;;;;:39;;;;;;;;:67;;;15491:40;;;;;;;;;;;;;;;;;15542:44;;;:27;;;:44;;;;;15589:12;15542:59;;15612:24;;;:41;;;;;:50;;15656:6;;15612:50;:::i;:::-;-1:-1:-1;15701:15:0;15673:44;;;;:27;;;:44;;;;;:57;;-1:-1:-1;;;;;;15673:57:0;15720:10;15673:57;;;15840:15;;15818:18;;15673:44;;15859:3;;15800:36;;;:::i;:::-;15799:56;;;;:::i;:::-;15798:64;;;;:::i;:::-;15780:82;;15896:37;16039:10;;16015:21;;15996:16;;:40;;;;:::i;:::-;:53;;;;:::i;:::-;15949:5;;:30;;-1:-1:-1;;;15949:30:0;;15973:4;15949:30;;;4621:74:1;-1:-1:-1;;;;;15949:5:0;;;;:15;;4594:18:1;;15949:30:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:101;;;;:::i;:::-;15896:154;;16097:1;16065:29;:33;:48;;;;;16112:1;16102:7;:11;16065:48;16061:293;;;16166:7;16134:29;:39;16130:213;;;16194:5;;:57;;-1:-1:-1;;;16194:57:0;;16209:10;16194:57;;;5595:74:1;5685:18;;;5678:34;;;-1:-1:-1;;;;;16194:5:0;;;;:14;;5568:18:1;;16194:57:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;16130:213;;;16292:5;;:35;;-1:-1:-1;;;16292:35:0;;16307:10;16292:35;;;5595:74:1;5685:18;;;5678:34;;;-1:-1:-1;;;;;16292:5:0;;;;:14;;5568:18:1;;16292:35:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;16130:213;16467:15;16446:18;:36;16493:24;;;:26;;;:24;:26;;;:::i;:::-;;;;-1:-1:-1;;16530:43:0;;;;:33;;;:43;;;;;:45;;;;;;:::i;:::-;;;;;;16735:10;-1:-1:-1;;;;;16591:165:0;16638:15;16615:8;16591:165;16668:6;;16689;16710:10;;16591:165;;;;;;;;;;:::i;:::-;;;;;;;;13976:2788;;;;;;;;;;:::o;23075:299::-;23138:7;23158:23;23292:15;;23272:4;23239:16;;23185:38;:36;:38::i;:::-;:70;;;;:::i;:::-;23184:92;;;;:::i;:::-;:123;;;;:::i;:::-;23158:149;;23350:15;23326:21;;:39;;;;:::i;:::-;23318:48;;;23075:299;:::o;10954:511::-;11065:10;11023:25;11051;;;:13;:25;;;;;11109:21;;;;:32;-1:-1:-1;11109:32:0;11087:109;;;;-1:-1:-1;;;11087:109:0;;13420:2:1;11087:109:0;;;13402:21:1;13459:2;13439:18;;;13432:30;13498:29;13478:18;;;13471:57;13545:18;;11087:109:0;13392:177:1;11087:109:0;11207:70;11233:10;11269:7;11245;:21;;;:31;;;;:::i;11207:70::-;11308:15;11288:35;;11334:21;;;:32;;11359:7;;11334:21;11288:17;;11334:32;;11359:7;;11334:32;:::i;:::-;;;;;;;;11391:7;11377:10;;:21;;;;;;;:::i;:::-;;;;-1:-1:-1;;11414:43:0;;;11437:10;5595:74:1;;5700:2;5685:18;;5678:34;;;11414:43:0;;5568:18:1;11414:43:0;;;;;;;10954:511;;:::o;20351:611::-;20474:16;20505:19;20539:27;20595:11;20608:14;20626:80;20662:8;20685:10;20626:21;:80::i;:::-;20594:112;;;;20722:6;20717:41;;20738:5;20745:9;;;;;;;;;;;;20756:1;20730:28;;;;;;;;;;20717:41;20791:47;20821:8;20831:6;20791:29;:47::i;:::-;20769:69;;20858:43;20871:8;20881:19;20858:12;:43::i;:::-;20849:52;;20920:4;20912:42;;;;20351:611;;;;;;:::o;19672:260::-;19765:19;19802:12;19847:44;19861:8;19871:19;:15;19889:1;19871:19;:::i;19847:44::-;-1:-1:-1;19825:66:0;-1:-1:-1;19825:66:0;-1:-1:-1;19825:66:0;19902:23;;19915:8;;;19902:23;19672:260;;;;:::o;17880:613::-;17967:10;17925:25;17953;;;:13;:25;;;;;18099:17;;18120:6;;18081:35;;:15;:35;:::i;:::-;:45;;18059:113;;;;-1:-1:-1;;;18059:113:0;;9669:2:1;18059:113:0;;;9651:21:1;9708:2;9688:18;;;9681:30;-1:-1:-1;;;9727:18:1;;;9720:48;9785:18;;18059:113:0;9641:168:1;18059:113:0;18229:1;18205:7;:21;;;:25;18183:109;;;;-1:-1:-1;;;18183:109:0;;12248:2:1;18183:109:0;;;12230:21:1;12287:2;12267:18;;;12260:30;12326:34;12306:18;;;12299:62;-1:-1:-1;;;12377:18:1;;;12370:32;12419:19;;18183:109:0;12220:224:1;18183:109:0;18311:5;;18338:21;;;;18311:49;;-1:-1:-1;;;18311:49:0;;18326:10;18311:49;;;5595:74:1;5685:18;;;5678:34;;;;-1:-1:-1;;;;;18311:5:0;;;;:14;;5568:18:1;;18311:49:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;18303:58;;;;;;18386:7;:21;;;18372:10;;:35;;;;;;;:::i;:::-;;;;-1:-1:-1;;18442:1:0;18418:21;;;:25;18459:26;;18474:10;4621:74:1;;18459:26:0;;4609:2:1;4594:18;18459:26:0;;;;;;;17880:613;:::o;21779:1124::-;-1:-1:-1;;;;;21941:29:0;;21873:22;21941:29;;;:13;:29;;;;;22111:18;;;;22091:4;22036:38;:36;:38::i;:::-;21999:7;:21;;;:75;;;;:::i;:::-;21998:97;;;;:::i;:::-;:131;;;;:::i;:::-;22184:10;;22214:41;;;;;;;;;;;;;;;;-1:-1:-1;;;;;22214:41:0;-1:-1:-1;;;22214:41:0;;;22184:82;;21981:148;;-1:-1:-1;22141:13:0;;;;-1:-1:-1;;;;;22184:10:0;;:82;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;22140:126;;;;22277:22;22314:8;22310:130;;;22406:7;:22;;;22379:11;22368:34;;;;;;;;;;;;:::i;:::-;22360:68;;;;:::i;:::-;22343:85;;22310:130;22454:18;;22450:446;;22518:10;;22556:72;;-1:-1:-1;;;;;4639:55:1;;;22556:72:0;;;4621:74:1;22518:10:0;;;;4594:18:1;;22556:72:0;;;-1:-1:-1;;22556:72:0;;;;;;;;;;;;;;-1:-1:-1;;;;;22556:72:0;-1:-1:-1;;;22556:72:0;;;22518:129;;;22556:72;22518:129;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;22493:154:0;;-1:-1:-1;22493:154:0;-1:-1:-1;22666:219:0;;;;22851:14;22798:7;:22;;;22773:11;22762:33;;;;;;;;;;;;:::i;:::-;:58;;;;:::i;:::-;22744:77;;:14;:77;:::i;:::-;22743:122;;;;:::i;:::-;22701:164;;22666:219;21779:1124;;;;;;;:::o;35376:199::-;35521:17;;;;:7;:17;;;;;;;;:46;;;:34;;:46;;;;;35514:53;;35484:12;;35521:46;35514:53;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;35376:199;;;;:::o;7731:2209::-;7798:10;;-1:-1:-1;;;;;7798:10:0;7790:63;;;;-1:-1:-1;;;7790:63:0;;11893:2:1;7790:63:0;;;11875:21:1;11932:2;11912:18;;;11905:30;11971:28;11951:18;;;11944:56;12017:18;;7790:63:0;11865:176:1;7790:63:0;7906:10;7864:25;7892;;;:13;:25;;;;;7953:21;;;;8010;;;;8046:18;;8042:1681;;8103:7;8085:14;:25;8081:714;;8233:7;8208;:21;;;:32;;;;;;;:::i;:::-;;;;;;;;8273:7;8259:10;;:21;;;;;;;:::i;:::-;;;;-1:-1:-1;8081:714:0;;-1:-1:-1;8081:714:0;;8493:5;;-1:-1:-1;;;;;8493:5:0;:18;8538:10;8583:4;8615:24;8625:14;8615:7;:24;:::i;:::-;8493:169;;-1:-1:-1;;;;;;8493:169:0;;;;;;;-1:-1:-1;;;;;4987:15:1;;;8493:169:0;;;4969:34:1;5039:15;;;;5019:18;;;5012:43;5071:18;;;5064:34;4881:18;;8493:169:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;8463:218;;;;;;8714:7;:21;;;8700:10;;:35;;;;;;;:::i;:::-;;;;-1:-1:-1;;8778:1:0;8754:21;;;:25;8081:714;8042:1681;;;8831:19;8827:807;;9076:10;;9114:41;;;;;;;;;;;;;;;;-1:-1:-1;;;;;9114:41:0;-1:-1:-1;;;9114:41:0;;;9076:98;;9033:13;;;;-1:-1:-1;;;;;9076:10:0;;;;:98;;9114:41;9076:98;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;9032:142;;;;9197:8;9193:125;;;9274:11;9263:34;;;;;;;;;;;;:::i;:::-;9230:22;;;:68;9193:125;9361:10;;9399:68;;9456:10;9399:68;;;4621:74:1;-1:-1:-1;;;;;9361:10:0;;;;4594:18:1;;9399:68:0;;;-1:-1:-1;;9399:68:0;;;;;;;;;;;;;;-1:-1:-1;;;;;9399:68:0;-1:-1:-1;;;9399:68:0;;;9361:125;;;9399:68;9361:125;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;9336:150:0;;-1:-1:-1;9336:150:0;-1:-1:-1;9505:114:0;;;;9577:11;9566:33;;;;;;;;;;;;:::i;:::-;9540:22;;;:59;9505:114;8827:807;;;9656:5;;:54;;-1:-1:-1;;;9656:54:0;;9675:10;9656:54;;;4969:34:1;9695:4:0;5019:18:1;;;5012:43;5071:18;;;5064:34;;;-1:-1:-1;;;;;9656:5:0;;;;:18;;4881::1;;9656:54:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;9648:63;;;;;;9733;9759:10;9771:24;9788:7;9771:14;:24;:::i;9733:63::-;9827:15;9807:35;;9902:30;;9924:7;;9912:10;;9902:30;;9807:17;;9902:30;7731:2209;;;;:::o;28347:197::-;28468:7;28500:17;;;:7;:17;;;;;:36;;28529:6;;28500:36;;;;-1:-1:-1;;;28500:36:0;;;;;;;;;;;;;;;;;28493:43;;28347:197;;;;:::o;34540:189::-;34606:7;34710:10;;34686:21;;34667:16;;:40;;;;:::i;:::-;:53;;;;:::i;:::-;34633:5;;:30;;-1:-1:-1;;;34633:30:0;;34657:4;34633:30;;;4621:74:1;-1:-1:-1;;;;;34633:5:0;;;;:15;;4594:18:1;;34633:30:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:88;;;;:::i;:::-;34626:95;;34540:189;:::o;7114:495::-;7186:5;;:54;;-1:-1:-1;;;7186:54:0;;7205:10;7186:54;;;4969:34:1;7225:4:0;5019:18:1;;;5012:43;5071:18;;;5064:34;;;-1:-1:-1;;;;;7186:5:0;;;;:18;;4881::1;;7186:54:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;7178:63;;;;;;7252:16;:14;:16::i;:::-;7304:7;7279:21;;:32;;;;;;;:::i;:::-;;;;;;;;7594:7;7561:15;;7533:4;7492:16;;7464:25;;:44;;;;:::i;:::-;7463:74;;;;:::i;:::-;:113;;;;:::i;:::-;7421:21;;:156;;;;:::i;:::-;7420:181;;;;:::i;:::-;7394:10;:207;-1:-1:-1;7114:495:0:o;38169:3088::-;38300:16;:14;:16::i;:::-;-1:-1:-1;;;;;38355:29:0;;38327:25;38355:29;;;:13;:29;;;;;38399:21;;;;:25;38395:1754;;38537:22;38674:7;:18;;;38650:4;38604:25;;38563:7;:21;;;:66;;;;:::i;:::-;38562:92;;;;:::i;:::-;:130;;;;:::i;:::-;38841:10;;38875:41;;;;;;;;;;;;;;;;-1:-1:-1;;;;;38875:41:0;-1:-1:-1;;;38875:41:0;;;38841:90;;38537:155;;-1:-1:-1;38760:22:0;;;;;;-1:-1:-1;;;;;38841:10:0;;;;:90;;38875:41;38841:90;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;38797:134;;;;38950:8;38946:176;;;39084:7;:22;;;39036:11;39025:34;;;;;;;;;;;;:::i;:::-;39017:89;;;;:::i;:::-;38979:127;;38946:176;39140:18;;39136:774;;39285:10;;39323:72;;-1:-1:-1;;;;;4639:55:1;;;39323:72:0;;;4621:74:1;39285:10:0;;;;4594:18:1;;39323:72:0;;;-1:-1:-1;;39323:72:0;;;;;;;;;;;;;;-1:-1:-1;;;;;39323:72:0;-1:-1:-1;;;39323:72:0;;;39285:129;;;39323:72;39285:129;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;39259:155:0;;-1:-1:-1;39259:155:0;-1:-1:-1;39433:462:0;;;;39468:18;39500:11;39489:33;;;;;;;;;;;;:::i;:::-;39468:54;;39545:26;39712:14;39660:7;:22;;;39647:10;:35;;;;:::i;:::-;39600:83;;:14;:83;:::i;:::-;39599:127;;;;:::i;:::-;39545:181;;39774:14;39753:18;:35;39749:127;;;39834:18;39817:35;;39749:127;39433:462;;;39949:14;39924:21;;:39;;;;;;;:::i;:::-;;;;-1:-1:-1;;39986:5:0;;:42;;-1:-1:-1;;;39986:42:0;;40001:10;39986:42;;;5595:74:1;5685:18;;;5678:34;;;-1:-1:-1;;;;;39986:5:0;;;;:14;;5568:18:1;;39986:42:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;39978:51;;;;;;40063:7;:18;;;40044:15;;:37;;;;;;;:::i;:::-;;;;-1:-1:-1;;40116:21:0;;;;40096:16;:41;;:16;;:41;;40116:21;;40096:41;:::i;:::-;;;;-1:-1:-1;;;;;;38395:1754:0;40159:21;;;:41;;;40273:11;;40248:36;;40244:348;;40305:14;;;;;;40301:78;;40349:12;:14;;;:12;:14;;;:::i;:::-;;;;;;40301:78;40393:14;;;:21;;-1:-1:-1;;40393:21:0;40410:4;40393:21;;;40244:348;;;40451:14;;;;;;:22;;:14;:22;:42;;;;;40492:1;40477:12;;:16;40451:42;40447:97;;;40514:12;:14;;;:12;:14;;;:::i;:::-;;;;;;40447:97;40558:14;;;:22;;-1:-1:-1;;40558:22:0;;;40244:348;40770:4;40728:25;;40704:7;:21;;;:49;;;;:::i;:::-;40703:71;;;;:::i;:::-;40669:18;;;:105;;;40785:15;:37;;:15;;:37;;40669:105;;40785:37;:::i;:::-;;;;-1:-1:-1;;40853:21:0;;;;40833:16;:41;;:16;;:41;;40853:21;;40833:41;:::i;:::-;;;;-1:-1:-1;;40999:10:0;;40996:254;;41231:7;41198:15;;41170:4;41129:16;;41101:25;;:44;;;;:::i;:::-;41100:74;;;;:::i;:::-;:113;;;;:::i;:::-;41058:21;;:156;;;;:::i;:::-;41057:181;;;;:::i;:::-;41031:10;:207;40996:254;38169:3088;;;:::o;41422:1046::-;41520:7;41549:16;;41569:1;41549:21;41545:86;;;-1:-1:-1;41594:25:0;;41587:32;;41545:86;41641:37;41800:16;;41766:10;;41742:20;;41724:15;:38;;;;:::i;:::-;41723:53;;;;:::i;:::-;:60;;41779:4;41723:60;:::i;:::-;41722:94;;;;:::i;:::-;41681:25;;:135;;;;:::i;:::-;41641:175;;41827:26;41955:15;;41935:4;41902:16;;41857:29;:61;;;;:::i;:::-;41856:83;;;;:::i;:::-;:114;;;;:::i;:::-;41827:143;;42007:21;;41985:18;:43;41981:433;;42045:26;42214:15;;42186:4;42145:16;;42117:25;;:44;;;;:::i;:::-;42116:74;;;;:::i;:::-;:113;;;;:::i;:::-;42074:21;;:156;;;;:::i;:::-;42386:16;;42045:185;;-1:-1:-1;42340:25:0;42045:185;42361:4;42340:25;:::i;:::-;42339:63;;;;:::i;:::-;42294:25;;:108;;;;:::i;:::-;42245:157;;41981:433;;-1:-1:-1;42431:29:0;-1:-1:-1;41422:1046:0;:::o;36348:1438::-;36422:15;36398:20;;:39;36394:78;;;36454:7;;36394:78;36486:16;;:21;;:40;;-1:-1:-1;36511:10:0;;:15;36486:40;36482:132;;;36566:15;36543:20;:38;36596:7;;36482:132;36682:37;36841:16;;36807:10;;36783:20;;36765:15;:38;;;;:::i;:::-;36764:53;;;;:::i;:::-;:60;;36820:4;36764:60;:::i;:::-;36763:94;;;;:::i;:::-;36722:25;;:135;;;;:::i;:::-;36682:175;;36944:26;37072:15;;37052:4;37019:16;;36974:29;:61;;;;:::i;:::-;36973:83;;;;:::i;:::-;:114;;;;:::i;:::-;36944:143;;37124:21;;37102:18;:43;37098:632;;37290:26;37459:15;;37431:4;37390:16;;37362:25;;:44;;;;:::i;:::-;37361:74;;;;:::i;:::-;:113;;;;:::i;:::-;37319:21;;:156;;;;:::i;:::-;37583:16;;37290:185;;-1:-1:-1;37537:25:0;37290:185;37558:4;37537:25;:::i;:::-;37536:63;;;;:::i;:::-;37490:25;;:109;;;;;;;:::i;:::-;;;;-1:-1:-1;;37627:1:0;37614:10;:14;-1:-1:-1;37098:632:0;;;37661:25;:57;;;37098:632;-1:-1:-1;;37763:15:0;37740:20;:38;36348:1438;:::o;-1:-1:-1:-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;14:196:1;82:20;;-1:-1:-1;;;;;131:54:1;;121:65;;111:2;;200:1;197;190:12;215:375;;;330:3;323:4;315:6;311:17;307:27;297:2;;355:8;345;338:26;297:2;-1:-1:-1;385:20:1;;428:18;417:30;;414:2;;;467:8;457;450:26;414:2;511:4;503:6;499:17;487:29;;563:3;556:4;547:6;539;535:19;531:30;528:39;525:2;;;580:1;577;570:12;595:196;;707:2;695:9;686:7;682:23;678:32;675:2;;;728:6;720;713:22;675:2;756:29;775:9;756:29;:::i;:::-;746:39;665:126;-1:-1:-1;;;665:126:1:o;796:270::-;;;925:2;913:9;904:7;900:23;896:32;893:2;;;946:6;938;931:22;893:2;974:29;993:9;974:29;:::i;:::-;964:39;;1022:38;1056:2;1045:9;1041:18;1022:38;:::i;:::-;1012:48;;883:183;;;;;:::o;1071:264::-;;;1200:2;1188:9;1179:7;1175:23;1171:32;1168:2;;;1221:6;1213;1206:22;1168:2;1249:29;1268:9;1249:29;:::i;:::-;1239:39;1325:2;1310:18;;;;1297:32;;-1:-1:-1;;;1158:177:1:o;1340:297::-;;1460:2;1448:9;1439:7;1435:23;1431:32;1428:2;;;1481:6;1473;1466:22;1428:2;1518:9;1512:16;1571:5;1564:13;1557:21;1550:5;1547:32;1537:2;;1598:6;1590;1583:22;1642:190;;1754:2;1742:9;1733:7;1729:23;1725:32;1722:2;;;1775:6;1767;1760:22;1722:2;-1:-1:-1;1803:23:1;;1712:120;-1:-1:-1;1712:120:1:o;1837:884::-;;;;;;;2038:3;2026:9;2017:7;2013:23;2009:33;2006:2;;;2060:6;2052;2045:22;2006:2;2101:9;2088:23;2078:33;;2162:2;2151:9;2147:18;2134:32;2185:18;2226:2;2218:6;2215:14;2212:2;;;2247:6;2239;2232:22;2212:2;2291:58;2341:7;2332:6;2321:9;2317:22;2291:58;:::i;:::-;2368:8;;-1:-1:-1;2265:84:1;-1:-1:-1;2450:2:1;2435:18;;2422:32;;-1:-1:-1;2507:2:1;2492:18;;2479:32;;-1:-1:-1;2523:16:1;;;2520:2;;;2557:6;2549;2542:22;2520:2;;2601:60;2653:7;2642:8;2631:9;2627:24;2601:60;:::i;:::-;1996:725;;;;-1:-1:-1;1996:725:1;;-1:-1:-1;1996:725:1;;2680:8;;1996:725;-1:-1:-1;;;1996:725:1:o;2726:258::-;;;2855:2;2843:9;2834:7;2830:23;2826:32;2823:2;;;2876:6;2868;2861:22;2823:2;-1:-1:-1;;2904:23:1;;;2974:2;2959:18;;;2946:32;;-1:-1:-1;2813:171:1:o;3184:194::-;;3307:2;3295:9;3286:7;3282:23;3278:32;3275:2;;;3328:6;3320;3313:22;3275:2;-1:-1:-1;3356:16:1;;3265:113;-1:-1:-1;3265:113:1:o;3383:268::-;;3471:6;3466:3;3459:19;3523:6;3516:5;3509:4;3504:3;3500:14;3487:43;3575:3;3568:4;3559:6;3554:3;3550:16;3546:27;3539:40;3640:4;3633:2;3629:7;3624:2;3616:6;3612:15;3608:29;3603:3;3599:39;3595:50;3588:57;;3449:202;;;;;:::o;3656:257::-;;3735:5;3729:12;3762:6;3757:3;3750:19;3778:63;3834:6;3827:4;3822:3;3818:14;3811:4;3804:5;3800:16;3778:63;:::i;:::-;3895:2;3874:15;-1:-1:-1;;3870:29:1;3861:39;;;;3902:4;3857:50;;3705:208;-1:-1:-1;;3705:208:1:o;3918:273::-;;4101:6;4093;4088:3;4075:33;4127:16;;4152:15;;;4127:16;4065:126;-1:-1:-1;4065:126:1:o;4196:274::-;;4363:6;4357:13;4379:53;4425:6;4420:3;4413:4;4405:6;4401:17;4379:53;:::i;:::-;4448:16;;;;;4333:137;-1:-1:-1;;4333:137:1:o;5915:369::-;;6126:6;6119:14;6112:22;6101:9;6094:41;6171:2;6166;6155:9;6151:18;6144:30;6191:44;6231:2;6220:9;6216:18;6208:6;6191:44;:::i;:::-;6183:52;;6271:6;6266:2;6255:9;6251:18;6244:34;6084:200;;;;;;:::o;6987:502::-;;7228:2;7217:9;7210:21;7254:61;7311:2;7300:9;7296:18;7288:6;7280;7254:61;:::i;:::-;7351:6;7346:2;7335:9;7331:18;7324:34;7406:9;7398:6;7394:22;7389:2;7378:9;7374:18;7367:50;7434:49;7476:6;7468;7460;7434:49;:::i;:::-;7426:57;7200:289;-1:-1:-1;;;;;;;;7200:289:1:o;7494:217::-;;7641:2;7630:9;7623:21;7661:44;7701:2;7690:9;7686:18;7678:6;7661:44;:::i;16045:128::-;;16116:1;16112:6;16109:1;16106:13;16103:2;;;16122:18;;:::i;:::-;-1:-1:-1;16158:9:1;;16093:80::o;16178:217::-;;16244:1;16234:2;;-1:-1:-1;;;16269:31:1;;16323:4;16320:1;16313:15;16351:4;16276:1;16341:15;16234:2;-1:-1:-1;16380:9:1;;16224:171::o;16400:168::-;;16506:1;16502;16498:6;16494:14;16491:1;16488:21;16483:1;16476:9;16469:17;16465:45;16462:2;;;16513:18;;:::i;:::-;-1:-1:-1;16553:9:1;;16452:116::o;16573:125::-;;16641:1;16638;16635:8;16632:2;;;16646:18;;:::i;:::-;-1:-1:-1;16683:9:1;;16622:76::o;16703:258::-;16775:1;16785:113;16799:6;16796:1;16793:13;16785:113;;;16875:11;;;16869:18;16856:11;;;16849:39;16821:2;16814:10;16785:113;;;16916:6;16913:1;16910:13;16907:2;;;16951:1;16942:6;16937:3;16933:16;16926:27;16907:2;;16756:205;;;:::o;16966:136::-;;17033:5;17023:2;;17042:18;;:::i;:::-;-1:-1:-1;;;17078:18:1;;17013:89::o;17107:380::-;17186:1;17182:12;;;;17229;;;17250:2;;17304:4;17296:6;17292:17;17282:27;;17250:2;17357;17349:6;17346:14;17326:18;17323:38;17320:2;;;17403:10;17398:3;17394:20;17391:1;17384:31;17438:4;17435:1;17428:15;17466:4;17463:1;17456:15;17492:135;;-1:-1:-1;;17552:17:1;;17549:2;;;17572:18;;:::i;:::-;-1:-1:-1;17619:1:1;17608:13;;17539:88::o;17632:127::-;17693:10;17688:3;17684:20;17681:1;17674:31;17724:4;17721:1;17714:15;17748:4;17745:1;17738:15

Metadata Hash

268f9e82824a9050611227d9c7f68f2327bead04bdf2781127992b30b477ef0c
Block Transaction Gas Used Reward
Age Block Fee Address BC Fee Address Voting Power Jailed Incoming
Block Uncle Number Difficulty Gas Used Reward
Loading