ETH Price: $2,488.43 (+2.99%)
Gas: 6.27 Gwei

Contract

0x69c6C08B91010c88c95775B6FD768E5b04EFc106
 

Overview

ETH Balance

0 ETH

Eth Value

$0.00

Multichain Info

No addresses found
Transaction Hash
Method
Block
From
To
Exit207406192024-09-13 8:51:5923 days ago1726217519IN
0x69c6C08B...b04EFc106
0 ETH0.000256452.46954486
Request Exit204840762024-08-08 13:10:2359 days ago1723122623IN
0x69c6C08B...b04EFc106
0 ETH0.00150838.31581037
Exit204670352024-08-06 4:06:5962 days ago1722917219IN
0x69c6C08B...b04EFc106
0 ETH0.000268432.58488388
Get Rewards204474122024-08-03 10:27:2364 days ago1722680843IN
0x69c6C08B...b04EFc106
0 ETH0.000129151.21289804
Request Exit204256082024-07-31 9:22:1167 days ago1722417731IN
0x69c6C08B...b04EFc106
0 ETH0.001062196.1406448
Get Rewards204255902024-07-31 9:18:2367 days ago1722417503IN
0x69c6C08B...b04EFc106
0 ETH0.000781925.80136595
Exit202174492024-07-02 7:50:4796 days ago1719906647IN
0x69c6C08B...b04EFc106
0 ETH0.000414183.98833628
Exit202169972024-07-02 6:19:2397 days ago1719901163IN
0x69c6C08B...b04EFc106
0 ETH0.000399933.85108901
Request Exit201785882024-06-26 21:37:11102 days ago1719437831IN
0x69c6C08B...b04EFc106
0 ETH0.001220176.14730729
Request Exit201753852024-06-26 10:52:23102 days ago1719399143IN
0x69c6C08B...b04EFc106
0 ETH0.000538463.11292931
Get Rewards201753792024-06-26 10:51:11102 days ago1719399071IN
0x69c6C08B...b04EFc106
0 ETH0.000385173.27298239
Request Exit201046832024-06-16 13:34:11112 days ago1718544851IN
0x69c6C08B...b04EFc106
0 ETH0.001012675.58321611
Get Rewards199418082024-05-24 19:24:47135 days ago1716578687IN
0x69c6C08B...b04EFc106
0 ETH0.001180976.77872409
Get Rewards198308932024-05-09 7:08:23150 days ago1715238503IN
0x69c6C08B...b04EFc106
0 ETH0.000492984.62973116
Join197352232024-04-25 21:59:35164 days ago1714082375IN
0x69c6C08B...b04EFc106
0 ETH0.001411856.43444136
Get Rewards197175832024-04-23 10:45:35166 days ago1713869135IN
0x69c6C08B...b04EFc106
0 ETH0.0014589312.39718803
Get Rewards196685372024-04-16 14:07:47173 days ago1713276467IN
0x69c6C08B...b04EFc106
0 ETH0.0019098716.22898375
Exit196292252024-04-11 1:51:59179 days ago1712800319IN
0x69c6C08B...b04EFc106
0 ETH0.0013196112.70701645
Exit196108992024-04-08 12:18:11181 days ago1712578691IN
0x69c6C08B...b04EFc106
0 ETH0.0021375620.58342045
Request Exit195906632024-04-05 16:15:35184 days ago1712333735IN
0x69c6C08B...b04EFc106
0 ETH0.005101129.48786681
Request Exit195906472024-04-05 16:12:23184 days ago1712333543IN
0x69c6C08B...b04EFc106
0 ETH0.0062098232.58792471
Get Rewards195906462024-04-05 16:12:11184 days ago1712333531IN
0x69c6C08B...b04EFc106
0 ETH0.0041584930.85328801
Get Rewards195536102024-03-31 11:34:11189 days ago1711884851IN
0x69c6C08B...b04EFc106
0 ETH0.0019497716.56805151
Request Exit194797222024-03-21 1:16:59200 days ago1710983819IN
0x69c6C08B...b04EFc106
0 ETH0.0049977628.89048678
Get Rewards194797162024-03-21 1:15:47200 days ago1710983747IN
0x69c6C08B...b04EFc106
0 ETH0.003954333.60135203
View all transactions

Latest 2 internal transactions

Advanced mode:
Parent Transaction Hash Block From To
129490262021-08-02 23:55:281161 days ago1627948528
0x69c6C08B...b04EFc106
 Contract Creation0 ETH
129490262021-08-02 23:55:281161 days ago1627948528
0x69c6C08B...b04EFc106
 Contract Creation0 ETH
Loading...
Loading

Contract Source Code Verified (Exact Match)

Contract Name:
GebLenderFirstResortRewardsVested

Compiler Version
v0.6.7+commit.b8d736ae

Optimization Enabled:
Yes with 200 runs

Other Settings:
default evmVersion, None license

Contract Source Code (Solidity)

/**
 *Submitted for verification at Etherscan.io on 2021-08-03
*/

/// GebLenderFirstResortRewardsVested.sol

// Copyright (C) 2021 Reflexer Labs, INC
//
// This program is free software: you can redistribute it and/or modify
// it under the terms of the GNU Affero General Public License as published by
// the Free Software Foundation, either version 3 of the License, or
// (at your option) any later version.
//
// This program is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
// GNU Affero General Public License for more details.
//
// You should have received a copy of the GNU Affero General Public License
// along with this program.  If not, see <https://www.gnu.org/licenses/>.

pragma solidity 0.6.7;

/**
 * @dev Contract module that helps prevent reentrant calls to a function.
 *
 * Inheriting from `ReentrancyGuard` will make the {nonReentrant} modifier
 * available, which can be applied to functions to make sure there are no nested
 * (reentrant) calls to them.
 *
 * Note that because there is a single `nonReentrant` guard, functions marked as
 * `nonReentrant` may not call one another. This can be worked around by making
 * those functions `private`, and then adding `external` `nonReentrant` entry
 * points to them.
 *
 * TIP: If you would like to learn more about reentrancy and alternative ways
 * to protect against it, check out our blog post
 * https://blog.openzeppelin.com/reentrancy-after-istanbul/[Reentrancy After Istanbul].
 */
abstract contract ReentrancyGuard {
    // Booleans are more expensive than uint256 or any type that takes up a full
    // word because each write operation emits an extra SLOAD to first read the
    // slot's contents, replace the bits taken up by the boolean, and then write
    // back. This is the compiler's defense against contract upgrades and
    // pointer aliasing, and it cannot be disabled.

    // The values being non-zero value makes deployment a bit more expensive,
    // but in exchange the refund on every call to nonReentrant will be lower in
    // amount. Since refunds are capped to a percentage of the total
    // transaction's gas, it is best to keep them low in cases like this one, to
    // increase the likelihood of the full refund coming into effect.
    uint256 private constant _NOT_ENTERED = 1;
    uint256 private constant _ENTERED = 2;

    uint256 private _status;

    constructor () internal {
        _status = _NOT_ENTERED;
    }

    /**
     * @dev Prevents a contract from calling itself, directly or indirectly.
     * Calling a `nonReentrant` function from another `nonReentrant`
     * function is not supported. It is possible to prevent this from happening
     * by making the `nonReentrant` function external, and make it call a
     * `private` function that does the actual work.
     */
    modifier nonReentrant() {
        // On the first call to nonReentrant, _notEntered will be true
        require(_status != _ENTERED, "ReentrancyGuard: reentrant call");

        // Any calls to nonReentrant after this point will fail
        _status = _ENTERED;

        _;

        // By storing the original value once again, a refund is triggered (see
        // https://eips.ethereum.org/EIPS/eip-2200)
        _status = _NOT_ENTERED;
    }
}

abstract contract TokenLike {
    function decimals() virtual public view returns (uint8);
    function totalSupply() virtual public view returns (uint256);
    function balanceOf(address) virtual public view returns (uint256);
    function mint(address, uint) virtual public;
    function burn(address, uint) virtual public;
    function approve(address, uint256) virtual external returns (bool);
    function transfer(address, uint256) virtual external returns (bool);
    function transferFrom(address,address,uint256) virtual external returns (bool);
}
abstract contract AuctionHouseLike {
    function activeStakedTokenAuctions() virtual public view returns (uint256);
    function startAuction(uint256, uint256) virtual external returns (uint256);
}
abstract contract AccountingEngineLike {
    function debtAuctionBidSize() virtual public view returns (uint256);
    function unqueuedUnauctionedDebt() virtual public view returns (uint256);
}
abstract contract SAFEEngineLike {
    function coinBalance(address) virtual public view returns (uint256);
    function debtBalance(address) virtual public view returns (uint256);
}
abstract contract RewardDripperLike {
    function dripReward() virtual external;
    function dripReward(address) virtual external;
    function rewardPerBlock() virtual external view returns (uint256);
    function rewardToken() virtual external view returns (TokenLike);
}
abstract contract StakingRewardsEscrowLike {
    function escrowRewards(address, uint256) virtual external;
}

// Stores tokens, owned by GebLenderFirstResortRewardsVested
contract TokenPool {
    TokenLike public token;
    address   public owner;

    constructor(address token_) public {
        token = TokenLike(token_);
        owner = msg.sender;
    }

    // @notice Transfers tokens from the pool (callable by owner only)
    function transfer(address to, uint256 wad) public {
        require(msg.sender == owner, "unauthorized");
        require(token.transfer(to, wad), "TokenPool/failed-transfer");
    }

    // @notice Returns token balance of the pool
    function balance() public view returns (uint256) {
        return token.balanceOf(address(this));
    }
}

