Token Pendle

DeFi  DEX  
 

Overview [ERC-20]

Price
$0.06 @ 0.000030 Eth (-3.76%)
Fully Diluted Market Cap
Max Total Supply:
212,003,978.180786351146448863 PENDLE

Holders:
2,072 (0.00%)

Transfers:
-

 
Loading
[ Download CSV Export  ] 
Loading
[ Download CSV Export  ] 
Loading

OVERVIEW

Pendle is essentially a protocol for tokenizing yield and an AMM for trading tokenized yield and other time-decaying assets.

Market

Volume (24H):$388,685.00
Market Capitalization:$5,670,397.00
Circulating Supply:96,950,723.00 PENDLE
Market Data Source: Coinmarketcap

# Exchange Pair Price  24H Volume % Volume
Loading

Contract Source Code Verified (Exact Match)

Contract Name:
PENDLE

Compiler Version
v0.7.6+commit.7338295f

Optimization Enabled:
Yes with 200 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity Multiple files format)

File 4 of 8: PENDLE.sol
/* solhint-disable  const-name-snakecase*/
// SPDX-License-Identifier: MIT
/*
 * MIT License
 * ===========
 *
 * Permission is hereby granted, free of charge, to any person obtaining a copy
 * of this software and associated documentation files (the "Software"), to deal
 * in the Software without restriction, including without limitation the rights
 * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
 * copies of the Software, and to permit persons to whom the Software is
 * furnished to do so, subject to the following conditions:
 *
 * The above copyright notice and this permission notice shall be included in all
 * copies or substantial portions of the Software.
 *
 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
 * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
 * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
 * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
 */
pragma solidity 0.7.6;
pragma experimental ABIEncoderV2;

import "./IPENDLE.sol";
import "./Permissions.sol";
import "./Withdrawable.sol";
import "./SafeMath.sol";

/**
 * @notice The mechanics for delegating votes to other accounts is adapted from Compound
 *   https://github.com/compound-finance/compound-protocol/blob/master/contracts/Governance/Comp.sol
 ***/
contract PENDLE is IPENDLE, Permissions, Withdrawable {
    using SafeMath for uint256;

    /// @notice A checkpoint for marking number of votes from a given block
    struct Checkpoint {
        uint32 fromBlock;
        uint256 votes;
    }

    bool public constant override isPendleToken = true;
    string public constant name = "Pendle";
    string public constant symbol = "PENDLE";
    uint8 public constant decimals = 18;
    uint256 public override totalSupply;

    uint256 private constant TEAM_INVESTOR_ADVISOR_AMOUNT = 94917125 * 1e18;
    uint256 private constant ECOSYSTEM_FUND_TOKEN_AMOUNT = 46 * 1_000_000 * 1e18;
    uint256 private constant PUBLIC_SALES_TOKEN_AMOUNT = 16582875 * 1e18;
    uint256 private constant INITIAL_LIQUIDITY_EMISSION = 1200000 * 1e18;
    uint256 private constant CONFIG_DENOMINATOR = 1_000_000_000_000;
    uint256 private constant CONFIG_CHANGES_TIME_LOCK = 7 days;
    uint256 public override emissionRateMultiplierNumerator;
    uint256 public override terminalInflationRateNumerator;
    address public override liquidityIncentivesRecipient;
    bool public override isBurningAllowed;
    uint256 public override pendingEmissionRateMultiplierNumerator;
    uint256 public override pendingTerminalInflationRateNumerator;
    address public override pendingLiquidityIncentivesRecipient;
    bool public override pendingIsBurningAllowed;
    uint256 public override configChangesInitiated;
    uint256 public override startTime;
    uint256 public lastWeeklyEmission;
    uint256 public lastWeekEmissionSent;

    mapping(address => mapping(address => uint256)) internal allowances;
    mapping(address => uint256) internal balances;
    mapping(address => address) public delegates;

    /// @notice A record of votes checkpoints for each account, by index
    mapping(address => mapping(uint32 => Checkpoint)) public checkpoints;

    /// @notice The number of checkpoints for each account
    mapping(address => uint32) public numCheckpoints;

    /// @notice The EIP-712 typehash for the contract's domain
    bytes32 public constant DOMAIN_TYPEHASH =
        keccak256("EIP712Domain(string name,uint256 chainId,address verifyingContract)");

    /// @notice The EIP-712 typehash for the delegation struct used by the contract
    bytes32 public constant DELEGATION_TYPEHASH =
        keccak256("Delegation(address delegatee,uint256 nonce,uint256 expiry)");

    /// @notice A record of states for signing / validating signatures
    mapping(address => uint256) public nonces;

    /// @notice An event thats emitted when an account changes its delegate
    event DelegateChanged(
        address indexed delegator,
        address indexed fromDelegate,
        address indexed toDelegate
    );

    /// @notice An event thats emitted when a delegate account's vote balance changes
    event DelegateVotesChanged(
        address indexed delegate,
        uint256 previousBalance,
        uint256 newBalance
    );

    event PendingConfigChanges(
        uint256 pendingEmissionRateMultiplierNumerator,
        uint256 pendingTerminalInflationRateNumerator,
        address pendingLiquidityIncentivesRecipient,
        bool pendingIsBurningAllowed
    );

    event ConfigsChanged(
        uint256 emissionRateMultiplierNumerator,
        uint256 terminalInflationRateNumerator,
        address liquidityIncentivesRecipient,
        bool isBurningAllowed
    );

    /**
     * @notice Construct a new PENDLE token
     */
    constructor(
        address _governance,
        address pendleTeamTokens,
        address pendleEcosystemFund,
        address salesMultisig,
        address _liquidityIncentivesRecipient
    ) Permissions(_governance) {
        require(
            pendleTeamTokens != address(0) &&
                pendleEcosystemFund != address(0) &&
                salesMultisig != address(0) &&
                _liquidityIncentivesRecipient != address(0),
            "ZERO_ADDRESS"
        );
        _mint(pendleTeamTokens, TEAM_INVESTOR_ADVISOR_AMOUNT);
        _mint(pendleEcosystemFund, ECOSYSTEM_FUND_TOKEN_AMOUNT);
        _mint(salesMultisig, PUBLIC_SALES_TOKEN_AMOUNT);
        _mint(_liquidityIncentivesRecipient, INITIAL_LIQUIDITY_EMISSION * 26);
        emissionRateMultiplierNumerator = (CONFIG_DENOMINATOR * 989) / 1000; // emission rate = 98.9% -> 1.1% decay
        terminalInflationRateNumerator = 379848538; // terminal inflation rate = 2% => weekly inflation = 0.0379848538%
        liquidityIncentivesRecipient = _liquidityIncentivesRecipient;
        startTime = block.timestamp;
        lastWeeklyEmission = INITIAL_LIQUIDITY_EMISSION;
        lastWeekEmissionSent = 26; // already done liquidity emissions for the first 26 weeks
    }

    /**
     * @notice Approve `spender` to transfer up to `amount` from `src`
     * @dev This will overwrite the approval amount for `spender`
     *  and is subject to issues noted [here](https://eips.ethereum.org/EIPS/eip-20#approve)
     * @param spender The address of the account which may transfer tokens
     * @param amount The number of tokens that are approved
     * @return Whether or not the approval succeeded
     **/
    function approve(address spender, uint256 amount) external override returns (bool) {
        _approve(msg.sender, spender, amount);
        return true;
    }

    /**
     * @notice Transfer `amount` tokens from `msg.sender` to `dst`
     * @param dst The address of the destination account
     * @param amount The number of tokens to transfer
     * @return Whether or not the transfer succeeded
     */
    function transfer(address dst, uint256 amount) external override returns (bool) {
        _transfer(msg.sender, dst, amount);
        return true;
    }

    /**
     * @notice Transfer `amount` tokens from `src` to `dst`
     * @param src The address of the source account
     * @param dst The address of the destination account
     * @param amount The number of tokens to transfer
     * @return Whether or not the transfer succeeded
     */
    function transferFrom(
        address src,
        address dst,
        uint256 amount
    ) external override returns (bool) {
        _transfer(src, dst, amount);
        _approve(
            src,
            msg.sender,
            allowances[src][msg.sender].sub(amount, "TRANSFER_EXCEED_ALLOWANCE")
        );
        return true;
    }

    /**
     * @dev Increases the allowance granted to spender by the caller.
     * @param spender The address to increase the allowance from.
     * @param addedValue The amount allowance to add.
     * @return returns true if allowance has increased, otherwise false
     **/
    function increaseAllowance(address spender, uint256 addedValue)
        public
        override
        returns (bool)
    {
        _approve(msg.sender, spender, allowances[msg.sender][spender].add(addedValue));
        return true;
    }

    /**
     * @dev Decreases the allowance granted to spender by the caller.
     * @param spender The address to reduce the allowance from.
     * @param subtractedValue The amount allowance to subtract.
     * @return Returns true if allowance has decreased, otherwise false.
     **/
    function decreaseAllowance(address spender, uint256 subtractedValue)
        public
        override
        returns (bool)
    {
        _approve(
            msg.sender,
            spender,
            allowances[msg.sender][spender].sub(subtractedValue, "NEGATIVE_ALLOWANCE")
        );
        return true;
    }

    /**
     * @dev Burns an amount of tokens from the msg.sender
     * @param amount The amount to burn
     * @return Returns true if the operation is successful
     **/
    function burn(uint256 amount) public override returns (bool) {
        require(isBurningAllowed, "BURNING_NOT_ALLOWED");
        _burn(msg.sender, amount);
        return true;
    }

    /**
     * @notice Get the number of tokens `spender` is approved to spend on behalf of `account`
     * @param account The address of the account holding the funds
     * @param spender The address of the account spending the funds
     * @return The number of tokens approved
     **/
    function allowance(address account, address spender) external view override returns (uint256) {
        return allowances[account][spender];
    }

    /**
     * @notice Get the number of tokens held by the `account`
     * @param account The address of the account to get the balance of
     * @return The number of tokens held
     */
    function balanceOf(address account) external view override returns (uint256) {
        return balances[account];
    }

    /**
     * @notice Gets the current votes balance for `account`
     * @param account The address to get votes balance
     * @return The number of current votes for `account`
     */
    function getCurrentVotes(address account) external view returns (uint256) {
        uint32 nCheckpoints = numCheckpoints[account];
        return nCheckpoints > 0 ? checkpoints[account][nCheckpoints - 1].votes : 0;
    }

    /**
     * @notice Delegate votes from `msg.sender` to `delegatee`
     * @param delegatee The address to delegate votes to
     */
    function delegate(address delegatee) public {
        return _delegate(msg.sender, delegatee);
    }

    /**
     * @notice Delegates votes from signatory to `delegatee`
     * @param delegatee The address to delegate votes to
     * @param nonce The contract state required to match the signature
     * @param expiry The time at which to expire the signature
     * @param v The recovery byte of the signature
     * @param r Half of the ECDSA signature pair
     * @param s Half of the ECDSA signature pair
     */
    function delegateBySig(
        address delegatee,
        uint256 nonce,
        uint256 expiry,
        uint8 v,
        bytes32 r,
        bytes32 s
    ) public {
        bytes32 domainSeparator =
            keccak256(
                abi.encode(DOMAIN_TYPEHASH, keccak256(bytes(name)), getChainId(), address(this))
            );
        bytes32 structHash = keccak256(abi.encode(DELEGATION_TYPEHASH, delegatee, nonce, expiry));
        bytes32 digest = keccak256(abi.encodePacked("\x19\x01", domainSeparator, structHash));
        address signatory = ecrecover(digest, v, r, s);
        require(signatory != address(0), "INVALID_SIGNATURE");
        require(nonce == nonces[signatory]++, "INVALID_NONCE");
        require(block.timestamp <= expiry, "SIGNATURE_EXPIRED");
        return _delegate(signatory, delegatee);
    }

    /**
     * @notice Determine the prior number of votes 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 blockNumber The block number to get the vote balance at
     * @return The number of votes the account had as of the given block
     */
    function getPriorVotes(address account, uint256 blockNumber)
        public
        view
        override
        returns (uint256)
    {
        require(blockNumber < block.number, "NOT_YET_DETERMINED");

        uint32 nCheckpoints = numCheckpoints[account];
        if (nCheckpoints == 0) {
            return 0;
        }

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

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

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

    function _delegate(address delegator, address delegatee) internal {
        address currentDelegate = delegates[delegator];
        uint256 delegatorBalance = balances[delegator];
        delegates[delegator] = delegatee;

        emit DelegateChanged(delegator, currentDelegate, delegatee);

        _moveDelegates(currentDelegate, delegatee, delegatorBalance);
    }

    function _transfer(
        address src,
        address dst,
        uint256 amount
    ) internal {
        require(src != address(0), "SENDER_ZERO_ADDR");
        require(dst != address(0), "RECEIVER_ZERO_ADDR");
        require(dst != address(this), "SEND_TO_TOKEN_CONTRACT");

        balances[src] = balances[src].sub(amount, "TRANSFER_EXCEED_BALANCE");
        balances[dst] = balances[dst].add(amount);
        emit Transfer(src, dst, amount);

        _moveDelegates(delegates[src], delegates[dst], amount);
    }

    function _approve(
        address src,
        address dst,
        uint256 amount
    ) internal virtual {
        require(src != address(0), "OWNER_ZERO_ADDR");
        require(dst != address(0), "SPENDER_ZERO_ADDR");

        allowances[src][dst] = amount;
        emit Approval(src, dst, amount);
    }

    function _moveDelegates(
        address srcRep,
        address dstRep,
        uint256 amount
    ) internal {
        if (srcRep != dstRep && amount > 0) {
            if (srcRep != address(0)) {
                uint32 srcRepNum = numCheckpoints[srcRep];
                uint256 srcRepOld = srcRepNum > 0 ? checkpoints[srcRep][srcRepNum - 1].votes : 0;
                uint256 srcRepNew = srcRepOld.sub(amount);
                _writeCheckpoint(srcRep, srcRepNum, srcRepOld, srcRepNew);
            }

            if (dstRep != address(0)) {
                uint32 dstRepNum = numCheckpoints[dstRep];
                uint256 dstRepOld = dstRepNum > 0 ? checkpoints[dstRep][dstRepNum - 1].votes : 0;
                uint256 dstRepNew = dstRepOld.add(amount);
                _writeCheckpoint(dstRep, dstRepNum, dstRepOld, dstRepNew);
            }
        }
    }

    function _writeCheckpoint(
        address delegatee,
        uint32 nCheckpoints,
        uint256 oldVotes,
        uint256 newVotes
    ) internal {
        uint32 blockNumber = safe32(block.number, "BLOCK_NUM_EXCEED_32_BITS");

        if (
            nCheckpoints > 0 && checkpoints[delegatee][nCheckpoints - 1].fromBlock == blockNumber
        ) {
            checkpoints[delegatee][nCheckpoints - 1].votes = newVotes;
        } else {
            checkpoints[delegatee][nCheckpoints] = Checkpoint(blockNumber, newVotes);
            numCheckpoints[delegatee] = nCheckpoints + 1;
        }

        emit DelegateVotesChanged(delegatee, oldVotes, newVotes);
    }

    function safe32(uint256 n, string memory errorMessage) internal pure returns (uint32) {
        require(n < 2**32, errorMessage);
        return uint32(n);
    }

    function getChainId() internal pure returns (uint256) {
        uint256 chainId;
        assembly {
            chainId := chainid()
        }
        return chainId;
    }

    function initiateConfigChanges(
        uint256 _emissionRateMultiplierNumerator,
        uint256 _terminalInflationRateNumerator,
        address _liquidityIncentivesRecipient,
        bool _isBurningAllowed
    ) external override onlyGovernance {
        require(_liquidityIncentivesRecipient != address(0), "ZERO_ADDRESS");
        pendingEmissionRateMultiplierNumerator = _emissionRateMultiplierNumerator;
        pendingTerminalInflationRateNumerator = _terminalInflationRateNumerator;
        pendingLiquidityIncentivesRecipient = _liquidityIncentivesRecipient;
        pendingIsBurningAllowed = _isBurningAllowed;
        emit PendingConfigChanges(
            _emissionRateMultiplierNumerator,
            _terminalInflationRateNumerator,
            _liquidityIncentivesRecipient,
            _isBurningAllowed
        );
        configChangesInitiated = block.timestamp;
    }

    function applyConfigChanges() external override {
        require(configChangesInitiated != 0, "UNINITIATED_CONFIG_CHANGES");
        require(
            block.timestamp > configChangesInitiated + CONFIG_CHANGES_TIME_LOCK,
            "TIMELOCK_IS_NOT_OVER"
        );

        _mintLiquidityEmissions(); // We must settle the pending liquidity emissions first, to make sure the weeks in the past follow the old configs

        emissionRateMultiplierNumerator = pendingEmissionRateMultiplierNumerator;
        terminalInflationRateNumerator = pendingTerminalInflationRateNumerator;
        liquidityIncentivesRecipient = pendingLiquidityIncentivesRecipient;
        isBurningAllowed = pendingIsBurningAllowed;
        configChangesInitiated = 0;
        emit ConfigsChanged(
            emissionRateMultiplierNumerator,
            terminalInflationRateNumerator,
            liquidityIncentivesRecipient,
            isBurningAllowed
        );
    }

    function claimLiquidityEmissions() external override returns (uint256 totalEmissions) {
        require(msg.sender == liquidityIncentivesRecipient, "NOT_INCENTIVES_RECIPIENT");
        totalEmissions = _mintLiquidityEmissions();
    }

    function _mintLiquidityEmissions() internal returns (uint256 totalEmissions) {
        uint256 _currentWeek = _getCurrentWeek();
        if (_currentWeek <= lastWeekEmissionSent) {
            return 0;
        }
        for (uint256 i = lastWeekEmissionSent + 1; i <= _currentWeek; i++) {
            if (i <= 259) {
                lastWeeklyEmission = lastWeeklyEmission.mul(emissionRateMultiplierNumerator).div(
                    CONFIG_DENOMINATOR
                );
            } else {
                lastWeeklyEmission = totalSupply.mul(terminalInflationRateNumerator).div(
                    CONFIG_DENOMINATOR
                );
            }
            _mint(liquidityIncentivesRecipient, lastWeeklyEmission);
            totalEmissions = totalEmissions.add(lastWeeklyEmission);
        }
        lastWeekEmissionSent = _currentWeek;
    }

    // get current 1-indexed week id
    function _getCurrentWeek() internal view returns (uint256 weekId) {
        weekId = (block.timestamp - startTime) / (7 days) + 1;
    }

    function _mint(address account, uint256 amount) internal {
        require(account != address(0), "MINT_TO_ZERO_ADDR");

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

    function _burn(address account, uint256 amount) internal {
        require(account != address(0), "BURN_FROM_ZERO_ADDRESS");

        uint256 accountBalance = balances[account];
        require(accountBalance >= amount, "BURN_EXCEED_BALANCE");
        balances[account] = accountBalance.sub(amount);
        totalSupply = totalSupply.sub(amount);

        emit Transfer(account, address(0), amount);
    }
}

File 1 of 8: Address.sol
// SPDX-License-Identifier: MIT

pragma solidity >=0.6.2 <0.8.0;

/**
 * @dev Collection of functions related to the address type
 */
library Address {
    /**
     * @dev Returns true if `account` is a contract.
     *
     * [IMPORTANT]
     * ====
     * It is unsafe to assume that an address for which this function returns
     * false is an externally-owned account (EOA) and not a contract.
     *
     * Among others, `isContract` will return false for the following
     * types of addresses:
     *
     *  - an externally-owned account
     *  - a contract in construction
     *  - an address where a contract will be created
     *  - an address where a contract lived, but was destroyed
     * ====
     */
    function isContract(address account) internal view returns (bool) {
        // This method relies on extcodesize, which returns 0 for contracts in
        // construction, since the code is only stored at the end of the
        // constructor execution.

        uint256 size;
        // solhint-disable-next-line no-inline-assembly
        assembly { size := extcodesize(account) }
        return size > 0;
    }

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

        // solhint-disable-next-line avoid-low-level-calls, avoid-call-value
        (bool success, ) = recipient.call{ value: amount }("");
        require(success, "Address: unable to send value, recipient may have reverted");
    }

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

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

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

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

        // solhint-disable-next-line avoid-low-level-calls
        (bool success, bytes memory returndata) = target.call{ value: value }(data);
        return _verifyCallResult(success, returndata, errorMessage);
    }

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

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

        // solhint-disable-next-line avoid-low-level-calls
        (bool success, bytes memory returndata) = target.staticcall(data);
        return _verifyCallResult(success, returndata, errorMessage);
    }

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

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

        // solhint-disable-next-line avoid-low-level-calls
        (bool success, bytes memory returndata) = target.delegatecall(data);
        return _verifyCallResult(success, returndata, errorMessage);
    }

    function _verifyCallResult(bool success, bytes memory returndata, string memory errorMessage) private pure returns(bytes memory) {
        if (success) {
            return returndata;
        } else {
            // Look for revert reason and bubble it up if present
            if (returndata.length > 0) {
                // The easiest way to bubble the revert reason is using memory via assembly

                // solhint-disable-next-line no-inline-assembly
                assembly {
                    let returndata_size := mload(returndata)
                    revert(add(32, returndata), returndata_size)
                }
            } else {
                revert(errorMessage);
            }
        }
    }
}

