Contract 0x8b57098ee6eafbe85fc3977cb974b5ab929e63f2 11

 
Txn Hash Method
Block
From
To
Value
0x8ab16000bcfb6249839774d81c3a37c58c8994f447498d5eb952d2b9590925e5Get Reward1119368602023-11-08 19:41:37141 days 14 hrs ago0x081cb3153447a37dd421dd4ca96ca0ae8a2ebfe8 IN  0x8b57098ee6eafbe85fc3977cb974b5ab929e63f20 ETH0.0001225678670.01007909
0xf71d3c9a7b470d8d3a4a8d8b89cd77f847a68b9164d0cd239166b336f056ff5cWithdraw1071769562023-07-21 15:18:09251 days 19 hrs ago0x33719c20729220634451c9b3cec852186eba8b16 IN  0x8b57098ee6eafbe85fc3977cb974b5ab929e63f20 ETH0.0000427568430.000500089
0x11d13d900745ec16afd28e1f4ca2b437b2309c216681553e4c8bc6cf3f90c619Get Reward1071768012023-07-21 15:12:59251 days 19 hrs ago0x33719c20729220634451c9b3cec852186eba8b16 IN  0x8b57098ee6eafbe85fc3977cb974b5ab929e63f20 ETH0.0000621263490.000500075
0xaab76a5d9ff0f43849069dff3a6800b8fed4bf3d5f366ae8d212a446eb136cd7Withdraw1071713332023-07-21 12:10:43251 days 22 hrs ago0x2908d1d2f26e7034dd5b73a435850d699d829420 IN  0x8b57098ee6eafbe85fc3977cb974b5ab929e63f20 ETH0.0000305584610.000500092
0x66dfa003c3e5efe5c51a49eebfcd61157d43f720c0bb789071a87392a835d6d6Get Reward1071713192023-07-21 12:10:15251 days 22 hrs ago0x2908d1d2f26e7034dd5b73a435850d699d829420 IN  0x8b57098ee6eafbe85fc3977cb974b5ab929e63f20 ETH0.0000417661570.000500092
0x93bf310e686d9ce752c5d26988a00b5fc158f6a2d960149417af5cdeb9392a3eWithdraw1071712982023-07-21 12:09:33251 days 22 hrs ago0xcde05601595dce2760b440c51410d3961db611da IN  0x8b57098ee6eafbe85fc3977cb974b5ab929e63f20 ETH0.0000334532950.000500095
0x74bea88f64010f2e6f34074ffad5fd806f3668216d576c702e4a30f72b07c640Get Reward1071712662023-07-21 12:08:29251 days 22 hrs ago0xcde05601595dce2760b440c51410d3961db611da IN  0x8b57098ee6eafbe85fc3977cb974b5ab929e63f20 ETH0.0000436455510.000500092
0xeeec25380d3cab66e953028ff1f31128a2f1ad4866b834ad3a9997d8db714149Withdraw1071708982023-07-21 11:56:13251 days 22 hrs ago0xb21c0ee79d1c28832c39ce861451727ccf787a97 IN  0x8b57098ee6eafbe85fc3977cb974b5ab929e63f20 ETH0.0000411807620.00050008
0x3ae3405eb3c48760c58c0d9bbc76df6b80a18f8ed692e92d6371d1ce7730ffbaGet Reward1071707912023-07-21 11:52:39251 days 22 hrs ago0xb21c0ee79d1c28832c39ce861451727ccf787a97 IN  0x8b57098ee6eafbe85fc3977cb974b5ab929e63f20 ETH0.0000517199880.000500076
0x8248f1fbcde010d35f9bd39034efa2a9fed8a107f9a10bc530868d5b1b0235f8Withdraw1071707322023-07-21 11:50:41251 days 22 hrs ago0x20916c23321d0552bbca2bcea01db5474532c62d IN  0x8b57098ee6eafbe85fc3977cb974b5ab929e63f20 ETH0.0000353388610.000500073
0x54ac711294ed20acbb2f30298794dae64284638e92dc4810f77357a0f843ce06Get Reward1071706932023-07-21 11:49:23251 days 22 hrs ago0x20916c23321d0552bbca2bcea01db5474532c62d IN  0x8b57098ee6eafbe85fc3977cb974b5ab929e63f20 ETH0.0000454185230.000500078
0x43639ff3d6745881bc16bba219f8156a92279c0cf55eef9a81d69dd959b3ecc0Withdraw1071686412023-07-21 10:40:59251 days 23 hrs ago0xa89a3bfe6bcc9ba6a51f84e5c4d41886396cdc57 IN  0x8b57098ee6eafbe85fc3977cb974b5ab929e63f20 ETH0.0000282531860.000500077
0x2b08b1eb10ae5b499496f407920222fe58d08553280cf217c2c0005b2b20fd39Withdraw1071686012023-07-21 10:39:39251 days 23 hrs ago0x7b53a185738df440299ae544330687456032c956 IN  0x8b57098ee6eafbe85fc3977cb974b5ab929e63f20 ETH0.0000268527210.000500081
0x9647c859d7b0f328ecaf3bb6388a9a0fc037e29e9dd5533c2d34e55f36c93b9bGet Reward1071685922023-07-21 10:39:21251 days 23 hrs ago0xa89a3bfe6bcc9ba6a51f84e5c4d41886396cdc57 IN  0x8b57098ee6eafbe85fc3977cb974b5ab929e63f20 ETH0.0000367550980.000500083
0x7b4aefbc830d4d7c8e7ae26174cbf74afffc98fc34c6facbf6b4ac58f1c918b8Get Reward1071685862023-07-21 10:39:09251 days 23 hrs ago0x7b53a185738df440299ae544330687456032c956 IN  0x8b57098ee6eafbe85fc3977cb974b5ab929e63f20 ETH0.0000370105650.000500084
0x6e6dc52894370f685ac54d4dbed364e9f73147136cd4326b7013056c945f04cdGet Reward1071685392023-07-21 10:37:35251 days 23 hrs ago0x7b53a185738df440299ae544330687456032c956 IN  0x8b57098ee6eafbe85fc3977cb974b5ab929e63f20 ETH0.0000397537830.000500093
0x3fc4a11076221e3d29a7d7c46f541313500b891185a81cf61a5c16b048ad2fedWithdraw1071681922023-07-21 10:26:01251 days 23 hrs ago0x0a54ec17e17c9e48a296a058b75bf3ee705c67e2 IN  0x8b57098ee6eafbe85fc3977cb974b5ab929e63f20 ETH0.0000301941720.000500093
0xcd0bc3203ad4eef1d1a9f808afae46185257d7dff085ac335a8809876f5055b4Get Reward1071681592023-07-21 10:24:55251 days 23 hrs ago0x0a54ec17e17c9e48a296a058b75bf3ee705c67e2 IN  0x8b57098ee6eafbe85fc3977cb974b5ab929e63f20 ETH0.0000382523920.000500101
0x3f61727dbc4e979777484b41acbbc81d560ef4fb18c5c12296c0c9ae20c2b1e8Withdraw1071677372023-07-21 10:10:51252 days 10 mins ago0xd405815e207f2a92e9dc4a709f7db2025bc2147d IN  0x8b57098ee6eafbe85fc3977cb974b5ab929e63f20 ETH0.000027975370.000500106
0x9e3a3ec0a466632a444bc768d7cf9df856bce71c8818e6b0fd61ff9daacfcca9Get Reward1071677152023-07-21 10:10:07252 days 10 mins ago0xd405815e207f2a92e9dc4a709f7db2025bc2147d IN  0x8b57098ee6eafbe85fc3977cb974b5ab929e63f20 ETH0.000037667440.000500111
0xde51010021838f72817588812355a5a23694bfb88b908ac005a6a33b36b84ba0Withdraw1071674562023-07-21 10:01:29252 days 19 mins ago0xca1aca4c87856613fc73ea705f13b70c11a3619f IN  0x8b57098ee6eafbe85fc3977cb974b5ab929e63f20 ETH0.0000287591950.000500171
0x63bfe3715e5f4624f5fc1259d4395a33965d5257ce888625c2eafc410478ba51Get Reward1071674422023-07-21 10:01:01252 days 20 mins ago0xca1aca4c87856613fc73ea705f13b70c11a3619f IN  0x8b57098ee6eafbe85fc3977cb974b5ab929e63f20 ETH0.0000384765010.000500183
0xec847887bf755981bb4086e5fd00f8ac546086c704cf0e0a2d0af2108fb977b7Withdraw1071646482023-07-21 8:27:53252 days 1 hr ago0x1b09a02c98826177fcb4eb9a2e841928877fdd32 IN  0x8b57098ee6eafbe85fc3977cb974b5ab929e63f20 ETH0.0000377634720.000500152
0x447d190b55d86634c347fffe83b772e5d2ee603d6345d6b96a89506641eec8d7Get Reward1071646372023-07-21 8:27:31252 days 1 hr ago0x1b09a02c98826177fcb4eb9a2e841928877fdd32 IN  0x8b57098ee6eafbe85fc3977cb974b5ab929e63f20 ETH0.0000542657460.000500157
0x7c0eb1f03a2928b9e09f2ec991a58068f7b745789d88b0e3bc67830845041707Withdraw1071644422023-07-21 8:21:01252 days 2 hrs ago0x3094c8034df7b0db6a1a5158c1403c750f2b6392 IN  0x8b57098ee6eafbe85fc3977cb974b5ab929e63f20 ETH0.0000347451750.000500107
[ Download CSV Export 
Latest 25 internal transaction
Parent Txn Hash Block From To Value
0x24c834ac054e5a09f71499e275c9822ae38cccd471d69449bf7cabd53f43fb7e1074089942023-07-27 0:12:45246 days 10 hrs ago 0x8b57098ee6eafbe85fc3977cb974b5ab929e63f2 Velodrome Finance: VELO Token0 ETH
0x24c834ac054e5a09f71499e275c9822ae38cccd471d69449bf7cabd53f43fb7e1074089942023-07-27 0:12:45246 days 10 hrs ago 0x8b57098ee6eafbe85fc3977cb974b5ab929e63f2 Velodrome Finance: VELO Token0 ETH
0x24c834ac054e5a09f71499e275c9822ae38cccd471d69449bf7cabd53f43fb7e1074089942023-07-27 0:12:45246 days 10 hrs ago 0x8b57098ee6eafbe85fc3977cb974b5ab929e63f2 0xa911b106ca6cb07c70d8ec6d5cdd42e99f4e16e80 ETH
0x24c834ac054e5a09f71499e275c9822ae38cccd471d69449bf7cabd53f43fb7e1074089942023-07-27 0:12:45246 days 10 hrs ago 0x8b57098ee6eafbe85fc3977cb974b5ab929e63f2Synthetix: sUSD Token0 ETH
0x24c834ac054e5a09f71499e275c9822ae38cccd471d69449bf7cabd53f43fb7e1074089942023-07-27 0:12:45246 days 10 hrs ago 0x8b57098ee6eafbe85fc3977cb974b5ab929e63f2 0xa911b106ca6cb07c70d8ec6d5cdd42e99f4e16e80 ETH
0x24c834ac054e5a09f71499e275c9822ae38cccd471d69449bf7cabd53f43fb7e1074089942023-07-27 0:12:45246 days 10 hrs ago 0x8b57098ee6eafbe85fc3977cb974b5ab929e63f2 0xa911b106ca6cb07c70d8ec6d5cdd42e99f4e16e80 ETH
0x24c834ac054e5a09f71499e275c9822ae38cccd471d69449bf7cabd53f43fb7e1074089942023-07-27 0:12:45246 days 10 hrs ago 0x8b57098ee6eafbe85fc3977cb974b5ab929e63f2 Velodrome Finance: VELO Token0 ETH
0x24c834ac054e5a09f71499e275c9822ae38cccd471d69449bf7cabd53f43fb7e1074089942023-07-27 0:12:45246 days 10 hrs ago 0x8b57098ee6eafbe85fc3977cb974b5ab929e63f2 0xa911b106ca6cb07c70d8ec6d5cdd42e99f4e16e80 ETH
0x24c834ac054e5a09f71499e275c9822ae38cccd471d69449bf7cabd53f43fb7e1074089942023-07-27 0:12:45246 days 10 hrs ago 0x8b57098ee6eafbe85fc3977cb974b5ab929e63f2 0x46b8a98d72820e28465a172687af920cc167e5870 ETH
0x24c834ac054e5a09f71499e275c9822ae38cccd471d69449bf7cabd53f43fb7e1074089942023-07-27 0:12:45246 days 10 hrs ago 0x8b57098ee6eafbe85fc3977cb974b5ab929e63f2 0x46b8a98d72820e28465a172687af920cc167e5870 ETH
0x24c834ac054e5a09f71499e275c9822ae38cccd471d69449bf7cabd53f43fb7e1074089942023-07-27 0:12:45246 days 10 hrs ago Velodrome Finance: Voter 0x8b57098ee6eafbe85fc3977cb974b5ab929e63f20 ETH
0x24c834ac054e5a09f71499e275c9822ae38cccd471d69449bf7cabd53f43fb7e1074089942023-07-27 0:12:45246 days 10 hrs ago Velodrome Finance: Voter 0x8b57098ee6eafbe85fc3977cb974b5ab929e63f20 ETH
0xf71d3c9a7b470d8d3a4a8d8b89cd77f847a68b9164d0cd239166b336f056ff5c1071769562023-07-21 15:18:09251 days 19 hrs ago 0x8b57098ee6eafbe85fc3977cb974b5ab929e63f2 Velodrome Finance: Voter0 ETH
0xf71d3c9a7b470d8d3a4a8d8b89cd77f847a68b9164d0cd239166b336f056ff5c1071769562023-07-21 15:18:09251 days 19 hrs ago 0x8b57098ee6eafbe85fc3977cb974b5ab929e63f2 0x46b8a98d72820e28465a172687af920cc167e5870 ETH
0x11d13d900745ec16afd28e1f4ca2b437b2309c216681553e4c8bc6cf3f90c6191071768012023-07-21 15:12:59251 days 19 hrs ago 0x8b57098ee6eafbe85fc3977cb974b5ab929e63f2 Velodrome Finance: VELO Token0 ETH
0x11d13d900745ec16afd28e1f4ca2b437b2309c216681553e4c8bc6cf3f90c6191071768012023-07-21 15:12:59251 days 19 hrs ago Velodrome Finance: Voter 0x8b57098ee6eafbe85fc3977cb974b5ab929e63f20 ETH
0x11d13d900745ec16afd28e1f4ca2b437b2309c216681553e4c8bc6cf3f90c6191071768012023-07-21 15:12:59251 days 19 hrs ago 0x8b57098ee6eafbe85fc3977cb974b5ab929e63f2 Velodrome Finance: Voter0 ETH
0xaab76a5d9ff0f43849069dff3a6800b8fed4bf3d5f366ae8d212a446eb136cd71071713332023-07-21 12:10:43251 days 22 hrs ago 0x8b57098ee6eafbe85fc3977cb974b5ab929e63f2 Velodrome Finance: Voter0 ETH
0xaab76a5d9ff0f43849069dff3a6800b8fed4bf3d5f366ae8d212a446eb136cd71071713332023-07-21 12:10:43251 days 22 hrs ago 0x8b57098ee6eafbe85fc3977cb974b5ab929e63f2 0x46b8a98d72820e28465a172687af920cc167e5870 ETH
0x66dfa003c3e5efe5c51a49eebfcd61157d43f720c0bb789071a87392a835d6d61071713192023-07-21 12:10:15251 days 22 hrs ago 0x8b57098ee6eafbe85fc3977cb974b5ab929e63f2 Velodrome Finance: VELO Token0 ETH
0x66dfa003c3e5efe5c51a49eebfcd61157d43f720c0bb789071a87392a835d6d61071713192023-07-21 12:10:15251 days 22 hrs ago Velodrome Finance: Voter 0x8b57098ee6eafbe85fc3977cb974b5ab929e63f20 ETH
0x66dfa003c3e5efe5c51a49eebfcd61157d43f720c0bb789071a87392a835d6d61071713192023-07-21 12:10:15251 days 22 hrs ago 0x8b57098ee6eafbe85fc3977cb974b5ab929e63f2 Velodrome Finance: Voter0 ETH
0x93bf310e686d9ce752c5d26988a00b5fc158f6a2d960149417af5cdeb9392a3e1071712982023-07-21 12:09:33251 days 22 hrs ago 0x8b57098ee6eafbe85fc3977cb974b5ab929e63f2 Velodrome Finance: Voter0 ETH
0x93bf310e686d9ce752c5d26988a00b5fc158f6a2d960149417af5cdeb9392a3e1071712982023-07-21 12:09:33251 days 22 hrs ago 0x8b57098ee6eafbe85fc3977cb974b5ab929e63f2 0x46b8a98d72820e28465a172687af920cc167e5870 ETH
0x74bea88f64010f2e6f34074ffad5fd806f3668216d576c702e4a30f72b07c6401071712662023-07-21 12:08:29251 days 22 hrs ago 0x8b57098ee6eafbe85fc3977cb974b5ab929e63f2 Velodrome Finance: VELO Token0 ETH
[ Download CSV Export 
Loading

Similar Match Source Code
This contract matches the deployed Bytecode of the Source Code for Contract 0x6b8edc43de878fd5cd5113c42747d32500db3873
The constructor portion of the code might be different and could alter the actual behaviour of the contract

Contract Name:
Gauge

Compiler Version
v0.8.13+commit.abaa5c0e

Optimization Enabled:
Yes with 200 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity)

/**
 *Submitted for verification at Optimistic.Etherscan.io on 2022-06-01
*/

// File: contracts/interfaces/IVotingEscrow.sol

pragma solidity 0.8.13;

interface IVotingEscrow {

    struct Point {
        int128 bias;
        int128 slope; // # -dweight / dt
        uint256 ts;
        uint256 blk; // block
    }

    function token() external view returns (address);
    function team() external returns (address);
    function epoch() external view returns (uint);
    function point_history(uint loc) external view returns (Point memory);
    function user_point_history(uint tokenId, uint loc) external view returns (Point memory);
    function user_point_epoch(uint tokenId) external view returns (uint);

    function ownerOf(uint) external view returns (address);
    function isApprovedOrOwner(address, uint) external view returns (bool);
    function transferFrom(address, address, uint) external;

    function voting(uint tokenId) external;
    function abstain(uint tokenId) external;
    function attach(uint tokenId) external;
    function detach(uint tokenId) external;

    function checkpoint() external;
    function deposit_for(uint tokenId, uint value) external;
    function create_lock_for(uint, uint, address) external returns (uint);

    function balanceOfNFT(uint) external view returns (uint);
    function totalSupply() external view returns (uint);
}

// File: contracts/interfaces/IVoter.sol

pragma solidity 0.8.13;

interface IVoter {
    function _ve() external view returns (address);
    function governor() external view returns (address);
    function emergencyCouncil() external view returns (address);
    function attachTokenToGauge(uint _tokenId, address account) external;
    function detachTokenFromGauge(uint _tokenId, address account) external;
    function emitDeposit(uint _tokenId, address account, uint amount) external;
    function emitWithdraw(uint _tokenId, address account, uint amount) external;
    function isWhitelisted(address token) external view returns (bool);
    function notifyRewardAmount(uint amount) external;
    function distribute(address _gauge) external;
}

// File: contracts/interfaces/IPair.sol

pragma solidity 0.8.13;

interface IPair {
    function metadata() external view returns (uint dec0, uint dec1, uint r0, uint r1, bool st, address t0, address t1);
    function claimFees() external returns (uint, uint);
    function tokens() external returns (address, address);
    function transferFrom(address src, address dst, uint amount) external returns (bool);
    function permit(address owner, address spender, uint value, uint deadline, uint8 v, bytes32 r, bytes32 s) external;
    function swap(uint amount0Out, uint amount1Out, address to, bytes calldata data) external;
    function burn(address to) external returns (uint amount0, uint amount1);
    function mint(address to) external returns (uint liquidity);
    function getReserves() external view returns (uint _reserve0, uint _reserve1, uint _blockTimestampLast);
    function getAmountOut(uint, address) external view returns (uint);
}

// File: contracts/interfaces/IGauge.sol

pragma solidity 0.8.13;

interface IGauge {
    function notifyRewardAmount(address token, uint amount) external;
    function getReward(address account, address[] memory tokens) external;
    function claimFees() external returns (uint claimed0, uint claimed1);
    function left(address token) external view returns (uint);
    function isForPair() external view returns (bool);
}

// File: contracts/interfaces/IERC20.sol

pragma solidity 0.8.13;

interface IERC20 {
    function totalSupply() external view returns (uint256);
    function transfer(address recipient, uint amount) external returns (bool);
    function decimals() external view returns (uint8);
    function symbol() external view returns (string memory);
    function balanceOf(address) external view returns (uint);
    function transferFrom(address sender, address recipient, uint amount) external returns (bool);
    function allowance(address owner, address spender) external view returns (uint);
    function approve(address spender, uint value) external returns (bool);

    event Transfer(address indexed from, address indexed to, uint value);
    event Approval(address indexed owner, address indexed spender, uint value);
}

// File: contracts/interfaces/IBribe.sol

pragma solidity 0.8.13;

interface IBribe {
    function _deposit(uint amount, uint tokenId) external;
    function _withdraw(uint amount, uint tokenId) external;
    function getRewardForOwner(uint tokenId, address[] memory tokens) external;
    function notifyRewardAmount(address token, uint amount) external;
    function left(address token) external view returns (uint);
}

// File: contracts/libraries/Math.sol

pragma solidity 0.8.13;

library Math {
    function max(uint a, uint b) internal pure returns (uint) {
        return a >= b ? a : b;
    }
    function min(uint a, uint b) internal pure returns (uint) {
        return a < b ? a : b;
    }
    function sqrt(uint y) internal pure returns (uint z) {
        if (y > 3) {
            z = y;
            uint x = y / 2 + 1;
            while (x < z) {
                z = x;
                x = (y / x + x) / 2;
            }
        } else if (y != 0) {
            z = 1;
        }
    }
    function cbrt(uint256 n) internal pure returns (uint256) { unchecked {
        uint256 x = 0;
        for (uint256 y = 1 << 255; y > 0; y >>= 3) {
            x <<= 1;
            uint256 z = 3 * x * (x + 1) + 1;
            if (n / y >= z) {
                n -= y * z;
                x += 1;
            }
        }
        return x;
    }}
}

// File: contracts/Gauge.sol


pragma solidity 0.8.13;








// Gauges are used to incentivize pools, they emit reward tokens over 7 days for staked LP tokens
contract Gauge is IGauge {

    address public immutable stake; // the LP token that needs to be staked for rewards
    address public immutable _ve; // the ve token used for gauges
    address public immutable internal_bribe;
    address public immutable external_bribe;
    address public immutable voter;

    uint public derivedSupply;
    mapping(address => uint) public derivedBalances;

    bool public isForPair;

    uint internal constant DURATION = 7 days; // rewards are released over 7 days
    uint internal constant PRECISION = 10 ** 18;
    uint internal constant MAX_REWARD_TOKENS = 16;

    // default snx staking contract implementation
    mapping(address => uint) public rewardRate;
    mapping(address => uint) public periodFinish;
    mapping(address => uint) public lastUpdateTime;
    mapping(address => uint) public rewardPerTokenStored;

    mapping(address => mapping(address => uint)) public lastEarn;
    mapping(address => mapping(address => uint)) public userRewardPerTokenStored;

    mapping(address => uint) public tokenIds;

    uint public totalSupply;
    mapping(address => uint) public balanceOf;

    address[] public rewards;
    mapping(address => bool) public isReward;

    /// @notice A checkpoint for marking balance
    struct Checkpoint {
        uint timestamp;
        uint balanceOf;
    }

    /// @notice A checkpoint for marking reward rate
    struct RewardPerTokenCheckpoint {
        uint timestamp;
        uint rewardPerToken;
    }

    /// @notice A checkpoint for marking supply
    struct SupplyCheckpoint {
        uint timestamp;
        uint supply;
    }

    /// @notice A record of balance checkpoints for each account, by index
    mapping (address => mapping (uint => Checkpoint)) public checkpoints;
    /// @notice The number of checkpoints for each account
    mapping (address => uint) public numCheckpoints;
    /// @notice A record of balance checkpoints for each token, by index
    mapping (uint => SupplyCheckpoint) public supplyCheckpoints;
    /// @notice The number of checkpoints
    uint public supplyNumCheckpoints;
    /// @notice A record of balance checkpoints for each token, by index
    mapping (address => mapping (uint => RewardPerTokenCheckpoint)) public rewardPerTokenCheckpoints;
    /// @notice The number of checkpoints for each token
    mapping (address => uint) public rewardPerTokenNumCheckpoints;

    uint public fees0;
    uint public fees1;

    event Deposit(address indexed from, uint tokenId, uint amount);
    event Withdraw(address indexed from, uint tokenId, uint amount);
    event NotifyReward(address indexed from, address indexed reward, uint amount);
    event ClaimFees(address indexed from, uint claimed0, uint claimed1);
    event ClaimRewards(address indexed from, address indexed reward, uint amount);

    constructor(address _stake, address _internal_bribe, address _external_bribe, address  __ve, address _voter, bool _forPair, address[] memory _allowedRewardTokens) {
        stake = _stake;
        internal_bribe = _internal_bribe;
        external_bribe = _external_bribe;
        _ve = __ve;
        voter = _voter;
        isForPair = _forPair;

        for (uint i; i < _allowedRewardTokens.length; i++) {
            if (_allowedRewardTokens[i] != address(0)) {
                isReward[_allowedRewardTokens[i]] = true;
                rewards.push(_allowedRewardTokens[i]);
            }
        }
    }

    // simple re-entrancy check
    uint internal _unlocked = 1;
    modifier lock() {
        require(_unlocked == 1);
        _unlocked = 2;
        _;
        _unlocked = 1;
    }

    function claimFees() external lock returns (uint claimed0, uint claimed1) {
        return _claimFees();
    }

    function _claimFees() internal returns (uint claimed0, uint claimed1) {
        if (!isForPair) {
            return (0, 0);
        }
        (claimed0, claimed1) = IPair(stake).claimFees();
        if (claimed0 > 0 || claimed1 > 0) {
            uint _fees0 = fees0 + claimed0;
            uint _fees1 = fees1 + claimed1;
            (address _token0, address _token1) = IPair(stake).tokens();
            if (_fees0 > IBribe(internal_bribe).left(_token0) && _fees0 / DURATION > 0) {
                fees0 = 0;
                _safeApprove(_token0, internal_bribe, _fees0);
                IBribe(internal_bribe).notifyRewardAmount(_token0, _fees0);
            } else {
                fees0 = _fees0;
            }
            if (_fees1 > IBribe(internal_bribe).left(_token1) && _fees1 / DURATION > 0) {
                fees1 = 0;
                _safeApprove(_token1, internal_bribe, _fees1);
                IBribe(internal_bribe).notifyRewardAmount(_token1, _fees1);
            } else {
                fees1 = _fees1;
            }

            emit ClaimFees(msg.sender, claimed0, claimed1);
        }
    }

    /**
    * @notice Determine the prior balance for an account as of a block number
    * @dev Block number must be a finalized block or else this function will revert to prevent misinformation.
    * @param account The address of the account to check
    * @param timestamp The timestamp to get the balance at
    * @return The balance the account had as of the given block
    */
    function getPriorBalanceIndex(address account, uint timestamp) public view returns (uint) {
        uint nCheckpoints = numCheckpoints[account];
        if (nCheckpoints == 0) {
            return 0;
        }

        // First check most recent balance
        if (checkpoints[account][nCheckpoints - 1].timestamp <= timestamp) {
            return (nCheckpoints - 1);
        }

        // Next check implicit zero balance
        if (checkpoints[account][0].timestamp > timestamp) {
            return 0;
        }

        uint lower = 0;
        uint upper = nCheckpoints - 1;
        while (upper > lower) {
            uint center = upper - (upper - lower) / 2; // ceil, avoiding overflow
            Checkpoint memory cp = checkpoints[account][center];
            if (cp.timestamp == timestamp) {
                return center;
            } else if (cp.timestamp < timestamp) {
                lower = center;
            } else {
                upper = center - 1;
            }
        }
        return lower;
    }

    function getPriorSupplyIndex(uint timestamp) public view returns (uint) {
        uint nCheckpoints = supplyNumCheckpoints;
        if (nCheckpoints == 0) {
            return 0;
        }

        // First check most recent balance
        if (supplyCheckpoints[nCheckpoints - 1].timestamp <= timestamp) {
            return (nCheckpoints - 1);
        }

        // Next check implicit zero balance
        if (supplyCheckpoints[0].timestamp > timestamp) {
            return 0;
        }

        uint lower = 0;
        uint upper = nCheckpoints - 1;
        while (upper > lower) {
            uint center = upper - (upper - lower) / 2; // ceil, avoiding overflow
            SupplyCheckpoint memory cp = supplyCheckpoints[center];
            if (cp.timestamp == timestamp) {
                return center;
            } else if (cp.timestamp < timestamp) {
                lower = center;
            } else {
                upper = center - 1;
            }
        }
        return lower;
    }

    function getPriorRewardPerToken(address token, uint timestamp) public view returns (uint, uint) {
        uint nCheckpoints = rewardPerTokenNumCheckpoints[token];
        if (nCheckpoints == 0) {
            return (0,0);
        }

        // First check most recent balance
        if (rewardPerTokenCheckpoints[token][nCheckpoints - 1].timestamp <= timestamp) {
            return (rewardPerTokenCheckpoints[token][nCheckpoints - 1].rewardPerToken, rewardPerTokenCheckpoints[token][nCheckpoints - 1].timestamp);
        }

        // Next check implicit zero balance
        if (rewardPerTokenCheckpoints[token][0].timestamp > timestamp) {
            return (0,0);
        }

        uint lower = 0;
        uint upper = nCheckpoints - 1;
        while (upper > lower) {
            uint center = upper - (upper - lower) / 2; // ceil, avoiding overflow
            RewardPerTokenCheckpoint memory cp = rewardPerTokenCheckpoints[token][center];
            if (cp.timestamp == timestamp) {
                return (cp.rewardPerToken, cp.timestamp);
            } else if (cp.timestamp < timestamp) {
                lower = center;
            } else {
                upper = center - 1;
            }
        }
        return (rewardPerTokenCheckpoints[token][lower].rewardPerToken, rewardPerTokenCheckpoints[token][lower].timestamp);
    }

    function _writeCheckpoint(address account, uint balance) internal {
        uint _timestamp = block.timestamp;
        uint _nCheckPoints = numCheckpoints[account];

        if (_nCheckPoints > 0 && checkpoints[account][_nCheckPoints - 1].timestamp == _timestamp) {
            checkpoints[account][_nCheckPoints - 1].balanceOf = balance;
        } else {
            checkpoints[account][_nCheckPoints] = Checkpoint(_timestamp, balance);
            numCheckpoints[account] = _nCheckPoints + 1;
        }
    }

    function _writeRewardPerTokenCheckpoint(address token, uint reward, uint timestamp) internal {
        uint _nCheckPoints = rewardPerTokenNumCheckpoints[token];

        if (_nCheckPoints > 0 && rewardPerTokenCheckpoints[token][_nCheckPoints - 1].timestamp == timestamp) {
            rewardPerTokenCheckpoints[token][_nCheckPoints - 1].rewardPerToken = reward;
        } else {
            rewardPerTokenCheckpoints[token][_nCheckPoints] = RewardPerTokenCheckpoint(timestamp, reward);
            rewardPerTokenNumCheckpoints[token] = _nCheckPoints + 1;
        }
    }

    function _writeSupplyCheckpoint() internal {
        uint _nCheckPoints = supplyNumCheckpoints;
        uint _timestamp = block.timestamp;

        if (_nCheckPoints > 0 && supplyCheckpoints[_nCheckPoints - 1].timestamp == _timestamp) {
            supplyCheckpoints[_nCheckPoints - 1].supply = derivedSupply;
        } else {
            supplyCheckpoints[_nCheckPoints] = SupplyCheckpoint(_timestamp, derivedSupply);
            supplyNumCheckpoints = _nCheckPoints + 1;
        }
    }

    function rewardsListLength() external view returns (uint) {
        return rewards.length;
    }

    // returns the last time the reward was modified or periodFinish if the reward has ended
    function lastTimeRewardApplicable(address token) public view returns (uint) {
        return Math.min(block.timestamp, periodFinish[token]);
    }

    function getReward(address account, address[] memory tokens) external lock {
        require(msg.sender == account || msg.sender == voter);
        _unlocked = 1;
        IVoter(voter).distribute(address(this));
        _unlocked = 2;

        for (uint i = 0; i < tokens.length; i++) {
            (rewardPerTokenStored[tokens[i]], lastUpdateTime[tokens[i]]) = _updateRewardPerToken(tokens[i], type(uint).max, true);

            uint _reward = earned(tokens[i], account);
            lastEarn[tokens[i]][account] = block.timestamp;
            userRewardPerTokenStored[tokens[i]][account] = rewardPerTokenStored[tokens[i]];
            if (_reward > 0) _safeTransfer(tokens[i], account, _reward);

            emit ClaimRewards(msg.sender, tokens[i], _reward);
        }

        uint _derivedBalance = derivedBalances[account];
        derivedSupply -= _derivedBalance;
        _derivedBalance = derivedBalance(account);
        derivedBalances[account] = _derivedBalance;
        derivedSupply += _derivedBalance;

        _writeCheckpoint(account, derivedBalances[account]);
        _writeSupplyCheckpoint();
    }


    function rewardPerToken(address token) public view returns (uint) {
        if (derivedSupply == 0) {
            return rewardPerTokenStored[token];
        }
        return rewardPerTokenStored[token] + ((lastTimeRewardApplicable(token) - Math.min(lastUpdateTime[token], periodFinish[token])) * rewardRate[token] * PRECISION / derivedSupply);
    }

    function derivedBalance(address account) public view returns (uint) {
        return balanceOf[account];
    }

    function batchRewardPerToken(address token, uint maxRuns) external {
        (rewardPerTokenStored[token], lastUpdateTime[token])  = _batchRewardPerToken(token, maxRuns);
    }

    function _batchRewardPerToken(address token, uint maxRuns) internal returns (uint, uint) {
        uint _startTimestamp = lastUpdateTime[token];
        uint reward = rewardPerTokenStored[token];

        if (supplyNumCheckpoints == 0) {
            return (reward, _startTimestamp);
        }

        if (rewardRate[token] == 0) {
            return (reward, block.timestamp);
        }

        uint _startIndex = getPriorSupplyIndex(_startTimestamp);
        uint _endIndex = Math.min(supplyNumCheckpoints-1, maxRuns);

        for (uint i = _startIndex; i < _endIndex; i++) {
            SupplyCheckpoint memory sp0 = supplyCheckpoints[i];
            if (sp0.supply > 0) {
                SupplyCheckpoint memory sp1 = supplyCheckpoints[i+1];
                (uint _reward, uint _endTime) = _calcRewardPerToken(token, sp1.timestamp, sp0.timestamp, sp0.supply, _startTimestamp);
                reward += _reward;
                _writeRewardPerTokenCheckpoint(token, reward, _endTime);
                _startTimestamp = _endTime;
            }
        }

        return (reward, _startTimestamp);
    }

    function _calcRewardPerToken(address token, uint timestamp1, uint timestamp0, uint supply, uint startTimestamp) internal view returns (uint, uint) {
        uint endTime = Math.max(timestamp1, startTimestamp);
        return (((Math.min(endTime, periodFinish[token]) - Math.min(Math.max(timestamp0, startTimestamp), periodFinish[token])) * rewardRate[token] * PRECISION / supply), endTime);
    }

    /// @dev Update stored rewardPerToken values without the last one snapshot
    ///      If the contract will get "out of gas" error on users actions this will be helpful
    function batchUpdateRewardPerToken(address token, uint maxRuns) external {
      (rewardPerTokenStored[token], lastUpdateTime[token]) = _updateRewardPerToken(token, maxRuns, false);
    }

    function _updateRewardForAllTokens() internal {
      uint length = rewards.length;
      for (uint i; i < length; i++) {
        address token = rewards[i];
        (rewardPerTokenStored[token], lastUpdateTime[token]) = _updateRewardPerToken(token, type(uint).max, true);
      }
    }

    function _updateRewardPerToken(address token, uint maxRuns, bool actualLast) internal returns (uint, uint) {
        uint _startTimestamp = lastUpdateTime[token];
        uint reward = rewardPerTokenStored[token];

        if (supplyNumCheckpoints == 0) {
            return (reward, _startTimestamp);
        }

        if (rewardRate[token] == 0) {
            return (reward, block.timestamp);
        }

        uint _startIndex = getPriorSupplyIndex(_startTimestamp);
        uint _endIndex = Math.min(supplyNumCheckpoints - 1, maxRuns);

        if (_endIndex > 0) {
            for (uint i = _startIndex; i <= _endIndex - 1; i++) {
                SupplyCheckpoint memory sp0 = supplyCheckpoints[i];
                if (sp0.supply > 0) {
                    SupplyCheckpoint memory sp1 = supplyCheckpoints[i+1];
                    (uint _reward, uint _endTime) = _calcRewardPerToken(token, sp1.timestamp, sp0.timestamp, sp0.supply, _startTimestamp);
                    reward += _reward;
                    _writeRewardPerTokenCheckpoint(token, reward, _endTime);
                    _startTimestamp = _endTime;
                }
            }
        }

        // need to override the last value with actual numbers only on deposit/withdraw/claim/notify actions
        if (actualLast) {
            SupplyCheckpoint memory sp = supplyCheckpoints[_endIndex];
            if (sp.supply > 0) {
                (uint _reward,) = _calcRewardPerToken(token, lastTimeRewardApplicable(token), Math.max(sp.timestamp, _startTimestamp), sp.supply, _startTimestamp);
                reward += _reward;
                _writeRewardPerTokenCheckpoint(token, reward, block.timestamp);
                _startTimestamp = block.timestamp;
            }
        }

        return (reward, _startTimestamp);
    }

    // earned is an estimation, it won't be exact till the supply > rewardPerToken calculations have run
    function earned(address token, address account) public view returns (uint) {
        uint _startTimestamp = Math.max(lastEarn[token][account], rewardPerTokenCheckpoints[token][0].timestamp);
        if (numCheckpoints[account] == 0) {
            return 0;
        }

        uint _startIndex = getPriorBalanceIndex(account, _startTimestamp);
        uint _endIndex = numCheckpoints[account]-1;

        uint reward = 0;

        if (_endIndex > 0) {
            for (uint i = _startIndex; i <= _endIndex-1; i++) {
                Checkpoint memory cp0 = checkpoints[account][i];
                Checkpoint memory cp1 = checkpoints[account][i+1];
                (uint _rewardPerTokenStored0,) = getPriorRewardPerToken(token, cp0.timestamp);
                (uint _rewardPerTokenStored1,) = getPriorRewardPerToken(token, cp1.timestamp);
                reward += cp0.balanceOf * (_rewardPerTokenStored1 - _rewardPerTokenStored0) / PRECISION;
            }
        }

        Checkpoint memory cp = checkpoints[account][_endIndex];
        (uint _rewardPerTokenStored,) = getPriorRewardPerToken(token, cp.timestamp);
        reward += cp.balanceOf * (rewardPerToken(token) - Math.max(_rewardPerTokenStored, userRewardPerTokenStored[token][account])) / PRECISION;

        return reward;
    }

    function depositAll(uint tokenId) external {
        deposit(IERC20(stake).balanceOf(msg.sender), tokenId);
    }

    function deposit(uint amount, uint tokenId) public lock {
        require(amount > 0);
        _updateRewardForAllTokens();

        _safeTransferFrom(stake, msg.sender, address(this), amount);
        totalSupply += amount;
        balanceOf[msg.sender] += amount;

        if (tokenId > 0) {
            require(IVotingEscrow(_ve).ownerOf(tokenId) == msg.sender);
            if (tokenIds[msg.sender] == 0) {
                tokenIds[msg.sender] = tokenId;
                IVoter(voter).attachTokenToGauge(tokenId, msg.sender);
            }
            require(tokenIds[msg.sender] == tokenId);
        } else {
            tokenId = tokenIds[msg.sender];
        }

        uint _derivedBalance = derivedBalances[msg.sender];
        derivedSupply -= _derivedBalance;
        _derivedBalance = derivedBalance(msg.sender);
        derivedBalances[msg.sender] = _derivedBalance;
        derivedSupply += _derivedBalance;

        _writeCheckpoint(msg.sender, _derivedBalance);
        _writeSupplyCheckpoint();

        IVoter(voter).emitDeposit(tokenId, msg.sender, amount);
        emit Deposit(msg.sender, tokenId, amount);
    }

    function withdrawAll() external {
        withdraw(balanceOf[msg.sender]);
    }

    function withdraw(uint amount) public {
        uint tokenId = 0;
        if (amount == balanceOf[msg.sender]) {
            tokenId = tokenIds[msg.sender];
        }
        withdrawToken(amount, tokenId);
    }

    function withdrawToken(uint amount, uint tokenId) public lock {
        _updateRewardForAllTokens();

        totalSupply -= amount;
        balanceOf[msg.sender] -= amount;
        _safeTransfer(stake, msg.sender, amount);

        if (tokenId > 0) {
            require(tokenId == tokenIds[msg.sender]);
            tokenIds[msg.sender] = 0;
            IVoter(voter).detachTokenFromGauge(tokenId, msg.sender);
        } else {
            tokenId = tokenIds[msg.sender];
        }

        uint _derivedBalance = derivedBalances[msg.sender];
        derivedSupply -= _derivedBalance;
        _derivedBalance = derivedBalance(msg.sender);
        derivedBalances[msg.sender] = _derivedBalance;
        derivedSupply += _derivedBalance;

        _writeCheckpoint(msg.sender, derivedBalances[msg.sender]);
        _writeSupplyCheckpoint();

        IVoter(voter).emitWithdraw(tokenId, msg.sender, amount);
        emit Withdraw(msg.sender, tokenId, amount);
    }

    function left(address token) external view returns (uint) {
        if (block.timestamp >= periodFinish[token]) return 0;
        uint _remaining = periodFinish[token] - block.timestamp;
        return _remaining * rewardRate[token];
    }

    function notifyRewardAmount(address token, uint amount) external lock {
        require(token != stake);
        require(amount > 0);
        if (!isReward[token]) {
            require(IVoter(voter).isWhitelisted(token), "rewards tokens must be whitelisted");
            require(rewards.length < MAX_REWARD_TOKENS, "too many rewards tokens");
        }
        if (rewardRate[token] == 0) _writeRewardPerTokenCheckpoint(token, 0, block.timestamp);
        (rewardPerTokenStored[token], lastUpdateTime[token]) = _updateRewardPerToken(token, type(uint).max, true);
        _claimFees();

        if (block.timestamp >= periodFinish[token]) {
            _safeTransferFrom(token, msg.sender, address(this), amount);
            rewardRate[token] = amount / DURATION;
        } else {
            uint _remaining = periodFinish[token] - block.timestamp;
            uint _left = _remaining * rewardRate[token];
            require(amount > _left);
            _safeTransferFrom(token, msg.sender, address(this), amount);
            rewardRate[token] = (amount + _left) / DURATION;
        }
        require(rewardRate[token] > 0);
        uint balance = IERC20(token).balanceOf(address(this));
        require(rewardRate[token] <= balance / DURATION, "Provided reward too high");
        periodFinish[token] = block.timestamp + DURATION;
        if (!isReward[token]) {
            isReward[token] = true;
            rewards.push(token);
        }

        emit NotifyReward(msg.sender, token, amount);
    }

    function swapOutRewardToken(uint i, address oldToken, address newToken) external {
        require(msg.sender == IVotingEscrow(_ve).team(), 'only team');
        require(rewards[i] == oldToken);
        isReward[oldToken] = false;
        isReward[newToken] = true;
        rewards[i] = newToken;
    }

    function _safeTransfer(address token, address to, uint256 value) internal {
        require(token.code.length > 0);
        (bool success, bytes memory data) =
        token.call(abi.encodeWithSelector(IERC20.transfer.selector, to, value));
        require(success && (data.length == 0 || abi.decode(data, (bool))));
    }

    function _safeTransferFrom(address token, address from, address to, uint256 value) internal {
        require(token.code.length > 0);
        (bool success, bytes memory data) =
        token.call(abi.encodeWithSelector(IERC20.transferFrom.selector, from, to, value));
        require(success && (data.length == 0 || abi.decode(data, (bool))));
    }

    function _safeApprove(address token, address spender, uint256 value) internal {
        require(token.code.length > 0);
        (bool success, bytes memory data) =
        token.call(abi.encodeWithSelector(IERC20.approve.selector, spender, value));
        require(success && (data.length == 0 || abi.decode(data, (bool))));
    }
}

Contract Security Audit

Contract ABI

[{"inputs":[{"internalType":"address","name":"_stake","type":"address"},{"internalType":"address","name":"_internal_bribe","type":"address"},{"internalType":"address","name":"_external_bribe","type":"address"},{"internalType":"address","name":"__ve","type":"address"},{"internalType":"address","name":"_voter","type":"address"},{"internalType":"bool","name":"_forPair","type":"bool"},{"internalType":"address[]","name":"_allowedRewardTokens","type":"address[]"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":false,"internalType":"uint256","name":"claimed0","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"claimed1","type":"uint256"}],"name":"ClaimFees","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"reward","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"ClaimRewards","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":false,"internalType":"uint256","name":"tokenId","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"Deposit","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"reward","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"NotifyReward","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":false,"internalType":"uint256","name":"tokenId","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"Withdraw","type":"event"},{"inputs":[],"name":"_ve","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"token","type":"address"},{"internalType":"uint256","name":"maxRuns","type":"uint256"}],"name":"batchRewardPerToken","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"token","type":"address"},{"internalType":"uint256","name":"maxRuns","type":"uint256"}],"name":"batchUpdateRewardPerToken","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"uint256","name":"","type":"uint256"}],"name":"checkpoints","outputs":[{"internalType":"uint256","name":"timestamp","type":"uint256"},{"internalType":"uint256","name":"balanceOf","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"claimFees","outputs":[{"internalType":"uint256","name":"claimed0","type":"uint256"},{"internalType":"uint256","name":"claimed1","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"deposit","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"depositAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"derivedBalance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"derivedBalances","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"derivedSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"token","type":"address"},{"internalType":"address","name":"account","type":"address"}],"name":"earned","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"external_bribe","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"fees0","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"fees1","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"uint256","name":"timestamp","type":"uint256"}],"name":"getPriorBalanceIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"token","type":"address"},{"internalType":"uint256","name":"timestamp","type":"uint256"}],"name":"getPriorRewardPerToken","outputs":[{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"timestamp","type":"uint256"}],"name":"getPriorSupplyIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"address[]","name":"tokens","type":"address[]"}],"name":"getReward","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"internal_bribe","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"isForPair","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"isReward","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"address","name":"","type":"address"}],"name":"lastEarn","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"token","type":"address"}],"name":"lastTimeRewardApplicable","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"lastUpdateTime","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"token","type":"address"}],"name":"left","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"token","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"notifyRewardAmount","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"numCheckpoints","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"periodFinish","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"token","type":"address"}],"name":"rewardPerToken","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"uint256","name":"","type":"uint256"}],"name":"rewardPerTokenCheckpoints","outputs":[{"internalType":"uint256","name":"timestamp","type":"uint256"},{"internalType":"uint256","name":"rewardPerToken","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"rewardPerTokenNumCheckpoints","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"rewardPerTokenStored","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"rewardRate","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"rewards","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"rewardsListLength","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"stake","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"supplyCheckpoints","outputs":[{"internalType":"uint256","name":"timestamp","type":"uint256"},{"internalType":"uint256","name":"supply","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"supplyNumCheckpoints","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"i","type":"uint256"},{"internalType":"address","name":"oldToken","type":"address"},{"internalType":"address","name":"newToken","type":"address"}],"name":"swapOutRewardToken","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"tokenIds","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"address","name":"","type":"address"}],"name":"userRewardPerTokenStored","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"voter","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"withdrawAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"withdrawToken","outputs":[],"stateMutability":"nonpayable","type":"function"}]

