ETH Price: $1,882.07 (-2.97%)
 

Overview

ETH Balance

0 ETH

Eth Value

$0.00

More Info

Private Name Tags

Multichain Info

No addresses found
Transaction Hash
Method
Block
From
To
Redeem Zc Token166623642023-02-19 11:33:471100 days ago1676806427IN
0x093e4D20...8EBCE08FA
0 ETH0.0043838120.15138044
Redeem Zc Token164749522023-01-24 6:42:591126 days ago1674542579IN
0x093e4D20...8EBCE08FA
0 ETH0.0037840717.7870042
Redeem Vault Int...162678642022-12-26 8:54:111155 days ago1672044851IN
0x093e4D20...8EBCE08FA
0 ETH0.0020375810.58607217
Redeem Zc Token162678632022-12-26 8:53:591155 days ago1672044839IN
0x093e4D20...8EBCE08FA
0 ETH0.0023820711.19629147
Redeem Vault Int...162678412022-12-26 8:49:351155 days ago1672044575IN
0x093e4D20...8EBCE08FA
0 ETH0.0023217312.06236489
Redeem Zc Token162678402022-12-26 8:49:231155 days ago1672044563IN
0x093e4D20...8EBCE08FA
0 ETH0.0023770211.17253946
Redeem Vault Int...162678202022-12-26 8:45:231155 days ago1672044323IN
0x093e4D20...8EBCE08FA
0 ETH0.0025570212.20083901
Redeem Zc Token162179302022-12-19 9:45:111162 days ago1671443111IN
0x093e4D20...8EBCE08FA
0 ETH0.0027931413.12913248
Redeem Zc Token162179252022-12-19 9:44:111162 days ago1671443051IN
0x093e4D20...8EBCE08FA
0 ETH0.0024267212.76791078
Redeem Vault Int...160964352022-12-02 10:09:591179 days ago1669975799IN
0x093e4D20...8EBCE08FA
0 ETH0.0023097312
Redeem Vault Int...160888992022-12-01 8:55:231180 days ago1669884923IN
0x093e4D20...8EBCE08FA
0 ETH0.0022133111.49902915
Redeem Zc Token160888982022-12-01 8:55:111180 days ago1669884911IN
0x093e4D20...8EBCE08FA
0 ETH0.0022837211.67213938
Redeem Vault Int...160888962022-12-01 8:54:471180 days ago1669884887IN
0x093e4D20...8EBCE08FA
0 ETH0.0025366712.44192067
Redeem Vault Int...160888942022-12-01 8:54:231180 days ago1669884863IN
0x093e4D20...8EBCE08FA
0 ETH0.0022473811.67604872
Redeem Zc Token160888932022-12-01 8:54:111180 days ago1669884851IN
0x093e4D20...8EBCE08FA
0 ETH0.0025000111.75060246
Redeem Vault Int...158508892022-10-29 2:59:351213 days ago1667012375IN
0x093e4D20...8EBCE08FA
0 ETH0.001347347
Redeem Vault Int...158508582022-10-29 2:53:231213 days ago1667012003IN
0x093e4D20...8EBCE08FA
0 ETH0.001347347
Redeem Zc Token158508582022-10-29 2:53:231213 days ago1667012003IN
0x093e4D20...8EBCE08FA
0 ETH0.001133887
Redeem Vault Int...158367562022-10-27 3:34:471215 days ago1666841687IN
0x093e4D20...8EBCE08FA
0 ETH0.001539828
Redeem Vault Int...158171882022-10-24 9:51:591218 days ago1666605119IN
0x093e4D20...8EBCE08FA
0 ETH0.0021001710.79902557
Redeem Vault Int...158170822022-10-24 9:30:351218 days ago1666603835IN
0x093e4D20...8EBCE08FA
0 ETH0.0021806411.32932722
Redeem Zc Token158170812022-10-24 9:30:231218 days ago1666603823IN
0x093e4D20...8EBCE08FA
0 ETH0.0020031910.2383367
Redeem Zc Token158169082022-10-24 8:55:471218 days ago1666601747IN
0x093e4D20...8EBCE08FA
0 ETH0.0023217510.91276232
Redeem Zc Token158169052022-10-24 8:55:111218 days ago1666601711IN
0x093e4D20...8EBCE08FA
0 ETH0.001928599.85705334
Redeem Zc Token158169002022-10-24 8:54:111218 days ago1666601651IN
0x093e4D20...8EBCE08FA
0 ETH0.001967110.05387576
View all transactions

View more zero value Internal Transactions in Advanced View mode

Advanced mode:
Loading...
Loading
Loading...
Loading
Cross-Chain Transactions

Block Transaction Difficulty Gas Used Reward
View All Blocks Produced

Validator Index Block Amount
View All Withdrawals

Transaction Hash Block Value Eth2 PubKey Valid
View All Deposits
Loading...
Loading

Contract Source Code Verified (Exact Match)

Contract Name:
Swivel

Compiler Version
v0.8.13+commit.abaa5c0e

Optimization Enabled:
Yes with 15000 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity Multiple files format)

File 1 of 5: Swivel.sol
// SPDX-License-Identifier: UNLICENSED

pragma solidity >= 0.8.4;

import './Interfaces.sol';
import './Hash.sol';
import './Sig.sol';
import './Safe.sol';

contract Swivel {
  /// @dev maps the key of an order to a boolean indicating if an order was cancelled
  mapping (bytes32 => bool) public cancelled;
  /// @dev maps the key of an order to an amount representing its taken volume
  mapping (bytes32 => uint256) public filled;
  /// @dev maps a token address to a point in time, a hold, after which a withdrawal can be made
  mapping (address => uint256) public withdrawals;

  string constant public NAME = 'Swivel Finance';
  string constant public VERSION = '2.0.0';
  uint256 constant public HOLD = 3 days;
  bytes32 public immutable domain;
  address public immutable marketPlace;
  address public admin;
  uint16 constant public MIN_FEENOMINATOR = 33;
  /// @dev holds the fee demoninators for [zcTokenInitiate, zcTokenExit, vaultInitiate, vaultExit]
  uint16[4] public feenominators;

  /// @notice Emitted on order cancellation
  event Cancel (bytes32 indexed key, bytes32 hash);
  /// @notice Emitted on any initiate*
  /// @dev filled is 'principalFilled' when (vault:false, exit:false) && (vault:true, exit:true)
  /// @dev filled is 'premiumFilled' when (vault:true, exit:false) && (vault:false, exit:true)
  event Initiate(bytes32 indexed key, bytes32 hash, address indexed maker, bool vault, bool exit, address indexed sender, uint256 amount, uint256 filled);
  /// @notice Emitted on any exit*
  /// @dev filled is 'principalFilled' when (vault:false, exit:false) && (vault:true, exit:true)
  /// @dev filled is 'premiumFilled' when (vault:true, exit:false) && (vault:false, exit:true)
  event Exit(bytes32 indexed key, bytes32 hash, address indexed maker, bool vault, bool exit, address indexed sender, uint256 amount, uint256 filled);
  /// @notice Emitted on token withdrawal scheduling
  event ScheduleWithdrawal(address indexed token, uint256 hold);
  /// @notice Emitted on token withdrawal blocking
  event BlockWithdrawal(address indexed token);
  /// @notice Emitted on a change to the feenominators array
  event SetFee(uint256 indexed index, uint256 indexed feenominator);

  /// @param m deployed MarketPlace contract address
  /// @param v deployed contract address used as verifier
  constructor(address m, address v) {
    admin = msg.sender;
    domain = Hash.domain(NAME, VERSION, block.chainid, v);
    marketPlace = m;
    feenominators = [200, 600, 400, 200];
  }

  // ********* INITIATING *************

  /// @notice Allows a user to initiate a position
  /// @param o Array of offline Swivel.Orders
  /// @param a Array of order volume (principal) amounts relative to passed orders
  /// @param c Array of Components from valid ECDSA signatures
  function initiate(Hash.Order[] calldata o, uint256[] calldata a, Sig.Components[] calldata c) external returns (bool) {
    uint256 len = o.length;
    // for each order filled, routes the order to the right interaction depending on its params
    for (uint256 i; i < len; i++) {
      Hash.Order memory order = o[i];
      if (!order.exit) {
        if (!order.vault) {
          initiateVaultFillingZcTokenInitiate(o[i], a[i], c[i]);
        } else {
          initiateZcTokenFillingVaultInitiate(o[i], a[i], c[i]);
        }
      } else {
        if (!order.vault) {
          initiateZcTokenFillingZcTokenExit(o[i], a[i], c[i]);
        } else {
          initiateVaultFillingVaultExit(o[i], a[i], c[i]);
        }
      }
    }

    return true;
  }

  /// @notice Allows a user to initiate a Vault by filling an offline zcToken initiate order
  /// @dev This method should pass (underlying, maturity, maker, sender, principalFilled) to MarketPlace.custodialInitiate
  /// @param o Order being filled
  /// @param a Amount of volume (premium) being filled by the taker's initiate
  /// @param c Components of a valid ECDSA signature
  function initiateVaultFillingZcTokenInitiate(Hash.Order calldata o, uint256 a, Sig.Components calldata c) internal {
    // checks order signature, order cancellation and order expiry
    bytes32 hash = validOrderHash(o, c);

    // checks the side, and the amount compared to available
    require((a + filled[hash]) <= o.premium, 'taker amount > available volume');
    
    filled[hash] += a;

    // transfer underlying tokens
    Erc20 uToken = Erc20(o.underlying);
    Safe.transferFrom(uToken, msg.sender, o.maker, a);

    uint256 principalFilled = (a * o.principal) / o.premium;
    Safe.transferFrom(uToken, o.maker, address(this), principalFilled);

    MarketPlace mPlace = MarketPlace(marketPlace);
    // mint tokens
    require(CErc20(mPlace.cTokenAddress(o.underlying, o.maturity)).mint(principalFilled) == 0, 'minting CToken failed');
    // alert marketplace
    require(mPlace.custodialInitiate(o.underlying, o.maturity, o.maker, msg.sender, principalFilled), 'custodial initiate failed');

    // transfer fee in vault notional to swivel (from msg.sender)
    uint256 fee = principalFilled / feenominators[2];
    require(mPlace.transferVaultNotionalFee(o.underlying, o.maturity, msg.sender, fee), 'notional fee transfer failed');

    emit Initiate(o.key, hash, o.maker, o.vault, o.exit, msg.sender, a, principalFilled);
  }

  /// @notice Allows a user to initiate a zcToken by filling an offline vault initiate order
  /// @dev This method should pass (underlying, maturity, sender, maker, a) to MarketPlace.custodialInitiate
  /// @param o Order being filled
  /// @param a Amount of volume (principal) being filled by the taker's initiate
  /// @param c Components of a valid ECDSA signature
  function initiateZcTokenFillingVaultInitiate(Hash.Order calldata o, uint256 a, Sig.Components calldata c) internal {
    bytes32 hash = validOrderHash(o, c);

    require((a + filled[hash]) <= o.principal, 'taker amount > available volume');

    filled[hash] += a;

    Erc20 uToken = Erc20(o.underlying);

    uint256 premiumFilled = (a * o.premium) / o.principal;
    Safe.transferFrom(uToken, o.maker, msg.sender, premiumFilled);

    // transfer principal + fee in underlying to swivel (from sender)
    uint256 fee = premiumFilled / feenominators[0];
    Safe.transferFrom(uToken, msg.sender, address(this), (a + fee));

    MarketPlace mPlace = MarketPlace(marketPlace);
    // mint tokens
    require(CErc20(mPlace.cTokenAddress(o.underlying, o.maturity)).mint(a) == 0, 'minting CToken Failed');
    // alert marketplace 
    require(mPlace.custodialInitiate(o.underlying, o.maturity, msg.sender, o.maker, a), 'custodial initiate failed');

    emit Initiate(o.key, hash, o.maker, o.vault, o.exit, msg.sender, a, premiumFilled);
  }

  /// @notice Allows a user to initiate zcToken? by filling an offline zcToken exit order
  /// @dev This method should pass (underlying, maturity, maker, sender, a) to MarketPlace.p2pZcTokenExchange
  /// @param o Order being filled
  /// @param a Amount of volume (principal) being filled by the taker's initiate 
  /// @param c Components of a valid ECDSA signature
  function initiateZcTokenFillingZcTokenExit(Hash.Order calldata o, uint256 a, Sig.Components calldata c) internal {
    bytes32 hash = validOrderHash(o, c);

    require((a + filled[hash]) <= o.principal, 'taker amount > available volume');

    filled[hash] += a;

    uint256 premiumFilled = (a * o.premium) / o.principal;

    Erc20 uToken = Erc20(o.underlying);
    // transfer underlying tokens, then take fee
    Safe.transferFrom(uToken, msg.sender, o.maker, a - premiumFilled);

    uint256 fee = premiumFilled / feenominators[0];
    Safe.transferFrom(uToken, msg.sender, address(this), fee);

    // alert marketplace
    require(MarketPlace(marketPlace).p2pZcTokenExchange(o.underlying, o.maturity, o.maker, msg.sender, a), 'zcToken exchange failed');
            
    emit Initiate(o.key, hash, o.maker, o.vault, o.exit, msg.sender, a, premiumFilled);
  }

  /// @notice Allows a user to initiate a Vault by filling an offline vault exit order
  /// @dev This method should pass (underlying, maturity, maker, sender, principalFilled) to MarketPlace.p2pVaultExchange
  /// @param o Order being filled
  /// @param a Amount of volume (interest) being filled by the taker's exit
  /// @param c Components of a valid ECDSA signature
  function initiateVaultFillingVaultExit(Hash.Order calldata o, uint256 a, Sig.Components calldata c) internal {
    bytes32 hash = validOrderHash(o, c);

    require((a + filled[hash]) <= o.premium, 'taker amount > available volume');

    filled[hash] += a;

    Safe.transferFrom(Erc20(o.underlying), msg.sender, o.maker, a);

    MarketPlace mPlace = MarketPlace(marketPlace);
    uint256 principalFilled = (a * o.principal) / o.premium;
    // alert marketplace
    require(mPlace.p2pVaultExchange(o.underlying, o.maturity, o.maker, msg.sender, principalFilled), 'vault exchange failed');

    // transfer fee (in vault notional) to swivel
    uint256 fee = principalFilled / feenominators[2];
    require(mPlace.transferVaultNotionalFee(o.underlying, o.maturity, msg.sender, fee), "notional fee transfer failed");

    emit Initiate(o.key, hash, o.maker, o.vault, o.exit, msg.sender, a, principalFilled);
  }

  // ********* EXITING ***************

  /// @notice Allows a user to exit (sell) a currently held position to the marketplace.
  /// @param o Array of offline Swivel.Orders
  /// @param a Array of order volume (principal) amounts relative to passed orders
  /// @param c Components of a valid ECDSA signature
  function exit(Hash.Order[] calldata o, uint256[] calldata a, Sig.Components[] calldata c) external returns (bool) {
    uint256 len = o.length;
    // for each order filled, routes the order to the right interaction depending on its params
    for (uint256 i; i < len; i++) {
      Hash.Order memory order = o[i];
      // if the order being filled is not an exit
      if (!order.exit) {
        // if the order being filled is a vault initiate or a zcToken initiate
          if (!order.vault) {
            // if filling a zcToken initiate with an exit, one is exiting zcTokens
            exitZcTokenFillingZcTokenInitiate(o[i], a[i], c[i]);
          } else {
            // if filling a vault initiate with an exit, one is exiting vault notional
            exitVaultFillingVaultInitiate(o[i], a[i], c[i]);
          }
      } else {
        // if the order being filled is a vault exit or a zcToken exit
        if (!order.vault) {
          // if filling a zcToken exit with an exit, one is exiting vault
          exitVaultFillingZcTokenExit(o[i], a[i], c[i]);
        } else {
          // if filling a vault exit with an exit, one is exiting zcTokens
          exitZcTokenFillingVaultExit(o[i], a[i], c[i]);
        }   
      }   
    }

    return true;
  }

  /// @notice Allows a user to exit their zcTokens by filling an offline zcToken initiate order
  /// @dev This method should pass (underlying, maturity, sender, maker, principalFilled) to MarketPlace.p2pZcTokenExchange
  /// @param o Order being filled
  /// @param a Amount of volume (interest) being filled by the taker's exit
  /// @param c Components of a valid ECDSA signature
  function exitZcTokenFillingZcTokenInitiate(Hash.Order calldata o, uint256 a, Sig.Components calldata c) internal {
    bytes32 hash = validOrderHash(o, c);

    require((a + filled[hash]) <= o.premium, 'taker amount > available volume');

    filled[hash] += a;       

    Erc20 uToken = Erc20(o.underlying);

    uint256 principalFilled = (a * o.principal) / o.premium;
    // transfer underlying from initiating party to exiting party, minus the price the exit party pays for the exit (premium), and the fee.
    Safe.transferFrom(uToken, o.maker, msg.sender, principalFilled - a);

    // transfer fee in underlying to swivel
    uint256 fee = principalFilled / feenominators[1];
    Safe.transferFrom(uToken, msg.sender, address(this), fee);

    // alert marketplace
    require(MarketPlace(marketPlace).p2pZcTokenExchange(o.underlying, o.maturity, msg.sender, o.maker, principalFilled), 'zcToken exchange failed');

    emit Exit(o.key, hash, o.maker, o.vault, o.exit, msg.sender, a, principalFilled);
  }
  
  /// @notice Allows a user to exit their Vault by filling an offline vault initiate order
  /// @dev This method should pass (underlying, maturity, sender, maker, a) to MarketPlace.p2pVaultExchange
  /// @param o Order being filled
  /// @param a Amount of volume (principal) being filled by the taker's exit
  /// @param c Components of a valid ECDSA signature
  function exitVaultFillingVaultInitiate(Hash.Order calldata o, uint256 a, Sig.Components calldata c) internal {
    bytes32 hash = validOrderHash(o, c);

    require((a + filled[hash]) <= o.principal, 'taker amount > available volume');
    
    filled[hash] += a;
        
    Erc20 uToken = Erc20(o.underlying);

    // transfer premium from maker to sender
    uint256 premiumFilled = (a * o.premium) / o.principal;
    Safe.transferFrom(uToken, o.maker, msg.sender, premiumFilled);

    uint256 fee = premiumFilled / feenominators[3];
    // transfer fee in underlying to swivel from sender
    Safe.transferFrom(uToken, msg.sender, address(this), fee);

    // transfer <a> notional from sender to maker
    require(MarketPlace(marketPlace).p2pVaultExchange(o.underlying, o.maturity, msg.sender, o.maker, a), 'vault exchange failed');

    emit Exit(o.key, hash, o.maker, o.vault, o.exit, msg.sender, a, premiumFilled);
  }

  /// @notice Allows a user to exit their Vault filling an offline zcToken exit order
  /// @dev This method should pass (underlying, maturity, maker, sender, a) to MarketPlace.exitFillingExit
  /// @param o Order being filled
  /// @param a Amount of volume (principal) being filled by the taker's exit
  /// @param c Components of a valid ECDSA signature
  function exitVaultFillingZcTokenExit(Hash.Order calldata o, uint256 a, Sig.Components calldata c) internal {
    bytes32 hash = validOrderHash(o, c);

    require((a + filled[hash]) <= o.principal, 'taker amount > available volume');

    filled[hash] += a;

    // redeem underlying on Compound and burn cTokens
    MarketPlace mPlace = MarketPlace(marketPlace);
    address cTokenAddr = mPlace.cTokenAddress(o.underlying, o.maturity);
    require((CErc20(cTokenAddr).redeemUnderlying(a) == 0), "compound redemption error");

    Erc20 uToken = Erc20(o.underlying);
    // transfer principal-premium  back to fixed exit party now that the interest coupon and zcb have been redeemed
    uint256 premiumFilled = (a * o.premium) / o.principal;
    Safe.transfer(uToken, o.maker, a - premiumFilled);

    // transfer premium-fee to floating exit party
    uint256 fee = premiumFilled / feenominators[3];
    Safe.transfer(uToken, msg.sender, premiumFilled - fee);

    // burn zcTokens + nTokens from o.maker and msg.sender respectively
    require(mPlace.custodialExit(o.underlying, o.maturity, o.maker, msg.sender, a), 'custodial exit failed');

    emit Exit(o.key, hash, o.maker, o.vault, o.exit, msg.sender, a, premiumFilled);
  }

  /// @notice Allows a user to exit their zcTokens by filling an offline vault exit order
  /// @dev This method should pass (underlying, maturity, sender, maker, principalFilled) to MarketPlace.exitFillingExit
  /// @param o Order being filled
  /// @param a Amount of volume (interest) being filled by the taker's exit
  /// @param c Components of a valid ECDSA signature
  function exitZcTokenFillingVaultExit(Hash.Order calldata o, uint256 a, Sig.Components calldata c) internal {
    bytes32 hash = validOrderHash(o, c);

    require((a + filled[hash]) <= o.premium, 'taker amount > available volume');
    
    filled[hash] += a;

    // redeem underlying on Compound and burn cTokens
    MarketPlace mPlace = MarketPlace(marketPlace);

    address cTokenAddr = mPlace.cTokenAddress(o.underlying, o.maturity);
    uint256 principalFilled = (a * o.principal) / o.premium;
    require((CErc20(cTokenAddr).redeemUnderlying(principalFilled) == 0), "compound redemption error");

    Erc20 uToken = Erc20(o.underlying);
    // transfer principal-premium-fee back to fixed exit party now that the interest coupon and zcb have been redeemed
    uint256 fee = principalFilled / feenominators[1];
    Safe.transfer(uToken, msg.sender, principalFilled - a - fee);
    Safe.transfer(uToken, o.maker, a);

    // burn <principalFilled> zcTokens + nTokens from msg.sender and o.maker respectively
    require(mPlace.custodialExit(o.underlying, o.maturity, msg.sender, o.maker, principalFilled), 'custodial exit failed');

    emit Exit(o.key, hash, o.maker, o.vault, o.exit, msg.sender, a, principalFilled);
  }

  /// @notice Allows a user to cancel an order, preventing it from being filled in the future
  /// @param o Order being cancelled
  /// @param c Components of a valid ECDSA signature
  function cancel(Hash.Order calldata o, Sig.Components calldata c) external returns (bool) {
    bytes32 hash = validOrderHash(o, c);

    require(msg.sender == o.maker, 'sender must be maker');

    cancelled[hash] = true;

    emit Cancel(o.key, hash);

    return true;
  }

  // ********* ADMINISTRATIVE ***************

  /// @param a Address of a new admin
  function transferAdmin(address a) external authorized(admin) returns (bool) {
    admin = a;

    return true;
  }

  /// @notice Allows the admin to schedule the withdrawal of tokens
  /// @param e Address of (erc20) token to withdraw
  function scheduleWithdrawal(address e) external authorized(admin) returns (bool) {
    uint256 when = block.timestamp + HOLD;
    withdrawals[e] = when;

    emit ScheduleWithdrawal(e, when);

    return true;
  }

  /// @notice Emergency function to block unplanned withdrawals
  /// @param e Address of token withdrawal to block
  function blockWithdrawal(address e) external authorized(admin) returns (bool) {
      withdrawals[e] = 0;

      emit BlockWithdrawal(e);

      return true;
  }

  /// @notice Allows the admin to withdraw the given token, provided the holding period has been observed
  /// @param e Address of token to withdraw
  function withdraw(address e) external authorized(admin) returns (bool) {
    uint256 when = withdrawals[e];
    require (when != 0, 'no withdrawal scheduled');

    require (block.timestamp >= when, 'withdrawal still on hold');

    withdrawals[e] = 0;

    Erc20 token = Erc20(e);
    Safe.transfer(token, admin, token.balanceOf(address(this)));

    return true;
  }

  /// @notice Allows the admin to set a new fee denominator
  /// @param i The index of the new fee denominator
  /// @param d The new fee denominator
  function setFee(uint16 i, uint16 d) external authorized(admin) returns (bool) {
    require(d >= MIN_FEENOMINATOR, 'fee too high');

    feenominators[i] = d;

    emit SetFee(i, d);

    return true;
  }

  /// @notice Allows the admin to bulk approve given compound addresses at the underlying token, saving marginal approvals
  /// @param u array of underlying token addresses
  /// @param c array of compound token addresses
  function approveUnderlying(address[] calldata u, address[] calldata c) external authorized(admin) returns (bool) {
    uint256 len = u.length;
    require (len == c.length, 'array length mismatch');

    uint256 max = 2**256 - 1;

    for (uint256 i; i < len; i++) {
      Erc20 uToken = Erc20(u[i]);
      Safe.approve(uToken, c[i], max);
    }

    return true;
  }

  // ********* PROTOCOL UTILITY ***************

  /// @notice Allows users to deposit underlying and in the process split it into/mint 
  /// zcTokens and vault notional. Calls mPlace.mintZcTokenAddingNotional
  /// @param u Underlying token address associated with the market
  /// @param m Maturity timestamp of the market
  /// @param a Amount of underlying being deposited
  function splitUnderlying(address u, uint256 m, uint256 a) external returns (bool) {
    Erc20 uToken = Erc20(u);
    Safe.transferFrom(uToken, msg.sender, address(this), a);
    MarketPlace mPlace = MarketPlace(marketPlace);
    require(CErc20(mPlace.cTokenAddress(u, m)).mint(a) == 0, 'minting CToken Failed');
    require(mPlace.mintZcTokenAddingNotional(u, m, msg.sender, a), 'mint ZcToken adding Notional failed');

    return true;
  }

  /// @notice Allows users deposit/burn 1-1 amounts of both zcTokens and vault notional,
  /// in the process "combining" the two, and redeeming underlying. Calls mPlace.burnZcTokenRemovingNotional.
  /// @param u Underlying token address associated with the market
  /// @param m Maturity timestamp of the market
  /// @param a Amount of zcTokens being redeemed
  function combineTokens(address u, uint256 m, uint256 a) external returns (bool) {
    MarketPlace mPlace = MarketPlace(marketPlace);
    require(mPlace.burnZcTokenRemovingNotional(u, m, msg.sender, a), 'burn ZcToken removing Notional failed');
    address cTokenAddr = mPlace.cTokenAddress(u, m);
    require((CErc20(cTokenAddr).redeemUnderlying(a) == 0), "compound redemption error");
    Safe.transfer(Erc20(u), msg.sender, a);

    return true;
  }

  /// @notice Allows zcToken holders to redeem their tokens for underlying tokens after maturity has been reached (via MarketPlace).
  /// @param u Underlying token address associated with the market
  /// @param m Maturity timestamp of the market
  /// @param a Amount of zcTokens being redeemed
  function redeemZcToken(address u, uint256 m, uint256 a) external returns (bool) {
    MarketPlace mPlace = MarketPlace(marketPlace);
    // call marketplace to determine the amount redeemed
    uint256 redeemed = mPlace.redeemZcToken(u, m, msg.sender, a);
    // redeem underlying from compound
    require(CErc20(mPlace.cTokenAddress(u, m)).redeemUnderlying(redeemed) == 0, 'compound redemption failed');
    // transfer underlying back to msg.sender
    Safe.transfer(Erc20(u), msg.sender, redeemed);

    return true;
  }

  /// @notice Allows Vault owners to redeem any currently accrued interest (via MarketPlace)
  /// @param u Underlying token address associated with the market
  /// @param m Maturity timestamp of the market
  function redeemVaultInterest(address u, uint256 m) external returns (bool) {
    MarketPlace mPlace = MarketPlace(marketPlace);
    // call marketplace to determine the amount redeemed
    uint256 redeemed = mPlace.redeemVaultInterest(u, m, msg.sender);
    // redeem underlying from compound
    require(CErc20(mPlace.cTokenAddress(u, m)).redeemUnderlying(redeemed) == 0, 'compound redemption failed');
    // transfer underlying back to msg.sender
    Safe.transfer(Erc20(u), msg.sender, redeemed);

    return true;
  }

  /// @notice Allows Swivel to redeem any currently accrued interest (via MarketPlace)
  /// @param u Underlying token address associated with the market
  /// @param m Maturity timestamp of the market
  function redeemSwivelVaultInterest(address u, uint256 m) external returns (bool) {
    MarketPlace mPlace = MarketPlace(marketPlace);
    // call marketplace to determine the amount redeemed
    uint256 redeemed = mPlace.redeemVaultInterest(u, m, address(this));
    // redeem underlying from compound
    require(CErc20(mPlace.cTokenAddress(u, m)).redeemUnderlying(redeemed) == 0, 'compound redemption failed');
    // NOTE: for swivel redeem there is no transfer out as there is in redeemVaultInterest

    return true;
  }

  /// @notice Varifies the validity of an order and it's signature.
  /// @param o An offline Swivel.Order
  /// @param c Components of a valid ECDSA signature
  /// @return the hashed order.
  function validOrderHash(Hash.Order calldata o, Sig.Components calldata c) internal view returns (bytes32) {
    bytes32 hash = Hash.order(o);

    require(!cancelled[hash], 'order cancelled');
    require(o.expiry >= block.timestamp, 'order expired');
    require(o.maker == Sig.recover(Hash.message(domain, hash), c), 'invalid signature');

    return hash;
  }

  modifier authorized(address a) {
    require(msg.sender == a, 'sender must be authorized');
    _;
  }
}