File 2 of 8: IERC20.sol
// SPDX-License-Identifier: MIT

pragma solidity >=0.6.0 <0.8.0;

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

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

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

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

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

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

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

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

File 3 of 8: IPENDLE.sol
// SPDX-License-Identifier: MIT
/*
 * MIT License
 * ===========
 *
 * Permission is hereby granted, free of charge, to any person obtaining a copy
 * of this software and associated documentation files (the "Software"), to deal
 * in the Software without restriction, including without limitation the rights
 * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
 * copies of the Software, and to permit persons to whom the Software is
 * furnished to do so, subject to the following conditions:
 *
 * The above copyright notice and this permission notice shall be included in all
 * copies or substantial portions of the Software.
 *
 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
 * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
 * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
 * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
 */

pragma solidity 0.7.6;

import "./IERC20.sol";

interface IPENDLE is IERC20 {
    function initiateConfigChanges(
        uint256 _emissionRateMultiplierNumerator,
        uint256 _terminalInflationRateNumerator,
        address _liquidityIncentivesRecipient,
        bool _isBurningAllowed
    ) external;

    function increaseAllowance(address spender, uint256 addedValue) external returns (bool);

    function decreaseAllowance(address spender, uint256 subtractedValue) external returns (bool);

    function burn(uint256 amount) external returns (bool);

    function applyConfigChanges() external;

    function claimLiquidityEmissions() external returns (uint256 totalEmissions);

    function isPendleToken() external view returns (bool);

    function getPriorVotes(address account, uint256 blockNumber) external view returns (uint256);

    function startTime() external view returns (uint256);

    function configChangesInitiated() external view returns (uint256);

    function emissionRateMultiplierNumerator() external view returns (uint256);

    function terminalInflationRateNumerator() external view returns (uint256);

    function liquidityIncentivesRecipient() external view returns (address);

    function isBurningAllowed() external view returns (bool);

    function pendingEmissionRateMultiplierNumerator() external view returns (uint256);

    function pendingTerminalInflationRateNumerator() external view returns (uint256);

    function pendingLiquidityIncentivesRecipient() external view returns (address);

    function pendingIsBurningAllowed() external view returns (bool);
}

File 5 of 8: Permissions.sol
// SPDX-License-Identifier: MIT
/*
 * MIT License
 * ===========
 *
 * Permission is hereby granted, free of charge, to any person obtaining a copy
 * of this software and associated documentation files (the "Software"), to deal
 * in the Software without restriction, including without limitation the rights
 * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
 * copies of the Software, and to permit persons to whom the Software is
 * furnished to do so, subject to the following conditions:
 *
 * The above copyright notice and this permission notice shall be included in all
 * copies or substantial portions of the Software.
 *
 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
 * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
 * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
 * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
 */
pragma solidity 0.7.6;

import "./IERC20.sol";