contract GebLenderFirstResortRewardsVested is ReentrancyGuard {
    // --- Auth ---
    mapping (address => uint) public authorizedAccounts;
    /**
     * @notice Add auth to an account
     * @param account Account to add auth to
     */
    function addAuthorization(address account) virtual external isAuthorized {
        authorizedAccounts[account] = 1;
        emit AddAuthorization(account);
    }
    /**
     * @notice Remove auth from an account
     * @param account Account to remove auth from
     */
    function removeAuthorization(address account) virtual external isAuthorized {
        authorizedAccounts[account] = 0;
        emit RemoveAuthorization(account);
    }
    /**
    * @notice Checks whether msg.sender can call an authed function
    **/
    modifier isAuthorized {
        require(authorizedAccounts[msg.sender] == 1, "GebLenderFirstResortRewardsVested/account-not-authorized");
        _;
    }

    // --- Structs ---
    struct ExitRequest {
        // Exit window deadline
        uint256 deadline;
        // Ancestor amount queued for exit
        uint256 lockedAmount;
    }

    // --- Variables ---
    // Flag that allows/blocks joining
    bool      public canJoin;
    // Flag that indicates whether canPrintProtocolTokens can ignore auctioning ancestor tokens
    bool      public bypassAuctions;
    // Whether the contract allows forced exits or not
    bool      public forcedExit;
    // Last block when a reward was pulled
    uint256   public lastRewardBlock;
    // The current delay enforced on an exit
    uint256   public exitDelay;
    // Min maount of ancestor tokens that must remain in the contract and not be auctioned
    uint256   public minStakedTokensToKeep;
    // Max number of auctions that can be active at a time
    uint256   public maxConcurrentAuctions;
    // Amount of ancestor tokens to auction at a time
    uint256   public tokensToAuction;
    // Initial amount of system coins to request in exchange for tokensToAuction
    uint256   public systemCoinsToRequest;
    // Amount of rewards per share accumulated (total, see rewardDebt for more info)
    uint256   public accTokensPerShare;
    // Balance of the rewards token in this contract since last update
    uint256   public rewardsBalance;
    // Staked Supply (== sum of all staked balances)
    uint256   public stakedSupply;
    // Percentage of claimed rewards that will be vested
    uint256   public percentageVested;
    // Whether the escrow is paused or not
    uint256   public escrowPaused;

    // Balances (not affected by slashing)
    mapping(address => uint256)    public descendantBalanceOf;
    // Exit data
    mapping(address => ExitRequest) public exitRequests;
    // The amount of tokens inneligible for claiming rewards (see formula below)
    mapping(address => uint256)    internal rewardDebt;
    // Pending reward = (descendant.balanceOf(user) * accTokensPerShare) - rewardDebt[user]

    // The token being deposited in the pool
    TokenPool                public ancestorPool;
    // The token used to pay rewards
    TokenPool                public rewardPool;
    // Descendant token
    TokenLike                public descendant;
    // Auction house for staked tokens
    AuctionHouseLike         public auctionHouse;
    // Accounting engine contract
    AccountingEngineLike     public accountingEngine;
    // The safe engine contract
    SAFEEngineLike           public safeEngine;
    // Contract that drips rewards
    RewardDripperLike        public rewardDripper;
    // Escrow for rewards
    StakingRewardsEscrowLike public escrow;

    // Max delay that can be enforced for an exit
    uint256 public immutable MAX_DELAY;

    // --- Events ---
    event AddAuthorization(address account);
    event RemoveAuthorization(address account);
    event ModifyParameters(bytes32 indexed parameter, uint256 data);
    event ModifyParameters(bytes32 indexed parameter, address data);
    event ToggleJoin(bool canJoin);
    event ToggleBypassAuctions(bool bypassAuctions);
    event ToggleForcedExit(bool forcedExit);
    event AuctionAncestorTokens(address auctionHouse, uint256 amountAuctioned, uint256 amountRequested);
    event RequestExit(address indexed account, uint256 deadline, uint256 amount);
    event Join(address indexed account, uint256 price, uint256 amount);
    event Exit(address indexed account, uint256 price, uint256 amount);
    event RewardsPaid(address account, uint256 amount);
    event EscrowRewards(address escrow, address who, uint256 amount);
    event PoolUpdated(uint256 accTokensPerShare, uint256 stakedSupply);
    event FailEscrowRewards(bytes revertReason);

    constructor(
      address ancestor_,
      address descendant_,
      address rewardToken_,
      address auctionHouse_,
      address accountingEngine_,
      address safeEngine_,
      address rewardDripper_,
      address escrow_,
      uint256 maxDelay_,
      uint256 exitDelay_,
      uint256 minStakedTokensToKeep_,
      uint256 tokensToAuction_,
      uint256 systemCoinsToRequest_,
      uint256 percentageVested_
    ) public {
        require(maxDelay_ > 0, "GebLenderFirstResortRewardsVested/null-max-delay");
        require(exitDelay_ <= maxDelay_, "GebLenderFirstResortRewardsVested/invalid-exit-delay");
        require(minStakedTokensToKeep_ > 0, "GebLenderFirstResortRewardsVested/null-min-staked-tokens");
        require(tokensToAuction_ > 0, "GebLenderFirstResortRewardsVested/null-tokens-to-auction");
        require(systemCoinsToRequest_ > 0, "GebLenderFirstResortRewardsVested/null-sys-coins-to-request");
        require(auctionHouse_ != address(0), "GebLenderFirstResortRewardsVested/null-auction-house");
        require(accountingEngine_ != address(0), "GebLenderFirstResortRewardsVested/null-accounting-engine");
        require(safeEngine_ != address(0), "GebLenderFirstResortRewardsVested/null-safe-engine");
        require(rewardDripper_ != address(0), "GebLenderFirstResortRewardsVested/null-reward-dripper");
        require(escrow_ != address(0), "GebLenderFirstResortRewardsVested/null-escrow");
        require(percentageVested_ < 100, "GebLenderFirstResortRewardsVested/invalid-percentage-vested");
        require(descendant_ != address(0), "GebLenderFirstResortRewardsVested/null-descendant");

        authorizedAccounts[msg.sender] = 1;
        canJoin                        = true;
        maxConcurrentAuctions          = uint(-1);

        MAX_DELAY                      = maxDelay_;

        exitDelay                      = exitDelay_;

        minStakedTokensToKeep          = minStakedTokensToKeep_;
        tokensToAuction                = tokensToAuction_;
        systemCoinsToRequest           = systemCoinsToRequest_;
        percentageVested               = percentageVested_;

        auctionHouse                   = AuctionHouseLike(auctionHouse_);
        accountingEngine               = AccountingEngineLike(accountingEngine_);
        safeEngine                     = SAFEEngineLike(safeEngine_);
        rewardDripper                  = RewardDripperLike(rewardDripper_);
        escrow                         = StakingRewardsEscrowLike(escrow_);
        descendant                     = TokenLike(descendant_);

        ancestorPool                   = new TokenPool(ancestor_);
        rewardPool                     = new TokenPool(rewardToken_);

        lastRewardBlock                = block.number;

        require(ancestorPool.token().decimals() == 18, "GebLenderFirstResortRewardsVested/ancestor-decimal-mismatch");
        require(descendant.decimals() == 18, "GebLenderFirstResortRewardsVested/descendant-decimal-mismatch");

        emit AddAuthorization(msg.sender);
    }

    // --- Boolean Logic ---
    function both(bool x, bool y) internal pure returns (bool z) {
        assembly{ z := and(x, y)}
    }
    function either(bool x, bool y) internal pure returns (bool z) {
        assembly{ z := or(x, y)}
    }

    // --- Math ---
    uint256 public constant WAD = 10 ** 18;
    uint256 public constant RAY = 10 ** 27;

    function addition(uint256 x, uint256 y) internal pure returns (uint256 z) {
        require((z = x + y) >= x, "GebLenderFirstResortRewardsVested/add-overflow");
    }
    function subtract(uint256 x, uint256 y) internal pure returns (uint256 z) {
        require((z = x - y) <= x, "GebLenderFirstResortRewardsVested/sub-underflow");
    }
    function multiply(uint x, uint y) internal pure returns (uint z) {
        require(y == 0 || (z = x * y) / y == x, "GebLenderFirstResortRewardsVested/mul-overflow");
    }
    function wdivide(uint x, uint y) internal pure returns (uint z) {
        require(y > 0, "GebLenderFirstResortRewardsVested/wdiv-by-zero");
        z = multiply(x, WAD) / y;
    }
    function wmultiply(uint x, uint y) internal pure returns (uint z) {
        z = multiply(x, y) / WAD;
    }

    // --- Administration ---
    /*
    * @notify Switch between allowing and disallowing joins
    */
    function toggleJoin() external isAuthorized {
        canJoin = !canJoin;
        emit ToggleJoin(canJoin);
    }
    /*
    * @notify Switch between ignoring and taking into account auctions in canPrintProtocolTokens
    */
    function toggleBypassAuctions() external isAuthorized {
        bypassAuctions = !bypassAuctions;
        emit ToggleBypassAuctions(bypassAuctions);
    }
    /*
    * @notify Switch between allowing exits when the system is underwater or blocking them
    */
    function toggleForcedExit() external isAuthorized {
        forcedExit = !forcedExit;
        emit ToggleForcedExit(forcedExit);
    }
    /*
    * @notify Modify an uint256 parameter
    * @param parameter The name of the parameter to modify
    * @param data New value for the parameter
    */
    function modifyParameters(bytes32 parameter, uint256 data) external isAuthorized {
        if (parameter == "exitDelay") {
          require(data <= MAX_DELAY, "GebLenderFirstResortRewardsVested/invalid-exit-delay");
          exitDelay = data;
        }
        else if (parameter == "minStakedTokensToKeep") {
          require(data > 0, "GebLenderFirstResortRewardsVested/null-min-staked-tokens");
          minStakedTokensToKeep = data;
        }
        else if (parameter == "tokensToAuction") {
          require(data > 0, "GebLenderFirstResortRewardsVested/invalid-tokens-to-auction");
          tokensToAuction = data;
        }
        else if (parameter == "systemCoinsToRequest") {
          require(data > 0, "GebLenderFirstResortRewardsVested/invalid-sys-coins-to-request");
          systemCoinsToRequest = data;
        }
        else if (parameter == "maxConcurrentAuctions") {
          require(data > 1, "GebLenderFirstResortRewardsVested/invalid-max-concurrent-auctions");
          maxConcurrentAuctions = data;
        }
        else if (parameter == "escrowPaused") {
          require(data <= 1, "GebLenderFirstResortRewardsVested/invalid-escrow-paused");
          escrowPaused = data;
        }
        else if (parameter == "percentageVested") {
          require(data < 100, "GebLenderFirstResortRewardsVested/invalid-percentage-vested");
          percentageVested = data;
        }
        else revert("GebLenderFirstResortRewardsVested/modify-unrecognized-param");
        emit ModifyParameters(parameter, data);
    }
    /*
    * @notify Modify an address parameter
    * @param parameter The name of the parameter to modify
    * @param data New value for the parameter
    */
    function modifyParameters(bytes32 parameter, address data) external isAuthorized {
        require(data != address(0), "GebLenderFirstResortRewardsVested/null-data");

        if (parameter == "auctionHouse") {
          auctionHouse = AuctionHouseLike(data);
        }
        else if (parameter == "accountingEngine") {
          accountingEngine = AccountingEngineLike(data);
        }
        else if (parameter == "rewardDripper") {
          rewardDripper = RewardDripperLike(data);
        }
        else if (parameter == "escrow") {
          escrow = StakingRewardsEscrowLike(data);
        }
        else revert("GebLenderFirstResortRewardsVested/modify-unrecognized-param");
        emit ModifyParameters(parameter, data);
    }

    // --- Getters ---
    /*
    * @notify Return the ancestor token balance for this contract
    */
    function depositedAncestor() public view returns (uint256) {
        return ancestorPool.balance();
    }
    /*
    * @notify Returns how many ancestor tokens are offered for one descendant token
    */
    function ancestorPerDescendant() public view returns (uint256) {
        return stakedSupply == 0 ? WAD : wdivide(depositedAncestor(), stakedSupply);
    }
    /*
    * @notify Returns how many descendant tokens are offered for one ancestor token
    */
    function descendantPerAncestor() public view returns (uint256) {
        return stakedSupply == 0 ? WAD : wdivide(stakedSupply, depositedAncestor());
    }
    /*
    * @notify Given a custom amount of ancestor tokens, it returns the corresponding amount of descendant tokens to mint when someone joins
    * @param wad The amount of ancestor tokens to compute the descendant tokens for
    */
    function joinPrice(uint256 wad) public view returns (uint256) {
        return wmultiply(wad, descendantPerAncestor());
    }
    /*
    * @notify Given a custom amount of descendant tokens, it returns the corresponding amount of ancestor tokens to send when someone exits
    * @param wad The amount of descendant tokens to compute the ancestor tokens for
    */
    function exitPrice(uint256 wad) public view returns (uint256) {
        return wmultiply(wad, ancestorPerDescendant());
    }

    /*
    * @notice Returns whether the protocol is underwater or not
    */
    function protocolUnderwater() public view returns (bool) {
        uint256 unqueuedUnauctionedDebt = accountingEngine.unqueuedUnauctionedDebt();

        return both(
          accountingEngine.debtAuctionBidSize() <= unqueuedUnauctionedDebt,
          safeEngine.coinBalance(address(accountingEngine)) < unqueuedUnauctionedDebt
        );
    }

    /*
    * @notice Burn descendant tokens in exchange for getting ancestor tokens from this contract
    * @return Whether the pool can auction ancestor tokens
    */
    function canAuctionTokens() public view returns (bool) {
        return both(
          both(protocolUnderwater(), addition(minStakedTokensToKeep, tokensToAuction) <= depositedAncestor()),
          auctionHouse.activeStakedTokenAuctions() < maxConcurrentAuctions
        );
    }

    /*
    * @notice Returns whether the system can mint new ancestor tokens
    */
    function canPrintProtocolTokens() public view returns (bool) {
        return both(
          !canAuctionTokens(),
          either(auctionHouse.activeStakedTokenAuctions() == 0, bypassAuctions)
        );
    }

    /*
    * @notice Returns unclaimed rewards for a given user
    */
    function pendingRewards(address user) public view returns (uint256) {
        uint accTokensPerShare_ = accTokensPerShare;
        if (block.number > lastRewardBlock && stakedSupply != 0) {
            uint increaseInBalance = (block.number - lastRewardBlock) * rewardDripper.rewardPerBlock();
            accTokensPerShare_ = addition(accTokensPerShare_, multiply(increaseInBalance, RAY) / stakedSupply);
        }
        return subtract(multiply(descendantBalanceOf[user], accTokensPerShare_) / RAY, rewardDebt[user]);
    }

    /*
    * @notice Returns rewards earned per block for each token deposited (WAD)
    */
    function rewardRate() public view returns (uint256) {
        if (stakedSupply == 0) return 0;
        return (rewardDripper.rewardPerBlock() * WAD) / stakedSupply;
    }

    // --- Core Logic ---
    /*
    * @notify Updates the pool and pays rewards (if any)
    * @dev Must be included in deposits and withdrawals
    */
    modifier payRewards() {
        updatePool();

        if (descendantBalanceOf[msg.sender] > 0 && rewardPool.balance() > 0) {
            // Pays the reward
            uint256 pending = subtract(multiply(descendantBalanceOf[msg.sender], accTokensPerShare) / RAY, rewardDebt[msg.sender]);

            uint256 vested;
            if (both(address(escrow) != address(0), escrowPaused == 0)) {
              vested = multiply(pending, percentageVested) / 100;

              try escrow.escrowRewards(msg.sender, vested) {
                rewardPool.transfer(address(escrow), vested);
                emit EscrowRewards(address(escrow), msg.sender, vested);
              } catch(bytes memory revertReason) {
                emit FailEscrowRewards(revertReason);
              }
            }

            rewardPool.transfer(msg.sender, subtract(pending, vested));
            rewardsBalance = rewardPool.balance();

            emit RewardsPaid(msg.sender, pending);
        }
        _;

        rewardDebt[msg.sender] = multiply(descendantBalanceOf[msg.sender], accTokensPerShare) / RAY;
    }

    /*
    * @notify Pays outstanding rewards to msg.sender
    */
    function getRewards() external nonReentrant payRewards {}

    /*
    * @notify Pull funds from the dripper
    */
    function pullFunds() public {
        rewardDripper.dripReward(address(rewardPool));
    }

    /*
    * @notify Updates pool data
    */
    function updatePool() public {
        if (block.number <= lastRewardBlock) return;
        lastRewardBlock = block.number;
        if (stakedSupply == 0) return;

        pullFunds();
        uint256 increaseInBalance = subtract(rewardPool.balance(), rewardsBalance);
        rewardsBalance = addition(rewardsBalance, increaseInBalance);

        // Updates distribution info
        accTokensPerShare = addition(accTokensPerShare, multiply(increaseInBalance, RAY) / stakedSupply);
        emit PoolUpdated(accTokensPerShare, stakedSupply);
    }

    /*
    * @notify Create a new auction that sells ancestor tokens in exchange for system coins
    */
    function auctionAncestorTokens() external nonReentrant {
        require(canAuctionTokens(), "GebLenderFirstResortRewardsVested/cannot-auction-tokens");

        ancestorPool.transfer(address(this), tokensToAuction);
        ancestorPool.token().approve(address(auctionHouse), tokensToAuction);
        auctionHouse.startAuction(tokensToAuction, systemCoinsToRequest);
        updatePool();

        emit AuctionAncestorTokens(address(auctionHouse), tokensToAuction, systemCoinsToRequest);
    }

    /*
    * @notify Join ancestor tokens
    * @param wad The amount of ancestor tokens to join
    */
    function join(uint256 wad) external nonReentrant payRewards {
        require(both(canJoin, !protocolUnderwater()), "GebLenderFirstResortRewardsVested/join-not-allowed");
        require(wad > 0, "GebLenderFirstResortRewardsVested/null-ancestor-to-join");
        uint256 price = joinPrice(wad);
        require(price > 0, "GebLenderFirstResortRewardsVested/null-join-price");

        require(ancestorPool.token().transferFrom(msg.sender, address(ancestorPool), wad), "GebLenderFirstResortRewardsVested/could-not-transfer-ancestor");
        descendant.mint(msg.sender, price);

        descendantBalanceOf[msg.sender] = addition(descendantBalanceOf[msg.sender], price);
        stakedSupply = addition(stakedSupply, price);

        emit Join(msg.sender, price, wad);
    }
    /*
    * @notice Request an exit for a specific amount of ancestor tokens
    * @param wad The amount of tokens to exit
    */
    function requestExit(uint wad) external nonReentrant payRewards {
        require(wad > 0, "GebLenderFirstResortRewardsVested/null-amount-to-exit");

        exitRequests[msg.sender].deadline      = addition(now, exitDelay);
        exitRequests[msg.sender].lockedAmount  = addition(exitRequests[msg.sender].lockedAmount, wad);

        descendantBalanceOf[msg.sender] = subtract(descendantBalanceOf[msg.sender], wad);
        descendant.burn(msg.sender, wad);

        emit RequestExit(msg.sender, exitRequests[msg.sender].deadline, wad);
    }
    /*
    * @notify Exit ancestor tokens
    */
    function exit() external nonReentrant {
        require(both(now >= exitRequests[msg.sender].deadline, exitRequests[msg.sender].lockedAmount > 0), "GebLenderFirstResortRewardsVested/wait-more");
        require(either(!protocolUnderwater(), forcedExit), "GebLenderFirstResortRewardsVested/exit-not-allowed");

        uint256 price = exitPrice(exitRequests[msg.sender].lockedAmount);
        stakedSupply  = subtract(stakedSupply, exitRequests[msg.sender].lockedAmount);
        ancestorPool.transfer(msg.sender, price);
        emit Exit(msg.sender, price, exitRequests[msg.sender].lockedAmount);
        delete exitRequests[msg.sender];
    }
}

Contract Security Audit

Contract ABI

[{"inputs":[{"internalType":"address","name":"ancestor_","type":"address"},{"internalType":"address","name":"descendant_","type":"address"},{"internalType":"address","name":"rewardToken_","type":"address"},{"internalType":"address","name":"auctionHouse_","type":"address"},{"internalType":"address","name":"accountingEngine_","type":"address"},{"internalType":"address","name":"safeEngine_","type":"address"},{"internalType":"address","name":"rewardDripper_","type":"address"},{"internalType":"address","name":"escrow_","type":"address"},{"internalType":"uint256","name":"maxDelay_","type":"uint256"},{"internalType":"uint256","name":"exitDelay_","type":"uint256"},{"internalType":"uint256","name":"minStakedTokensToKeep_","type":"uint256"},{"internalType":"uint256","name":"tokensToAuction_","type":"uint256"},{"internalType":"uint256","name":"systemCoinsToRequest_","type":"uint256"},{"internalType":"uint256","name":"percentageVested_","type":"uint256"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"account","type":"address"}],"name":"AddAuthorization","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"auctionHouse","type":"address"},{"indexed":false,"internalType":"uint256","name":"amountAuctioned","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"amountRequested","type":"uint256"}],"name":"AuctionAncestorTokens","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"escrow","type":"address"},{"indexed":false,"internalType":"address","name":"who","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"EscrowRewards","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"account","type":"address"},{"indexed":false,"internalType":"uint256","name":"price","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"Exit","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"bytes","name":"revertReason","type":"bytes"}],"name":"FailEscrowRewards","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"account","type":"address"},{"indexed":false,"internalType":"uint256","name":"price","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"Join","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"parameter","type":"bytes32"},{"indexed":false,"internalType":"uint256","name":"data","type":"uint256"}],"name":"ModifyParameters","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"parameter","type":"bytes32"},{"indexed":false,"internalType":"address","name":"data","type":"address"}],"name":"ModifyParameters","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"accTokensPerShare","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"stakedSupply","type":"uint256"}],"name":"PoolUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"account","type":"address"}],"name":"RemoveAuthorization","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"account","type":"address"},{"indexed":false,"internalType":"uint256","name":"deadline","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"RequestExit","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"account","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"RewardsPaid","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"bool","name":"bypassAuctions","type":"bool"}],"name":"ToggleBypassAuctions","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"bool","name":"forcedExit","type":"bool"}],"name":"ToggleForcedExit","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"bool","name":"canJoin","type":"bool"}],"name":"ToggleJoin","type":"event"},{"inputs":[],"name":"MAX_DELAY","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"RAY","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"WAD","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"accTokensPerShare","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"accountingEngine","outputs":[{"internalType":"contract AccountingEngineLike","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"addAuthorization","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"ancestorPerDescendant","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"ancestorPool","outputs":[{"internalType":"contract TokenPool","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"auctionAncestorTokens","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"auctionHouse","outputs":[{"internalType":"contract AuctionHouseLike","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"authorizedAccounts","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"bypassAuctions","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"canAuctionTokens","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"canJoin","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"canPrintProtocolTokens","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"depositedAncestor","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"descendant","outputs":[{"internalType":"contract TokenLike","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"descendantBalanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"descendantPerAncestor","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"escrow","outputs":[{"internalType":"contract StakingRewardsEscrowLike","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"escrowPaused","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"exit","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"exitDelay","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"wad","type":"uint256"}],"name":"exitPrice","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"exitRequests","outputs":[{"internalType":"uint256","name":"deadline","type":"uint256"},{"internalType":"uint256","name":"lockedAmount","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"forcedExit","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getRewards","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"wad","type":"uint256"}],"name":"join","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"wad","type":"uint256"}],"name":"joinPrice","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"lastRewardBlock","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxConcurrentAuctions","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"minStakedTokensToKeep","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"parameter","type":"bytes32"},{"internalType":"address","name":"data","type":"address"}],"name":"modifyParameters","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"parameter","type":"bytes32"},{"internalType":"uint256","name":"data","type":"uint256"}],"name":"modifyParameters","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"user","type":"address"}],"name":"pendingRewards","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"percentageVested","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"protocolUnderwater","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"pullFunds","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"removeAuthorization","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"wad","type":"uint256"}],"name":"requestExit","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"rewardDripper","outputs":[{"internalType":"contract RewardDripperLike","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"rewardPool","outputs":[{"internalType":"contract TokenPool","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"rewardRate","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"rewardsBalance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"safeEngine","outputs":[{"internalType":"contract SAFEEngineLike","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"stakedSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"systemCoinsToRequest","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"toggleBypassAuctions","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"toggleForcedExit","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"toggleJoin","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"tokensToAuction","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"updatePool","outputs":[],"stateMutability":"nonpayable","type":"function"}]