Deployed Bytecode

0x608060405234801561001057600080fd5b50600436106102955760003560e01c8063853828b611610167578063d7da4bb0116100ce578063f122977711610087578063f1229777146106fe578063f301af4214610711578063f7412baf14610724578063fc97a3031461074b578063fd3140981461076b578063fdb483c71461077e57600080fd5b8063d7da4bb0146106a4578063da09d19d146106ad578063e2bbb158146106cd578063e5748213146106e0578063e6886396146106ed578063e8111a12146106f557600080fd5b8063a495e5b511610120578063a495e5b514610602578063aa4796521461062d578063b66503cf1461064d578063c6f678bd14610660578063d294f09314610673578063d35e25441461067b57600080fd5b8063853828b6146105845780638dd598fb1461058c57806393f1c442146105b35780639418f939146105bc57806399bcc052146105cf5780639ce43f90146105e257600080fd5b80633ca068b61161020b57806363fb415b116101c457806363fb415b146104d757806368fcee1a146104f75780636fcfff451461050a57806370a082311461052a57806376f4be361461054a578063770f85711461055d57600080fd5b80633ca068b61461042357806346c96aac1461044e5780634c02a21c146104755780634d5ce0381461047e5780635a45d052146104b1578063638634ee146104c457600080fd5b8063211dc32d1161025d578063211dc32d14610381578063221ca18c146103945780632ce9aead146103b45780632e1a7d4d146103d457806331279d3d146103e95780633a4b66f1146103fc57600080fd5b806301316ddf1461029a57806303fbf83a146102e65780630cdfebfa14610325578063115c6f391461035757806318160ddd14610378575b600080fd5b6102cc6102a836600461303d565b60126020908152600092835260408084209091529082529020805460019091015482565b604080519283526020830191909152015b60405180910390f35b61030d7f0000000000000000000000007928f8d5c549cc738d278172e82094939258dfd781565b6040516001600160a01b0390911681526020016102dd565b6102cc61033336600461303d565b600e6020908152600092835260408084209091529082529020805460019091015482565b61036a61036536600461303d565b610791565b6040519081526020016102dd565b61036a600a5481565b61036a61038f366004613069565b610900565b61036a6103a23660046130a2565b60036020526000908152604090205481565b61036a6103c23660046130a2565b60056020526000908152604090205481565b6103e76103e23660046130bf565b610b84565b005b6103e76103f73660046130ee565b610bba565b61030d7f00000000000000000000000046b8a98d72820e28465a172687af920cc167e58781565b61036a610431366004613069565b600860209081526000928352604080842090915290825290205481565b61030d7f00000000000000000000000009236cff45047dbee6b921e00704bed6d6b8cf7e81565b61036a60155481565b6104a161048c3660046130a2565b600d6020526000908152604090205460ff1681565b60405190151581526020016102dd565b6103e76104bf36600461303d565b610fba565b61036a6104d23660046130a2565b610ff2565b61036a6104e53660046130a2565b60016020526000908152604090205481565b6103e761050536600461303d565b611016565b61036a6105183660046130a2565b600f6020526000908152604090205481565b61036a6105383660046130a2565b600b6020526000908152604090205481565b61036a6105583660046130bf565b611022565b61030d7f000000000000000000000000a911b106ca6cb07c70d8ec6d5cdd42e99f4e16e881565b6103e7611156565b61030d7f0000000000000000000000009c7305eb78a432ced5c4d14cac27e8ed569a2e2681565b61036a60145481565b6103e76105ca3660046131c8565b611171565b61036a6105dd3660046130a2565b611302565b61036a6105f03660046130a2565b60066020526000908152604090205481565b61036a610610366004613069565b600760209081526000928352604080842090915290825290205481565b61036a61063b3660046130a2565b60136020526000908152604090205481565b6103e761065b36600461303d565b611373565b6103e761066e3660046130bf565b611865565b6102cc6118fa565b61036a6106893660046130a2565b6001600160a01b03166000908152600b602052604090205490565b61036a60005481565b61036a6106bb3660046130a2565b60046020526000908152604090205481565b6103e76106db36600461320a565b611926565b6002546104a19060ff1681565b600c5461036a565b61036a60115481565b61036a61070c3660046130a2565b611c73565b61030d61071f3660046130bf565b611d32565b6102cc6107323660046130bf565b6010602052600090815260409020805460019091015482565b61036a6107593660046130a2565b60096020526000908152604090205481565b6102cc61077936600461303d565b611d5c565b6103e761078c36600461320a565b611f7d565b6001600160a01b0382166000908152600f60205260408120548082036107bb5760009150506108fa565b6001600160a01b0384166000908152600e6020526040812084916107e0600185613242565b8152602001908152602001600020600001541161080a57610802600182613242565b9150506108fa565b6001600160a01b0384166000908152600e6020908152604080832083805290915290205483101561083f5760009150506108fa565b60008061084d600184613242565b90505b818111156108f557600060026108668484613242565b6108709190613259565b61087a9083613242565b6001600160a01b0388166000908152600e602090815260408083208484528252918290208251808401909352805480845260019091015491830191909152919250908790036108cf575093506108fa92505050565b80518711156108e0578193506108ee565b6108eb600183613242565b92505b5050610850565b509150505b92915050565b6001600160a01b0380831660008181526007602090815260408083209486168352938152838220549282526012815283822082805290529182205482916109469161220c565b6001600160a01b0384166000908152600f6020526040812054919250036109715760009150506108fa565b600061097d8483610791565b6001600160a01b0385166000908152600f6020526040812054919250906109a690600190613242565b905060008115610ab857825b6109bd600184613242565b8111610ab6576001600160a01b0387166000818152600e602081815260408084208685528083528185208251808401909352805483526001908101548385015295855292909152928290610a1290869061327b565b81526020019081526020016000206040518060400160405290816000820154815260200160018201548152505090506000610a518b8460000151611d5c565b5090506000610a648c8460000151611d5c565b509050670de0b6b3a7640000610a7a8383613242565b8560200151610a899190613293565b610a939190613259565b610a9d908761327b565b9550505050508080610aae906132b2565b9150506109b2565b505b6001600160a01b0386166000908152600e60209081526040808320858452825280832081518083019092528054808352600190910154928201929092529190610b02908a90611d5c565b506001600160a01b03808b166000908152600860209081526040808320938d1683529290522054909150670de0b6b3a764000090610b4190839061220c565b610b4a8b611c73565b610b549190613242565b8360200151610b639190613293565b610b6d9190613259565b610b77908461327b565b9998505050505050505050565b336000908152600b60205260408120548203610bac5750336000908152600960205260409020545b610bb68282611f7d565b5050565b601654600114610bc957600080fd5b6002601655336001600160a01b0383161480610c0d5750336001600160a01b037f00000000000000000000000009236cff45047dbee6b921e00704bed6d6b8cf7e16145b610c1657600080fd5b60016016556040516363453ae160e01b81523060048201527f00000000000000000000000009236cff45047dbee6b921e00704bed6d6b8cf7e6001600160a01b0316906363453ae190602401600060405180830381600087803b158015610c7c57600080fd5b505af1158015610c90573d6000803e3d6000fd5b5050600260165550600090505b8151811015610f1357610ccd828281518110610cbb57610cbb6132cb565b60200260200101516000196001612223565b60066000858581518110610ce357610ce36132cb565b60200260200101516001600160a01b03166001600160a01b03168152602001908152602001600020600060056000878781518110610d2357610d236132cb565b60200260200101516001600160a01b03166001600160a01b0316815260200190815260200160002060008491905055839190505550506000610d7e838381518110610d7057610d706132cb565b602002602001015185610900565b90504260076000858581518110610d9757610d976132cb565b60200260200101516001600160a01b03166001600160a01b031681526020019081526020016000206000866001600160a01b03166001600160a01b031681526020019081526020016000208190555060066000848481518110610dfc57610dfc6132cb565b60200260200101516001600160a01b03166001600160a01b031681526020019081526020016000205460086000858581518110610e3b57610e3b6132cb565b6020908102919091018101516001600160a01b039081168352828201939093526040918201600090812093891681529290529020558015610e9a57610e9a838381518110610e8b57610e8b6132cb565b60200260200101518583612413565b828281518110610eac57610eac6132cb565b60200260200101516001600160a01b0316336001600160a01b03167f9aa05b3d70a9e3e2f004f039648839560576334fb45c81f91b6db03ad9e2efc983604051610ef891815260200190565b60405180910390a35080610f0b816132b2565b915050610c9d565b506001600160a01b0382166000908152600160205260408120548154909182918190610f40908490613242565b9091555050506001600160a01b0382166000908152600b6020908152604080832054600190925282208190558154909182918190610f7f90849061327b565b90915550506001600160a01b038316600090815260016020526040902054610fa8908490612513565b610fb061261e565b5050600160165550565b610fc482826126c1565b6001600160a01b03909316600090815260066020908152604080832060059092529091209390935590915550565b6001600160a01b0381166000908152600460205260408120546108fa904290612824565b610fc482826000612223565b6011546000908082036110385750600092915050565b8260106000611048600185613242565b815260200190815260200160002060000154116110715761106a600182613242565b9392505050565b6000805260106020527f6e0956cda88cad152e89927e53611735b61a5c762d1428573c6931b0a5efcb01548310156110ac5750600092915050565b6000806110ba600184613242565b90505b8181111561114e57600060026110d38484613242565b6110dd9190613259565b6110e79083613242565b600081815260106020908152604091829020825180840190935280548084526001909101549183019190915291925090879003611128575095945050505050565b805187111561113957819350611147565b611144600183613242565b92505b50506110bd565b509392505050565b336000908152600b602052604090205461116f90610b84565b565b7f0000000000000000000000009c7305eb78a432ced5c4d14cac27e8ed569a2e266001600160a01b03166385f2aef26040518163ffffffff1660e01b81526004016020604051808303816000875af11580156111d1573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906111f591906132e1565b6001600160a01b0316336001600160a01b0316146112465760405162461bcd60e51b81526020600482015260096024820152686f6e6c79207465616d60b81b60448201526064015b60405180910390fd5b816001600160a01b0316600c8481548110611263576112636132cb565b6000918252602090912001546001600160a01b03161461128257600080fd5b6001600160a01b038083166000908152600d6020526040808220805460ff199081169091559284168252902080549091166001179055600c8054829190859081106112cf576112cf6132cb565b9060005260206000200160006101000a8154816001600160a01b0302191690836001600160a01b03160217905550505050565b6001600160a01b038116600090815260046020526040812054421061132957506000919050565b6001600160a01b03821660009081526004602052604081205461134d904290613242565b6001600160a01b03841660009081526003602052604090205490915061106a9082613293565b60165460011461138257600080fd5b60026016556001600160a01b037f00000000000000000000000046b8a98d72820e28465a172687af920cc167e5878116908316036113bf57600080fd5b600081116113cc57600080fd5b6001600160a01b0382166000908152600d602052604090205460ff1661151f57604051633af32abf60e01b81526001600160a01b0383811660048301527f00000000000000000000000009236cff45047dbee6b921e00704bed6d6b8cf7e1690633af32abf90602401602060405180830381865afa158015611452573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061147691906132fe565b6114cd5760405162461bcd60e51b815260206004820152602260248201527f7265776172647320746f6b656e73206d7573742062652077686974656c697374604482015261195960f21b606482015260840161123d565b600c5460101161151f5760405162461bcd60e51b815260206004820152601760248201527f746f6f206d616e79207265776172647320746f6b656e73000000000000000000604482015260640161123d565b6001600160a01b038216600090815260036020526040812054900361154a5761154a82600042612833565b611558826000196001612223565b6001600160a01b038416600090815260066020908152604080832060059092529091209190915555611588612922565b50506001600160a01b03821660009081526004602052604090205442106115e0576115b582333084612d97565b6115c262093a8082613259565b6001600160a01b038316600090815260036020526040902055611679565b6001600160a01b038216600090815260046020526040812054611604904290613242565b6001600160a01b0384166000908152600360205260408120549192509061162b9083613293565b905080831161163957600080fd5b61164584333086612d97565b62093a80611653828561327b565b61165d9190613259565b6001600160a01b03851660009081526003602052604090205550505b6001600160a01b03821660009081526003602052604090205461169b57600080fd5b6040516370a0823160e01b81523060048201526000906001600160a01b038416906370a0823190602401602060405180830381865afa1580156116e2573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906117069190613320565b905061171562093a8082613259565b6001600160a01b038416600090815260036020526040902054111561177c5760405162461bcd60e51b815260206004820152601860248201527f50726f76696465642072657761726420746f6f20686967680000000000000000604482015260640161123d565b61178962093a804261327b565b6001600160a01b038416600090815260046020908152604080832093909355600d9052205460ff1661181b576001600160a01b0383166000818152600d60205260408120805460ff19166001908117909155600c805491820181559091527fdf6966c971051c3d54ec59162606531493a51404a002842f56009d7e5cf4a8c70180546001600160a01b03191690911790555b6040518281526001600160a01b0384169033907ff70d5c697de7ea828df48e5c4573cb2194c659f1901f70110c52b066dcf508269060200160405180910390a35050600160165550565b6040516370a0823160e01b81523360048201526118f7907f00000000000000000000000046b8a98d72820e28465a172687af920cc167e5876001600160a01b0316906370a0823190602401602060405180830381865afa1580156118cd573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906118f19190613320565b82611926565b50565b60008060165460011461190c57600080fd5b6002601655611919612922565b9150915060016016559091565b60165460011461193557600080fd5b60026016558161194457600080fd5b61194c612e8f565b6119787f00000000000000000000000046b8a98d72820e28465a172687af920cc167e587333085612d97565b81600a600082825461198a919061327b565b9091555050336000908152600b6020526040812080548492906119ae90849061327b565b90915550508015611b22576040516331a9108f60e11b81526004810182905233906001600160a01b037f0000000000000000000000009c7305eb78a432ced5c4d14cac27e8ed569a2e261690636352211e90602401602060405180830381865afa158015611a20573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611a4491906132e1565b6001600160a01b031614611a5757600080fd5b336000908152600960205260408120549003611b025733600081815260096020526040908190208390555163698473e360e01b81526004810183905260248101919091526001600160a01b037f00000000000000000000000009236cff45047dbee6b921e00704bed6d6b8cf7e169063698473e390604401600060405180830381600087803b158015611ae957600080fd5b505af1158015611afd573d6000803e3d6000fd5b505050505b336000908152600960205260409020548114611b1d57600080fd5b611b34565b50336000908152600960205260409020545b336000908152600160205260408120548154909182918190611b57908490613242565b9091555050336000908152600b60209081526040808320546001909252822081905581549092508291908190611b8e90849061327b565b90915550611b9e90503382612513565b611ba661261e565b60405163530e389d60e11b815260048101839052336024820152604481018490527f00000000000000000000000009236cff45047dbee6b921e00704bed6d6b8cf7e6001600160a01b03169063a61c713a90606401600060405180830381600087803b158015611c1557600080fd5b505af1158015611c29573d6000803e3d6000fd5b505060408051858152602081018790523393507f90890809c654f11d6e72a28fa60149770a0d11ec6c92319d6ceb2bb0a4ea1a159250015b60405180910390a25050600160165550565b60008054600003611c9a57506001600160a01b031660009081526006602052604090205490565b600080546001600160a01b038416825260036020908152604080842054600583528185205460049093529320549192670de0b6b3a7640000929091611cde91612824565b611ce786610ff2565b611cf19190613242565b611cfb9190613293565b611d059190613293565b611d0f9190613259565b6001600160a01b0383166000908152600660205260409020546108fa919061327b565b600c8181548110611d4257600080fd5b6000918252602090912001546001600160a01b0316905081565b6001600160a01b0382166000908152601360205260408120548190808203611d8b576000809250925050611f76565b6001600160a01b03851660009081526012602052604081208591611db0600185613242565b81526020019081526020016000206000015411611e4d576001600160a01b038516600090815260126020526040812090611deb600184613242565b81526020019081526020016000206001015460126000876001600160a01b03166001600160a01b031681526020019081526020016000206000600184611e319190613242565b8152602001908152602001600020600001549250925050611f76565b6001600160a01b0385166000908152601260209081526040808320838052909152902054841015611e85576000809250925050611f76565b600080611e93600184613242565b90505b81811115611f455760006002611eac8484613242565b611eb69190613259565b611ec09083613242565b6001600160a01b0389166000908152601260209081526040808320848452825291829020825180840190935280548084526001909101549183019190915291925090889003611f1f57602081015190519096509450611f769350505050565b8051881115611f3057819350611f3e565b611f3b600183613242565b92505b5050611e96565b506001600160a01b038616600090815260126020908152604080832093835292905220600181015490549093509150505b9250929050565b601654600114611f8c57600080fd5b6002601655611f99612e8f565b81600a6000828254611fab9190613242565b9091555050336000908152600b602052604081208054849290611fcf908490613242565b9091555061200090507f00000000000000000000000046b8a98d72820e28465a172687af920cc167e5873384612413565b80156120ba5733600090815260096020526040902054811461202157600080fd5b33600081815260096020526040808220919091555163411b1f7760e01b81526004810183905260248101919091526001600160a01b037f00000000000000000000000009236cff45047dbee6b921e00704bed6d6b8cf7e169063411b1f7790604401600060405180830381600087803b15801561209d57600080fd5b505af11580156120b1573d6000803e3d6000fd5b505050506120cc565b50336000908152600960205260409020545b3360009081526001602052604081205481549091829181906120ef908490613242565b9091555050336000908152600b6020908152604080832054600190925282208190558154909250829190819061212690849061327b565b9091555050336000818152600160205260409020546121459190612513565b61214d61261e565b604051633aa53b9160e21b815260048101839052336024820152604481018490527f00000000000000000000000009236cff45047dbee6b921e00704bed6d6b8cf7e6001600160a01b03169063ea94ee4490606401600060405180830381600087803b1580156121bc57600080fd5b505af11580156121d0573d6000803e3d6000fd5b505060408051858152602081018790523393507ff279e6a1f5e320cca91135676d9cb6e44ca8a08c0b88342bcdb1144f6511b568925001611c61565b60008183101561221c578161106a565b5090919050565b6001600160a01b038316600090815260056020908152604080832054600690925282205460115483929190830361225d579250905061240b565b6001600160a01b038716600090815260036020526040812054900361228857925042915061240b9050565b600061229383611022565b905060006122af60016011546122a99190613242565b89612824565b9050801561238857815b6122c4600183613242565b811161238657600081815260106020908152604091829020825180840190935280548352600101549082018190521561237357600060108161230785600161327b565b81526020019081526020016000206040518060400160405290816000820154815260200160018201548152505090506000806123528e8460000151866000015187602001518d612f13565b9092509050612361828961327b565b975061236e8e8983612833565b975050505b508061237e816132b2565b9150506122b9565b505b86156124025760008181526010602090815260409182902082518084019093528054835260010154908201819052156124005760006123e18b6123ca8d610ff2565b84516123d6908a61220c565b85602001518a612f13565b5090506123ee818661327b565b94506123fb8b8642612833565b429550505b505b50909350909150505b935093915050565b6000836001600160a01b03163b1161242a57600080fd5b6040516001600160a01b03838116602483015260448201839052600091829186169063a9059cbb60e01b906064015b60408051601f198184030181529181526020820180516001600160e01b03166001600160e01b03199094169390931790925290516124979190613339565b6000604051808303816000865af19150503d80600081146124d4576040519150601f19603f3d011682016040523d82523d6000602084013e6124d9565b606091505b509150915081801561250357508051158061250357508080602001905181019061250391906132fe565b61250c57600080fd5b5050505050565b6001600160a01b0382166000908152600f60205260409020544290801580159061257157506001600160a01b0384166000908152600e60205260408120839161255d600185613242565b815260200190815260200160002060000154145b156125b4576001600160a01b0384166000908152600e60205260408120849161259b600185613242565b8152602081019190915260400160002060010155612618565b60408051808201825283815260208082018681526001600160a01b0388166000908152600e83528481208682529092529290209051815590516001918201556125fe90829061327b565b6001600160a01b0385166000908152600f60205260409020555b50505050565b6011544281158015906126505750806010600061263c600186613242565b815260200190815260200160002060000154145b1561268157600054601060006001856126699190613242565b81526020810191909152604001600020600101555050565b604080518082018252828152600080546020808401918252868352601090529290209051815590516001918201556126ba90839061327b565b6011555050565b6001600160a01b03821660009081526005602090815260408083205460069092528220546011548392919083036126fb5792509050611f76565b6001600160a01b0386166000908152600360205260408120549003612726579250429150611f769050565b600061273183611022565b9050600061274d60016011546127479190613242565b88612824565b9050815b8181101561281557600081815260106020908152604091829020825180840190935280548352600101549082018190521561280257600060108161279685600161327b565b81526020019081526020016000206040518060400160405290816000820154815260200160018201548152505090506000806127e18d8460000151866000015187602001518d612f13565b90925090506127f0828961327b565b97506127fd8d8983612833565b975050505b508061280d816132b2565b915050612751565b50919792965091945050505050565b600081831061221c578161106a565b6001600160a01b038316600090815260136020526040902054801580159061288f57506001600160a01b0384166000908152601260205260408120839161287b600185613242565b815260200190815260200160002060000154145b156128b9576001600160a01b0384166000908152601260205260408120849161259b600185613242565b60408051808201825283815260208082018681526001600160a01b03881660009081526012835284812086825290925292902090518155905160019182015561290390829061327b565b6001600160a01b03851660009081526013602052604090205550505050565b600254600090819060ff1661293a5750600091829150565b7f00000000000000000000000046b8a98d72820e28465a172687af920cc167e5876001600160a01b031663d294f0936040518163ffffffff1660e01b815260040160408051808303816000875af1158015612999573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906129bd9190613374565b9092509050811515806129d05750600081115b15612d93576000826014546129e5919061327b565b90506000826015546129f7919061327b565b90506000807f00000000000000000000000046b8a98d72820e28465a172687af920cc167e5876001600160a01b0316639d63848a6040518163ffffffff1660e01b815260040160408051808303816000875af1158015612a5b573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612a7f9190613398565b604051634cde602960e11b81526001600160a01b0380841660048301529294509092507f000000000000000000000000a911b106ca6cb07c70d8ec6d5cdd42e99f4e16e8909116906399bcc05290602401602060405180830381865afa158015612aed573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612b119190613320565b84118015612b2b57506000612b2962093a8086613259565b115b15612be7576000601455612b60827f000000000000000000000000a911b106ca6cb07c70d8ec6d5cdd42e99f4e16e886612fce565b60405163b66503cf60e01b81526001600160a01b038381166004830152602482018690527f000000000000000000000000a911b106ca6cb07c70d8ec6d5cdd42e99f4e16e8169063b66503cf90604401600060405180830381600087803b158015612bca57600080fd5b505af1158015612bde573d6000803e3d6000fd5b50505050612bed565b60148490555b604051634cde602960e11b81526001600160a01b0382811660048301527f000000000000000000000000a911b106ca6cb07c70d8ec6d5cdd42e99f4e16e816906399bcc05290602401602060405180830381865afa158015612c53573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612c779190613320565b83118015612c9157506000612c8f62093a8085613259565b115b15612d4d576000601555612cc6817f000000000000000000000000a911b106ca6cb07c70d8ec6d5cdd42e99f4e16e885612fce565b60405163b66503cf60e01b81526001600160a01b038281166004830152602482018590527f000000000000000000000000a911b106ca6cb07c70d8ec6d5cdd42e99f4e16e8169063b66503cf90604401600060405180830381600087803b158015612d3057600080fd5b505af1158015612d44573d6000803e3d6000fd5b50505050612d53565b60158390555b604080518781526020810187905233917fbc567d6cbad26368064baa0ab5a757be46aae4d70f707f9203d9d9b6c8ccbfa3910160405180910390a2505050505b9091565b6000846001600160a01b03163b11612dae57600080fd5b604080516001600160a01b0385811660248301528481166044830152606480830185905283518084039091018152608490920183526020820180516001600160e01b03166323b872dd60e01b1790529151600092839290881691612e129190613339565b6000604051808303816000865af19150503d8060008114612e4f576040519150601f19603f3d011682016040523d82523d6000602084013e612e54565b606091505b5091509150818015612e7e575080511580612e7e575080806020019051810190612e7e91906132fe565b612e8757600080fd5b505050505050565b600c5460005b81811015610bb6576000600c8281548110612eb257612eb26132cb565b6000918252602090912001546001600160a01b03169050612ed7816000196001612223565b6001600160a01b039092166000908152600660209081526040808320600590925290912092909255905580612f0b816132b2565b915050612e95565b6000806000612f22878561220c565b6001600160a01b0389166000908152600360205260409020549091508590670de0b6b3a764000090612f75612f578a8961220c565b6001600160a01b038d16600090815260046020526040902054612824565b6001600160a01b038c16600090815260046020526040902054612f99908690612824565b612fa39190613242565b612fad9190613293565b612fb79190613293565b612fc19190613259565b9890975095505050505050565b6000836001600160a01b03163b11612fe557600080fd5b6040516001600160a01b03838116602483015260448201839052600091829186169063095ea7b360e01b90606401612459565b6001600160a01b03811681146118f757600080fd5b803561303881613018565b919050565b6000806040838503121561305057600080fd5b823561305b81613018565b946020939093013593505050565b6000806040838503121561307c57600080fd5b823561308781613018565b9150602083013561309781613018565b809150509250929050565b6000602082840312156130b457600080fd5b813561106a81613018565b6000602082840312156130d157600080fd5b5035919050565b634e487b7160e01b600052604160045260246000fd5b6000806040838503121561310157600080fd5b823561310c81613018565b915060208381013567ffffffffffffffff8082111561312a57600080fd5b818601915086601f83011261313e57600080fd5b813581811115613150576131506130d8565b8060051b604051601f19603f83011681018181108582111715613175576131756130d8565b60405291825284820192508381018501918983111561319357600080fd5b938501935b828510156131b8576131a98561302d565b84529385019392850192613198565b8096505050505050509250929050565b6000806000606084860312156131dd57600080fd5b8335925060208401356131ef81613018565b915060408401356131ff81613018565b809150509250925092565b6000806040838503121561321d57600080fd5b50508035926020909101359150565b634e487b7160e01b600052601160045260246000fd5b6000828210156132545761325461322c565b500390565b60008261327657634e487b7160e01b600052601260045260246000fd5b500490565b6000821982111561328e5761328e61322c565b500190565b60008160001904831182151516156132ad576132ad61322c565b500290565b6000600182016132c4576132c461322c565b5060010190565b634e487b7160e01b600052603260045260246000fd5b6000602082840312156132f357600080fd5b815161106a81613018565b60006020828403121561331057600080fd5b8151801515811461106a57600080fd5b60006020828403121561333257600080fd5b5051919050565b6000825160005b8181101561335a5760208186018101518583015201613340565b81811115613369576000828501525b509190910192915050565b6000806040838503121561338757600080fd5b505080516020909101519092909150565b600080604083850312156133ab57600080fd5b82516133b681613018565b60208401519092506130978161301856fea26469706673582212209cbd20125a25a94a5234f0308c21588b2e92d8d0a2106edd5a30cc6f6565597a64736f6c634300080d0033