abstract contract Permissions {
    address public governance;
    address public pendingGovernance;
    address internal initializer;

    event GovernanceClaimed(address newGovernance, address previousGovernance);

    event TransferGovernancePending(address pendingGovernance);

    constructor(address _governance) {
        require(_governance != address(0), "ZERO_ADDRESS");
        initializer = msg.sender;
        governance = _governance;
    }

    modifier initialized() {
        require(initializer == address(0), "NOT_INITIALIZED");
        _;
    }

    modifier onlyGovernance() {
        require(msg.sender == governance, "ONLY_GOVERNANCE");
        _;
    }

    /**
     * @dev Allows the pendingGovernance address to finalize the change governance process.
     */
    function claimGovernance() public {
        require(pendingGovernance == msg.sender, "WRONG_GOVERNANCE");
        emit GovernanceClaimed(pendingGovernance, governance);
        governance = pendingGovernance;
        pendingGovernance = address(0);
    }

    /**
     * @dev Allows the current governance to set the pendingGovernance address.
     * @param _governance The address to transfer ownership to.
     */
    function transferGovernance(address _governance) public onlyGovernance {
        require(_governance != address(0), "ZERO_ADDRESS");
        pendingGovernance = _governance;

        emit TransferGovernancePending(pendingGovernance);
    }
}

File 6 of 8: SafeERC20.sol
// SPDX-License-Identifier: MIT

pragma solidity >=0.6.0 <0.8.0;

import "./IERC20.sol";
import "./SafeMath.sol";
import "./Address.sol";

/**
 * @title SafeERC20
 * @dev Wrappers around ERC20 operations that throw on failure (when the token
 * contract returns false). Tokens that return no value (and instead revert or
 * throw on failure) are also supported, non-reverting calls are assumed to be
 * successful.
 * To use this library you can add a `using SafeERC20 for IERC20;` statement to your contract,
 * which allows you to call the safe operations as `token.safeTransfer(...)`, etc.
 */
library SafeERC20 {
    using SafeMath for uint256;
    using Address for address;

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

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

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

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

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

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

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

File 7 of 8: SafeMath.sol
// SPDX-License-Identifier: MIT

pragma solidity >=0.6.0 <0.8.0;

/**
 * @dev Wrappers over Solidity's arithmetic operations with added overflow
 * checks.
 *
 * Arithmetic operations in Solidity wrap on overflow. This can easily result
 * in bugs, because programmers usually assume that an overflow raises an
 * error, which is the standard behavior in high level programming languages.
 * `SafeMath` restores this intuition by reverting the transaction when an
 * operation overflows.
 *
 * Using this library instead of the unchecked operations eliminates an entire
 * class of bugs, so it's recommended to use it always.
 */
library SafeMath {
    /**
     * @dev Returns the addition of two unsigned integers, with an overflow flag.
     *
     * _Available since v3.4._
     */
    function tryAdd(uint256 a, uint256 b) internal pure returns (bool, uint256) {
        uint256 c = a + b;
        if (c < a) return (false, 0);
        return (true, c);
    }

    /**
     * @dev Returns the substraction of two unsigned integers, with an overflow flag.
     *
     * _Available since v3.4._
     */
    function trySub(uint256 a, uint256 b) internal pure returns (bool, uint256) {
        if (b > a) return (false, 0);
        return (true, a - b);
    }

    /**
     * @dev Returns the multiplication of two unsigned integers, with an overflow flag.
     *
     * _Available since v3.4._
     */
    function tryMul(uint256 a, uint256 b) internal pure returns (bool, uint256) {
        // Gas optimization: this is cheaper than requiring 'a' not being zero, but the
        // benefit is lost if 'b' is also tested.
        // See: https://github.com/OpenZeppelin/openzeppelin-contracts/pull/522
        if (a == 0) return (true, 0);
        uint256 c = a * b;
        if (c / a != b) return (false, 0);
        return (true, c);
    }

    /**
     * @dev Returns the division of two unsigned integers, with a division by zero flag.
     *
     * _Available since v3.4._
     */
    function tryDiv(uint256 a, uint256 b) internal pure returns (bool, uint256) {
        if (b == 0) return (false, 0);
        return (true, a / b);
    }

    /**
     * @dev Returns the remainder of dividing two unsigned integers, with a division by zero flag.
     *
     * _Available since v3.4._
     */
    function tryMod(uint256 a, uint256 b) internal pure returns (bool, uint256) {
        if (b == 0) return (false, 0);
        return (true, a % b);
    }

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

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

    /**
     * @dev Returns the multiplication of two unsigned integers, reverting on
     * overflow.
     *
     * Counterpart to Solidity's `*` operator.
     *
     * Requirements:
     *
     * - Multiplication cannot overflow.
     */
    function mul(uint256 a, uint256 b) internal pure returns (uint256) {
        if (a == 0) return 0;
        uint256 c = a * b;
        require(c / a == b, "SafeMath: multiplication overflow");
        return c;
    }

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

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

    /**
     * @dev Returns the subtraction of two unsigned integers, reverting with custom message on
     * overflow (when the result is negative).
     *
     * CAUTION: This function is deprecated because it requires allocating memory for the error
     * message unnecessarily. For custom revert reasons use {trySub}.
     *
     * Counterpart to Solidity's `-` operator.
     *
     * Requirements:
     *
     * - Subtraction cannot overflow.
     */
    function sub(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) {
        require(b <= a, errorMessage);
        return a - b;
    }

    /**
     * @dev Returns the integer division of two unsigned integers, reverting with custom message on
     * division by zero. The result is rounded towards zero.
     *
     * CAUTION: This function is deprecated because it requires allocating memory for the error
     * message unnecessarily. For custom revert reasons use {tryDiv}.
     *
     * Counterpart to Solidity's `/` operator. Note: this function uses a
     * `revert` opcode (which leaves remaining gas untouched) while Solidity
     * uses an invalid opcode to revert (consuming all remaining gas).
     *
     * Requirements:
     *
     * - The divisor cannot be zero.
     */
    function div(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) {
        require(b > 0, errorMessage);
        return a / b;
    }

    /**
     * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo),
     * reverting with custom message when dividing by zero.
     *
     * CAUTION: This function is deprecated because it requires allocating memory for the error
     * message unnecessarily. For custom revert reasons use {tryMod}.
     *
     * Counterpart to Solidity's `%` operator. This function uses a `revert`
     * opcode (which leaves remaining gas untouched) while Solidity uses an
     * invalid opcode to revert (consuming all remaining gas).
     *
     * Requirements:
     *
     * - The divisor cannot be zero.
     */
    function mod(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) {
        require(b > 0, errorMessage);
        return a % b;
    }
}

File 8 of 8: Withdrawable.sol
// SPDX-License-Identifier: MIT
/*
 * MIT License
 * ===========
 *
 * Permission is hereby granted, free of charge, to any person obtaining a copy
 * of this software and associated documentation files (the "Software"), to deal
 * in the Software without restriction, including without limitation the rights
 * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
 * copies of the Software, and to permit persons to whom the Software is
 * furnished to do so, subject to the following conditions:
 *
 * The above copyright notice and this permission notice shall be included in all
 * copies or substantial portions of the Software.
 *
 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
 * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
 * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
 * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
 */
pragma solidity 0.7.6;

import "./IERC20.sol";
import "./SafeERC20.sol";
import "./Permissions.sol";

abstract contract Withdrawable is Permissions {
    using SafeERC20 for IERC20;

    event EtherWithdraw(uint256 amount, address sendTo);
    event TokenWithdraw(IERC20 token, uint256 amount, address sendTo);

    /**
     * @dev Allows governance to withdraw Ether in a Pendle contract
     *      in case of accidental ETH transfer into the contract.
     * @param amount The amount of Ether to withdraw.
     * @param sendTo The recipient address.
     */
    function withdrawEther(uint256 amount, address payable sendTo) external onlyGovernance {
        (bool success, ) = sendTo.call{value: amount}("");
        require(success, "WITHDRAW_FAILED");
        emit EtherWithdraw(amount, sendTo);
    }

    /**
     * @dev Allows governance to withdraw all IERC20 compatible tokens in a Pendle
     *      contract in case of accidental token transfer into the contract.
     * @param token IERC20 The address of the token contract.
     * @param amount The amount of IERC20 tokens to withdraw.
     * @param sendTo The recipient address.
     */
    function withdrawToken(
        IERC20 token,
        uint256 amount,
        address sendTo
    ) external onlyGovernance {
        token.safeTransfer(sendTo, amount);
        emit TokenWithdraw(token, amount, sendTo);
    }
}

Contract Security Audit

Contract ABI

[{"inputs":[{"internalType":"address","name":"_governance","type":"address"},{"internalType":"address","name":"pendleTeamTokens","type":"address"},{"internalType":"address","name":"pendleEcosystemFund","type":"address"},{"internalType":"address","name":"salesMultisig","type":"address"},{"internalType":"address","name":"_liquidityIncentivesRecipient","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"spender","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"emissionRateMultiplierNumerator","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"terminalInflationRateNumerator","type":"uint256"},{"indexed":false,"internalType":"address","name":"liquidityIncentivesRecipient","type":"address"},{"indexed":false,"internalType":"bool","name":"isBurningAllowed","type":"bool"}],"name":"ConfigsChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"delegator","type":"address"},{"indexed":true,"internalType":"address","name":"fromDelegate","type":"address"},{"indexed":true,"internalType":"address","name":"toDelegate","type":"address"}],"name":"DelegateChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"delegate","type":"address"},{"indexed":false,"internalType":"uint256","name":"previousBalance","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"newBalance","type":"uint256"}],"name":"DelegateVotesChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"},{"indexed":false,"internalType":"address","name":"sendTo","type":"address"}],"name":"EtherWithdraw","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"newGovernance","type":"address"},{"indexed":false,"internalType":"address","name":"previousGovernance","type":"address"}],"name":"GovernanceClaimed","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"pendingEmissionRateMultiplierNumerator","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"pendingTerminalInflationRateNumerator","type":"uint256"},{"indexed":false,"internalType":"address","name":"pendingLiquidityIncentivesRecipient","type":"address"},{"indexed":false,"internalType":"bool","name":"pendingIsBurningAllowed","type":"bool"}],"name":"PendingConfigChanges","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"contract IERC20","name":"token","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"},{"indexed":false,"internalType":"address","name":"sendTo","type":"address"}],"name":"TokenWithdraw","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Transfer","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"pendingGovernance","type":"address"}],"name":"TransferGovernancePending","type":"event"},{"inputs":[],"name":"DELEGATION_TYPEHASH","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"DOMAIN_TYPEHASH","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"address","name":"spender","type":"address"}],"name":"allowance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"applyConfigChanges","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"approve","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"burn","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"uint32","name":"","type":"uint32"}],"name":"checkpoints","outputs":[{"internalType":"uint32","name":"fromBlock","type":"uint32"},{"internalType":"uint256","name":"votes","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"claimGovernance","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"claimLiquidityEmissions","outputs":[{"internalType":"uint256","name":"totalEmissions","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"configChangesInitiated","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"decimals","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"subtractedValue","type":"uint256"}],"name":"decreaseAllowance","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"delegatee","type":"address"}],"name":"delegate","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"delegatee","type":"address"},{"internalType":"uint256","name":"nonce","type":"uint256"},{"internalType":"uint256","name":"expiry","type":"uint256"},{"internalType":"uint8","name":"v","type":"uint8"},{"internalType":"bytes32","name":"r","type":"bytes32"},{"internalType":"bytes32","name":"s","type":"bytes32"}],"name":"delegateBySig","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"delegates","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"emissionRateMultiplierNumerator","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"getCurrentVotes","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"uint256","name":"blockNumber","type":"uint256"}],"name":"getPriorVotes","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"governance","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"addedValue","type":"uint256"}],"name":"increaseAllowance","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_emissionRateMultiplierNumerator","type":"uint256"},{"internalType":"uint256","name":"_terminalInflationRateNumerator","type":"uint256"},{"internalType":"address","name":"_liquidityIncentivesRecipient","type":"address"},{"internalType":"bool","name":"_isBurningAllowed","type":"bool"}],"name":"initiateConfigChanges","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"isBurningAllowed","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"isPendleToken","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"lastWeekEmissionSent","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"lastWeeklyEmission","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"liquidityIncentivesRecipient","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"nonces","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"numCheckpoints","outputs":[{"internalType":"uint32","name":"","type":"uint32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"pendingEmissionRateMultiplierNumerator","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"pendingGovernance","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"pendingIsBurningAllowed","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"pendingLiquidityIncentivesRecipient","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"pendingTerminalInflationRateNumerator","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"startTime","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"terminalInflationRateNumerator","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":"dst","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transfer","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"src","type":"address"},{"internalType":"address","name":"dst","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transferFrom","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_governance","type":"address"}],"name":"transferGovernance","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"address payable","name":"sendTo","type":"address"}],"name":"withdrawEther","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"contract IERC20","name":"token","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"address","name":"sendTo","type":"address"}],"name":"withdrawToken","outputs":[],"stateMutability":"nonpayable","type":"function"}]