60a06040523480156200001157600080fd5b506040516200438a3803806200438a83398181016040526101c08110156200003857600080fd5b508051602082015160408301516060840151608085015160a086015160c087015160e08801516101008901516101208a01516101408b01516101608c01516101808d01516101a0909d015160016000559b9c9a9b999a98999798969795969495939492939192909185620000de5760405162461bcd60e51b81526004018080602001828103825260308152602001806200414a6030913960400191505060405180910390fd5b858511156200011f5760405162461bcd60e51b8152600401808060200182810382526034815260200180620042e96034913960400191505060405180910390fd5b60008411620001605760405162461bcd60e51b8152600401808060200182810382526038815260200180620042b16038913960400191505060405180910390fd5b60008311620001a15760405162461bcd60e51b81526004018080602001828103825260388152602001806200431d6038913960400191505060405180910390fd5b60008211620001e25760405162461bcd60e51b815260040180806020018281038252603b815260200180620040d2603b913960400191505060405180910390fd5b6001600160a01b038b16620002295760405162461bcd60e51b8152600401808060200182810382526034815260200180620041e26034913960400191505060405180910390fd5b6001600160a01b038a16620002705760405162461bcd60e51b8152600401808060200182810382526038815260200180620042486038913960400191505060405180910390fd5b6001600160a01b038916620002b75760405162461bcd60e51b8152600401808060200182810382526032815260200180620042166032913960400191505060405180910390fd5b6001600160a01b038816620002fe5760405162461bcd60e51b8152600401808060200182810382526035815260200180620043556035913960400191505060405180910390fd5b6001600160a01b038716620003455760405162461bcd60e51b815260040180806020018281038252602d815260200180620041b5602d913960400191505060405180910390fd5b60648110620003865760405162461bcd60e51b815260040180806020018281038252603b8152602001806200417a603b913960400191505060405180910390fd5b6001600160a01b038d16620003cd5760405162461bcd60e51b8152600401808060200182810382526031815260200180620042806031913960400191505060405180910390fd5b6001806000336001600160a01b03166001600160a01b03168152602001908152602001600020819055506001600260006101000a81548160ff02191690831515021790555060001960068190555085608081815250508460048190555083600581905550826007819055508160088190555080600c819055508a601460006101000a8154816001600160a01b0302191690836001600160a01b0316021790555089601560006101000a8154816001600160a01b0302191690836001600160a01b0316021790555088601660006101000a8154816001600160a01b0302191690836001600160a01b0316021790555087601760006101000a8154816001600160a01b0302191690836001600160a01b0316021790555086601860006101000a8154816001600160a01b0302191690836001600160a01b031602179055508c601360006101000a8154816001600160a01b0302191690836001600160a01b031602179055508d6040516200053f9062000814565b6001600160a01b03909116815260405190819003602001906000f0801580156200056d573d6000803e3d6000fd5b50601180546001600160a01b0319166001600160a01b03929092169190911790556040518c906200059e9062000814565b6001600160a01b03909116815260405190819003602001906000f080158015620005cc573d6000803e3d6000fd5b50601280546001600160a01b0319166001600160a01b039283161790554360035560115460408051637e062a3560e11b81529051919092169163fc0c546a916004808301926020929190829003018186803b1580156200062b57600080fd5b505afa15801562000640573d6000803e3d6000fd5b505050506040513d60208110156200065757600080fd5b50516040805163313ce56760e01b815290516001600160a01b039092169163313ce56791600480820192602092909190829003018186803b1580156200069c57600080fd5b505afa158015620006b1573d6000803e3d6000fd5b505050506040513d6020811015620006c857600080fd5b505160ff166012146200070d5760405162461bcd60e51b815260040180806020018281038252603b81526020018062004097603b913960400191505060405180910390fd5b601360009054906101000a90046001600160a01b03166001600160a01b031663313ce5676040518163ffffffff1660e01b815260040160206040518083038186803b1580156200075c57600080fd5b505afa15801562000771573d6000803e3d6000fd5b505050506040513d60208110156200078857600080fd5b505160ff16601214620007cd5760405162461bcd60e51b815260040180806020018281038252603d8152602001806200410d603d913960400191505060405180910390fd5b6040805133815290517f599a298163e1678bb1c676052a8930bf0b8a1261ed6e01b8a2391e55f70001029181900360200190a1505050505050505050505050505062000822565b61032b8062003d6c83390190565b60805161352a62000842600039806116ab5280612bed525061352a6000f3fe608060405234801561001057600080fd5b506004361061030c5760003560e01c80636a1460241161019d578063aa88e788116100e9578063e2fdcc17116100a2578063e9fad8ee1161007c578063e9fad8ee14610605578063ec2c20d71461060d578063ed9152c81461062a578063fe4f5890146106325761030c565b8063e2fdcc17146105ed578063e3161ddd146105f5578063e43a0bb2146105fd5761030c565b8063aa88e788146105bd578063ba1da585146105c5578063c734b40e146105cd578063d4056655146105d5578063d41ce4b1146105dd578063da56eedb146105e55761030c565b80637e90cbe111610156578063961d45c411610130578063961d45c41461059d578063a19fe9e3146105a5578063a86eaca4146105ad578063a9f8d181146105b55761030c565b80637e90cbe11461056757806394bebfbb1461056f57806394f3f81d146105775761030c565b80636a1460241461050d5780636ff3ae6414610515578063721c65131461053257806373f5acef1461054f57806379d07015146105575780637b0a47ee1461055f5761030c565b806331d7a2621161025c57806359546fc411610215578063628c50a5116101ef578063628c50a5146104ab5780636614f010146104d157806366666aa9146104fd57806367aea313146105055761030c565b806359546fc4146104775780635c4036191461049b5780635e9153e6146104a35761030c565b806331d7a262146103d457806335b28153146103fa5780633b987bfc146104205780634125ff901461042857806351da8acf14610430578063552033c41461046f5761030c565b80631976eb8e116102c957806324ba5884116102a357806324ba58841461039657806328388630146103bc57806328e97ce6146103c45780632f3c9a4f146103cc5761030c565b80631976eb8e1461036a5780631a47d8561461037257806324463f1b1461037a5761030c565b8063049878f3146103115780630572b0cc146103305780630d86009c146103385780630e0c76de146103525780631162e6a41461035a578063131f2e5314610362575b600080fd5b61032e6004803603602081101561032757600080fd5b5035610655565b005b61032e610e42565b610340611312565b60408051918252519081900360200190f35b61032e611318565b6103406113c2565b6103406113f6565b6103406113fc565b610340611402565b610382611408565b604080519115158252519081900360200190f35b610340600480360360208110156103ac57600080fd5b50356001600160a01b0316611417565b610340611429565b61032e61142f565b6103406114cb565b610340600480360360208110156103ea57600080fd5b50356001600160a01b03166114d1565b61032e6004803603602081101561041057600080fd5b50356001600160a01b0316611600565b6103406116a3565b6103406116a9565b6104566004803603602081101561044657600080fd5b50356001600160a01b03166116cd565b6040805192835260208301919091528051918290030190f35b6103406116e6565b61047f6116f5565b604080516001600160a01b039092168252519081900360200190f35b61032e611704565b6103826117b0565b610340600480360360208110156104c157600080fd5b50356001600160a01b0316611860565b61032e600480360360408110156104e757600080fd5b50803590602001356001600160a01b0316611872565b61047f611a5b565b61047f611a6a565b610340611a79565b6103406004803603602081101561052b57600080fd5b5035611a85565b61032e6004803603602081101561054857600080fd5b5035611a9e565b6103406120a5565b6103826120ab565b6103406121fe565b61034061229c565b6103406122bb565b61032e6004803603602081101561058d57600080fd5b50356001600160a01b03166122c1565b61047f612363565b61032e612372565b610382612656565b61034061265f565b61047f612665565b610340612674565b6103826126ea565b6103826126f8565b61034061279b565b61047f6127a1565b61047f6127b0565b61032e6127bf565b61032e6128e4565b61032e61294f565b6103406004803603602081101561062357600080fd5b5035612b6b565b61047f612b79565b61032e6004803603604081101561064857600080fd5b5080359060200135612b88565b6002600054141561069b576040805162461bcd60e51b815260206004820152601f602482015260008051602061307b833981519152604482015290519081900360640190fd5b60026000556106a86127bf565b336000908152600e6020526040902054158015906107345750601254604080516316d3df1560e31b815290516000926001600160a01b03169163b69ef8a8916004808301926020929190829003018186803b15801561070657600080fd5b505afa15801561071a573d6000803e3d6000fd5b505050506040513d602081101561073057600080fd5b5051115b15610af957336000908152600e602052604081205460095461078791676765c793fa10079d601b1b916107679190612eec565b8161076e57fe5b3360009081526010602052604090205491900490612f42565b601854600d549192506000916107a9916001600160a01b031615159015612f84565b156109bb5760646107bc83600c54612eec565b816107c357fe5b60185460408051630a1dfc1360e21b8152336004820152939092046024840181905291519193506001600160a01b031691632877f04c91604480830192600092919082900301818387803b15801561081a57600080fd5b505af192505050801561082b575060015b6108fe573d808015610859576040519150601f19603f3d011682016040523d82523d6000602084013e61085e565b606091505b507f4db2e449a7b24364136173e75f7161233ace27438153323e778c5edbf237e680816040518080602001828103825283818151815260200191508051906020019080838360005b838110156108be5781810151838201526020016108a6565b50505050905090810190601f1680156108eb5780820380516001836020036101000a031916815260200191505b509250505060405180910390a1506109bb565b6012546018546040805163a9059cbb60e01b81526001600160a01b039283166004820152602481018590529051919092169163a9059cbb91604480830192600092919082900301818387803b15801561095657600080fd5b505af115801561096a573d6000803e3d6000fd5b5050601854604080516001600160a01b039092168252336020830152818101859052517f67672cc85e5f7be7dfc7a6f1bdb381e9b9809f4d251edc3e7bc49aef52b5a4919350908190036060019150a15b6012546001600160a01b031663a9059cbb336109d78585612f42565b6040518363ffffffff1660e01b815260040180836001600160a01b03166001600160a01b0316815260200182815260200192505050600060405180830381600087803b158015610a2657600080fd5b505af1158015610a3a573d6000803e3d6000fd5b50505050601260009054906101000a90046001600160a01b03166001600160a01b031663b69ef8a86040518163ffffffff1660e01b815260040160206040518083038186803b158015610a8c57600080fd5b505afa158015610aa0573d6000803e3d6000fd5b505050506040513d6020811015610ab657600080fd5b5051600a55604080513381526020810184905281517fd5ec1b97fc4d048ade361b013c285a0a5c1c40ae32579013ad3798ee657d9de7929181900390910190a150505b600254610b119060ff16610b0b6120ab565b15612f84565b610b4c5760405162461bcd60e51b81526004018080602001828103825260328152602001806133616032913960400191505060405180910390fd5b60008111610b8b5760405162461bcd60e51b81526004018080602001828103825260378152602001806131336037913960400191505060405180910390fd5b6000610b9682612b6b565b905060008111610bd75760405162461bcd60e51b81526004018080602001828103825260318152602001806134206031913960400191505060405180910390fd5b601160009054906101000a90046001600160a01b03166001600160a01b031663fc0c546a6040518163ffffffff1660e01b815260040160206040518083038186803b158015610c2557600080fd5b505afa158015610c39573d6000803e3d6000fd5b505050506040513d6020811015610c4f57600080fd5b5051601154604080516323b872dd60e01b81523360048201526001600160a01b03928316602482015260448101869052905191909216916323b872dd9160648083019260209291908290030181600087803b158015610cad57600080fd5b505af1158015610cc1573d6000803e3d6000fd5b505050506040513d6020811015610cd757600080fd5b5051610d145760405162461bcd60e51b815260040180806020018281038252603d81526020018061316a603d913960400191505060405180910390fd5b601354604080516340c10f1960e01b81523360048201526024810184905290516001600160a01b03909216916340c10f199160448082019260009290919082900301818387803b158015610d6757600080fd5b505af1158015610d7b573d6000803e3d6000fd5b5050336000908152600e6020526040902054610d9a9250905082612f88565b336000908152600e6020526040902055600b54610db79082612f88565b600b556040805182815260208101849052815133927fbca387acb0ba7d06e329c4372885bb664f19a98153ccf3e74e56c136bf0e88c4928290030190a250336000908152600e6020526040902054600954676765c793fa10079d601b1b91610e1e91612eec565b81610e2557fe5b336000908152601060205260408120929091049091556001905550565b60026000541415610e88576040805162461bcd60e51b815260206004820152601f602482015260008051602061307b833981519152604482015290519081900360640190fd5b6002600055610e956127bf565b336000908152600e602052604090205415801590610f215750601254604080516316d3df1560e31b815290516000926001600160a01b03169163b69ef8a8916004808301926020929190829003018186803b158015610ef357600080fd5b505afa158015610f07573d6000803e3d6000fd5b505050506040513d6020811015610f1d57600080fd5b5051115b156112c657336000908152600e6020526040812054600954610f5491676765c793fa10079d601b1b916107679190612eec565b601854600d54919250600091610f76916001600160a01b031615159015612f84565b15611188576064610f8983600c54612eec565b81610f9057fe5b60185460408051630a1dfc1360e21b8152336004820152939092046024840181905291519193506001600160a01b031691632877f04c91604480830192600092919082900301818387803b158015610fe757600080fd5b505af1925050508015610ff8575060015b6110cb573d808015611026576040519150601f19603f3d011682016040523d82523d6000602084013e61102b565b606091505b507f4db2e449a7b24364136173e75f7161233ace27438153323e778c5edbf237e680816040518080602001828103825283818151815260200191508051906020019080838360005b8381101561108b578181015183820152602001611073565b50505050905090810190601f1680156110b85780820380516001836020036101000a031916815260200191505b509250505060405180910390a150611188565b6012546018546040805163a9059cbb60e01b81526001600160a01b039283166004820152602481018590529051919092169163a9059cbb91604480830192600092919082900301818387803b15801561112357600080fd5b505af1158015611137573d6000803e3d6000fd5b5050601854604080516001600160a01b039092168252336020830152818101859052517f67672cc85e5f7be7dfc7a6f1bdb381e9b9809f4d251edc3e7bc49aef52b5a4919350908190036060019150a15b6012546001600160a01b031663a9059cbb336111a48585612f42565b6040518363ffffffff1660e01b815260040180836001600160a01b03166001600160a01b0316815260200182815260200192505050600060405180830381600087803b1580156111f357600080fd5b505af1158015611207573d6000803e3d6000fd5b50505050601260009054906101000a90046001600160a01b03166001600160a01b031663b69ef8a86040518163ffffffff1660e01b815260040160206040518083038186803b15801561125957600080fd5b505afa15801561126d573d6000803e3d6000fd5b505050506040513d602081101561128357600080fd5b5051600a55604080513381526020810184905281517fd5ec1b97fc4d048ade361b013c285a0a5c1c40ae32579013ad3798ee657d9de7929181900390910190a150505b336000908152600e6020526040902054600954676765c793fa10079d601b1b916112ef91612eec565b816112f657fe5b3360009081526010602052604081209290910490915560019055565b600d5481565b33600090815260016020819052604090912054146113675760405162461bcd60e51b81526004018080602001828103825260388152602001806134516038913960400191505060405180910390fd5b6002805460ff610100808304821615810261ff001990931692909217928390556040805192909304161515815290517f9fdd4155cb7fc6f6912385f4f0c9bc86bb1282c9dd3d6d86b618a2291f6fc7719181900360200190a1565b6000600b546000146113e6576113e1600b546113dc612674565b612fca565b6113f0565b670de0b6b3a76400005b90505b90565b600a5481565b60065481565b60075481565b60025462010000900460ff1681565b60016020526000908152604090205481565b60045481565b336000908152600160208190526040909120541461147e5760405162461bcd60e51b81526004018080602001828103825260388152602001806134516038913960400191505060405180910390fd5b6002805460ff19811660ff918216151791829055604080519290911615158252517f7dc6d5f7de2146a02aa91321e6f05614c85f0316cb5c0a12e0897f2fd30666829181900360200190a1565b60095481565b60095460035460009190431180156114ea5750600b5415155b1561159c57601754604080516322b8e72b60e21b815290516000926001600160a01b031691638ae39cac916004808301926020929190829003018186803b15801561153457600080fd5b505afa158015611548573d6000803e3d6000fd5b505050506040513d602081101561155e57600080fd5b5051600354600b544391909103909102915061159890839061158b84676765c793fa10079d601b1b612eec565b8161159257fe5b04612f88565b9150505b6001600160a01b0383166000908152600e60205260409020546115f990676765c793fa10079d601b1b906115d09084612eec565b816115d757fe5b6001600160a01b03861660009081526010602052604090205491900490612f42565b9392505050565b336000908152600160208190526040909120541461164f5760405162461bcd60e51b81526004018080602001828103825260388152602001806134516038913960400191505060405180910390fd5b6001600160a01b03811660008181526001602081815260409283902091909155815192835290517f599a298163e1678bb1c676052a8930bf0b8a1261ed6e01b8a2391e55f70001029281900390910190a150565b60085481565b7f000000000000000000000000000000000000000000000000000000000000000081565b600f602052600090815260409020805460019091015482565b676765c793fa10079d601b1b81565b6017546001600160a01b031681565b33600090815260016020819052604090912054146117535760405162461bcd60e51b81526004018080602001828103825260388152602001806134516038913960400191505060405180910390fd5b6002805460ff62010000808304821615810262ff00001990931692909217928390556040805192909304161515815290517f2556a991abd9f74d727d88623dc8f637c4d913be5c71c19c4bb1c09f68a4fdc09181900360200190a1565b60006113f06117dd6117c06120ab565b6117c8612674565b6117d6600554600754612f88565b1115612f84565b600654601460009054906101000a90046001600160a01b03166001600160a01b031663f5897a526040518163ffffffff1660e01b815260040160206040518083038186803b15801561182e57600080fd5b505afa158015611842573d6000803e3d6000fd5b505050506040513d602081101561185857600080fd5b505110612f84565b600e6020526000908152604090205481565b33600090815260016020819052604090912054146118c15760405162461bcd60e51b81526004018080602001828103825260388152602001806134516038913960400191505060405180910390fd5b6001600160a01b0381166119065760405162461bcd60e51b815260040180806020018281038252602b8152602001806133c1602b913960400191505060405180910390fd5b816b61756374696f6e486f75736560a01b141561193d57601480546001600160a01b0319166001600160a01b038316179055611a18565b816f6163636f756e74696e67456e67696e6560801b141561197857601580546001600160a01b0319166001600160a01b038316179055611a18565b816c3932bbb0b932223934b83832b960991b14156119b057601780546001600160a01b0319166001600160a01b038316179055611a18565b8165657363726f7760d01b14156119e157601880546001600160a01b0319166001600160a01b038316179055611a18565b60405162461bcd60e51b815260040180806020018281038252603b815260200180613210603b913960400191505060405180910390fd5b604080516001600160a01b0383168152905183917fd91f38cf03346b5dc15fb60f9076f866295231ad3c3841a1051f8443f25170d1919081900360200190a25050565b6012546001600160a01b031681565b6016546001600160a01b031681565b670de0b6b3a764000081565b6000611a9882611a9361229c565b61302c565b92915050565b60026000541415611ae4576040805162461bcd60e51b815260206004820152601f602482015260008051602061307b833981519152604482015290519081900360640190fd5b6002600055611af16127bf565b336000908152600e602052604090205415801590611b7d5750601254604080516316d3df1560e31b815290516000926001600160a01b03169163b69ef8a8916004808301926020929190829003018186803b158015611b4f57600080fd5b505afa158015611b63573d6000803e3d6000fd5b505050506040513d6020811015611b7957600080fd5b5051115b15611f2257336000908152600e6020526040812054600954611bb091676765c793fa10079d601b1b916107679190612eec565b601854600d54919250600091611bd2916001600160a01b031615159015612f84565b15611de4576064611be583600c54612eec565b81611bec57fe5b60185460408051630a1dfc1360e21b8152336004820152939092046024840181905291519193506001600160a01b031691632877f04c91604480830192600092919082900301818387803b158015611c4357600080fd5b505af1925050508015611c54575060015b611d27573d808015611c82576040519150601f19603f3d011682016040523d82523d6000602084013e611c87565b606091505b507f4db2e449a7b24364136173e75f7161233ace27438153323e778c5edbf237e680816040518080602001828103825283818151815260200191508051906020019080838360005b83811015611ce7578181015183820152602001611ccf565b50505050905090810190601f168015611d145780820380516001836020036101000a031916815260200191505b509250505060405180910390a150611de4565b6012546018546040805163a9059cbb60e01b81526001600160a01b039283166004820152602481018590529051919092169163a9059cbb91604480830192600092919082900301818387803b158015611d7f57600080fd5b505af1158015611d93573d6000803e3d6000fd5b5050601854604080516001600160a01b039092168252336020830152818101859052517f67672cc85e5f7be7dfc7a6f1bdb381e9b9809f4d251edc3e7bc49aef52b5a4919350908190036060019150a15b6012546001600160a01b031663a9059cbb33611e008585612f42565b6040518363ffffffff1660e01b815260040180836001600160a01b03166001600160a01b0316815260200182815260200192505050600060405180830381600087803b158015611e4f57600080fd5b505af1158015611e63573d6000803e3d6000fd5b50505050601260009054906101000a90046001600160a01b03166001600160a01b031663b69ef8a86040518163ffffffff1660e01b815260040160206040518083038186803b158015611eb557600080fd5b505afa158015611ec9573d6000803e3d6000fd5b505050506040513d6020811015611edf57600080fd5b5051600a55604080513381526020810184905281517fd5ec1b97fc4d048ade361b013c285a0a5c1c40ae32579013ad3798ee657d9de7929181900390910190a150505b60008111611f615760405162461bcd60e51b81526004018080602001828103825260358152602001806130466035913960400191505060405180910390fd5b611f6d42600454612f88565b336000908152600f6020526040902090815560010154611f8d9082612f88565b336000908152600f6020908152604080832060010193909355600e90522054611fb69082612f42565b336000818152600e6020526040808220939093556013548351632770a7eb60e21b815260048101939093526024830185905292516001600160a01b0390931692639dc29fac92604480820193929182900301818387803b15801561201957600080fd5b505af115801561202d573d6000803e3d6000fd5b5050336000818152600f602090815260409182902054825190815290810186905281519294507f1a05ab0ac5685d1105d3b900f1db7c3c17a560a68f6f9e5c7f2a20b0bcac1f1593508290030190a2336000908152600e6020526040902054600954676765c793fa10079d601b1b91610e1e91612eec565b60055481565b600080601560009054906101000a90046001600160a01b03166001600160a01b031663d8872aeb6040518163ffffffff1660e01b815260040160206040518083038186803b1580156120fc57600080fd5b505afa158015612110573d6000803e3d6000fd5b505050506040513d602081101561212657600080fd5b505160155460408051630140b37760e21b815290519293506121f89284926001600160a01b031691630502cddc916004808301926020929190829003018186803b15801561217357600080fd5b505afa158015612187573d6000803e3d6000fd5b505050506040513d602081101561219d57600080fd5b505160165460155460408051633eaf7a0360e21b81526001600160a01b03928316600482015290519490931115938693919092169163fabde80c91602480820192602092909190829003018186803b15801561182e57600080fd5b91505090565b6000600b5460001415612213575060006113f3565b600b54601754604080516322b8e72b60e21b81529051670de0b6b3a7640000926001600160a01b031691638ae39cac916004808301926020929190829003018186803b15801561226257600080fd5b505afa158015612276573d6000803e3d6000fd5b505050506040513d602081101561228c57600080fd5b5051028161229657fe5b04905090565b6000600b546000146113e6576113e16122b3612674565b600b54612fca565b600c5481565b33600090815260016020819052604090912054146123105760405162461bcd60e51b81526004018080602001828103825260388152602001806134516038913960400191505060405180910390fd5b6001600160a01b038116600081815260016020908152604080832092909255815192835290517f8834a87e641e9716be4f34527af5d23e11624f1ddeefede6ad75a9acfc31b9039281900390910190a150565b6015546001600160a01b031681565b600260005414156123b8576040805162461bcd60e51b815260206004820152601f602482015260008051602061307b833981519152604482015290519081900360640190fd5b60026000556123c56117b0565b6124005760405162461bcd60e51b81526004018080602001828103825260378152602001806130ca6037913960400191505060405180910390fd5b6011546007546040805163a9059cbb60e01b81523060048201526024810192909252516001600160a01b039092169163a9059cbb9160448082019260009290919082900301818387803b15801561245657600080fd5b505af115801561246a573d6000803e3d6000fd5b50505050601160009054906101000a90046001600160a01b03166001600160a01b031663fc0c546a6040518163ffffffff1660e01b815260040160206040518083038186803b1580156124bc57600080fd5b505afa1580156124d0573d6000803e3d6000fd5b505050506040513d60208110156124e657600080fd5b50516014546007546040805163095ea7b360e01b81526001600160a01b039384166004820152602481019290925251919092169163095ea7b39160448083019260209291908290030181600087803b15801561254157600080fd5b505af1158015612555573d6000803e3d6000fd5b505050506040513d602081101561256b57600080fd5b5050601454600754600854604080516313fb84ff60e21b815260048101939093526024830191909152516001600160a01b0390921691634fee13fc916044808201926020929091908290030181600087803b1580156125c957600080fd5b505af11580156125dd573d6000803e3d6000fd5b505050506040513d60208110156125f357600080fd5b506125fe90506127bf565b601454600754600854604080516001600160a01b039094168452602084019290925282820152517fa1ed4344451df8dcf80c17fed5add3de53aeecf6dc6a3b44c08176f7069d820b9181900360600190a16001600055565b60025460ff1681565b60035481565b6011546001600160a01b031681565b601154604080516316d3df1560e31b815290516000926001600160a01b03169163b69ef8a8916004808301926020929190829003018186803b1580156126b957600080fd5b505afa1580156126cd573d6000803e3d6000fd5b505050506040513d60208110156126e357600080fd5b5051905090565b600254610100900460ff1681565b60006113f06127056117b0565b15612796601460009054906101000a90046001600160a01b03166001600160a01b031663f5897a526040518163ffffffff1660e01b815260040160206040518083038186803b15801561275757600080fd5b505afa15801561276b573d6000803e3d6000fd5b505050506040513d602081101561278157600080fd5b5051600254901590610100900460ff16613041565b612f84565b600b5481565b6013546001600160a01b031681565b6018546001600160a01b031681565b60035443116127cd576128e2565b43600355600b546127dd576128e2565b6127e56128e4565b600061286c601260009054906101000a90046001600160a01b03166001600160a01b031663b69ef8a86040518163ffffffff1660e01b815260040160206040518083038186803b15801561283857600080fd5b505afa15801561284c573d6000803e3d6000fd5b505050506040513d602081101561286257600080fd5b5051600a54612f42565b905061287a600a5482612f88565b600a55600954600b5461289d919061158b84676765c793fa10079d601b1b612eec565b6009819055600b5460408051928352602083019190915280517f7fa9647ec1cc14e3822b46d05a2b9d4e019bde8875c0088c46b6503d71bf17229281900390910190a1505b565b601754601254604080516308fd581360e01b81526001600160a01b039283166004820152905191909216916308fd581391602480830192600092919082900301818387803b15801561293557600080fd5b505af1158015612949573d6000803e3d6000fd5b50505050565b60026000541415612995576040805162461bcd60e51b815260206004820152601f602482015260008051602061307b833981519152604482015290519081900360640190fd5b60026000908155338152600f6020526040902080546001909101546129bf91421015901515612f84565b6129fa5760405162461bcd60e51b815260040180806020018281038252602b815260200180613282602b913960400191505060405180910390fd5b612a19612a056120ab565b60025490159062010000900460ff16613041565b612a545760405162461bcd60e51b81526004018080602001828103825260328152602001806131016032913960400191505060405180910390fd5b336000908152600f6020526040812060010154612a7090611a85565b600b54336000908152600f6020526040902060010154919250612a9291612f42565b600b556011546040805163a9059cbb60e01b81523360048201526024810184905290516001600160a01b039092169163a9059cbb9160448082019260009290919082900301818387803b158015612ae857600080fd5b505af1158015612afc573d6000803e3d6000fd5b5050336000818152600f60209081526040918290206001015482518781529182015281519294507fbe0b6e5b3195df91f2e6b2b20501f84b085714f9e38073f499073c830565100993508290030190a250336000908152600f6020526040812081815560019081018290559055565b6000611a9882611a936113c2565b6014546001600160a01b031681565b3360009081526001602081905260409091205414612bd75760405162461bcd60e51b81526004018080602001828103825260388152602001806134516038913960400191505060405180910390fd5b81686578697444656c617960b81b1415612c54577f0000000000000000000000000000000000000000000000000000000000000000811115612c4a5760405162461bcd60e51b81526004018080602001828103825260348152602001806133ec6034913960400191505060405180910390fd5b6004819055612eb2565b817406d696e5374616b6564546f6b656e73546f4b65657605c1b1415612cbd5760008111612cb35760405162461bcd60e51b81526004018080602001828103825260388152602001806133296038913960400191505060405180910390fd5b6005819055612eb2565b816e3a37b5b2b739aa37a0bab1ba34b7b760891b1415612d205760008111612d165760405162461bcd60e51b815260040180806020018281038252603b8152602001806132ad603b913960400191505060405180910390fd5b6007819055612eb2565b81731cde5cdd195b50dbda5b9cd51bd4995c5d595cdd60621b1415612d885760008111612d7e5760405162461bcd60e51b815260040180806020018281038252603e815260200180613489603e913960400191505060405180910390fd5b6008819055612eb2565b81746d6178436f6e63757272656e7441756374696f6e7360581b1415612df15760018111612de75760405162461bcd60e51b81526004018080602001828103825260418152602001806132e86041913960600191505060405180910390fd5b6006819055612eb2565b816b195cd8dc9bddd4185d5cd95960a21b1415612e52576001811115612e485760405162461bcd60e51b815260040180806020018281038252603781526020018061324b6037913960400191505060405180910390fd5b600d819055612eb2565b816f1c195c98d95b9d1859d955995cdd195960821b14156119e15760648110612eac5760405162461bcd60e51b815260040180806020018281038252603b8152602001806131d5603b913960400191505060405180910390fd5b600c8190555b60408051828152905183917fac7c5c1afaef770ec56ac6268cd3f2fbb1035858ead2601d6553157c33036c3a919081900360200190a25050565b6000811580612f0757505080820282828281612f0457fe5b04145b611a985760405162461bcd60e51b815260040180806020018281038252602e8152602001806134c7602e913960400191505060405180910390fd5b80820382811115611a985760405162461bcd60e51b815260040180806020018281038252602f81526020018061309b602f913960400191505060405180910390fd5b1690565b80820182811015611a985760405162461bcd60e51b815260040180806020018281038252602e8152602001806131a7602e913960400191505060405180910390fd5b600080821161300a5760405162461bcd60e51b815260040180806020018281038252602e815260200180613393602e913960400191505060405180910390fd5b8161301d84670de0b6b3a7640000612eec565b8161302457fe5b049392505050565b6000670de0b6b3a764000061301d8484612eec565b179056fe4765624c656e64657246697273745265736f7274526577617264735665737465642f6e756c6c2d616d6f756e742d746f2d657869745265656e7472616e637947756172643a207265656e7472616e742063616c6c004765624c656e64657246697273745265736f7274526577617264735665737465642f7375622d756e646572666c6f774765624c656e64657246697273745265736f7274526577617264735665737465642f63616e6e6f742d61756374696f6e2d746f6b656e734765624c656e64657246697273745265736f7274526577617264735665737465642f657869742d6e6f742d616c6c6f7765644765624c656e64657246697273745265736f7274526577617264735665737465642f6e756c6c2d616e636573746f722d746f2d6a6f696e4765624c656e64657246697273745265736f7274526577617264735665737465642f636f756c642d6e6f742d7472616e736665722d616e636573746f724765624c656e64657246697273745265736f7274526577617264735665737465642f6164642d6f766572666c6f774765624c656e64657246697273745265736f7274526577617264735665737465642f696e76616c69642d70657263656e746167652d7665737465644765624c656e64657246697273745265736f7274526577617264735665737465642f6d6f646966792d756e7265636f676e697a65642d706172616d4765624c656e64657246697273745265736f7274526577617264735665737465642f696e76616c69642d657363726f772d7061757365644765624c656e64657246697273745265736f7274526577617264735665737465642f776169742d6d6f72654765624c656e64657246697273745265736f7274526577617264735665737465642f696e76616c69642d746f6b656e732d746f2d61756374696f6e4765624c656e64657246697273745265736f7274526577617264735665737465642f696e76616c69642d6d61782d636f6e63757272656e742d61756374696f6e734765624c656e64657246697273745265736f7274526577617264735665737465642f6e756c6c2d6d696e2d7374616b65642d746f6b656e734765624c656e64657246697273745265736f7274526577617264735665737465642f6a6f696e2d6e6f742d616c6c6f7765644765624c656e64657246697273745265736f7274526577617264735665737465642f776469762d62792d7a65726f4765624c656e64657246697273745265736f7274526577617264735665737465642f6e756c6c2d646174614765624c656e64657246697273745265736f7274526577617264735665737465642f696e76616c69642d657869742d64656c61794765624c656e64657246697273745265736f7274526577617264735665737465642f6e756c6c2d6a6f696e2d70726963654765624c656e64657246697273745265736f7274526577617264735665737465642f6163636f756e742d6e6f742d617574686f72697a65644765624c656e64657246697273745265736f7274526577617264735665737465642f696e76616c69642d7379732d636f696e732d746f2d726571756573744765624c656e64657246697273745265736f7274526577617264735665737465642f6d756c2d6f766572666c6f77a264697066735822122083545e16635c618ca065c0e690928550b04ed41bef8ed5829a47ae869153f91964736f6c63430006070033608060405234801561001057600080fd5b5060405161032b38038061032b8339818101604052602081101561003357600080fd5b5051600080546001600160a01b039092166001600160a01b031992831617905560018054909116331790556102be8061006d6000396000f3fe608060405234801561001057600080fd5b506004361061004c5760003560e01c80638da5cb5b14610051578063a9059cbb14610075578063b69ef8a8146100a3578063fc0c546a146100bd575b600080fd5b6100596100c5565b604080516001600160a01b039092168252519081900360200190f35b6100a16004803603604081101561008b57600080fd5b506001600160a01b0381351690602001356100d4565b005b6100ab6101fc565b60408051918252519081900360200190f35b610059610279565b6001546001600160a01b031681565b6001546001600160a01b03163314610122576040805162461bcd60e51b815260206004820152600c60248201526b1d5b985d5d1a1bdc9a5e995960a21b604482015290519081900360640190fd5b600080546040805163a9059cbb60e01b81526001600160a01b038681166004830152602482018690529151919092169263a9059cbb92604480820193602093909283900390910190829087803b15801561017b57600080fd5b505af115801561018f573d6000803e3d6000fd5b505050506040513d60208110156101a557600080fd5b50516101f8576040805162461bcd60e51b815260206004820152601960248201527f546f6b656e506f6f6c2f6661696c65642d7472616e7366657200000000000000604482015290519081900360640190fd5b5050565b60008054604080516370a0823160e01b815230600482015290516001600160a01b03909216916370a0823191602480820192602092909190829003018186803b15801561024857600080fd5b505afa15801561025c573d6000803e3d6000fd5b505050506040513d602081101561027257600080fd5b5051905090565b6000546001600160a01b03168156fea2646970667358221220bde6a006d3fd32aba7bbfc2a86ae454f8041e58d11433384b9f9eff60effe7d564736f6c634300060700334765624c656e64657246697273745265736f7274526577617264735665737465642f616e636573746f722d646563696d616c2d6d69736d617463684765624c656e64657246697273745265736f7274526577617264735665737465642f6e756c6c2d7379732d636f696e732d746f2d726571756573744765624c656e64657246697273745265736f7274526577617264735665737465642f64657363656e64616e742d646563696d616c2d6d69736d617463684765624c656e64657246697273745265736f7274526577617264735665737465642f6e756c6c2d6d61782d64656c61794765624c656e64657246697273745265736f7274526577617264735665737465642f696e76616c69642d70657263656e746167652d7665737465644765624c656e64657246697273745265736f7274526577617264735665737465642f6e756c6c2d657363726f774765624c656e64657246697273745265736f7274526577617264735665737465642f6e756c6c2d61756374696f6e2d686f7573654765624c656e64657246697273745265736f7274526577617264735665737465642f6e756c6c2d736166652d656e67696e654765624c656e64657246697273745265736f7274526577617264735665737465642f6e756c6c2d6163636f756e74696e672d656e67696e654765624c656e64657246697273745265736f7274526577617264735665737465642f6e756c6c2d64657363656e64616e744765624c656e64657246697273745265736f7274526577617264735665737465642f6e756c6c2d6d696e2d7374616b65642d746f6b656e734765624c656e64657246697273745265736f7274526577617264735665737465642f696e76616c69642d657869742d64656c61794765624c656e64657246697273745265736f7274526577617264735665737465642f6e756c6c2d746f6b656e732d746f2d61756374696f6e4765624c656e64657246697273745265736f7274526577617264735665737465642f6e756c6c2d7265776172642d64726970706572000000000000000000000000d6f3768e62ef92a9798e5a8cedd2b78907cecef9000000000000000000000000353efac5cab823a41bc0d6228d7061e92cf9ccb00000000000000000000000006243d8cea23066d098a15582d81a598b4e8391f40000000000000000000000002ba0a37c6603a79400806955e75be1c1219235be000000000000000000000000cee6aa1ab47d0fb0f24f51a3072ec16e20f90fce000000000000000000000000cc88a9d330da1133df3a7bd823b95e52511a696200000000000000000000000003da3d5e0b13b6f0917fa9bc3d65b46229d7ef470000000000000000000000008017f897aaaabd5701b63d819590062a87732ba0000000000000000000000000000000000000000000000000000000000024ea0000000000000000000000000000000000000000000000000000000000001baf800000000000000000000000000000000000000000000000004563918244f400000000000000000000000000000000000000000000000000056bc75e2d631000000000000000000000000000000000000000000000000003635c9adc5dea000000000000000000000000000000000000000000000000000000000000000000004b