File 2 of 5: Hash.sol
// SPDX-License-Identifier: UNLICENSED

pragma solidity >= 0.8.4;

/**
  @notice Encapsulation of the logic to produce EIP712 hashed domain and messages.
  Also to produce / verify hashed and signed Orders.
  See https://github.com/ethereum/EIPs/blob/master/EIPS/eip-712.md
  See/attribute https://github.com/0xProject/0x-monorepo/blob/development/contracts/utils/contracts/src/LibEIP712.sol
*/

library Hash {
  /// @dev struct represents the attributes of an offchain Swivel.Order
  struct Order {
    bytes32 key;
    address maker;
    address underlying;
    bool vault;
    bool exit;
    uint256 principal;
    uint256 premium;
    uint256 maturity;
    uint256 expiry;
  }

  // EIP712 Domain Separator typeHash
  // keccak256(abi.encodePacked(
  //     'EIP712Domain(',
  //     'string name,',
  //     'string version,',
  //     'uint256 chainId,',
  //     'address verifyingContract',
  //     ')'
  // ));
  bytes32 constant internal DOMAIN_TYPEHASH = 0x8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f;

  // EIP712 typeHash of an Order 
  // keccak256(abi.encodePacked(
  //     'Order(',
  //     'bytes32 key,',
  //     'address maker,',
  //     'address underlying,',
  //     'bool vault,',
  //     'bool exit,',
  //     'uint256 principal,',
  //     'uint256 premium,',
  //     'uint256 maturity,',
  //     'uint256 expiry',
  //     ')'
  // ));
  bytes32 constant internal ORDER_TYPEHASH = 0x7ddd38ab5ed1c16b61ca90eeb9579e29da1ba821cf42d8cdef8f30a31a6a4146;

  /// @param n EIP712 domain name
  /// @param version EIP712 semantic version string
  /// @param i Chain ID
  /// @param verifier address of the verifying contract
  function domain(string memory n, string memory version, uint256 i, address verifier) internal pure returns (bytes32) {
    bytes32 hash;

    assembly {
      let nameHash := keccak256(add(n, 32), mload(n))
      let versionHash := keccak256(add(version, 32), mload(version))
      let pointer := mload(64)
      mstore(pointer, DOMAIN_TYPEHASH)
      mstore(add(pointer, 32), nameHash)
      mstore(add(pointer, 64), versionHash)
      mstore(add(pointer, 96), i)
      mstore(add(pointer, 128), verifier)
      hash := keccak256(pointer, 160)
    }

    return hash;
  }

  /// @param d Type hash of the domain separator (see Hash.domain)
  /// @param h EIP712 hash struct (order for example)
  function message(bytes32 d, bytes32 h) internal pure returns (bytes32) {
    bytes32 hash;

    assembly {
      let pointer := mload(64)
      mstore(pointer, 0x1901000000000000000000000000000000000000000000000000000000000000)
      mstore(add(pointer, 2), d)
      mstore(add(pointer, 34), h)
      hash := keccak256(pointer, 66)
    }

    return hash;
  }

  /// @param o A Swivel Order
  function order(Order calldata o) internal pure returns (bytes32) {
    // TODO assembly
    return keccak256(abi.encode(
      ORDER_TYPEHASH,
      o.key,
      o.maker,
      o.underlying,
      o.vault,
      o.exit,
      o.principal,
      o.premium,
      o.maturity,
      o.expiry
    ));
  }
}

File 3 of 5: Interfaces.sol
// SPDX-License-Identifier: UNLICENSED

pragma solidity >= 0.8.4;

interface Erc20 {
	function approve(address, uint256) external returns (bool);
	function transfer(address, uint256) external returns (bool);
	function balanceOf(address) external returns (uint256);
	function transferFrom(address, address, uint256) external returns (bool);
}

interface CErc20 {
	function mint(uint256) external returns (uint256);
	function redeemUnderlying(uint256) external returns (uint256);
}

interface MarketPlace {
  // adds notional and mints zctokens
  function mintZcTokenAddingNotional(address, uint256, address, uint256) external returns (bool);
  // removes notional and burns zctokens
  function burnZcTokenRemovingNotional(address, uint256, address, uint256) external returns (bool);
  // returns the amount of underlying principal to send
  function redeemZcToken(address, uint256, address, uint256) external returns (uint256);
  // returns the amount of underlying interest to send
  function redeemVaultInterest(address, uint256, address) external returns (uint256);
  // returns the cToken address for a given market
  function cTokenAddress(address, uint256) external returns (address);
  // EVFZE FF EZFVE call this which would then burn zctoken and remove notional
  function custodialExit(address, uint256, address, address, uint256) external returns (bool);
  // IVFZI && IZFVI call this which would then mint zctoken and add notional
  function custodialInitiate(address, uint256, address, address, uint256) external returns (bool);
  // IZFZE && EZFZI call this, tranferring zctoken from one party to another
  function p2pZcTokenExchange(address, uint256, address, address, uint256) external returns (bool);
  // IVFVE && EVFVI call this, removing notional from one party and adding to the other
  function p2pVaultExchange(address, uint256, address, address, uint256) external returns (bool);
  // IVFZI && IVFVE call this which then transfers notional from msg.sender (taker) to swivel
  function transferVaultNotionalFee(address, uint256, address, uint256) external returns (bool);
}

File 4 of 5: Safe.sol
// SPDX-License-Identifier: UNLICENSED
// Adapted from: https://github.com/Rari-Capital/solmate/blob/main/src/utils/SafeTransferLib.sol
pragma solidity >= 0.8.4;

import {Erc20} from "./Interfaces.sol";
/**
  @notice Safe ETH and ERC20 transfer library that gracefully handles missing return values.
  @author Modified from Gnosis (https://github.com/gnosis/gp-v2-contracts/blob/main/src/contracts/libraries/GPv2SafeERC20.sol)
  @dev Use with caution! Some functions in this library knowingly create dirty bits at the destination of the free memory pointer.
*/

library Safe {
  /// @param e Erc20 token to execute the call with
  /// @param t To address
  /// @param a Amount being transferred
  function approve(Erc20 e, address t, uint256 a) internal {
    bool result;

    assembly {
      // Get a pointer to some free memory.
      let pointer := mload(0x40)

      // Write the abi-encoded calldata to memory piece by piece:
      mstore(pointer, 0x095ea7b300000000000000000000000000000000000000000000000000000000) // Begin with the function selector.
      mstore(add(pointer, 4), and(t, 0xffffffffffffffffffffffffffffffffffffffff)) // Mask and append the "to" argument.
      mstore(add(pointer, 36), a) // Finally append the "amount" argument. No mask as it's a full 32 byte value.

      // Call the token and store if it succeeded or not.
      // We use 68 because the calldata length is 4 + 32 * 2.
      result := call(gas(), e, 0, pointer, 68, 0, 0)
    }

    require(success(result), "approve failed");
  }

  /// @param e Erc20 token to execute the call with
  /// @param t To address
  /// @param a Amount being transferred
  function transfer(Erc20 e, address t, uint256 a) internal {
    bool result;

    assembly {
      // Get a pointer to some free memory.
      let pointer := mload(0x40)

      // Write the abi-encoded calldata to memory piece by piece:
      mstore(pointer, 0xa9059cbb00000000000000000000000000000000000000000000000000000000) // Begin with the function selector.
      mstore(add(pointer, 4), and(t, 0xffffffffffffffffffffffffffffffffffffffff)) // Mask and append the "to" argument.
      mstore(add(pointer, 36), a) // Finally append the "amount" argument. No mask as it's a full 32 byte value.

      // Call the token and store if it succeeded or not.
      // We use 68 because the calldata length is 4 + 32 * 2.
      result := call(gas(), e, 0, pointer, 68, 0, 0)
    }

    require(success(result), "transfer failed");
  }

  /// @param e Erc20 token to execute the call with
  /// @param f From address
  /// @param t To address
  /// @param a Amount being transferred
  function transferFrom(Erc20 e, address f, address t, uint256 a) internal {
    bool result;

    assembly {
      // Get a pointer to some free memory.
      let pointer := mload(0x40)

      // Write the abi-encoded calldata to memory piece by piece:
      mstore(pointer, 0x23b872dd00000000000000000000000000000000000000000000000000000000) // Begin with the function selector.
      mstore(add(pointer, 4), and(f, 0xffffffffffffffffffffffffffffffffffffffff)) // Mask and append the "from" argument.
      mstore(add(pointer, 36), and(t, 0xffffffffffffffffffffffffffffffffffffffff)) // Mask and append the "to" argument.
      mstore(add(pointer, 68), a) // Finally append the "amount" argument. No mask as it's a full 32 byte value.

      // Call the token and store if it succeeded or not.
      // We use 100 because the calldata length is 4 + 32 * 3.
      result := call(gas(), e, 0, pointer, 100, 0, 0)
    }

    require(success(result), "transfer from failed");
  }

  /// @notice normalize the acceptable values of true or null vs the unacceptable value of false (or something malformed)
  /// @param r Return value from the assembly `call()` to Erc20['selector']
  function success(bool r) private pure returns (bool) {
    bool result;

    assembly {
      // Get how many bytes the call returned.
      let returnDataSize := returndatasize()

      // If the call reverted:
      if iszero(r) {
        // Copy the revert message into memory.
        returndatacopy(0, 0, returnDataSize)

        // Revert with the same message.
        revert(0, returnDataSize)
      }

      switch returnDataSize
      case 32 {
        // Copy the return data into memory.
        returndatacopy(0, 0, returnDataSize)

        // Set success to whether it returned true.
        result := iszero(iszero(mload(0)))
      }
      case 0 {
        // There was no return data.
        result := 1
      }
      default {
        // It returned some malformed input.
        result := 0
      }
    }

    return result;
  }
}

File 5 of 5: Sig.sol
// SPDX-License-Identifier: UNLICENSED

pragma solidity >= 0.8.4;

library Sig {
  /// @dev ECDSA V,R and S components encapsulated here as we may not always be able to accept a bytes signature
  struct Components {
    uint8 v;  
    bytes32 r;
    bytes32 s;
  }

  /// @param h Hashed data which was originally signed
  /// @param c signature struct containing V,R and S
  /// @return The recovered address
  function recover(bytes32 h, Components calldata c) internal pure returns (address) {
    // EIP-2 and malleable signatures...
    // see https://github.com/OpenZeppelin/openzeppelin-contracts/blob/master/contracts/cryptography/ECDSA.sol
    require(uint256(c.s) <= 0x7FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5D576E7357A4501DDFE92F46681B20A0, 'invalid signature "s" value');
    require(c.v == 27 || c.v == 28, 'invalid signature "v" value');

    return ecrecover(h, c.v, c.r, c.s);
  }

  /// @param h Hashed data which was originally signed
  /// @param sig Valid ECDSA signature
  /// @dev splitAndRecover should only be used if it is known that the resulting 
  /// verifying bit (V) will be 27 || 28. Otherwise use recover, possibly calling split first.
  /// @return The recovered address
  function splitAndRecover(bytes32 h, bytes memory sig) internal pure returns (address) {
    (uint8 v, bytes32 r, bytes32 s) = split(sig);

    return ecrecover(h, v, r, s);
  }

  /// @param sig Valid ECDSA signature
  /// @return v The verification bit
  /// @return r First 32 bytes
  /// @return s Next 32 bytes
  function split(bytes memory sig) internal pure returns (uint8, bytes32, bytes32) {
    require(sig.length == 65, 'invalid signature length');

    bytes32 r;
    bytes32 s;
    uint8 v;

    assembly {
      r := mload(add(sig, 32))
      s := mload(add(sig, 64))
      v := byte(0, mload(add(sig, 96)))
    }

    return (v, r, s);
  }
}

Contract Security Audit

Contract ABI

API
[{"inputs":[{"internalType":"address","name":"m","type":"address"},{"internalType":"address","name":"v","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"token","type":"address"}],"name":"BlockWithdrawal","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"key","type":"bytes32"},{"indexed":false,"internalType":"bytes32","name":"hash","type":"bytes32"}],"name":"Cancel","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"key","type":"bytes32"},{"indexed":false,"internalType":"bytes32","name":"hash","type":"bytes32"},{"indexed":true,"internalType":"address","name":"maker","type":"address"},{"indexed":false,"internalType":"bool","name":"vault","type":"bool"},{"indexed":false,"internalType":"bool","name":"exit","type":"bool"},{"indexed":true,"internalType":"address","name":"sender","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"filled","type":"uint256"}],"name":"Exit","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"key","type":"bytes32"},{"indexed":false,"internalType":"bytes32","name":"hash","type":"bytes32"},{"indexed":true,"internalType":"address","name":"maker","type":"address"},{"indexed":false,"internalType":"bool","name":"vault","type":"bool"},{"indexed":false,"internalType":"bool","name":"exit","type":"bool"},{"indexed":true,"internalType":"address","name":"sender","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"filled","type":"uint256"}],"name":"Initiate","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"token","type":"address"},{"indexed":false,"internalType":"uint256","name":"hold","type":"uint256"}],"name":"ScheduleWithdrawal","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"index","type":"uint256"},{"indexed":true,"internalType":"uint256","name":"feenominator","type":"uint256"}],"name":"SetFee","type":"event"},{"inputs":[],"name":"HOLD","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MIN_FEENOMINATOR","outputs":[{"internalType":"uint16","name":"","type":"uint16"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"NAME","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"VERSION","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"admin","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address[]","name":"u","type":"address[]"},{"internalType":"address[]","name":"c","type":"address[]"}],"name":"approveUnderlying","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"e","type":"address"}],"name":"blockWithdrawal","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"components":[{"internalType":"bytes32","name":"key","type":"bytes32"},{"internalType":"address","name":"maker","type":"address"},{"internalType":"address","name":"underlying","type":"address"},{"internalType":"bool","name":"vault","type":"bool"},{"internalType":"bool","name":"exit","type":"bool"},{"internalType":"uint256","name":"principal","type":"uint256"},{"internalType":"uint256","name":"premium","type":"uint256"},{"internalType":"uint256","name":"maturity","type":"uint256"},{"internalType":"uint256","name":"expiry","type":"uint256"}],"internalType":"struct Hash.Order","name":"o","type":"tuple"},{"components":[{"internalType":"uint8","name":"v","type":"uint8"},{"internalType":"bytes32","name":"r","type":"bytes32"},{"internalType":"bytes32","name":"s","type":"bytes32"}],"internalType":"struct Sig.Components","name":"c","type":"tuple"}],"name":"cancel","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"name":"cancelled","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"u","type":"address"},{"internalType":"uint256","name":"m","type":"uint256"},{"internalType":"uint256","name":"a","type":"uint256"}],"name":"combineTokens","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"domain","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"components":[{"internalType":"bytes32","name":"key","type":"bytes32"},{"internalType":"address","name":"maker","type":"address"},{"internalType":"address","name":"underlying","type":"address"},{"internalType":"bool","name":"vault","type":"bool"},{"internalType":"bool","name":"exit","type":"bool"},{"internalType":"uint256","name":"principal","type":"uint256"},{"internalType":"uint256","name":"premium","type":"uint256"},{"internalType":"uint256","name":"maturity","type":"uint256"},{"internalType":"uint256","name":"expiry","type":"uint256"}],"internalType":"struct Hash.Order[]","name":"o","type":"tuple[]"},{"internalType":"uint256[]","name":"a","type":"uint256[]"},{"components":[{"internalType":"uint8","name":"v","type":"uint8"},{"internalType":"bytes32","name":"r","type":"bytes32"},{"internalType":"bytes32","name":"s","type":"bytes32"}],"internalType":"struct Sig.Components[]","name":"c","type":"tuple[]"}],"name":"exit","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"feenominators","outputs":[{"internalType":"uint16","name":"","type":"uint16"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"name":"filled","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"components":[{"internalType":"bytes32","name":"key","type":"bytes32"},{"internalType":"address","name":"maker","type":"address"},{"internalType":"address","name":"underlying","type":"address"},{"internalType":"bool","name":"vault","type":"bool"},{"internalType":"bool","name":"exit","type":"bool"},{"internalType":"uint256","name":"principal","type":"uint256"},{"internalType":"uint256","name":"premium","type":"uint256"},{"internalType":"uint256","name":"maturity","type":"uint256"},{"internalType":"uint256","name":"expiry","type":"uint256"}],"internalType":"struct Hash.Order[]","name":"o","type":"tuple[]"},{"internalType":"uint256[]","name":"a","type":"uint256[]"},{"components":[{"internalType":"uint8","name":"v","type":"uint8"},{"internalType":"bytes32","name":"r","type":"bytes32"},{"internalType":"bytes32","name":"s","type":"bytes32"}],"internalType":"struct Sig.Components[]","name":"c","type":"tuple[]"}],"name":"initiate","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"marketPlace","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"u","type":"address"},{"internalType":"uint256","name":"m","type":"uint256"}],"name":"redeemSwivelVaultInterest","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"u","type":"address"},{"internalType":"uint256","name":"m","type":"uint256"}],"name":"redeemVaultInterest","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"u","type":"address"},{"internalType":"uint256","name":"m","type":"uint256"},{"internalType":"uint256","name":"a","type":"uint256"}],"name":"redeemZcToken","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"e","type":"address"}],"name":"scheduleWithdrawal","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint16","name":"i","type":"uint16"},{"internalType":"uint16","name":"d","type":"uint16"}],"name":"setFee","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"u","type":"address"},{"internalType":"uint256","name":"m","type":"uint256"},{"internalType":"uint256","name":"a","type":"uint256"}],"name":"splitUnderlying","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"a","type":"address"}],"name":"transferAdmin","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"e","type":"address"}],"name":"withdraw","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"withdrawals","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"}]