60806040523480156200001157600080fd5b5060405162002acf38038062002acf83398101604081905262000034916200031f565b846001600160a01b03811662000080576040805162461bcd60e51b815260206004820152600c60248201526b5a45524f5f4144445245535360a01b604482015290519081900360640190fd5b60028054336001600160a01b031991821617909155600080549091166001600160a01b03928316179055841615801590620000c357506001600160a01b03831615155b8015620000d857506001600160a01b03821615155b8015620000ed57506001600160a01b03811615155b620001155760405162461bcd60e51b81526004016200010c906200038e565b60405180910390fd5b6200012c846a4e837ba813eac04cf40000620001c9565b62000143836a260ce0ff28d2b2ee000000620001c9565b6200015a826a0db78f747e56bf528c0000620001c9565b62000171816a19cedb639a935c6c000000620001c9565b6103e86603837d81aed000046004556316a4075a600555600680546001600160a01b0319166001600160a01b0392909216919091179055505042600b55505069fe1c215e8f838e000000600c55601a600d55620003e8565b6001600160a01b038216620001f25760405162461bcd60e51b81526004016200010c90620003b4565b6200020e81600354620002a060201b620012971790919060201c565b6003556001600160a01b0382166000908152600f60209081526040909120546200024391839062001297620002a0821b17901c565b6001600160a01b0383166000818152600f60205260408082209390935591519091907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9062000294908590620003df565b60405180910390a35050565b600082820183811015620002fb576040805162461bcd60e51b815260206004820152601b60248201527f536166654d6174683a206164646974696f6e206f766572666c6f770000000000604482015290519081900360640190fd5b9392505050565b80516001600160a01b03811681146200031a57600080fd5b919050565b600080600080600060a0868803121562000337578081fd5b620003428662000302565b9450620003526020870162000302565b9350620003626040870162000302565b9250620003726060870162000302565b9150620003826080870162000302565b90509295509295909350565b6020808252600c908201526b5a45524f5f4144445245535360a01b604082015260600190565b60208082526011908201527026a4a72a2faa27afad22a927afa0a2222960791b604082015260600190565b90815260200190565b6126d780620003f86000396000f3fe608060405234801561001057600080fd5b50600436106102745760003560e01c806370a0823111610151578063ce56c454116100c3578063e76af32e11610087578063e76af32e146104d3578063e7a324dc146104db578063ee87ab6b146104e3578063f1127ed8146104eb578063f39c38a01461050c578063ff552d771461051457610274565b8063ce56c4541461048a578063d38bfff41461049d578063dc23b265146104b0578063dd62ed3e146104b8578063e4a1ecb6146104cb57610274565b806395d89b411161011557806395d89b4114610423578063a457c2d71461042b578063a9059cbb1461043e578063acff6f7914610451578063b4b5ea5714610464578063c3cda5201461047757610274565b806370a08231146103da578063782d6fe1146103ed57806378e97925146104005780637ecebe0014610408578063924a23b41461041b57610274565b806339509351116101ea578063587cde1e116101ae578063587cde1e1461037c5780635aa6e6751461038f5780635c19a95c146103975780635d36b190146103aa5780635d587aea146103b25780636fcfff45146103ba57610274565b806339509351146103315780633ccdbb28146103445780634245a5801461035957806342966c68146103615780634cde84361461037457610274565b806320606b701161023c57806320606b70146102dc57806322d7bf8d146102e457806323b872dd146102ec5780632fac9cca146102ff578063313ce5671461031457806332c9c8341461032957610274565b806306fdde0314610279578063095ea7b3146102975780630d7a1c62146102b757806318160ddd146102cc5780631cb6a0e8146102d4575b600080fd5b61028161051c565b60405161028e9190612265565b60405180910390f35b6102aa6102a5366004612032565b61053e565b60405161028e91906121eb565b6102bf610555565b60405161028e91906121f6565b6102bf61055b565b6102bf610561565b6102bf610567565b6102bf61058b565b6102aa6102fa366004611ff2565b610591565b610307610619565b60405161028e91906121d7565b61031c610628565b60405161028e919061260d565b6102bf61062d565b6102aa61033f366004612032565b610633565b6103576103523660046120f2565b610669565b005b61035761071d565b6102aa61036f366004612133565b610810565b6102aa61084e565b61030761038a366004611f9e565b61085e565b610307610879565b6103576103a5366004611f9e565b610888565b610357610895565b6102bf61095a565b6103cd6103c8366004611f9e565b610994565b60405161028e91906125e6565b6102bf6103e8366004611f9e565b6109ac565b6102bf6103fb366004612032565b6109c7565b6102bf610bab565b6102bf610416366004611f9e565b610bb1565b6102aa610bc3565b610281610bc8565b6102aa610439366004612032565b610bea565b6102aa61044c366004612032565b610c4c565b61035761045f36600461216f565b610c59565b6102bf610472366004611f9e565b610d4e565b61035761048536600461205d565b610db1565b61035761049836600461214b565b610fb5565b6103576104ab366004611f9e565b6110e6565b6102bf6111db565b6102bf6104c6366004611fba565b6111e1565b6102bf61120c565b6102aa611212565b6102bf611222565b6102bf611246565b6104fe6104f93660046120bd565b61124c565b60405161028e9291906125f7565b610307611279565b610307611288565b6040518060400160405280600681526020016550656e646c6560d01b81525081565b600061054b3384846112f1565b5060015b92915050565b600d5481565b60035481565b60085481565b7f8cad95687ba82c2ce50e74f7b754645e5117c3a5bec8151c0726d5857980a86681565b60045481565b600061059e8484846113a5565b604080518082018252601981527f5452414e534645525f4558434545445f414c4c4f57414e4345000000000000006020808301919091526001600160a01b0387166000908152600e8252838120338083529252929092205461060e9287929091610609918790611535565b6112f1565b5060015b9392505050565b6009546001600160a01b031681565b601281565b600c5481565b336000818152600e602090815260408083206001600160a01b0387168452909152812054909161054b9185906106099086611297565b6000546001600160a01b031633146106ba576040805162461bcd60e51b815260206004820152600f60248201526e4f4e4c595f474f5645524e414e434560881b604482015290519081900360640190fd5b6106ce6001600160a01b03841682846115cc565b604080516001600160a01b0380861682526020820185905283168183015290517f72cb8a894ddb372ceec3d2a7648d86f17d5a15caae0e986c53109b8a9a9385e69181900360600190a1505050565b600a546107455760405162461bcd60e51b815260040161073c90612365565b60405180910390fd5b62093a80600a5401421161076b5760405162461bcd60e51b815260040161073c9061239c565b61077361161e565b50600754600481905560085460058190556009546006805460ff600160a01b80850482161515810260ff60a01b196001600160a01b03199094166001600160a01b03968716179390931692909217928390556000600a556040517f83564c1102f308ae821e2b1d74b5cafae42f89d7b2c57a73ad01810469fb2c99966108069690959094908116939004909116906125c0565b60405180910390a1565b600654600090600160a01b900460ff1661083c5760405162461bcd60e51b815260040161073c906123ca565b61084633836116e0565b506001919050565b600954600160a01b900460ff1681565b6010602052600090815260409020546001600160a01b031681565b6000546001600160a01b031681565b61089233826117b0565b50565b6001546001600160a01b031633146108e7576040805162461bcd60e51b815260206004820152601060248201526f57524f4e475f474f5645524e414e434560801b604482015290519081900360640190fd5b600154600054604080516001600160a01b03938416815292909116602083015280517fb0758afd6736a6cb3153d002696dcdd7615f1ff7c626469b3daf3358286c1c249281900390910190a160018054600080546001600160a01b03199081166001600160a01b03841617909155169055565b6006546000906001600160a01b031633146109875760405162461bcd60e51b815260040161073c906123f7565b61098f61161e565b905090565b60126020526000908152604090205463ffffffff1681565b6001600160a01b03166000908152600f602052604090205490565b60004382106109e85760405162461bcd60e51b815260040161073c906122e5565b6001600160a01b03831660009081526012602052604090205463ffffffff1680610a1657600091505061054f565b6001600160a01b038416600090815260116020908152604080832063ffffffff600019860181168552925290912054168310610a85576001600160a01b03841660009081526011602090815260408083206000199490940163ffffffff1683529290522060010154905061054f565b6001600160a01b038416600090815260116020908152604080832083805290915290205463ffffffff16831015610ac057600091505061054f565b600060001982015b8163ffffffff168163ffffffff161115610b74576000600263ffffffff848403166001600160a01b038916600090815260116020908152604080832094909304860363ffffffff8181168452948252918390208351808501909452805490941680845260019094015490830152925090871415610b4f5760200151945061054f9350505050565b805163ffffffff16871115610b6657819350610b6d565b6001820392505b5050610ac8565b506001600160a01b038516600090815260116020908152604080832063ffffffff9094168352929052206001015491505092915050565b600b5481565b60136020526000908152604090205481565b600181565b6040518060400160405280600681526020016550454e444c4560d01b81525081565b60408051808201825260128152714e454741544956455f414c4c4f57414e434560701b602080830191909152336000818152600e83528481206001600160a01b038816825290925292812054909261054b929091869161060991908790611535565b600061054b3384846113a5565b6000546001600160a01b03163314610caa576040805162461bcd60e51b815260206004820152600f60248201526e4f4e4c595f474f5645524e414e434560881b604482015290519081900360640190fd5b6001600160a01b038216610cd05760405162461bcd60e51b815260040161073c90612484565b60078490556008839055600980546001600160a01b0319166001600160a01b0384161760ff60a01b1916600160a01b831515021790556040517f01c0ca0e9ae895c3d36eca6824cc5bd60faa1048833ef3014f522ee5f1b2397090610d3c9086908690869086906125c0565b60405180910390a1505042600a555050565b6001600160a01b03811660009081526012602052604081205463ffffffff1680610d79576000610612565b6001600160a01b038316600090815260116020908152604080832063ffffffff60001986011684529091529020600101549392505050565b60408051808201909152600681526550656e646c6560d01b60209091015260007f8cad95687ba82c2ce50e74f7b754645e5117c3a5bec8151c0726d5857980a8667fff2cde021cdee1d25b48654d14cc97c50a36ce29f880cb7d517933c7a82da0cf610e1b611830565b30604051602001610e2f9493929190612223565b60405160208183030381529060405280519060200120905060007fe48329057bfd03d55e49b547132e39cffd9c1820ad7b9d4c5307691425d15adf888888604051602001610e8094939291906121ff565b60405160208183030381529060405280519060200120905060008282604051602001610ead9291906121bc565b604051602081830303815290604052805190602001209050600060018288888860405160008152602001604052604051610eea9493929190612247565b6020604051602081039080840390855afa158015610f0c573d6000803e3d6000fd5b5050604051601f1901519150506001600160a01b038116610f3f5760405162461bcd60e51b815260040161073c9061242e565b6001600160a01b03811660009081526013602052604090208054600181019091558914610f7e5760405162461bcd60e51b815260040161073c9061252b565b87421115610f9e5760405162461bcd60e51b815260040161073c90612459565b610fa8818b6117b0565b505050505b505050505050565b6000546001600160a01b03163314611006576040805162461bcd60e51b815260206004820152600f60248201526e4f4e4c595f474f5645524e414e434560881b604482015290519081900360640190fd5b6040516000906001600160a01b0383169084908381818185875af1925050503d8060008114611051576040519150601f19603f3d011682016040523d82523d6000602084013e611056565b606091505b505090508061109e576040805162461bcd60e51b815260206004820152600f60248201526e15d2551211149055d7d19052531151608a1b604482015290519081900360640190fd5b604080518481526001600160a01b038416602082015281517fec47e7ed86c86774d1a72c19f35c639911393fe7c1a34031fdbd260890da90de929181900390910190a1505050565b6000546001600160a01b03163314611137576040805162461bcd60e51b815260206004820152600f60248201526e4f4e4c595f474f5645524e414e434560881b604482015290519081900360640190fd5b6001600160a01b038116611181576040805162461bcd60e51b815260206004820152600c60248201526b5a45524f5f4144445245535360a01b604482015290519081900360640190fd5b600180546001600160a01b0319166001600160a01b03838116919091179182905560408051929091168252517f70f2dff90d8145da945114cc37c5ffde0eef9306ad5efbd39cae52dc28f9cbf3916020908290030190a150565b60055481565b6001600160a01b039182166000908152600e6020908152604080832093909416825291909152205490565b60075481565b600654600160a01b900460ff1681565b7fe48329057bfd03d55e49b547132e39cffd9c1820ad7b9d4c5307691425d15adf81565b600a5481565b60116020908152600092835260408084209091529082529020805460019091015463ffffffff9091169082565b6001546001600160a01b031681565b6006546001600160a01b031681565b600082820183811015610612576040805162461bcd60e51b815260206004820152601b60248201527f536166654d6174683a206164646974696f6e206f766572666c6f770000000000604482015290519081900360640190fd5b6001600160a01b0383166113175760405162461bcd60e51b815260040161073c90612311565b6001600160a01b03821661133d5760405162461bcd60e51b815260040161073c9061233a565b6001600160a01b038084166000818152600e602090815260408083209487168084529490915290819020849055517f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925906113989085906121f6565b60405180910390a3505050565b6001600160a01b0383166113cb5760405162461bcd60e51b815260040161073c906124aa565b6001600160a01b0382166113f15760405162461bcd60e51b815260040161073c906124d4565b6001600160a01b03821630141561141a5760405162461bcd60e51b815260040161073c90612582565b604080518082018252601781527f5452414e534645525f4558434545445f42414c414e43450000000000000000006020808301919091526001600160a01b0386166000908152600f9091529190912054611475918390611535565b6001600160a01b038085166000908152600f602052604080822093909355908416815220546114a49082611297565b6001600160a01b038084166000818152600f602052604090819020939093559151908516907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef906114f69085906121f6565b60405180910390a36001600160a01b0380841660009081526010602052604080822054858416835291205461153092918216911683611834565b505050565b600081848411156115c45760405162461bcd60e51b81526004018080602001828103825283818151815260200191508051906020019080838360005b83811015611589578181015183820152602001611571565b50505050905090810190601f1680156115b65780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b505050900390565b604080516001600160a01b038416602482015260448082018490528251808303909101815260649091019091526020810180516001600160e01b031663a9059cbb60e01b179052611530908490611971565b600080611629611a22565b9050600d54811161163e5760009150506116dd565b600d546001015b8181116116d85761010381116116835761167b64e8d4a51000611675600454600c54611a3d90919063ffffffff16565b90611a96565b600c556116a7565b6116a364e8d4a51000611675600554600354611a3d90919063ffffffff16565b600c555b600654600c546116c0916001600160a01b031690611afd565b600c546116ce908490611297565b9250600101611645565b50600d555b90565b6001600160a01b0382166117065760405162461bcd60e51b815260040161073c90612552565b6001600160a01b0382166000908152600f60205260409020548181101561173f5760405162461bcd60e51b815260040161073c906122b8565b6117498183611bb1565b6001600160a01b0384166000908152600f602052604090205560035461176f9083611bb1565b6003556040516000906001600160a01b038516907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef906113989086906121f6565b6001600160a01b0380831660008181526010602081815260408084208054600f845282862054949093528787166001600160a01b03198416811790915590519190951694919391928592917f3134e8a2e6d97e929a7e54011ea5485d7d196dd5f0ba4d4ef95803e8e3fc257f9190a461182a828483611834565b50505050565b4690565b816001600160a01b0316836001600160a01b0316141580156118565750600081115b15611530576001600160a01b038316156118e8576001600160a01b03831660009081526012602052604081205463ffffffff1690816118965760006118c8565b6001600160a01b038516600090815260116020908152604080832063ffffffff60001987011684529091529020600101545b905060006118d68285611bb1565b90506118e486848484611c0e565b5050505b6001600160a01b03821615611530576001600160a01b03821660009081526012602052604081205463ffffffff169081611923576000611955565b6001600160a01b038416600090815260116020908152604080832063ffffffff60001987011684529091529020600101545b905060006119638285611297565b9050610fad85848484611c0e565b60006119c6826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564815250856001600160a01b0316611d909092919063ffffffff16565b805190915015611530578080602001905160208110156119e557600080fd5b50516115305760405162461bcd60e51b815260040180806020018281038252602a815260200180612678602a913960400191505060405180910390fd5b600062093a80600b54420381611a3457fe5b04600101905090565b600082611a4c5750600061054f565b82820282848281611a5957fe5b04146106125760405162461bcd60e51b81526004018080602001828103825260218152602001806126576021913960400191505060405180910390fd5b6000808211611aec576040805162461bcd60e51b815260206004820152601a60248201527f536166654d6174683a206469766973696f6e206279207a65726f000000000000604482015290519081900360640190fd5b818381611af557fe5b049392505050565b6001600160a01b038216611b235760405162461bcd60e51b815260040161073c90612500565b600354611b309082611297565b6003556001600160a01b0382166000908152600f6020526040902054611b569082611297565b6001600160a01b0383166000818152600f60205260408082209390935591519091907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef90611ba59085906121f6565b60405180910390a35050565b600082821115611c08576040805162461bcd60e51b815260206004820152601e60248201527f536166654d6174683a207375627472616374696f6e206f766572666c6f770000604482015290519081900360640190fd5b50900390565b6000611c4f436040518060400160405280601881526020017f424c4f434b5f4e554d5f4558434545445f33325f424954530000000000000000815250611da7565b905060008463ffffffff16118015611c9857506001600160a01b038516600090815260116020908152604080832063ffffffff6000198901811685529252909120548282169116145b15611cd5576001600160a01b038516600090815260116020908152604080832063ffffffff60001989011684529091529020600101829055611d46565b60408051808201825263ffffffff808416825260208083018681526001600160a01b038a166000818152601184528681208b8616825284528681209551865490861663ffffffff19918216178755925160019687015590815260129092529390208054928801909116919092161790555b846001600160a01b03167fdec2bacdd2f05b59de34da9b523dff8be42e5e38e818c82fdb0bae774387a7248484604051611d819291906125b2565b60405180910390a25050505050565b6060611d9f8484600085611dd7565b949350505050565b6000816401000000008410611dcf5760405162461bcd60e51b815260040161073c9190612265565b509192915050565b606082471015611e185760405162461bcd60e51b81526004018080602001828103825260268152602001806126316026913960400191505060405180910390fd5b611e2185611f32565b611e72576040805162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e7472616374000000604482015290519081900360640190fd5b600080866001600160a01b031685876040518082805190602001908083835b60208310611eb05780518252601f199092019160209182019101611e91565b6001836020036101000a03801982511681845116808217855250505050505090500191505060006040518083038185875af1925050503d8060008114611f12576040519150601f19603f3d011682016040523d82523d6000602084013e611f17565b606091505b5091509150611f27828286611f38565b979650505050505050565b3b151590565b60608315611f47575081610612565b825115611f575782518084602001fd5b60405162461bcd60e51b8152602060048201818152845160248401528451859391928392604401919085019080838360008315611589578181015183820152602001611571565b600060208284031215611faf578081fd5b81356106128161261b565b60008060408385031215611fcc578081fd5b8235611fd78161261b565b91506020830135611fe78161261b565b809150509250929050565b600080600060608486031215612006578081fd5b83356120118161261b565b925060208401356120218161261b565b929592945050506040919091013590565b60008060408385031215612044578182fd5b823561204f8161261b565b946020939093013593505050565b60008060008060008060c08789031215612075578182fd5b86356120808161261b565b95506020870135945060408701359350606087013560ff811681146120a3578283fd5b9598949750929560808101359460a0909101359350915050565b600080604083850312156120cf578182fd5b82356120da8161261b565b9150602083013563ffffffff81168114611fe7578182fd5b600080600060608486031215612106578283fd5b83356121118161261b565b92506020840135915060408401356121288161261b565b809150509250925092565b600060208284031215612144578081fd5b5035919050565b6000806040838503121561215d578182fd5b823591506020830135611fe78161261b565b60008060008060808587031215612184578384fd5b8435935060208501359250604085013561219d8161261b565b9150606085013580151581146121b1578182fd5b939692955090935050565b61190160f01b81526002810192909252602282015260420190565b6001600160a01b0391909116815260200190565b901515815260200190565b90815260200190565b9384526001600160a01b039290921660208401526040830152606082015260800190565b938452602084019290925260408301526001600160a01b0316606082015260800190565b93845260ff9290921660208401526040830152606082015260800190565b6000602080835283518082850152825b8181101561229157858101830151858201604001528201612275565b818111156122a25783604083870101525b50601f01601f1916929092016040019392505050565b6020808252601390820152724255524e5f4558434545445f42414c414e434560681b604082015260600190565b6020808252601290820152711393d517d6515517d111551154935253915160721b604082015260600190565b6020808252600f908201526e27aba722a92fad22a927afa0a2222960891b604082015260600190565b60208082526011908201527029a822a72222a92fad22a927afa0a2222960791b604082015260600190565b6020808252601a908201527f554e494e495449415445445f434f4e4649475f4348414e474553000000000000604082015260600190565b6020808252601490820152732a24a6a2a627a1a5afa4a9afa727aa2fa7ab22a960611b604082015260600190565b60208082526013908201527210955493925391d7d393d517d0531313d5d151606a1b604082015260600190565b60208082526018908201527f4e4f545f494e43454e54495645535f524543495049454e540000000000000000604082015260600190565b602080825260119082015270494e56414c49445f5349474e415455524560781b604082015260600190565b60208082526011908201527014d251d3905515549157d1561412549151607a1b604082015260600190565b6020808252600c908201526b5a45524f5f4144445245535360a01b604082015260600190565b60208082526010908201526f29a2a72222a92fad22a927afa0a2222960811b604082015260600190565b6020808252601290820152712922a1a2a4ab22a92fad22a927afa0a2222960711b604082015260600190565b60208082526011908201527026a4a72a2faa27afad22a927afa0a2222960791b604082015260600190565b6020808252600d908201526c494e56414c49445f4e4f4e434560981b604082015260600190565b6020808252601690820152754255524e5f46524f4d5f5a45524f5f4144445245535360501b604082015260600190565b60208082526016908201527514d1539117d513d7d513d2d15397d0d3d395149050d560521b604082015260600190565b918252602082015260400190565b93845260208401929092526001600160a01b031660408301521515606082015260800190565b63ffffffff91909116815260200190565b63ffffffff929092168252602082015260400190565b60ff91909116815260200190565b6001600160a01b038116811461089257600080fdfe416464726573733a20696e73756666696369656e742062616c616e636520666f722063616c6c536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f775361666545524332303a204552433230206f7065726174696f6e20646964206e6f742073756363656564a2646970667358221220d8df1688edf4bda330bf2e85c9b60e22ce80bd863ff001bd2cc00635fc238b8f64736f6c634300070600330000000000000000000000008119ec16f0573b7dac7c0cb94eb504fb32456ee10000000000000000000000008849d0d4c35679aa78df1b5b4ceca358d57635df000000000000000000000000c21a74c7150fed22c7ca0bf9a15bbe0ddb4977cc0000000000000000000000009b26afff63e4139cb5a3ea9955903ffffcc1d79b000000000000000000000000e8d28e2ca24bb16fc7e6549ef937e05981d02606

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