Deployed Bytecode

0x608060405234801561001057600080fd5b506004361061030c5760003560e01c80636a1460241161019d578063aa88e788116100e9578063e2fdcc17116100a2578063e9fad8ee1161007c578063e9fad8ee14610605578063ec2c20d71461060d578063ed9152c81461062a578063fe4f5890146106325761030c565b8063e2fdcc17146105ed578063e3161ddd146105f5578063e43a0bb2146105fd5761030c565b8063aa88e788146105bd578063ba1da585146105c5578063c734b40e146105cd578063d4056655146105d5578063d41ce4b1146105dd578063da56eedb146105e55761030c565b80637e90cbe111610156578063961d45c411610130578063961d45c41461059d578063a19fe9e3146105a5578063a86eaca4146105ad578063a9f8d181146105b55761030c565b80637e90cbe11461056757806394bebfbb1461056f57806394f3f81d146105775761030c565b80636a1460241461050d5780636ff3ae6414610515578063721c65131461053257806373f5acef1461054f57806379d07015146105575780637b0a47ee1461055f5761030c565b806331d7a2621161025c57806359546fc411610215578063628c50a5116101ef578063628c50a5146104ab5780636614f010146104d157806366666aa9146104fd57806367aea313146105055761030c565b806359546fc4146104775780635c4036191461049b5780635e9153e6146104a35761030c565b806331d7a262146103d457806335b28153146103fa5780633b987bfc146104205780634125ff901461042857806351da8acf14610430578063552033c41461046f5761030c565b80631976eb8e116102c957806324ba5884116102a357806324ba58841461039657806328388630146103bc57806328e97ce6146103c45780632f3c9a4f146103cc5761030c565b80631976eb8e1461036a5780631a47d8561461037257806324463f1b1461037a5761030c565b8063049878f3146103115780630572b0cc146103305780630d86009c146103385780630e0c76de146103525780631162e6a41461035a578063131f2e5314610362575b600080fd5b61032e6004803603602081101561032757600080fd5b5035610655565b005b61032e610e42565b610340611312565b60408051918252519081900360200190f35b61032e611318565b6103406113c2565b6103406113f6565b6103406113fc565b610340611402565b610382611408565b604080519115158252519081900360200190f35b610340600480360360208110156103ac57600080fd5b50356001600160a01b0316611417565b610340611429565b61032e61142f565b6103406114cb565b610340600480360360208110156103ea57600080fd5b50356001600160a01b03166114d1565b61032e6004803603602081101561041057600080fd5b50356001600160a01b0316611600565b6103406116a3565b6103406116a9565b6104566004803603602081101561044657600080fd5b50356001600160a01b03166116cd565b6040805192835260208301919091528051918290030190f35b6103406116e6565b61047f6116f5565b604080516001600160a01b039092168252519081900360200190f35b61032e611704565b6103826117b0565b610340600480360360208110156104c157600080fd5b50356001600160a01b0316611860565b61032e600480360360408110156104e757600080fd5b50803590602001356001600160a01b0316611872565b61047f611a5b565b61047f611a6a565b610340611a79565b6103406004803603602081101561052b57600080fd5b5035611a85565b61032e6004803603602081101561054857600080fd5b5035611a9e565b6103406120a5565b6103826120ab565b6103406121fe565b61034061229c565b6103406122bb565b61032e6004803603602081101561058d57600080fd5b50356001600160a01b03166122c1565b61047f612363565b61032e612372565b610382612656565b61034061265f565b61047f612665565b610340612674565b6103826126ea565b6103826126f8565b61034061279b565b61047f6127a1565b61047f6127b0565b61032e6127bf565b61032e6128e4565b61032e61294f565b6103406004803603602081101561062357600080fd5b5035612b6b565b61047f612b79565b61032e6004803603604081101561064857600080fd5b5080359060200135612b88565b6002600054141561069b576040805162461bcd60e51b815260206004820152601f602482015260008051602061307b833981519152604482015290519081900360640190fd5b60026000556106a86127bf565b336000908152600e6020526040902054158015906107345750601254604080516316d3df1560e31b815290516000926001600160a01b03169163b69ef8a8916004808301926020929190829003018186803b15801561070657600080fd5b505afa15801561071a573d6000803e3d6000fd5b505050506040513d602081101561073057600080fd5b5051115b15610af957336000908152600e602052604081205460095461078791676765c793fa10079d601b1b916107679190612eec565b8161076e57fe5b3360009081526010602052604090205491900490612f42565b601854600d549192506000916107a9916001600160a01b031615159015612f84565b156109bb5760646107bc83600c54612eec565b816107c357fe5b60185460408051630a1dfc1360e21b8152336004820152939092046024840181905291519193506001600160a01b031691632877f04c91604480830192600092919082900301818387803b15801561081a57600080fd5b505af192505050801561082b575060015b6108fe573d808015610859576040519150601f19603f3d011682016040523d82523d6000602084013e61085e565b606091505b507f4db2e449a7b24364136173e75f7161233ace27438153323e778c5edbf237e680816040518080602001828103825283818151815260200191508051906020019080838360005b838110156108be5781810151838201526020016108a6565b50505050905090810190601f1680156108eb5780820380516001836020036101000a031916815260200191505b509250505060405180910390a1506109bb565b6012546018546040805163a9059cbb60e01b81526001600160a01b039283166004820152602481018590529051919092169163a9059cbb91604480830192600092919082900301818387803b15801561095657600080fd5b505af115801561096a573d6000803e3d6000fd5b5050601854604080516001600160a01b039092168252336020830152818101859052517f67672cc85e5f7be7dfc7a6f1bdb381e9b9809f4d251edc3e7bc49aef52b5a4919350908190036060019150a15b6012546001600160a01b031663a9059cbb336109d78585612f42565b6040518363ffffffff1660e01b815260040180836001600160a01b03166001600160a01b0316815260200182815260200192505050600060405180830381600087803b158015610a2657600080fd5b505af1158015610a3a573d6000803e3d6000fd5b50505050601260009054906101000a90046001600160a01b03166001600160a01b031663b69ef8a86040518163ffffffff1660e01b815260040160206040518083038186803b158015610a8c57600080fd5b505afa158015610aa0573d6000803e3d6000fd5b505050506040513d6020811015610ab657600080fd5b5051600a55604080513381526020810184905281517fd5ec1b97fc4d048ade361b013c285a0a5c1c40ae32579013ad3798ee657d9de7929181900390910190a150505b600254610b119060ff16610b0b6120ab565b15612f84565b610b4c5760405162461bcd60e51b81526004018080602001828103825260328152602001806133616032913960400191505060405180910390fd5b60008111610b8b5760405162461bcd60e51b81526004018080602001828103825260378152602001806131336037913960400191505060405180910390fd5b6000610b9682612b6b565b905060008111610bd75760405162461bcd60e51b81526004018080602001828103825260318152602001806134206031913960400191505060405180910390fd5b601160009054906101000a90046001600160a01b03166001600160a01b031663fc0c546a6040518163ffffffff1660e01b815260040160206040518083038186803b158015610c2557600080fd5b505afa158015610c39573d6000803e3d6000fd5b505050506040513d6020811015610c4f57600080fd5b5051601154604080516323b872dd60e01b81523360048201526001600160a01b03928316602482015260448101869052905191909216916323b872dd9160648083019260209291908290030181600087803b158015610cad57600080fd5b505af1158015610cc1573d6000803e3d6000fd5b505050506040513d6020811015610cd757600080fd5b5051610d145760405162461bcd60e51b815260040180806020018281038252603d81526020018061316a603d913960400191505060405180910390fd5b601354604080516340c10f1960e01b81523360048201526024810184905290516001600160a01b03909216916340c10f199160448082019260009290919082900301818387803b158015610d6757600080fd5b505af1158015610d7b573d6000803e3d6000fd5b5050336000908152600e6020526040902054610d9a9250905082612f88565b336000908152600e6020526040902055600b54610db79082612f88565b600b556040805182815260208101849052815133927fbca387acb0ba7d06e329c4372885bb664f19a98153ccf3e74e56c136bf0e88c4928290030190a250336000908152600e6020526040902054600954676765c793fa10079d601b1b91610e1e91612eec565b81610e2557fe5b336000908152601060205260408120929091049091556001905550565b60026000541415610e88576040805162461bcd60e51b815260206004820152601f602482015260008051602061307b833981519152604482015290519081900360640190fd5b6002600055610e956127bf565b336000908152600e602052604090205415801590610f215750601254604080516316d3df1560e31b815290516000926001600160a01b03169163b69ef8a8916004808301926020929190829003018186803b158015610ef357600080fd5b505afa158015610f07573d6000803e3d6000fd5b505050506040513d6020811015610f1d57600080fd5b5051115b156112c657336000908152600e6020526040812054600954610f5491676765c793fa10079d601b1b916107679190612eec565b601854600d54919250600091610f76916001600160a01b031615159015612f84565b15611188576064610f8983600c54612eec565b81610f9057fe5b60185460408051630a1dfc1360e21b8152336004820152939092046024840181905291519193506001600160a01b031691632877f04c91604480830192600092919082900301818387803b158015610fe757600080fd5b505af1925050508015610ff8575060015b6110cb573d808015611026576040519150601f19603f3d011682016040523d82523d6000602084013e61102b565b606091505b507f4db2e449a7b24364136173e75f7161233ace27438153323e778c5edbf237e680816040518080602001828103825283818151815260200191508051906020019080838360005b8381101561108b578181015183820152602001611073565b50505050905090810190601f1680156110b85780820380516001836020036101000a031916815260200191505b509250505060405180910390a150611188565b6012546018546040805163a9059cbb60e01b81526001600160a01b039283166004820152602481018590529051919092169163a9059cbb91604480830192600092919082900301818387803b15801561112357600080fd5b505af1158015611137573d6000803e3d6000fd5b5050601854604080516001600160a01b039092168252336020830152818101859052517f67672cc85e5f7be7dfc7a6f1bdb381e9b9809f4d251edc3e7bc49aef52b5a4919350908190036060019150a15b6012546001600160a01b031663a9059cbb336111a48585612f42565b6040518363ffffffff1660e01b815260040180836001600160a01b03166001600160a01b0316815260200182815260200192505050600060405180830381600087803b1580156111f357600080fd5b505af1158015611207573d6000803e3d6000fd5b50505050601260009054906101000a90046001600160a01b03166001600160a01b031663b69ef8a86040518163ffffffff1660e01b815260040160206040518083038186803b15801561125957600080fd5b505afa15801561126d573d6000803e3d6000fd5b505050506040513d602081101561128357600080fd5b5051600a55604080513381526020810184905281517fd5ec1b97fc4d048ade361b013c285a0a5c1c40ae32579013ad3798ee657d9de7929181900390910190a150505b336000908152600e6020526040902054600954676765c793fa10079d601b1b916112ef91612eec565b816112f657fe5b3360009081526010602052604081209290910490915560019055565b600d5481565b33600090815260016020819052604090912054146113675760405162461bcd60e51b81526004018080602001828103825260388152602001806134516038913960400191505060405180910390fd5b6002805460ff610100808304821615810261ff001990931692909217928390556040805192909304161515815290517f9fdd4155cb7fc6f6912385f4f0c9bc86bb1282c9dd3d6d86b618a2291f6fc7719181900360200190a1565b6000600b546000146113e6576113e1600b546113dc612674565b612fca565b6113f0565b670de0b6b3a76400005b90505b90565b600a5481565b60065481565b60075481565b60025462010000900460ff1681565b60016020526000908152604090205481565b60045481565b336000908152600160208190526040909120541461147e5760405162461bcd60e51b81526004018080602001828103825260388152602001806134516038913960400191505060405180910390fd5b6002805460ff19811660ff918216151791829055604080519290911615158252517f7dc6d5f7de2146a02aa91321e6f05614c85f0316cb5c0a12e0897f2fd30666829181900360200190a1565b60095481565b60095460035460009190431180156114ea5750600b5415155b1561159c57601754604080516322b8e72b60e21b815290516000926001600160a01b031691638ae39cac916004808301926020929190829003018186803b15801561153457600080fd5b505afa158015611548573d6000803e3d6000fd5b505050506040513d602081101561155e57600080fd5b5051600354600b544391909103909102915061159890839061158b84676765c793fa10079d601b1b612eec565b8161159257fe5b04612f88565b9150505b6001600160a01b0383166000908152600e60205260409020546115f990676765c793fa10079d601b1b906115d09084612eec565b816115d757fe5b6001600160a01b03861660009081526010602052604090205491900490612f42565b9392505050565b336000908152600160208190526040909120541461164f5760405162461bcd60e51b81526004018080602001828103825260388152602001806134516038913960400191505060405180910390fd5b6001600160a01b03811660008181526001602081815260409283902091909155815192835290517f599a298163e1678bb1c676052a8930bf0b8a1261ed6e01b8a2391e55f70001029281900390910190a150565b60085481565b7f000000000000000000000000000000000000000000000000000000000024ea0081565b600f602052600090815260409020805460019091015482565b676765c793fa10079d601b1b81565b6017546001600160a01b031681565b33600090815260016020819052604090912054146117535760405162461bcd60e51b81526004018080602001828103825260388152602001806134516038913960400191505060405180910390fd5b6002805460ff62010000808304821615810262ff00001990931692909217928390556040805192909304161515815290517f2556a991abd9f74d727d88623dc8f637c4d913be5c71c19c4bb1c09f68a4fdc09181900360200190a1565b60006113f06117dd6117c06120ab565b6117c8612674565b6117d6600554600754612f88565b1115612f84565b600654601460009054906101000a90046001600160a01b03166001600160a01b031663f5897a526040518163ffffffff1660e01b815260040160206040518083038186803b15801561182e57600080fd5b505afa158015611842573d6000803e3d6000fd5b505050506040513d602081101561185857600080fd5b505110612f84565b600e6020526000908152604090205481565b33600090815260016020819052604090912054146118c15760405162461bcd60e51b81526004018080602001828103825260388152602001806134516038913960400191505060405180910390fd5b6001600160a01b0381166119065760405162461bcd60e51b815260040180806020018281038252602b8152602001806133c1602b913960400191505060405180910390fd5b816b61756374696f6e486f75736560a01b141561193d57601480546001600160a01b0319166001600160a01b038316179055611a18565b816f6163636f756e74696e67456e67696e6560801b141561197857601580546001600160a01b0319166001600160a01b038316179055611a18565b816c3932bbb0b932223934b83832b960991b14156119b057601780546001600160a01b0319166001600160a01b038316179055611a18565b8165657363726f7760d01b14156119e157601880546001600160a01b0319166001600160a01b038316179055611a18565b60405162461bcd60e51b815260040180806020018281038252603b815260200180613210603b913960400191505060405180910390fd5b604080516001600160a01b0383168152905183917fd91f38cf03346b5dc15fb60f9076f866295231ad3c3841a1051f8443f25170d1919081900360200190a25050565b6012546001600160a01b031681565b6016546001600160a01b031681565b670de0b6b3a764000081565b6000611a9882611a9361229c565b61302c565b92915050565b60026000541415611ae4576040805162461bcd60e51b815260206004820152601f602482015260008051602061307b833981519152604482015290519081900360640190fd5b6002600055611af16127bf565b336000908152600e602052604090205415801590611b7d5750601254604080516316d3df1560e31b815290516000926001600160a01b03169163b69ef8a8916004808301926020929190829003018186803b158015611b4f57600080fd5b505afa158015611b63573d6000803e3d6000fd5b505050506040513d6020811015611b7957600080fd5b5051115b15611f2257336000908152600e6020526040812054600954611bb091676765c793fa10079d601b1b916107679190612eec565b601854600d54919250600091611bd2916001600160a01b031615159015612f84565b15611de4576064611be583600c54612eec565b81611bec57fe5b60185460408051630a1dfc1360e21b8152336004820152939092046024840181905291519193506001600160a01b031691632877f04c91604480830192600092919082900301818387803b158015611c4357600080fd5b505af1925050508015611c54575060015b611d27573d808015611c82576040519150601f19603f3d011682016040523d82523d6000602084013e611c87565b606091505b507f4db2e449a7b24364136173e75f7161233ace27438153323e778c5edbf237e680816040518080602001828103825283818151815260200191508051906020019080838360005b83811015611ce7578181015183820152602001611ccf565b50505050905090810190601f168015611d145780820380516001836020036101000a031916815260200191505b509250505060405180910390a150611de4565b6012546018546040805163a9059cbb60e01b81526001600160a01b039283166004820152602481018590529051919092169163a9059cbb91604480830192600092919082900301818387803b158015611d7f57600080fd5b505af1158015611d93573d6000803e3d6000fd5b5050601854604080516001600160a01b039092168252336020830152818101859052517f67672cc85e5f7be7dfc7a6f1bdb381e9b9809f4d251edc3e7bc49aef52b5a4919350908190036060019150a15b6012546001600160a01b031663a9059cbb33611e008585612f42565b6040518363ffffffff1660e01b815260040180836001600160a01b03166001600160a01b0316815260200182815260200192505050600060405180830381600087803b158015611e4f57600080fd5b505af1158015611e63573d6000803e3d6000fd5b50505050601260009054906101000a90046001600160a01b03166001600160a01b031663b69ef8a86040518163ffffffff1660e01b815260040160206040518083038186803b158015611eb557600080fd5b505afa158015611ec9573d6000803e3d6000fd5b505050506040513d6020811015611edf57600080fd5b5051600a55604080513381526020810184905281517fd5ec1b97fc4d048ade361b013c285a0a5c1c40ae32579013ad3798ee657d9de7929181900390910190a150505b60008111611f615760405162461bcd60e51b81526004018080602001828103825260358152602001806130466035913960400191505060405180910390fd5b611f6d42600454612f88565b336000908152600f6020526040902090815560010154611f8d9082612f88565b336000908152600f6020908152604080832060010193909355600e90522054611fb69082612f42565b336000818152600e6020526040808220939093556013548351632770a7eb60e21b815260048101939093526024830185905292516001600160a01b0390931692639dc29fac92604480820193929182900301818387803b15801561201957600080fd5b505af115801561202d573d6000803e3d6000fd5b5050336000818152600f602090815260409182902054825190815290810186905281519294507f1a05ab0ac5685d1105d3b900f1db7c3c17a560a68f6f9e5c7f2a20b0bcac1f1593508290030190a2336000908152600e6020526040902054600954676765c793fa10079d601b1b91610e1e91612eec565b60055481565b600080601560009054906101000a90046001600160a01b03166001600160a01b031663d8872aeb6040518163ffffffff1660e01b815260040160206040518083038186803b1580156120fc57600080fd5b505afa158015612110573d6000803e3d6000fd5b505050506040513d602081101561212657600080fd5b505160155460408051630140b37760e21b815290519293506121f89284926001600160a01b031691630502cddc916004808301926020929190829003018186803b15801561217357600080fd5b505afa158015612187573d6000803e3d6000fd5b505050506040513d602081101561219d57600080fd5b505160165460155460408051633eaf7a0360e21b81526001600160a01b03928316600482015290519490931115938693919092169163fabde80c91602480820192602092909190829003018186803b15801561182e57600080fd5b91505090565b6000600b5460001415612213575060006113f3565b600b54601754604080516322b8e72b60e21b81529051670de0b6b3a7640000926001600160a01b031691638ae39cac916004808301926020929190829003018186803b15801561226257600080fd5b505afa158015612276573d6000803e3d6000fd5b505050506040513d602081101561228c57600080fd5b5051028161229657fe5b04905090565b6000600b546000146113e6576113e16122b3612674565b600b54612fca565b600c5481565b33600090815260016020819052604090912054146123105760405162461bcd60e51b81526004018080602001828103825260388152602001806134516038913960400191505060405180910390fd5b6001600160a01b038116600081815260016020908152604080832092909255815192835290517f8834a87e641e9716be4f34527af5d23e11624f1ddeefede6ad75a9acfc31b9039281900390910190a150565b6015546001600160a01b031681565b600260005414156123b8576040805162461bcd60e51b815260206004820152601f602482015260008051602061307b833981519152604482015290519081900360640190fd5b60026000556123c56117b0565b6124005760405162461bcd60e51b81526004018080602001828103825260378152602001806130ca6037913960400191505060405180910390fd5b6011546007546040805163a9059cbb60e01b81523060048201526024810192909252516001600160a01b039092169163a9059cbb9160448082019260009290919082900301818387803b15801561245657600080fd5b505af115801561246a573d6000803e3d6000fd5b50505050601160009054906101000a90046001600160a01b03166001600160a01b031663fc0c546a6040518163ffffffff1660e01b815260040160206040518083038186803b1580156124bc57600080fd5b505afa1580156124d0573d6000803e3d6000fd5b505050506040513d60208110156124e657600080fd5b50516014546007546040805163095ea7b360e01b81526001600160a01b039384166004820152602481019290925251919092169163095ea7b39160448083019260209291908290030181600087803b15801561254157600080fd5b505af1158015612555573d6000803e3d6000fd5b505050506040513d602081101561256b57600080fd5b5050601454600754600854604080516313fb84ff60e21b815260048101939093526024830191909152516001600160a01b0390921691634fee13fc916044808201926020929091908290030181600087803b1580156125c957600080fd5b505af11580156125dd573d6000803e3d6000fd5b505050506040513d60208110156125f357600080fd5b506125fe90506127bf565b601454600754600854604080516001600160a01b039094168452602084019290925282820152517fa1ed4344451df8dcf80c17fed5add3de53aeecf6dc6a3b44c08176f7069d820b9181900360600190a16001600055565b60025460ff1681565b60035481565b6011546001600160a01b031681565b601154604080516316d3df1560e31b815290516000926001600160a01b03169163b69ef8a8916004808301926020929190829003018186803b1580156126b957600080fd5b505afa1580156126cd573d6000803e3d6000fd5b505050506040513d60208110156126e357600080fd5b5051905090565b600254610100900460ff1681565b60006113f06127056117b0565b15612796601460009054906101000a90046001600160a01b03166001600160a01b031663f5897a526040518163ffffffff1660e01b815260040160206040518083038186803b15801561275757600080fd5b505afa15801561276b573d6000803e3d6000fd5b505050506040513d602081101561278157600080fd5b5051600254901590610100900460ff16613041565b612f84565b600b5481565b6013546001600160a01b031681565b6018546001600160a01b031681565b60035443116127cd576128e2565b43600355600b546127dd576128e2565b6127e56128e4565b600061286c601260009054906101000a90046001600160a01b03166001600160a01b031663b69ef8a86040518163ffffffff1660e01b815260040160206040518083038186803b15801561283857600080fd5b505afa15801561284c573d6000803e3d6000fd5b505050506040513d602081101561286257600080fd5b5051600a54612f42565b905061287a600a5482612f88565b600a55600954600b5461289d919061158b84676765c793fa10079d601b1b612eec565b6009819055600b5460408051928352602083019190915280517f7fa9647ec1cc14e3822b46d05a2b9d4e019bde8875c0088c46b6503d71bf17229281900390910190a1505b565b601754601254604080516308fd581360e01b81526001600160a01b039283166004820152905191909216916308fd581391602480830192600092919082900301818387803b15801561293557600080fd5b505af1158015612949573d6000803e3d6000fd5b50505050565b60026000541415612995576040805162461bcd60e51b815260206004820152601f602482015260008051602061307b833981519152604482015290519081900360640190fd5b60026000908155338152600f6020526040902080546001909101546129bf91421015901515612f84565b6129fa5760405162461bcd60e51b815260040180806020018281038252602b815260200180613282602b913960400191505060405180910390fd5b612a19612a056120ab565b60025490159062010000900460ff16613041565b612a545760405162461bcd60e51b81526004018080602001828103825260328152602001806131016032913960400191505060405180910390fd5b336000908152600f6020526040812060010154612a7090611a85565b600b54336000908152600f6020526040902060010154919250612a9291612f42565b600b556011546040805163a9059cbb60e01b81523360048201526024810184905290516001600160a01b039092169163a9059cbb9160448082019260009290919082900301818387803b158015612ae857600080fd5b505af1158015612afc573d6000803e3d6000fd5b5050336000818152600f60209081526040918290206001015482518781529182015281519294507fbe0b6e5b3195df91f2e6b2b20501f84b085714f9e38073f499073c830565100993508290030190a250336000908152600f6020526040812081815560019081018290559055565b6000611a9882611a936113c2565b6014546001600160a01b031681565b3360009081526001602081905260409091205414612bd75760405162461bcd60e51b81526004018080602001828103825260388152602001806134516038913960400191505060405180910390fd5b81686578697444656c617960b81b1415612c54577f000000000000000000000000000000000000000000000000000000000024ea00811115612c4a5760405162461bcd60e51b81526004018080602001828103825260348152602001806133ec6034913960400191505060405180910390fd5b6004819055612eb2565b817406d696e5374616b6564546f6b656e73546f4b65657605c1b1415612cbd5760008111612cb35760405162461bcd60e51b81526004018080602001828103825260388152602001806133296038913960400191505060405180910390fd5b6005819055612eb2565b816e3a37b5b2b739aa37a0bab1ba34b7b760891b1415612d205760008111612d165760405162461bcd60e51b815260040180806020018281038252603b8152602001806132ad603b913960400191505060405180910390fd5b6007819055612eb2565b81731cde5cdd195b50dbda5b9cd51bd4995c5d595cdd60621b1415612d885760008111612d7e5760405162461bcd60e51b815260040180806020018281038252603e815260200180613489603e913960400191505060405180910390fd5b6008819055612eb2565b81746d6178436f6e63757272656e7441756374696f6e7360581b1415612df15760018111612de75760405162461bcd60e51b81526004018080602001828103825260418152602001806132e86041913960600191505060405180910390fd5b6006819055612eb2565b816b195cd8dc9bddd4185d5cd95960a21b1415612e52576001811115612e485760405162461bcd60e51b815260040180806020018281038252603781526020018061324b6037913960400191505060405180910390fd5b600d819055612eb2565b816f1c195c98d95b9d1859d955995cdd195960821b14156119e15760648110612eac5760405162461bcd60e51b815260040180806020018281038252603b8152602001806131d5603b913960400191505060405180910390fd5b600c8190555b60408051828152905183917fac7c5c1afaef770ec56ac6268cd3f2fbb1035858ead2601d6553157c33036c3a919081900360200190a25050565b6000811580612f0757505080820282828281612f0457fe5b04145b611a985760405162461bcd60e51b815260040180806020018281038252602e8152602001806134c7602e913960400191505060405180910390fd5b80820382811115611a985760405162461bcd60e51b815260040180806020018281038252602f81526020018061309b602f913960400191505060405180910390fd5b1690565b80820182811015611a985760405162461bcd60e51b815260040180806020018281038252602e8152602001806131a7602e913960400191505060405180910390fd5b600080821161300a5760405162461bcd60e51b815260040180806020018281038252602e815260200180613393602e913960400191505060405180910390fd5b8161301d84670de0b6b3a7640000612eec565b8161302457fe5b049392505050565b6000670de0b6b3a764000061301d8484612eec565b179056fe4765624c656e64657246697273745265736f7274526577617264735665737465642f6e756c6c2d616d6f756e742d746f2d657869745265656e7472616e637947756172643a207265656e7472616e742063616c6c004765624c656e64657246697273745265736f7274526577617264735665737465642f7375622d756e646572666c6f774765624c656e64657246697273745265736f7274526577617264735665737465642f63616e6e6f742d61756374696f6e2d746f6b656e734765624c656e64657246697273745265736f7274526577617264735665737465642f657869742d6e6f742d616c6c6f7765644765624c656e64657246697273745265736f7274526577617264735665737465642f6e756c6c2d616e636573746f722d746f2d6a6f696e4765624c656e64657246697273745265736f7274526577617264735665737465642f636f756c642d6e6f742d7472616e736665722d616e636573746f724765624c656e64657246697273745265736f7274526577617264735665737465642f6164642d6f766572666c6f774765624c656e64657246697273745265736f7274526577617264735665737465642f696e76616c69642d70657263656e746167652d7665737465644765624c656e64657246697273745265736f7274526577617264735665737465642f6d6f646966792d756e7265636f676e697a65642d706172616d4765624c656e64657246697273745265736f7274526577617264735665737465642f696e76616c69642d657363726f772d7061757365644765624c656e64657246697273745265736f7274526577617264735665737465642f776169742d6d6f72654765624c656e64657246697273745265736f7274526577617264735665737465642f696e76616c69642d746f6b656e732d746f2d61756374696f6e4765624c656e64657246697273745265736f7274526577617264735665737465642f696e76616c69642d6d61782d636f6e63757272656e742d61756374696f6e734765624c656e64657246697273745265736f7274526577617264735665737465642f6e756c6c2d6d696e2d7374616b65642d746f6b656e734765624c656e64657246697273745265736f7274526577617264735665737465642f6a6f696e2d6e6f742d616c6c6f7765644765624c656e64657246697273745265736f7274526577617264735665737465642f776469762d62792d7a65726f4765624c656e64657246697273745265736f7274526577617264735665737465642f6e756c6c2d646174614765624c656e64657246697273745265736f7274526577617264735665737465642f696e76616c69642d657869742d64656c61794765624c656e64657246697273745265736f7274526577617264735665737465642f6e756c6c2d6a6f696e2d70726963654765624c656e64657246697273745265736f7274526577617264735665737465642f6163636f756e742d6e6f742d617574686f72697a65644765624c656e64657246697273745265736f7274526577617264735665737465642f696e76616c69642d7379732d636f696e732d746f2d726571756573744765624c656e64657246697273745265736f7274526577617264735665737465642f6d756c2d6f766572666c6f77a264697066735822122083545e16635c618ca065c0e690928550b04ed41bef8ed5829a47ae869153f91964736f6c63430006070033

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