60c06040523480156200001157600080fd5b50604051620048f3380380620048f3833981016040819052620000349162000217565b600380546001600160a01b03191633179055604080518082018252600e81526d53776976656c2046696e616e636560901b602080830191909152825180840190935260058352640322e302e360dc1b83820152620000a092904690859062001ac1620000ef821b17901c565b60809081526001600160a01b03831660a05260408051918201815260c88083526102586020840152610190918301919091526060820152620000e6906004908162000146565b5050506200024f565b8351602094850120835193850193909320604080517f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f815295860194909452928401929092526060830152608082015260a0902090565b600183019183908215620001d15791602002820160005b838211156200019f57835183826101000a81548161ffff021916908361ffff16021790555092602001926002016020816001010492830192600103026200015d565b8015620001cf5782816101000a81549061ffff02191690556002016020816001010492830192600103026200019f565b505b50620001df929150620001e3565b5090565b5b80821115620001df5760008155600101620001e4565b80516001600160a01b03811681146200021257600080fd5b919050565b600080604083850312156200022b57600080fd5b6200023683620001fa565b91506200024660208401620001fa565b90509250929050565b60805160a05161461c620002d76000396000818161027a015281816104bd015281816107660152818161097f01528181610de60152818161125b01528181611fd9015281816122cd015281816124a50152818161292901528181612e15015281816133870152818161375001526139da0152600081816103cd0152611d49015261461c6000f3fe608060405234801561001057600080fd5b50600436106101a35760003560e01c80637a9262a2116100ee578063aba2870111610097578063d2144f5811610071578063d2144f58146103f9578063f851a4401461040c578063f8eaad351461041f578063ffa1ad741461043257600080fd5b8063aba28701146103b5578063c2fb26a6146103c8578063d0886f97146103ef57600080fd5b806399b64de1116100c857806399b64de114610346578063a102e38414610359578063a3f4df7e1461036c57600080fd5b80637a9262a21461030057806392ae37641461032057806395cb60c41461033357600080fd5b80632ac126221161015057806340d37cdf1161012a57806340d37cdf146102c757806351cff8d9146102da57806375829def146102ed57600080fd5b80632ac12622146102525780632e25d2a6146102755780633e1608b4146102b457600080fd5b8063154e0f2e11610181578063154e0f2e146101fe57806325dedb8514610211578063288cdc911461022457600080fd5b80630908ff2d146101a85780630d3f5352146101d057806312b516ae146101eb575b600080fd5b6101bb6101b6366004613f9c565b61046e565b60405190151581526020015b60405180910390f35b6101d8602181565b60405161ffff90911681526020016101c7565b6101bb6101f9366004613fd1565b61071e565b6101bb61020c366004613f9c565b610930565b6101bb61021f366004614049565b610b49565b6102446102323660046140b5565b60016020526000908152604090205481565b6040519081526020016101c7565b6101bb6102603660046140b5565b60006020819052908152604090205460ff1681565b61029c7f000000000000000000000000000000000000000000000000000000000000000081565b6040516001600160a01b0390911681526020016101c7565b6101bb6102c23660046140ce565b610ca1565b6101bb6102d5366004613fd1565b610d9e565b6101bb6102e8366004614132565b610fb0565b6101bb6102fb366004614132565b611170565b61024461030e366004614132565b60026020526000908152604090205481565b6101bb61032e366004613f9c565b61120d565b6101d86103413660046140b5565b611493565b6101bb610354366004614161565b6114c1565b6101bb610367366004614132565b6115f1565b6103a86040518060400160405280600e81526020017f53776976656c2046696e616e636500000000000000000000000000000000000081525081565b6040516101c79190614194565b6101bb6103c336600461424c565b611699565b6102447f000000000000000000000000000000000000000000000000000000000000000081565b6102446203f48081565b6101bb61040736600461424c565b61184e565b60035461029c906001600160a01b031681565b6101bb61042d366004614132565b611a03565b6103a86040518060400160405280600581526020017f322e302e3000000000000000000000000000000000000000000000000000000081525081565b6040517fb50a66f70000000000000000000000000000000000000000000000000000000081526001600160a01b03848116600483015260248201849052336044830152606482018390526000917f00000000000000000000000000000000000000000000000000000000000000009182169063b50a66f7906084016020604051808303816000875af1158015610508573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061052c9190614323565b6105a35760405162461bcd60e51b815260206004820152602560248201527f6275726e205a63546f6b656e2072656d6f76696e67204e6f74696f6e616c206660448201527f61696c656400000000000000000000000000000000000000000000000000000060648201526084015b60405180910390fd5b6040517f05e1dc250000000000000000000000000000000000000000000000000000000081526001600160a01b03868116600483015260248201869052600091908316906305e1dc25906044016020604051808303816000875af115801561060f573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906106339190614340565b6040517f852a12e3000000000000000000000000000000000000000000000000000000008152600481018690529091506001600160a01b0382169063852a12e3906024016020604051808303816000875af1158015610696573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906106ba919061435d565b156107075760405162461bcd60e51b815260206004820152601960248201527f636f6d706f756e6420726564656d7074696f6e206572726f7200000000000000604482015260640161059a565b610712863386611b18565b50600195945050505050565b6040517fa11f48560000000000000000000000000000000000000000000000000000000081526001600160a01b038381166004830152602482018390523060448301526000917f00000000000000000000000000000000000000000000000000000000000000009183919083169063a11f4856906064016020604051808303816000875af11580156107b4573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906107d8919061435d565b6040517f05e1dc250000000000000000000000000000000000000000000000000000000081526001600160a01b03878116600483015260248201879052919250908316906305e1dc25906044016020604051808303816000875af1158015610844573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906108689190614340565b6001600160a01b031663852a12e3826040518263ffffffff1660e01b815260040161089591815260200190565b6020604051808303816000875af11580156108b4573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906108d8919061435d565b156109255760405162461bcd60e51b815260206004820152601a60248201527f636f6d706f756e6420726564656d7074696f6e206661696c6564000000000000604482015260640161059a565b506001949350505050565b6040517fc5ee114d0000000000000000000000000000000000000000000000000000000081526001600160a01b03848116600483015260248201849052336044830152606482018390526000917f00000000000000000000000000000000000000000000000000000000000000009183919083169063c5ee114d906084016020604051808303816000875af11580156109cd573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906109f1919061435d565b6040517f05e1dc250000000000000000000000000000000000000000000000000000000081526001600160a01b03888116600483015260248201889052919250908316906305e1dc25906044016020604051808303816000875af1158015610a5d573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610a819190614340565b6001600160a01b031663852a12e3826040518263ffffffff1660e01b8152600401610aae91815260200190565b6020604051808303816000875af1158015610acd573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610af1919061435d565b15610b3e5760405162461bcd60e51b815260206004820152601a60248201527f636f6d706f756e6420726564656d7074696f6e206661696c6564000000000000604482015260640161059a565b610712863383611b18565b6003546000906001600160a01b0316338114610ba75760405162461bcd60e51b815260206004820152601960248201527f73656e646572206d75737420626520617574686f72697a656400000000000000604482015260640161059a565b84838114610bf75760405162461bcd60e51b815260206004820152601560248201527f6172726179206c656e677468206d69736d617463680000000000000000000000604482015260640161059a565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff60005b82811015610c92576000898983818110610c3757610c37614376565b9050602002016020810190610c4c9190614132565b9050610c7f81898985818110610c6457610c64614376565b9050602002016020810190610c799190614132565b85611bbe565b5080610c8a816143d4565b915050610c1b565b50600198975050505050505050565b600080610cae8484611c5e565b9050610cc06040850160208601614132565b6001600160a01b0316336001600160a01b031614610d205760405162461bcd60e51b815260206004820152601460248201527f73656e646572206d757374206265206d616b6572000000000000000000000000604482015260640161059a565b6000818152602081905260409081902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00166001179055518435907f9e5d8891dc1b047de610617bc9bc2d8ccffebbc3d63363431a546831245858a690610d8c9084815260200190565b60405180910390a25060019392505050565b6040517fa11f48560000000000000000000000000000000000000000000000000000000081526001600160a01b038381166004830152602482018390523360448301526000917f00000000000000000000000000000000000000000000000000000000000000009183919083169063a11f4856906064016020604051808303816000875af1158015610e34573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610e58919061435d565b6040517f05e1dc250000000000000000000000000000000000000000000000000000000081526001600160a01b03878116600483015260248201879052919250908316906305e1dc25906044016020604051808303816000875af1158015610ec4573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610ee89190614340565b6001600160a01b031663852a12e3826040518263ffffffff1660e01b8152600401610f1591815260200190565b6020604051808303816000875af1158015610f34573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610f58919061435d565b15610fa55760405162461bcd60e51b815260206004820152601a60248201527f636f6d706f756e6420726564656d7074696f6e206661696c6564000000000000604482015260640161059a565b610925853383611b18565b6003546000906001600160a01b031633811461100e5760405162461bcd60e51b815260206004820152601960248201527f73656e646572206d75737420626520617574686f72697a656400000000000000604482015260640161059a565b6001600160a01b038316600090815260026020526040812054908190036110775760405162461bcd60e51b815260206004820152601760248201527f6e6f207769746864726177616c207363686564756c6564000000000000000000604482015260640161059a565b804210156110c75760405162461bcd60e51b815260206004820152601860248201527f7769746864726177616c207374696c6c206f6e20686f6c640000000000000000604482015260640161059a565b6001600160a01b038481166000818152600260205260408082209190915560035490517f70a082310000000000000000000000000000000000000000000000000000000081523060048201528793610925938593909116916370a08231906024016020604051808303816000875af1158015611147573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061116b919061435d565b611b18565b6003546000906001600160a01b03163381146111ce5760405162461bcd60e51b815260206004820152601960248201527f73656e646572206d75737420626520617574686f72697a656400000000000000604482015260640161059a565b600380546001600160a01b0385167fffffffffffffffffffffffff00000000000000000000000000000000000000009091161790556001915050919050565b60008361121c81333086611df8565b6040517f05e1dc250000000000000000000000000000000000000000000000000000000081526001600160a01b038681166004830152602482018690527f000000000000000000000000000000000000000000000000000000000000000091908216906305e1dc25906044016020604051808303816000875af11580156112a7573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906112cb9190614340565b6001600160a01b031663a0712d68856040518263ffffffff1660e01b81526004016112f891815260200190565b6020604051808303816000875af1158015611317573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061133b919061435d565b156113885760405162461bcd60e51b815260206004820152601560248201527f6d696e74696e672043546f6b656e204661696c65640000000000000000000000604482015260640161059a565b6040517fef267f2c0000000000000000000000000000000000000000000000000000000081526001600160a01b038781166004830152602482018790523360448301526064820186905282169063ef267f2c906084016020604051808303816000875af11580156113fd573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906114219190614323565b6107125760405162461bcd60e51b815260206004820152602360248201527f6d696e74205a63546f6b656e20616464696e67204e6f74696f6e616c2066616960448201527f6c65640000000000000000000000000000000000000000000000000000000000606482015260840161059a565b600481600481106114a357600080fd5b60109182820401919006600202915054906101000a900461ffff1681565b6003546000906001600160a01b031633811461151f5760405162461bcd60e51b815260206004820152601960248201527f73656e646572206d75737420626520617574686f72697a656400000000000000604482015260640161059a565b602161ffff841610156115745760405162461bcd60e51b815260206004820152600c60248201527f66656520746f6f20686967680000000000000000000000000000000000000000604482015260640161059a565b8260048561ffff166004811061158c5761158c614376565b601091828204019190066002026101000a81548161ffff021916908361ffff1602179055508261ffff168461ffff167f032dc6a2d839eb179729a55633fdf1c41a1fc4739394154117005db2b354b9b560405160405180910390a35060019392505050565b6003546000906001600160a01b031633811461164f5760405162461bcd60e51b815260206004820152601960248201527f73656e646572206d75737420626520617574686f72697a656400000000000000604482015260640161059a565b6001600160a01b038316600081815260026020526040808220829055517fb1c1232c5dd039bb1c46cc05eaf25828e4f8596b7f68bdb23073ba78b9ca382d9190a250600192915050565b600085815b81811015610c925760008989838181106116ba576116ba614376565b905061012002018036038101906116d19190614468565b9050806080015161178e57806060015161173c576117378a8a848181106116fa576116fa614376565b9050610120020189898581811061171357611713614376565b9050602002013588888681811061172c5761172c614376565b905060600201611eae565b61183b565b6117378a8a8481811061175157611751614376565b9050610120020189898581811061176a5761176a614376565b9050602002013588888681811061178357611783614376565b9050606002016121a7565b80606001516117e9576117378a8a848181106117ac576117ac614376565b905061012002018989858181106117c5576117c5614376565b905060200201358888868181106117de576117de614376565b905060600201612405565b61183b8a8a848181106117fe576117fe614376565b9050610120020189898581811061181757611817614376565b9050602002013588888681811061183057611830614376565b905060600201612889565b5080611846816143d4565b91505061169e565b600085815b81811015610c9257600089898381811061186f5761186f614376565b905061012002018036038101906118869190614468565b905080608001516119435780606001516118f1576118ec8a8a848181106118af576118af614376565b905061012002018989858181106118c8576118c8614376565b905060200201358888868181106118e1576118e1614376565b905060600201612d08565b6119f0565b6118ec8a8a8481811061190657611906614376565b9050610120020189898581811061191f5761191f614376565b9050602002013588888681811061193857611938614376565b905060600201613276565b806060015161199e576118ec8a8a8481811061196157611961614376565b9050610120020189898581811061197a5761197a614376565b9050602002013588888681811061199357611993614376565b905060600201613630565b6119f08a8a848181106119b3576119b3614376565b905061012002018989858181106119cc576119cc614376565b905060200201358888868181106119e5576119e5614376565b90506060020161390e565b50806119fb816143d4565b915050611853565b6003546000906001600160a01b0316338114611a615760405162461bcd60e51b815260206004820152601960248201527f73656e646572206d75737420626520617574686f72697a656400000000000000604482015260640161059a565b6000611a706203f480426144ff565b6001600160a01b0385166000818152600260205260409081902083905551919250907fe4b67652e856f57a7747dd2473850ce987087f4b1744a870504f1c047cb56f4f90610d8c9084815260200190565b8351602094850120835193850193909320604080517f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f815295860194909452928401929092526060830152608082015260a0902090565b60006040517fa9059cbb0000000000000000000000000000000000000000000000000000000081526001600160a01b03841660048201528260248201526000806044836000895af1915050611b6c81613ca9565b611bb85760405162461bcd60e51b815260206004820152600f60248201527f7472616e73666572206661696c65640000000000000000000000000000000000604482015260640161059a565b50505050565b60006040517f095ea7b30000000000000000000000000000000000000000000000000000000081526001600160a01b03841660048201528260248201526000806044836000895af1915050611c1281613ca9565b611bb85760405162461bcd60e51b815260206004820152600e60248201527f617070726f7665206661696c6564000000000000000000000000000000000000604482015260640161059a565b600080611c6a84613cf3565b60008181526020819052604090205490915060ff1615611ccc5760405162461bcd60e51b815260206004820152600f60248201527f6f726465722063616e63656c6c65640000000000000000000000000000000000604482015260640161059a565b428461010001351015611d215760405162461bcd60e51b815260206004820152600d60248201527f6f72646572206578706972656400000000000000000000000000000000000000604482015260640161059a565b6040517f190100000000000000000000000000000000000000000000000000000000000081527f000000000000000000000000000000000000000000000000000000000000000060028201526022810182905260429020611d829084613df1565b6001600160a01b0316611d9b6040860160208701614132565b6001600160a01b031614611df15760405162461bcd60e51b815260206004820152601160248201527f696e76616c6964207369676e6174757265000000000000000000000000000000604482015260640161059a565b9392505050565b60006040517f23b872dd0000000000000000000000000000000000000000000000000000000081526001600160a01b03851660048201526001600160a01b038416602482015282604482015260008060648360008a5af1915050611e5b81613ca9565b611ea75760405162461bcd60e51b815260206004820152601460248201527f7472616e736665722066726f6d206661696c6564000000000000000000000000604482015260640161059a565b5050505050565b6000611eba8483611c5e565b60008181526001602052604090205490915060c085013590611edc90856144ff565b1115611f2a5760405162461bcd60e51b815260206004820152601f60248201527f74616b657220616d6f756e74203e20617661696c61626c6520766f6c756d6500604482015260640161059a565b60008181526001602052604081208054859290611f489084906144ff565b9091555060009050611f606060860160408701614132565b9050600060c0860135611f7760a088013587614517565b611f819190614554565b9050611fa782611f976040890160208a01614132565b33611fa2898661458f565b611df8565b600454600090611fc19062010000900461ffff1683614554565b9050611fcf83333084611df8565b6001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000166365a963aa61200e60608a0160408b01614132565b60e08a01353361202460408d0160208e01614132565b60405160e086901b7fffffffff000000000000000000000000000000000000000000000000000000001681526001600160a01b0394851660048201526024810193909352908316604483015290911660648201526084810185905260a4016020604051808303816000875af11580156120a1573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906120c59190614323565b6121115760405162461bcd60e51b815260206004820152601760248201527f7a63546f6b656e2065786368616e6765206661696c6564000000000000000000604482015260640161059a565b336121226040890160208a01614132565b6001600160a01b031688357f51cad9177cf46d59109ae978bb3cf5ffed2bb3d53fb3682fa56fbd92667128348761215f60808d0160608e016145a6565b61216f60a08e0160808f016145a6565b604080519384529115156020840152151590820152606081018b90526080810187905260a0015b60405180910390a450505050505050565b60006121b38483611c5e565b60008181526001602052604090205490915060a0850135906121d590856144ff565b11156122235760405162461bcd60e51b815260206004820152601f60248201527f74616b657220616d6f756e74203e20617661696c61626c6520766f6c756d6500604482015260640161059a565b600081815260016020526040812080548592906122419084906144ff565b90915550600090506122596060860160408701614132565b9050600060a086013561227060c088013587614517565b61227a9190614554565b9050612297826122906040890160208a01614132565b3384611df8565b6004546000906122b5906601000000000000900461ffff1683614554565b90506122c383333084611df8565b6001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001663bddbfbe461230260608a0160408b01614132565b60e08a01353361231860408d0160208e01614132565b60405160e086901b7fffffffff000000000000000000000000000000000000000000000000000000001681526001600160a01b0394851660048201526024810193909352908316604483015290911660648201526084810189905260a4016020604051808303816000875af1158015612395573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906123b99190614323565b6121115760405162461bcd60e51b815260206004820152601560248201527f7661756c742065786368616e6765206661696c65640000000000000000000000604482015260640161059a565b60006124118483611c5e565b60008181526001602052604090205490915060a08501359061243390856144ff565b11156124815760405162461bcd60e51b815260206004820152601f60248201527f74616b657220616d6f756e74203e20617661696c61626c6520766f6c756d6500604482015260640161059a565b6000818152600160205260408120805485929061249f9084906144ff565b909155507f0000000000000000000000000000000000000000000000000000000000000000905060006001600160a01b0382166305e1dc256124e76060890160408a01614132565b60405160e083811b7fffffffff000000000000000000000000000000000000000000000000000000001682526001600160a01b039290921660048201529089013560248201526044016020604051808303816000875af115801561254f573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906125739190614340565b6040517f852a12e3000000000000000000000000000000000000000000000000000000008152600481018790529091506001600160a01b0382169063852a12e3906024016020604051808303816000875af11580156125d6573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906125fa919061435d565b156126475760405162461bcd60e51b815260206004820152601960248201527f636f6d706f756e6420726564656d7074696f6e206572726f7200000000000000604482015260640161059a565b60006126596060880160408901614132565b9050600060a088013561267060c08a013589614517565b61267a9190614554565b905061269a8261269060408b0160208c01614132565b61116b848b61458f565b6004546000906126b8906601000000000000900461ffff1683614554565b90506126c9833361116b848661458f565b6001600160a01b038516638c6b9b416126e860608c0160408d01614132565b60e08c01356126fd60408e0160208f01614132565b60405160e085901b7fffffffff000000000000000000000000000000000000000000000000000000001681526001600160a01b03938416600482015260248101929092529091166044820152336064820152608481018b905260a4016020604051808303816000875af1158015612778573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061279c9190614323565b6127e85760405162461bcd60e51b815260206004820152601560248201527f637573746f6469616c2065786974206661696c65640000000000000000000000604482015260640161059a565b336127f960408b0160208c01614132565b6001600160a01b03168a600001357f51cad9177cf46d59109ae978bb3cf5ffed2bb3d53fb3682fa56fbd9266712834898d606001602081019061283c91906145a6565b8e608001602081019061284f91906145a6565b604080519384529115156020840152151590820152606081018d90526080810187905260a0015b60405180910390a4505050505050505050565b60006128958483611c5e565b60008181526001602052604090205490915060c0850135906128b790856144ff565b11156129055760405162461bcd60e51b815260206004820152601f60248201527f74616b657220616d6f756e74203e20617661696c61626c6520766f6c756d6500604482015260640161059a565b600081815260016020526040812080548592906129239084906144ff565b909155507f0000000000000000000000000000000000000000000000000000000000000000905060006001600160a01b0382166305e1dc2561296b6060890160408a01614132565b60405160e083811b7fffffffff000000000000000000000000000000000000000000000000000000001682526001600160a01b039290921660048201529089013560248201526044016020604051808303816000875af11580156129d3573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906129f79190614340565b9050600060c0870135612a0e60a089013588614517565b612a189190614554565b6040517f852a12e3000000000000000000000000000000000000000000000000000000008152600481018290529091506001600160a01b0383169063852a12e3906024016020604051808303816000875af1158015612a7b573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612a9f919061435d565b15612aec5760405162461bcd60e51b815260206004820152601960248201527f636f6d706f756e6420726564656d7074696f6e206572726f7200000000000000604482015260640161059a565b6000612afe6060890160408a01614132565b600454909150600090612b1b9062010000900461ffff1684614554565b9050612b37823383612b2d8c8861458f565b61116b919061458f565b612b5182612b4b60408c0160208d01614132565b8a611b18565b6001600160a01b038516638c6b9b41612b7060608c0160408d01614132565b8b60e00135338d6020016020810190612b899190614132565b60405160e086901b7fffffffff000000000000000000000000000000000000000000000000000000001681526001600160a01b0394851660048201526024810193909352908316604483015290911660648201526084810186905260a4016020604051808303816000875af1158015612c06573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612c2a9190614323565b612c765760405162461bcd60e51b815260206004820152601560248201527f637573746f6469616c2065786974206661696c65640000000000000000000000604482015260640161059a565b33612c8760408b0160208c01614132565b6001600160a01b03168a600001357f51cad9177cf46d59109ae978bb3cf5ffed2bb3d53fb3682fa56fbd9266712834898d6060016020810190612cca91906145a6565b8e6080016020810190612cdd91906145a6565b604080519384529115156020840152151590820152606081018d90526080810188905260a001612876565b6000612d148483611c5e565b60008181526001602052604090205490915060c085013590612d3690856144ff565b1115612d845760405162461bcd60e51b815260206004820152601f60248201527f74616b657220616d6f756e74203e20617661696c61626c6520766f6c756d6500604482015260640161059a565b60008181526001602052604081208054859290612da29084906144ff565b9091555060009050612dba6060860160408701614132565b9050612dd78133612dd16040890160208a01614132565b87611df8565b600060c0860135612dec60a088013587614517565b612df69190614554565b9050612e1382612e0c6040890160208a01614132565b3084611df8565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0381166305e1dc25612e5360608a0160408b01614132565b60405160e083811b7fffffffff000000000000000000000000000000000000000000000000000000001682526001600160a01b03929092166004820152908a013560248201526044016020604051808303816000875af1158015612ebb573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612edf9190614340565b6001600160a01b031663a0712d68836040518263ffffffff1660e01b8152600401612f0c91815260200190565b6020604051808303816000875af1158015612f2b573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612f4f919061435d565b15612f9c5760405162461bcd60e51b815260206004820152601560248201527f6d696e74696e672043546f6b656e206661696c65640000000000000000000000604482015260640161059a565b6001600160a01b03811663f8e51bcb612fbb60608a0160408b01614132565b60e08a0135612fd060408c0160208d01614132565b60405160e085901b7fffffffff000000000000000000000000000000000000000000000000000000001681526001600160a01b039384166004820152602481019290925290911660448201523360648201526084810185905260a4016020604051808303816000875af115801561304b573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061306f9190614323565b6130bb5760405162461bcd60e51b815260206004820152601960248201527f637573746f6469616c20696e697469617465206661696c656400000000000000604482015260640161059a565b6004546000906130d790640100000000900461ffff1684614554565b90506001600160a01b038216633cf9a4e36130f860608b0160408c01614132565b60405160e083811b7fffffffff000000000000000000000000000000000000000000000000000000001682526001600160a01b03929092166004820152908b01356024820152336044820152606481018490526084016020604051808303816000875af115801561316d573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906131919190614323565b6131dd5760405162461bcd60e51b815260206004820152601c60248201527f6e6f74696f6e616c20666565207472616e73666572206661696c656400000000604482015260640161059a565b336131ee60408a0160208b01614132565b6001600160a01b031689357f32bc401d77ffde781b234d480866e0c360e724770a30ea3299309f9171e400ef8861322b60808e0160608f016145a6565b8d608001602081019061323e91906145a6565b604080519384529115156020840152151590820152606081018c90526080810188905260a00160405180910390a45050505050505050565b60006132828483611c5e565b60008181526001602052604090205490915060a0850135906132a490856144ff565b11156132f25760405162461bcd60e51b815260206004820152601f60248201527f74616b657220616d6f756e74203e20617661696c61626c6520766f6c756d6500604482015260640161059a565b600081815260016020526040812080548592906133109084906144ff565b90915550600090506133286060860160408701614132565b9050600060a086013561333f60c088013587614517565b6133499190614554565b905061335f826122906040890160208a01614132565b6004546000906133739061ffff1683614554565b9050613385833330611fa2858b6144ff565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0381166305e1dc256133c560608b0160408c01614132565b60405160e083811b7fffffffff000000000000000000000000000000000000000000000000000000001682526001600160a01b03929092166004820152908b013560248201526044016020604051808303816000875af115801561342d573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906134519190614340565b6001600160a01b031663a0712d68886040518263ffffffff1660e01b815260040161347e91815260200190565b6020604051808303816000875af115801561349d573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906134c1919061435d565b1561350e5760405162461bcd60e51b815260206004820152601560248201527f6d696e74696e672043546f6b656e204661696c65640000000000000000000000604482015260640161059a565b6001600160a01b03811663f8e51bcb61352d60608b0160408c01614132565b60e08b01353361354360408e0160208f01614132565b60405160e086901b7fffffffff000000000000000000000000000000000000000000000000000000001681526001600160a01b039485166004820152602481019390935290831660448301529091166064820152608481018a905260a4016020604051808303816000875af11580156135c0573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906135e49190614323565b6131dd5760405162461bcd60e51b815260206004820152601960248201527f637573746f6469616c20696e697469617465206661696c656400000000000000604482015260640161059a565b600061363c8483611c5e565b60008181526001602052604090205490915060a08501359061365e90856144ff565b11156136ac5760405162461bcd60e51b815260206004820152601f60248201527f74616b657220616d6f756e74203e20617661696c61626c6520766f6c756d6500604482015260640161059a565b600081815260016020526040812080548592906136ca9084906144ff565b909155506000905060a08501356136e560c087013586614517565b6136ef9190614554565b905060006137036060870160408801614132565b9050613724813361371a60408a0160208b01614132565b611fa2868a61458f565b6004546000906137389061ffff1684614554565b905061374682333084611df8565b6001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000166365a963aa61378560608a0160408b01614132565b60e08a013561379a60408c0160208d01614132565b60405160e085901b7fffffffff000000000000000000000000000000000000000000000000000000001681526001600160a01b039384166004820152602481019290925290911660448201523360648201526084810189905260a4016020604051808303816000875af1158015613815573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906138399190614323565b6138855760405162461bcd60e51b815260206004820152601760248201527f7a63546f6b656e2065786368616e6765206661696c6564000000000000000000604482015260640161059a565b336138966040890160208a01614132565b6001600160a01b031688357f32bc401d77ffde781b234d480866e0c360e724770a30ea3299309f9171e400ef876138d360808d0160608e016145a6565b6138e360a08e0160808f016145a6565b604080519384529115156020840152151590820152606081018b90526080810188905260a001612196565b600061391a8483611c5e565b60008181526001602052604090205490915060c08501359061393c90856144ff565b111561398a5760405162461bcd60e51b815260206004820152601f60248201527f74616b657220616d6f756e74203e20617661696c61626c6520766f6c756d6500604482015260640161059a565b600081815260016020526040812080548592906139a89084906144ff565b909155506139d890506139c16060860160408701614132565b336139d26040880160208901614132565b86611df8565b7f0000000000000000000000000000000000000000000000000000000000000000600060c0860135613a0e60a088013587614517565b613a189190614554565b90506001600160a01b03821663bddbfbe4613a396060890160408a01614132565b60e0890135613a4e60408b0160208c01614132565b60405160e085901b7fffffffff000000000000000000000000000000000000000000000000000000001681526001600160a01b039384166004820152602481019290925290911660448201523360648201526084810184905260a4016020604051808303816000875af1158015613ac9573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613aed9190614323565b613b395760405162461bcd60e51b815260206004820152601560248201527f7661756c742065786368616e6765206661696c65640000000000000000000000604482015260640161059a565b600454600090613b5590640100000000900461ffff1683614554565b90506001600160a01b038316633cf9a4e3613b7660608a0160408b01614132565b60405160e083811b7fffffffff000000000000000000000000000000000000000000000000000000001682526001600160a01b03929092166004820152908a01356024820152336044820152606481018490526084016020604051808303816000875af1158015613beb573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613c0f9190614323565b613c5b5760405162461bcd60e51b815260206004820152601c60248201527f6e6f74696f6e616c20666565207472616e73666572206661696c656400000000604482015260640161059a565b33613c6c6040890160208a01614132565b6001600160a01b031688357f32bc401d77ffde781b234d480866e0c360e724770a30ea3299309f9171e400ef8761215f60808d0160608e016145a6565b6000803d83613cbc57806000803e806000fd5b8060208114613cd4578015613ce55760009250613cea565b816000803e60005115159250613cea565b600192505b50909392505050565b60007f7ddd38ab5ed1c16b61ca90eeb9579e29da1ba821cf42d8cdef8f30a31a6a41468235613d286040850160208601614132565b613d386060860160408701614132565b613d4860808701606088016145a6565b613d5860a08801608089016145a6565b8760a001358860c001358960e001358a6101000135604051602001613dd49a99989796959493929190998a5260208a01989098526001600160a01b0396871660408a01529490951660608801529115156080870152151560a086015260c085015260e08401919091526101008301526101208201526101400190565b604051602081830303815290604052805190602001209050919050565b60007f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a060408301351115613e675760405162461bcd60e51b815260206004820152601b60248201527f696e76616c6964207369676e6174757265202273222076616c75650000000000604482015260640161059a565b613e7460208301836145c3565b60ff16601b1480613e945750613e8d60208301836145c3565b60ff16601c145b613ee05760405162461bcd60e51b815260206004820152601b60248201527f696e76616c6964207369676e6174757265202276222076616c75650000000000604482015260640161059a565b600183613ef060208501856145c3565b604080516000815260208181018084529490945260ff9092168282015291850135606082015290840135608082015260a0016020604051602081039080840390855afa158015613f44573d6000803e3d6000fd5b50506040517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe00151949350505050565b6001600160a01b0381168114613f8957600080fd5b50565b8035613f9781613f74565b919050565b600080600060608486031215613fb157600080fd5b8335613fbc81613f74565b95602085013595506040909401359392505050565b60008060408385031215613fe457600080fd5b8235613fef81613f74565b946020939093013593505050565b60008083601f84011261400f57600080fd5b50813567ffffffffffffffff81111561402757600080fd5b6020830191508360208260051b850101111561404257600080fd5b9250929050565b6000806000806040858703121561405f57600080fd5b843567ffffffffffffffff8082111561407757600080fd5b61408388838901613ffd565b9096509450602087013591508082111561409c57600080fd5b506140a987828801613ffd565b95989497509550505050565b6000602082840312156140c757600080fd5b5035919050565b6000808284036101808112156140e357600080fd5b610120808212156140f357600080fd5b84935060607ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffee08301121561412657600080fd5b92959390920193505050565b60006020828403121561414457600080fd5b8135611df181613f74565b803561ffff81168114613f9757600080fd5b6000806040838503121561417457600080fd5b61417d8361414f565b915061418b6020840161414f565b90509250929050565b600060208083528351808285015260005b818110156141c1578581018301518582016040015282016141a5565b818111156141d3576000604083870101525b50601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016929092016040019392505050565b60008083601f84011261421957600080fd5b50813567ffffffffffffffff81111561423157600080fd5b60208301915083602060608302850101111561404257600080fd5b6000806000806000806060878903121561426557600080fd5b863567ffffffffffffffff8082111561427d57600080fd5b818901915089601f83011261429157600080fd5b8135818111156142a057600080fd5b8a6020610120830285010111156142b657600080fd5b6020928301985096509088013590808211156142d157600080fd5b6142dd8a838b01613ffd565b909650945060408901359150808211156142f657600080fd5b5061430389828a01614207565b979a9699509497509295939492505050565b8015158114613f8957600080fd5b60006020828403121561433557600080fd5b8151611df181614315565b60006020828403121561435257600080fd5b8151611df181613f74565b60006020828403121561436f57600080fd5b5051919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b60007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8203614405576144056143a5565b5060010190565b604051610120810167ffffffffffffffff81118282101715614457577f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b60405290565b8035613f9781614315565b6000610120828403121561447b57600080fd5b61448361440c565b8235815261449360208401613f8c565b60208201526144a460408401613f8c565b60408201526144b56060840161445d565b60608201526144c66080840161445d565b608082015260a083013560a082015260c083013560c082015260e083013560e08201526101008084013581830152508091505092915050565b60008219821115614512576145126143a5565b500190565b6000817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff048311821515161561454f5761454f6143a5565b500290565b60008261458a577f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b500490565b6000828210156145a1576145a16143a5565b500390565b6000602082840312156145b857600080fd5b8135611df181614315565b6000602082840312156145d557600080fd5b813560ff81168114611df157600080fdfea2646970667358221220ef13a69af84988ea5fbe4eedf2b1d197fa7ffe761e21cba8bddbabf9827e757364736f6c634300080d003300000000000000000000000076a3f123c651cbe62c80db5fe2539fb755dafdce0000000000000000000000003b983b701406010866bd68331aaed374fb9f50c9