0000000000000000000000008119ec16f0573b7dac7c0cb94eb504fb32456ee10000000000000000000000008849d0d4c35679aa78df1b5b4ceca358d57635df000000000000000000000000c21a74c7150fed22c7ca0bf9a15bbe0ddb4977cc0000000000000000000000009b26afff63e4139cb5a3ea9955903ffffcc1d79b000000000000000000000000e8d28e2ca24bb16fc7e6549ef937e05981d02606

-----Decoded View---------------
Arg [0] : _governance (address): 0x8119ec16f0573b7dac7c0cb94eb504fb32456ee1
Arg [1] : pendleTeamTokens (address): 0x8849d0d4c35679aa78df1b5b4ceca358d57635df
Arg [2] : pendleEcosystemFund (address): 0xc21a74c7150fed22c7ca0bf9a15bbe0ddb4977cc
Arg [3] : salesMultisig (address): 0x9b26afff63e4139cb5a3ea9955903ffffcc1d79b
Arg [4] : _liquidityIncentivesRecipient (address): 0xe8d28e2ca24bb16fc7e6549ef937e05981d02606

-----Encoded View---------------
5 Constructor Arguments found :
Arg [0] : 0000000000000000000000008119ec16f0573b7dac7c0cb94eb504fb32456ee1
Arg [1] : 0000000000000000000000008849d0d4c35679aa78df1b5b4ceca358d57635df
Arg [2] : 000000000000000000000000c21a74c7150fed22c7ca0bf9a15bbe0ddb4977cc
Arg [3] : 0000000000000000000000009b26afff63e4139cb5a3ea9955903ffffcc1d79b
Arg [4] : 000000000000000000000000e8d28e2ca24bb16fc7e6549ef937e05981d02606