000000000000000000000000d6f3768e62ef92a9798e5a8cedd2b78907cecef9000000000000000000000000353efac5cab823a41bc0d6228d7061e92cf9ccb00000000000000000000000006243d8cea23066d098a15582d81a598b4e8391f40000000000000000000000002ba0a37c6603a79400806955e75be1c1219235be000000000000000000000000cee6aa1ab47d0fb0f24f51a3072ec16e20f90fce000000000000000000000000cc88a9d330da1133df3a7bd823b95e52511a696200000000000000000000000003da3d5e0b13b6f0917fa9bc3d65b46229d7ef470000000000000000000000008017f897aaaabd5701b63d819590062a87732ba0000000000000000000000000000000000000000000000000000000000024ea0000000000000000000000000000000000000000000000000000000000001baf800000000000000000000000000000000000000000000000004563918244f400000000000000000000000000000000000000000000000000056bc75e2d631000000000000000000000000000000000000000000000000003635c9adc5dea000000000000000000000000000000000000000000000000000000000000000000004b

-----Decoded View---------------
Arg [0] : ancestor_ (address): 0xd6F3768E62Ef92a9798E5A8cEdD2b78907cEceF9
Arg [1] : descendant_ (address): 0x353EFAC5CaB823A41BC0d6228d7061e92Cf9Ccb0
Arg [2] : rewardToken_ (address): 0x6243d8CEA23066d098a15582d81a598b4e8391F4
Arg [3] : auctionHouse_ (address): 0x2BA0A37C6603a79400806955e75be1c1219235BE
Arg [4] : accountingEngine_ (address): 0xcEe6Aa1aB47d0Fb0f24f51A3072EC16E20F90fcE
Arg [5] : safeEngine_ (address): 0xCC88a9d330da1133Df3A7bD823B95e52511A6962
Arg [6] : rewardDripper_ (address): 0x03da3D5E0b13b6f0917FA9BC3d65B46229d7Ef47
Arg [7] : escrow_ (address): 0x8017F897AAaAbD5701b63D819590062A87732Ba0
Arg [8] : maxDelay_ (uint256): 2419200
Arg [9] : exitDelay_ (uint256): 1814400
Arg [10] : minStakedTokensToKeep_ (uint256): 5000000000000000000
Arg [11] : tokensToAuction_ (uint256): 100000000000000000000
Arg [12] : systemCoinsToRequest_ (uint256): 16000000000000000000000
Arg [13] : percentageVested_ (uint256): 75