Deployed Bytecode

0x608060405234801561001057600080fd5b50600436106101a35760003560e01c80637a9262a2116100ee578063aba2870111610097578063d2144f5811610071578063d2144f58146103f9578063f851a4401461040c578063f8eaad351461041f578063ffa1ad741461043257600080fd5b8063aba28701146103b5578063c2fb26a6146103c8578063d0886f97146103ef57600080fd5b806399b64de1116100c857806399b64de114610346578063a102e38414610359578063a3f4df7e1461036c57600080fd5b80637a9262a21461030057806392ae37641461032057806395cb60c41461033357600080fd5b80632ac126221161015057806340d37cdf1161012a57806340d37cdf146102c757806351cff8d9146102da57806375829def146102ed57600080fd5b80632ac12622146102525780632e25d2a6146102755780633e1608b4146102b457600080fd5b8063154e0f2e11610181578063154e0f2e146101fe57806325dedb8514610211578063288cdc911461022457600080fd5b80630908ff2d146101a85780630d3f5352146101d057806312b516ae146101eb575b600080fd5b6101bb6101b6366004613f9c565b61046e565b60405190151581526020015b60405180910390f35b6101d8602181565b60405161ffff90911681526020016101c7565b6101bb6101f9366004613fd1565b61071e565b6101bb61020c366004613f9c565b610930565b6101bb61021f366004614049565b610b49565b6102446102323660046140b5565b60016020526000908152604090205481565b6040519081526020016101c7565b6101bb6102603660046140b5565b60006020819052908152604090205460ff1681565b61029c7f00000000000000000000000076a3f123c651cbe62c80db5fe2539fb755dafdce81565b6040516001600160a01b0390911681526020016101c7565b6101bb6102c23660046140ce565b610ca1565b6101bb6102d5366004613fd1565b610d9e565b6101bb6102e8366004614132565b610fb0565b6101bb6102fb366004614132565b611170565b61024461030e366004614132565b60026020526000908152604090205481565b6101bb61032e366004613f9c565b61120d565b6101d86103413660046140b5565b611493565b6101bb610354366004614161565b6114c1565b6101bb610367366004614132565b6115f1565b6103a86040518060400160405280600e81526020017f53776976656c2046696e616e636500000000000000000000000000000000000081525081565b6040516101c79190614194565b6101bb6103c336600461424c565b611699565b6102447f07845c349637a5f759f053b812262883a65950f96419365efdf40d78cd31acfd81565b6102446203f48081565b6101bb61040736600461424c565b61184e565b60035461029c906001600160a01b031681565b6101bb61042d366004614132565b611a03565b6103a86040518060400160405280600581526020017f322e302e3000000000000000000000000000000000000000000000000000000081525081565b6040517fb50a66f70000000000000000000000000000000000000000000000000000000081526001600160a01b03848116600483015260248201849052336044830152606482018390526000917f00000000000000000000000076a3f123c651cbe62c80db5fe2539fb755dafdce9182169063b50a66f7906084016020604051808303816000875af1158015610508573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061052c9190614323565b6105a35760405162461bcd60e51b815260206004820152602560248201527f6275726e205a63546f6b656e2072656d6f76696e67204e6f74696f6e616c206660448201527f61696c656400000000000000000000000000000000000000000000000000000060648201526084015b60405180910390fd5b6040517f05e1dc250000000000000000000000000000000000000000000000000000000081526001600160a01b03868116600483015260248201869052600091908316906305e1dc25906044016020604051808303816000875af115801561060f573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906106339190614340565b6040517f852a12e3000000000000000000000000000000000000000000000000000000008152600481018690529091506001600160a01b0382169063852a12e3906024016020604051808303816000875af1158015610696573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906106ba919061435d565b156107075760405162461bcd60e51b815260206004820152601960248201527f636f6d706f756e6420726564656d7074696f6e206572726f7200000000000000604482015260640161059a565b610712863386611b18565b50600195945050505050565b6040517fa11f48560000000000000000000000000000000000000000000000000000000081526001600160a01b038381166004830152602482018390523060448301526000917f00000000000000000000000076a3f123c651cbe62c80db5fe2539fb755dafdce9183919083169063a11f4856906064016020604051808303816000875af11580156107b4573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906107d8919061435d565b6040517f05e1dc250000000000000000000000000000000000000000000000000000000081526001600160a01b03878116600483015260248201879052919250908316906305e1dc25906044016020604051808303816000875af1158015610844573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906108689190614340565b6001600160a01b031663852a12e3826040518263ffffffff1660e01b815260040161089591815260200190565b6020604051808303816000875af11580156108b4573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906108d8919061435d565b156109255760405162461bcd60e51b815260206004820152601a60248201527f636f6d706f756e6420726564656d7074696f6e206661696c6564000000000000604482015260640161059a565b506001949350505050565b6040517fc5ee114d0000000000000000000000000000000000000000000000000000000081526001600160a01b03848116600483015260248201849052336044830152606482018390526000917f00000000000000000000000076a3f123c651cbe62c80db5fe2539fb755dafdce9183919083169063c5ee114d906084016020604051808303816000875af11580156109cd573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906109f1919061435d565b6040517f05e1dc250000000000000000000000000000000000000000000000000000000081526001600160a01b03888116600483015260248201889052919250908316906305e1dc25906044016020604051808303816000875af1158015610a5d573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610a819190614340565b6001600160a01b031663852a12e3826040518263ffffffff1660e01b8152600401610aae91815260200190565b6020604051808303816000875af1158015610acd573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610af1919061435d565b15610b3e5760405162461bcd60e51b815260206004820152601a60248201527f636f6d706f756e6420726564656d7074696f6e206661696c6564000000000000604482015260640161059a565b610712863383611b18565b6003546000906001600160a01b0316338114610ba75760405162461bcd60e51b815260206004820152601960248201527f73656e646572206d75737420626520617574686f72697a656400000000000000604482015260640161059a565b84838114610bf75760405162461bcd60e51b815260206004820152601560248201527f6172726179206c656e677468206d69736d617463680000000000000000000000604482015260640161059a565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff60005b82811015610c92576000898983818110610c3757610c37614376565b9050602002016020810190610c4c9190614132565b9050610c7f81898985818110610c6457610c64614376565b9050602002016020810190610c799190614132565b85611bbe565b5080610c8a816143d4565b915050610c1b565b50600198975050505050505050565b600080610cae8484611c5e565b9050610cc06040850160208601614132565b6001600160a01b0316336001600160a01b031614610d205760405162461bcd60e51b815260206004820152601460248201527f73656e646572206d757374206265206d616b6572000000000000000000000000604482015260640161059a565b6000818152602081905260409081902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00166001179055518435907f9e5d8891dc1b047de610617bc9bc2d8ccffebbc3d63363431a546831245858a690610d8c9084815260200190565b60405180910390a25060019392505050565b6040517fa11f48560000000000000000000000000000000000000000000000000000000081526001600160a01b038381166004830152602482018390523360448301526000917f00000000000000000000000076a3f123c651cbe62c80db5fe2539fb755dafdce9183919083169063a11f4856906064016020604051808303816000875af1158015610e34573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610e58919061435d565b6040517f05e1dc250000000000000000000000000000000000000000000000000000000081526001600160a01b03878116600483015260248201879052919250908316906305e1dc25906044016020604051808303816000875af1158015610ec4573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610ee89190614340565b6001600160a01b031663852a12e3826040518263ffffffff1660e01b8152600401610f1591815260200190565b6020604051808303816000875af1158015610f34573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610f58919061435d565b15610fa55760405162461bcd60e51b815260206004820152601a60248201527f636f6d706f756e6420726564656d7074696f6e206661696c6564000000000000604482015260640161059a565b610925853383611b18565b6003546000906001600160a01b031633811461100e5760405162461bcd60e51b815260206004820152601960248201527f73656e646572206d75737420626520617574686f72697a656400000000000000604482015260640161059a565b6001600160a01b038316600090815260026020526040812054908190036110775760405162461bcd60e51b815260206004820152601760248201527f6e6f207769746864726177616c207363686564756c6564000000000000000000604482015260640161059a565b804210156110c75760405162461bcd60e51b815260206004820152601860248201527f7769746864726177616c207374696c6c206f6e20686f6c640000000000000000604482015260640161059a565b6001600160a01b038481166000818152600260205260408082209190915560035490517f70a082310000000000000000000000000000000000000000000000000000000081523060048201528793610925938593909116916370a08231906024016020604051808303816000875af1158015611147573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061116b919061435d565b611b18565b6003546000906001600160a01b03163381146111ce5760405162461bcd60e51b815260206004820152601960248201527f73656e646572206d75737420626520617574686f72697a656400000000000000604482015260640161059a565b600380546001600160a01b0385167fffffffffffffffffffffffff00000000000000000000000000000000000000009091161790556001915050919050565b60008361121c81333086611df8565b6040517f05e1dc250000000000000000000000000000000000000000000000000000000081526001600160a01b038681166004830152602482018690527f00000000000000000000000076a3f123c651cbe62c80db5fe2539fb755dafdce91908216906305e1dc25906044016020604051808303816000875af11580156112a7573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906112cb9190614340565b6001600160a01b031663a0712d68856040518263ffffffff1660e01b81526004016112f891815260200190565b6020604051808303816000875af1158015611317573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061133b919061435d565b156113885760405162461bcd60e51b815260206004820152601560248201527f6d696e74696e672043546f6b656e204661696c65640000000000000000000000604482015260640161059a565b6040517fef267f2c0000000000000000000000000000000000000000000000000000000081526001600160a01b038781166004830152602482018790523360448301526064820186905282169063ef267f2c906084016020604051808303816000875af11580156113fd573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906114219190614323565b6107125760405162461bcd60e51b815260206004820152602360248201527f6d696e74205a63546f6b656e20616464696e67204e6f74696f6e616c2066616960448201527f6c65640000000000000000000000000000000000000000000000000000000000606482015260840161059a565b600481600481106114a357600080fd5b60109182820401919006600202915054906101000a900461ffff1681565b6003546000906001600160a01b031633811461151f5760405162461bcd60e51b815260206004820152601960248201527f73656e646572206d75737420626520617574686f72697a656400000000000000604482015260640161059a565b602161ffff841610156115745760405162461bcd60e51b815260206004820152600c60248201527f66656520746f6f20686967680000000000000000000000000000000000000000604482015260640161059a565b8260048561ffff166004811061158c5761158c614376565b601091828204019190066002026101000a81548161ffff021916908361ffff1602179055508261ffff168461ffff167f032dc6a2d839eb179729a55633fdf1c41a1fc4739394154117005db2b354b9b560405160405180910390a35060019392505050565b6003546000906001600160a01b031633811461164f5760405162461bcd60e51b815260206004820152601960248201527f73656e646572206d75737420626520617574686f72697a656400000000000000604482015260640161059a565b6001600160a01b038316600081815260026020526040808220829055517fb1c1232c5dd039bb1c46cc05eaf25828e4f8596b7f68bdb23073ba78b9ca382d9190a250600192915050565b600085815b81811015610c925760008989838181106116ba576116ba614376565b905061012002018036038101906116d19190614468565b9050806080015161178e57806060015161173c576117378a8a848181106116fa576116fa614376565b9050610120020189898581811061171357611713614376565b9050602002013588888681811061172c5761172c614376565b905060600201611eae565b61183b565b6117378a8a8481811061175157611751614376565b9050610120020189898581811061176a5761176a614376565b9050602002013588888681811061178357611783614376565b9050606002016121a7565b80606001516117e9576117378a8a848181106117ac576117ac614376565b905061012002018989858181106117c5576117c5614376565b905060200201358888868181106117de576117de614376565b905060600201612405565b61183b8a8a848181106117fe576117fe614376565b9050610120020189898581811061181757611817614376565b9050602002013588888681811061183057611830614376565b905060600201612889565b5080611846816143d4565b91505061169e565b600085815b81811015610c9257600089898381811061186f5761186f614376565b905061012002018036038101906118869190614468565b905080608001516119435780606001516118f1576118ec8a8a848181106118af576118af614376565b905061012002018989858181106118c8576118c8614376565b905060200201358888868181106118e1576118e1614376565b905060600201612d08565b6119f0565b6118ec8a8a8481811061190657611906614376565b9050610120020189898581811061191f5761191f614376565b9050602002013588888681811061193857611938614376565b905060600201613276565b806060015161199e576118ec8a8a8481811061196157611961614376565b9050610120020189898581811061197a5761197a614376565b9050602002013588888681811061199357611993614376565b905060600201613630565b6119f08a8a848181106119b3576119b3614376565b905061012002018989858181106119cc576119cc614376565b905060200201358888868181106119e5576119e5614376565b90506060020161390e565b50806119fb816143d4565b915050611853565b6003546000906001600160a01b0316338114611a615760405162461bcd60e51b815260206004820152601960248201527f73656e646572206d75737420626520617574686f72697a656400000000000000604482015260640161059a565b6000611a706203f480426144ff565b6001600160a01b0385166000818152600260205260409081902083905551919250907fe4b67652e856f57a7747dd2473850ce987087f4b1744a870504f1c047cb56f4f90610d8c9084815260200190565b8351602094850120835193850193909320604080517f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f815295860194909452928401929092526060830152608082015260a0902090565b60006040517fa9059cbb0000000000000000000000000000000000000000000000000000000081526001600160a01b03841660048201528260248201526000806044836000895af1915050611b6c81613ca9565b611bb85760405162461bcd60e51b815260206004820152600f60248201527f7472616e73666572206661696c65640000000000000000000000000000000000604482015260640161059a565b50505050565b60006040517f095ea7b30000000000000000000000000000000000000000000000000000000081526001600160a01b03841660048201528260248201526000806044836000895af1915050611c1281613ca9565b611bb85760405162461bcd60e51b815260206004820152600e60248201527f617070726f7665206661696c6564000000000000000000000000000000000000604482015260640161059a565b600080611c6a84613cf3565b60008181526020819052604090205490915060ff1615611ccc5760405162461bcd60e51b815260206004820152600f60248201527f6f726465722063616e63656c6c65640000000000000000000000000000000000604482015260640161059a565b428461010001351015611d215760405162461bcd60e51b815260206004820152600d60248201527f6f72646572206578706972656400000000000000000000000000000000000000604482015260640161059a565b6040517f190100000000000000000000000000000000000000000000000000000000000081527f07845c349637a5f759f053b812262883a65950f96419365efdf40d78cd31acfd60028201526022810182905260429020611d829084613df1565b6001600160a01b0316611d9b6040860160208701614132565b6001600160a01b031614611df15760405162461bcd60e51b815260206004820152601160248201527f696e76616c6964207369676e6174757265000000000000000000000000000000604482015260640161059a565b9392505050565b60006040517f23b872dd0000000000000000000000000000000000000000000000000000000081526001600160a01b03851660048201526001600160a01b038416602482015282604482015260008060648360008a5af1915050611e5b81613ca9565b611ea75760405162461bcd60e51b815260206004820152601460248201527f7472616e736665722066726f6d206661696c6564000000000000000000000000604482015260640161059a565b5050505050565b6000611eba8483611c5e565b60008181526001602052604090205490915060c085013590611edc90856144ff565b1115611f2a5760405162461bcd60e51b815260206004820152601f60248201527f74616b657220616d6f756e74203e20617661696c61626c6520766f6c756d6500604482015260640161059a565b60008181526001602052604081208054859290611f489084906144ff565b9091555060009050611f606060860160408701614132565b9050600060c0860135611f7760a088013587614517565b611f819190614554565b9050611fa782611f976040890160208a01614132565b33611fa2898661458f565b611df8565b600454600090611fc19062010000900461ffff1683614554565b9050611fcf83333084611df8565b6001600160a01b037f00000000000000000000000076a3f123c651cbe62c80db5fe2539fb755dafdce166365a963aa61200e60608a0160408b01614132565b60e08a01353361202460408d0160208e01614132565b60405160e086901b7fffffffff000000000000000000000000000000000000000000000000000000001681526001600160a01b0394851660048201526024810193909352908316604483015290911660648201526084810185905260a4016020604051808303816000875af11580156120a1573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906120c59190614323565b6121115760405162461bcd60e51b815260206004820152601760248201527f7a63546f6b656e2065786368616e6765206661696c6564000000000000000000604482015260640161059a565b336121226040890160208a01614132565b6001600160a01b031688357f51cad9177cf46d59109ae978bb3cf5ffed2bb3d53fb3682fa56fbd92667128348761215f60808d0160608e016145a6565b61216f60a08e0160808f016145a6565b604080519384529115156020840152151590820152606081018b90526080810187905260a0015b60405180910390a450505050505050565b60006121b38483611c5e565b60008181526001602052604090205490915060a0850135906121d590856144ff565b11156122235760405162461bcd60e51b815260206004820152601f60248201527f74616b657220616d6f756e74203e20617661696c61626c6520766f6c756d6500604482015260640161059a565b600081815260016020526040812080548592906122419084906144ff565b90915550600090506122596060860160408701614132565b9050600060a086013561227060c088013587614517565b61227a9190614554565b9050612297826122906040890160208a01614132565b3384611df8565b6004546000906122b5906601000000000000900461ffff1683614554565b90506122c383333084611df8565b6001600160a01b037f00000000000000000000000076a3f123c651cbe62c80db5fe2539fb755dafdce1663bddbfbe461230260608a0160408b01614132565b60e08a01353361231860408d0160208e01614132565b60405160e086901b7fffffffff000000000000000000000000000000000000000000000000000000001681526001600160a01b0394851660048201526024810193909352908316604483015290911660648201526084810189905260a4016020604051808303816000875af1158015612395573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906123b99190614323565b6121115760405162461bcd60e51b815260206004820152601560248201527f7661756c742065786368616e6765206661696c65640000000000000000000000604482015260640161059a565b60006124118483611c5e565b60008181526001602052604090205490915060a08501359061243390856144ff565b11156124815760405162461bcd60e51b815260206004820152601f60248201527f74616b657220616d6f756e74203e20617661696c61626c6520766f6c756d6500604482015260640161059a565b6000818152600160205260408120805485929061249f9084906144ff565b909155507f00000000000000000000000076a3f123c651cbe62c80db5fe2539fb755dafdce905060006001600160a01b0382166305e1dc256124e76060890160408a01614132565b60405160e083811b7fffffffff000000000000000000000000000000000000000000000000000000001682526001600160a01b039290921660048201529089013560248201526044016020604051808303816000875af115801561254f573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906125739190614340565b6040517f852a12e3000000000000000000000000000000000000000000000000000000008152600481018790529091506001600160a01b0382169063852a12e3906024016020604051808303816000875af11580156125d6573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906125fa919061435d565b156126475760405162461bcd60e51b815260206004820152601960248201527f636f6d706f756e6420726564656d7074696f6e206572726f7200000000000000604482015260640161059a565b60006126596060880160408901614132565b9050600060a088013561267060c08a013589614517565b61267a9190614554565b905061269a8261269060408b0160208c01614132565b61116b848b61458f565b6004546000906126b8906601000000000000900461ffff1683614554565b90506126c9833361116b848661458f565b6001600160a01b038516638c6b9b416126e860608c0160408d01614132565b60e08c01356126fd60408e0160208f01614132565b60405160e085901b7fffffffff000000000000000000000000000000000000000000000000000000001681526001600160a01b03938416600482015260248101929092529091166044820152336064820152608481018b905260a4016020604051808303816000875af1158015612778573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061279c9190614323565b6127e85760405162461bcd60e51b815260206004820152601560248201527f637573746f6469616c2065786974206661696c65640000000000000000000000604482015260640161059a565b336127f960408b0160208c01614132565b6001600160a01b03168a600001357f51cad9177cf46d59109ae978bb3cf5ffed2bb3d53fb3682fa56fbd9266712834898d606001602081019061283c91906145a6565b8e608001602081019061284f91906145a6565b604080519384529115156020840152151590820152606081018d90526080810187905260a0015b60405180910390a4505050505050505050565b60006128958483611c5e565b60008181526001602052604090205490915060c0850135906128b790856144ff565b11156129055760405162461bcd60e51b815260206004820152601f60248201527f74616b657220616d6f756e74203e20617661696c61626c6520766f6c756d6500604482015260640161059a565b600081815260016020526040812080548592906129239084906144ff565b909155507f00000000000000000000000076a3f123c651cbe62c80db5fe2539fb755dafdce905060006001600160a01b0382166305e1dc2561296b6060890160408a01614132565b60405160e083811b7fffffffff000000000000000000000000000000000000000000000000000000001682526001600160a01b039290921660048201529089013560248201526044016020604051808303816000875af11580156129d3573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906129f79190614340565b9050600060c0870135612a0e60a089013588614517565b612a189190614554565b6040517f852a12e3000000000000000000000000000000000000000000000000000000008152600481018290529091506001600160a01b0383169063852a12e3906024016020604051808303816000875af1158015612a7b573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612a9f919061435d565b15612aec5760405162461bcd60e51b815260206004820152601960248201527f636f6d706f756e6420726564656d7074696f6e206572726f7200000000000000604482015260640161059a565b6000612afe6060890160408a01614132565b600454909150600090612b1b9062010000900461ffff1684614554565b9050612b37823383612b2d8c8861458f565b61116b919061458f565b612b5182612b4b60408c0160208d01614132565b8a611b18565b6001600160a01b038516638c6b9b41612b7060608c0160408d01614132565b8b60e00135338d6020016020810190612b899190614132565b60405160e086901b7fffffffff000000000000000000000000000000000000000000000000000000001681526001600160a01b0394851660048201526024810193909352908316604483015290911660648201526084810186905260a4016020604051808303816000875af1158015612c06573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612c2a9190614323565b612c765760405162461bcd60e51b815260206004820152601560248201527f637573746f6469616c2065786974206661696c65640000000000000000000000604482015260640161059a565b33612c8760408b0160208c01614132565b6001600160a01b03168a600001357f51cad9177cf46d59109ae978bb3cf5ffed2bb3d53fb3682fa56fbd9266712834898d6060016020810190612cca91906145a6565b8e6080016020810190612cdd91906145a6565b604080519384529115156020840152151590820152606081018d90526080810188905260a001612876565b6000612d148483611c5e565b60008181526001602052604090205490915060c085013590612d3690856144ff565b1115612d845760405162461bcd60e51b815260206004820152601f60248201527f74616b657220616d6f756e74203e20617661696c61626c6520766f6c756d6500604482015260640161059a565b60008181526001602052604081208054859290612da29084906144ff565b9091555060009050612dba6060860160408701614132565b9050612dd78133612dd16040890160208a01614132565b87611df8565b600060c0860135612dec60a088013587614517565b612df69190614554565b9050612e1382612e0c6040890160208a01614132565b3084611df8565b7f00000000000000000000000076a3f123c651cbe62c80db5fe2539fb755dafdce6001600160a01b0381166305e1dc25612e5360608a0160408b01614132565b60405160e083811b7fffffffff000000000000000000000000000000000000000000000000000000001682526001600160a01b03929092166004820152908a013560248201526044016020604051808303816000875af1158015612ebb573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612edf9190614340565b6001600160a01b031663a0712d68836040518263ffffffff1660e01b8152600401612f0c91815260200190565b6020604051808303816000875af1158015612f2b573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612f4f919061435d565b15612f9c5760405162461bcd60e51b815260206004820152601560248201527f6d696e74696e672043546f6b656e206661696c65640000000000000000000000604482015260640161059a565b6001600160a01b03811663f8e51bcb612fbb60608a0160408b01614132565b60e08a0135612fd060408c0160208d01614132565b60405160e085901b7fffffffff000000000000000000000000000000000000000000000000000000001681526001600160a01b039384166004820152602481019290925290911660448201523360648201526084810185905260a4016020604051808303816000875af115801561304b573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061306f9190614323565b6130bb5760405162461bcd60e51b815260206004820152601960248201527f637573746f6469616c20696e697469617465206661696c656400000000000000604482015260640161059a565b6004546000906130d790640100000000900461ffff1684614554565b90506001600160a01b038216633cf9a4e36130f860608b0160408c01614132565b60405160e083811b7fffffffff000000000000000000000000000000000000000000000000000000001682526001600160a01b03929092166004820152908b01356024820152336044820152606481018490526084016020604051808303816000875af115801561316d573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906131919190614323565b6131dd5760405162461bcd60e51b815260206004820152601c60248201527f6e6f74696f6e616c20666565207472616e73666572206661696c656400000000604482015260640161059a565b336131ee60408a0160208b01614132565b6001600160a01b031689357f32bc401d77ffde781b234d480866e0c360e724770a30ea3299309f9171e400ef8861322b60808e0160608f016145a6565b8d608001602081019061323e91906145a6565b604080519384529115156020840152151590820152606081018c90526080810188905260a00160405180910390a45050505050505050565b60006132828483611c5e565b60008181526001602052604090205490915060a0850135906132a490856144ff565b11156132f25760405162461bcd60e51b815260206004820152601f60248201527f74616b657220616d6f756e74203e20617661696c61626c6520766f6c756d6500604482015260640161059a565b600081815260016020526040812080548592906133109084906144ff565b90915550600090506133286060860160408701614132565b9050600060a086013561333f60c088013587614517565b6133499190614554565b905061335f826122906040890160208a01614132565b6004546000906133739061ffff1683614554565b9050613385833330611fa2858b6144ff565b7f00000000000000000000000076a3f123c651cbe62c80db5fe2539fb755dafdce6001600160a01b0381166305e1dc256133c560608b0160408c01614132565b60405160e083811b7fffffffff000000000000000000000000000000000000000000000000000000001682526001600160a01b03929092166004820152908b013560248201526044016020604051808303816000875af115801561342d573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906134519190614340565b6001600160a01b031663a0712d68886040518263ffffffff1660e01b815260040161347e91815260200190565b6020604051808303816000875af115801561349d573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906134c1919061435d565b1561350e5760405162461bcd60e51b815260206004820152601560248201527f6d696e74696e672043546f6b656e204661696c65640000000000000000000000604482015260640161059a565b6001600160a01b03811663f8e51bcb61352d60608b0160408c01614132565b60e08b01353361354360408e0160208f01614132565b60405160e086901b7fffffffff000000000000000000000000000000000000000000000000000000001681526001600160a01b039485166004820152602481019390935290831660448301529091166064820152608481018a905260a4016020604051808303816000875af11580156135c0573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906135e49190614323565b6131dd5760405162461bcd60e51b815260206004820152601960248201527f637573746f6469616c20696e697469617465206661696c656400000000000000604482015260640161059a565b600061363c8483611c5e565b60008181526001602052604090205490915060a08501359061365e90856144ff565b11156136ac5760405162461bcd60e51b815260206004820152601f60248201527f74616b657220616d6f756e74203e20617661696c61626c6520766f6c756d6500604482015260640161059a565b600081815260016020526040812080548592906136ca9084906144ff565b909155506000905060a08501356136e560c087013586614517565b6136ef9190614554565b905060006137036060870160408801614132565b9050613724813361371a60408a0160208b01614132565b611fa2868a61458f565b6004546000906137389061ffff1684614554565b905061374682333084611df8565b6001600160a01b037f00000000000000000000000076a3f123c651cbe62c80db5fe2539fb755dafdce166365a963aa61378560608a0160408b01614132565b60e08a013561379a60408c0160208d01614132565b60405160e085901b7fffffffff000000000000000000000000000000000000000000000000000000001681526001600160a01b039384166004820152602481019290925290911660448201523360648201526084810189905260a4016020604051808303816000875af1158015613815573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906138399190614323565b6138855760405162461bcd60e51b815260206004820152601760248201527f7a63546f6b656e2065786368616e6765206661696c6564000000000000000000604482015260640161059a565b336138966040890160208a01614132565b6001600160a01b031688357f32bc401d77ffde781b234d480866e0c360e724770a30ea3299309f9171e400ef876138d360808d0160608e016145a6565b6138e360a08e0160808f016145a6565b604080519384529115156020840152151590820152606081018b90526080810188905260a001612196565b600061391a8483611c5e565b60008181526001602052604090205490915060c08501359061393c90856144ff565b111561398a5760405162461bcd60e51b815260206004820152601f60248201527f74616b657220616d6f756e74203e20617661696c61626c6520766f6c756d6500604482015260640161059a565b600081815260016020526040812080548592906139a89084906144ff565b909155506139d890506139c16060860160408701614132565b336139d26040880160208901614132565b86611df8565b7f00000000000000000000000076a3f123c651cbe62c80db5fe2539fb755dafdce600060c0860135613a0e60a088013587614517565b613a189190614554565b90506001600160a01b03821663bddbfbe4613a396060890160408a01614132565b60e0890135613a4e60408b0160208c01614132565b60405160e085901b7fffffffff000000000000000000000000000000000000000000000000000000001681526001600160a01b039384166004820152602481019290925290911660448201523360648201526084810184905260a4016020604051808303816000875af1158015613ac9573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613aed9190614323565b613b395760405162461bcd60e51b815260206004820152601560248201527f7661756c742065786368616e6765206661696c65640000000000000000000000604482015260640161059a565b600454600090613b5590640100000000900461ffff1683614554565b90506001600160a01b038316633cf9a4e3613b7660608a0160408b01614132565b60405160e083811b7fffffffff000000000000000000000000000000000000000000000000000000001682526001600160a01b03929092166004820152908a01356024820152336044820152606481018490526084016020604051808303816000875af1158015613beb573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613c0f9190614323565b613c5b5760405162461bcd60e51b815260206004820152601c60248201527f6e6f74696f6e616c20666565207472616e73666572206661696c656400000000604482015260640161059a565b33613c6c6040890160208a01614132565b6001600160a01b031688357f32bc401d77ffde781b234d480866e0c360e724770a30ea3299309f9171e400ef8761215f60808d0160608e016145a6565b6000803d83613cbc57806000803e806000fd5b8060208114613cd4578015613ce55760009250613cea565b816000803e60005115159250613cea565b600192505b50909392505050565b60007f7ddd38ab5ed1c16b61ca90eeb9579e29da1ba821cf42d8cdef8f30a31a6a41468235613d286040850160208601614132565b613d386060860160408701614132565b613d4860808701606088016145a6565b613d5860a08801608089016145a6565b8760a001358860c001358960e001358a6101000135604051602001613dd49a99989796959493929190998a5260208a01989098526001600160a01b0396871660408a01529490951660608801529115156080870152151560a086015260c085015260e08401919091526101008301526101208201526101400190565b604051602081830303815290604052805190602001209050919050565b60007f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a060408301351115613e675760405162461bcd60e51b815260206004820152601b60248201527f696e76616c6964207369676e6174757265202273222076616c75650000000000604482015260640161059a565b613e7460208301836145c3565b60ff16601b1480613e945750613e8d60208301836145c3565b60ff16601c145b613ee05760405162461bcd60e51b815260206004820152601b60248201527f696e76616c6964207369676e6174757265202276222076616c75650000000000604482015260640161059a565b600183613ef060208501856145c3565b604080516000815260208181018084529490945260ff9092168282015291850135606082015290840135608082015260a0016020604051602081039080840390855afa158015613f44573d6000803e3d6000fd5b50506040517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe00151949350505050565b6001600160a01b0381168114613f8957600080fd5b50565b8035613f9781613f74565b919050565b600080600060608486031215613fb157600080fd5b8335613fbc81613f74565b95602085013595506040909401359392505050565b60008060408385031215613fe457600080fd5b8235613fef81613f74565b946020939093013593505050565b60008083601f84011261400f57600080fd5b50813567ffffffffffffffff81111561402757600080fd5b6020830191508360208260051b850101111561404257600080fd5b9250929050565b6000806000806040858703121561405f57600080fd5b843567ffffffffffffffff8082111561407757600080fd5b61408388838901613ffd565b9096509450602087013591508082111561409c57600080fd5b506140a987828801613ffd565b95989497509550505050565b6000602082840312156140c757600080fd5b5035919050565b6000808284036101808112156140e357600080fd5b610120808212156140f357600080fd5b84935060607ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffee08301121561412657600080fd5b92959390920193505050565b60006020828403121561414457600080fd5b8135611df181613f74565b803561ffff81168114613f9757600080fd5b6000806040838503121561417457600080fd5b61417d8361414f565b915061418b6020840161414f565b90509250929050565b600060208083528351808285015260005b818110156141c1578581018301518582016040015282016141a5565b818111156141d3576000604083870101525b50601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016929092016040019392505050565b60008083601f84011261421957600080fd5b50813567ffffffffffffffff81111561423157600080fd5b60208301915083602060608302850101111561404257600080fd5b6000806000806000806060878903121561426557600080fd5b863567ffffffffffffffff8082111561427d57600080fd5b818901915089601f83011261429157600080fd5b8135818111156142a057600080fd5b8a6020610120830285010111156142b657600080fd5b6020928301985096509088013590808211156142d157600080fd5b6142dd8a838b01613ffd565b909650945060408901359150808211156142f657600080fd5b5061430389828a01614207565b979a9699509497509295939492505050565b8015158114613f8957600080fd5b60006020828403121561433557600080fd5b8151611df181614315565b60006020828403121561435257600080fd5b8151611df181613f74565b60006020828403121561436f57600080fd5b5051919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b60007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8203614405576144056143a5565b5060010190565b604051610120810167ffffffffffffffff81118282101715614457577f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b60405290565b8035613f9781614315565b6000610120828403121561447b57600080fd5b61448361440c565b8235815261449360208401613f8c565b60208201526144a460408401613f8c565b60408201526144b56060840161445d565b60608201526144c66080840161445d565b608082015260a083013560a082015260c083013560c082015260e083013560e08201526101008084013581830152508091505092915050565b60008219821115614512576145126143a5565b500190565b6000817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff048311821515161561454f5761454f6143a5565b500290565b60008261458a577f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b500490565b6000828210156145a1576145a16143a5565b500390565b6000602082840312156145b857600080fd5b8135611df181614315565b6000602082840312156145d557600080fd5b813560ff81168114611df157600080fdfea2646970667358221220ef13a69af84988ea5fbe4eedf2b1d197fa7ffe761e21cba8bddbabf9827e757364736f6c634300080d0033

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