Deployed ByteCode Sourcemap

1539:19129:3:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1844:38;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;6709:158;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;3059:35::-;;;:::i;:::-;;;;;;;:::i;1975:::-;;;:::i;2747:61::-;;;:::i;3601:130::-;;;:::i;2457:55::-;;;:::i;7570:343::-;;;;;;:::i;:::-;;:::i;2814:59::-;;;:::i;:::-;;;;;;;:::i;1934:35::-;;;:::i;:::-;;;;;;;:::i;3020:33::-;;;:::i;8198:239::-;;;;;;:::i;:::-;;:::i;2288:225:7:-;;;;;;:::i;:::-;;:::i;:::-;;17732:953:3;;;:::i;9228:182::-;;;;;;:::i;:::-;;:::i;2879:44::-;;;:::i;3225:::-;;;;;;:::i;:::-;;:::i;1215:25:4:-;;;:::i;10723:100:3:-;;;;;;:::i;:::-;;:::i;1969:254:4:-;;;:::i;18691:234:3:-;;;:::i;3483:48::-;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;10049:118::-;;;;;;:::i;:::-;;:::i;12514:1214::-;;;;;;:::i;:::-;;:::i;2981:33::-;;;:::i;4025:41::-;;;;;;:::i;:::-;;:::i;1788:50::-;;;:::i;1888:40::-;;;:::i;8731:317::-;;;;;;:::i;:::-;;:::i;7120:152::-;;;;;;:::i;:::-;;:::i;16839:887::-;;;;;;:::i;:::-;;:::i;10361:220::-;;;;;;:::i;:::-;;:::i;11246:831::-;;;;;;:::i;:::-;;:::i;1696:242:7:-;;;;;;:::i;:::-;;:::i;2389:239:4:-;;;;;;:::i;:::-;;:::i;2518:54:3:-;;;:::i;9707:146::-;;;;;;:::i;:::-;;:::i;2679:62::-;;;:::i;2636:37::-;;;:::i;3822:125::-;;;:::i;2929:46::-;;;:::i;3349:68::-;;;;;;:::i;:::-;;:::i;:::-;;;;;;;;:::i;1246:32:4:-;;;:::i;2578:52:3:-;;;:::i;1844:38::-;;;;;;;;;;;;;;-1:-1:-1;;;1844:38:3;;;;:::o;6709:158::-;6786:4;6802:37;6811:10;6823:7;6832:6;6802:8;:37::i;:::-;-1:-1:-1;6856:4:3;6709:158;;;;;:::o;3059:35::-;;;;:::o;1975:::-;;;;:::o;2747:61::-;;;;:::o;3601:130::-;3651:80;3601:130;:::o;2457:55::-;;;;:::o;7570:343::-;7691:4;7707:27;7717:3;7722;7727:6;7707:9;:27::i;:::-;7807:68;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;7807:15:3;;-1:-1:-1;7807:15:3;;;:10;:15;;;;;7783:10;7807:27;;;;;;;;;;7744:141;;7766:3;;7783:10;;7807:68;;7839:6;;7807:31;:68::i;:::-;7744:8;:141::i;:::-;-1:-1:-1;7902:4:3;7570:343;;;;;;:::o;2814:59::-;;;-1:-1:-1;;;;;2814:59:3;;:::o;1934:35::-;1967:2;1934:35;:::o;3020:33::-;;;;:::o;8198:239::-;8340:10;8311:4;8361:22;;;:10;:22;;;;;;;;-1:-1:-1;;;;;8361:31:3;;;;;;;;;;8311:4;;8331:78;;8352:7;;8361:47;;8397:10;8361:35;:47::i;2288:225:7:-;1807:10:4;;-1:-1:-1;;;;;1807:10:4;1793;:24;1785:52;;;;;-1:-1:-1;;;1785:52:4;;;;;;;;;;;;-1:-1:-1;;;1785:52:4;;;;;;;;;;;;;;;2421:34:7::1;-1:-1:-1::0;;;;;2421:18:7;::::1;2440:6:::0;2448;2421:18:::1;:34::i;:::-;2470:36;::::0;;-1:-1:-1;;;;;2470:36:7;;::::1;::::0;;::::1;::::0;::::1;::::0;;;;::::1;::::0;;;;;;::::1;::::0;;;;;;;::::1;2288:225:::0;;;:::o;17732:953:3:-;17798:22;;17790:66;;;;-1:-1:-1;;;17790:66:3;;;;;;;:::i;:::-;;;;;;;;;2445:6;17905:22;;:49;17887:15;:67;17866:134;;;;-1:-1:-1;;;17866:134:3;;;;;;;:::i;:::-;18011:25;:23;:25::i;:::-;-1:-1:-1;18196:38:3;;18162:31;:72;;;18277:37;;18244:30;:70;;;18355:35;;18324:28;:66;;18419:23;-1:-1:-1;;;18419:23:3;;;;;18400:42;;;;-1:-1:-1;;;;;;;;;;18324:66:3;;;-1:-1:-1;;;;;18355:35:3;;;18324:66;18400:42;;;;;;;;;;;;-1:-1:-1;18452:22:3;:26;18493:185;;;;;;18196:38;;18277:37;;18610:28;;;;18652:16;;;;;;18493:185;:::i;:::-;;;;;;;;17732:953::o;9228:182::-;9307:16;;9283:4;;-1:-1:-1;;;9307:16:3;;;;9299:48;;;;-1:-1:-1;;;9299:48:3;;;;;;;:::i;:::-;9357:25;9363:10;9375:6;9357:5;:25::i;:::-;-1:-1:-1;9399:4:3;9228:182;;;:::o;2879:44::-;;;-1:-1:-1;;;2879:44:3;;;;;:::o;3225:::-;;;;;;;;;;;;-1:-1:-1;;;;;3225:44:3;;:::o;1215:25:4:-;;;-1:-1:-1;;;;;1215:25:4;;:::o;10723:100:3:-;10784:32;10794:10;10806:9;10784;:32::i;:::-;10723:100;:::o;1969:254:4:-;2021:17;;-1:-1:-1;;;;;2021:17:4;2042:10;2021:31;2013:60;;;;;-1:-1:-1;;;2013:60:4;;;;;;;;;;;;-1:-1:-1;;;2013:60:4;;;;;;;;;;;;;;;2106:17;;;2125:10;2088:48;;;-1:-1:-1;;;;;2106:17:4;;;2088:48;;2125:10;;;;2088:48;;;;;;;;;;;;;;;;2159:17;;;;2146:30;;-1:-1:-1;;;;;;2146:30:4;;;-1:-1:-1;;;;;2159:17:4;;2146:30;;;;2186;;;1969:254::o;18691:234:3:-;18809:28;;18753:22;;-1:-1:-1;;;;;18809:28:3;18795:10;:42;18787:79;;;;-1:-1:-1;;;18787:79:3;;;;;;;:::i;:::-;18893:25;:23;:25::i;:::-;18876:42;;18691:234;:::o;3483:48::-;;;;;;;;;;;;;;;:::o;10049:118::-;-1:-1:-1;;;;;10143:17:3;10117:7;10143:17;;;:8;:17;;;;;;;10049:118::o;12514:1214::-;12637:7;12682:12;12668:11;:26;12660:57;;;;-1:-1:-1;;;12660:57:3;;;;;;;:::i;:::-;-1:-1:-1;;;;;12750:23:3;;12728:19;12750:23;;;:14;:23;;;;;;;;12787:17;12783:56;;12827:1;12820:8;;;;;12783:56;-1:-1:-1;;;;;12896:20:3;;;;;;:11;:20;;;;;;;;:38;-1:-1:-1;;12917:16:3;;12896:38;;;;;;;;;:48;;:63;-1:-1:-1;12892:145:3;;-1:-1:-1;;;;;12982:20:3;;;;;;:11;:20;;;;;;;;-1:-1:-1;;13003:16:3;;;;12982:38;;;;;;;;13018:1;12982:44;;;-1:-1:-1;12975:51:3;;12892:145;-1:-1:-1;;;;;13095:20:3;;;;;;:11;:20;;;;;;;;:23;;;;;;;;:33;:23;:33;:47;-1:-1:-1;13091:86:3;;;13165:1;13158:8;;;;;13091:86;13187:12;-1:-1:-1;;13228:16:3;;13254:418;13269:5;13261:13;;:5;:13;;;13254:418;;;13290:13;13332:1;13314:19;13315:13;;;13314:19;-1:-1:-1;;;;;13397:20:3;;13374;13397;;;:11;:20;;;;;;;;13314:19;;;;13306:27;;13397:28;;;;;;;;;;;;;13374:51;;;;;;;;;;;;;;;;;;;;;;;;;13306:27;-1:-1:-1;13374:51:3;13443:27;;13439:223;;;13497:8;;;;-1:-1:-1;13490:15:3;;-1:-1:-1;;;;13490:15:3;13439:223;13530:12;;:26;;;-1:-1:-1;13526:136:3;;;13584:6;13576:14;;13526:136;;;13646:1;13637:6;:10;13629:18;;13526:136;13254:418;;;;;-1:-1:-1;;;;;;13688:20:3;;;;;;:11;:20;;;;;;;;:27;;;;;;;;;;:33;;;;-1:-1:-1;;12514:1214:3;;;;:::o;2981:33::-;;;;:::o;4025:41::-;;;;;;;;;;;;;:::o;1788:50::-;1834:4;1788:50;:::o;1888:40::-;;;;;;;;;;;;;;-1:-1:-1;;;1888:40:3;;;;:::o;8731:317::-;8936:74;;;;;;;;;;;-1:-1:-1;;;8936:74:3;;;;;;;;8891:10;8849:4;8936:22;;;:10;:22;;;;;-1:-1:-1;;;;;8936:31:3;;;;;;;;;;;8849:4;;8869:151;;8891:10;;8915:7;;8936:74;;:31;8972:15;;8936:35;:74::i;7120:152::-;7194:4;7210:34;7220:10;7232:3;7237:6;7210:9;:34::i;16839:887::-;1807:10:4;;-1:-1:-1;;;;;1807:10:4;1793;:24;1785:52;;;;;-1:-1:-1;;;1785:52:4;;;;;;;;;;;;-1:-1:-1;;;1785:52:4;;;;;;;;;;;;;;;-1:-1:-1;;;;;17105:43:3;::::1;17097:68;;;;-1:-1:-1::0;;;17097:68:3::1;;;;;;;:::i;:::-;17175:38;:73:::0;;;17258:37:::1;:71:::0;;;17339:35:::1;:67:::0;;-1:-1:-1;;;;;;17339:67:3::1;-1:-1:-1::0;;;;;17339:67:3;::::1;;-1:-1:-1::0;;;;17416:43:3::1;-1:-1:-1::0;;;17416:43:3;::::1;;;;::::0;;17474:195:::1;::::0;::::1;::::0;::::1;::::0;17175:73;;17258:71;;17339:67;;17416:43;;17474:195:::1;:::i;:::-;;;;;;;;-1:-1:-1::0;;17704:15:3::1;17679:22;:40:::0;-1:-1:-1;;16839:887:3:o;10361:220::-;-1:-1:-1;;;;;10467:23:3;;10426:7;10467:23;;;:14;:23;;;;;;;;10507:16;:67;;10573:1;10507:67;;;-1:-1:-1;;;;;10526:20:3;;;;;;:11;:20;;;;;;;;:38;-1:-1:-1;;10547:16:3;;10526:38;;;;;;;;10562:1;10526:44;;10500:74;10361:220;-1:-1:-1;;;10361:220:3:o;11246:831::-;11530:4;;;;;;;;;;;;-1:-1:-1;;;11530:4:3;;;;;11421:23;3651:80;11514:22;11538:12;:10;:12::i;:::-;11560:4;11486:80;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;11459:121;;;;;;11421:159;;11590:18;3876:71;11653:9;11664:5;11671:6;11621:57;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;11611:68;;;;;;11590:89;;11689:14;11745:15;11762:10;11716:57;;;;;;;;;:::i;:::-;;;;;;;;;;;;;11706:68;;;;;;11689:85;;11784:17;11804:26;11814:6;11822:1;11825;11828;11804:26;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;11804:26:3;;-1:-1:-1;;11804:26:3;;;-1:-1:-1;;;;;;;11848:23:3;;11840:53;;;;-1:-1:-1;;;11840:53:3;;;;;;;:::i;:::-;-1:-1:-1;;;;;11920:17:3;;;;;;:6;:17;;;;;:19;;;;;;;;11911:28;;11903:54;;;;-1:-1:-1;;;11903:54:3;;;;;;;:::i;:::-;11994:6;11975:15;:25;;11967:55;;;;-1:-1:-1;;;11967:55:3;;;;;;;:::i;:::-;12039:31;12049:9;12060;12039;:31::i;:::-;12032:38;;;;11246:831;;;;;;;:::o;1696:242:7:-;1807:10:4;;-1:-1:-1;;;;;1807:10:4;1793;:24;1785:52;;;;;-1:-1:-1;;;1785:52:4;;;;;;;;;;;;-1:-1:-1;;;1785:52:4;;;;;;;;;;;;;;;1812:30:7::1;::::0;1794:12:::1;::::0;-1:-1:-1;;;;;1812:11:7;::::1;::::0;1831:6;;1794:12;1812:30;1794:12;1812:30;1831:6;1812:11;:30:::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1793:49;;;1860:7;1852:35;;;::::0;;-1:-1:-1;;;1852:35:7;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;-1:-1:-1;;;1852:35:7;;;;;;;;;;;;;::::1;;1902:29;::::0;;;;;-1:-1:-1;;;;;1902:29:7;::::1;;::::0;::::1;::::0;;;::::1;::::0;;;;;;;;;::::1;1847:1:4;1696:242:7::0;;:::o;2389:239:4:-;1807:10;;-1:-1:-1;;;;;1807:10:4;1793;:24;1785:52;;;;;-1:-1:-1;;;1785:52:4;;;;;;;;;;;;-1:-1:-1;;;1785:52:4;;;;;;;;;;;;;;;-1:-1:-1;;;;;2478:25:4;::::1;2470:50;;;::::0;;-1:-1:-1;;;2470:50:4;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;-1:-1:-1;;;2470:50:4;;;;;;;;;;;;;::::1;;2530:17;:31:::0;;-1:-1:-1;;;;;;2530:31:4::1;-1:-1:-1::0;;;;;2530:31:4;;::::1;::::0;;;::::1;::::0;;;;2577:44:::1;::::0;;2603:17;;;::::1;2577:44:::0;;;::::1;::::0;::::1;::::0;;;;;;::::1;2389:239:::0;:::o;2518:54:3:-;;;;:::o;9707:146::-;-1:-1:-1;;;;;9818:19:3;;;9792:7;9818:19;;;:10;:19;;;;;;;;:28;;;;;;;;;;;;;9707:146::o;2679:62::-;;;;:::o;2636:37::-;;;-1:-1:-1;;;2636:37:3;;;;;:::o;3822:125::-;3876:71;3822:125;:::o;2929:46::-;;;;:::o;3349:68::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;1246:32:4:-;;;-1:-1:-1;;;;;1246:32:4;;:::o;2578:52:3:-;;;-1:-1:-1;;;;;2578:52:3;;:::o;2690:175:6:-;2748:7;2779:5;;;2802:6;;;;2794:46;;;;;-1:-1:-1;;;2794:46:6;;;;;;;;;;;;;;;;;;;;;;;;;;;14636:307:3;-1:-1:-1;;;;;14761:17:3;;14753:45;;;;-1:-1:-1;;;14753:45:3;;;;;;;:::i;:::-;-1:-1:-1;;;;;14816:17:3;;14808:47;;;;-1:-1:-1;;;14808:47:3;;;;;;;:::i;:::-;-1:-1:-1;;;;;14866:15:3;;;;;;;:10;:15;;;;;;;;:20;;;;;;;;;;;;;;:29;;;14910:26;;;;;14889:6;;14910:26;:::i;:::-;;;;;;;;14636:307;;;:::o;14108:522::-;-1:-1:-1;;;;;14226:17:3;;14218:46;;;;-1:-1:-1;;;14218:46:3;;;;;;;:::i;:::-;-1:-1:-1;;;;;14282:17:3;;14274:48;;;;-1:-1:-1;;;14274:48:3;;;;;;;:::i;:::-;-1:-1:-1;;;;;14340:20:3;;14355:4;14340:20;;14332:55;;;;-1:-1:-1;;;14332:55:3;;;;;;;:::i;:::-;14414:52;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;14414:13:3;;-1:-1:-1;14414:13:3;;;:8;:13;;;;;;;;:52;;14432:6;;14414:17;:52::i;:::-;-1:-1:-1;;;;;14398:13:3;;;;;;;:8;:13;;;;;;:68;;;;14492:13;;;;;;;:25;;14510:6;14492:17;:25::i;:::-;-1:-1:-1;;;;;14476:13:3;;;;;;;:8;:13;;;;;;;:41;;;;14532:26;;;;;;;;;;14551:6;;14532:26;:::i;:::-;;;;;;;;-1:-1:-1;;;;;14584:14:3;;;;;;;:9;:14;;;;;;;14600;;;;;;;;14569:54;;14584:14;;;;14600;14616:6;14569:14;:54::i;:::-;14108:522;;;:::o;5432:163:6:-;5518:7;5553:12;5545:6;;;;5537:29;;;;-1:-1:-1;;;5537:29:6;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;5583:5:6;;;5432:163::o;685:175:5:-;794:58;;;-1:-1:-1;;;;;794:58:5;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;794:58:5;-1:-1:-1;;;794:58:5;;;767:86;;787:5;;767:19;:86::i;18931:855:3:-;18984:22;19018:20;19041:17;:15;:17::i;:::-;19018:40;;19088:20;;19072:12;:36;19068:75;;19131:1;19124:8;;;;;19068:75;19169:20;;19192:1;19169:24;19152:583;19200:12;19195:1;:17;19152:583;;19242:3;19237:1;:8;19233:354;;19286:117;2370:17;19286:55;19309:31;;19286:18;;:22;;:55;;;;:::i;:::-;:59;;:117::i;:::-;19265:18;:138;19233:354;;;19463:109;2370:17;19463:47;19479:30;;19463:11;;:15;;:47;;;;:::i;:109::-;19442:18;:130;19233:354;19606:28;;19636:18;;19600:55;;-1:-1:-1;;;;;19606:28:3;;19600:5;:55::i;:::-;19705:18;;19686:38;;:14;;:18;:38::i;:::-;19669:55;-1:-1:-1;19214:3:3;;19152:583;;;-1:-1:-1;19744:20:3;:35;18931:855;;:::o;20261:405::-;-1:-1:-1;;;;;20336:21:3;;20328:56;;;;-1:-1:-1;;;20328:56:3;;;;;;;:::i;:::-;-1:-1:-1;;;;;20420:17:3;;20395:22;20420:17;;;:8;:17;;;;;;20455:24;;;;20447:56;;;;-1:-1:-1;;;20447:56:3;;;;;;;:::i;:::-;20533:26;:14;20552:6;20533:18;:26::i;:::-;-1:-1:-1;;;;;20513:17:3;;;;;;:8;:17;;;;;:46;20583:11;;:23;;20599:6;20583:15;:23::i;:::-;20569:11;:37;20622;;20648:1;;-1:-1:-1;;;;;20622:37:3;;;;;;;20652:6;;20622:37;:::i;13734:368::-;-1:-1:-1;;;;;13836:20:3;;;13810:23;13836:20;;;:9;:20;;;;;;;;;;13893:8;:19;;;;;;13922:20;;;;:32;;;-1:-1:-1;;;;;;13922:32:3;;;;;;;13970:54;;13836:20;;;;;13893:19;;13922:32;;13836:20;;;13970:54;;13810:23;13970:54;14035:60;14050:15;14067:9;14078:16;14035:14;:60::i;:::-;13734:368;;;;:::o;16661:172::-;16784:9;16661:172;:::o;14949:865::-;15084:6;-1:-1:-1;;;;;15074:16:3;:6;-1:-1:-1;;;;;15074:16:3;;;:30;;;;;15103:1;15094:6;:10;15074:30;15070:738;;;-1:-1:-1;;;;;15124:20:3;;;15120:332;;-1:-1:-1;;;;;15183:22:3;;15164:16;15183:22;;;:14;:22;;;;;;;;;15243:13;:60;;15302:1;15243:60;;;-1:-1:-1;;;;;15259:19:3;;;;;;:11;:19;;;;;;;;:34;-1:-1:-1;;15279:13:3;;15259:34;;;;;;;;15291:1;15259:40;;15243:60;15223:80;-1:-1:-1;15321:17:3;15341:21;15223:80;15355:6;15341:13;:21::i;:::-;15321:41;;15380:57;15397:6;15405:9;15416;15427;15380:16;:57::i;:::-;15120:332;;;;-1:-1:-1;;;;;15470:20:3;;;15466:332;;-1:-1:-1;;;;;15529:22:3;;15510:16;15529:22;;;:14;:22;;;;;;;;;15589:13;:60;;15648:1;15589:60;;;-1:-1:-1;;;;;15605:19:3;;;;;;:11;:19;;;;;;;;:34;-1:-1:-1;;15625:13:3;;15605:34;;;;;;;;15637:1;15605:40;;15589:60;15569:80;-1:-1:-1;15667:17:3;15687:21;15569:80;15701:6;15687:13;:21::i;:::-;15667:41;;15726:57;15743:6;15751:9;15762;15773;15726:16;:57::i;2948:751:5:-;3367:23;3393:69;3421:4;3393:69;;;;;;;;;;;;;;;;;3401:5;-1:-1:-1;;;;;3393:27:5;;;:69;;;;;:::i;:::-;3476:17;;3367:95;;-1:-1:-1;3476:21:5;3472:221;;3616:10;3605:30;;;;;;;;;;;;;;;-1:-1:-1;3605:30:5;3597:85;;;;-1:-1:-1;;;3597:85:5;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;19829:136:3;19879:14;19947:6;19933:9;;19915:15;:27;19914:40;;;;;;19957:1;19914:44;19905:53;;19829:136;:::o;3538:215:6:-;3596:7;3619:6;3615:20;;-1:-1:-1;3634:1:6;3627:8;;3615:20;3657:5;;;3661:1;3657;:5;:1;3680:5;;;;;:10;3672:56;;;;-1:-1:-1;;;3672:56:6;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;4217:150;4275:7;4306:1;4302;:5;4294:44;;;;;-1:-1:-1;;;4294:44:6;;;;;;;;;;;;;;;;;;;;;;;;;;;;4359:1;4355;:5;;;;;;;4217:150;-1:-1:-1;;;4217:150:6:o;19971:284:3:-;-1:-1:-1;;;;;20046:21:3;;20038:51;;;;-1:-1:-1;;;20038:51:3;;;;;;;:::i;:::-;20114:11;;:23;;20130:6;20114:15;:23::i;:::-;20100:11;:37;-1:-1:-1;;;;;20167:17:3;;;;;;:8;:17;;;;;;:29;;20189:6;20167:21;:29::i;:::-;-1:-1:-1;;;;;20147:17:3;;;;;;:8;:17;;;;;;:49;;;;20211:37;;20147:17;;;20211:37;;;;20241:6;;20211:37;:::i;:::-;;;;;;;;19971:284;;:::o;3136:155:6:-;3194:7;3226:1;3221;:6;;3213:49;;;;;-1:-1:-1;;;3213:49:6;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;3279:5:6;;;3136:155::o;15820:668:3:-;15979:18;16000:48;16007:12;16000:48;;;;;;;;;;;;;;;;;:6;:48::i;:::-;15979:69;;16091:1;16076:12;:16;;;:85;;;;-1:-1:-1;;;;;;16096:22:3;;;;;;:11;:22;;;;;;;;:65;-1:-1:-1;;16119:16:3;;16096:40;;;;;;;;;:50;:65;;;:50;;:65;16076:85;16059:356;;;-1:-1:-1;;;;;16186:22:3;;;;;;:11;:22;;;;;;;;:40;-1:-1:-1;;16209:16:3;;16186:40;;;;;;;;16224:1;16186:46;:57;;;16059:356;;;16313:33;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;16274:22:3;;-1:-1:-1;16274:22:3;;;:11;:22;;;;;:36;;;;;;;;;;:72;;;;;;;-1:-1:-1;;16274:72:3;;;;;;;;;;;;;16360:25;;;:14;:25;;;;;;:44;;16388:16;;;16360:44;;;;;;;;;;16059:356;16451:9;-1:-1:-1;;;;;16430:51:3;;16462:8;16472;16430:51;;;;;;;:::i;:::-;;;;;;;;15820:668;;;;;:::o;3581:193:0:-;3684:12;3715:52;3737:6;3745:4;3751:1;3754:12;3715:21;:52::i;:::-;3708:59;3581:193;-1:-1:-1;;;;3581:193:0:o;16494:161:3:-;16572:6;16609:12;16602:5;16598:9;;16590:32;;;;-1:-1:-1;;;16590:32:3;;;;;;;;:::i;:::-;-1:-1:-1;16646:1:3;;16494:161;-1:-1:-1;;16494:161:3:o;4608:523:0:-;4735:12;4792:5;4767:21;:30;;4759:81;;;;-1:-1:-1;;;4759:81:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;4858:18;4869:6;4858:10;:18::i;:::-;4850:60;;;;;-1:-1:-1;;;4850:60:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;4981:12;4995:23;5022:6;-1:-1:-1;;;;;5022:11:0;5042:5;5050:4;5022:33;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;5022:33:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;4980:75;;;;5072:52;5090:7;5099:10;5111:12;5072:17;:52::i;:::-;5065:59;4608:523;-1:-1:-1;;;;;;;4608:523:0:o;726:413::-;1086:20;1124:8;;;726:413::o;7091:725::-;7206:12;7234:7;7230:580;;;-1:-1:-1;7264:10:0;7257:17;;7230:580;7375:17;;:21;7371:429;;7633:10;7627:17;7693:15;7680:10;7676:2;7672:19;7665:44;7582:145;7765:20;;-1:-1:-1;;;7765:20:0;;;;;;;;;;;;;;;;;7772:12;;7765:20;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;14:259:8;;126:2;114:9;105:7;101:23;97:32;94:2;;;147:6;139;132:22;94:2;191:9;178:23;210:33;237:5;210:33;:::i;278:402::-;;;407:2;395:9;386:7;382:23;378:32;375:2;;;428:6;420;413:22;375:2;472:9;459:23;491:33;518:5;491:33;:::i;:::-;543:5;-1:-1:-1;600:2:8;585:18;;572:32;613:35;572:32;613:35;:::i;:::-;667:7;657:17;;;365:315;;;;;:::o;685:470::-;;;;831:2;819:9;810:7;806:23;802:32;799:2;;;852:6;844;837:22;799:2;896:9;883:23;915:33;942:5;915:33;:::i;:::-;967:5;-1:-1:-1;1024:2:8;1009:18;;996:32;1037:35;996:32;1037:35;:::i;:::-;789:366;;1091:7;;-1:-1:-1;;;1145:2:8;1130:18;;;;1117:32;;789:366::o;1160:327::-;;;1289:2;1277:9;1268:7;1264:23;1260:32;1257:2;;;1310:6;1302;1295:22;1257:2;1354:9;1341:23;1373:33;1400:5;1373:33;:::i;:::-;1425:5;1477:2;1462:18;;;;1449:32;;-1:-1:-1;;;1247:240:8:o;1492:709::-;;;;;;;1687:3;1675:9;1666:7;1662:23;1658:33;1655:2;;;1709:6;1701;1694:22;1655:2;1753:9;1740:23;1772:33;1799:5;1772:33;:::i;:::-;1824:5;-1:-1:-1;1876:2:8;1861:18;;1848:32;;-1:-1:-1;1927:2:8;1912:18;;1899:32;;-1:-1:-1;1983:2:8;1968:18;;1955:32;2031:4;2018:18;;2006:31;;1996:2;;2056:6;2048;2041:22;1996:2;1645:556;;;;-1:-1:-1;1645:556:8;;2138:3;2123:19;;2110:33;;2190:3;2175:19;;;2162:33;;-1:-1:-1;1645:556:8;-1:-1:-1;;1645:556:8:o;2206:441::-;;;2334:2;2322:9;2313:7;2309:23;2305:32;2302:2;;;2355:6;2347;2340:22;2302:2;2399:9;2386:23;2418:33;2445:5;2418:33;:::i;:::-;2470:5;-1:-1:-1;2527:2:8;2512:18;;2499:32;2575:10;2562:24;;2550:37;;2540:2;;2606:6;2598;2591:22;2652:484;;;;2812:2;2800:9;2791:7;2787:23;2783:32;2780:2;;;2833:6;2825;2818:22;2780:2;2877:9;2864:23;2896:33;2923:5;2896:33;:::i;:::-;2948:5;-1:-1:-1;3000:2:8;2985:18;;2972:32;;-1:-1:-1;3056:2:8;3041:18;;3028:32;3069:35;3028:32;3069:35;:::i;:::-;3123:7;3113:17;;;2770:366;;;;;:::o;3141:190::-;;3253:2;3241:9;3232:7;3228:23;3224:32;3221:2;;;3274:6;3266;3259:22;3221:2;-1:-1:-1;3302:23:8;;3211:120;-1:-1:-1;3211:120:8:o;3336:335::-;;;3473:2;3461:9;3452:7;3448:23;3444:32;3441:2;;;3494:6;3486;3479:22;3441:2;3535:9;3522:23;3512:33;;3595:2;3584:9;3580:18;3567:32;3608:33;3635:5;3608:33;:::i;3676:575::-;;;;;3836:3;3824:9;3815:7;3811:23;3807:33;3804:2;;;3858:6;3850;3843:22;3804:2;3899:9;3886:23;3876:33;;3956:2;3945:9;3941:18;3928:32;3918:42;;4010:2;3999:9;3995:18;3982:32;4023:33;4050:5;4023:33;:::i;:::-;4075:5;-1:-1:-1;4132:2:8;4117:18;;4104:32;4174:15;;4167:23;4155:36;;4145:2;;4210:6;4202;4195:22;4145:2;3794:457;;;;-1:-1:-1;3794:457:8;;-1:-1:-1;;3794:457:8:o;4256:392::-;-1:-1:-1;;;4514:27:8;;4566:1;4557:11;;4550:27;;;;4602:2;4593:12;;4586:28;4639:2;4630:12;;4504:144::o;4653:203::-;-1:-1:-1;;;;;4817:32:8;;;;4799:51;;4787:2;4772:18;;4754:102::o;4861:187::-;5026:14;;5019:22;5001:41;;4989:2;4974:18;;4956:92::o;5053:177::-;5199:25;;;5187:2;5172:18;;5154:76::o;5235:417::-;5466:25;;;-1:-1:-1;;;;;5527:32:8;;;;5522:2;5507:18;;5500:60;5591:2;5576:18;;5569:34;5634:2;5619:18;;5612:34;5453:3;5438:19;;5420:232::o;5657:417::-;5888:25;;;5944:2;5929:18;;5922:34;;;;5987:2;5972:18;;5965:34;-1:-1:-1;;;;;6035:32:8;6030:2;6015:18;;6008:60;5875:3;5860:19;;5842:232::o;6079:398::-;6306:25;;;6379:4;6367:17;;;;6362:2;6347:18;;6340:45;6416:2;6401:18;;6394:34;6459:2;6444:18;;6437:34;6293:3;6278:19;;6260:217::o;6482:603::-;;6623:2;6652;6641:9;6634:21;6684:6;6678:13;6727:6;6722:2;6711:9;6707:18;6700:34;6752:4;6765:140;6779:6;6776:1;6773:13;6765:140;;;6874:14;;;6870:23;;6864:30;6840:17;;;6859:2;6836:26;6829:66;6794:10;;6765:140;;;6923:6;6920:1;6917:13;6914:2;;;6993:4;6988:2;6979:6;6968:9;6964:22;6960:31;6953:45;6914:2;-1:-1:-1;7069:2:8;7048:15;-1:-1:-1;;7044:29:8;7029:45;;;;7076:2;7025:54;;6603:482;-1:-1:-1;;;6603:482:8:o;7090:343::-;7292:2;7274:21;;;7331:2;7311:18;;;7304:30;-1:-1:-1;;;7365:2:8;7350:18;;7343:49;7424:2;7409:18;;7264:169::o;7438:342::-;7640:2;7622:21;;;7679:2;7659:18;;;7652:30;-1:-1:-1;;;7713:2:8;7698:18;;7691:48;7771:2;7756:18;;7612:168::o;7785:339::-;7987:2;7969:21;;;8026:2;8006:18;;;7999:30;-1:-1:-1;;;8060:2:8;8045:18;;8038:45;8115:2;8100:18;;7959:165::o;8129:341::-;8331:2;8313:21;;;8370:2;8350:18;;;8343:30;-1:-1:-1;;;8404:2:8;8389:18;;8382:47;8461:2;8446:18;;8303:167::o;8475:350::-;8677:2;8659:21;;;8716:2;8696:18;;;8689:30;8755:28;8750:2;8735:18;;8728:56;8816:2;8801:18;;8649:176::o;8830:344::-;9032:2;9014:21;;;9071:2;9051:18;;;9044:30;-1:-1:-1;;;9105:2:8;9090:18;;9083:50;9165:2;9150:18;;9004:170::o;9179:343::-;9381:2;9363:21;;;9420:2;9400:18;;;9393:30;-1:-1:-1;;;9454:2:8;9439:18;;9432:49;9513:2;9498:18;;9353:169::o;9527:348::-;9729:2;9711:21;;;9768:2;9748:18;;;9741:30;9807:26;9802:2;9787:18;;9780:54;9866:2;9851:18;;9701:174::o;9880:341::-;10082:2;10064:21;;;10121:2;10101:18;;;10094:30;-1:-1:-1;;;10155:2:8;10140:18;;10133:47;10212:2;10197:18;;10054:167::o;10226:341::-;10428:2;10410:21;;;10467:2;10447:18;;;10440:30;-1:-1:-1;;;10501:2:8;10486:18;;10479:47;10558:2;10543:18;;10400:167::o;10572:336::-;10774:2;10756:21;;;10813:2;10793:18;;;10786:30;-1:-1:-1;;;10847:2:8;10832:18;;10825:42;10899:2;10884:18;;10746:162::o;10913:340::-;11115:2;11097:21;;;11154:2;11134:18;;;11127:30;-1:-1:-1;;;11188:2:8;11173:18;;11166:46;11244:2;11229:18;;11087:166::o;11258:342::-;11460:2;11442:21;;;11499:2;11479:18;;;11472:30;-1:-1:-1;;;11533:2:8;11518:18;;11511:48;11591:2;11576:18;;11432:168::o;11605:341::-;11807:2;11789:21;;;11846:2;11826:18;;;11819:30;-1:-1:-1;;;11880:2:8;11865:18;;11858:47;11937:2;11922:18;;11779:167::o;11951:337::-;12153:2;12135:21;;;12192:2;12172:18;;;12165:30;-1:-1:-1;;;12226:2:8;12211:18;;12204:43;12279:2;12264:18;;12125:163::o;12293:346::-;12495:2;12477:21;;;12534:2;12514:18;;;12507:30;-1:-1:-1;;;12568:2:8;12553:18;;12546:52;12630:2;12615:18;;12467:172::o;12644:346::-;12846:2;12828:21;;;12885:2;12865:18;;;12858:30;-1:-1:-1;;;12919:2:8;12904:18;;12897:52;12981:2;12966:18;;12818:172::o;13177:248::-;13351:25;;;13407:2;13392:18;;13385:34;13339:2;13324:18;;13306:119::o;13430:427::-;13655:25;;;13711:2;13696:18;;13689:34;;;;-1:-1:-1;;;;;13759:32:8;13754:2;13739:18;;13732:60;13835:14;13828:22;13823:2;13808:18;;13801:50;13642:3;13627:19;;13609:248::o;13862:192::-;14036:10;14024:23;;;;14006:42;;13994:2;13979:18;;13961:93::o;14059:263::-;14261:10;14249:23;;;;14231:42;;14304:2;14289:18;;14282:34;14219:2;14204:18;;14186:136::o;14327:184::-;14499:4;14487:17;;;;14469:36;;14457:2;14442:18;;14424:87::o;14516:133::-;-1:-1:-1;;;;;14593:31:8;;14583:42;;14573:2;;14639:1;14636;14629:12

Swarm Source

ipfs://d8df1688edf4bda330bf2e85c9b60e22ce80bd863ff001bd2cc00635fc238b8f

A token is a representation of an on-chain or off-chain asset. The token page shows information such as price, total supply, holders, transfers and social links. Learn more about this page in our Knowledge Base.