-----Encoded View---------------
14 Constructor Arguments found :
Arg [0] : 000000000000000000000000d6f3768e62ef92a9798e5a8cedd2b78907cecef9
Arg [1] : 000000000000000000000000353efac5cab823a41bc0d6228d7061e92cf9ccb0
Arg [2] : 0000000000000000000000006243d8cea23066d098a15582d81a598b4e8391f4
Arg [3] : 0000000000000000000000002ba0a37c6603a79400806955e75be1c1219235be
Arg [4] : 000000000000000000000000cee6aa1ab47d0fb0f24f51a3072ec16e20f90fce
Arg [5] : 000000000000000000000000cc88a9d330da1133df3a7bd823b95e52511a6962
Arg [6] : 00000000000000000000000003da3d5e0b13b6f0917fa9bc3d65b46229d7ef47
Arg [7] : 0000000000000000000000008017f897aaaabd5701b63d819590062a87732ba0
Arg [8] : 000000000000000000000000000000000000000000000000000000000024ea00
Arg [9] : 00000000000000000000000000000000000000000000000000000000001baf80
Arg [10] : 0000000000000000000000000000000000000000000000004563918244f40000
Arg [11] : 0000000000000000000000000000000000000000000000056bc75e2d63100000
Arg [12] : 0000000000000000000000000000000000000000000003635c9adc5dea000000
Arg [13] : 000000000000000000000000000000000000000000000000000000000000004b


Deployed Bytecode Sourcemap