Deployed ByteCode Sourcemap

5926:23948:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8167:96;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;783:25:1;;;839:2;824:18;;817:34;;;;756:18;8167:96:0;;;;;;;;6162:39;;;;;;;;-1:-1:-1;;;;;1026:32:1;;;1008:51;;996:2;981:18;6162:39:0;862:203:1;7682:68:0;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;11317:1058;;;;;;:::i;:::-;;:::i;:::-;;;1216:25:1;;;1204:2;1189:18;11317:1058:0;1070:177:1;7019:23:0;;;;;;22791:1317;;;;;;:::i;:::-;;:::i;6604:42::-;;;;;;:::i;:::-;;;;;;;;;;;;;;6704:46;;;;;;:::i;:::-;;;;;;;;;;;;;;25501:218;;;;;;:::i;:::-;;:::i;:::-;;16785:1144;;;;;;:::i;:::-;;:::i;5960:30::-;;;;;6885:76;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;6208:30;;;;;8422:17;;;;;;7130:40;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;3640:14:1;;3633:22;3615:41;;3603:2;3588:18;7130:40:0;3475:187:1;18422:178:0;;;;;;:::i;:::-;;:::i;16629:148::-;;;;;;:::i;:::-;;:::i;6279:47::-;;;;;;:::i;:::-;;;;;;;;;;;;;;20334:189;;;;;;:::i;:::-;;:::i;7817:47::-;;;;;;:::i;:::-;;;;;;;;;;;;;;7049:41;;;;;;:::i;:::-;;;;;;;;;;;;;;12383:1034;;;;;;:::i;:::-;;:::i;6116:39::-;;;;;25411:82;;;:::i;6049:28::-;;;;;8398:17;;;;;;28522:308;;;;;;:::i;:::-;;:::i;26724:243::-;;;;;;:::i;:::-;;:::i;6757:52::-;;;;;;:::i;:::-;;;;;;;;;;;;;;6818:60;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;8328:61;;;;;;:::i;:::-;;;;;;;;;;;;;;26975:1539;;;;;;:::i;:::-;;:::i;24116:115::-;;;;;;:::i;:::-;;:::i;9654:112::-;;;:::i;18302:::-;;;;;;:::i;:::-;-1:-1:-1;;;;;18388:18:0;18364:4;18388:18;;;:9;:18;;;;;;;18302:112;6247:25;;;;;;6653:44;;;;;;:::i;:::-;;;;;;;;;;;;;;24239:1164;;;;;;:::i;:::-;;:::i;6335:21::-;;;;;;;;;16429:98;16505:7;:14;16429:98;;8054:32;;;;;;17939:355;;;;;;:::i;:::-;;:::i;7099:24::-;;;;;;:::i;:::-;;:::i;7945:59::-;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;6970:40;;;;;;:::i;:::-;;;;;;;;;;;;;;13425:1374;;;;;;:::i;:::-;;:::i;25727:989::-;;;;;;:::i;:::-;;:::i;11317:1058::-;-1:-1:-1;;;;;11438:23:0;;11401:4;11438:23;;;:14;:23;;;;;;11476:17;;;11472:58;;11517:1;11510:8;;;;;11472:58;-1:-1:-1;;;;;11590:20:0;;;;;;:11;:20;;;;;11642:9;;11611:16;11626:1;11611:12;:16;:::i;:::-;11590:38;;;;;;;;;;;:48;;;:61;11586:119;;11676:16;11691:1;11676:12;:16;:::i;:::-;11668:25;;;;;11586:119;-1:-1:-1;;;;;11766:20:0;;;;;;:11;:20;;;;;;;;:23;;;;;;;;:33;:45;-1:-1:-1;11762:86:0;;;11835:1;11828:8;;;;;11762:86;11860:10;;11898:16;11913:1;11898:12;:16;:::i;:::-;11885:29;;11925:420;11940:5;11932;:13;11925:420;;;11962:11;12002:1;11985:13;11993:5;11985;:13;:::i;:::-;11984:19;;;;:::i;:::-;11976:27;;:5;:27;:::i;:::-;-1:-1:-1;;;;;12068:20:0;;12045;12068;;;:11;:20;;;;;;;;:28;;;;;;;;;12045:51;;;;;;;;;;;;;;;;;;;;;;;;;11962:41;;-1:-1:-1;12045:51:0;12115:25;;;12111:223;;-1:-1:-1;12168:6:0;-1:-1:-1;12161:13:0;;-1:-1:-1;;;12161:13:0;12111:223;12200:12;;:24;-1:-1:-1;12196:138:0;;;12253:6;12245:14;;12196:138;;;12308:10;12317:1;12308:6;:10;:::i;:::-;12300:18;;12196:138;11947:398;;11925:420;;;-1:-1:-1;12362:5:0;-1:-1:-1;;11317:1058:0;;;;;:::o;22791:1317::-;-1:-1:-1;;;;;22909:15:0;;;22860:4;22909:15;;;:8;:15;;;;;;;;:24;;;;;;;;;;;;22935:32;;;:25;:32;;;;;:35;;;;;;;;:45;22860:4;;22900:81;;:8;:81::i;:::-;-1:-1:-1;;;;;22996:23:0;;;;;;:14;:23;;;;;;22877:104;;-1:-1:-1;22996:28:0;22992:69;;23048:1;23041:8;;;;;22992:69;23073:16;23092:46;23113:7;23122:15;23092:20;:46::i;:::-;-1:-1:-1;;;;;23166:23:0;;23149:14;23166:23;;;:14;:23;;;;;;23073:65;;-1:-1:-1;23149:14:0;23166:25;;23190:1;;23166:25;:::i;:::-;23149:42;-1:-1:-1;23204:11:0;23236:13;;23232:543;;23280:11;23266:498;23298:11;23308:1;23298:9;:11;:::i;:::-;23293:1;:16;23266:498;;-1:-1:-1;;;;;23359:20:0;;23335:21;23359:20;;;:11;:20;;;;;;;;:23;;;;;;;;;23335:47;;;;;;;;;;;;;;;;;;;;;23425:20;;;;;;;23335:47;:21;;23446:3;;23380:1;;23446:3;:::i;:::-;23425:25;;;;;;;;;;;23401:49;;;;;;;;;;;;;;;;;;;;;;;;;;;23470:27;23502:44;23525:5;23532:3;:13;;;23502:22;:44::i;:::-;23469:77;;;23566:27;23598:44;23621:5;23628:3;:13;;;23598:22;:44::i;:::-;-1:-1:-1;23565:77:0;-1:-1:-1;6483:8:0;23688:47;23713:22;23565:77;23688:47;:::i;:::-;23671:3;:13;;;:65;;;;:::i;:::-;:77;;;;:::i;:::-;23661:87;;;;:::i;:::-;;;23316:448;;;;23311:3;;;;;:::i;:::-;;;;23266:498;;;;23232:543;-1:-1:-1;;;;;23810:20:0;;23787;23810;;;:11;:20;;;;;;;;:31;;;;;;;;23787:54;;;;;;;;;;;;;;;;;;;;;;;;;;:20;23884:43;;23907:5;;23884:22;:43::i;:::-;-1:-1:-1;;;;;;24020:31:0;;;;;;;:24;:31;;;;;;;;:40;;;;;;;;;;23852:75;;-1:-1:-1;6483:8:0;;23988:73;;23852:75;;23988:8;:73::i;:::-;23964:21;23979:5;23964:14;:21::i;:::-;:97;;;;:::i;:::-;23948:2;:12;;;:114;;;;:::i;:::-;:126;;;;:::i;:::-;23938:136;;;;:::i;:::-;;22791:1317;-1:-1:-1;;;;;;;;;22791:1317:0:o;25501:218::-;25601:10;25550:12;25591:21;;;:9;:21;;;;;;25581:31;;25577:94;;-1:-1:-1;25648:10:0;25639:20;;;;:8;:20;;;;;;25577:94;25681:30;25695:6;25703:7;25681:13;:30::i;:::-;25539:180;25501:218;:::o;16785:1144::-;9563:9;;9576:1;9563:14;9555:23;;;;;;9601:1;9589:9;:13;16879:10:::1;-1:-1:-1::0;;;;;16879:21:0;::::1;;::::0;:44:::1;;-1:-1:-1::0;16904:10:0::1;-1:-1:-1::0;;;;;16918:5:0::1;16904:19;;16879:44;16871:53;;;::::0;::::1;;16947:1;16935:9;:13:::0;16959:39:::1;::::0;-1:-1:-1;;;16959:39:0;;16992:4:::1;16959:39;::::0;::::1;1008:51:1::0;16966:5:0::1;-1:-1:-1::0;;;;;16959:24:0::1;::::0;::::1;::::0;981:18:1;;16959:39:0::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;-1:-1:-1::0;;17021:1:0::1;17009:9;:13:::0;-1:-1:-1;17040:6:0::1;::::0;-1:-1:-1;17035:537:0::1;17056:6;:13;17052:1;:17;17035:537;;;17154:54;17176:6;17183:1;17176:9;;;;;;;;:::i;:::-;;;;;;;-1:-1:-1::0;;17203:4:0::1;17154:21;:54::i;:::-;17092:20;:31;17113:6;17120:1;17113:9;;;;;;;;:::i;:::-;;;;;;;-1:-1:-1::0;;;;;17092:31:0::1;-1:-1:-1::0;;;;;17092:31:0::1;;;;;;;;;;;;;17125:14;:25;17140:6;17147:1;17140:9;;;;;;;;:::i;:::-;;;;;;;-1:-1:-1::0;;;;;17125:25:0::1;-1:-1:-1::0;;;;;17125:25:0::1;;;;;;;;;;;;;17091:117;;;;;;;;;;;;17225:12;17240:26;17247:6;17254:1;17247:9;;;;;;;;:::i;:::-;;;;;;;17258:7;17240:6;:26::i;:::-;17225:41;;17312:15;17281:8;:19;17290:6;17297:1;17290:9;;;;;;;;:::i;:::-;;;;;;;-1:-1:-1::0;;;;;17281:19:0::1;-1:-1:-1::0;;;;;17281:19:0::1;;;;;;;;;;;;:28;17301:7;-1:-1:-1::0;;;;;17281:28:0::1;-1:-1:-1::0;;;;;17281:28:0::1;;;;;;;;;;;;:46;;;;17389:20;:31;17410:6;17417:1;17410:9;;;;;;;;:::i;:::-;;;;;;;-1:-1:-1::0;;;;;17389:31:0::1;-1:-1:-1::0;;;;;17389:31:0::1;;;;;;;;;;;;;17342:24;:35;17367:6;17374:1;17367:9;;;;;;;;:::i;:::-;;::::0;;::::1;::::0;;;;;;;-1:-1:-1;;;;;17342:35:0;;::::1;::::0;;;;::::1;::::0;;;;;;;;-1:-1:-1;17342:35:0;;;:44;;::::1;::::0;;;;;;;:78;17439:11;;17435:59:::1;;17452:42;17466:6;17473:1;17466:9;;;;;;;;:::i;:::-;;;;;;;17477:7;17486;17452:13;:42::i;:::-;17541:6;17548:1;17541:9;;;;;;;;:::i;:::-;;;;;;;-1:-1:-1::0;;;;;17516:44:0::1;17529:10;-1:-1:-1::0;;;;;17516:44:0::1;;17552:7;17516:44;;;;1216:25:1::0;;1204:2;1189:18;;1070:177;17516:44:0::1;;;;;;;;-1:-1:-1::0;17071:3:0;::::1;::::0;::::1;:::i;:::-;;;;17035:537;;;-1:-1:-1::0;;;;;;17607:24:0;::::1;17584:20;17607:24:::0;;;:15:::1;:24;::::0;;;;;17642:32;;17607:24;;;;17584:20;;17642:32:::1;::::0;17607:24;;17642:32:::1;:::i;:::-;::::0;;;-1:-1:-1;;;;;;;;18388:18:0;;18364:4;18388:18;;;:9;:18;;;;;;;;;17737:15:::1;:24:::0;;;;;:42;;;17790:32;;18388:18;;;;18364:4;;17790:32:::1;::::0;18388:18;;17790:32:::1;:::i;:::-;::::0;;;-1:-1:-1;;;;;;;17861:24:0;::::1;;::::0;;;:15:::1;:24;::::0;;;;;17835:51:::1;::::0;17852:7;;17835:16:::1;:51::i;:::-;17897:24;:22;:24::i;:::-;-1:-1:-1::0;;9637:1:0;9625:9;:13;-1:-1:-1;16785:1144:0:o;18422:178::-;18556:36;18577:5;18584:7;18556:20;:36::i;:::-;-1:-1:-1;;;;;18501:27:0;;;;;;;:20;:27;;;;;;;;18530:14;:21;;;;;;18500:92;;;;;;;-1:-1:-1;18422:178:0:o;16629:148::-;-1:-1:-1;;;;;16749:19:0;;16699:4;16749:19;;;:12;:19;;;;;;16723:46;;16732:15;;16723:8;:46::i;20334:189::-;20471:44;20493:5;20500:7;20509:5;20471:21;:44::i;12383:1034::-;12486:20;;12449:4;;12521:17;;;12517:58;;-1:-1:-1;12562:1:0;;12383:1034;-1:-1:-1;;12383:1034:0:o;12517:58::-;12684:9;12635:17;:35;12653:16;12668:1;12653:12;:16;:::i;:::-;12635:35;;;;;;;;;;;:45;;;:58;12631:116;;12718:16;12733:1;12718:12;:16;:::i;:::-;12710:25;12383:1034;-1:-1:-1;;;12383:1034:0:o;12631:116::-;12808:20;;;:17;:20;;;:30;:42;-1:-1:-1;12804:83:0;;;-1:-1:-1;12874:1:0;;12383:1034;-1:-1:-1;;12383:1034:0:o;12804:83::-;12899:10;;12937:16;12952:1;12937:12;:16;:::i;:::-;12924:29;;12964:423;12979:5;12971;:13;12964:423;;;13001:11;13041:1;13024:13;13032:5;13024;:13;:::i;:::-;13023:19;;;;:::i;:::-;13015:27;;:5;:27;:::i;:::-;13084:26;13113:25;;;:17;:25;;;;;;;;;13084:54;;;;;;;;;;;;;;;;;;;;;;;;;13001:41;;-1:-1:-1;13084:54:0;13157:25;;;13153:223;;-1:-1:-1;13210:6:0;12383:1034;-1:-1:-1;;;;;12383:1034:0:o;13153:223::-;13242:12;;:24;-1:-1:-1;13238:138:0;;;13295:6;13287:14;;13238:138;;;13350:10;13359:1;13350:6;:10;:::i;:::-;13342:18;;13238:138;12986:401;;12964:423;;;-1:-1:-1;13404:5:0;12383:1034;-1:-1:-1;;;12383:1034:0:o;25411:82::-;25473:10;25463:21;;;;:9;:21;;;;;;25454:31;;:8;:31::i;:::-;25411:82::o;28522:308::-;28650:3;-1:-1:-1;;;;;28636:23:0;;:25;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;;;;;28622:39:0;:10;-1:-1:-1;;;;;28622:39:0;;28614:61;;;;-1:-1:-1;;;28614:61:0;;5901:2:1;28614:61:0;;;5883:21:1;5940:1;5920:18;;;5913:29;-1:-1:-1;;;5958:18:1;;;5951:39;6007:18;;28614:61:0;;;;;;;;;28708:8;-1:-1:-1;;;;;28694:22:0;:7;28702:1;28694:10;;;;;;;;:::i;:::-;;;;;;;;;;;-1:-1:-1;;;;;28694:10:0;:22;28686:31;;;;;;-1:-1:-1;;;;;28728:18:0;;;28749:5;28728:18;;;:8;:18;;;;;;:26;;-1:-1:-1;;28728:26:0;;;;;;28765:18;;;;;;;:25;;;;;28728:26;28765:25;;;28801:7;:10;;28774:8;;28801:7;28809:1;;28801:10;;;;;;:::i;:::-;;;;;;;;;:21;;;;;-1:-1:-1;;;;;28801:21:0;;;;;-1:-1:-1;;;;;28801:21:0;;;;;;28522:308;;;:::o;26724:243::-;-1:-1:-1;;;;;26816:19:0;;26776:4;26816:19;;;:12;:19;;;;;;26797:15;:38;26793:52;;-1:-1:-1;26844:1:0;;26724:243;-1:-1:-1;26724:243:0:o;26793:52::-;-1:-1:-1;;;;;26874:19:0;;26856:15;26874:19;;;:12;:19;;;;;;:37;;26896:15;;26874:37;:::i;:::-;-1:-1:-1;;;;;26942:17:0;;;;;;:10;:17;;;;;;26856:55;;-1:-1:-1;26929:30:0;;26856:55;26929:30;:::i;26975:1539::-;9563:9;;9576:1;9563:14;9555:23;;;;;;9601:1;9589:9;:13;-1:-1:-1;;;;;27073:5:0::1;27064:14:::0;::::1;::::0;;::::1;::::0;27056:23:::1;;;::::0;::::1;;27107:1;27098:6;:10;27090:19;;;::::0;::::1;;-1:-1:-1::0;;;;;27125:15:0;::::1;;::::0;;;:8:::1;:15;::::0;;;;;::::1;;27120:215;;27165:34;::::0;-1:-1:-1;;;27165:34:0;;-1:-1:-1;;;;;1026:32:1;;;27165:34:0::1;::::0;::::1;1008:51:1::0;27172:5:0::1;27165:27;::::0;::::1;::::0;981:18:1;;27165:34:0::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;27157:81;;;::::0;-1:-1:-1;;;27157:81:0;;6520:2:1;27157:81:0::1;::::0;::::1;6502:21:1::0;6559:2;6539:18;;;6532:30;6598:34;6578:18;;;6571:62;-1:-1:-1;;;6649:18:1;;;6642:32;6691:19;;27157:81:0::1;6318:398:1::0;27157:81:0::1;27261:7;:14:::0;6541:2:::1;-1:-1:-1::0;27253:70:0::1;;;::::0;-1:-1:-1;;;27253:70:0;;6923:2:1;27253:70:0::1;::::0;::::1;6905:21:1::0;6962:2;6942:18;;;6935:30;7001:25;6981:18;;;6974:53;7044:18;;27253:70:0::1;6721:347:1::0;27253:70:0::1;-1:-1:-1::0;;;;;27349:17:0;::::1;;::::0;;;:10:::1;:17;::::0;;;;;:22;;27345:85:::1;;27373:57;27404:5;27411:1;27414:15;27373:30;:57::i;:::-;27496:50;27518:5;-1:-1:-1::0;;27541:4:0::1;27496:21;:50::i;:::-;-1:-1:-1::0;;;;;27442:27:0;::::1;;::::0;;;:20:::1;:27;::::0;;;;;;;27471:14:::1;:21:::0;;;;;;27441:105;;;;;27557:12:::1;:10;:12::i;:::-;-1:-1:-1::0;;;;;;;27605:19:0;::::1;;::::0;;;:12:::1;:19;::::0;;;;;27586:15:::1;:38;27582:502;;27641:59;27659:5;27666:10;27686:4;27693:6;27641:17;:59::i;:::-;27735:17;6399:6;27735::::0;:17:::1;:::i;:::-;-1:-1:-1::0;;;;;27715:17:0;::::1;;::::0;;;:10:::1;:17;::::0;;;;:37;27582:502:::1;;;-1:-1:-1::0;;;;;27803:19:0;::::1;27785:15;27803:19:::0;;;:12:::1;:19;::::0;;;;;:37:::1;::::0;27825:15:::1;::::0;27803:37:::1;:::i;:::-;-1:-1:-1::0;;;;;27881:17:0;::::1;27855:10;27881:17:::0;;;:10:::1;:17;::::0;;;;;27785:55;;-1:-1:-1;27855:10:0;27868:30:::1;::::0;27785:55;27868:30:::1;:::i;:::-;27855:43;;27930:5;27921:6;:14;27913:23;;;::::0;::::1;;27951:59;27969:5;27976:10;27996:4;28003:6;27951:17;:59::i;:::-;6399:6;28046:14;28055:5:::0;28046:6;:14:::1;:::i;:::-;28045:27;;;;:::i;:::-;-1:-1:-1::0;;;;;28025:17:0;::::1;;::::0;;;:10:::1;:17;::::0;;;;:47;-1:-1:-1;;27582:502:0::1;-1:-1:-1::0;;;;;28102:17:0;::::1;28122:1;28102:17:::0;;;:10:::1;:17;::::0;;;;;28094:30:::1;;;::::0;::::1;;28150:38;::::0;-1:-1:-1;;;28150:38:0;;28182:4:::1;28150:38;::::0;::::1;1008:51:1::0;28135:12:0::1;::::0;-1:-1:-1;;;;;28150:23:0;::::1;::::0;::::1;::::0;981:18:1;;28150:38:0::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;28135:53:::0;-1:-1:-1;28228:18:0::1;6399:6;28135:53:::0;28228:18:::1;:::i;:::-;-1:-1:-1::0;;;;;28207:17:0;::::1;;::::0;;;:10:::1;:17;::::0;;;;;:39:::1;;28199:76;;;::::0;-1:-1:-1;;;28199:76:0;;7464:2:1;28199:76:0::1;::::0;::::1;7446:21:1::0;7503:2;7483:18;;;7476:30;7542:26;7522:18;;;7515:54;7586:18;;28199:76:0::1;7262:348:1::0;28199:76:0::1;28308:26;6399:6;28308:15;:26;:::i;:::-;-1:-1:-1::0;;;;;28286:19:0;::::1;;::::0;;;:12:::1;:19;::::0;;;;;;;:48;;;;28350:8:::1;:15:::0;;;;::::1;;28345:105;;-1:-1:-1::0;;;;;28382:15:0;::::1;;::::0;;;:8:::1;:15;::::0;;;;:22;;-1:-1:-1;;28382:22:0::1;28400:4;28382:22:::0;;::::1;::::0;;;28419:7:::1;:19:::0;;;;::::1;::::0;;;;;;::::1;::::0;;-1:-1:-1;;;;;;28419:19:0::1;::::0;;::::1;::::0;;28345:105:::1;28467:39;::::0;1216:25:1;;;-1:-1:-1;;;;;28467:39:0;::::1;::::0;28480:10:::1;::::0;28467:39:::1;::::0;1204:2:1;1189:18;28467:39:0::1;;;;;;;-1:-1:-1::0;;9637:1:0;9625:9;:13;-1:-1:-1;26975:1539:0:o;24116:115::-;24178:35;;-1:-1:-1;;;24178:35:0;;24202:10;24178:35;;;1008:51:1;24170:53:0;;24185:5;-1:-1:-1;;;;;24178:23:0;;;;981:18:1;;24178:35:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;24215:7;24170;:53::i;:::-;24116:115;:::o;9654:112::-;9698:13;9713;9563:9;;9576:1;9563:14;9555:23;;;;;;9601:1;9589:9;:13;9746:12:::1;:10;:12::i;:::-;9739:19;;;;9637:1:::0;9625:9;:13;9654:112;;:::o;24239:1164::-;9563:9;;9576:1;9563:14;9555:23;;;;;;9601:1;9589:9;:13;24314:10;24306:19:::1;;;::::0;::::1;;24336:27;:25;:27::i;:::-;24376:59;24394:5;24401:10;24421:4;24428:6;24376:17;:59::i;:::-;24461:6;24446:11;;:21;;;;;;;:::i;:::-;::::0;;;-1:-1:-1;;24488:10:0::1;24478:21;::::0;;;:9:::1;:21;::::0;;;;:31;;24503:6;;24478:21;:31:::1;::::0;24503:6;;24478:31:::1;:::i;:::-;::::0;;;-1:-1:-1;;24526:11:0;;24522:402:::1;;24562:35;::::0;-1:-1:-1;;;24562:35:0;;::::1;::::0;::::1;1216:25:1::0;;;24601:10:0::1;::::0;-1:-1:-1;;;;;24576:3:0::1;24562:26;::::0;::::1;::::0;1189:18:1;;24562:35:0::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1::0;;;;;24562:49:0::1;;24554:58;;;::::0;::::1;;24640:10;24631:20;::::0;;;:8:::1;:20;::::0;;;;;:25;;24627:168:::1;;24686:10;24677:20;::::0;;;:8:::1;:20;::::0;;;;;;:30;;;24726:53;-1:-1:-1;;;24726:53:0;;::::1;::::0;::::1;7789:25:1::0;;;7830:18;;;7823:60;;;;-1:-1:-1;;;;;24733:5:0::1;24726:32;::::0;::::1;::::0;7762:18:1;;24726:53:0::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;24627:168;24826:10;24817:20;::::0;;;:8:::1;:20;::::0;;;;;:31;::::1;24809:40;;;::::0;::::1;;24522:402;;;-1:-1:-1::0;24901:10:0::1;24892:20;::::0;;;:8:::1;:20;::::0;;;;;24522:402:::1;24975:10;24936:20;24959:27:::0;;;:15:::1;:27;::::0;;;;;24997:32;;24959:27;;;;24936:20;;24997:32:::1;::::0;24959:27;;24997:32:::1;:::i;:::-;::::0;;;-1:-1:-1;;25073:10:0::1;18364:4:::0;18388:18;;;:9;:18;;;;;;;;;25095:15:::1;:27:::0;;;;;:45;;;25151:32;;18388:18;;-1:-1:-1;18388:18:0;;18364:4;;;25151:32:::1;::::0;18388:18;;25151:32:::1;:::i;:::-;::::0;;;-1:-1:-1;25196:45:0::1;::::0;-1:-1:-1;25213:10:0::1;25225:15:::0;25196:16:::1;:45::i;:::-;25252:24;:22;:24::i;:::-;25289:54;::::0;-1:-1:-1;;;25289:54:0;;::::1;::::0;::::1;8096:25:1::0;;;25324:10:0::1;8137:18:1::0;;;8130:60;8206:18;;;8199:34;;;25296:5:0::1;-1:-1:-1::0;;;;;25289:25:0::1;::::0;::::1;::::0;8069:18:1;;25289:54:0::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;-1:-1:-1::0;;25359:36:0::1;::::0;;783:25:1;;;839:2;824:18;;817:34;;;25367:10:0::1;::::0;-1:-1:-1;25359:36:0::1;::::0;-1:-1:-1;756:18:1;25359:36:0::1;;;;;;;;-1:-1:-1::0;;9637:1:0;9625:9;:13;-1:-1:-1;24239:1164:0:o;17939:355::-;17999:4;18020:13;;18037:1;18020:18;18016:85;;-1:-1:-1;;;;;;18062:27:0;;;;;:20;:27;;;;;;;17939:355::o;18016:85::-;18272:13;;;-1:-1:-1;;;;;18240:17:0;;;;:10;:17;;;;;;;;;18193:14;:21;;;;;;18216:12;:19;;;;;;18272:13;;6483:8;;18240:17;;18184:52;;:8;:52::i;:::-;18150:31;18175:5;18150:24;:31::i;:::-;:86;;;;:::i;:::-;18149:108;;;;:::i;:::-;:120;;;;:::i;:::-;:136;;;;:::i;:::-;-1:-1:-1;;;;;18118:27:0;;;;;;:20;:27;;;;;;:168;;;;:::i;7099:24::-;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;7099:24:0;;-1:-1:-1;7099:24:0;:::o;13425:1374::-;-1:-1:-1;;;;;13552:35:0;;13509:4;13552:35;;;:28;:35;;;;;;13509:4;;13602:17;;;13598:62;;13644:1;13646;13636:12;;;;;;;13598:62;-1:-1:-1;;;;;13720:32:0;;;;;;:25;:32;;;;;13784:9;;13753:16;13768:1;13753:12;:16;:::i;:::-;13720:50;;;;;;;;;;;:60;;;:73;13716:242;;-1:-1:-1;;;;;13818:32:0;;;;;;:25;:32;;;;;;13851:16;13866:1;13851:12;:16;:::i;:::-;13818:50;;;;;;;;;;;:65;;;13885:25;:32;13911:5;-1:-1:-1;;;;;13885:32:0;-1:-1:-1;;;;;13885:32:0;;;;;;;;;;;;:50;13933:1;13918:12;:16;;;;:::i;:::-;13885:50;;;;;;;;;;;:60;;;13810:136;;;;;;;13716:242;-1:-1:-1;;;;;14019:32:0;;;;;;:25;:32;;;;;;;;:35;;;;;;;;:45;:57;-1:-1:-1;14015:102:0;;;14101:1;14103;14093:12;;;;;;;14015:102;14129:10;;14167:16;14182:1;14167:12;:16;:::i;:::-;14154:29;;14194:473;14209:5;14201;:13;14194:473;;;14231:11;14271:1;14254:13;14262:5;14254;:13;:::i;:::-;14253:19;;;;:::i;:::-;14245:27;;:5;:27;:::i;:::-;-1:-1:-1;;;;;14351:32:0;;14314:34;14351:32;;;:25;:32;;;;;;;;:40;;;;;;;;;14314:77;;;;;;;;;;;;;;;;;;;;;;;;;14231:41;;-1:-1:-1;14314:77:0;14410:25;;;14406:250;;14464:17;;;;14483:12;;14464:17;;-1:-1:-1;14483:12:0;-1:-1:-1;14456:40:0;;-1:-1:-1;;;;14456:40:0;14406:250;14522:12;;:24;-1:-1:-1;14518:138:0;;;14575:6;14567:14;;14518:138;;;14630:10;14639:1;14630:6;:10;:::i;:::-;14622:18;;14518:138;14216:451;;14194:473;;;-1:-1:-1;;;;;;14685:32:0;;;;;;:25;:32;;;;;;;;:39;;;;;;;:54;;;;14741:49;;14685:54;;-1:-1:-1;14741:49:0;-1:-1:-1;;13425:1374:0;;;;;;:::o;25727:989::-;9563:9;;9576:1;9563:14;9555:23;;;;;;9601:1;9589:9;:13;25800:27:::1;:25;:27::i;:::-;25855:6;25840:11;;:21;;;;;;;:::i;:::-;::::0;;;-1:-1:-1;;25882:10:0::1;25872:21;::::0;;;:9:::1;:21;::::0;;;;:31;;25897:6;;25872:21;:31:::1;::::0;25897:6;;25872:31:::1;:::i;:::-;::::0;;;-1:-1:-1;25914:40:0::1;::::0;-1:-1:-1;25928:5:0::1;25935:10;25947:6:::0;25914:13:::1;:40::i;:::-;25971:11:::0;;25967:256:::1;;26027:10;26018:20;::::0;;;:8:::1;:20;::::0;;;;;26007:31;::::1;25999:40;;;::::0;::::1;;26063:10;26077:1;26054:20:::0;;;:8:::1;:20;::::0;;;;;:24;;;;26093:55;-1:-1:-1;;;26093:55:0;;::::1;::::0;::::1;7789:25:1::0;;;7830:18;;;7823:60;;;;-1:-1:-1;;;;;26100:5:0::1;26093:34;::::0;::::1;::::0;7762:18:1;;26093:55:0::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;25967:256;;;-1:-1:-1::0;26200:10:0::1;26191:20;::::0;;;:8:::1;:20;::::0;;;;;25967:256:::1;26274:10;26235:20;26258:27:::0;;;:15:::1;:27;::::0;;;;;26296:32;;26258:27;;;;26235:20;;26296:32:::1;::::0;26258:27;;26296:32:::1;:::i;:::-;::::0;;;-1:-1:-1;;26372:10:0::1;18364:4:::0;18388:18;;;:9;:18;;;;;;;;;26394:15:::1;:27:::0;;;;;:45;;;26450:32;;18388:18;;-1:-1:-1;18388:18:0;;18364:4;;;26450:32:::1;::::0;18388:18;;26450:32:::1;:::i;:::-;::::0;;;-1:-1:-1;;26512:10:0::1;26524:27;::::0;;;:15:::1;:27;::::0;;;;;26495:57:::1;::::0;26512:10;26495:16:::1;:57::i;:::-;26563:24;:22;:24::i;:::-;26600:55;::::0;-1:-1:-1;;;26600:55:0;;::::1;::::0;::::1;8096:25:1::0;;;26636:10:0::1;8137:18:1::0;;;8130:60;8206:18;;;8199:34;;;26607:5:0::1;-1:-1:-1::0;;;;;26600:26:0::1;::::0;::::1;::::0;8069:18:1;;26600:55:0::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;-1:-1:-1::0;;26671:37:0::1;::::0;;783:25:1;;;839:2;824:18;;817:34;;;26680:10:0::1;::::0;-1:-1:-1;26671:37:0::1;::::0;-1:-1:-1;756:18:1;26671:37:0::1;609:248:1::0;4875:98:0;4927:4;4956:1;4951;:6;;:14;;4964:1;4951:14;;;-1:-1:-1;4960:1:0;;4944:21;-1:-1:-1;4875:98:0:o;20831:1846::-;-1:-1:-1;;;;;20972:21:0;;20926:4;20972:21;;;:14;:21;;;;;;;;;21018:20;:27;;;;;;21062:20;;20926:4;;20972:21;21018:27;21062:25;;21058:90;;21112:6;-1:-1:-1;21120:15:0;-1:-1:-1;21104:32:0;;21058:90;-1:-1:-1;;;;;21164:17:0;;;;;;:10;:17;;;;;;:22;;21160:87;;21211:6;-1:-1:-1;21219:15:0;;-1:-1:-1;21203:32:0;;-1:-1:-1;21203:32:0;21160:87;21259:16;21278:36;21298:15;21278:19;:36::i;:::-;21259:55;;21325:14;21342:43;21374:1;21351:20;;:24;;;;:::i;:::-;21377:7;21342:8;:43::i;:::-;21325:60;-1:-1:-1;21402:13:0;;21398:622;;21446:11;21432:577;21464:13;21476:1;21464:9;:13;:::i;:::-;21459:1;:18;21432:577;;21503:27;21533:20;;;:17;:20;;;;;;;;;21503:50;;;;;;;;;;;;;;;;;;;;;21576:14;21572:422;;21615:27;21645:17;21615:27;21663:3;:1;21665;21663:3;:::i;:::-;21645:22;;;;;;;;;;;21615:52;;;;;;;;;;;;;;;;;;;;;;;;;;;21691:12;21705:13;21722:85;21742:5;21749:3;:13;;;21764:3;:13;;;21779:3;:10;;;21791:15;21722:19;:85::i;:::-;21690:117;;-1:-1:-1;21690:117:0;-1:-1:-1;21830:17:0;21690:117;21830:17;;:::i;:::-;;;21870:55;21901:5;21908:6;21916:8;21870:30;:55::i;:::-;21966:8;-1:-1:-1;;;21572:422:0;-1:-1:-1;21479:3:0;;;;:::i;:::-;;;;21432:577;;;;21398:622;22146:10;22142:483;;;22173:26;22202:28;;;:17;:28;;;;;;;;;22173:57;;;;;;;;;;;;;;;;;;;;;22249:13;22245:369;;22284:12;22301:128;22321:5;22328:31;22353:5;22328:24;:31::i;:::-;22370:12;;22361:39;;22384:15;22361:8;:39::i;:::-;22402:2;:9;;;22413:15;22301:19;:128::i;:::-;-1:-1:-1;22283:146:0;-1:-1:-1;22448:17:0;22283:146;22448:17;;:::i;:::-;;;22484:62;22515:5;22522:6;22530:15;22484:30;:62::i;:::-;22583:15;22565:33;;22264:350;22245:369;22158:467;22142:483;-1:-1:-1;22645:6:0;;-1:-1:-1;22653:15:0;;-1:-1:-1;;20831:1846:0;;;;;;;:::o;28838:327::-;28951:1;28931:5;-1:-1:-1;;;;;28931:17:0;;:21;28923:30;;;;;;29020:59;;-1:-1:-1;;;;;8436:32:1;;;29020:59:0;;;8418:51:1;8485:18;;;8478:34;;;28965:12:0;;;;29009:10;;;-1:-1:-1;;;29043:24:0;8391:18:1;;29020:59:0;;;;-1:-1:-1;;29020:59:0;;;;;;;;;;;;;;-1:-1:-1;;;;;29020:59:0;-1:-1:-1;;;;;;29020:59:0;;;;;;;;;;29009:71;;;;29020:59;29009:71;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;28964:116;;;;29099:7;:57;;;;-1:-1:-1;29111:11:0;;:16;;:44;;;29142:4;29131:24;;;;;;;;;;;;:::i;:::-;29091:66;;;;;;28912:253;;28838:327;;;:::o;14807:521::-;-1:-1:-1;;;;;14949:23:0;;14884:15;14949:23;;;:14;:23;;;;;;14902:15;;14989:17;;;;;:84;;-1:-1:-1;;;;;;15010:20:0;;;;;;:11;:20;;;;;15063:10;;15031:17;15047:1;15031:13;:17;:::i;:::-;15010:39;;;;;;;;;;;:49;;;:63;14989:84;14985:336;;;-1:-1:-1;;;;;15090:20:0;;;;;;:11;:20;;;;;15142:7;;15111:17;15127:1;15111:13;:17;:::i;:::-;15090:39;;;;;;;;;;;-1:-1:-1;15090:39:0;:49;;:59;14985:336;;;15220:31;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;15182:20:0;;-1:-1:-1;15182:20:0;;;:11;:20;;;;;:35;;;;;;;;;:69;;;;;;;;;;;15292:17;;15203:13;;15292:17;:::i;:::-;-1:-1:-1;;;;;15266:23:0;;;;;;:14;:23;;;;;:43;14985:336;14873:455;;14807:521;;:::o;15923:498::-;15998:20;;16047:15;16079:17;;;;;:81;;-1:-1:-1;16150:10:0;16100:17;:36;16118:17;16134:1;16118:13;:17;:::i;:::-;16100:36;;;;;;;;;;;:46;;;:60;16079:81;16075:339;;;16223:13;;16177:17;:36;16211:1;16195:13;:17;;;;:::i;:::-;16177:36;;;;;;;;;;;-1:-1:-1;16177:36:0;:43;;:59;25539:180;25501:218;:::o;16075:339::-;16304:43;;;;;;;;;;;-1:-1:-1;16333:13:0;;16304:43;;;;;;;16269:32;;;:17;:32;;;;;:78;;;;;;;;;;;16385:17;;16287:13;;16385:17;:::i;:::-;16362:20;:40;15966:455;;15923:498::o;18608:1135::-;-1:-1:-1;;;;;18731:21:0;;18685:4;18731:21;;;:14;:21;;;;;;;;;18777:20;:27;;;;;;18821:20;;18685:4;;18731:21;18777:27;18821:25;;18817:90;;18871:6;-1:-1:-1;18879:15:0;-1:-1:-1;18863:32:0;;18817:90;-1:-1:-1;;;;;18923:17:0;;;;;;:10;:17;;;;;;:22;;18919:87;;18970:6;-1:-1:-1;18978:15:0;;-1:-1:-1;18962:32:0;;-1:-1:-1;18962:32:0;18919:87;19018:16;19037:36;19057:15;19037:19;:36::i;:::-;19018:55;;19084:14;19101:41;19131:1;19110:20;;:22;;;;:::i;:::-;19134:7;19101:8;:41::i;:::-;19084:58;-1:-1:-1;19169:11:0;19155:536;19186:9;19182:1;:13;19155:536;;;19217:27;19247:20;;;:17;:20;;;;;;;;;19217:50;;;;;;;;;;;;;;;;;;;;;19286:14;19282:398;;19321:27;19351:17;19321:27;19369:3;:1;19371;19369:3;:::i;:::-;19351:22;;;;;;;;;;;19321:52;;;;;;;;;;;;;;;;;;;;;;;;;;;19393:12;19407:13;19424:85;19444:5;19451:3;:13;;;19466:3;:13;;;19481:3;:10;;;19493:15;19424:19;:85::i;:::-;19392:117;;-1:-1:-1;19392:117:0;-1:-1:-1;19528:17:0;19392:117;19528:17;;:::i;:::-;;;19564:55;19595:5;19602:6;19610:8;19564:30;:55::i;:::-;19656:8;-1:-1:-1;;;19282:398:0;-1:-1:-1;19197:3:0;;;;:::i;:::-;;;;19155:536;;;-1:-1:-1;19711:6:0;;19719:15;;-1:-1:-1;18608:1135:0;;-1:-1:-1;;;;;18608:1135:0:o;4979:97::-;5031:4;5059:1;5055;:5;:13;;5067:1;5055:13;;15336:579;-1:-1:-1;;;;;15461:35:0;;15440:18;15461:35;;;:28;:35;;;;;;15513:17;;;;;:95;;-1:-1:-1;;;;;;15534:32:0;;;;;;:25;:32;;;;;15599:9;;15567:17;15583:1;15567:13;:17;:::i;:::-;15534:51;;;;;;;;;;;:61;;;:74;15513:95;15509:399;;;-1:-1:-1;;;;;15625:32:0;;;;;;:25;:32;;;;;15694:6;;15658:17;15674:1;15658:13;:17;:::i;15509:399::-;15783:43;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;15733:32:0;;-1:-1:-1;15733:32:0;;;:25;:32;;;;;:47;;;;;;;;;:93;;;;;;;;;;;15879:17;;15766:13;;15879:17;:::i;:::-;-1:-1:-1;;;;;15841:35:0;;;;;;:28;:35;;;;;:55;15429:486;15336:579;;;:::o;9774:1144::-;9860:9;;9814:13;;;;9860:9;;9855:56;;-1:-1:-1;9894:1:0;;;;-1:-1:-1;9774:1144:0:o;9855:56::-;9950:5;-1:-1:-1;;;;;9944:22:0;;:24;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;9921:47;;-1:-1:-1;9921:47:0;-1:-1:-1;9983:12:0;;;;:28;;;10010:1;9999:8;:12;9983:28;9979:932;;;10028:11;10050:8;10042:5;;:16;;;;:::i;:::-;10028:30;;10073:11;10095:8;10087:5;;:16;;;;:::i;:::-;10073:30;;10119:15;10136;10161:5;-1:-1:-1;;;;;10155:19:0;;:21;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;10204:36;;-1:-1:-1;;;10204:36:0;;-1:-1:-1;;;;;1026:32:1;;;10204:36:0;;;1008:51:1;10118:58:0;;-1:-1:-1;10118:58:0;;-1:-1:-1;10211:14:0;10204:27;;;;;;981:18:1;;10204:36:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;10195:6;:45;:70;;;;-1:-1:-1;10264:1:0;10244:17;6399:6;10244;:17;:::i;:::-;:21;10195:70;10191:316;;;10294:1;10286:5;:9;10314:45;10327:7;10336:14;10352:6;10314:12;:45::i;:::-;10378:58;;-1:-1:-1;;;10378:58:0;;-1:-1:-1;;;;;8436:32:1;;;10378:58:0;;;8418:51:1;8485:18;;;8478:34;;;10385:14:0;10378:41;;;;8391:18:1;;10378:58:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;10191:316;;;10477:5;:14;;;10191:316;10534:36;;-1:-1:-1;;;10534:36:0;;-1:-1:-1;;;;;1026:32:1;;;10534:36:0;;;1008:51:1;10541:14:0;10534:27;;;;981:18:1;;10534:36:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;10525:6;:45;:70;;;;-1:-1:-1;10594:1:0;10574:17;6399:6;10574;:17;:::i;:::-;:21;10525:70;10521:316;;;10624:1;10616:5;:9;10644:45;10657:7;10666:14;10682:6;10644:12;:45::i;:::-;10708:58;;-1:-1:-1;;;10708:58:0;;-1:-1:-1;;;;;8436:32:1;;;10708:58:0;;;8418:51:1;8485:18;;;8478:34;;;10715:14:0;10708:41;;;;8391:18:1;;10708:58:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;10521:316;;;10807:5;:14;;;10521:316;10858:41;;;783:25:1;;;839:2;824:18;;817:34;;;10868:10:0;;10858:41;;756:18:1;10858:41:0;;;;;;;10013:898;;;;9979:932;9774:1144;;:::o;29173:355::-;29304:1;29284:5;-1:-1:-1;;;;;29284:17:0;;:21;29276:30;;;;;;29373:69;;;-1:-1:-1;;;;;9852:15:1;;;29373:69:0;;;9834:34:1;9904:15;;;9884:18;;;9877:43;9936:18;;;;9929:34;;;29373:69:0;;;;;;;;;;9769:18:1;;;;29373:69:0;;;;;;;-1:-1:-1;;;;;29373:69:0;-1:-1:-1;;;29373:69:0;;;29362:81;;-1:-1:-1;;;;29362:10:0;;;;:81;;29373:69;29362:81;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;29317:126;;;;29462:7;:57;;;;-1:-1:-1;29474:11:0;;:16;;:44;;;29505:4;29494:24;;;;;;;;;;;;:::i;:::-;29454:66;;;;;;29265:263;;29173:355;;;;:::o;20531:292::-;20600:7;:14;20586:11;20623:193;20640:6;20636:1;:10;20623:193;;;20664:13;20680:7;20688:1;20680:10;;;;;;;;:::i;:::-;;;;;;;;;;;-1:-1:-1;;;;;20680:10:0;;-1:-1:-1;20756:50:0;20680:10;-1:-1:-1;;20680:10:0;20756:21;:50::i;:::-;-1:-1:-1;;;;;20702:27:0;;;;;;;:20;:27;;;;;;;;20731:14;:21;;;;;;20701:105;;;;;;20648:3;;;;:::i;:::-;;;;20623:193;;19751:399;19886:4;19892;19909:12;19924:36;19933:10;19945:14;19924:8;:36::i;:::-;-1:-1:-1;;;;;20093:17:0;;;;;;:10;:17;;;;;;19909:51;;-1:-1:-1;20125:6:0;;6483:8;;20022:67;20031:36;20040:10;20052:14;20031:8;:36::i;:::-;-1:-1:-1;;;;;20069:19:0;;;;;;:12;:19;;;;;;20022:8;:67::i;:::-;-1:-1:-1;;;;;19999:19:0;;;;;;:12;:19;;;;;;19981:38;;19990:7;;19981:8;:38::i;:::-;:108;;;;:::i;:::-;19980:130;;;;:::i;:::-;:142;;;;:::i;:::-;:151;;;;:::i;:::-;19971:171;20134:7;;-1:-1:-1;19751:399:0;-1:-1:-1;;;;;;19751:399:0:o;29536:335::-;29653:1;29633:5;-1:-1:-1;;;;;29633:17:0;;:21;29625:30;;;;;;29722:63;;-1:-1:-1;;;;;8436:32:1;;;29722:63:0;;;8418:51:1;8485:18;;;8478:34;;;29667:12:0;;;;29711:10;;;-1:-1:-1;;;29745:23:0;8391:18:1;;29722:63:0;8244:274:1;14:131;-1:-1:-1;;;;;89:31:1;;79:42;;69:70;;135:1;132;125:12;150:134;218:20;;247:31;218:20;247:31;:::i;:::-;150:134;;;:::o;289:315::-;357:6;365;418:2;406:9;397:7;393:23;389:32;386:52;;;434:1;431;424:12;386:52;473:9;460:23;492:31;517:5;492:31;:::i;:::-;542:5;594:2;579:18;;;;566:32;;-1:-1:-1;;;289:315:1:o;1252:388::-;1320:6;1328;1381:2;1369:9;1360:7;1356:23;1352:32;1349:52;;;1397:1;1394;1387:12;1349:52;1436:9;1423:23;1455:31;1480:5;1455:31;:::i;:::-;1505:5;-1:-1:-1;1562:2:1;1547:18;;1534:32;1575:33;1534:32;1575:33;:::i;:::-;1627:7;1617:17;;;1252:388;;;;;:::o;1645:247::-;1704:6;1757:2;1745:9;1736:7;1732:23;1728:32;1725:52;;;1773:1;1770;1763:12;1725:52;1812:9;1799:23;1831:31;1856:5;1831:31;:::i;1897:180::-;1956:6;2009:2;1997:9;1988:7;1984:23;1980:32;1977:52;;;2025:1;2022;2015:12;1977:52;-1:-1:-1;2048:23:1;;1897:180;-1:-1:-1;1897:180:1:o;2082:127::-;2143:10;2138:3;2134:20;2131:1;2124:31;2174:4;2171:1;2164:15;2198:4;2195:1;2188:15;2214:1256;2307:6;2315;2368:2;2356:9;2347:7;2343:23;2339:32;2336:52;;;2384:1;2381;2374:12;2336:52;2423:9;2410:23;2442:31;2467:5;2442:31;:::i;:::-;2492:5;-1:-1:-1;2516:2:1;2554:18;;;2541:32;2592:18;2622:14;;;2619:34;;;2649:1;2646;2639:12;2619:34;2687:6;2676:9;2672:22;2662:32;;2732:7;2725:4;2721:2;2717:13;2713:27;2703:55;;2754:1;2751;2744:12;2703:55;2790:2;2777:16;2812:2;2808;2805:10;2802:36;;;2818:18;;:::i;:::-;2864:2;2861:1;2857:10;2896:2;2890:9;2959:2;2955:7;2950:2;2946;2942:11;2938:25;2930:6;2926:38;3014:6;3002:10;2999:22;2994:2;2982:10;2979:18;2976:46;2973:72;;;3025:18;;:::i;:::-;3061:2;3054:22;3111:18;;;3145:15;;;;-1:-1:-1;3187:11:1;;;3183:20;;;3215:19;;;3212:39;;;3247:1;3244;3237:12;3212:39;3271:11;;;;3291:148;3307:6;3302:3;3299:15;3291:148;;;3373:23;3392:3;3373:23;:::i;:::-;3361:36;;3324:12;;;;3417;;;;3291:148;;;3458:6;3448:16;;;;;;;;2214:1256;;;;;:::o;3667:456::-;3744:6;3752;3760;3813:2;3801:9;3792:7;3788:23;3784:32;3781:52;;;3829:1;3826;3819:12;3781:52;3865:9;3852:23;3842:33;;3925:2;3914:9;3910:18;3897:32;3938:31;3963:5;3938:31;:::i;:::-;3988:5;-1:-1:-1;4045:2:1;4030:18;;4017:32;4058:33;4017:32;4058:33;:::i;:::-;4110:7;4100:17;;;3667:456;;;;;:::o;4128:248::-;4196:6;4204;4257:2;4245:9;4236:7;4232:23;4228:32;4225:52;;;4273:1;4270;4263:12;4225:52;-1:-1:-1;;4296:23:1;;;4366:2;4351:18;;;4338:32;;-1:-1:-1;4128:248:1:o;4381:127::-;4442:10;4437:3;4433:20;4430:1;4423:31;4473:4;4470:1;4463:15;4497:4;4494:1;4487:15;4513:125;4553:4;4581:1;4578;4575:8;4572:34;;;4586:18;;:::i;:::-;-1:-1:-1;4623:9:1;;4513:125::o;4643:217::-;4683:1;4709;4699:132;;4753:10;4748:3;4744:20;4741:1;4734:31;4788:4;4785:1;4778:15;4816:4;4813:1;4806:15;4699:132;-1:-1:-1;4845:9:1;;4643:217::o;4865:128::-;4905:3;4936:1;4932:6;4929:1;4926:13;4923:39;;;4942:18;;:::i;:::-;-1:-1:-1;4978:9:1;;4865:128::o;4998:168::-;5038:7;5104:1;5100;5096:6;5092:14;5089:1;5086:21;5081:1;5074:9;5067:17;5063:45;5060:71;;;5111:18;;:::i;:::-;-1:-1:-1;5151:9:1;;4998:168::o;5171:135::-;5210:3;5231:17;;;5228:43;;5251:18;;:::i;:::-;-1:-1:-1;5298:1:1;5287:13;;5171:135::o;5311:127::-;5372:10;5367:3;5363:20;5360:1;5353:31;5403:4;5400:1;5393:15;5427:4;5424:1;5417:15;5443:251;5513:6;5566:2;5554:9;5545:7;5541:23;5537:32;5534:52;;;5582:1;5579;5572:12;5534:52;5614:9;5608:16;5633:31;5658:5;5633:31;:::i;6036:277::-;6103:6;6156:2;6144:9;6135:7;6131:23;6127:32;6124:52;;;6172:1;6169;6162:12;6124:52;6204:9;6198:16;6257:5;6250:13;6243:21;6236:5;6233:32;6223:60;;6279:1;6276;6269:12;7073:184;7143:6;7196:2;7184:9;7175:7;7171:23;7167:32;7164:52;;;7212:1;7209;7202:12;7164:52;-1:-1:-1;7235:16:1;;7073:184;-1:-1:-1;7073:184:1:o;8523:426::-;8652:3;8690:6;8684:13;8715:1;8725:129;8739:6;8736:1;8733:13;8725:129;;;8837:4;8821:14;;;8817:25;;8811:32;8798:11;;;8791:53;8754:12;8725:129;;;8872:6;8869:1;8866:13;8863:48;;;8907:1;8898:6;8893:3;8889:16;8882:27;8863:48;-1:-1:-1;8927:16:1;;;;;8523:426;-1:-1:-1;;8523:426:1:o;8954:245::-;9033:6;9041;9094:2;9082:9;9073:7;9069:23;9065:32;9062:52;;;9110:1;9107;9100:12;9062:52;-1:-1:-1;;9133:16:1;;9189:2;9174:18;;;9168:25;9133:16;;9168:25;;-1:-1:-1;8954:245:1:o;9204:385::-;9283:6;9291;9344:2;9332:9;9323:7;9319:23;9315:32;9312:52;;;9360:1;9357;9350:12;9312:52;9392:9;9386:16;9411:31;9436:5;9411:31;:::i;:::-;9511:2;9496:18;;9490:25;9461:5;;-1:-1:-1;9524:33:1;9490:25;9524:33;:::i

Swarm Source

ipfs://9cbd20125a25a94a5234f0308c21588b2e92d8d0a2106edd5a30cc6f6565597a
Block Transaction Difficulty Gas Used Reward
Block Uncle Number Difficulty Gas Used Reward
Loading
Loading
Make sure to use the "Vote Down" button for any spammy posts, and the "Vote Up" for interesting conversations.