00000000000000000000000076a3f123c651cbe62c80db5fe2539fb755dafdce0000000000000000000000003b983b701406010866bd68331aaed374fb9f50c9

-----Decoded View---------------
Arg [0] : m (address): 0x76A3F123c651CbE62c80dB5FE2539fb755DAfDCe
Arg [1] : v (address): 0x3b983B701406010866bD68331aAed374fb9f50C9

-----Encoded View---------------
2 Constructor Arguments found :
Arg [0] : 00000000000000000000000076a3f123c651cbe62c80db5fe2539fb755dafdce
Arg [1] : 0000000000000000000000003b983b701406010866bd68331aaed374fb9f50c9


Deployed Bytecode Sourcemap

157:23895:4:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;20645:451;;;;;;:::i;:::-;;:::i;:::-;;;865:14:5;;858:22;840:41;;828:2;813:18;20645:451:4;;;;;;;;817:44;;859:2;817:44;;;;;1066:6:5;1054:19;;;1036:38;;1024:2;1009:18;817:44:4;892:188:5;22861:525:4;;;;;;:::i;:::-;;:::i;21397:524::-;;;;;;:::i;:::-;;:::i;19089:367::-;;;;;;:::i;:::-;;:::i;388:42::-;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;2886:25:5;;;2874:2;2859:18;388:42:4;2740:177:5;263:42:4;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;753:36;;;;;;;;-1:-1:-1;;;;;3086:55:5;;;3068:74;;3056:2;3041:18;753:36:4;2922:226:5;16885:275:4;;;;;;:::i;:::-;;:::i;22133:522::-;;;;;;:::i;:::-;;:::i;18135:368::-;;;;;;:::i;:::-;;:::i;17249:114::-;;;;;;:::i;:::-;;:::i;531:47::-;;;;;;:::i;:::-;;;;;;;;;;;;;;19838:440;;;;;;:::i;:::-;;:::i;964:30::-;;;;;;:::i;:::-;;:::i;18658:204::-;;;;;;:::i;:::-;;:::i;17820:161::-;;;;;;:::i;:::-;;:::i;583:46::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;9533:1270::-;;;;;;:::i;:::-;;:::i;718:31::-;;;;;677:37;;708:6;677:37;;2791:755;;;;;;:::i;:::-;;:::i;793:20::-;;;;;-1:-1:-1;;;;;793:20:4;;;17487:213;;;;;;:::i;:::-;;:::i;633:40::-;;;;;;;;;;;;;;;;;;;;;20645:451;20790:55;;;;;-1:-1:-1;;;;;7368:15:5;;;20790:55:4;;;7350:34:5;7400:18;;;7393:34;;;20831:10:4;7443:18:5;;;7436:43;7495:18;;;7488:34;;;20719:4:4;;20764:11;;20790:34;;;;;7261:19:5;;20790:55:4;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;20782:105;;;;-1:-1:-1;;;20782:105:4;;8108:2:5;20782:105:4;;;8090:21:5;8147:2;8127:18;;;8120:30;8186:34;8166:18;;;8159:62;8257:7;8237:18;;;8230:35;8282:19;;20782:105:4;;;;;;;;;20914:26;;;;;-1:-1:-1;;;;;8504:55:5;;;20914:26:4;;;8486:74:5;8576:18;;;8569:34;;;20893:18:4;;20914:20;;;;;;8459:18:5;;20914:26:4;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;20955:38;;;;;;;;2886:25:5;;;20893:47:4;;-1:-1:-1;;;;;;20955:35:4;;;;;2859:18:5;;20955:38:4;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:43;20946:83;;;;-1:-1:-1;;;20946:83:4;;9261:2:5;20946:83:4;;;9243:21:5;9300:2;9280:18;;;9273:30;9339:27;9319:18;;;9312:55;9384:18;;20946:83:4;9059:349:5;20946:83:4;21035:38;21055:1;21059:10;21071:1;21035:13;:38::i;:::-;-1:-1:-1;21087:4:4;;20645:451;-1:-1:-1;;;;;20645:451:4:o;22861:525::-;23075:47;;;;;-1:-1:-1;;;;;9694:15:5;;;23075:47:4;;;9676:34:5;9726:18;;;9719:34;;;23116:4:4;9769:18:5;;;9762:43;22936:4:4;;22981:11;;22936:4;;23075:26;;;;;;9588:18:5;;23075:47:4;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;23182:26;;;;;-1:-1:-1;;;;;8504:55:5;;;23182:26:4;;;8486:74:5;8576:18;;;8569:34;;;23056:66:4;;-1:-1:-1;23182:20:4;;;;;;8459:18:5;;23182:26:4;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;;;;;23175:51:4;;23227:8;23175:61;;;;;;;;;;;;;2886:25:5;;2874:2;2859:18;;2740:177;23175:61:4;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:66;23167:105;;;;-1:-1:-1;;;23167:105:4;;10018:2:5;23167:105:4;;;10000:21:5;10057:2;10037:18;;;10030:30;10096:28;10076:18;;;10069:56;10142:18;;23167:105:4;9816:350:5;23167:105:4;-1:-1:-1;23377:4:4;;22861:525;-1:-1:-1;;;;22861:525:4:o;21397:524::-;21610:41;;;;;-1:-1:-1;;;;;7368:15:5;;;21610:41:4;;;7350:34:5;7400:18;;;7393:34;;;21637:10:4;7443:18:5;;;7436:43;7495:18;;;7488:34;;;21471:4:4;;21516:11;;21471:4;;21610:20;;;;;;7261:19:5;;21610:41:4;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;21711:26;;;;;-1:-1:-1;;;;;8504:55:5;;;21711:26:4;;;8486:74:5;8576:18;;;8569:34;;;21591:60:4;;-1:-1:-1;21711:20:4;;;;;;8459:18:5;;21711:26:4;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;;;;;21704:51:4;;21756:8;21704:61;;;;;;;;;;;;;2886:25:5;;2874:2;2859:18;;2740:177;21704:61:4;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:66;21696:105;;;;-1:-1:-1;;;21696:105:4;;10018:2:5;21696:105:4;;;10000:21:5;10057:2;10037:18;;;10030:30;10096:28;10076:18;;;10069:56;10142:18;;21696:105:4;9816:350:5;21696:105:4;21853:45;21873:1;21877:10;21889:8;21853:13;:45::i;19089:367::-;19180:5;;19196:4;;-1:-1:-1;;;;;19180:5:4;23993:10;:15;;23985:53;;;;-1:-1:-1;;;23985:53:4;;10373:2:5;23985:53:4;;;10355:21:5;10412:2;10392:18;;;10385:30;10451:27;10431:18;;;10424:55;10496:18;;23985:53:4;10171:349:5;23985:53:4;19222:1;19245:15;;::::1;19236:50;;;::::0;-1:-1:-1;;;19236:50:4;;10727:2:5;19236:50:4::1;::::0;::::1;10709:21:5::0;10766:2;10746:18;;;10739:30;10805:23;10785:18;;;10778:51;10846:18;;19236:50:4::1;10525:345:5::0;19236:50:4::1;19307:10;19293:11;19324:110;19344:3;19340:1;:7;19324:110;;;19362:12;19383:1;;19385;19383:4;;;;;;;:::i;:::-;;;;;;;;;;;;;;:::i;:::-;19362:26;;19396:31;19409:6;19417:1;;19419;19417:4;;;;;;;:::i;:::-;;;;;;;;;;;;;;:::i;:::-;19423:3;19396:12;:31::i;:::-;-1:-1:-1::0;19349:3:4;::::1;::::0;::::1;:::i;:::-;;;;19324:110;;;-1:-1:-1::0;19447:4:4::1;::::0;19089:367;-1:-1:-1;;;;;;;;19089:367:4:o;16885:275::-;16969:4;16981:12;16996:20;17011:1;17014;16996:14;:20::i;:::-;16981:35;-1:-1:-1;17045:7:4;;;;;;;;:::i;:::-;-1:-1:-1;;;;;17031:21:4;:10;-1:-1:-1;;;;;17031:21:4;;17023:54;;;;-1:-1:-1;;;17023:54:4;;11655:2:5;17023:54:4;;;11637:21:5;11694:2;11674:18;;;11667:30;11733:22;11713:18;;;11706:50;11773:18;;17023:54:4;11453:344:5;17023:54:4;17084:9;:15;;;;;;;;;;;;:22;;;;17102:4;17084:22;;;17118:19;17125:5;;;17118:19;;;;17094:4;2886:25:5;;2874:2;2859:18;;2740:177;17118:19:4;;;;;;;;-1:-1:-1;17151:4:4;;16885:275;-1:-1:-1;;;16885:275:4:o;22133:522::-;22341:44;;;;;-1:-1:-1;;;;;9694:15:5;;;22341:44:4;;;9676:34:5;9726:18;;;9719:34;;;22374:10:4;9769:18:5;;;9762:43;22202:4:4;;22247:11;;22202:4;;22341:26;;;;;;9588:18:5;;22341:44:4;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;22445:26;;;;;-1:-1:-1;;;;;8504:55:5;;;22445:26:4;;;8486:74:5;8576:18;;;8569:34;;;22322:63:4;;-1:-1:-1;22445:20:4;;;;;;8459:18:5;;22445:26:4;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;;;;;22438:51:4;;22490:8;22438:61;;;;;;;;;;;;;2886:25:5;;2874:2;2859:18;;2740:177;22438:61:4;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:66;22430:105;;;;-1:-1:-1;;;22430:105:4;;10018:2:5;22430:105:4;;;10000:21:5;10057:2;10037:18;;;10030:30;10096:28;10076:18;;;10069:56;10142:18;;22430:105:4;9816:350:5;22430:105:4;22587:45;22607:1;22611:10;22623:8;22587:13;:45::i;18135:368::-;18184:5;;18200:4;;-1:-1:-1;;;;;18184:5:4;23993:10;:15;;23985:53;;;;-1:-1:-1;;;23985:53:4;;10373:2:5;23985:53:4;;;10355:21:5;10412:2;10392:18;;;10385:30;10451:27;10431:18;;;10424:55;10496:18;;23985:53:4;10171:349:5;23985:53:4;-1:-1:-1;;;;;18227:14:4;::::1;18212:12;18227:14:::0;;;:11:::1;:14;::::0;;;;;;18256:9;;;18247:46:::1;;;::::0;-1:-1:-1;;;18247:46:4;;12004:2:5;18247:46:4::1;::::0;::::1;11986:21:5::0;12043:2;12023:18;;;12016:30;12082:25;12062:18;;;12055:53;12125:18;;18247:46:4::1;11802:347:5::0;18247:46:4::1;18328:4;18309:15;:23;;18300:61;;;::::0;-1:-1:-1;;;18300:61:4;;12356:2:5;18300:61:4::1;::::0;::::1;12338:21:5::0;12395:2;12375:18;;;12368:30;12434:26;12414:18;;;12407:54;12478:18;;18300:61:4::1;12154:348:5::0;18300:61:4::1;-1:-1:-1::0;;;;;18368:14:4;;::::1;18385:1;18368:14:::0;;;:11:::1;:14;::::0;;;;;:18;;;;18442:5:::1;::::0;18449:30;;;;;18473:4:::1;18449:30;::::0;::::1;3068:74:5::0;18368:14:4;;18421:59:::1;::::0;18368:14;;18442:5;;::::1;::::0;18449:15:::1;::::0;3041:18:5;;18449:30:4::1;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;18421:13;:59::i;17249:114::-:0;17303:5;;17319:4;;-1:-1:-1;;;;;17303:5:4;23993:10;:15;;23985:53;;;;-1:-1:-1;;;23985:53:4;;10373:2:5;23985:53:4;;;10355:21:5;10412:2;10392:18;;;10385:30;10451:27;10431:18;;;10424:55;10496:18;;23985:53:4;10171:349:5;23985:53:4;17331:5:::1;:9:::0;;-1:-1:-1;;;;;17331:9:4;::::1;::::0;;;::::1;;::::0;;;;-1:-1:-1;17249:114:4;;;;:::o;19838:440::-;19914:4;19947:1;19955:55;19947:1;19981:10;20001:4;20008:1;19955:17;:55::i;:::-;20082:26;;;;;-1:-1:-1;;;;;8504:55:5;;;20082:26:4;;;8486:74:5;8576:18;;;8569:34;;;20049:11:4;;20082:20;;;;;;8459:18:5;;20082:26:4;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;;;;;20075:39:4;;20115:1;20075:42;;;;;;;;;;;;;2886:25:5;;2874:2;2859:18;;2740:177;20075:42:4;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:47;20067:81;;;;-1:-1:-1;;;20067:81:4;;12709:2:5;20067:81:4;;;12691:21:5;12748:2;12728:18;;;12721:30;12787:23;12767:18;;;12760:51;12828:18;;20067:81:4;12507:345:5;20067:81:4;20162:53;;;;;-1:-1:-1;;;;;7368:15:5;;;20162:53:4;;;7350:34:5;7400:18;;;7393:34;;;20201:10:4;7443:18:5;;;7436:43;7495:18;;;7488:34;;;20162:32:4;;;;;7261:19:5;;20162:53:4;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;20154:101;;;;-1:-1:-1;;;20154:101:4;;13059:2:5;20154:101:4;;;13041:21:5;13098:2;13078:18;;;13071:30;13137:34;13117:18;;;13110:62;13208:5;13188:18;;;13181:33;13231:19;;20154:101:4;12857:399:5;964:30:4;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;18658:204::-;18714:5;;18730:4;;-1:-1:-1;;;;;18714:5:4;23993:10;:15;;23985:53;;;;-1:-1:-1;;;23985:53:4;;10373:2:5;23985:53:4;;;10355:21:5;10412:2;10392:18;;;10385:30;10451:27;10431:18;;;10424:55;10496:18;;23985:53:4;10171:349:5;23985:53:4;859:2:::1;18750:21;::::0;::::1;;;18742:46;;;::::0;-1:-1:-1;;;18742:46:4;;13463:2:5;18742:46:4::1;::::0;::::1;13445:21:5::0;13502:2;13482:18;;;13475:30;13541:14;13521:18;;;13514:42;13573:18;;18742:46:4::1;13261:336:5::0;18742:46:4::1;18814:1;18795:13;18809:1;18795:16;;;;;;;;;:::i;:::-;;;;;;;;;;;;:20;;;;;;;;;;;;;;;;;;18837:1;18827:12;;18834:1;18827:12;;;;;;;;;;;;-1:-1:-1::0;18853:4:4::1;::::0;18658:204;-1:-1:-1;;;18658:204:4:o;17820:161::-;17876:5;;17892:4;;-1:-1:-1;;;;;17876:5:4;23993:10;:15;;23985:53;;;;-1:-1:-1;;;23985:53:4;;10373:2:5;23985:53:4;;;10355:21:5;10412:2;10392:18;;;10385:30;10451:27;10431:18;;;10424:55;10496:18;;23985:53:4;10171:349:5;23985:53:4;-1:-1:-1;;;;;17906:14:4;::::1;17923:1;17906:14:::0;;;:11:::1;:14;::::0;;;;;:18;;;17938;::::1;::::0;17923:1;17938:18:::1;-1:-1:-1::0;17972:4:4::1;::::0;17820:161;-1:-1:-1;;17820:161:4:o;9533:1270::-;9641:4;9667:1;9641:4;9777:1004;9797:3;9793:1;:7;9777:1004;;;9815:23;9841:1;;9843;9841:4;;;;;;;:::i;:::-;;;;;;9815:30;;;;;;;;;;:::i;:::-;;;9908:5;:10;;;9903:869;;10016:5;:11;;;10011:346;;10126:51;10160:1;;10162;10160:4;;;;;;;:::i;:::-;;;;;;10166:1;;10168;10166:4;;;;;;;:::i;:::-;;;;;;;10172:1;;10174;10172:4;;;;;;;:::i;:::-;;;;;;10126:33;:51::i;:::-;9903:869;;10011:346;10297:47;10327:1;;10329;10327:4;;;;;;;:::i;:::-;;;;;;10333:1;;10335;10333:4;;;;;;;:::i;:::-;;;;;;;10339:1;;10341;10339:4;;;;;;;:::i;:::-;;;;;;10297:29;:47::i;9903:869::-;10457:5;:11;;;10452:309;;10556:45;10584:1;;10586;10584:4;;;;;;;:::i;:::-;;;;;;10590:1;;10592;10590:4;;;;;;;:::i;:::-;;;;;;;10596:1;;10598;10596:4;;;;;;;:::i;:::-;;;;;;10556:27;:45::i;10452:309::-;10705:45;10733:1;;10735;10733:4;;;;;;;:::i;:::-;;;;;;10739:1;;10741;10739:4;;;;;;;:::i;:::-;;;;;;;10745:1;;10747;10745:4;;;;;;;:::i;:::-;;;;;;10705:27;:45::i;:::-;-1:-1:-1;9802:3:4;;;;:::i;:::-;;;;9777:1004;;2791:755;2903:4;2929:1;2903:4;3039:485;3059:3;3055:1;:7;3039:485;;;3077:23;3103:1;;3105;3103:4;;;;;;;:::i;:::-;;;;;;3077:30;;;;;;;;;;:::i;:::-;;;3120:5;:10;;;3115:403;;3147:5;:11;;;3142:176;;3172:53;3208:1;;3210;3208:4;;;;;;;:::i;:::-;;;;;;3214:1;;3216;3214:4;;;;;;;:::i;:::-;;;;;;;3220:1;;3222;3220:4;;;;;;;:::i;:::-;;;;;;3172:35;:53::i;:::-;3115:403;;3142:176;3254:53;3290:1;;3292;3290:4;;;;;;;:::i;:::-;;;;;;3296:1;;3298;3296:4;;;;;;;:::i;:::-;;;;;;;3302:1;;3304;3302:4;;;;;;;:::i;:::-;;;;;;3254:35;:53::i;3115:403::-;3347:5;:11;;;3342:168;;3372:51;3406:1;;3408;3406:4;;;;;;;:::i;:::-;;;;;;3412:1;;3414;3412:4;;;;;;;:::i;:::-;;;;;;;3418:1;;3420;3418:4;;;;;;;:::i;:::-;;;;;;3372:33;:51::i;3342:168::-;3452:47;3482:1;;3484;3482:4;;;;;;;:::i;:::-;;;;;;3488:1;;3490;3488:4;;;;;;;:::i;:::-;;;;;;;3494:1;;3496;3494:4;;;;;;;:::i;:::-;;;;;;3452:29;:47::i;:::-;-1:-1:-1;3064:3:4;;;;:::i;:::-;;;;3039:485;;17487:213;17546:5;;17562:4;;-1:-1:-1;;;;;17546:5:4;23993:10;:15;;23985:53;;;;-1:-1:-1;;;23985:53:4;;10373:2:5;23985:53:4;;;10355:21:5;10412:2;10392:18;;;10385:30;10451:27;10431:18;;;10424:55;10496:18;;23985:53:4;10171:349:5;23985:53:4;17574:12:::1;17589:22;708:6;17589:15;:22;:::i;:::-;-1:-1:-1::0;;;;;17617:14:4;::::1;;::::0;;;:11:::1;:14;::::0;;;;;;:21;;;17650:27;17574:37;;-1:-1:-1;17617:14:4;17650:27:::1;::::0;::::1;::::0;17574:37;2886:25:5;;2874:2;2859:18;;2740:177;1674:572:0;1871:8;;1866:2;1859:10;;;1849:31;1934:14;;1916:16;;;1906:43;;;;1977:2;1971:9;;2003:15;1987:32;;2033:16;;;2026:34;;;;2074:16;;;2067:37;;;;2131:2;2118:16;;2111:27;2165:3;2152:17;;2145:35;2214:3;2195:23;;;1674:572::o;1647:830:2:-;1711:11;1811:4;1805:11;1906:66;1897:7;1890:83;-1:-1:-1;;;;;2045:1:2;2041:50;2037:1;2028:7;2024:15;2017:75;2162:1;2157:2;2148:7;2144:16;2137:27;2415:1;2412;2408:2;2399:7;2396:1;2393;2386:5;2381:36;2371:46;;;2437:15;2445:6;2437:7;:15::i;:::-;2429:43;;;;-1:-1:-1;;;2429:43:2;;15319:2:5;2429:43:2;;;15301:21:5;15358:2;15338:18;;;15331:30;15397:17;15377:18;;;15370:45;15432:18;;2429:43:2;15117:339:5;2429:43:2;1705:772;1647:830;;;:::o;697:828::-;760:11;860:4;854:11;955:66;946:7;939:83;-1:-1:-1;;;;;1094:1:2;1090:50;1086:1;1077:7;1073:15;1066:75;1211:1;1206:2;1197:7;1193:16;1186:27;1464:1;1461;1457:2;1448:7;1445:1;1442;1435:5;1430:36;1420:46;;;1486:15;1494:6;1486:7;:15::i;:::-;1478:42;;;;-1:-1:-1;;;1478:42:2;;15663:2:5;1478:42:2;;;15645:21:5;15702:2;15682:18;;;15675:30;15741:16;15721:18;;;15714:44;15775:18;;1478:42:2;15461:338:5;23582:362:4;23679:7;23694:12;23709:13;23720:1;23709:10;:13::i;:::-;23738:9;:15;;;;;;;;;;;23694:28;;-1:-1:-1;23738:15:4;;23737:16;23729:44;;;;-1:-1:-1;;;23729:44:4;;16006:2:5;23729:44:4;;;15988:21:5;16045:2;16025:18;;;16018:30;16084:17;16064:18;;;16057:45;16119:18;;23729:44:4;15804:339:5;23729:44:4;23799:15;23787:1;:8;;;:27;;23779:53;;;;-1:-1:-1;;;23779:53:4;;16350:2:5;23779:53:4;;;16332:21:5;16389:2;16369:18;;;16362:30;16428:15;16408:18;;;16401:43;16461:18;;23779:53:4;16148:337:5;23779:53:4;2505:2:0;2499:9;2531:66;2515:83;;23882:6:4;2625:1:0;2612:15;;2605:26;2658:2;2645:16;;2638:27;;;2699:2;2680:22;;23857:42:4;;23897:1;23857:11;:42::i;:::-;-1:-1:-1;;;;;23846:53:4;:7;;;;;;;;:::i;:::-;-1:-1:-1;;;;;23846:53:4;;23838:83;;;;-1:-1:-1;;;23838:83:4;;16692:2:5;23838:83:4;;;16674:21:5;16731:2;16711:18;;;16704:30;16770:19;16750:18;;;16743:47;16807:18;;23838:83:4;16490:341:5;23838:83:4;23935:4;23582:362;-1:-1:-1;;;23582:362:4:o;2627:975:2:-;2706:11;2806:4;2800:11;2901:66;2892:7;2885:83;-1:-1:-1;;;;;3040:1:2;3036:50;3032:1;3023:7;3019:15;3012:75;-1:-1:-1;;;;;3163:1:2;3159:50;3154:2;3145:7;3141:16;3134:76;3280:1;3275:2;3266:7;3262:16;3255:27;3535:1;3532;3527:3;3518:7;3515:1;3512;3505:5;3500:37;3490:47;;;3557:15;3565:6;3557:7;:15::i;:::-;3549:48;;;;-1:-1:-1;;;3549:48:2;;17038:2:5;3549:48:2;;;17020:21:5;17077:2;17057:18;;;17050:30;17116:22;17096:18;;;17089:50;17156:18;;3549:48:2;16836:344:5;3549:48:2;2700:902;2627:975;;;;:::o;11190:1012:4:-;11309:12;11324:20;11339:1;11342;11324:14;:20::i;:::-;11364:12;;;;:6;:12;;;;;;11309:35;;-1:-1:-1;11381:9:4;;;;;11360:16;;:1;:16;:::i;:::-;11359:31;;11351:75;;;;-1:-1:-1;;;11351:75:4;;17387:2:5;11351:75:4;;;17369:21:5;17426:2;17406:18;;;17399:30;17465:33;17445:18;;;17438:61;17516:18;;11351:75:4;17185:355:5;11351:75:4;11433:12;;;;:6;:12;;;;;:17;;11449:1;;11433:12;:17;;11449:1;;11433:17;:::i;:::-;;;;-1:-1:-1;11464:12:4;;-1:-1:-1;11485:12:4;;;;;;;;:::i;:::-;11464:34;-1:-1:-1;11505:23:4;11551:9;;;;11532:15;11536:11;;;;11532:1;:15;:::i;:::-;11531:29;;;;:::i;:::-;11505:55;-1:-1:-1;11706:67:4;11724:6;11732:7;;;;;;;;:::i;:::-;11741:10;11753:19;11771:1;11753:15;:19;:::i;:::-;11706:17;:67::i;:::-;11856:13;:16;11824:11;;11838:34;;11856:16;;;;;11838:15;:34;:::i;:::-;11824:48;;11878:57;11896:6;11904:10;11924:4;11931:3;11878:17;:57::i;:::-;-1:-1:-1;;;;;11987:11:4;11975:43;;12019:12;;;;;;;;:::i;:::-;12033:10;;;;12045;12057:7;;;;;;;;:::i;:::-;11975:107;;;;;;;;;;-1:-1:-1;;;;;18525:15:5;;;11975:107:4;;;18507:34:5;18557:18;;;18550:34;;;;18620:15;;;18600:18;;;18593:43;18672:15;;;18652:18;;;18645:43;18704:19;;;18697:35;;;18418:19;;11975:107:4;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;11967:143;;;;-1:-1:-1;;;11967:143:4;;18945:2:5;11967:143:4;;;18927:21:5;18984:2;18964:18;;;18957:30;19023:25;19003:18;;;18996:53;19066:18;;11967:143:4;18743:347:5;11967:143:4;12166:10;12140:7;;;;;;;;:::i;:::-;-1:-1:-1;;;;;12122:75:4;12127:5;;12122:75;12134:4;12149:7;;;;;;;;:::i;:::-;12158:6;;;;;;;;:::i;:::-;12122:75;;;19588:25:5;;;19656:14;;19649:22;19644:2;19629:18;;19622:50;19715:14;19708:22;19688:18;;;19681:50;19762:2;19747:18;;19740:34;;;19805:3;19790:19;;19783:35;;;19575:3;19560:19;12122:75:4;;;;;;;;11303:899;;;;11190:1012;;;:::o;12571:927::-;12686:12;12701:20;12716:1;12719;12701:14;:20::i;:::-;12741:12;;;;:6;:12;;;;;;12686:35;;-1:-1:-1;12758:11:4;;;;;12737:16;;:1;:16;:::i;:::-;12736:33;;12728:77;;;;-1:-1:-1;;;12728:77:4;;17387:2:5;12728:77:4;;;17369:21:5;17426:2;17406:18;;;17399:30;17465:33;17445:18;;;17438:61;17516:18;;12728:77:4;17185:355:5;12728:77:4;12816:12;;;;:6;:12;;;;;:17;;12832:1;;12816:12;:17;;12832:1;;12816:17;:::i;:::-;;;;-1:-1:-1;12848:12:4;;-1:-1:-1;12869:12:4;;;;;;;;:::i;:::-;12848:34;-1:-1:-1;12934:21:4;12976:11;;;;12959:13;12963:9;;;;12959:1;:13;:::i;:::-;12958:29;;;;:::i;:::-;12934:53;-1:-1:-1;12993:61:4;13011:6;13019:7;;;;;;;;:::i;:::-;13028:10;13040:13;12993:17;:61::i;:::-;13091:13;:16;13061:11;;13075:32;;13091:16;;;;;13075:13;:32;:::i;:::-;13061:46;;13169:57;13187:6;13195:10;13215:4;13222:3;13169:17;:57::i;:::-;-1:-1:-1;;;;;13303:11:4;13291:41;;13333:12;;;;;;;;:::i;:::-;13347:10;;;;13359;13371:7;;;;;;;;:::i;:::-;13291:91;;;;;;;;;;-1:-1:-1;;;;;18525:15:5;;;13291:91:4;;;18507:34:5;18557:18;;;18550:34;;;;18620:15;;;18600:18;;;18593:43;18672:15;;;18652:18;;;18645:43;18704:19;;;18697:35;;;18418:19;;13291:91:4;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;13283:125;;;;-1:-1:-1;;;13283:125:4;;20031:2:5;13283:125:4;;;20013:21:5;20070:2;20050:18;;;20043:30;20109:23;20089:18;;;20082:51;20150:18;;13283:125:4;19829:345:5;13859:1232:4;13972:12;13987:20;14002:1;14005;13987:14;:20::i;:::-;14027:12;;;;:6;:12;;;;;;13972:35;;-1:-1:-1;14044:11:4;;;;;14023:16;;:1;:16;:::i;:::-;14022:33;;14014:77;;;;-1:-1:-1;;;14014:77:4;;17387:2:5;14014:77:4;;;17369:21:5;17426:2;17406:18;;;17399:30;17465:33;17445:18;;;17438:61;17516:18;;14014:77:4;17185:355:5;14014:77:4;14098:12;;;;:6;:12;;;;;:17;;14114:1;;14098:12;:17;;14114:1;;14098:17;:::i;:::-;;;;-1:-1:-1;14209:11:4;;-1:-1:-1;14176:18:4;-1:-1:-1;;;;;14248:20:4;;;14269:12;;;;;;;;:::i;:::-;14248:46;;14283:10;14248:46;;;;;;;-1:-1:-1;;;;;8504:55:5;;;;14248:46:4;;;8486:74:5;14283:10:4;;;;8576:18:5;;;8569:34;8459:18;;14248:46:4;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;14309:38;;;;;;;;2886:25:5;;;14227:67:4;;-1:-1:-1;;;;;;14309:35:4;;;;;2859:18:5;;14309:38:4;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:43;14300:83;;;;-1:-1:-1;;;14300:83:4;;9261:2:5;14300:83:4;;;9243:21:5;9300:2;9280:18;;;9273:30;9339:27;9319:18;;;9312:55;9384:18;;14300:83:4;9059:349:5;14300:83:4;14390:12;14411;;;;;;;;:::i;:::-;14390:34;-1:-1:-1;14546:21:4;14588:11;;;;14571:13;14575:9;;;;14571:1;:13;:::i;:::-;14570:29;;;;:::i;:::-;14546:53;-1:-1:-1;14605:49:4;14619:6;14627:7;;;;;;;;:::i;:::-;14636:17;14640:13;14636:1;:17;:::i;14605:49::-;14742:13;:16;14712:11;;14726:32;;14742:16;;;;;14726:13;:32;:::i;:::-;14712:46;-1:-1:-1;14764:54:4;14778:6;14786:10;14798:19;14712:46;14798:13;:19;:::i;14764:54::-;-1:-1:-1;;;;;14905:20:4;;;14926:12;;;;;;;;:::i;:::-;14940:10;;;;14952:7;;;;;;;;:::i;:::-;14905:70;;;;;;;;;;-1:-1:-1;;;;;18525:15:5;;;14905:70:4;;;18507:34:5;18557:18;;;18550:34;;;;18620:15;;;18600:18;;;18593:43;14961:10:4;18652:18:5;;;18645:43;18704:19;;;18697:35;;;18418:19;;14905:70:4;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;14897:104;;;;-1:-1:-1;;;14897:104:4;;20381:2:5;14897:104:4;;;20363:21:5;20420:2;20400:18;;;20393:30;20459:23;20439:18;;;20432:51;20500:18;;14897:104:4;20179:345:5;14897:104:4;15057:10;15031:7;;;;;;;;:::i;:::-;-1:-1:-1;;;;;15013:73:4;15018:1;:5;;;15013:73;15025:4;15040:1;:7;;;;;;;;;;:::i;:::-;15049:1;:6;;;;;;;;;;:::i;:::-;15013:73;;;19588:25:5;;;19656:14;;19649:22;19644:2;19629:18;;19622:50;19715:14;19708:22;19688:18;;;19681:50;19762:2;19747:18;;19740:34;;;19805:3;19790:19;;19783:35;;;19575:3;19560:19;15013:73:4;;;;;;;;13966:1125;;;;;;13859:1232;;;:::o;15469:1228::-;15582:12;15597:20;15612:1;15615;15597:14;:20::i;:::-;15637:12;;;;:6;:12;;;;;;15582:35;;-1:-1:-1;15654:9:4;;;;;15633:16;;:1;:16;:::i;:::-;15632:31;;15624:75;;;;-1:-1:-1;;;15624:75:4;;17387:2:5;15624:75:4;;;17369:21:5;17426:2;17406:18;;;17399:30;17465:33;17445:18;;;17438:61;17516:18;;15624:75:4;17185:355:5;15624:75:4;15710:12;;;;:6;:12;;;;;:17;;15726:1;;15710:12;:17;;15726:1;;15710:17;:::i;:::-;;;;-1:-1:-1;15821:11:4;;-1:-1:-1;15788:18:4;-1:-1:-1;;;;;15861:20:4;;;15882:12;;;;;;;;:::i;:::-;15861:46;;15896:10;15861:46;;;;;;;-1:-1:-1;;;;;8504:55:5;;;;15861:46:4;;;8486:74:5;15896:10:4;;;;8576:18:5;;;8569:34;8459:18;;15861:46:4;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;15840:67;-1:-1:-1;15913:23:4;15959:9;;;;15940:15;15944:11;;;;15940:1;:15;:::i;:::-;15939:29;;;;:::i;:::-;15983:52;;;;;;;;2886:25:5;;;15913:55:4;;-1:-1:-1;;;;;;15983:35:4;;;;;2859:18:5;;15983:52:4;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:57;15974:97;;;;-1:-1:-1;;;15974:97:4;;9261:2:5;15974:97:4;;;9243:21:5;9300:2;9280:18;;;9273:30;9339:27;9319:18;;;9312:55;9384:18;;15974:97:4;9059:349:5;15974:97:4;16078:12;16099;;;;;;;;:::i;:::-;16269:13;:16;16078:34;;-1:-1:-1;16237:11:4;;16251:34;;16269:16;;;;;16251:15;:34;:::i;:::-;16237:48;-1:-1:-1;16291:60:4;16305:6;16313:10;16237:48;16325:19;16343:1;16325:15;:19;:::i;:::-;:25;;;;:::i;16291:60::-;16357:33;16371:6;16379:7;;;;;;;;:::i;:::-;16388:1;16357:13;:33::i;:::-;-1:-1:-1;;;;;16495:20:4;;;16516:12;;;;;;;;:::i;:::-;16530:1;:10;;;16542;16554:1;:7;;;;;;;;;;:::i;:::-;16495:84;;;;;;;;;;-1:-1:-1;;;;;18525:15:5;;;16495:84:4;;;18507:34:5;18557:18;;;18550:34;;;;18620:15;;;18600:18;;;18593:43;18672:15;;;18652:18;;;18645:43;18704:19;;;18697:35;;;18418:19;;16495:84:4;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;16487:118;;;;-1:-1:-1;;;16487:118:4;;20381:2:5;16487:118:4;;;20363:21:5;20420:2;20400:18;;;20393:30;20459:23;20439:18;;;20432:51;20500:18;;16487:118:4;20179:345:5;16487:118:4;16661:10;16635:7;;;;;;;;:::i;:::-;-1:-1:-1;;;;;16617:75:4;16622:1;:5;;;16617:75;16629:4;16644:1;:7;;;;;;;;;;:::i;:::-;16653:1;:6;;;;;;;;;;:::i;:::-;16617:75;;;19588:25:5;;;19656:14;;19649:22;19644:2;19629:18;;19622:50;19715:14;19708:22;19688:18;;;19681:50;19762:2;19747:18;;19740:34;;;19805:3;19790:19;;19783:35;;;19575:3;19560:19;16617:75:4;19341:483:5;3932:1345:4;4120:12;4135:20;4150:1;4153;4135:14;:20::i;:::-;4236:12;;;;:6;:12;;;;;;4120:35;;-1:-1:-1;4253:9:4;;;;;4232:16;;:1;:16;:::i;:::-;4231:31;;4223:75;;;;-1:-1:-1;;;4223:75:4;;17387:2:5;4223:75:4;;;17369:21:5;17426:2;17406:18;;;17399:30;17465:33;17445:18;;;17438:61;17516:18;;4223:75:4;17185:355:5;4223:75:4;4309:12;;;;:6;:12;;;;;:17;;4325:1;;4309:12;:17;;4325:1;;4309:17;:::i;:::-;;;;-1:-1:-1;4367:12:4;;-1:-1:-1;4388:12:4;;;;;;;;:::i;:::-;4367:34;-1:-1:-1;4407:49:4;4367:34;4433:10;4445:7;;;;;;;;:::i;:::-;4454:1;4407:17;:49::i;:::-;4463:23;4509:9;;;;4490:15;4494:11;;;;4490:1;:15;:::i;:::-;4489:29;;;;:::i;:::-;4463:55;-1:-1:-1;4524:66:4;4542:6;4550:7;;;;;;;;:::i;:::-;4567:4;4574:15;4524:17;:66::i;:::-;4630:11;-1:-1:-1;;;;;4682:20:4;;;4703:12;;;;;;;;:::i;:::-;4682:46;;4717:10;4682:46;;;;;;;-1:-1:-1;;;;;8504:55:5;;;;4682:46:4;;;8486:74:5;4717:10:4;;;;8576:18:5;;;8569:34;8459:18;;4682:46:4;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;;;;;4675:59:4;;4735:15;4675:76;;;;;;;;;;;;;2886:25:5;;2874:2;2859:18;;2740:177;4675:76:4;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:81;4667:115;;;;-1:-1:-1;;;4667:115:4;;20731:2:5;4667:115:4;;;20713:21:5;20770:2;20750:18;;;20743:30;20809:23;20789:18;;;20782:51;20850:18;;4667:115:4;20529:345:5;4667:115:4;-1:-1:-1;;;;;4821:24:4;;;4846:12;;;;;;;;:::i;:::-;4860:10;;;;4872:7;;;;;;;;:::i;:::-;4821:88;;;;;;;;;;-1:-1:-1;;;;;18525:15:5;;;4821:88:4;;;18507:34:5;18557:18;;;18550:34;;;;18620:15;;;18600:18;;;18593:43;4881:10:4;18652:18:5;;;18645:43;18704:19;;;18697:35;;;18418:19;;4821:88:4;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;4813:126;;;;-1:-1:-1;;;4813:126:4;;21081:2:5;4813:126:4;;;21063:21:5;21120:2;21100:18;;;21093:30;21159:27;21139:18;;;21132:55;21204:18;;4813:126:4;20879:349:5;4813:126:4;5044:13;:16;5012:11;;5026:34;;5044:16;;;;;5026:15;:34;:::i;:::-;5012:48;-1:-1:-1;;;;;;5074:31:4;;;5106:12;;;;;;;;:::i;:::-;5074:74;;5120:10;5074:74;;;;;;;-1:-1:-1;;;;;7368:15:5;;;;5074:74:4;;;7350:34:5;5120:10:4;;;;7400:18:5;;;7393:34;5132:10:4;7443:18:5;;;7436:43;7495:18;;;7488:34;;;7261:19;;5074:74:4;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;5066:115;;;;-1:-1:-1;;;5066:115:4;;21435:2:5;5066:115:4;;;21417:21:5;21474:2;21454:18;;;21447:30;21513;21493:18;;;21486:58;21561:18;;5066:115:4;21233:352:5;5066:115:4;5241:10;5215:7;;;;;;;;:::i;:::-;-1:-1:-1;;;;;5193:79:4;5202:5;;5193:79;5209:4;5224:7;;;;;;;;:::i;:::-;5233:1;:6;;;;;;;;;;:::i;:::-;5193:79;;;19588:25:5;;;19656:14;;19649:22;19644:2;19629:18;;19622:50;19715:14;19708:22;19688:18;;;19681:50;19762:2;19747:18;;19740:34;;;19805:3;19790:19;;19783:35;;;19575:3;19560:19;5193:79:4;;;;;;;4047:1230;;;;;3932:1345;;;:::o;5651:1040::-;5772:12;5787:20;5802:1;5805;5787:14;:20::i;:::-;5827:12;;;;:6;:12;;;;;;5772:35;;-1:-1:-1;5844:11:4;;;;;5823:16;;:1;:16;:::i;:::-;5822:33;;5814:77;;;;-1:-1:-1;;;5814:77:4;;17387:2:5;5814:77:4;;;17369:21:5;17426:2;17406:18;;;17399:30;17465:33;17445:18;;;17438:61;17516:18;;5814:77:4;17185:355:5;5814:77:4;5898:12;;;;:6;:12;;;;;:17;;5914:1;;5898:12;:17;;5914:1;;5898:17;:::i;:::-;;;;-1:-1:-1;5922:12:4;;-1:-1:-1;5943:12:4;;;;;;;;:::i;:::-;5922:34;-1:-1:-1;5963:21:4;6005:11;;;;5988:13;5992:9;;;;5988:1;:13;:::i;:::-;5987:29;;;;:::i;:::-;5963:53;-1:-1:-1;6022:61:4;6040:6;6048:7;;;;;;;;:::i;6022:61::-;6190:13;:16;6160:11;;6174:32;;6190:16;;6174:13;:32;:::i;:::-;6160:46;-1:-1:-1;6212:63:4;6230:6;6238:10;6258:4;6266:7;6160:46;6266:1;:7;:::i;6212:63::-;6315:11;-1:-1:-1;;;;;6367:20:4;;;6388:12;;;;;;;;:::i;:::-;6367:46;;6402:10;6367:46;;;;;;;-1:-1:-1;;;;;8504:55:5;;;;6367:46:4;;;8486:74:5;6402:10:4;;;;8576:18:5;;;8569:34;8459:18;;6367:46:4;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;;;;;6360:59:4;;6420:1;6360:62;;;;;;;;;;;;;2886:25:5;;2874:2;2859:18;;2740:177;6360:62:4;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:67;6352:101;;;;-1:-1:-1;;;6352:101:4;;12709:2:5;6352:101:4;;;12691:21:5;12748:2;12728:18;;;12721:30;12787:23;12767:18;;;12760:51;12828:18;;6352:101:4;12507:345:5;6352:101:4;-1:-1:-1;;;;;6493:24:4;;;6518:12;;;;;;;;:::i;:::-;6532:10;;;;6544;6556:7;;;;;;;;:::i;:::-;6493:74;;;;;;;;;;-1:-1:-1;;;;;18525:15:5;;;6493:74:4;;;18507:34:5;18557:18;;;18550:34;;;;18620:15;;;18600:18;;;18593:43;18672:15;;;18652:18;;;18645:43;18704:19;;;18697:35;;;18418:19;;6493:74:4;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;6485:112;;;;-1:-1:-1;;;6485:112:4;;21081:2:5;6485:112:4;;;21063:21:5;21120:2;21100:18;;;21093:30;21159:27;21139:18;;;21132:55;21204:18;;6485:112:4;20879:349:5;7064:866:4;7183:12;7198:20;7213:1;7216;7198:14;:20::i;:::-;7238:12;;;;:6;:12;;;;;;7183:35;;-1:-1:-1;7255:11:4;;;;;7234:16;;:1;:16;:::i;:::-;7233:33;;7225:77;;;;-1:-1:-1;;;7225:77:4;;17387:2:5;7225:77:4;;;17369:21:5;17426:2;17406:18;;;17399:30;17465:33;17445:18;;;17438:61;17516:18;;7225:77:4;17185:355:5;7225:77:4;7309:12;;;;:6;:12;;;;;:17;;7325:1;;7309:12;:17;;7325:1;;7309:17;:::i;:::-;;;;-1:-1:-1;7333:21:4;;-1:-1:-1;7375:11:4;;;;7358:13;7362:9;;;;7358:1;:13;:::i;:::-;7357:29;;;;:::i;:::-;7333:53;-1:-1:-1;7393:12:4;7414;;;;;;;;:::i;:::-;7393:34;-1:-1:-1;7482:65:4;7393:34;7508:10;7520:7;;;;;;;;:::i;:::-;7529:17;7533:13;7529:1;:17;:::i;7482:65::-;7584:13;:16;7554:11;;7568:32;;7584:16;;7568:13;:32;:::i;:::-;7554:46;;7606:57;7624:6;7632:10;7652:4;7659:3;7606:17;:57::i;:::-;-1:-1:-1;;;;;7715:11:4;7703:43;;7747:12;;;;;;;;:::i;:::-;7761:10;;;;7773:7;;;;;;;;:::i;:::-;7703:93;;;;;;;;;;-1:-1:-1;;;;;18525:15:5;;;7703:93:4;;;18507:34:5;18557:18;;;18550:34;;;;18620:15;;;18600:18;;;18593:43;7782:10:4;18652:18:5;;;18645:43;18704:19;;;18697:35;;;18418:19;;7703:93:4;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;7695:129;;;;-1:-1:-1;;;7695:129:4;;18945:2:5;7695:129:4;;;18927:21:5;18984:2;18964:18;;;18957:30;19023:25;19003:18;;;18996:53;19066:18;;7695:129:4;18743:347:5;7695:129:4;7896:10;7870:7;;;;;;;;:::i;:::-;-1:-1:-1;;;;;7848:77:4;7857:5;;7848:77;7864:4;7879:7;;;;;;;;:::i;:::-;7888:6;;;;;;;;:::i;:::-;7848:77;;;19588:25:5;;;19656:14;;19649:22;19644:2;19629:18;;19622:50;19715:14;19708:22;19688:18;;;19681:50;19762:2;19747:18;;19740:34;;;19805:3;19790:19;;19783:35;;;19575:3;19560:19;7848:77:4;19341:483:5;8306:912:4;8421:12;8436:20;8451:1;8454;8436:14;:20::i;:::-;8476:12;;;;:6;:12;;;;;;8421:35;;-1:-1:-1;8493:9:4;;;;;8472:16;;:1;:16;:::i;:::-;8471:31;;8463:75;;;;-1:-1:-1;;;8463:75:4;;17387:2:5;8463:75:4;;;17369:21:5;17426:2;17406:18;;;17399:30;17465:33;17445:18;;;17438:61;17516:18;;8463:75:4;17185:355:5;8463:75:4;8545:12;;;;:6;:12;;;;;:17;;8561:1;;8545:12;:17;;8561:1;;8545:17;:::i;:::-;;;;-1:-1:-1;8569:62:4;;-1:-1:-1;8593:12:4;;;;;;;;:::i;:::-;8608:10;8620:7;;;;;;;;:::i;:::-;8629:1;8569:17;:62::i;:::-;8671:11;8638:18;8735:9;;;;8716:15;8720:11;;;;8716:1;:15;:::i;:::-;8715:29;;;;:::i;:::-;8689:55;-1:-1:-1;;;;;;8783:23:4;;;8807:12;;;;;;;;:::i;:::-;8821:10;;;;8833:7;;;;;;;;:::i;:::-;8783:87;;;;;;;;;;-1:-1:-1;;;;;18525:15:5;;;8783:87:4;;;18507:34:5;18557:18;;;18550:34;;;;18620:15;;;18600:18;;;18593:43;8842:10:4;18652:18:5;;;18645:43;18704:19;;;18697:35;;;18418:19;;8783:87:4;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;8775:121;;;;-1:-1:-1;;;8775:121:4;;20031:2:5;8775:121:4;;;20013:21:5;20070:2;20050:18;;;20043:30;20109:23;20089:18;;;20082:51;20150:18;;8775:121:4;19829:345:5;8775:121:4;8985:13;:16;8953:11;;8967:34;;8985:16;;;;;8967:15;:34;:::i;:::-;8953:48;-1:-1:-1;;;;;;9015:31:4;;;9047:12;;;;;;;;:::i;:::-;9015:74;;9061:10;9015:74;;;;;;;-1:-1:-1;;;;;7368:15:5;;;;9015:74:4;;;7350:34:5;9061:10:4;;;;7400:18:5;;;7393:34;9073:10:4;7443:18:5;;;7436:43;7495:18;;;7488:34;;;7261:19;;9015:74:4;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;9007:115;;;;-1:-1:-1;;;9007:115:4;;21435:2:5;9007:115:4;;;21417:21:5;21474:2;21454:18;;;21447:30;21513;21493:18;;;21486:58;21561:18;;9007:115:4;21233:352:5;9007:115:4;9182:10;9156:7;;;;;;;;:::i;:::-;-1:-1:-1;;;;;9134:79:4;9143:5;;9134:79;9150:4;9165:7;;;;;;;;:::i;3804:847:2:-;3851:4;3863:11;3967:16;4032:1;4022:191;;4114:14;4111:1;4108;4093:36;4190:14;4187:1;4180:25;4022:191;4228:14;4254:2;4249:203;;;;4459:73;;;;4612:1;4602:11;;4221:400;;4249:203;4333:14;4330:1;4327;4312:36;4440:1;4434:8;4427:16;4420:24;4410:34;;4249:203;;4459:73;4523:1;4513:11;;4221:400;-1:-1:-1;4640:6:2;;3804:847;-1:-1:-1;;;3804:847:2:o;2764:300:0:-;2820:7;1437:66;2913:5;;2926:7;;;;;;;;:::i;:::-;2941:12;;;;;;;;:::i;:::-;2961:7;;;;;;;;:::i;:::-;2976:6;;;;;;;;:::i;:::-;2990:1;:11;;;3009:1;:9;;;3026:1;:10;;;3044:1;:8;;;2873:185;;;;;;;;;;;;;;;;21977:25:5;;;22033:2;22018:18;;22011:34;;;;-1:-1:-1;;;;;22142:15:5;;;22137:2;22122:18;;22115:43;22194:15;;;;22189:2;22174:18;;22167:43;22254:14;;22247:22;22241:3;22226:19;;22219:51;22314:14;22307:22;22301:3;22286:19;;22279:51;22361:3;22346:19;;22339:35;22405:3;22390:19;;22383:35;;;;22449:3;22434:19;;22427:35;22493:3;22478:19;;22471:35;21964:3;21949:19;;21590:922;2873:185:0;;;;;;;;;;;;;2863:196;;;;;;2856:203;;2764:300;;;:::o;412:477:3:-;486:7;677:66;669:3;;;;661:82;;653:122;;;;-1:-1:-1;;;653:122:3;;22719:2:5;653:122:3;;;22701:21:5;22758:2;22738:18;;;22731:30;22797:66;22777:18;;;22770:94;22881:18;;653:122:3;22517:388:5;653:122:3;789:3;;;;:1;:3;:::i;:::-;:9;;796:2;789:9;:22;;;-1:-1:-1;802:3:3;;;;:1;:3;:::i;:::-;:9;;809:2;802:9;789:22;781:62;;;;-1:-1:-1;;;781:62:3;;23386:2:5;781:62:3;;;23368:21:5;23425:2;23405:18;;;23398:30;23464:66;23444:18;;;23437:94;23548:18;;781:62:3;23184:388:5;781:62:3;857:27;867:1;870:3;;;;:1;:3;:::i;:::-;880;857:27;;;;;875:3;857:27;;;;;;23804:25:5;;;;23877:4;23865:17;;;23845:18;;;23838:45;875:3:3;;;;23899:18:5;;;23892:34;880:3:3;;;;23942:18:5;;;23935:34;23776:19;;857:27:3;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;857:27:3;;;;;;412:477;-1:-1:-1;;;;412:477:3:o;14:154:5:-;-1:-1:-1;;;;;93:5:5;89:54;82:5;79:65;69:93;;158:1;155;148:12;69:93;14:154;:::o;173:134::-;241:20;;270:31;241:20;270:31;:::i;:::-;173:134;;;:::o;312:383::-;389:6;397;405;458:2;446:9;437:7;433:23;429:32;426:52;;;474:1;471;464:12;426:52;513:9;500:23;532:31;557:5;532:31;:::i;:::-;582:5;634:2;619:18;;606:32;;-1:-1:-1;685:2:5;670:18;;;657:32;;312:383;-1:-1:-1;;;312:383:5:o;1085:315::-;1153:6;1161;1214:2;1202:9;1193:7;1189:23;1185:32;1182:52;;;1230:1;1227;1220:12;1182:52;1269:9;1256:23;1288:31;1313:5;1288:31;:::i;:::-;1338:5;1390:2;1375:18;;;;1362:32;;-1:-1:-1;;;1085:315:5:o;1405:367::-;1468:8;1478:6;1532:3;1525:4;1517:6;1513:17;1509:27;1499:55;;1550:1;1547;1540:12;1499:55;-1:-1:-1;1573:20:5;;1616:18;1605:30;;1602:50;;;1648:1;1645;1638:12;1602:50;1685:4;1677:6;1673:17;1661:29;;1745:3;1738:4;1728:6;1725:1;1721:14;1713:6;1709:27;1705:38;1702:47;1699:67;;;1762:1;1759;1752:12;1699:67;1405:367;;;;;:::o;1777:773::-;1899:6;1907;1915;1923;1976:2;1964:9;1955:7;1951:23;1947:32;1944:52;;;1992:1;1989;1982:12;1944:52;2032:9;2019:23;2061:18;2102:2;2094:6;2091:14;2088:34;;;2118:1;2115;2108:12;2088:34;2157:70;2219:7;2210:6;2199:9;2195:22;2157:70;:::i;:::-;2246:8;;-1:-1:-1;2131:96:5;-1:-1:-1;2334:2:5;2319:18;;2306:32;;-1:-1:-1;2350:16:5;;;2347:36;;;2379:1;2376;2369:12;2347:36;;2418:72;2482:7;2471:8;2460:9;2456:24;2418:72;:::i;:::-;1777:773;;;;-1:-1:-1;2509:8:5;-1:-1:-1;;;;1777:773:5:o;2555:180::-;2614:6;2667:2;2655:9;2646:7;2642:23;2638:32;2635:52;;;2683:1;2680;2673:12;2635:52;-1:-1:-1;2706:23:5;;2555:180;-1:-1:-1;2555:180:5:o;3153:469::-;3273:6;3281;3325:9;3316:7;3312:23;3355:3;3351:2;3347:12;3344:32;;;3372:1;3369;3362:12;3344:32;3395:3;3418:2;3414;3410:11;3407:31;;;3434:1;3431;3424:12;3407:31;3457:9;3447:19;;3559:2;3490:66;3486:2;3482:75;3478:84;3475:104;;;3575:1;3572;3565:12;3475:104;3153:469;;3598:18;;;;;-1:-1:-1;;;3153:469:5:o;3627:247::-;3686:6;3739:2;3727:9;3718:7;3714:23;3710:32;3707:52;;;3755:1;3752;3745:12;3707:52;3794:9;3781:23;3813:31;3838:5;3813:31;:::i;4064:159::-;4131:20;;4191:6;4180:18;;4170:29;;4160:57;;4213:1;4210;4203:12;4228:256;4294:6;4302;4355:2;4343:9;4334:7;4330:23;4326:32;4323:52;;;4371:1;4368;4361:12;4323:52;4394:28;4412:9;4394:28;:::i;:::-;4384:38;;4441:37;4474:2;4463:9;4459:18;4441:37;:::i;:::-;4431:47;;4228:256;;;;;:::o;4489:656::-;4601:4;4630:2;4659;4648:9;4641:21;4691:6;4685:13;4734:6;4729:2;4718:9;4714:18;4707:34;4759:1;4769:140;4783:6;4780:1;4777:13;4769:140;;;4878:14;;;4874:23;;4868:30;4844:17;;;4863:2;4840:26;4833:66;4798:10;;4769:140;;;4927:6;4924:1;4921:13;4918:91;;;4997:1;4992:2;4983:6;4972:9;4968:22;4964:31;4957:42;4918:91;-1:-1:-1;5061:2:5;5049:15;5066:66;5045:88;5030:104;;;;5136:2;5026:113;;4489:656;-1:-1:-1;;;4489:656:5:o;5150:389::-;5232:8;5242:6;5296:3;5289:4;5281:6;5277:17;5273:27;5263:55;;5314:1;5311;5304:12;5263:55;-1:-1:-1;5337:20:5;;5380:18;5369:30;;5366:50;;;5412:1;5409;5402:12;5366:50;5449:4;5441:6;5437:17;5425:29;;5512:3;5505:4;5497;5489:6;5485:17;5477:6;5473:30;5469:41;5466:50;5463:70;;;5529:1;5526;5519:12;5544:1327;5754:6;5762;5770;5778;5786;5794;5847:2;5835:9;5826:7;5822:23;5818:32;5815:52;;;5863:1;5860;5853:12;5815:52;5903:9;5890:23;5932:18;5973:2;5965:6;5962:14;5959:34;;;5989:1;5986;5979:12;5959:34;6027:6;6016:9;6012:22;6002:32;;6072:7;6065:4;6061:2;6057:13;6053:27;6043:55;;6094:1;6091;6084:12;6043:55;6134:2;6121:16;6160:2;6152:6;6149:14;6146:34;;;6176:1;6173;6166:12;6146:34;6236:7;6229:4;6219:6;6211;6207:19;6203:2;6199:28;6195:39;6192:52;6189:72;;;6257:1;6254;6247:12;6189:72;6288:4;6280:13;;;;-1:-1:-1;6312:6:5;-1:-1:-1;6356:20:5;;;6343:34;;6389:16;;;6386:36;;;6418:1;6415;6408:12;6386:36;6457:72;6521:7;6510:8;6499:9;6495:24;6457:72;:::i;:::-;6548:8;;-1:-1:-1;6431:98:5;-1:-1:-1;6636:2:5;6621:18;;6608:32;;-1:-1:-1;6652:16:5;;;6649:36;;;6681:1;6678;6671:12;6649:36;;6720:91;6803:7;6792:8;6781:9;6777:24;6720:91;:::i;:::-;5544:1327;;;;-1:-1:-1;5544:1327:5;;-1:-1:-1;5544:1327:5;;6830:8;;5544:1327;-1:-1:-1;;;5544:1327:5:o;7533:118::-;7619:5;7612:13;7605:21;7598:5;7595:32;7585:60;;7641:1;7638;7631:12;7656:245;7723:6;7776:2;7764:9;7755:7;7751:23;7747:32;7744:52;;;7792:1;7789;7782:12;7744:52;7824:9;7818:16;7843:28;7865:5;7843:28;:::i;8614:251::-;8684:6;8737:2;8725:9;8716:7;8712:23;8708:32;8705:52;;;8753:1;8750;8743:12;8705:52;8785:9;8779:16;8804:31;8829:5;8804:31;:::i;8870:184::-;8940:6;8993:2;8981:9;8972:7;8968:23;8964:32;8961:52;;;9009:1;9006;8999:12;8961:52;-1:-1:-1;9032:16:5;;8870:184;-1:-1:-1;8870:184:5:o;10875:::-;10927:77;10924:1;10917:88;11024:4;11021:1;11014:15;11048:4;11045:1;11038:15;11064:184;11116:77;11113:1;11106:88;11213:4;11210:1;11203:15;11237:4;11234:1;11227:15;11253:195;11292:3;11323:66;11316:5;11313:77;11310:103;;11393:18;;:::i;:::-;-1:-1:-1;11440:1:5;11429:13;;11253:195::o;13602:401::-;13669:2;13663:9;13711:3;13699:16;;13745:18;13730:34;;13766:22;;;13727:62;13724:242;;;13822:77;13819:1;13812:88;13923:4;13920:1;13913:15;13951:4;13948:1;13941:15;13724:242;13982:2;13975:22;13602:401;:::o;14008:128::-;14073:20;;14102:28;14073:20;14102:28;:::i;14141:838::-;14221:6;14274:3;14262:9;14253:7;14249:23;14245:33;14242:53;;;14291:1;14288;14281:12;14242:53;14317:17;;:::i;:::-;14370:9;14357:23;14350:5;14343:38;14413;14447:2;14436:9;14432:18;14413:38;:::i;:::-;14408:2;14401:5;14397:14;14390:62;14484:38;14518:2;14507:9;14503:18;14484:38;:::i;:::-;14479:2;14472:5;14468:14;14461:62;14555:35;14586:2;14575:9;14571:18;14555:35;:::i;:::-;14550:2;14543:5;14539:14;14532:59;14624:36;14655:3;14644:9;14640:19;14624:36;:::i;:::-;14618:3;14611:5;14607:15;14600:61;14722:3;14711:9;14707:19;14694:33;14688:3;14681:5;14677:15;14670:58;14789:3;14778:9;14774:19;14761:33;14755:3;14748:5;14744:15;14737:58;14856:3;14845:9;14841:19;14828:33;14822:3;14815:5;14811:15;14804:58;14881:3;14944:2;14933:9;14929:18;14916:32;14911:2;14904:5;14900:14;14893:56;;14968:5;14958:15;;;14141:838;;;;:::o;14984:128::-;15024:3;15055:1;15051:6;15048:1;15045:13;15042:39;;;15061:18;;:::i;:::-;-1:-1:-1;15097:9:5;;14984:128::o;17545:228::-;17585:7;17711:1;17643:66;17639:74;17636:1;17633:81;17628:1;17621:9;17614:17;17610:105;17607:131;;;17718:18;;:::i;:::-;-1:-1:-1;17758:9:5;;17545:228::o;17778:274::-;17818:1;17844;17834:189;;17879:77;17876:1;17869:88;17980:4;17977:1;17970:15;18008:4;18005:1;17998:15;17834:189;-1:-1:-1;18037:9:5;;17778:274::o;18057:125::-;18097:4;18125:1;18122;18119:8;18116:34;;;18130:18;;:::i;:::-;-1:-1:-1;18167:9:5;;18057:125::o;19095:241::-;19151:6;19204:2;19192:9;19183:7;19179:23;19175:32;19172:52;;;19220:1;19217;19210:12;19172:52;19259:9;19246:23;19278:28;19300:5;19278:28;:::i;22910:269::-;22967:6;23020:2;23008:9;22999:7;22995:23;22991:32;22988:52;;;23036:1;23033;23026:12;22988:52;23075:9;23062:23;23125:4;23118:5;23114:16;23107:5;23104:27;23094:55;;23145:1;23142;23135:12

Swarm Source

ipfs://ef13a69af84988ea5fbe4eedf2b1d197fa7ffe761e21cba8bddbabf9827e7573

Block Uncle Number Difficulty Gas Used Reward
View All Uncles
Loading...
Loading
Loading...
Loading
Loading...
Loading
[ 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.