5648:21280:0:-:0;;;;5:9:-1;2:2;;;27:1;24;17:12;2:2;5648:21280:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;12:1:-1;9;2:12;24730:788:0;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;24730:788:0;;:::i;:::-;;23162:57;;;:::i;8219:29::-;;;:::i;:::-;;;;;;;;;;;;;;;;15099:157;;;:::i;18780:::-;;;:::i;7949:31::-;;;:::i;7485:38::-;;;:::i;7585:32::-;;;:::i;7092:27::-;;;:::i;:::-;;;;;;;;;;;;;;;;;;5738:51;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;5738:51:0;-1:-1:-1;;;;;5738:51:0;;:::i;7255:26::-;;;:::i;14863:116::-;;;:::i;7836:34::-;;;:::i;20987:534::-;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;20987:534:0;-1:-1:-1;;;;;20987:534:0;;:::i;5899:164::-;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;5899:164:0;-1:-1:-1;;;;;5899:164:0;;:::i;7706:37::-;;;:::i;9409:34::-;;;:::i;8383:51::-;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;8383:51:0;-1:-1:-1;;;;;8383:51:0;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;13875:38;;;:::i;9232:45::-;;;:::i;:::-;;;;-1:-1:-1;;;;;9232:45:0;;;;;;;;;;;;;;15370:137;;;:::i;20309:285::-;;;:::i;8301:57::-;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;8301:57:0;-1:-1:-1;;;;;8301:57:0;;:::i;17431:756::-;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;17431:756:0;;;;;;-1:-1:-1;;;;;17431:756:0;;:::i;8810:42::-;;;:::i;9147:::-;;;:::i;13830:38::-;;;:::i;19560:127::-;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;19560:127:0;;:::i;25659:555::-;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;25659:555:0;;:::i;7380:38::-;;;:::i;19776:352::-;;;:::i;21624:173::-;;;:::i;18516:157::-;;;:::i;8135:33::-;;;:::i;6182:170::-;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;6182:170:0;-1:-1:-1;;;;;6182:170:0;;:::i;9059:48::-;;;:::i;24110:504::-;;;:::i;6870:24::-;;;:::i;7170:32::-;;;:::i;8721:44::-;;;:::i;18302:107::-;;;:::i;6998:31::-;;;:::i;20689:216::-;;;:::i;8041:29::-;;;:::i;8884:42::-;;;:::i;9311:38::-;;;:::i;23435:559::-;;;:::i;23286:92::-;;;:::i;26272:653::-;;;:::i;19185:127::-;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;19185:127:0;;:::i;8973:44::-;;;:::i;15679:1580::-;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;15679:1580:0;;;;;;;:::i;24730:788::-;2450:1;3056:7;;:19;;3048:63;;;;;-1:-1:-1;;;3048:63:0;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;3048:63:0;;;;;;;;;;;;;;;2450:1;3189:7;:18;21996:12:::1;:10;:12::i;:::-;22045:10;22059:1;22025:31:::0;;;:19:::1;:31;::::0;;;;;:35;;;;:63:::1;;-1:-1:-1::0;22064:10:0::1;::::0;:20:::1;::::0;;-1:-1:-1;;;22064:20:0;;;;22087:1:::1;::::0;-1:-1:-1;;;;;22064:10:0::1;::::0;:18:::1;::::0;:20:::1;::::0;;::::1;::::0;::::1;::::0;;;;;;;;:10;:20;::::1;;2:2:-1::0;::::1;;;27:1;24::::0;17:12:::1;2:2;22064:20:0;;;;8:9:-1;5:2;;;45:16;42:1;39::::0;24:38:::1;77:16;74:1;67:27;5:2;22064:20:0;;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28::::0;21:12:::1;4:2;-1:-1:::0;22064:20:0;:24:::1;22025:63;22021:940;;;22193:10;22137:15;22173:31:::0;;;:19:::1;:31;::::0;;;;;22206:17:::1;::::0;22155:100:::1;::::0;-1:-1:-1;;;13905:8:0;22164:60:::1;::::0;22173:31;22164:8:::1;:60::i;:::-;:66;;;;;22243:10;22232:22;::::0;;;:10:::1;:22;::::0;;;;;22164:66;;::::1;::::0;22155:8:::1;:100::i;:::-;22318:6;::::0;22341:12:::1;::::0;22137:118;;-1:-1:-1;22272:14:0::1;::::0;22305:54:::1;::::0;-1:-1:-1;;;;;22318:6:0::1;22310:29:::0;::::1;::::0;22341:17;22305:4:::1;:54::i;:::-;22301:468;;;22425:3;22387:35;22396:7;22405:16;;22387:8;:35::i;:::-;:41;;;;;22451:6;::::0;:40:::1;::::0;;-1:-1:-1;;;22451:40:0;;22472:10:::1;22451:40;::::0;::::1;::::0;22387:41;;;::::1;22451:40:::0;;;;;;;;22387:41;;-1:-1:-1;;;;;;22451:6:0::1;::::0;:20:::1;::::0;:40;;;;;:6:::1;::::0;:40;;;;;;;:6;;:40;::::1;;2:2:-1::0;::::1;;;27:1;24::::0;17:12:::1;2:2;22451:40:0;;;;;;;;;;;;;;22447:307;;;::::0;14:27:-1;;::::1;;67:4;61:11;56:16;;134:4;130:9;123:4;105:16;101:27;97:43;94:1;90:51;84:4;77:65;157:16;154:1;147:27;211:16;208:1;201:4;198:1;194:12;179:49;5:228;;14:27;32:4;27:9;;5:228;;22705:31:0;22723:12;22705:31;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23:1:-1;8:100;33:3;30:1;27:10;8:100;;;90:11:::0;;::::1;84:18:::0;71:11;;::::1;64:39:::0;52:2:::1;45:10;8:100;;;12:14;22705:31:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;22648:106;22447:307;;;22511:10;::::0;22539:6:::1;::::0;22511:44:::1;::::0;;-1:-1:-1;;;22511:44:0;;-1:-1:-1;;;;;22539:6:0;;::::1;22511:44;::::0;::::1;::::0;;;;;;;;;:10;;;::::1;::::0;:19:::1;::::0;:44;;;;;:10:::1;::::0;:44;;;;;;;:10;;:44;::::1;;2:2:-1::0;::::1;;;27:1;24::::0;17:12:::1;2:2;22511:44:0;;;;8:9:-1;5:2;;;45:16;42:1;39::::0;24:38:::1;77:16;74:1;67:27;5:2;-1:-1:::0;;22601:6:0::1;::::0;22579:50:::1;::::0;;-1:-1:-1;;;;;22601:6:0;;::::1;22579:50:::0;;22610:10:::1;22579:50;::::0;::::1;::::0;;;;;;;;::::1;::::0;-1:-1:-1;22579:50:0;;;;;;;-1:-1:-1;22579:50:0::1;22447:307;22785:10;::::0;-1:-1:-1;;;;;22785:10:0::1;:19;22805:10;22817:25;22826:7:::0;22835:6;22817:8:::1;:25::i;:::-;22785:58;;;;;;;;;;;;;-1:-1:-1::0;;;;;22785:58:0::1;-1:-1:-1::0;;;;;22785:58:0::1;;;;;;;;;;;;;;;;;;;;;;;;;;5:9:-1;2:2;;;27:1;24::::0;17:12:::1;2:2;22785:58:0;;;;8:9:-1;5:2;;;45:16;42:1;39::::0;24:38:::1;77:16;74:1;67:27;5:2;22785:58:0;;;;22875:10;;;;;;;;;-1:-1:-1::0;;;;;22875:10:0::1;-1:-1:-1::0;;;;;22875:18:0::1;;:20;;;;;;;;;;;;;;;;;;;;;;5:9:-1;2:2;;;27:1;24::::0;17:12:::1;2:2;22875:20:0;;;;8:9:-1;5:2;;;45:16;42:1;39::::0;24:38:::1;77:16;74:1;67:27;5:2;22875:20:0;;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28::::0;21:12:::1;4:2;-1:-1:::0;22875:20:0;22858:14:::1;:37:::0;22917:32:::1;::::0;;22929:10:::1;22917:32:::0;;22875:20:::1;22917:32:::0;::::1;::::0;;;;;::::1;::::0;;;;;;;;;::::1;22021:940;;;24814:7:::2;::::0;24809:36:::2;::::0;24814:7:::2;;24824:20;:18;:20::i;:::-;24823:21;24809:4;:36::i;:::-;24801:99;;;;-1:-1:-1::0;;;24801:99:0::2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;24925:1;24919:3;:7;24911:75;;;;-1:-1:-1::0;;;24911:75:0::2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;24997:13;25013:14;25023:3;25013:9;:14::i;:::-;24997:30;;25054:1;25046:5;:9;25038:71;;;;-1:-1:-1::0;;;25038:71:0::2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;25130:12;;;;;;;;;-1:-1:-1::0;;;;;25130:12:0::2;-1:-1:-1::0;;;;;25130:18:0::2;;:20;;;;;;;;;;;;;;;;;;;;;;5:9:-1;2:2;;;27:1;24::::0;17:12:::2;2:2;25130:20:0;;;;8:9:-1;5:2;;;45:16;42:1;39::::0;24:38:::2;77:16;74:1;67:27;5:2;25130:20:0;;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28::::0;21:12:::2;4:2;-1:-1:::0;25130:20:0;25184:12:::2;::::0;25130:73:::2;::::0;;-1:-1:-1;;;25130:73:0;;25164:10:::2;25130:73;::::0;::::2;::::0;-1:-1:-1;;;;;25184:12:0;;::::2;25130:73:::0;;;;;;;;;;;;:33;;;::::2;::::0;::::2;::::0;:73;;;;;:20:::2;::::0;:73;;;;;;;25184:12:::2;25130:33:::0;:73;::::2;;2:2:-1::0;::::2;;;27:1;24::::0;17:12:::2;2:2;25130:73:0;;;;8:9:-1;5:2;;;45:16;42:1;39::::0;24:38:::2;77:16;74:1;67:27;5:2;25130:73:0;;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28::::0;21:12:::2;4:2;-1:-1:::0;25130:73:0;25122:147:::2;;;;-1:-1:-1::0;;;25122:147:0::2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;25280:10;::::0;:34:::2;::::0;;-1:-1:-1;;;25280:34:0;;25296:10:::2;25280:34;::::0;::::2;::::0;;;;;;;;;-1:-1:-1;;;;;25280:10:0;;::::2;::::0;:15:::2;::::0;:34;;;;;:10:::2;::::0;:34;;;;;;;;:10;;:34;::::2;;2:2:-1::0;::::2;;;27:1;24::::0;17:12:::2;2:2;25280:34:0;;;;8:9:-1;5:2;;;45:16;42:1;39::::0;24:38:::2;77:16;74:1;67:27;5:2;-1:-1:::0;;25390:10:0::2;25370:31;::::0;;;:19:::2;:31;::::0;;;;;25361:48:::2;::::0;-1:-1:-1;25370:31:0;-1:-1:-1;25403:5:0;25361:8:::2;:48::i;:::-;25347:10;25327:31;::::0;;;:19:::2;:31;::::0;;;;:82;25444:12:::2;::::0;25435:29:::2;::::0;25458:5;25435:8:::2;:29::i;:::-;25420:12;:44:::0;25482:28:::2;::::0;;;;;::::2;::::0;::::2;::::0;;;;;25487:10:::2;::::0;25482:28:::2;::::0;;;;;;::::2;-1:-1:-1::0;23039:10:0::1;23019:31;::::0;;;:19:::1;:31;::::0;;;;;23052:17:::1;::::0;-1:-1:-1;;;13905:8:0;23010:60:::1;::::0;:8:::1;:60::i;:::-;:66;;;;;22996:10;22985:22;::::0;;;:10:::1;:22;::::0;;;;23010:66;;;::::1;22985:91:::0;;;2406:1;3368:22;;-1:-1:-1;24730:788:0:o;23162:57::-;2450:1;3056:7;;:19;;3048:63;;;;;-1:-1:-1;;;3048:63:0;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;3048:63:0;;;;;;;;;;;;;;;2450:1;3189:7;:18;21996:12:::1;:10;:12::i;:::-;22045:10;22059:1;22025:31:::0;;;:19:::1;:31;::::0;;;;;:35;;;;:63:::1;;-1:-1:-1::0;22064:10:0::1;::::0;:20:::1;::::0;;-1:-1:-1;;;22064:20:0;;;;22087:1:::1;::::0;-1:-1:-1;;;;;22064:10:0::1;::::0;:18:::1;::::0;:20:::1;::::0;;::::1;::::0;::::1;::::0;;;;;;;;:10;:20;::::1;;2:2:-1::0;::::1;;;27:1;24::::0;17:12:::1;2:2;22064:20:0;;;;8:9:-1;5:2;;;45:16;42:1;39::::0;24:38:::1;77:16;74:1;67:27;5:2;22064:20:0;;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28::::0;21:12:::1;4:2;-1:-1:::0;22064:20:0;:24:::1;22025:63;22021:940;;;22193:10;22137:15;22173:31:::0;;;:19:::1;:31;::::0;;;;;22206:17:::1;::::0;22155:100:::1;::::0;-1:-1:-1;;;13905:8:0;22164:60:::1;::::0;22173:31;22164:8:::1;:60::i;22155:100::-;22318:6;::::0;22341:12:::1;::::0;22137:118;;-1:-1:-1;22272:14:0::1;::::0;22305:54:::1;::::0;-1:-1:-1;;;;;22318:6:0::1;22310:29:::0;::::1;::::0;22341:17;22305:4:::1;:54::i;:::-;22301:468;;;22425:3;22387:35;22396:7;22405:16;;22387:8;:35::i;:::-;:41;;;;;22451:6;::::0;:40:::1;::::0;;-1:-1:-1;;;22451:40:0;;22472:10:::1;22451:40;::::0;::::1;::::0;22387:41;;;::::1;22451:40:::0;;;;;;;;22387:41;;-1:-1:-1;;;;;;22451:6:0::1;::::0;:20:::1;::::0;:40;;;;;:6:::1;::::0;:40;;;;;;;:6;;:40;::::1;;2:2:-1::0;::::1;;;27:1;24::::0;17:12:::1;2:2;22451:40:0;;;;;;;;;;;;;;22447:307;;;::::0;14:27:-1;;::::1;;67:4;61:11;56:16;;134:4;130:9;123:4;105:16;101:27;97:43;94:1;90:51;84:4;77:65;157:16;154:1;147:27;211:16;208:1;201:4;198:1;194:12;179:49;5:228;;14:27;32:4;27:9;;5:228;;22705:31:0;22723:12;22705:31;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23:1:-1;8:100;33:3;30:1;27:10;8:100;;;90:11:::0;;::::1;84:18:::0;71:11;;::::1;64:39:::0;52:2:::1;45:10;8:100;;;12:14;22705:31:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;22648:106;22447:307;;;22511:10;::::0;22539:6:::1;::::0;22511:44:::1;::::0;;-1:-1:-1;;;22511:44:0;;-1:-1:-1;;;;;22539:6:0;;::::1;22511:44;::::0;::::1;::::0;;;;;;;;;:10;;;::::1;::::0;:19:::1;::::0;:44;;;;;:10:::1;::::0;:44;;;;;;;:10;;:44;::::1;;2:2:-1::0;::::1;;;27:1;24::::0;17:12:::1;2:2;22511:44:0;;;;8:9:-1;5:2;;;45:16;42:1;39::::0;24:38:::1;77:16;74:1;67:27;5:2;-1:-1:::0;;22601:6:0::1;::::0;22579:50:::1;::::0;;-1:-1:-1;;;;;22601:6:0;;::::1;22579:50:::0;;22610:10:::1;22579:50;::::0;::::1;::::0;;;;;;;;::::1;::::0;-1:-1:-1;22579:50:0;;;;;;;-1:-1:-1;22579:50:0::1;22447:307;22785:10;::::0;-1:-1:-1;;;;;22785:10:0::1;:19;22805:10;22817:25;22826:7:::0;22835:6;22817:8:::1;:25::i;:::-;22785:58;;;;;;;;;;;;;-1:-1:-1::0;;;;;22785:58:0::1;-1:-1:-1::0;;;;;22785:58:0::1;;;;;;;;;;;;;;;;;;;;;;;;;;5:9:-1;2:2;;;27:1;24::::0;17:12:::1;2:2;22785:58:0;;;;8:9:-1;5:2;;;45:16;42:1;39::::0;24:38:::1;77:16;74:1;67:27;5:2;22785:58:0;;;;22875:10;;;;;;;;;-1:-1:-1::0;;;;;22875:10:0::1;-1:-1:-1::0;;;;;22875:18:0::1;;:20;;;;;;;;;;;;;;;;;;;;;;5:9:-1;2:2;;;27:1;24::::0;17:12:::1;2:2;22875:20:0;;;;8:9:-1;5:2;;;45:16;42:1;39::::0;24:38:::1;77:16;74:1;67:27;5:2;22875:20:0;;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28::::0;21:12:::1;4:2;-1:-1:::0;22875:20:0;22858:14:::1;:37:::0;22917:32:::1;::::0;;22929:10:::1;22917:32:::0;;22875:20:::1;22917:32:::0;::::1;::::0;;;;;::::1;::::0;;;;;;;;;::::1;22021:940;;;23039:10;23019:31;::::0;;;:19:::1;:31;::::0;;;;;23052:17:::1;::::0;-1:-1:-1;;;13905:8:0;23010:60:::1;::::0;:8:::1;:60::i;:::-;:66;;;;;22996:10;22985:22;::::0;;;:10:::1;:22;::::0;;;;23010:66;;;::::1;22985:91:::0;;;2406:1;3368:22;;23162:57::o;8219:29::-;;;;:::o;15099:157::-;6505:10;6486:30;;;;:18;:30;;;;;;;;;:35;6478:104;;;;-1:-1:-1;;;6478:104:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;15182:14:::1;::::0;;::::1;;::::0;;::::1;::::0;::::1;15181:15;15164:32:::0;::::1;-1:-1:-1::0;;15164:32:0;;::::1;::::0;;;::::1;::::0;;;;15212:36:::1;::::0;;15233:14;;;::::1;;15212:36;;::::0;;;;::::1;::::0;;;;::::1;::::0;;::::1;15099:157::o:0;18780:::-;18834:7;18861:12;;18877:1;18861:17;:68;;18887:42;18895:12;;18909:19;:17;:19::i;:::-;18887:7;:42::i;:::-;18861:68;;;13860:8;18861:68;18854:75;;18780:157;;:::o;7949:31::-;;;;:::o;7485:38::-;;;;:::o;7585:32::-;;;;:::o;7092:27::-;;;;;;;;;:::o;5738:51::-;;;;;;;;;;;;;:::o;7255:26::-;;;;:::o;14863:116::-;6505:10;6486:30;;;;:18;:30;;;;;;;;;:35;6478:104;;;;-1:-1:-1;;;6478:104:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;14929:7:::1;::::0;;-1:-1:-1;;14918:18:0;::::1;14929:7;::::0;;::::1;14928:8;14918:18;::::0;;;;14952:19:::1;::::0;;14963:7;;;::::1;14952:19;;::::0;;;::::1;::::0;;;;::::1;::::0;;::::1;14863:116::o:0;7836:34::-;;;;:::o;20987:534::-;21092:17;;21139:15;;21046:7;;21092:17;21124:12;:30;:51;;;;-1:-1:-1;21158:12:0;;:17;;21124:51;21120:287;;;21252:13;;:30;;;-1:-1:-1;;;21252:30:0;;;;21192:22;;-1:-1:-1;;;;;21252:13:0;;:28;;:30;;;;;;;;;;;;;;:13;:30;;;2:2:-1;;;;27:1;24;17:12;2:2;21252:30:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;21252:30:0;;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;21252:30:0;21233:15;;21382:12;;21218;:30;;;;21217:65;;;;-1:-1:-1;21318:77:0;;21327:18;;21347:32;21217:65;-1:-1:-1;;;21347:8:0;:32::i;:::-;:47;;;;;;21318:8;:77::i;:::-;21297:98;;21120:287;;-1:-1:-1;;;;;21442:25:0;;;;;;:19;:25;;;;;;21424:89;;-1:-1:-1;;;13905:8:0;21433:55;;21469:18;21433:8;:55::i;:::-;:61;;;;;-1:-1:-1;;;;;21496:16:0;;;;;;:10;:16;;;;;;21433:61;;;;21424:8;:89::i;:::-;21417:96;20987:534;-1:-1:-1;;;20987:534:0:o;5899:164::-;6505:10;6486:30;;;;:18;:30;;;;;;;;;:35;6478:104;;;;-1:-1:-1;;;6478:104:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;5983:27:0;::::1;;::::0;;;6013:1:::1;5983:27;::::0;;;;;;;;:31;;;;6030:25;;;;;;;::::1;::::0;;;;;;;;::::1;5899:164:::0;:::o;7706:37::-;;;;:::o;9409:34::-;;;:::o;8383:51::-;;;;;;;;;;;;;;;;;;;:::o;13875:38::-;-1:-1:-1;;;13875:38:0;:::o;9232:45::-;;;-1:-1:-1;;;;;9232:45:0;;:::o;15370:137::-;6505:10;6486:30;;;;:18;:30;;;;;;;;;:35;6478:104;;;;-1:-1:-1;;;6478:104:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;15445:10:::1;::::0;;::::1;::::0;;;::::1;::::0;::::1;15444:11;15431:24:::0;::::1;-1:-1:-1::0;;15431:24:0;;::::1;::::0;;;::::1;::::0;;;;15471:28:::1;::::0;;15488:10;;;::::1;;15471:28;;::::0;;;;::::1;::::0;;;;::::1;::::0;;::::1;15370:137::o:0;20309:285::-;20358:4;20382:204;20399:99;20404:20;:18;:20::i;:::-;20478:19;:17;:19::i;:::-;20426:48;20435:21;;20458:15;;20426:8;:48::i;:::-;:71;;20399:4;:99::i;:::-;20554:21;;20511:12;;;;;;;;;-1:-1:-1;;;;;20511:12:0;-1:-1:-1;;;;;20511:38:0;;:40;;;;;;;;;;;;;;;;;;;;;;5:9:-1;2:2;;;27:1;24;17:12;2:2;20511:40:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;20511:40:0;;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;20511:40:0;:64;20382:4;:204::i;8301:57::-;;;;;;;;;;;;;:::o;17431:756::-;6505:10;6486:30;;;;:18;:30;;;;;;;;;:35;6478:104;;;;-1:-1:-1;;;6478:104:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;17531:18:0;::::1;17523:74;;;;-1:-1:-1::0;;;17523:74:0::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;17614:9;-1:-1:-1::0;;;17614:27:0::1;17610:520;;;17656:12;:37:::0;;-1:-1:-1;;;;;;17656:37:0::1;-1:-1:-1::0;;;;;17656:37:0;::::1;;::::0;;17610:520:::1;;;17724:9;-1:-1:-1::0;;;17724:31:0::1;17720:410;;;17770:16;:45:::0;;-1:-1:-1;;;;;;17770:45:0::1;-1:-1:-1::0;;;;;17770:45:0;::::1;;::::0;;17720:410:::1;;;17846:9;-1:-1:-1::0;;;17846:28:0::1;17842:288;;;17889:13;:39:::0;;-1:-1:-1;;;;;;17889:39:0::1;-1:-1:-1::0;;;;;17889:39:0;::::1;;::::0;;17842:288:::1;;;17959:9;-1:-1:-1::0;;;17959:21:0::1;17955:175;;;17995:6;:39:::0;;-1:-1:-1;;;;;;17995:39:0::1;-1:-1:-1::0;;;;;17995:39:0;::::1;;::::0;;17955:175:::1;;;18061:69;;-1:-1:-1::0;;;18061:69:0::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;17955:175;18146:33;::::0;;-1:-1:-1;;;;;18146:33:0;::::1;::::0;;;;18163:9;;18146:33:::1;::::0;;;;;::::1;::::0;;::::1;17431:756:::0;;:::o;8810:42::-;;;-1:-1:-1;;;;;8810:42:0;;:::o;9147:::-;;;-1:-1:-1;;;;;9147:42:0;;:::o;13830:38::-;13860:8;13830:38;:::o;19560:127::-;19613:7;19640:39;19650:3;19655:23;:21;:23::i;:::-;19640:9;:39::i;:::-;19633:46;19560:127;-1:-1:-1;;19560:127:0:o;25659:555::-;2450:1;3056:7;;:19;;3048:63;;;;;-1:-1:-1;;;3048:63:0;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;3048:63:0;;;;;;;;;;;;;;;2450:1;3189:7;:18;21996:12:::1;:10;:12::i;:::-;22045:10;22059:1;22025:31:::0;;;:19:::1;:31;::::0;;;;;:35;;;;:63:::1;;-1:-1:-1::0;22064:10:0::1;::::0;:20:::1;::::0;;-1:-1:-1;;;22064:20:0;;;;22087:1:::1;::::0;-1:-1:-1;;;;;22064:10:0::1;::::0;:18:::1;::::0;:20:::1;::::0;;::::1;::::0;::::1;::::0;;;;;;;;:10;:20;::::1;;2:2:-1::0;::::1;;;27:1;24::::0;17:12:::1;2:2;22064:20:0;;;;8:9:-1;5:2;;;45:16;42:1;39::::0;24:38:::1;77:16;74:1;67:27;5:2;22064:20:0;;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28::::0;21:12:::1;4:2;-1:-1:::0;22064:20:0;:24:::1;22025:63;22021:940;;;22193:10;22137:15;22173:31:::0;;;:19:::1;:31;::::0;;;;;22206:17:::1;::::0;22155:100:::1;::::0;-1:-1:-1;;;13905:8:0;22164:60:::1;::::0;22173:31;22164:8:::1;:60::i;22155:100::-;22318:6;::::0;22341:12:::1;::::0;22137:118;;-1:-1:-1;22272:14:0::1;::::0;22305:54:::1;::::0;-1:-1:-1;;;;;22318:6:0::1;22310:29:::0;::::1;::::0;22341:17;22305:4:::1;:54::i;:::-;22301:468;;;22425:3;22387:35;22396:7;22405:16;;22387:8;:35::i;:::-;:41;;;;;22451:6;::::0;:40:::1;::::0;;-1:-1:-1;;;22451:40:0;;22472:10:::1;22451:40;::::0;::::1;::::0;22387:41;;;::::1;22451:40:::0;;;;;;;;22387:41;;-1:-1:-1;;;;;;22451:6:0::1;::::0;:20:::1;::::0;:40;;;;;:6:::1;::::0;:40;;;;;;;:6;;:40;::::1;;2:2:-1::0;::::1;;;27:1;24::::0;17:12:::1;2:2;22451:40:0;;;;;;;;;;;;;;22447:307;;;::::0;14:27:-1;;::::1;;67:4;61:11;56:16;;134:4;130:9;123:4;105:16;101:27;97:43;94:1;90:51;84:4;77:65;157:16;154:1;147:27;211:16;208:1;201:4;198:1;194:12;179:49;5:228;;14:27;32:4;27:9;;5:228;;22705:31:0;22723:12;22705:31;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23:1:-1;8:100;33:3;30:1;27:10;8:100;;;90:11:::0;;::::1;84:18:::0;71:11;;::::1;64:39:::0;52:2:::1;45:10;8:100;;;12:14;22705:31:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;22648:106;22447:307;;;22511:10;::::0;22539:6:::1;::::0;22511:44:::1;::::0;;-1:-1:-1;;;22511:44:0;;-1:-1:-1;;;;;22539:6:0;;::::1;22511:44;::::0;::::1;::::0;;;;;;;;;:10;;;::::1;::::0;:19:::1;::::0;:44;;;;;:10:::1;::::0;:44;;;;;;;:10;;:44;::::1;;2:2:-1::0;::::1;;;27:1;24::::0;17:12:::1;2:2;22511:44:0;;;;8:9:-1;5:2;;;45:16;42:1;39::::0;24:38:::1;77:16;74:1;67:27;5:2;-1:-1:::0;;22601:6:0::1;::::0;22579:50:::1;::::0;;-1:-1:-1;;;;;22601:6:0;;::::1;22579:50:::0;;22610:10:::1;22579:50;::::0;::::1;::::0;;;;;;;;::::1;::::0;-1:-1:-1;22579:50:0;;;;;;;-1:-1:-1;22579:50:0::1;22447:307;22785:10;::::0;-1:-1:-1;;;;;22785:10:0::1;:19;22805:10;22817:25;22826:7:::0;22835:6;22817:8:::1;:25::i;:::-;22785:58;;;;;;;;;;;;;-1:-1:-1::0;;;;;22785:58:0::1;-1:-1:-1::0;;;;;22785:58:0::1;;;;;;;;;;;;;;;;;;;;;;;;;;5:9:-1;2:2;;;27:1;24::::0;17:12:::1;2:2;22785:58:0;;;;8:9:-1;5:2;;;45:16;42:1;39::::0;24:38:::1;77:16;74:1;67:27;5:2;22785:58:0;;;;22875:10;;;;;;;;;-1:-1:-1::0;;;;;22875:10:0::1;-1:-1:-1::0;;;;;22875:18:0::1;;:20;;;;;;;;;;;;;;;;;;;;;;5:9:-1;2:2;;;27:1;24::::0;17:12:::1;2:2;22875:20:0;;;;8:9:-1;5:2;;;45:16;42:1;39::::0;24:38:::1;77:16;74:1;67:27;5:2;22875:20:0;;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28::::0;21:12:::1;4:2;-1:-1:::0;22875:20:0;22858:14:::1;:37:::0;22917:32:::1;::::0;;22929:10:::1;22917:32:::0;;22875:20:::1;22917:32:::0;::::1;::::0;;;;;::::1;::::0;;;;;;;;;::::1;22021:940;;;25748:1:::2;25742:3;:7;25734:73;;;;-1:-1:-1::0;;;25734:73:0::2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;25861:24;25870:3;25875:9;;25861:8;:24::i;:::-;25833:10;25820:24;::::0;;;:12:::2;:24;::::0;;;;:65;;;25946:37:::2;;::::0;25937:52:::2;::::0;25985:3;25937:8:::2;:52::i;:::-;25909:10;25896:24;::::0;;;:12:::2;:24;::::0;;;;;;;:37:::2;;:93:::0;;;;26045:19:::2;:31:::0;;;;26036:46:::2;::::0;26078:3;26036:8:::2;:46::i;:::-;26022:10;26002:31;::::0;;;:19:::2;:31;::::0;;;;;:80;;;;26093:10:::2;::::0;:32;;-1:-1:-1;;;26093:32:0;;::::2;::::0;::::2;::::0;;;;;;;;;;;;-1:-1:-1;;;;;26093:10:0;;::::2;::::0;:15:::2;::::0;:32;;;;;26002:31;26093:32;;;;;;26002:31;26093:10;:32;::::2;;2:2:-1::0;::::2;;;27:1;24::::0;17:12:::2;2:2;26093:32:0;;;;8:9:-1;5:2;;;45:16;42:1;39::::0;24:38:::2;77:16;74:1;67:27;5:2;-1:-1:::0;;26155:10:0::2;26167:24;::::0;;;:12:::2;:24;::::0;;;;;;;;:33;26143:63;;;;;;;::::2;::::0;;;;;26155:10;;-1:-1:-1;26143:63:0::2;::::0;-1:-1:-1;26143:63:0;;;;;::::2;23039:10:::1;23019:31;::::0;;;:19:::1;:31;::::0;;;;;23052:17:::1;::::0;-1:-1:-1;;;13905:8:0;23010:60:::1;::::0;:8:::1;:60::i;7380:38::-:0;;;;:::o;19776:352::-;19827:4;19844:31;19878:16;;;;;;;;;-1:-1:-1;;;;;19878:16:0;-1:-1:-1;;;;;19878:40:0;;:42;;;;;;;;;;;;;;;;;;;;;;5:9:-1;2:2;;;27:1;24;17:12;2:2;19878:42:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;19878:42:0;;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;19878:42:0;19957:16;;:37;;;-1:-1:-1;;;19957:37:0;;;;19878:42;;-1:-1:-1;19940:180:0;;19878:42;;-1:-1:-1;;;;;19957:16:0;;:35;;:37;;;;;19878:42;;19957:37;;;;;;;:16;:37;;;2:2:-1;;;;27:1;24;17:12;2:2;19957:37:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;19957:37:0;;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;19957:37:0;20034:10;;20065:16;;20034:49;;;-1:-1:-1;;;20034:49:0;;-1:-1:-1;;;;;20065:16:0;;;20034:49;;;;;;19957:64;;;;;;20086:23;;20034:10;;;;;:22;;:49;;;;;19957:37;;20034:49;;;;;;;;:10;:49;;;2:2:-1;;;;27:1;24;17:12;19940:180:0;19933:187;;;19776:352;:::o;21624:173::-;21667:7;21691:12;;21707:1;21691:17;21687:31;;;-1:-1:-1;21717:1:0;21710:8;;21687:31;21777:12;;21737:13;;:30;;;-1:-1:-1;;;21737:30:0;;;;13860:8;;-1:-1:-1;;;;;21737:13:0;;:28;;:30;;;;;;;;;;;;;;:13;:30;;;2:2:-1;;;;27:1;24;17:12;2:2;21737:30:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;21737:30:0;;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;21737:30:0;:36;21736:53;;;;;;21729:60;;21624:173;:::o;18516:157::-;18570:7;18597:12;;18613:1;18597:17;:68;;18623:42;18631:19;:17;:19::i;:::-;18652:12;;18623:7;:42::i;8135:33::-;;;;:::o;6182:170::-;6505:10;6486:30;;;;:18;:30;;;;;;;;;:35;6478:104;;;;-1:-1:-1;;;6478:104:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;6269:27:0;::::1;6299:1;6269:27:::0;;;:18:::1;:27;::::0;;;;;;;:31;;;;6316:28;;;;;;;::::1;::::0;;;;;;;;::::1;6182:170:::0;:::o;9059:48::-;;;-1:-1:-1;;;;;9059:48:0;;:::o;24110:504::-;2450:1;3056:7;;:19;;3048:63;;;;;-1:-1:-1;;;3048:63:0;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;3048:63:0;;;;;;;;;;;;;;;2450:1;3189:7;:18;24184::::1;:16;:18::i;:::-;24176:86;;;;-1:-1:-1::0;;;24176:86:0::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;24275:12;::::0;24312:15:::1;::::0;24275:53:::1;::::0;;-1:-1:-1;;;24275:53:0;;24305:4:::1;24275:53;::::0;::::1;::::0;;;;;;;;;-1:-1:-1;;;;;24275:12:0;;::::1;::::0;:21:::1;::::0;:53;;;;;:12:::1;::::0;:53;;;;;;;;:12;;:53;::::1;;2:2:-1::0;::::1;;;27:1;24::::0;17:12:::1;2:2;24275:53:0;;;;8:9:-1;5:2;;;45:16;42:1;39::::0;24:38:::1;77:16;74:1;67:27;5:2;24275:53:0;;;;24339:12;;;;;;;;;-1:-1:-1::0;;;;;24339:12:0::1;-1:-1:-1::0;;;;;24339:18:0::1;;:20;;;;;;;;;;;;;;;;;;;;;;5:9:-1;2:2;;;27:1;24::::0;17:12:::1;2:2;24339:20:0;;;;8:9:-1;5:2;;;45:16;42:1;39::::0;24:38:::1;77:16;74:1;67:27;5:2;24339:20:0;;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28::::0;21:12:::1;4:2;-1:-1:::0;24339:20:0;24376:12:::1;::::0;24391:15:::1;::::0;24339:68:::1;::::0;;-1:-1:-1;;;24339:68:0;;-1:-1:-1;;;;;24376:12:0;;::::1;24339:68;::::0;::::1;::::0;;;;;;;;;:28;;;::::1;::::0;::::1;::::0;:68;;;;;:20:::1;::::0;:68;;;;;;;24376:12:::1;24339:28:::0;:68;::::1;;2:2:-1::0;::::1;;;27:1;24::::0;17:12:::1;2:2;24339:68:0;;;;8:9:-1;5:2;;;45:16;42:1;39::::0;24:38:::1;77:16;74:1;67:27;5:2;24339:68:0;;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28::::0;21:12:::1;4:2;-1:-1:::0;;24418:12:0::1;::::0;24444:15:::1;::::0;24461:20:::1;::::0;24418:64:::1;::::0;;-1:-1:-1;;;24418:64:0;;::::1;::::0;::::1;::::0;;;;;;;;;;;;-1:-1:-1;;;;;24418:12:0;;::::1;::::0;:25:::1;::::0;:64;;;;;24339:68:::1;::::0;24418:64;;;;;;;;:12:::1;::::0;:64;::::1;;2:2:-1::0;::::1;;;27:1;24::::0;17:12:::1;2:2;24418:64:0;;;;8:9:-1;5:2;;;45:16;42:1;39::::0;24:38:::1;77:16;74:1;67:27;5:2;24418:64:0;;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28::::0;21:12:::1;4:2;-1:-1:::0;24493:12:0::1;::::0;-1:-1:-1;24493:10:0::1;:12::i;:::-;24553;::::0;24568:15:::1;::::0;24585:20:::1;::::0;24523:83:::1;::::0;;-1:-1:-1;;;;;24553:12:0;;::::1;24523:83:::0;;::::1;::::0;::::1;::::0;;;;;;;;;::::1;::::0;;;;;;;::::1;2406:1:::0;3368:7;:22;24110:504::o;6870:24::-;;;;;;:::o;7170:32::-;;;;:::o;8721:44::-;;;-1:-1:-1;;;;;8721:44:0;;:::o;18302:107::-;18379:12;;:22;;;-1:-1:-1;;;18379:22:0;;;;18352:7;;-1:-1:-1;;;;;18379:12:0;;:20;;:22;;;;;;;;;;;;;;:12;:22;;;2:2:-1;;;;27:1;24;17:12;2:2;18379:22:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;18379:22:0;;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;18379:22:0;;-1:-1:-1;18302:107:0;:::o;6998:31::-;;;;;;;;;:::o;20689:216::-;20744:4;20768:129;20786:18;:16;:18::i;:::-;20785:19;20817:69;20824:12;;;;;;;;;-1:-1:-1;;;;;20824:12:0;-1:-1:-1;;;;;20824:38:0;;:40;;;;;;;;;;;;;;;;;;;;;;5:9:-1;2:2;;;27:1;24;17:12;2:2;20824:40:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;20824:40:0;;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;20824:40:0;20871:14;;20824:45;;;20871:14;;;;;20817:6;:69::i;:::-;20768:4;:129::i;8041:29::-;;;;:::o;8884:42::-;;;-1:-1:-1;;;;;8884:42:0;;:::o;9311:38::-;;;-1:-1:-1;;;;;9311:38:0;;:::o;23435:559::-;23495:15;;23479:12;:31;23475:44;;23512:7;;23475:44;23547:12;23529:15;:30;23574:12;;23570:30;;23593:7;;23570:30;23612:11;:9;:11::i;:::-;23634:25;23662:46;23671:10;;;;;;;;;-1:-1:-1;;;;;23671:10:0;-1:-1:-1;;;;;23671:18:0;;:20;;;;;;;;;;;;;;;;;;;;;;5:9:-1;2:2;;;27:1;24;17:12;2:2;23671:20:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;23671:20:0;;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;23671:20:0;23693:14;;23662:8;:46::i;:::-;23634:74;;23736:43;23745:14;;23761:17;23736:8;:43::i;:::-;23719:14;:60;23859:17;;23913:12;;23850:76;;23859:17;23878:32;23887:17;-1:-1:-1;;;23878:8:0;:32::i;23850:76::-;23830:17;:96;;;23973:12;;23942:44;;;;;;;;;;;;;;;;;;;;;;;;;23435:559;;:::o;23286:92::-;23325:13;;23358:10;;23325:45;;;-1:-1:-1;;;23325:45:0;;-1:-1:-1;;;;;23358:10:0;;;23325:45;;;;;;:13;;;;;:24;;:45;;;;;:13;;:45;;;;;;;:13;;:45;;;2:2:-1;;;;27:1;24;17:12;2:2;23325:45:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;23325:45:0;;;;23286:92::o;26272:653::-;2450:1;3056:7;;:19;;3048:63;;;;;-1:-1:-1;;;3048:63:0;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;3048:63:0;;;;;;;;;;;;;;;2450:1;3189:7;:18;;;26354:10:::1;26341:24:::0;;:12:::1;:24;::::0;;;;:33;;26376:37:::1;::::0;;::::1;::::0;26329:89:::1;::::0;26334:3:::1;:40;;::::0;26376:41;;26329:4:::1;:89::i;:::-;26321:145;;;;-1:-1:-1::0;;;26321:145:0::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;26485:41;26493:20;:18;:20::i;:::-;26515:10;::::0;26492:21;::::1;::::0;26515:10;;::::1;;;26485:6;:41::i;:::-;26477:104;;;;-1:-1:-1::0;;;26477:104:0::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;26633:10;26594:13;26620:24:::0;;;:12:::1;:24;::::0;;;;:37:::1;;::::0;26610:48:::1;::::0;:9:::1;:48::i;:::-;26694:12;::::0;26721:10:::1;26708:24;::::0;;;:12:::1;:24;::::0;;;;:37:::1;;::::0;26594:64;;-1:-1:-1;26685:61:0::1;::::0;:8:::1;:61::i;:::-;26669:12;:77:::0;26757:12:::1;::::0;:40:::1;::::0;;-1:-1:-1;;;26757:40:0;;26779:10:::1;26757:40;::::0;::::1;::::0;;;;;;;;;-1:-1:-1;;;;;26757:12:0;;::::1;::::0;:21:::1;::::0;:40;;;;;:12:::1;::::0;:40;;;;;;;;:12;;:40;::::1;;2:2:-1::0;::::1;;;27:1;24::::0;17:12:::1;2:2;26757:40:0;;;;8:9:-1;5:2;;;45:16;42:1;39::::0;24:38:::1;77:16;74:1;67:27;5:2;-1:-1:::0;;26818:10:0::1;26837:24;::::0;;;:12:::1;:24;::::0;;;;;;;;:37:::1;;::::0;26813:62;;;;;;;::::1;::::0;;;26818:10;;-1:-1:-1;26813:62:0::1;::::0;-1:-1:-1;26813:62:0;;;;;::::1;-1:-1:-1::0;26906:10:0::1;26893:24;::::0;;;:12:::1;:24;::::0;;;;26886:31;;;::::1;::::0;;::::1;::::0;;;3368:22;;26272:653::o;19185:127::-;19238:7;19265:39;19275:3;19280:23;:21;:23::i;8973:44::-;;;-1:-1:-1;;;;;8973:44:0;;:::o;15679:1580::-;6505:10;6486:30;;;;:18;:30;;;;;;;;;:35;6478:104;;;;-1:-1:-1;;;6478:104:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;15775:9:::1;-1:-1:-1::0;;;15775:24:0::1;15771:1431;;;15830:9;15822:4;:17;;15814:82;;;;-1:-1:-1::0;;;15814:82:0::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;15909:9;:16:::0;;;15771:1431:::1;;;15956:9;-1:-1:-1::0;;;15956:36:0::1;15952:1250;;;16022:1;16015:4;:8;16007:77;;;;-1:-1:-1::0;;;16007:77:0::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;16097:21;:28:::0;;;15952:1250:::1;;;16156:9;-1:-1:-1::0;;;16156:30:0::1;16152:1050;;;16216:1;16209:4;:8;16201:80;;;;-1:-1:-1::0;;;16201:80:0::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;16294:15;:22:::0;;;16152:1050:::1;;;16347:9;-1:-1:-1::0;;;16347:35:0::1;16343:859;;;16412:1;16405:4;:8;16397:83;;;;-1:-1:-1::0;;;16397:83:0::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;16493:20;:27:::0;;;16343:859:::1;;;16551:9;-1:-1:-1::0;;;16551:36:0::1;16547:655;;;16617:1;16610:4;:8;16602:86;;;;-1:-1:-1::0;;;16602:86:0::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;16701:21;:28:::0;;;16547:655:::1;;;16760:9;-1:-1:-1::0;;;16760:27:0::1;16756:446;;;16818:1;16810:4;:9;;16802:77;;;;-1:-1:-1::0;;;16802:77:0::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;16892:12;:19:::0;;;16756:446:::1;;;16942:9;-1:-1:-1::0;;;16942:31:0::1;16938:264;;;17003:3;16996:4;:10;16988:82;;;;-1:-1:-1::0;;;16988:82:0::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;17083:16;:23:::0;;;16938:264:::1;17218:33;::::0;;;;;;;17235:9;;17218:33:::1;::::0;;;;;::::1;::::0;;::::1;15679:1580:::0;;:::o;14271:173::-;14328:6;14355;;;:30;;-1:-1:-1;;14370:5:0;;;14384:1;14379;14370:5;14379:1;14365:15;;;;;:20;14355:30;14347:89;;;;-1:-1:-1;;;14347:89:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;14096:169;14194:5;;;14189:16;;;;14181:76;;;;-1:-1:-1;;;14181:76:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;13586:104;13673:9;;13666:17::o;13922:168::-;14020:5;;;14015:16;;;;14007:75;;;;-1:-1:-1;;;14007:75:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;14450:182;14506:6;14537:1;14533;:5;14525:64;;;;-1:-1:-1;;;14525:64:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;14623:1;14604:16;14613:1;13860:8;14604;:16::i;:::-;:20;;;;;;;14450:182;-1:-1:-1;;;14450:182:0:o;14638:109::-;14696:6;13860:8;14719:14;14728:1;14731;14719:8;:14::i;13696:105::-;13785:8;;13778:16::o

Swarm Source

ipfs://bde6a006d3fd32aba7bbfc2a86ae454f8041e58d11433384b9f9eff60effe7d5

Block Transaction Difficulty Gas Used Reward
View All Blocks Produced

Block Uncle Number Difficulty Gas Used Reward
View All Uncles
Loading...
Loading
Loading...
Loading

Validator Index Block Amount
View All Withdrawals

Transaction Hash Block Value Eth2 PubKey Valid
View All Deposits
Loading...
Loading
[ Download: CSV Export  ]
[ Download: CSV Export  ]

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