ETH Price: $2,612.56 (+0.52%)

Contract

0x9777d7E2b60bB01759D0E2f8be2095df444cb07E
 

Multichain Info

No addresses found
Transaction Hash
Method
Block
From
To
Approve192266512024-02-14 13:58:47246 days ago1707919127IN
0x9777d7E2...f444cb07E
0 ETH0.0024063151.25388219
Rebalance109654562020-09-30 18:52:451478 days ago1601491965IN
0x9777d7E2...f444cb07E
0 ETH0.0543726100
Approve108013642020-09-05 12:21:011504 days ago1599308461IN
0x9777d7E2...f444cb07E
0 ETH0.01503861333
Rebalance107976652020-09-04 22:45:371504 days ago1599259537IN
0x9777d7E2...f444cb07E
0 ETH0.0650532120
Approve107529292020-08-29 2:20:581511 days ago1598667658IN
0x9777d7E2...f444cb07E
0 ETH0.0033179374
Rebalance107520512020-08-28 23:07:151511 days ago1598656035IN
0x9777d7E2...f444cb07E
0 ETH0.0449293183
Rebalance102901762020-06-18 14:16:531582 days ago1592489813IN
0x9777d7E2...f444cb07E
0 ETH0.0257460744
Approve101669902020-05-30 11:54:251602 days ago1590839665IN
0x9777d7E2...f444cb07E
0 ETH0.0013895731.00000123
Rebalance101054412020-05-20 22:14:551611 days ago1590012895IN
0x9777d7E2...f444cb07E
0 ETH0.011727820
Renounce Ownersh...100825982020-05-17 8:59:341615 days ago1589705974IN
0x9777d7E2...f444cb07E
0 ETH0.0002950719
Rebalance100551632020-05-13 2:40:451619 days ago1589337645IN
0x9777d7E2...f444cb07E
0 ETH0.0106831418.2
Rebalance100475302020-05-11 22:04:561620 days ago1589234696IN
0x9777d7E2...f444cb07E
0 ETH0.0095708115
Set_aave Ref100436812020-05-11 7:48:031621 days ago1589183283IN
0x9777d7E2...f444cb07E
0 ETH0.0003432912
Rebalance100376302020-05-10 9:25:171622 days ago1589102717IN
0x9777d7E2...f444cb07E
0 ETH0.0118050517
Deposit100376232020-05-10 9:24:231622 days ago1589102663IN
0x9777d7E2...f444cb07E
0 ETH0.0024233410
Deposit100375822020-05-10 9:16:161622 days ago1589102176IN
0x9777d7E2...f444cb07E
0 ETH0.0012000413.3
Deposit100375412020-05-10 9:06:401622 days ago1589101600IN
0x9777d7E2...f444cb07E
0 ETH0.0015248716.9
0x60806040100374372020-05-10 8:42:541622 days ago1589100174IN
 Create: ycUSDC
0 ETH0.0876974215

View more zero value Internal Transactions in Advanced View mode

Advanced mode:
Loading...
Loading

Contract Source Code Verified (Exact Match)

Contract Name:
ycUSDC

Compiler Version
v0.5.12+commit.7709ece9

Optimization Enabled:
No with 200 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity)

/**
 *Submitted for verification at Etherscan.io on 2020-05-10
*/

// MIT License Copyright (c) 2020 iearn
pragma solidity ^0.5.0;
pragma experimental ABIEncoderV2;

interface IERC20 {
    function totalSupply() external view returns (uint256);
    function balanceOf(address account) external view returns (uint256);
    function transfer(address recipient, uint256 amount) external returns (bool);
    function allowance(address owner, address spender) external view returns (uint256);
    function approve(address spender, uint256 amount) external returns (bool);
    function transferFrom(address sender, address recipient, uint256 amount) external returns (bool);
    event Transfer(address indexed from, address indexed to, uint256 value);
    event Approval(address indexed owner, address indexed spender, uint256 value);
}

contract Context {
    constructor () internal { }
    // solhint-disable-previous-line no-empty-blocks

    function _msgSender() internal view returns (address payable) {
        return msg.sender;
    }

    function _msgData() internal view returns (bytes memory) {
        this; // silence state mutability warning without generating bytecode - see https://github.com/ethereum/solidity/issues/2691
        return msg.data;
    }
}

contract Ownable is Context {
    address private _owner;

    event OwnershipTransferred(address indexed previousOwner, address indexed newOwner);
    constructor () internal {
        _owner = _msgSender();
        emit OwnershipTransferred(address(0), _owner);
    }
    function owner() public view returns (address) {
        return _owner;
    }
    modifier onlyOwner() {
        require(isOwner(), "Ownable: caller is not the owner");
        _;
    }
    function isOwner() public view returns (bool) {
        return _msgSender() == _owner;
    }
    function renounceOwnership() public onlyOwner {
        emit OwnershipTransferred(_owner, address(0));
        _owner = address(0);
    }
    function transferOwnership(address newOwner) public onlyOwner {
        _transferOwnership(newOwner);
    }
    function _transferOwnership(address newOwner) internal {
        require(newOwner != address(0), "Ownable: new owner is the zero address");
        emit OwnershipTransferred(_owner, newOwner);
        _owner = newOwner;
    }
}

contract ERC20 is Context, IERC20 {
    using SafeMath for uint256;

    mapping (address => uint256) _balances;

    mapping (address => mapping (address => uint256)) private _allowances;

    uint256 _totalSupply;
    function totalSupply() public view returns (uint256) {
        return _totalSupply;
    }
    function balanceOf(address account) public view returns (uint256) {
        return _balances[account];
    }
    function transfer(address recipient, uint256 amount) public returns (bool) {
        _transfer(_msgSender(), recipient, amount);
        return true;
    }
    function allowance(address owner, address spender) public view returns (uint256) {
        return _allowances[owner][spender];
    }
    function approve(address spender, uint256 amount) public returns (bool) {
        _approve(_msgSender(), spender, amount);
        return true;
    }
    function transferFrom(address sender, address recipient, uint256 amount) public returns (bool) {
        _transfer(sender, recipient, amount);
        _approve(sender, _msgSender(), _allowances[sender][_msgSender()].sub(amount, "ERC20: transfer amount exceeds allowance"));
        return true;
    }
    function increaseAllowance(address spender, uint256 addedValue) public returns (bool) {
        _approve(_msgSender(), spender, _allowances[_msgSender()][spender].add(addedValue));
        return true;
    }
    function decreaseAllowance(address spender, uint256 subtractedValue) public returns (bool) {
        _approve(_msgSender(), spender, _allowances[_msgSender()][spender].sub(subtractedValue, "ERC20: decreased allowance below zero"));
        return true;
    }
    function _transfer(address sender, address recipient, uint256 amount) internal {
        require(sender != address(0), "ERC20: transfer from the zero address");
        require(recipient != address(0), "ERC20: transfer to the zero address");

        _balances[sender] = _balances[sender].sub(amount, "ERC20: transfer amount exceeds balance");
        _balances[recipient] = _balances[recipient].add(amount);
        emit Transfer(sender, recipient, amount);
    }
    function _mint(address account, uint256 amount) internal {
        require(account != address(0), "ERC20: mint to the zero address");

        _totalSupply = _totalSupply.add(amount);
        _balances[account] = _balances[account].add(amount);
        emit Transfer(address(0), account, amount);
    }
    function _burn(address account, uint256 amount) internal {
        require(account != address(0), "ERC20: burn from the zero address");

        _balances[account] = _balances[account].sub(amount, "ERC20: burn amount exceeds balance");
        _totalSupply = _totalSupply.sub(amount);
        emit Transfer(account, address(0), amount);
    }
    function _approve(address owner, address spender, uint256 amount) internal {
        require(owner != address(0), "ERC20: approve from the zero address");
        require(spender != address(0), "ERC20: approve to the zero address");

        _allowances[owner][spender] = amount;
        emit Approval(owner, spender, amount);
    }
    function _burnFrom(address account, uint256 amount) internal {
        _burn(account, amount);
        _approve(account, _msgSender(), _allowances[account][_msgSender()].sub(amount, "ERC20: burn amount exceeds allowance"));
    }
}

contract ERC20Detailed is IERC20 {
    string private _name;
    string private _symbol;
    uint8 private _decimals;

    constructor (string memory name, string memory symbol, uint8 decimals) public {
        _name = name;
        _symbol = symbol;
        _decimals = decimals;
    }
    function name() public view returns (string memory) {
        return _name;
    }
    function symbol() public view returns (string memory) {
        return _symbol;
    }
    function decimals() public view returns (uint8) {
        return _decimals;
    }
}

contract ReentrancyGuard {
    uint256 private _guardCounter;

    constructor () internal {
        _guardCounter = 1;
    }

    modifier nonReentrant() {
        _guardCounter += 1;
        uint256 localCounter = _guardCounter;
        _;
        require(localCounter == _guardCounter, "ReentrancyGuard: reentrant call");
    }
}

library SafeMath {
    function add(uint256 a, uint256 b) internal pure returns (uint256) {
        uint256 c = a + b;
        require(c >= a, "SafeMath: addition overflow");

        return c;
    }
    function sub(uint256 a, uint256 b) internal pure returns (uint256) {
        return sub(a, b, "SafeMath: subtraction overflow");
    }
    function sub(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) {
        require(b <= a, errorMessage);
        uint256 c = a - b;

        return c;
    }
    function mul(uint256 a, uint256 b) internal pure returns (uint256) {
        if (a == 0) {
            return 0;
        }

        uint256 c = a * b;
        require(c / a == b, "SafeMath: multiplication overflow");

        return c;
    }
    function div(uint256 a, uint256 b) internal pure returns (uint256) {
        return div(a, b, "SafeMath: division by zero");
    }
    function div(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) {
        // Solidity only automatically asserts when dividing by 0
        require(b > 0, errorMessage);
        uint256 c = a / b;

        return c;
    }
    function mod(uint256 a, uint256 b) internal pure returns (uint256) {
        return mod(a, b, "SafeMath: modulo by zero");
    }
    function mod(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) {
        require(b != 0, errorMessage);
        return a % b;
    }
}

library Address {
    function isContract(address account) internal view returns (bool) {
        bytes32 codehash;
        bytes32 accountHash = 0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470;
        // solhint-disable-next-line no-inline-assembly
        assembly { codehash := extcodehash(account) }
        return (codehash != 0x0 && codehash != accountHash);
    }
    function toPayable(address account) internal pure returns (address payable) {
        return address(uint160(account));
    }
    function sendValue(address payable recipient, uint256 amount) internal {
        require(address(this).balance >= amount, "Address: insufficient balance");

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

library SafeERC20 {
    using SafeMath for uint256;
    using Address for address;

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

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

    function safeApprove(IERC20 token, address spender, uint256 value) internal {
        require((value == 0) || (token.allowance(address(this), spender) == 0),
            "SafeERC20: approve from non-zero to non-zero allowance"
        );
        callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, value));
    }

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

    function safeDecreaseAllowance(IERC20 token, address spender, uint256 value) internal {
        uint256 newAllowance = token.allowance(address(this), spender).sub(value, "SafeERC20: decreased allowance below zero");
        callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, newAllowance));
    }
    function callOptionalReturn(IERC20 token, bytes memory data) private {
        require(address(token).isContract(), "SafeERC20: call to non-contract");

        // solhint-disable-next-line avoid-low-level-calls
        (bool success, bytes memory returndata) = address(token).call(data);
        require(success, "SafeERC20: low-level call failed");

        if (returndata.length > 0) { // Return data is optional
            // solhint-disable-next-line max-line-length
            require(abi.decode(returndata, (bool)), "SafeERC20: ERC20 operation did not succeed");
        }
    }
}

interface Compound {
    function mint ( uint256 mintAmount ) external returns ( uint256 );
    function redeem(uint256 redeemTokens) external returns (uint256);
    function exchangeRateStored() external view returns (uint);
}

interface Fulcrum {
    function mint(address receiver, uint256 amount) external payable returns (uint256 mintAmount);
    function burn(address receiver, uint256 burnAmount) external returns (uint256 loanAmountPaid);
    function assetBalanceOf(address _owner) external view returns (uint256 balance);
}

interface ILendingPoolAddressesProvider {
    function getLendingPool() external view returns (address);
}

interface Aave {
    function deposit(address _reserve, uint256 _amount, uint16 _referralCode) external;
}

interface AToken {
    function redeem(uint256 amount) external;
}

interface IIEarnManager {
    function recommend(address _token) external view returns (
      string memory choice,
      uint256 capr,
      uint256 iapr,
      uint256 aapr,
      uint256 dapr
    );
}

contract Structs {
    struct Val {
        uint256 value;
    }

    enum ActionType {
        Deposit,   // supply tokens
        Withdraw  // borrow tokens
    }

    enum AssetDenomination {
        Wei // the amount is denominated in wei
    }

    enum AssetReference {
        Delta // the amount is given as a delta from the current value
    }

    struct AssetAmount {
        bool sign; // true if positive
        AssetDenomination denomination;
        AssetReference ref;
        uint256 value;
    }

    struct ActionArgs {
        ActionType actionType;
        uint256 accountId;
        AssetAmount amount;
        uint256 primaryMarketId;
        uint256 secondaryMarketId;
        address otherAddress;
        uint256 otherAccountId;
        bytes data;
    }

    struct Info {
        address owner;  // The address that owns the account
        uint256 number; // A nonce that allows a single address to control many accounts
    }

    struct Wei {
        bool sign; // true if positive
        uint256 value;
    }
}

contract DyDx is Structs {
    function getAccountWei(Info memory account, uint256 marketId) public view returns (Wei memory);
    function operate(Info[] memory, ActionArgs[] memory) public;
}

interface LendingPoolAddressesProvider {
    function getLendingPool() external view returns (address);
    function getLendingPoolCore() external view returns (address);
}

contract ycUSDC is ERC20, ERC20Detailed, ReentrancyGuard, Structs, Ownable {
  using SafeERC20 for IERC20;
  using Address for address;
  using SafeMath for uint256;

  uint256 public pool;
  address public token;
  address public compound;
  address public fulcrum;
  address public aave;
  address public aavePool;
  address public aaveToken;
  address public dydx;
  uint256 public dToken;
  address public apr;
  uint16 public aaveRef;

  enum Lender {
      NONE,
      DYDX,
      COMPOUND,
      AAVE,
      FULCRUM
  }

  Lender public provider = Lender.NONE;

  constructor () public ERC20Detailed("Curve (iearn fork) USDC", "ycUSDC", 6) {
    token = address(0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48);
    apr = address(0x4100FB8d05e37a897ACB686AAc833DD7e49aa591);
    dydx = address(0x1E0447b19BB6EcFdAe1e4AE1694b0C3659614e4e);
    aave = address(0x24a42fD28C976A61Df5D00D0599C34c4f90748c8);
    aavePool = address(0x3dfd23A6c5E8BbcFc9581d2E864a68feb6a076d3);
    fulcrum = address(0xF013406A0B1d544238083DF0B93ad0d2cBE0f65f);
    aaveToken = address(0x9bA00D6856a4eDF4665BcA2C2309936572473B7E);
    compound = address(0x39AA39c021dfbaE8faC545936693aC917d5E7563);
    dToken = 2;
    approveToken();
  }

  function set_new_APR(address _new_APR) public onlyOwner {
      apr = _new_APR;
  }
  function set_new_FULCRUM(address _new_FULCRUM) public onlyOwner {
      fulcrum = _new_FULCRUM;
  }
  function set_new_COMPOUND(address _new_COMPOUND) public onlyOwner {
      compound = _new_COMPOUND;
  }
  function set_new_DTOKEN(uint256 _new_DTOKEN) public onlyOwner {
      dToken = _new_DTOKEN;
  }
  function set_new_AAVE(address _new_AAVE) public onlyOwner {
      aave = _new_AAVE;
  }
  function set_new_APOOL(address _new_APOOL) public onlyOwner {
      aavePool = _new_APOOL;
  }
  function set_new_ATOKEN(address _new_ATOKEN) public onlyOwner {
      aaveToken = _new_ATOKEN;
  }

  function set_aaveRef(uint16 _ref) public onlyOwner {
    aaveRef = _ref;
  }

  // Quick swap low gas method for pool swaps
  function deposit(uint256 _amount)
      external
      nonReentrant
  {
      require(_amount > 0, "deposit must be greater than 0");
      pool = calcPoolValueInToken();

      IERC20(token).safeTransferFrom(msg.sender, address(this), _amount);

      // Calculate pool shares
      uint256 shares = 0;
      if (pool == 0) {
        shares = _amount;
        pool = _amount;
      } else {
        shares = (_amount.mul(_totalSupply)).div(pool);
      }
      pool = calcPoolValueInToken();
      _mint(msg.sender, shares);
  }

  // No rebalance implementation for lower fees and faster swaps
  function withdraw(uint256 _shares)
      external
      nonReentrant
  {
      require(_shares > 0, "withdraw must be greater than 0");

      uint256 ibalance = balanceOf(msg.sender);
      require(_shares <= ibalance, "insufficient balance");

      // Could have over value from cTokens
      pool = calcPoolValueInToken();
      // Calc to redeem before updating balances
      uint256 r = (pool.mul(_shares)).div(_totalSupply);


      _balances[msg.sender] = _balances[msg.sender].sub(_shares, "redeem amount exceeds balance");
      _totalSupply = _totalSupply.sub(_shares);

      emit Transfer(msg.sender, address(0), _shares);

      // Check balance
      uint256 b = IERC20(token).balanceOf(address(this));
      if (b < r) {
        _withdrawSome(r.sub(b));
      }

      IERC20(token).safeTransfer(msg.sender, r);
      pool = calcPoolValueInToken();
  }

  function recommend() public view returns (Lender) {
    (,uint256 capr,,uint256 aapr,uint256 dapr) = IIEarnManager(apr).recommend(token);
    uint256 max = 0;
    if (capr > max) {
      max = capr;
    }
    // if (iapr > max) {
    //   max = iapr;
    // }
    if (aapr > max) {
      max = aapr;
    }
    if (dapr > max) {
      max = dapr;
    }

    Lender newProvider = Lender.NONE;
    if (max == capr) {
      newProvider = Lender.COMPOUND;
    } 
    // else if (max == iapr) {
    //   newProvider = Lender.FULCRUM;
    // }
    else if (max == aapr) {
      newProvider = Lender.AAVE;
    } else if (max == dapr) {
      newProvider = Lender.DYDX;
    }
    return newProvider;
  }

  function getAave() public view returns (address) {
    return LendingPoolAddressesProvider(aave).getLendingPool();
  }
  function getAaveCore() public view returns (address) {
    return LendingPoolAddressesProvider(aave).getLendingPoolCore();
  }

  function approveToken() public {
      IERC20(token).safeApprove(compound, uint(-1));
      IERC20(token).safeApprove(dydx, uint(-1));
      IERC20(token).safeApprove(getAaveCore(), uint(-1));
      IERC20(token).safeApprove(fulcrum, uint(-1));
  }

  function balance() public view returns (uint256) {
    return IERC20(token).balanceOf(address(this));
  }
  function balanceDydxAvailable() public view returns (uint256) {
      return IERC20(token).balanceOf(dydx);
  }
  function balanceDydx() public view returns (uint256) {
      Wei memory bal = DyDx(dydx).getAccountWei(Info(address(this), 0), dToken);
      return bal.value;
  }
  function balanceCompound() public view returns (uint256) {
      return IERC20(compound).balanceOf(address(this));
  }
  function balanceCompoundInToken() public view returns (uint256) {
    // Mantisa 1e18 to decimals
    uint256 b = balanceCompound();
    if (b > 0) {
      b = b.mul(Compound(compound).exchangeRateStored()).div(1e18);
    }
    return b;
  }
  function balanceFulcrumAvailable() public view returns (uint256) {
      return IERC20(token).balanceOf(fulcrum);
  }
  function balanceFulcrumInToken() public view returns (uint256) {
    uint256 b = balanceFulcrum();
    if (b > 0) {
      b = Fulcrum(fulcrum).assetBalanceOf(address(this));
    }
    return b;
  }
  function balanceFulcrum() public view returns (uint256) {
    return IERC20(fulcrum).balanceOf(address(this));
  }
  function balanceAaveAvailable() public view returns (uint256) {
      return IERC20(token).balanceOf(aavePool);
  }
  function balanceAave() public view returns (uint256) {
    return IERC20(aaveToken).balanceOf(address(this));
  }

  function rebalance() public {
    Lender newProvider = recommend();

    if (newProvider != provider) {
      _withdrawAll();
    }

    if (balance() > 0) {
      if (newProvider == Lender.DYDX) {
        _supplyDydx(balance());
      } 
      // else if (newProvider == Lender.FULCRUM) {
      //   _supplyFulcrum(balance());
      // }
      else if (newProvider == Lender.COMPOUND) {
        _supplyCompound(balance());
      } else if (newProvider == Lender.AAVE) {
        _supplyAave(balance());
      }
    }

    provider = newProvider;
  }

  function _withdrawAll() internal {
    uint256 amount = balanceCompound();
    if (amount > 0) {
      _withdrawSomeCompound(balanceCompoundInToken().sub(1));
    }
    amount = balanceDydx();
    if (amount > 0) {
      _withdrawDydx(balanceDydxAvailable());
    }
    amount = balanceFulcrum();
    if (amount > 0) {
      _withdrawSomeFulcrum(balanceFulcrumAvailable().sub(1));
    }
    amount = balanceAave();
    if (amount > 0) {
      _withdrawAave(balanceAaveAvailable());
    }
  }

  function _withdrawSomeCompound(uint256 _amount) internal {
    uint256 b = balanceCompound();
    uint256 bT = balanceCompoundInToken();
    require(bT >= _amount, "insufficient funds");
    // can have unintentional rounding errors
    uint256 amount = (b.mul(_amount)).div(bT).add(1);
    _withdrawCompound(amount);
  }

  function _withdrawSomeFulcrum(uint256 _amount) internal {
    uint256 b = balanceFulcrum();
    uint256 bT = balanceFulcrumInToken();
    require(bT >= _amount, "insufficient funds");
    // can have unintentional rounding errors
    uint256 amount = (b.mul(_amount)).div(bT).add(1);
    _withdrawFulcrum(amount);
  }

  function _withdrawSome(uint256 _amount) internal {
    if (provider == Lender.COMPOUND) {
      _withdrawSomeCompound(_amount);
    }
    if (provider == Lender.AAVE) {
      require(balanceAave() >= _amount, "insufficient funds");
      _withdrawAave(_amount);
    }
    if (provider == Lender.DYDX) {
      require(balanceDydx() >= _amount, "insufficient funds");
      _withdrawDydx(_amount);
    }
    if (provider == Lender.FULCRUM) {
      _withdrawSomeFulcrum(_amount);
    }
  }

  function _supplyDydx(uint256 amount) internal {
      Info[] memory infos = new Info[](1);
      infos[0] = Info(address(this), 0);

      AssetAmount memory amt = AssetAmount(true, AssetDenomination.Wei, AssetReference.Delta, amount);
      ActionArgs memory act;
      act.actionType = ActionType.Deposit;
      act.accountId = 0;
      act.amount = amt;
      act.primaryMarketId = dToken;
      act.otherAddress = address(this);

      ActionArgs[] memory args = new ActionArgs[](1);
      args[0] = act;

      DyDx(dydx).operate(infos, args);
  }

  function _supplyAave(uint amount) internal {
      Aave(getAave()).deposit(token, amount, aaveRef);
  }
  function _supplyFulcrum(uint amount) internal {
      require(Fulcrum(fulcrum).mint(address(this), amount) > 0, "FULCRUM: supply failed");
  }
  function _supplyCompound(uint amount) internal {
      require(Compound(compound).mint(amount) == 0, "COMPOUND: supply failed");
  }
  function _withdrawAave(uint amount) internal {
      AToken(aaveToken).redeem(amount);
  }
  function _withdrawFulcrum(uint amount) internal {
      require(Fulcrum(fulcrum).burn(address(this), amount) > 0, "FULCRUM: withdraw failed");
  }
  function _withdrawCompound(uint amount) internal {
      require(Compound(compound).redeem(amount) == 0, "COMPOUND: withdraw failed");
  }

  function _withdrawDydx(uint256 amount) internal {
      Info[] memory infos = new Info[](1);
      infos[0] = Info(address(this), 0);

      AssetAmount memory amt = AssetAmount(false, AssetDenomination.Wei, AssetReference.Delta, amount);
      ActionArgs memory act;
      act.actionType = ActionType.Withdraw;
      act.accountId = 0;
      act.amount = amt;
      act.primaryMarketId = dToken;
      act.otherAddress = address(this);

      ActionArgs[] memory args = new ActionArgs[](1);
      args[0] = act;

      DyDx(dydx).operate(infos, args);
  }

  function calcPoolValueInToken() public view returns (uint) {
    return balanceCompoundInToken()
      .add(balanceFulcrumInToken())
      .add(balanceDydx())
      .add(balanceAave())
      .add(balance());
  }

  function getPricePerFullShare() public view returns (uint) {
    uint _pool = calcPoolValueInToken();
    return _pool.mul(1e18).div(_totalSupply);
  }

  function withdrawSomeCompound(uint256 _amount) public onlyOwner {
    _withdrawSomeCompound(_amount);
  }
  function withdrawSomeFulcrum(uint256 _amount) public onlyOwner {
    _withdrawSomeFulcrum(_amount);
  }
  function withdrawAave(uint amount) public onlyOwner {
      _withdrawAave(amount);
  }
  function withdrawDydx(uint256 amount) public onlyOwner {
      _withdrawDydx(amount);
  }

  function supplyDydx(uint256 amount) public onlyOwner {
      _supplyDydx(amount);
  }
  function supplyAave(uint amount) public onlyOwner {
    _supplyAave(amount);
  }
  function supplyFulcrum(uint amount) public onlyOwner {
      _supplyFulcrum(amount);
  }
  function supplyCompound(uint amount) public onlyOwner {
      _supplyCompound(amount);
  }
}

Contract Security Audit

Contract ABI

[{"inputs":[],"payable":false,"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"spender","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Transfer","type":"event"},{"constant":true,"inputs":[],"name":"aave","outputs":[{"internalType":"address","name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"aavePool","outputs":[{"internalType":"address","name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"aaveRef","outputs":[{"internalType":"uint16","name":"","type":"uint16"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"aaveToken","outputs":[{"internalType":"address","name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"spender","type":"address"}],"name":"allowance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"approve","outputs":[{"internalType":"bool","name":"","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[],"name":"approveToken","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"apr","outputs":[{"internalType":"address","name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"balance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"balanceAave","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"balanceAaveAvailable","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"balanceCompound","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"balanceCompoundInToken","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"balanceDydx","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"balanceDydxAvailable","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"balanceFulcrum","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"balanceFulcrumAvailable","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"balanceFulcrumInToken","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"calcPoolValueInToken","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"compound","outputs":[{"internalType":"address","name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"dToken","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"decimals","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"subtractedValue","type":"uint256"}],"name":"decreaseAllowance","outputs":[{"internalType":"bool","name":"","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"deposit","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"dydx","outputs":[{"internalType":"address","name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"fulcrum","outputs":[{"internalType":"address","name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"getAave","outputs":[{"internalType":"address","name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"getAaveCore","outputs":[{"internalType":"address","name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"getPricePerFullShare","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"addedValue","type":"uint256"}],"name":"increaseAllowance","outputs":[{"internalType":"bool","name":"","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"isOwner","outputs":[{"internalType":"bool","name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"pool","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"provider","outputs":[{"internalType":"enum ycUSDC.Lender","name":"","type":"uint8"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[],"name":"rebalance","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"recommend","outputs":[{"internalType":"enum ycUSDC.Lender","name":"","type":"uint8"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[],"name":"renounceOwnership","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"uint16","name":"_ref","type":"uint16"}],"name":"set_aaveRef","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"_new_AAVE","type":"address"}],"name":"set_new_AAVE","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"_new_APOOL","type":"address"}],"name":"set_new_APOOL","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"_new_APR","type":"address"}],"name":"set_new_APR","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"_new_ATOKEN","type":"address"}],"name":"set_new_ATOKEN","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"_new_COMPOUND","type":"address"}],"name":"set_new_COMPOUND","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"uint256","name":"_new_DTOKEN","type":"uint256"}],"name":"set_new_DTOKEN","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"_new_FULCRUM","type":"address"}],"name":"set_new_FULCRUM","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"supplyAave","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"supplyCompound","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"supplyDydx","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"supplyFulcrum","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"token","outputs":[{"internalType":"address","name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"recipient","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transfer","outputs":[{"internalType":"bool","name":"","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"sender","type":"address"},{"internalType":"address","name":"recipient","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transferFrom","outputs":[{"internalType":"bool","name":"","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"uint256","name":"_shares","type":"uint256"}],"name":"withdraw","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"withdrawAave","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"withdrawDydx","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"withdrawSomeCompound","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"withdrawSomeFulcrum","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"}]

60806040526000601160166101000a81548160ff021916908360048111156200002457fe5b02179055503480156200003657600080fd5b506040518060400160405280601781526020017f43757276652028696561726e20666f726b2920555344430000000000000000008152506040518060400160405280600681526020017f796355534443000000000000000000000000000000000000000000000000000081525060068260039080519060200190620000bd92919062000af0565b508160049080519060200190620000d692919062000af0565b5080600560006101000a81548160ff021916908360ff16021790555050505060016006819055506200010d6200049060201b60201c565b600760006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a373a0b86991c6218b36c1d19d4a2e9eb0ce3606eb48600960006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550734100fb8d05e37a897acb686aac833dd7e49aa591601160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550731e0447b19bb6ecfdae1e4ae1694b0c3659614e4e600f60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055507324a42fd28c976a61df5d00d0599c34c4f90748c8600c60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550733dfd23a6c5e8bbcfc9581d2e864a68feb6a076d3600d60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555073f013406a0b1d544238083df0b93ad0d2cbe0f65f600b60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550739ba00d6856a4edf4665bca2c2309936572473b7e600e60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055507339aa39c021dfbae8fac545936693ac917d5e7563600a60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060026010819055506200048a6200049860201b60201c565b62001005565b600033905090565b6200052e600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff167fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16620006df60201b62003e58179092919060201c565b620005c4600f60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff167fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16620006df60201b62003e58179092919060201c565b62000647620005d86200086a60201b60201c565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16620006df60201b62003e58179092919060201c565b620006dd600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff167fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16620006df60201b62003e58179092919060201c565b565b60008114806200077f575060008373ffffffffffffffffffffffffffffffffffffffff1663dd62ed3e30856040518363ffffffff1660e01b81526004016200072992919062000e2e565b60206040518083038186803b1580156200074257600080fd5b505afa15801562000757573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052506200077d919081019062000c3c565b145b620007c1576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401620007b89062000ecc565b60405180910390fd5b62000865838473ffffffffffffffffffffffffffffffffffffffff1663095ea7b3905060e01b8484604051602401620007fc92919062000e5b565b604051602081830303815290604052907bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff83818316178352505050506200091560201b60201c565b505050565b6000600c60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663ed6ff7606040518163ffffffff1660e01b815260040160206040518083038186803b158015620008d557600080fd5b505afa158015620008ea573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525062000910919081019062000be4565b905090565b620009418273ffffffffffffffffffffffffffffffffffffffff1662000aa460201b620047881760201c565b62000983576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016200097a9062000eee565b60405180910390fd5b600060608373ffffffffffffffffffffffffffffffffffffffff1683604051620009ae919062000e15565b6000604051808303816000865af19150503d8060008114620009ed576040519150601f19603f3d011682016040523d82523d6000602084013e620009f2565b606091505b50915091508162000a3a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040162000a319062000e88565b60405180910390fd5b60008151111562000a9e578080602001905162000a5b919081019062000c10565b62000a9d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040162000a949062000eaa565b60405180910390fd5b5b50505050565b60008060007fc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a47060001b9050833f91506000801b821415801562000ae75750808214155b92505050919050565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f1062000b3357805160ff191683800117855562000b64565b8280016001018555821562000b64579182015b8281111562000b6357825182559160200191906001019062000b46565b5b50905062000b73919062000b77565b5090565b62000b9c91905b8082111562000b9857600081600090555060010162000b7e565b5090565b90565b60008151905062000bb08162000fb7565b92915050565b60008151905062000bc78162000fd1565b92915050565b60008151905062000bde8162000feb565b92915050565b60006020828403121562000bf757600080fd5b600062000c078482850162000b9f565b91505092915050565b60006020828403121562000c2357600080fd5b600062000c338482850162000bb6565b91505092915050565b60006020828403121562000c4f57600080fd5b600062000c5f8482850162000bcd565b91505092915050565b62000c738162000f37565b82525050565b600062000c868262000f10565b62000c92818562000f1b565b935062000ca481856020860162000f81565b80840191505092915050565b600062000cbf60208362000f26565b91507f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c65646000830152602082019050919050565b600062000d01602a8362000f26565b91507f5361666545524332303a204552433230206f7065726174696f6e20646964206e60008301527f6f742073756363656564000000000000000000000000000000000000000000006020830152604082019050919050565b600062000d6960368362000f26565b91507f5361666545524332303a20617070726f76652066726f6d206e6f6e2d7a65726f60008301527f20746f206e6f6e2d7a65726f20616c6c6f77616e6365000000000000000000006020830152604082019050919050565b600062000dd1601f8362000f26565b91507f5361666545524332303a2063616c6c20746f206e6f6e2d636f6e7472616374006000830152602082019050919050565b62000e0f8162000f77565b82525050565b600062000e23828462000c79565b915081905092915050565b600060408201905062000e45600083018562000c68565b62000e54602083018462000c68565b9392505050565b600060408201905062000e72600083018562000c68565b62000e81602083018462000e04565b9392505050565b6000602082019050818103600083015262000ea38162000cb0565b9050919050565b6000602082019050818103600083015262000ec58162000cf2565b9050919050565b6000602082019050818103600083015262000ee78162000d5a565b9050919050565b6000602082019050818103600083015262000f098162000dc2565b9050919050565b600081519050919050565b600081905092915050565b600082825260208201905092915050565b600062000f448262000f57565b9050919050565b60008115159050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b60005b8381101562000fa157808201518184015260208101905062000f84565b8381111562000fb1576000848401525b50505050565b62000fc28162000f37565b811462000fce57600080fd5b50565b62000fdc8162000f4b565b811462000fe857600080fd5b50565b62000ff68162000f77565b81146200100257600080fd5b50565b615fc780620010156000396000f3fe608060405234801561001057600080fd5b50600436106103ba5760003560e01c8063819faf7b116101f4578063b30d0bb21161011a578063e849d659116100ad578063f69e20461161007c578063f69e204614610aa7578063f7c1ec7714610ac5578063f82ce27d14610ae3578063fc0c546a14610b01576103ba565b8063e849d65914610a35578063f2fde38b14610a51578063f5a41dea14610a6d578063f5ff191614610a8b576103ba565b8063cf8ca426116100e9578063cf8ca426146109ab578063d54e3244146109c9578063d9d7858a146109e7578063dd62ed3e14610a05576103ba565b8063b30d0bb214610939578063b69ef8a814610955578063b6b55f2514610973578063bbf316441461098f576103ba565b80639ff011b911610192578063a728797111610161578063a7287971146108b1578063a9059cbb146108cf578063a9de245b146108ff578063b098fc801461091b576103ba565b80639ff011b914610829578063a03e4bc314610845578063a160176d14610863578063a457c2d714610881576103ba565b80638f32d59b116101ce5780638f32d59b146107c55780638f9225ca146107e357806395d89b411461080157806399b71d5c1461081f576103ba565b8063819faf7b1461076b5780638da5cb5b146107895780638e4ec6ef146107a7576103ba565b806341c57c8d116102e457806367e4b7401161027757806377c7b8fc1161024657806377c7b8fc1461070b5780637d7c2a1c146107295780638124955c14610733578063812adb061461074f576103ba565b806367e4b7401461069757806370a08231146106b35780637137ef99146106e3578063715018a614610701576103ba565b806358782c21116102b357806358782c211461062157806361c1ec551461063f578063656391321461065d57806365aab7491461067b576103ba565b806341c57c8d146105af57806346357473146105cb57806356cc9378146105e757806357ded9c914610603576103ba565b806318160ddd1161035c5780632e1a7d4d1161032b5780632e1a7d4d14610527578063313ce56714610543578063395093511461056157806339c0a7e114610591576103ba565b806318160ddd146104a157806319c13d54146104bf57806323b872dd146104db5780632bf8c42b1461050b576103ba565b8063085d488311610398578063085d488314610417578063095ea7b3146104355780630eb2a2671461046557806316f0115b14610483576103ba565b806306636c1c146103bf57806306a3fe59146103db57806306fdde03146103f9575b600080fd5b6103d960048036036103d49190810190614cb4565b610b1f565b005b6103e3610b72565b6040516103f09190615789565b60405180910390f35b610401610b98565b60405161040e91906158d1565b60405180910390f35b61041f610c3a565b60405161042c91906158b6565b60405180910390f35b61044f600480360361044a9190810190614b6e565b610c4d565b60405161045c919061589b565b60405180910390f35b61046d610c6b565b60405161047a9190615bf7565b60405180910390f35b61048b610d1d565b6040516104989190615bf7565b60405180910390f35b6104a9610d23565b6040516104b69190615bf7565b60405180910390f35b6104d960048036036104d49190810190614a91565b610d2d565b005b6104f560048036036104f09190810190614b1f565b610db8565b604051610502919061589b565b60405180910390f35b61052560048036036105209190810190614c8b565b610e91565b005b610541600480360361053c9190810190614cb4565b610ef8565b005b61054b6112a2565b6040516105589190615c12565b60405180910390f35b61057b60048036036105769190810190614b6e565b6112b9565b604051610588919061589b565b60405180910390f35b61059961136c565b6040516105a69190615bf7565b60405180910390f35b6105c960048036036105c49190810190614cb4565b61145c565b005b6105e560048036036105e09190810190614a91565b6114af565b005b61060160048036036105fc9190810190614cb4565b61153a565b005b61060b61158d565b6040516106189190615789565b60405180910390f35b6106296115b3565b6040516106369190615789565b60405180910390f35b6106476115d9565b6040516106549190615bf7565b60405180910390f35b61066561168b565b6040516106729190615bdc565b60405180910390f35b61069560048036036106909190810190614cb4565b61169f565b005b6106b160048036036106ac9190810190614cb4565b6116f2565b005b6106cd60048036036106c89190810190614a91565b611745565b6040516106da9190615bf7565b60405180910390f35b6106eb61178d565b6040516106f89190615bf7565b60405180910390f35b610709611800565b005b610713611908565b6040516107209190615bf7565b60405180910390f35b61073161194a565b005b61074d60048036036107489190810190614cb4565b611a5c565b005b61076960048036036107649190810190614a91565b611aaf565b005b610773611b3a565b6040516107809190615789565b60405180910390f35b610791611b60565b60405161079e9190615789565b60405180910390f35b6107af611b8a565b6040516107bc9190615789565b60405180910390f35b6107cd611bb0565b6040516107da919061589b565b60405180910390f35b6107eb611c0f565b6040516107f89190615bf7565b60405180910390f35b610809611ce3565b60405161081691906158d1565b60405180910390f35b610827611d85565b005b610843600480360361083e9190810190614cb4565b611fa8565b005b61084d611ff9565b60405161085a9190615789565b60405180910390f35b61086b61201f565b60405161087891906158b6565b60405180910390f35b61089b60048036036108969190810190614b6e565b612169565b6040516108a8919061589b565b60405180910390f35b6108b9612236565b6040516108c69190615bf7565b60405180910390f35b6108e960048036036108e49190810190614b6e565b612322565b6040516108f6919061589b565b60405180910390f35b61091960048036036109149190810190614a91565b612340565b005b6109236123cb565b6040516109309190615bf7565b60405180910390f35b610953600480360361094e9190810190614cb4565b61249f565b005b61095d6124f2565b60405161096a9190615bf7565b60405180910390f35b61098d60048036036109889190810190614cb4565b6125a4565b005b6109a960048036036109a49190810190614a91565b612708565b005b6109b3612793565b6040516109c09190615bf7565b60405180910390f35b6109d1612845565b6040516109de9190615bf7565b60405180910390f35b6109ef612919565b6040516109fc9190615bf7565b60405180910390f35b610a1f6004803603610a1a9190810190614ae3565b61291f565b604051610a2c9190615bf7565b60405180910390f35b610a4f6004803603610a4a9190810190614cb4565b6129a6565b005b610a6b6004803603610a669190810190614a91565b6129f9565b005b610a75612a4c565b604051610a829190615bf7565b60405180910390f35b610aa56004803603610aa09190810190614a91565b612b17565b005b610aaf612ba2565b604051610abc9190615789565b60405180910390f35b610acd612bc8565b604051610ada9190615789565b60405180910390f35b610aeb612c6f565b604051610af89190615789565b60405180910390f35b610b09612d16565b604051610b169190615789565b60405180910390f35b610b27611bb0565b610b66576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b5d90615a13565b60405180910390fd5b610b6f81612d3c565b50565b600e60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b606060038054600181600116156101000203166002900480601f016020809104026020016040519081016040528092919081815260200182805460018160011615610100020316600290048015610c305780601f10610c0557610100808354040283529160200191610c30565b820191906000526020600020905b815481529060010190602001808311610c1357829003601f168201915b5050505050905090565b601160169054906101000a900460ff1681565b6000610c61610c5a612f76565b8484612f7e565b6001905092915050565b6000600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b8152600401610cc89190615789565b60206040518083038186803b158015610ce057600080fd5b505afa158015610cf4573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250610d189190810190614cdd565b905090565b60085481565b6000600254905090565b610d35611bb0565b610d74576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d6b90615a13565b60405180910390fd5b80600d60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b6000610dc5848484613149565b610e8684610dd1612f76565b610e8185604051806060016040528060288152602001615f3860289139600160008b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000610e37612f76565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546133d39092919063ffffffff16565b612f7e565b600190509392505050565b610e99611bb0565b610ed8576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ecf90615a13565b60405180910390fd5b80601160146101000a81548161ffff021916908361ffff16021790555050565b60016006600082825401925050819055506000600654905060008211610f53576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f4a90615a53565b60405180910390fd5b6000610f5e33611745565b905080831115610fa3576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f9a90615a33565b60405180910390fd5b610fab61178d565b6008819055506000610fdc600254610fce8660085461342e90919063ffffffff16565b61349e90919063ffffffff16565b9050611066846040518060400160405280601d81526020017f72656465656d20616d6f756e7420657863656564732062616c616e63650000008152506000803373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546133d39092919063ffffffff16565b6000803373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055506110bd846002546134e890919063ffffffff16565b600281905550600073ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef866040516111219190615bf7565b60405180910390a36000600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b81526004016111869190615789565b60206040518083038186803b15801561119e57600080fd5b505afa1580156111b2573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052506111d69190810190614cdd565b9050818110156111fc576111fb6111f682846134e890919063ffffffff16565b613532565b5b6112493383600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166136a89092919063ffffffff16565b61125161178d565b600881905550505050600654811461129e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161129590615b33565b60405180910390fd5b5050565b6000600560009054906101000a900460ff16905090565b60006113626112c6612f76565b8461135d85600160006112d7612f76565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205461374790919063ffffffff16565b612f7e565b6001905092915050565b60006113766147d3565b600f60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663c190c2ec60405180604001604052803073ffffffffffffffffffffffffffffffffffffffff16815260200160008152506010546040518363ffffffff1660e01b8152600401611400929190615bb3565b604080518083038186803b15801561141757600080fd5b505afa15801561142b573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525061144f9190810190614c62565b9050806020015191505090565b611464611bb0565b6114a3576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161149a90615a13565b60405180910390fd5b6114ac8161379c565b50565b6114b7611bb0565b6114f6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114ed90615a13565b60405180910390fd5b80601160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b611542611bb0565b611581576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161157890615a13565b60405180910390fd5b61158a816139d6565b50565b601160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b81526004016116369190615789565b60206040518083038186803b15801561164e57600080fd5b505afa158015611662573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052506116869190810190614cdd565b905090565b601160149054906101000a900461ffff1681565b6116a7611bb0565b6116e6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116dd90615a13565b60405180910390fd5b6116ef81613a66565b50565b6116fa611bb0565b611739576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161173090615a13565b60405180910390fd5b61174281613b11565b50565b60008060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b60006117fb61179a6124f2565b6117ed6117a5612793565b6117df6117b061136c565b6117d16117bb612a4c565b6117c3612236565b61374790919063ffffffff16565b61374790919063ffffffff16565b61374790919063ffffffff16565b61374790919063ffffffff16565b905090565b611808611bb0565b611847576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161183e90615a13565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff16600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a36000600760006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550565b60008061191361178d565b9050611944600254611936670de0b6b3a76400008461342e90919063ffffffff16565b61349e90919063ffffffff16565b91505090565b600061195461201f565b9050601160169054906101000a900460ff16600481111561197157fe5b81600481111561197d57fe5b1461198b5761198a613bb7565b5b60006119956124f2565b1115611a3657600160048111156119a857fe5b8160048111156119b457fe5b14156119cf576119ca6119c56124f2565b612d3c565b611a35565b600260048111156119dc57fe5b8160048111156119e857fe5b1415611a03576119fe6119f96124f2565b613c72565b611a34565b60036004811115611a1057fe5b816004811115611a1c57fe5b1415611a3357611a32611a2d6124f2565b613a66565b5b5b5b5b80601160166101000a81548160ff02191690836004811115611a5457fe5b021790555050565b611a64611bb0565b611aa3576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a9a90615a13565b60405180910390fd5b611aac81613d64565b50565b611ab7611bb0565b611af6576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611aed90615a13565b60405180910390fd5b80600c60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b600c60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6000600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b600f60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6000600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16611bf3612f76565b73ffffffffffffffffffffffffffffffffffffffff1614905090565b6000600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166370a08231600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff166040518263ffffffff1660e01b8152600401611c8e9190615789565b60206040518083038186803b158015611ca657600080fd5b505afa158015611cba573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250611cde9190810190614cdd565b905090565b606060048054600181600116156101000203166002900480601f016020809104026020016040519081016040528092919081815260200182805460018160011615610100020316600290048015611d7b5780601f10611d5057610100808354040283529160200191611d7b565b820191906000526020600020905b815481529060010190602001808311611d5e57829003601f168201915b5050505050905090565b611e14600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff167fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16613e589092919063ffffffff16565b611ea3600f60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff167fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16613e589092919063ffffffff16565b611f17611eae612c6f565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16613e589092919063ffffffff16565b611fa6600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff167fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16613e589092919063ffffffff16565b565b611fb0611bb0565b611fef576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611fe690615a13565b60405180910390fd5b8060108190555050565b600d60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600080600080601160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663d88be3c0600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff166040518263ffffffff1660e01b81526004016120a29190615789565b60006040518083038186803b1580156120ba57600080fd5b505afa1580156120ce573d6000803e3d6000fd5b505050506040513d6000823e3d601f19601f820116820180604052506120f79190810190614bd3565b9450945050935050600080905080841115612110578390505b8083111561211c578290505b80821115612128578190505b60008090508482141561213e576002905061215e565b8382141561214f576003905061215d565b8282141561215c57600190505b5b5b809550505050505090565b600061222c612176612f76565b8461222785604051806060016040528060258152602001615f6060259139600160006121a0612f76565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008a73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546133d39092919063ffffffff16565b612f7e565b6001905092915050565b6000806122416115d9565b9050600081111561231b57612318670de0b6b3a764000061230a600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663182df0f56040518163ffffffff1660e01b815260040160206040518083038186803b1580156122c357600080fd5b505afa1580156122d7573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052506122fb9190810190614cdd565b8461342e90919063ffffffff16565b61349e90919063ffffffff16565b90505b8091505090565b600061233661232f612f76565b8484613149565b6001905092915050565b612348611bb0565b612387576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161237e90615a13565b60405180910390fd5b80600e60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b6000600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166370a08231600d60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff166040518263ffffffff1660e01b815260040161244a9190615789565b60206040518083038186803b15801561246257600080fd5b505afa158015612476573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525061249a9190810190614cdd565b905090565b6124a7611bb0565b6124e6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016124dd90615a13565b60405180910390fd5b6124ef81613fcf565b50565b6000600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b815260040161254f9190615789565b60206040518083038186803b15801561256757600080fd5b505afa15801561257b573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525061259f9190810190614cdd565b905090565b600160066000828254019250508190555060006006549050600082116125ff576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016125f690615ad3565b60405180910390fd5b61260761178d565b60088190555061265c333084600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16614075909392919063ffffffff16565b60008090506000600854141561267b57829050826008819055506126a7565b6126a46008546126966002548661342e90919063ffffffff16565b61349e90919063ffffffff16565b90505b6126af61178d565b6008819055506126bf3382614117565b506006548114612704576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016126fb90615b33565b60405180910390fd5b5050565b612710611bb0565b61274f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161274690615a13565b60405180910390fd5b80600b60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b6000600e60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b81526004016127f09190615789565b60206040518083038186803b15801561280857600080fd5b505afa15801561281c573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052506128409190810190614cdd565b905090565b6000600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166370a08231600f60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff166040518263ffffffff1660e01b81526004016128c49190615789565b60206040518083038186803b1580156128dc57600080fd5b505afa1580156128f0573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052506129149190810190614cdd565b905090565b60105481565b6000600160008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905092915050565b6129ae611bb0565b6129ed576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016129e490615a13565b60405180910390fd5b6129f681613c72565b50565b612a01611bb0565b612a40576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612a3790615a13565b60405180910390fd5b612a498161429f565b50565b600080612a57610c6b565b90506000811115612b1057600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166306b3efd6306040518263ffffffff1660e01b8152600401612abd9190615789565b60206040518083038186803b158015612ad557600080fd5b505afa158015612ae9573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250612b0d9190810190614cdd565b90505b8091505090565b612b1f611bb0565b612b5e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612b5590615a13565b60405180910390fd5b80600a60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6000600c60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16630261bf8b6040518163ffffffff1660e01b815260040160206040518083038186803b158015612c3257600080fd5b505afa158015612c46573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250612c6a9190810190614aba565b905090565b6000600c60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663ed6ff7606040518163ffffffff1660e01b815260040160206040518083038186803b158015612cd957600080fd5b505afa158015612ced573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250612d119190810190614aba565b905090565b600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b60606001604051908082528060200260200182016040528015612d7957816020015b612d666147ef565b815260200190600190039081612d5e5790505b50905060405180604001604052803073ffffffffffffffffffffffffffffffffffffffff168152602001600081525081600081518110612db557fe5b6020026020010181905250612dc861481f565b6040518060800160405280600115158152602001600080811115612de857fe5b8152602001600080811115612df957fe5b8152602001848152509050612e0c61485d565b600081600001906001811115612e1e57fe5b90816001811115612e2b57fe5b815250506000816020018181525050818160400181905250601054816060018181525050308160a0019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff168152505060606001604051908082528060200260200182016040528015612ec457816020015b612eb16148c9565b815260200190600190039081612ea95790505b5090508181600081518110612ed557fe5b6020026020010181905250600f60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663a67a6a4585836040518363ffffffff1660e01b8152600401612f3d929190615864565b600060405180830381600087803b158015612f5757600080fd5b505af1158015612f6b573d6000803e3d6000fd5b505050505050505050565b600033905090565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415612fee576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612fe590615ab3565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141561305e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161305590615953565b60405180910390fd5b80600160008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b9258360405161313c9190615bf7565b60405180910390a3505050565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614156131b9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016131b090615a73565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415613229576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613220906158f3565b60405180910390fd5b61329481604051806060016040528060268152602001615f12602691396000808773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546133d39092919063ffffffff16565b6000808573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550613327816000808573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205461374790919063ffffffff16565b6000808473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef836040516133c69190615bf7565b60405180910390a3505050565b600083831115829061341b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161341291906158d1565b60405180910390fd5b5060008385039050809150509392505050565b6000808314156134415760009050613498565b600082840290508284828161345257fe5b0414613493576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161348a906159d3565b60405180910390fd5b809150505b92915050565b60006134e083836040518060400160405280601a81526020017f536166654d6174683a206469766973696f6e206279207a65726f0000000000008152506143cf565b905092915050565b600061352a83836040518060400160405280601e81526020017f536166654d6174683a207375627472616374696f6e206f766572666c6f7700008152506133d3565b905092915050565b6002600481111561353f57fe5b601160169054906101000a900460ff16600481111561355a57fe5b141561356a5761356981613fcf565b5b6003600481111561357757fe5b601160169054906101000a900460ff16600481111561359257fe5b14156135ec57806135a1612793565b10156135e2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016135d990615a93565b60405180910390fd5b6135eb816139d6565b5b600160048111156135f957fe5b601160169054906101000a900460ff16600481111561361457fe5b141561366e578061362361136c565b1015613664576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161365b90615a93565b60405180910390fd5b61366d8161379c565b5b60048081111561367a57fe5b601160169054906101000a900460ff16600481111561369557fe5b14156136a5576136a481613b11565b5b50565b613742838473ffffffffffffffffffffffffffffffffffffffff1663a9059cbb905060e01b84846040516024016136e0929190615804565b604051602081830303815290604052907bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff8381831617835250505050614430565b505050565b600080828401905083811015613792576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161378990615993565b60405180910390fd5b8091505092915050565b606060016040519080825280602002602001820160405280156137d957816020015b6137c66147ef565b8152602001906001900390816137be5790505b50905060405180604001604052803073ffffffffffffffffffffffffffffffffffffffff16815260200160008152508160008151811061381557fe5b602002602001018190525061382861481f565b604051806080016040528060001515815260200160008081111561384857fe5b815260200160008081111561385957fe5b815260200184815250905061386c61485d565b60018160000190600181111561387e57fe5b9081600181111561388b57fe5b815250506000816020018181525050818160400181905250601054816060018181525050308160a0019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff16815250506060600160405190808252806020026020018201604052801561392457816020015b6139116148c9565b8152602001906001900390816139095790505b509050818160008151811061393557fe5b6020026020010181905250600f60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663a67a6a4585836040518363ffffffff1660e01b815260040161399d929190615864565b600060405180830381600087803b1580156139b757600080fd5b505af11580156139cb573d6000803e3d6000fd5b505050505050505050565b600e60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663db006a75826040518263ffffffff1660e01b8152600401613a319190615bf7565b600060405180830381600087803b158015613a4b57600080fd5b505af1158015613a5f573d6000803e3d6000fd5b5050505050565b613a6e612bc8565b73ffffffffffffffffffffffffffffffffffffffff1663d2d0e066600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1683601160149054906101000a900461ffff166040518463ffffffff1660e01b8152600401613adc9392919061582d565b600060405180830381600087803b158015613af657600080fd5b505af1158015613b0a573d6000803e3d6000fd5b5050505050565b6000613b1b610c6b565b90506000613b27612a4c565b905082811015613b6c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613b6390615a93565b60405180910390fd5b6000613ba66001613b9884613b8a888861342e90919063ffffffff16565b61349e90919063ffffffff16565b61374790919063ffffffff16565b9050613bb1816145a2565b50505050565b6000613bc16115d9565b90506000811115613bf057613bef613bea6001613bdc612236565b6134e890919063ffffffff16565b613fcf565b5b613bf861136c565b90506000811115613c1457613c13613c0e612845565b61379c565b5b613c1c610c6b565b90506000811115613c4b57613c4a613c456001613c37611c0f565b6134e890919063ffffffff16565b613b11565b5b613c53612793565b90506000811115613c6f57613c6e613c696123cb565b6139d6565b5b50565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663a0712d68836040518263ffffffff1660e01b8152600401613ccf9190615bf7565b602060405180830381600087803b158015613ce957600080fd5b505af1158015613cfd573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250613d219190810190614cdd565b14613d61576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613d5890615973565b60405180910390fd5b50565b6000600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166340c10f1930846040518363ffffffff1660e01b8152600401613dc3929190615804565b602060405180830381600087803b158015613ddd57600080fd5b505af1158015613df1573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250613e159190810190614cdd565b11613e55576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613e4c90615af3565b60405180910390fd5b50565b6000811480613ef1575060008373ffffffffffffffffffffffffffffffffffffffff1663dd62ed3e30856040518363ffffffff1660e01b8152600401613e9f9291906157a4565b60206040518083038186803b158015613eb757600080fd5b505afa158015613ecb573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250613eef9190810190614cdd565b145b613f30576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613f2790615b53565b60405180910390fd5b613fca838473ffffffffffffffffffffffffffffffffffffffff1663095ea7b3905060e01b8484604051602401613f68929190615804565b604051602081830303815290604052907bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff8381831617835250505050614430565b505050565b6000613fd96115d9565b90506000613fe5612236565b90508281101561402a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161402190615a93565b60405180910390fd5b6000614064600161405684614048888861342e90919063ffffffff16565b61349e90919063ffffffff16565b61374790919063ffffffff16565b905061406f81614696565b50505050565b614111848573ffffffffffffffffffffffffffffffffffffffff166323b872dd905060e01b8585856040516024016140af939291906157cd565b604051602081830303815290604052907bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff8381831617835250505050614430565b50505050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415614187576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161417e90615b93565b60405180910390fd5b61419c8160025461374790919063ffffffff16565b6002819055506141f3816000808573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205461374790919063ffffffff16565b6000808473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508173ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef836040516142939190615bf7565b60405180910390a35050565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16141561430f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161430690615933565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a380600760006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b60008083118290614416576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161440d91906158d1565b60405180910390fd5b50600083858161442257fe5b049050809150509392505050565b61444f8273ffffffffffffffffffffffffffffffffffffffff16614788565b61448e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161448590615b73565b60405180910390fd5b600060608373ffffffffffffffffffffffffffffffffffffffff16836040516144b79190615772565b6000604051808303816000865af19150503d80600081146144f4576040519150601f19603f3d011682016040523d82523d6000602084013e6144f9565b606091505b50915091508161453e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401614535906159b3565b60405180910390fd5b60008151111561459c578080602001905161455c9190810190614baa565b61459b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161459290615b13565b60405180910390fd5b5b50505050565b6000600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16639dc29fac30846040518363ffffffff1660e01b8152600401614601929190615804565b602060405180830381600087803b15801561461b57600080fd5b505af115801561462f573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052506146539190810190614cdd565b11614693576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161468a906159f3565b60405180910390fd5b50565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663db006a75836040518263ffffffff1660e01b81526004016146f39190615bf7565b602060405180830381600087803b15801561470d57600080fd5b505af1158015614721573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052506147459190810190614cdd565b14614785576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161477c90615913565b60405180910390fd5b50565b60008060007fc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a47060001b9050833f91506000801b82141580156147ca5750808214155b92505050919050565b6040518060400160405280600015158152602001600081525090565b6040518060400160405280600073ffffffffffffffffffffffffffffffffffffffff168152602001600081525090565b604051806080016040528060001515815260200160008081111561483f57fe5b815260200160008081111561485057fe5b8152602001600081525090565b6040518061010001604052806000600181111561487657fe5b81526020016000815260200161488a614935565b81526020016000815260200160008152602001600073ffffffffffffffffffffffffffffffffffffffff16815260200160008152602001606081525090565b604051806101000160405280600060018111156148e257fe5b8152602001600081526020016148f6614935565b81526020016000815260200160008152602001600073ffffffffffffffffffffffffffffffffffffffff16815260200160008152602001606081525090565b604051806080016040528060001515815260200160008081111561495557fe5b815260200160008081111561496657fe5b8152602001600081525090565b60008135905061498281615eb5565b92915050565b60008151905061499781615eb5565b92915050565b6000815190506149ac81615ecc565b92915050565b600082601f8301126149c357600080fd5b81516149d66149d182615c5a565b615c2d565b915080825260208301602083018583830111156149f257600080fd5b6149fd838284615e3d565b50505092915050565b600060408284031215614a1857600080fd5b614a226040615c2d565b90506000614a328482850161499d565b6000830152506020614a4684828501614a7c565b60208301525092915050565b600081359050614a6181615ee3565b92915050565b600081359050614a7681615efa565b92915050565b600081519050614a8b81615efa565b92915050565b600060208284031215614aa357600080fd5b6000614ab184828501614973565b91505092915050565b600060208284031215614acc57600080fd5b6000614ada84828501614988565b91505092915050565b60008060408385031215614af657600080fd5b6000614b0485828601614973565b9250506020614b1585828601614973565b9150509250929050565b600080600060608486031215614b3457600080fd5b6000614b4286828701614973565b9350506020614b5386828701614973565b9250506040614b6486828701614a67565b9150509250925092565b60008060408385031215614b8157600080fd5b6000614b8f85828601614973565b9250506020614ba085828601614a67565b9150509250929050565b600060208284031215614bbc57600080fd5b6000614bca8482850161499d565b91505092915050565b600080600080600060a08688031215614beb57600080fd5b600086015167ffffffffffffffff811115614c0557600080fd5b614c11888289016149b2565b9550506020614c2288828901614a7c565b9450506040614c3388828901614a7c565b9350506060614c4488828901614a7c565b9250506080614c5588828901614a7c565b9150509295509295909350565b600060408284031215614c7457600080fd5b6000614c8284828501614a06565b91505092915050565b600060208284031215614c9d57600080fd5b6000614cab84828501614a52565b91505092915050565b600060208284031215614cc657600080fd5b6000614cd484828501614a67565b91505092915050565b600060208284031215614cef57600080fd5b6000614cfd84828501614a7c565b91505092915050565b6000614d1283836155d0565b905092915050565b6000614d2683836156d8565b60408301905092915050565b614d3b81615d46565b82525050565b614d4a81615d46565b82525050565b6000614d5b82615ca6565b614d658185615cf7565b935083602082028501614d7785615c86565b8060005b85811015614db35784840389528151614d948582614d06565b9450614d9f83615cdd565b925060208a01995050600181019050614d7b565b50829750879550505050505092915050565b6000614dd082615cb1565b614dda8185615d08565b9350614de583615c96565b8060005b83811015614e16578151614dfd8882614d1a565b9750614e0883615cea565b925050600181019050614de9565b5085935050505092915050565b614e2c81615d58565b82525050565b614e3b81615d58565b82525050565b6000614e4c82615cc7565b614e568185615d2a565b9350614e66818560208601615e3d565b80840191505092915050565b6000614e7d82615cbc565b614e878185615d19565b9350614e97818560208601615e3d565b614ea081615e70565b840191505092915050565b614eb481615df5565b82525050565b614ec381615e07565b82525050565b614ed281615e19565b82525050565b614ee181615e2b565b82525050565b6000614ef282615cd2565b614efc8185615d35565b9350614f0c818560208601615e3d565b614f1581615e70565b840191505092915050565b6000614f2d602383615d35565b91507f45524332303a207472616e7366657220746f20746865207a65726f206164647260008301527f65737300000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b6000614f93601983615d35565b91507f434f4d504f554e443a207769746864726177206661696c6564000000000000006000830152602082019050919050565b6000614fd3602683615d35565b91507f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008301527f64647265737300000000000000000000000000000000000000000000000000006020830152604082019050919050565b6000615039602283615d35565b91507f45524332303a20617070726f766520746f20746865207a65726f20616464726560008301527f73730000000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b600061509f601783615d35565b91507f434f4d504f554e443a20737570706c79206661696c65640000000000000000006000830152602082019050919050565b60006150df601b83615d35565b91507f536166654d6174683a206164646974696f6e206f766572666c6f7700000000006000830152602082019050919050565b600061511f602083615d35565b91507f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c65646000830152602082019050919050565b600061515f602183615d35565b91507f536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f60008301527f77000000000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b60006151c5601883615d35565b91507f46554c4352554d3a207769746864726177206661696c656400000000000000006000830152602082019050919050565b6000615205602083615d35565b91507f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726000830152602082019050919050565b6000615245601483615d35565b91507f696e73756666696369656e742062616c616e63650000000000000000000000006000830152602082019050919050565b6000615285601f83615d35565b91507f7769746864726177206d7573742062652067726561746572207468616e2030006000830152602082019050919050565b60006152c5602583615d35565b91507f45524332303a207472616e736665722066726f6d20746865207a65726f20616460008301527f64726573730000000000000000000000000000000000000000000000000000006020830152604082019050919050565b600061532b601283615d35565b91507f696e73756666696369656e742066756e647300000000000000000000000000006000830152602082019050919050565b600061536b602483615d35565b91507f45524332303a20617070726f76652066726f6d20746865207a65726f2061646460008301527f72657373000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b60006153d1601e83615d35565b91507f6465706f736974206d7573742062652067726561746572207468616e203000006000830152602082019050919050565b6000615411601683615d35565b91507f46554c4352554d3a20737570706c79206661696c6564000000000000000000006000830152602082019050919050565b6000615451602a83615d35565b91507f5361666545524332303a204552433230206f7065726174696f6e20646964206e60008301527f6f742073756363656564000000000000000000000000000000000000000000006020830152604082019050919050565b60006154b7601f83615d35565b91507f5265656e7472616e637947756172643a207265656e7472616e742063616c6c006000830152602082019050919050565b60006154f7603683615d35565b91507f5361666545524332303a20617070726f76652066726f6d206e6f6e2d7a65726f60008301527f20746f206e6f6e2d7a65726f20616c6c6f77616e6365000000000000000000006020830152604082019050919050565b600061555d601f83615d35565b91507f5361666545524332303a2063616c6c20746f206e6f6e2d636f6e7472616374006000830152602082019050919050565b600061559d601f83615d35565b91507f45524332303a206d696e7420746f20746865207a65726f2061646472657373006000830152602082019050919050565b6000610160830160008301516155e96000860182614eab565b5060208301516155fc6020860182615745565b50604083015161560f6040860182615683565b50606083015161562260c0860182615745565b50608083015161563560e0860182615745565b5060a0830151615649610100860182614d32565b5060c083015161565d610120860182615745565b5060e08301518482036101408601526156768282614e72565b9150508091505092915050565b6080820160008201516156996000850182614e23565b5060208201516156ac6020850182614eba565b5060408201516156bf6040850182614ec9565b5060608201516156d26060850182615745565b50505050565b6040820160008201516156ee6000850182614d32565b5060208201516157016020850182615745565b50505050565b60408201600082015161571d6000850182614d32565b5060208201516157306020850182615745565b50505050565b61573f81615db0565b82525050565b61574e81615dde565b82525050565b61575d81615dde565b82525050565b61576c81615de8565b82525050565b600061577e8284614e41565b915081905092915050565b600060208201905061579e6000830184614d41565b92915050565b60006040820190506157b96000830185614d41565b6157c66020830184614d41565b9392505050565b60006060820190506157e26000830186614d41565b6157ef6020830185614d41565b6157fc6040830184615754565b949350505050565b60006040820190506158196000830185614d41565b6158266020830184615754565b9392505050565b60006060820190506158426000830186614d41565b61584f6020830185615754565b61585c6040830184615736565b949350505050565b6000604082019050818103600083015261587e8185614dc5565b905081810360208301526158928184614d50565b90509392505050565b60006020820190506158b06000830184614e32565b92915050565b60006020820190506158cb6000830184614ed8565b92915050565b600060208201905081810360008301526158eb8184614ee7565b905092915050565b6000602082019050818103600083015261590c81614f20565b9050919050565b6000602082019050818103600083015261592c81614f86565b9050919050565b6000602082019050818103600083015261594c81614fc6565b9050919050565b6000602082019050818103600083015261596c8161502c565b9050919050565b6000602082019050818103600083015261598c81615092565b9050919050565b600060208201905081810360008301526159ac816150d2565b9050919050565b600060208201905081810360008301526159cc81615112565b9050919050565b600060208201905081810360008301526159ec81615152565b9050919050565b60006020820190508181036000830152615a0c816151b8565b9050919050565b60006020820190508181036000830152615a2c816151f8565b9050919050565b60006020820190508181036000830152615a4c81615238565b9050919050565b60006020820190508181036000830152615a6c81615278565b9050919050565b60006020820190508181036000830152615a8c816152b8565b9050919050565b60006020820190508181036000830152615aac8161531e565b9050919050565b60006020820190508181036000830152615acc8161535e565b9050919050565b60006020820190508181036000830152615aec816153c4565b9050919050565b60006020820190508181036000830152615b0c81615404565b9050919050565b60006020820190508181036000830152615b2c81615444565b9050919050565b60006020820190508181036000830152615b4c816154aa565b9050919050565b60006020820190508181036000830152615b6c816154ea565b9050919050565b60006020820190508181036000830152615b8c81615550565b9050919050565b60006020820190508181036000830152615bac81615590565b9050919050565b6000606082019050615bc86000830185615707565b615bd56040830184615754565b9392505050565b6000602082019050615bf16000830184615736565b92915050565b6000602082019050615c0c6000830184615754565b92915050565b6000602082019050615c276000830184615763565b92915050565b6000604051905081810181811067ffffffffffffffff82111715615c5057600080fd5b8060405250919050565b600067ffffffffffffffff821115615c7157600080fd5b601f19601f8301169050602081019050919050565b6000819050602082019050919050565b6000819050602082019050919050565b600081519050919050565b600081519050919050565b600081519050919050565b600081519050919050565b600081519050919050565b6000602082019050919050565b6000602082019050919050565b600082825260208201905092915050565b600082825260208201905092915050565b600082825260208201905092915050565b600081905092915050565b600082825260208201905092915050565b6000615d5182615dbe565b9050919050565b60008115159050919050565b6000819050615d7282615e81565b919050565b6000819050615d8582615e8e565b919050565b6000819050615d9882615e9b565b919050565b6000819050615dab82615ea8565b919050565b600061ffff82169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b600060ff82169050919050565b6000615e0082615d64565b9050919050565b6000615e1282615d77565b9050919050565b6000615e2482615d8a565b9050919050565b6000615e3682615d9d565b9050919050565b60005b83811015615e5b578082015181840152602081019050615e40565b83811115615e6a576000848401525b50505050565b6000601f19601f8301169050919050565b60028110615e8b57fe5b50565b60018110615e9857fe5b50565b60018110615ea557fe5b50565b60058110615eb257fe5b50565b615ebe81615d46565b8114615ec957600080fd5b50565b615ed581615d58565b8114615ee057600080fd5b50565b615eec81615db0565b8114615ef757600080fd5b50565b615f0381615dde565b8114615f0e57600080fd5b5056fe45524332303a207472616e7366657220616d6f756e7420657863656564732062616c616e636545524332303a207472616e7366657220616d6f756e74206578636565647320616c6c6f77616e636545524332303a2064656372656173656420616c6c6f77616e63652062656c6f77207a65726fa365627a7a72315820fa43538774eaa3c9881f8f483698538da0736cad83b244324b27312104d638a36c6578706572696d656e74616cf564736f6c634300050c0040

Deployed Bytecode

0x608060405234801561001057600080fd5b50600436106103ba5760003560e01c8063819faf7b116101f4578063b30d0bb21161011a578063e849d659116100ad578063f69e20461161007c578063f69e204614610aa7578063f7c1ec7714610ac5578063f82ce27d14610ae3578063fc0c546a14610b01576103ba565b8063e849d65914610a35578063f2fde38b14610a51578063f5a41dea14610a6d578063f5ff191614610a8b576103ba565b8063cf8ca426116100e9578063cf8ca426146109ab578063d54e3244146109c9578063d9d7858a146109e7578063dd62ed3e14610a05576103ba565b8063b30d0bb214610939578063b69ef8a814610955578063b6b55f2514610973578063bbf316441461098f576103ba565b80639ff011b911610192578063a728797111610161578063a7287971146108b1578063a9059cbb146108cf578063a9de245b146108ff578063b098fc801461091b576103ba565b80639ff011b914610829578063a03e4bc314610845578063a160176d14610863578063a457c2d714610881576103ba565b80638f32d59b116101ce5780638f32d59b146107c55780638f9225ca146107e357806395d89b411461080157806399b71d5c1461081f576103ba565b8063819faf7b1461076b5780638da5cb5b146107895780638e4ec6ef146107a7576103ba565b806341c57c8d116102e457806367e4b7401161027757806377c7b8fc1161024657806377c7b8fc1461070b5780637d7c2a1c146107295780638124955c14610733578063812adb061461074f576103ba565b806367e4b7401461069757806370a08231146106b35780637137ef99146106e3578063715018a614610701576103ba565b806358782c21116102b357806358782c211461062157806361c1ec551461063f578063656391321461065d57806365aab7491461067b576103ba565b806341c57c8d146105af57806346357473146105cb57806356cc9378146105e757806357ded9c914610603576103ba565b806318160ddd1161035c5780632e1a7d4d1161032b5780632e1a7d4d14610527578063313ce56714610543578063395093511461056157806339c0a7e114610591576103ba565b806318160ddd146104a157806319c13d54146104bf57806323b872dd146104db5780632bf8c42b1461050b576103ba565b8063085d488311610398578063085d488314610417578063095ea7b3146104355780630eb2a2671461046557806316f0115b14610483576103ba565b806306636c1c146103bf57806306a3fe59146103db57806306fdde03146103f9575b600080fd5b6103d960048036036103d49190810190614cb4565b610b1f565b005b6103e3610b72565b6040516103f09190615789565b60405180910390f35b610401610b98565b60405161040e91906158d1565b60405180910390f35b61041f610c3a565b60405161042c91906158b6565b60405180910390f35b61044f600480360361044a9190810190614b6e565b610c4d565b60405161045c919061589b565b60405180910390f35b61046d610c6b565b60405161047a9190615bf7565b60405180910390f35b61048b610d1d565b6040516104989190615bf7565b60405180910390f35b6104a9610d23565b6040516104b69190615bf7565b60405180910390f35b6104d960048036036104d49190810190614a91565b610d2d565b005b6104f560048036036104f09190810190614b1f565b610db8565b604051610502919061589b565b60405180910390f35b61052560048036036105209190810190614c8b565b610e91565b005b610541600480360361053c9190810190614cb4565b610ef8565b005b61054b6112a2565b6040516105589190615c12565b60405180910390f35b61057b60048036036105769190810190614b6e565b6112b9565b604051610588919061589b565b60405180910390f35b61059961136c565b6040516105a69190615bf7565b60405180910390f35b6105c960048036036105c49190810190614cb4565b61145c565b005b6105e560048036036105e09190810190614a91565b6114af565b005b61060160048036036105fc9190810190614cb4565b61153a565b005b61060b61158d565b6040516106189190615789565b60405180910390f35b6106296115b3565b6040516106369190615789565b60405180910390f35b6106476115d9565b6040516106549190615bf7565b60405180910390f35b61066561168b565b6040516106729190615bdc565b60405180910390f35b61069560048036036106909190810190614cb4565b61169f565b005b6106b160048036036106ac9190810190614cb4565b6116f2565b005b6106cd60048036036106c89190810190614a91565b611745565b6040516106da9190615bf7565b60405180910390f35b6106eb61178d565b6040516106f89190615bf7565b60405180910390f35b610709611800565b005b610713611908565b6040516107209190615bf7565b60405180910390f35b61073161194a565b005b61074d60048036036107489190810190614cb4565b611a5c565b005b61076960048036036107649190810190614a91565b611aaf565b005b610773611b3a565b6040516107809190615789565b60405180910390f35b610791611b60565b60405161079e9190615789565b60405180910390f35b6107af611b8a565b6040516107bc9190615789565b60405180910390f35b6107cd611bb0565b6040516107da919061589b565b60405180910390f35b6107eb611c0f565b6040516107f89190615bf7565b60405180910390f35b610809611ce3565b60405161081691906158d1565b60405180910390f35b610827611d85565b005b610843600480360361083e9190810190614cb4565b611fa8565b005b61084d611ff9565b60405161085a9190615789565b60405180910390f35b61086b61201f565b60405161087891906158b6565b60405180910390f35b61089b60048036036108969190810190614b6e565b612169565b6040516108a8919061589b565b60405180910390f35b6108b9612236565b6040516108c69190615bf7565b60405180910390f35b6108e960048036036108e49190810190614b6e565b612322565b6040516108f6919061589b565b60405180910390f35b61091960048036036109149190810190614a91565b612340565b005b6109236123cb565b6040516109309190615bf7565b60405180910390f35b610953600480360361094e9190810190614cb4565b61249f565b005b61095d6124f2565b60405161096a9190615bf7565b60405180910390f35b61098d60048036036109889190810190614cb4565b6125a4565b005b6109a960048036036109a49190810190614a91565b612708565b005b6109b3612793565b6040516109c09190615bf7565b60405180910390f35b6109d1612845565b6040516109de9190615bf7565b60405180910390f35b6109ef612919565b6040516109fc9190615bf7565b60405180910390f35b610a1f6004803603610a1a9190810190614ae3565b61291f565b604051610a2c9190615bf7565b60405180910390f35b610a4f6004803603610a4a9190810190614cb4565b6129a6565b005b610a6b6004803603610a669190810190614a91565b6129f9565b005b610a75612a4c565b604051610a829190615bf7565b60405180910390f35b610aa56004803603610aa09190810190614a91565b612b17565b005b610aaf612ba2565b604051610abc9190615789565b60405180910390f35b610acd612bc8565b604051610ada9190615789565b60405180910390f35b610aeb612c6f565b604051610af89190615789565b60405180910390f35b610b09612d16565b604051610b169190615789565b60405180910390f35b610b27611bb0565b610b66576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b5d90615a13565b60405180910390fd5b610b6f81612d3c565b50565b600e60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b606060038054600181600116156101000203166002900480601f016020809104026020016040519081016040528092919081815260200182805460018160011615610100020316600290048015610c305780601f10610c0557610100808354040283529160200191610c30565b820191906000526020600020905b815481529060010190602001808311610c1357829003601f168201915b5050505050905090565b601160169054906101000a900460ff1681565b6000610c61610c5a612f76565b8484612f7e565b6001905092915050565b6000600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b8152600401610cc89190615789565b60206040518083038186803b158015610ce057600080fd5b505afa158015610cf4573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250610d189190810190614cdd565b905090565b60085481565b6000600254905090565b610d35611bb0565b610d74576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d6b90615a13565b60405180910390fd5b80600d60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b6000610dc5848484613149565b610e8684610dd1612f76565b610e8185604051806060016040528060288152602001615f3860289139600160008b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000610e37612f76565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546133d39092919063ffffffff16565b612f7e565b600190509392505050565b610e99611bb0565b610ed8576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ecf90615a13565b60405180910390fd5b80601160146101000a81548161ffff021916908361ffff16021790555050565b60016006600082825401925050819055506000600654905060008211610f53576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f4a90615a53565b60405180910390fd5b6000610f5e33611745565b905080831115610fa3576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f9a90615a33565b60405180910390fd5b610fab61178d565b6008819055506000610fdc600254610fce8660085461342e90919063ffffffff16565b61349e90919063ffffffff16565b9050611066846040518060400160405280601d81526020017f72656465656d20616d6f756e7420657863656564732062616c616e63650000008152506000803373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546133d39092919063ffffffff16565b6000803373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055506110bd846002546134e890919063ffffffff16565b600281905550600073ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef866040516111219190615bf7565b60405180910390a36000600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b81526004016111869190615789565b60206040518083038186803b15801561119e57600080fd5b505afa1580156111b2573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052506111d69190810190614cdd565b9050818110156111fc576111fb6111f682846134e890919063ffffffff16565b613532565b5b6112493383600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166136a89092919063ffffffff16565b61125161178d565b600881905550505050600654811461129e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161129590615b33565b60405180910390fd5b5050565b6000600560009054906101000a900460ff16905090565b60006113626112c6612f76565b8461135d85600160006112d7612f76565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205461374790919063ffffffff16565b612f7e565b6001905092915050565b60006113766147d3565b600f60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663c190c2ec60405180604001604052803073ffffffffffffffffffffffffffffffffffffffff16815260200160008152506010546040518363ffffffff1660e01b8152600401611400929190615bb3565b604080518083038186803b15801561141757600080fd5b505afa15801561142b573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525061144f9190810190614c62565b9050806020015191505090565b611464611bb0565b6114a3576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161149a90615a13565b60405180910390fd5b6114ac8161379c565b50565b6114b7611bb0565b6114f6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114ed90615a13565b60405180910390fd5b80601160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b611542611bb0565b611581576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161157890615a13565b60405180910390fd5b61158a816139d6565b50565b601160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b81526004016116369190615789565b60206040518083038186803b15801561164e57600080fd5b505afa158015611662573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052506116869190810190614cdd565b905090565b601160149054906101000a900461ffff1681565b6116a7611bb0565b6116e6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116dd90615a13565b60405180910390fd5b6116ef81613a66565b50565b6116fa611bb0565b611739576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161173090615a13565b60405180910390fd5b61174281613b11565b50565b60008060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b60006117fb61179a6124f2565b6117ed6117a5612793565b6117df6117b061136c565b6117d16117bb612a4c565b6117c3612236565b61374790919063ffffffff16565b61374790919063ffffffff16565b61374790919063ffffffff16565b61374790919063ffffffff16565b905090565b611808611bb0565b611847576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161183e90615a13565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff16600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a36000600760006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550565b60008061191361178d565b9050611944600254611936670de0b6b3a76400008461342e90919063ffffffff16565b61349e90919063ffffffff16565b91505090565b600061195461201f565b9050601160169054906101000a900460ff16600481111561197157fe5b81600481111561197d57fe5b1461198b5761198a613bb7565b5b60006119956124f2565b1115611a3657600160048111156119a857fe5b8160048111156119b457fe5b14156119cf576119ca6119c56124f2565b612d3c565b611a35565b600260048111156119dc57fe5b8160048111156119e857fe5b1415611a03576119fe6119f96124f2565b613c72565b611a34565b60036004811115611a1057fe5b816004811115611a1c57fe5b1415611a3357611a32611a2d6124f2565b613a66565b5b5b5b5b80601160166101000a81548160ff02191690836004811115611a5457fe5b021790555050565b611a64611bb0565b611aa3576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a9a90615a13565b60405180910390fd5b611aac81613d64565b50565b611ab7611bb0565b611af6576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611aed90615a13565b60405180910390fd5b80600c60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b600c60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6000600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b600f60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6000600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16611bf3612f76565b73ffffffffffffffffffffffffffffffffffffffff1614905090565b6000600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166370a08231600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff166040518263ffffffff1660e01b8152600401611c8e9190615789565b60206040518083038186803b158015611ca657600080fd5b505afa158015611cba573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250611cde9190810190614cdd565b905090565b606060048054600181600116156101000203166002900480601f016020809104026020016040519081016040528092919081815260200182805460018160011615610100020316600290048015611d7b5780601f10611d5057610100808354040283529160200191611d7b565b820191906000526020600020905b815481529060010190602001808311611d5e57829003601f168201915b5050505050905090565b611e14600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff167fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16613e589092919063ffffffff16565b611ea3600f60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff167fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16613e589092919063ffffffff16565b611f17611eae612c6f565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16613e589092919063ffffffff16565b611fa6600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff167fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16613e589092919063ffffffff16565b565b611fb0611bb0565b611fef576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611fe690615a13565b60405180910390fd5b8060108190555050565b600d60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600080600080601160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663d88be3c0600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff166040518263ffffffff1660e01b81526004016120a29190615789565b60006040518083038186803b1580156120ba57600080fd5b505afa1580156120ce573d6000803e3d6000fd5b505050506040513d6000823e3d601f19601f820116820180604052506120f79190810190614bd3565b9450945050935050600080905080841115612110578390505b8083111561211c578290505b80821115612128578190505b60008090508482141561213e576002905061215e565b8382141561214f576003905061215d565b8282141561215c57600190505b5b5b809550505050505090565b600061222c612176612f76565b8461222785604051806060016040528060258152602001615f6060259139600160006121a0612f76565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008a73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546133d39092919063ffffffff16565b612f7e565b6001905092915050565b6000806122416115d9565b9050600081111561231b57612318670de0b6b3a764000061230a600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663182df0f56040518163ffffffff1660e01b815260040160206040518083038186803b1580156122c357600080fd5b505afa1580156122d7573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052506122fb9190810190614cdd565b8461342e90919063ffffffff16565b61349e90919063ffffffff16565b90505b8091505090565b600061233661232f612f76565b8484613149565b6001905092915050565b612348611bb0565b612387576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161237e90615a13565b60405180910390fd5b80600e60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b6000600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166370a08231600d60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff166040518263ffffffff1660e01b815260040161244a9190615789565b60206040518083038186803b15801561246257600080fd5b505afa158015612476573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525061249a9190810190614cdd565b905090565b6124a7611bb0565b6124e6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016124dd90615a13565b60405180910390fd5b6124ef81613fcf565b50565b6000600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b815260040161254f9190615789565b60206040518083038186803b15801561256757600080fd5b505afa15801561257b573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525061259f9190810190614cdd565b905090565b600160066000828254019250508190555060006006549050600082116125ff576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016125f690615ad3565b60405180910390fd5b61260761178d565b60088190555061265c333084600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16614075909392919063ffffffff16565b60008090506000600854141561267b57829050826008819055506126a7565b6126a46008546126966002548661342e90919063ffffffff16565b61349e90919063ffffffff16565b90505b6126af61178d565b6008819055506126bf3382614117565b506006548114612704576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016126fb90615b33565b60405180910390fd5b5050565b612710611bb0565b61274f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161274690615a13565b60405180910390fd5b80600b60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b6000600e60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b81526004016127f09190615789565b60206040518083038186803b15801561280857600080fd5b505afa15801561281c573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052506128409190810190614cdd565b905090565b6000600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166370a08231600f60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff166040518263ffffffff1660e01b81526004016128c49190615789565b60206040518083038186803b1580156128dc57600080fd5b505afa1580156128f0573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052506129149190810190614cdd565b905090565b60105481565b6000600160008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905092915050565b6129ae611bb0565b6129ed576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016129e490615a13565b60405180910390fd5b6129f681613c72565b50565b612a01611bb0565b612a40576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612a3790615a13565b60405180910390fd5b612a498161429f565b50565b600080612a57610c6b565b90506000811115612b1057600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166306b3efd6306040518263ffffffff1660e01b8152600401612abd9190615789565b60206040518083038186803b158015612ad557600080fd5b505afa158015612ae9573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250612b0d9190810190614cdd565b90505b8091505090565b612b1f611bb0565b612b5e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612b5590615a13565b60405180910390fd5b80600a60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6000600c60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16630261bf8b6040518163ffffffff1660e01b815260040160206040518083038186803b158015612c3257600080fd5b505afa158015612c46573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250612c6a9190810190614aba565b905090565b6000600c60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663ed6ff7606040518163ffffffff1660e01b815260040160206040518083038186803b158015612cd957600080fd5b505afa158015612ced573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250612d119190810190614aba565b905090565b600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b60606001604051908082528060200260200182016040528015612d7957816020015b612d666147ef565b815260200190600190039081612d5e5790505b50905060405180604001604052803073ffffffffffffffffffffffffffffffffffffffff168152602001600081525081600081518110612db557fe5b6020026020010181905250612dc861481f565b6040518060800160405280600115158152602001600080811115612de857fe5b8152602001600080811115612df957fe5b8152602001848152509050612e0c61485d565b600081600001906001811115612e1e57fe5b90816001811115612e2b57fe5b815250506000816020018181525050818160400181905250601054816060018181525050308160a0019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff168152505060606001604051908082528060200260200182016040528015612ec457816020015b612eb16148c9565b815260200190600190039081612ea95790505b5090508181600081518110612ed557fe5b6020026020010181905250600f60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663a67a6a4585836040518363ffffffff1660e01b8152600401612f3d929190615864565b600060405180830381600087803b158015612f5757600080fd5b505af1158015612f6b573d6000803e3d6000fd5b505050505050505050565b600033905090565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415612fee576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612fe590615ab3565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141561305e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161305590615953565b60405180910390fd5b80600160008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b9258360405161313c9190615bf7565b60405180910390a3505050565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614156131b9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016131b090615a73565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415613229576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613220906158f3565b60405180910390fd5b61329481604051806060016040528060268152602001615f12602691396000808773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546133d39092919063ffffffff16565b6000808573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550613327816000808573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205461374790919063ffffffff16565b6000808473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef836040516133c69190615bf7565b60405180910390a3505050565b600083831115829061341b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161341291906158d1565b60405180910390fd5b5060008385039050809150509392505050565b6000808314156134415760009050613498565b600082840290508284828161345257fe5b0414613493576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161348a906159d3565b60405180910390fd5b809150505b92915050565b60006134e083836040518060400160405280601a81526020017f536166654d6174683a206469766973696f6e206279207a65726f0000000000008152506143cf565b905092915050565b600061352a83836040518060400160405280601e81526020017f536166654d6174683a207375627472616374696f6e206f766572666c6f7700008152506133d3565b905092915050565b6002600481111561353f57fe5b601160169054906101000a900460ff16600481111561355a57fe5b141561356a5761356981613fcf565b5b6003600481111561357757fe5b601160169054906101000a900460ff16600481111561359257fe5b14156135ec57806135a1612793565b10156135e2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016135d990615a93565b60405180910390fd5b6135eb816139d6565b5b600160048111156135f957fe5b601160169054906101000a900460ff16600481111561361457fe5b141561366e578061362361136c565b1015613664576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161365b90615a93565b60405180910390fd5b61366d8161379c565b5b60048081111561367a57fe5b601160169054906101000a900460ff16600481111561369557fe5b14156136a5576136a481613b11565b5b50565b613742838473ffffffffffffffffffffffffffffffffffffffff1663a9059cbb905060e01b84846040516024016136e0929190615804565b604051602081830303815290604052907bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff8381831617835250505050614430565b505050565b600080828401905083811015613792576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161378990615993565b60405180910390fd5b8091505092915050565b606060016040519080825280602002602001820160405280156137d957816020015b6137c66147ef565b8152602001906001900390816137be5790505b50905060405180604001604052803073ffffffffffffffffffffffffffffffffffffffff16815260200160008152508160008151811061381557fe5b602002602001018190525061382861481f565b604051806080016040528060001515815260200160008081111561384857fe5b815260200160008081111561385957fe5b815260200184815250905061386c61485d565b60018160000190600181111561387e57fe5b9081600181111561388b57fe5b815250506000816020018181525050818160400181905250601054816060018181525050308160a0019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff16815250506060600160405190808252806020026020018201604052801561392457816020015b6139116148c9565b8152602001906001900390816139095790505b509050818160008151811061393557fe5b6020026020010181905250600f60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663a67a6a4585836040518363ffffffff1660e01b815260040161399d929190615864565b600060405180830381600087803b1580156139b757600080fd5b505af11580156139cb573d6000803e3d6000fd5b505050505050505050565b600e60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663db006a75826040518263ffffffff1660e01b8152600401613a319190615bf7565b600060405180830381600087803b158015613a4b57600080fd5b505af1158015613a5f573d6000803e3d6000fd5b5050505050565b613a6e612bc8565b73ffffffffffffffffffffffffffffffffffffffff1663d2d0e066600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1683601160149054906101000a900461ffff166040518463ffffffff1660e01b8152600401613adc9392919061582d565b600060405180830381600087803b158015613af657600080fd5b505af1158015613b0a573d6000803e3d6000fd5b5050505050565b6000613b1b610c6b565b90506000613b27612a4c565b905082811015613b6c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613b6390615a93565b60405180910390fd5b6000613ba66001613b9884613b8a888861342e90919063ffffffff16565b61349e90919063ffffffff16565b61374790919063ffffffff16565b9050613bb1816145a2565b50505050565b6000613bc16115d9565b90506000811115613bf057613bef613bea6001613bdc612236565b6134e890919063ffffffff16565b613fcf565b5b613bf861136c565b90506000811115613c1457613c13613c0e612845565b61379c565b5b613c1c610c6b565b90506000811115613c4b57613c4a613c456001613c37611c0f565b6134e890919063ffffffff16565b613b11565b5b613c53612793565b90506000811115613c6f57613c6e613c696123cb565b6139d6565b5b50565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663a0712d68836040518263ffffffff1660e01b8152600401613ccf9190615bf7565b602060405180830381600087803b158015613ce957600080fd5b505af1158015613cfd573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250613d219190810190614cdd565b14613d61576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613d5890615973565b60405180910390fd5b50565b6000600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166340c10f1930846040518363ffffffff1660e01b8152600401613dc3929190615804565b602060405180830381600087803b158015613ddd57600080fd5b505af1158015613df1573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250613e159190810190614cdd565b11613e55576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613e4c90615af3565b60405180910390fd5b50565b6000811480613ef1575060008373ffffffffffffffffffffffffffffffffffffffff1663dd62ed3e30856040518363ffffffff1660e01b8152600401613e9f9291906157a4565b60206040518083038186803b158015613eb757600080fd5b505afa158015613ecb573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250613eef9190810190614cdd565b145b613f30576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613f2790615b53565b60405180910390fd5b613fca838473ffffffffffffffffffffffffffffffffffffffff1663095ea7b3905060e01b8484604051602401613f68929190615804565b604051602081830303815290604052907bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff8381831617835250505050614430565b505050565b6000613fd96115d9565b90506000613fe5612236565b90508281101561402a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161402190615a93565b60405180910390fd5b6000614064600161405684614048888861342e90919063ffffffff16565b61349e90919063ffffffff16565b61374790919063ffffffff16565b905061406f81614696565b50505050565b614111848573ffffffffffffffffffffffffffffffffffffffff166323b872dd905060e01b8585856040516024016140af939291906157cd565b604051602081830303815290604052907bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff8381831617835250505050614430565b50505050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415614187576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161417e90615b93565b60405180910390fd5b61419c8160025461374790919063ffffffff16565b6002819055506141f3816000808573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205461374790919063ffffffff16565b6000808473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508173ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef836040516142939190615bf7565b60405180910390a35050565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16141561430f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161430690615933565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a380600760006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b60008083118290614416576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161440d91906158d1565b60405180910390fd5b50600083858161442257fe5b049050809150509392505050565b61444f8273ffffffffffffffffffffffffffffffffffffffff16614788565b61448e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161448590615b73565b60405180910390fd5b600060608373ffffffffffffffffffffffffffffffffffffffff16836040516144b79190615772565b6000604051808303816000865af19150503d80600081146144f4576040519150601f19603f3d011682016040523d82523d6000602084013e6144f9565b606091505b50915091508161453e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401614535906159b3565b60405180910390fd5b60008151111561459c578080602001905161455c9190810190614baa565b61459b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161459290615b13565b60405180910390fd5b5b50505050565b6000600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16639dc29fac30846040518363ffffffff1660e01b8152600401614601929190615804565b602060405180830381600087803b15801561461b57600080fd5b505af115801561462f573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052506146539190810190614cdd565b11614693576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161468a906159f3565b60405180910390fd5b50565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663db006a75836040518263ffffffff1660e01b81526004016146f39190615bf7565b602060405180830381600087803b15801561470d57600080fd5b505af1158015614721573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052506147459190810190614cdd565b14614785576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161477c90615913565b60405180910390fd5b50565b60008060007fc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a47060001b9050833f91506000801b82141580156147ca5750808214155b92505050919050565b6040518060400160405280600015158152602001600081525090565b6040518060400160405280600073ffffffffffffffffffffffffffffffffffffffff168152602001600081525090565b604051806080016040528060001515815260200160008081111561483f57fe5b815260200160008081111561485057fe5b8152602001600081525090565b6040518061010001604052806000600181111561487657fe5b81526020016000815260200161488a614935565b81526020016000815260200160008152602001600073ffffffffffffffffffffffffffffffffffffffff16815260200160008152602001606081525090565b604051806101000160405280600060018111156148e257fe5b8152602001600081526020016148f6614935565b81526020016000815260200160008152602001600073ffffffffffffffffffffffffffffffffffffffff16815260200160008152602001606081525090565b604051806080016040528060001515815260200160008081111561495557fe5b815260200160008081111561496657fe5b8152602001600081525090565b60008135905061498281615eb5565b92915050565b60008151905061499781615eb5565b92915050565b6000815190506149ac81615ecc565b92915050565b600082601f8301126149c357600080fd5b81516149d66149d182615c5a565b615c2d565b915080825260208301602083018583830111156149f257600080fd5b6149fd838284615e3d565b50505092915050565b600060408284031215614a1857600080fd5b614a226040615c2d565b90506000614a328482850161499d565b6000830152506020614a4684828501614a7c565b60208301525092915050565b600081359050614a6181615ee3565b92915050565b600081359050614a7681615efa565b92915050565b600081519050614a8b81615efa565b92915050565b600060208284031215614aa357600080fd5b6000614ab184828501614973565b91505092915050565b600060208284031215614acc57600080fd5b6000614ada84828501614988565b91505092915050565b60008060408385031215614af657600080fd5b6000614b0485828601614973565b9250506020614b1585828601614973565b9150509250929050565b600080600060608486031215614b3457600080fd5b6000614b4286828701614973565b9350506020614b5386828701614973565b9250506040614b6486828701614a67565b9150509250925092565b60008060408385031215614b8157600080fd5b6000614b8f85828601614973565b9250506020614ba085828601614a67565b9150509250929050565b600060208284031215614bbc57600080fd5b6000614bca8482850161499d565b91505092915050565b600080600080600060a08688031215614beb57600080fd5b600086015167ffffffffffffffff811115614c0557600080fd5b614c11888289016149b2565b9550506020614c2288828901614a7c565b9450506040614c3388828901614a7c565b9350506060614c4488828901614a7c565b9250506080614c5588828901614a7c565b9150509295509295909350565b600060408284031215614c7457600080fd5b6000614c8284828501614a06565b91505092915050565b600060208284031215614c9d57600080fd5b6000614cab84828501614a52565b91505092915050565b600060208284031215614cc657600080fd5b6000614cd484828501614a67565b91505092915050565b600060208284031215614cef57600080fd5b6000614cfd84828501614a7c565b91505092915050565b6000614d1283836155d0565b905092915050565b6000614d2683836156d8565b60408301905092915050565b614d3b81615d46565b82525050565b614d4a81615d46565b82525050565b6000614d5b82615ca6565b614d658185615cf7565b935083602082028501614d7785615c86565b8060005b85811015614db35784840389528151614d948582614d06565b9450614d9f83615cdd565b925060208a01995050600181019050614d7b565b50829750879550505050505092915050565b6000614dd082615cb1565b614dda8185615d08565b9350614de583615c96565b8060005b83811015614e16578151614dfd8882614d1a565b9750614e0883615cea565b925050600181019050614de9565b5085935050505092915050565b614e2c81615d58565b82525050565b614e3b81615d58565b82525050565b6000614e4c82615cc7565b614e568185615d2a565b9350614e66818560208601615e3d565b80840191505092915050565b6000614e7d82615cbc565b614e878185615d19565b9350614e97818560208601615e3d565b614ea081615e70565b840191505092915050565b614eb481615df5565b82525050565b614ec381615e07565b82525050565b614ed281615e19565b82525050565b614ee181615e2b565b82525050565b6000614ef282615cd2565b614efc8185615d35565b9350614f0c818560208601615e3d565b614f1581615e70565b840191505092915050565b6000614f2d602383615d35565b91507f45524332303a207472616e7366657220746f20746865207a65726f206164647260008301527f65737300000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b6000614f93601983615d35565b91507f434f4d504f554e443a207769746864726177206661696c6564000000000000006000830152602082019050919050565b6000614fd3602683615d35565b91507f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008301527f64647265737300000000000000000000000000000000000000000000000000006020830152604082019050919050565b6000615039602283615d35565b91507f45524332303a20617070726f766520746f20746865207a65726f20616464726560008301527f73730000000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b600061509f601783615d35565b91507f434f4d504f554e443a20737570706c79206661696c65640000000000000000006000830152602082019050919050565b60006150df601b83615d35565b91507f536166654d6174683a206164646974696f6e206f766572666c6f7700000000006000830152602082019050919050565b600061511f602083615d35565b91507f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c65646000830152602082019050919050565b600061515f602183615d35565b91507f536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f60008301527f77000000000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b60006151c5601883615d35565b91507f46554c4352554d3a207769746864726177206661696c656400000000000000006000830152602082019050919050565b6000615205602083615d35565b91507f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726000830152602082019050919050565b6000615245601483615d35565b91507f696e73756666696369656e742062616c616e63650000000000000000000000006000830152602082019050919050565b6000615285601f83615d35565b91507f7769746864726177206d7573742062652067726561746572207468616e2030006000830152602082019050919050565b60006152c5602583615d35565b91507f45524332303a207472616e736665722066726f6d20746865207a65726f20616460008301527f64726573730000000000000000000000000000000000000000000000000000006020830152604082019050919050565b600061532b601283615d35565b91507f696e73756666696369656e742066756e647300000000000000000000000000006000830152602082019050919050565b600061536b602483615d35565b91507f45524332303a20617070726f76652066726f6d20746865207a65726f2061646460008301527f72657373000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b60006153d1601e83615d35565b91507f6465706f736974206d7573742062652067726561746572207468616e203000006000830152602082019050919050565b6000615411601683615d35565b91507f46554c4352554d3a20737570706c79206661696c6564000000000000000000006000830152602082019050919050565b6000615451602a83615d35565b91507f5361666545524332303a204552433230206f7065726174696f6e20646964206e60008301527f6f742073756363656564000000000000000000000000000000000000000000006020830152604082019050919050565b60006154b7601f83615d35565b91507f5265656e7472616e637947756172643a207265656e7472616e742063616c6c006000830152602082019050919050565b60006154f7603683615d35565b91507f5361666545524332303a20617070726f76652066726f6d206e6f6e2d7a65726f60008301527f20746f206e6f6e2d7a65726f20616c6c6f77616e6365000000000000000000006020830152604082019050919050565b600061555d601f83615d35565b91507f5361666545524332303a2063616c6c20746f206e6f6e2d636f6e7472616374006000830152602082019050919050565b600061559d601f83615d35565b91507f45524332303a206d696e7420746f20746865207a65726f2061646472657373006000830152602082019050919050565b6000610160830160008301516155e96000860182614eab565b5060208301516155fc6020860182615745565b50604083015161560f6040860182615683565b50606083015161562260c0860182615745565b50608083015161563560e0860182615745565b5060a0830151615649610100860182614d32565b5060c083015161565d610120860182615745565b5060e08301518482036101408601526156768282614e72565b9150508091505092915050565b6080820160008201516156996000850182614e23565b5060208201516156ac6020850182614eba565b5060408201516156bf6040850182614ec9565b5060608201516156d26060850182615745565b50505050565b6040820160008201516156ee6000850182614d32565b5060208201516157016020850182615745565b50505050565b60408201600082015161571d6000850182614d32565b5060208201516157306020850182615745565b50505050565b61573f81615db0565b82525050565b61574e81615dde565b82525050565b61575d81615dde565b82525050565b61576c81615de8565b82525050565b600061577e8284614e41565b915081905092915050565b600060208201905061579e6000830184614d41565b92915050565b60006040820190506157b96000830185614d41565b6157c66020830184614d41565b9392505050565b60006060820190506157e26000830186614d41565b6157ef6020830185614d41565b6157fc6040830184615754565b949350505050565b60006040820190506158196000830185614d41565b6158266020830184615754565b9392505050565b60006060820190506158426000830186614d41565b61584f6020830185615754565b61585c6040830184615736565b949350505050565b6000604082019050818103600083015261587e8185614dc5565b905081810360208301526158928184614d50565b90509392505050565b60006020820190506158b06000830184614e32565b92915050565b60006020820190506158cb6000830184614ed8565b92915050565b600060208201905081810360008301526158eb8184614ee7565b905092915050565b6000602082019050818103600083015261590c81614f20565b9050919050565b6000602082019050818103600083015261592c81614f86565b9050919050565b6000602082019050818103600083015261594c81614fc6565b9050919050565b6000602082019050818103600083015261596c8161502c565b9050919050565b6000602082019050818103600083015261598c81615092565b9050919050565b600060208201905081810360008301526159ac816150d2565b9050919050565b600060208201905081810360008301526159cc81615112565b9050919050565b600060208201905081810360008301526159ec81615152565b9050919050565b60006020820190508181036000830152615a0c816151b8565b9050919050565b60006020820190508181036000830152615a2c816151f8565b9050919050565b60006020820190508181036000830152615a4c81615238565b9050919050565b60006020820190508181036000830152615a6c81615278565b9050919050565b60006020820190508181036000830152615a8c816152b8565b9050919050565b60006020820190508181036000830152615aac8161531e565b9050919050565b60006020820190508181036000830152615acc8161535e565b9050919050565b60006020820190508181036000830152615aec816153c4565b9050919050565b60006020820190508181036000830152615b0c81615404565b9050919050565b60006020820190508181036000830152615b2c81615444565b9050919050565b60006020820190508181036000830152615b4c816154aa565b9050919050565b60006020820190508181036000830152615b6c816154ea565b9050919050565b60006020820190508181036000830152615b8c81615550565b9050919050565b60006020820190508181036000830152615bac81615590565b9050919050565b6000606082019050615bc86000830185615707565b615bd56040830184615754565b9392505050565b6000602082019050615bf16000830184615736565b92915050565b6000602082019050615c0c6000830184615754565b92915050565b6000602082019050615c276000830184615763565b92915050565b6000604051905081810181811067ffffffffffffffff82111715615c5057600080fd5b8060405250919050565b600067ffffffffffffffff821115615c7157600080fd5b601f19601f8301169050602081019050919050565b6000819050602082019050919050565b6000819050602082019050919050565b600081519050919050565b600081519050919050565b600081519050919050565b600081519050919050565b600081519050919050565b6000602082019050919050565b6000602082019050919050565b600082825260208201905092915050565b600082825260208201905092915050565b600082825260208201905092915050565b600081905092915050565b600082825260208201905092915050565b6000615d5182615dbe565b9050919050565b60008115159050919050565b6000819050615d7282615e81565b919050565b6000819050615d8582615e8e565b919050565b6000819050615d9882615e9b565b919050565b6000819050615dab82615ea8565b919050565b600061ffff82169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b600060ff82169050919050565b6000615e0082615d64565b9050919050565b6000615e1282615d77565b9050919050565b6000615e2482615d8a565b9050919050565b6000615e3682615d9d565b9050919050565b60005b83811015615e5b578082015181840152602081019050615e40565b83811115615e6a576000848401525b50505050565b6000601f19601f8301169050919050565b60028110615e8b57fe5b50565b60018110615e9857fe5b50565b60018110615ea557fe5b50565b60058110615eb257fe5b50565b615ebe81615d46565b8114615ec957600080fd5b50565b615ed581615d58565b8114615ee057600080fd5b50565b615eec81615db0565b8114615ef757600080fd5b50565b615f0381615dde565b8114615f0e57600080fd5b5056fe45524332303a207472616e7366657220616d6f756e7420657863656564732062616c616e636545524332303a207472616e7366657220616d6f756e74206578636565647320616c6c6f77616e636545524332303a2064656372656173656420616c6c6f77616e63652062656c6f77207a65726fa365627a7a72315820fa43538774eaa3c9881f8f483698538da0736cad83b244324b27312104d638a36c6578706572696d656e74616cf564736f6c634300050c0040

Deployed Bytecode Sourcemap

13693:11690:0:-;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;13693:11690:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;25017:87;;;;;;;;;;;;;;;;:::i;:::-;;14023:24;;;:::i;:::-;;;;;;;;;;;;;;;;6032:83;;;:::i;:::-;;;;;;;;;;;;;;;;14248:36;;;:::i;:::-;;;;;;;;;;;;;;;;3052:152;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;19660:116;;;:::i;:::-;;;;;;;;;;;;;;;;13867:19;;;:::i;:::-;;;;;;;;;;;;;;;;2535:91;;;:::i;:::-;;;;;;;;;;;;;;;;15450:96;;;;;;;;;;;;;;;;:::i;:::-;;3210:304;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;15656:78;;;;;;;;;;;;;;;;:::i;:::-;;16407:897;;;;;;;;;;;;;;;;:::i;:::-;;6214:83;;;:::i;:::-;;;;;;;;;;;;;;;;3520:210;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;18784:166;;;:::i;:::-;;;;;;;;;;;;;;;;24920:91;;;;;;;;;;;;;;;;:::i;:::-;;14953:85;;;;;;;;;;;;;;;;:::i;:::-;;24828:88;;;;;;;;;;;;;;;;:::i;:::-;;14102:18;;;:::i;:::-;;;;;;;;;;;;;;;;13944:22;;;:::i;:::-;;;;;;;;;;;;;;;;18954:120;;;:::i;:::-;;;;;;;;;;;;;;;;14125:21;;;:::i;:::-;;;;;;;;;;;;;;;;25108:82;;;;;;;;;;;;;;;;:::i;:::-;;24719:105;;;;;;;;;;;;;;;;:::i;:::-;;2632:110;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;24225:217;;;:::i;:::-;;;;;;;;;;;;;;;;1810:140;;;:::i;:::-;;24448:154;;;:::i;:::-;;;;;;;;;;;;;;;;20022:571;;;:::i;:::-;;25194:90;;;;;;;;;;;;;;;;:::i;:::-;;15357:89;;;;;;;;;;;;;;;;:::i;:::-;;13971:19;;;:::i;:::-;;;;;;;;;;;;;;;;1513:79;;;:::i;:::-;;;;;;;;;;;;;;;;14052:19;;;:::i;:::-;;;;;;;;;;;;;;;;1710:94;;;:::i;:::-;;;;;;;;;;;;;;;;19330:119;;;:::i;:::-;;;;;;;;;;;;;;;;6121:87;;;:::i;:::-;;;;;;;;;;;;;;;;18297:253;;;:::i;:::-;;15256:97;;;;;;;;;;;;;;;;:::i;:::-;;13995:23;;;:::i;:::-;;;;;;;;;;;;;;;;17310:723;;;:::i;:::-;;;;;;;;;;;;;;;;3736:261;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;19078:248;;;:::i;:::-;;;;;;;;;;;;;;;;2748:158;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;15550:100;;;;;;;;;;;;;;;;:::i;:::-;;19780:117;;;:::i;:::-;;;;;;;;;;;;;;;;24608:107;;;;;;;;;;;;;;;;:::i;:::-;;18556;;;:::i;:::-;;;;;;;;;;;;;;;;15787:548;;;;;;;;;;;;;;;;:::i;:::-;;15042:101;;;;;;;;;;;;;;;;:::i;:::-;;19901:115;;;:::i;:::-;;;;;;;;;;;;;;;;18667:113;;;:::i;:::-;;;;;;;;;;;;;;;;14076:21;;;:::i;:::-;;;;;;;;;;;;;;;;2912:134;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;25288:92;;;;;;;;;;;;;;;;:::i;:::-;;1956:109;;;;;;;;;;;;;;;;:::i;:::-;;19453:203;;;:::i;:::-;;;;;;;;;;;;;;;;15147:105;;;;;;;;;;;;;;;;:::i;:::-;;13916:23;;;:::i;:::-;;;;;;;;;;;;;;;;18039:120;;;:::i;:::-;;;;;;;;;;;;;;;;18163:128;;;:::i;:::-;;;;;;;;;;;;;;;;13891:20;;;:::i;:::-;;;;;;;;;;;;;;;;25017:87;1638:9;:7;:9::i;:::-;1630:54;;;;;;;;;;;;;;;;;;;;;;25079:19;25091:6;25079:11;:19::i;:::-;25017:87;:::o;14023:24::-;;;;;;;;;;;;;:::o;6032:83::-;6069:13;6102:5;6095:12;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;6032:83;:::o;14248:36::-;;;;;;;;;;;;;:::o;3052:152::-;3118:4;3135:39;3144:12;:10;:12::i;:::-;3158:7;3167:6;3135:8;:39::i;:::-;3192:4;3185:11;;3052:152;;;;:::o;19660:116::-;19707:7;19737;;;;;;;;;;;19730:25;;;19764:4;19730:40;;;;;;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;19730:40:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;19730:40:0;;;;;;;101:4:-1;97:9;90:4;84;80:15;76:31;69:5;65:43;126:6;120:4;113:20;0:138;19730:40:0;;;;;;;;;19723:47;;19660:116;:::o;13867:19::-;;;;:::o;2535:91::-;2579:7;2606:12;;2599:19;;2535:91;:::o;15450:96::-;1638:9;:7;:9::i;:::-;1630:54;;;;;;;;;;;;;;;;;;;;;;15530:10;15519:8;;:21;;;;;;;;;;;;;;;;;;15450:96;:::o;3210:304::-;3299:4;3316:36;3326:6;3334:9;3345:6;3316:9;:36::i;:::-;3363:121;3372:6;3380:12;:10;:12::i;:::-;3394:89;3432:6;3394:89;;;;;;;;;;;;;;;;;:11;:19;3406:6;3394:19;;;;;;;;;;;;;;;:33;3414:12;:10;:12::i;:::-;3394:33;;;;;;;;;;;;;;;;:37;;:89;;;;;:::i;:::-;3363:8;:121::i;:::-;3502:4;3495:11;;3210:304;;;;;:::o;15656:78::-;1638:9;:7;:9::i;:::-;1630:54;;;;;;;;;;;;;;;;;;;;;;15724:4;15714:7;;:14;;;;;;;;;;;;;;;;;;15656:78;:::o;16407:897::-;6494:1;6477:13;;:18;;;;;;;;;;;6506:20;6529:13;;6506:36;;16508:1;16498:7;:11;16490:55;;;;;;;;;;;;;;;;;;;;;;16556:16;16575:21;16585:10;16575:9;:21::i;:::-;16556:40;;16624:8;16613:7;:19;;16605:52;;;;;;;;;;;;;;;;;;;;;;16720:22;:20;:22::i;:::-;16713:4;:29;;;;16801:9;16813:37;16837:12;;16814:17;16823:7;16814:4;;:8;;:17;;;;:::i;:::-;16813:23;;:37;;;;:::i;:::-;16801:49;;16887:67;16913:7;16887:67;;;;;;;;;;;;;;;;;:9;:21;16897:10;16887:21;;;;;;;;;;;;;;;;:25;;:67;;;;;:::i;:::-;16863:9;:21;16873:10;16863:21;;;;;;;;;;;;;;;:91;;;;16978:25;16995:7;16978:12;;:16;;:25;;;;:::i;:::-;16963:12;:40;;;;17048:1;17019:41;;17028:10;17019:41;;;17052:7;17019:41;;;;;;;;;;;;;;;17095:9;17114:5;;;;;;;;;;;17107:23;;;17139:4;17107:38;;;;;;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;17107:38:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;17107:38:0;;;;;;;101:4:-1;97:9;90:4;84;80:15;76:31;69:5;65:43;126:6;120:4;113:20;0:138;17107:38:0;;;;;;;;;17095:50;;17162:1;17158;:5;17154:55;;;17176:23;17190:8;17196:1;17190;:5;;:8;;;;:::i;:::-;17176:13;:23::i;:::-;17154:55;17219:41;17246:10;17258:1;17226:5;;;;;;;;;;;17219:26;;;;:41;;;;;:::i;:::-;17276:22;:20;:22::i;:::-;17269:4;:29;;;;6553:1;;;6589:13;;6573:12;:29;6565:73;;;;;;;;;;;;;;;;;;;;;;16407:897;;:::o;6214:83::-;6255:5;6280:9;;;;;;;;;;;6273:16;;6214:83;:::o;3520:210::-;3600:4;3617:83;3626:12;:10;:12::i;:::-;3640:7;3649:50;3688:10;3649:11;:25;3661:12;:10;:12::i;:::-;3649:25;;;;;;;;;;;;;;;:34;3675:7;3649:34;;;;;;;;;;;;;;;;:38;;:50;;;;:::i;:::-;3617:8;:83::i;:::-;3718:4;3711:11;;3520:210;;;;:::o;18784:166::-;18828:7;18846:14;;:::i;:::-;18868:4;;;;;;;;;;;18863:24;;;18888:22;;;;;;;;18901:4;18888:22;;;;;;18908:1;18888:22;;;18912:6;;18863:56;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;18863:56:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;18863:56:0;;;;;;;101:4:-1;97:9;90:4;84;80:15;76:31;69:5;65:43;126:6;120:4;113:20;0:138;18863:56:0;;;;;;;;;18846:73;;18935:3;:9;;;18928:16;;;18784:166;:::o;24920:91::-;1638:9;:7;:9::i;:::-;1630:54;;;;;;;;;;;;;;;;;;;;;;24984:21;24998:6;24984:13;:21::i;:::-;24920:91;:::o;14953:85::-;1638:9;:7;:9::i;:::-;1630:54;;;;;;;;;;;;;;;;;;;;;;15024:8;15018:3;;:14;;;;;;;;;;;;;;;;;;14953:85;:::o;24828:88::-;1638:9;:7;:9::i;:::-;1630:54;;;;;;;;;;;;;;;;;;;;;;24889:21;24903:6;24889:13;:21::i;:::-;24828:88;:::o;14102:18::-;;;;;;;;;;;;;:::o;13944:22::-;;;;;;;;;;;;;:::o;18954:120::-;19002:7;19034:8;;;;;;;;;;;19027:26;;;19062:4;19027:41;;;;;;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;19027:41:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;19027:41:0;;;;;;;101:4:-1;97:9;90:4;84;80:15;76:31;69:5;65:43;126:6;120:4;113:20;0:138;19027:41:0;;;;;;;;;19020:48;;18954:120;:::o;14125:21::-;;;;;;;;;;;;;:::o;25108:82::-;1638:9;:7;:9::i;:::-;1630:54;;;;;;;;;;;;;;;;;;;;;;25165:19;25177:6;25165:11;:19::i;:::-;25108:82;:::o;24719:105::-;1638:9;:7;:9::i;:::-;1630:54;;;;;;;;;;;;;;;;;;;;;;24789:29;24810:7;24789:20;:29::i;:::-;24719:105;:::o;2632:110::-;2689:7;2716:9;:18;2726:7;2716:18;;;;;;;;;;;;;;;;2709:25;;2632:110;;;:::o;24225:217::-;24278:4;24298:138;24426:9;:7;:9::i;:::-;24298:115;24399:13;:11;:13::i;:::-;24298:88;24372:13;:11;:13::i;:::-;24298:61;24335:23;:21;:23::i;:::-;24298:24;:22;:24::i;:::-;:36;;:61;;;;:::i;:::-;:73;;:88;;;;:::i;:::-;:100;;:115;;;;:::i;:::-;:127;;:138;;;;:::i;:::-;24291:145;;24225:217;:::o;1810:140::-;1638:9;:7;:9::i;:::-;1630:54;;;;;;;;;;;;;;;;;;;;;;1909:1;1872:40;;1893:6;;;;;;;;;;;1872:40;;;;;;;;;;;;1940:1;1923:6;;:19;;;;;;;;;;;;;;;;;;1810:140::o;24448:154::-;24501:4;24514:10;24527:22;:20;:22::i;:::-;24514:35;;24563:33;24583:12;;24563:15;24573:4;24563:5;:9;;:15;;;;:::i;:::-;:19;;:33;;;;:::i;:::-;24556:40;;;24448:154;:::o;20022:571::-;20057:18;20078:11;:9;:11::i;:::-;20057:32;;20117:8;;;;;;;;;;;20102:23;;;;;;;;:11;:23;;;;;;;;;20098:60;;20136:14;:12;:14::i;:::-;20098:60;20182:1;20170:9;:7;:9::i;:::-;:13;20166:391;;;20213:11;20198:26;;;;;;;;:11;:26;;;;;;;;;20194:356;;;20237:22;20249:9;:7;:9::i;:::-;20237:11;:22::i;:::-;20194:356;;;20405:15;20390:30;;;;;;;;:11;:30;;;;;;;;;20386:164;;;20433:26;20449:9;:7;:9::i;:::-;20433:15;:26::i;:::-;20386:164;;;20494:11;20479:26;;;;;;;;:11;:26;;;;;;;;;20475:75;;;20518:22;20530:9;:7;:9::i;:::-;20518:11;:22::i;:::-;20475:75;20386:164;20194:356;20166:391;20576:11;20565:8;;:22;;;;;;;;;;;;;;;;;;;;;;;;20022:571;:::o;25194:90::-;1638:9;:7;:9::i;:::-;1630:54;;;;;;;;;;;;;;;;;;;;;;25256:22;25271:6;25256:14;:22::i;:::-;25194:90;:::o;15357:89::-;1638:9;:7;:9::i;:::-;1630:54;;;;;;;;;;;;;;;;;;;;;;15431:9;15424:4;;:16;;;;;;;;;;;;;;;;;;15357:89;:::o;13971:19::-;;;;;;;;;;;;;:::o;1513:79::-;1551:7;1578:6;;;;;;;;;;;1571:13;;1513:79;:::o;14052:19::-;;;;;;;;;;;;;:::o;1710:94::-;1750:4;1790:6;;;;;;;;;;;1774:22;;:12;:10;:12::i;:::-;:22;;;1767:29;;1710:94;:::o;19330:119::-;19386:7;19418:5;;;;;;;;;;;19411:23;;;19435:7;;;;;;;;;;;19411:32;;;;;;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;19411:32:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;19411:32:0;;;;;;;101:4:-1;97:9;90:4;84;80:15;76:31;69:5;65:43;126:6;120:4;113:20;0:138;19411:32:0;;;;;;;;;19404:39;;19330:119;:::o;6121:87::-;6160:13;6193:7;6186:14;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;6121:87;:::o;18297:253::-;18337:45;18363:8;;;;;;;;;;;18378:2;18344:5;;;;;;;;;;;18337:25;;;;:45;;;;;:::i;:::-;18391:41;18417:4;;;;;;;;;;;18428:2;18398:5;;;;;;;;;;;18391:25;;;;:41;;;;;:::i;:::-;18441:50;18467:13;:11;:13::i;:::-;18487:2;18448:5;;;;;;;;;;;18441:25;;;;:50;;;;;:::i;:::-;18500:44;18526:7;;;;;;;;;;;18540:2;18507:5;;;;;;;;;;;18500:25;;;;:44;;;;;:::i;:::-;18297:253::o;15256:97::-;1638:9;:7;:9::i;:::-;1630:54;;;;;;;;;;;;;;;;;;;;;;15336:11;15327:6;:20;;;;15256:97;:::o;13995:23::-;;;;;;;;;;;;;:::o;17310:723::-;17352:6;17369:12;17383;17396;17426:3;;;;;;;;;;;17412:28;;;17441:5;;;;;;;;;;;17412:35;;;;;;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;17412:35:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;17412:35:0;;;;;;39:16:-1;36:1;17:17;2:54;17412:35:0;101:4:-1;97:9;90:4;84;80:15;76:31;69:5;65:43;126:6;120:4;113:20;0:138;17412:35:0;;;;;;;;;17367:80;;;;;;;;17454:11;17468:1;17454:15;;17487:3;17480:4;:10;17476:43;;;17507:4;17501:10;;17476:43;17594:3;17587:4;:10;17583:43;;;17614:4;17608:10;;17583:43;17643:3;17636:4;:10;17632:43;;;17663:4;17657:10;;17632:43;17683:18;17704:11;17683:32;;17733:4;17726:3;:11;17722:281;;;17762:15;17748:29;;17722:281;;;17890:4;17883:3;:11;17879:124;;;17919:11;17905:25;;17879:124;;;17955:4;17948:3;:11;17944:59;;;17984:11;17970:25;;17944:59;17879:124;17722:281;18016:11;18009:18;;;;;;;17310:723;:::o;3736:261::-;3821:4;3838:129;3847:12;:10;:12::i;:::-;3861:7;3870:96;3909:15;3870:96;;;;;;;;;;;;;;;;;:11;:25;3882:12;:10;:12::i;:::-;3870:25;;;;;;;;;;;;;;;:34;3896:7;3870:34;;;;;;;;;;;;;;;;:38;;:96;;;;;:::i;:::-;3838:8;:129::i;:::-;3985:4;3978:11;;3736:261;;;;:::o;19078:248::-;19133:7;19182:9;19194:17;:15;:17::i;:::-;19182:29;;19226:1;19222;:5;19218:88;;;19242:56;19293:4;19242:46;19257:8;;;;;;;;;;;19248:37;;;:39;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;19248:39:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;19248:39:0;;;;;;;101:4:-1;97:9;90:4;84;80:15;76:31;69:5;65:43;126:6;120:4;113:20;0:138;19248:39:0;;;;;;;;;19242:1;:5;;:46;;;;:::i;:::-;:50;;:56;;;;:::i;:::-;19238:60;;19218:88;19319:1;19312:8;;;19078:248;:::o;2748:158::-;2817:4;2834:42;2844:12;:10;:12::i;:::-;2858:9;2869:6;2834:9;:42::i;:::-;2894:4;2887:11;;2748:158;;;;:::o;15550:100::-;1638:9;:7;:9::i;:::-;1630:54;;;;;;;;;;;;;;;;;;;;;;15633:11;15621:9;;:23;;;;;;;;;;;;;;;;;;15550:100;:::o;19780:117::-;19833:7;19865:5;;;;;;;;;;;19858:23;;;19882:8;;;;;;;;;;;19858:33;;;;;;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;19858:33:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;19858:33:0;;;;;;;101:4:-1;97:9;90:4;84;80:15;76:31;69:5;65:43;126:6;120:4;113:20;0:138;19858:33:0;;;;;;;;;19851:40;;19780:117;:::o;24608:107::-;1638:9;:7;:9::i;:::-;1630:54;;;;;;;;;;;;;;;;;;;;;;24679:30;24701:7;24679:21;:30::i;:::-;24608:107;:::o;18556:::-;18596:7;18626:5;;;;;;;;;;;18619:23;;;18651:4;18619:38;;;;;;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;18619:38:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;18619:38:0;;;;;;;101:4:-1;97:9;90:4;84;80:15;76:31;69:5;65:43;126:6;120:4;113:20;0:138;18619:38:0;;;;;;;;;18612:45;;18556:107;:::o;15787:548::-;6494:1;6477:13;;:18;;;;;;;;;;;6506:20;6529:13;;6506:36;;15887:1;15877:7;:11;15869:54;;;;;;;;;;;;;;;;;;;;;;15939:22;:20;:22::i;:::-;15932:4;:29;;;;15972:66;16003:10;16023:4;16030:7;15979:5;;;;;;;;;;;15972:30;;;;:66;;;;;;:::i;:::-;16081:14;16098:1;16081:18;;16120:1;16112:4;;:9;16108:150;;;16143:7;16134:16;;16168:7;16161:4;:14;;;;16108:150;;;16211:37;16243:4;;16212:25;16224:12;;16212:7;:11;;:25;;;;:::i;:::-;16211:31;;:37;;;;:::i;:::-;16202:46;;16108:150;16273:22;:20;:22::i;:::-;16266:4;:29;;;;16304:25;16310:10;16322:6;16304:5;:25::i;:::-;6553:1;6589:13;;6573:12;:29;6565:73;;;;;;;;;;;;;;;;;;;;;;15787:548;;:::o;15042:101::-;1638:9;:7;:9::i;:::-;1630:54;;;;;;;;;;;;;;;;;;;;;;15125:12;15115:7;;:22;;;;;;;;;;;;;;;;;;15042:101;:::o;19901:115::-;19945:7;19975:9;;;;;;;;;;;19968:27;;;20004:4;19968:42;;;;;;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;19968:42:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;19968:42:0;;;;;;;101:4:-1;97:9;90:4;84;80:15;76:31;69:5;65:43;126:6;120:4;113:20;0:138;19968:42:0;;;;;;;;;19961:49;;19901:115;:::o;18667:113::-;18720:7;18752:5;;;;;;;;;;;18745:23;;;18769:4;;;;;;;;;;;18745:29;;;;;;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;18745:29:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;18745:29:0;;;;;;;101:4:-1;97:9;90:4;84;80:15;76:31;69:5;65:43;126:6;120:4;113:20;0:138;18745:29:0;;;;;;;;;18738:36;;18667:113;:::o;14076:21::-;;;;:::o;2912:134::-;2984:7;3011:11;:18;3023:5;3011:18;;;;;;;;;;;;;;;:27;3030:7;3011:27;;;;;;;;;;;;;;;;3004:34;;2912:134;;;;:::o;25288:92::-;1638:9;:7;:9::i;:::-;1630:54;;;;;;;;;;;;;;;;;;;;;;25351:23;25367:6;25351:15;:23::i;:::-;25288:92;:::o;1956:109::-;1638:9;:7;:9::i;:::-;1630:54;;;;;;;;;;;;;;;;;;;;;;2029:28;2048:8;2029:18;:28::i;:::-;1956:109;:::o;19453:203::-;19507:7;19523:9;19535:16;:14;:16::i;:::-;19523:28;;19566:1;19562;:5;19558:78;;;19590:7;;;;;;;;;;;19582:31;;;19622:4;19582:46;;;;;;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;19582:46:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;19582:46:0;;;;;;;101:4:-1;97:9;90:4;84;80:15;76:31;69:5;65:43;126:6;120:4;113:20;0:138;19582:46:0;;;;;;;;;19578:50;;19558:78;19649:1;19642:8;;;19453:203;:::o;15147:105::-;1638:9;:7;:9::i;:::-;1630:54;;;;;;;;;;;;;;;;;;;;;;15233:13;15222:8;;:24;;;;;;;;;;;;;;;;;;15147:105;:::o;13916:23::-;;;;;;;;;;;;;:::o;18039:120::-;18079:7;18131:4;;;;;;;;;;;18102:49;;;:51;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;18102:51:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;18102:51:0;;;;;;;101:4:-1;97:9;90:4;84;80:15;76:31;69:5;65:43;126:6;120:4;113:20;0:138;18102:51:0;;;;;;;;;18095:58;;18039:120;:::o;18163:128::-;18207:7;18259:4;;;;;;;;;;;18230:53;;;:55;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;18230:55:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;18230:55:0;;;;;;;101:4:-1;97:9;90:4;84;80:15;76:31;69:5;65:43;126:6;120:4;113:20;0:138;18230:55:0;;;;;;;;;18223:62;;18163:128;:::o;13891:20::-;;;;;;;;;;;;;:::o;22284:568::-;22339:19;22372:1;22361:13;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;22339:35;;22394:22;;;;;;;;22407:4;22394:22;;;;;;22414:1;22394:22;;;22383:5;22389:1;22383:8;;;;;;;;;;;;;:33;;;;22427:22;;:::i;:::-;22452:70;;;;;;;;22464:4;22452:70;;;;;;22470:21;22452:70;;;;;;;;;;;;22493:20;22452:70;;;;;;;;;;;;22515:6;22452:70;;;22427:95;;22531:21;;:::i;:::-;22578:18;22561:3;:14;;:35;;;;;;;;;;;;;;;;;;;;;;;22621:1;22605:3;:13;;:17;;;;;22644:3;22631;:10;;:16;;;;22678:6;;22656:3;:19;;:28;;;;;22720:4;22693:3;:16;;:32;;;;;;;;;;;22736:24;22780:1;22763:19;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;22736:46;;22801:3;22791:4;22796:1;22791:7;;;;;;;;;;;;;:13;;;;22820:4;;;;;;;;;;;22815:18;;;22834:5;22841:4;22815:31;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;22815:31:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;22815:31:0;;;;22284:568;;;;;:::o;893:98::-;938:15;973:10;966:17;;893:98;:::o;5148:338::-;5259:1;5242:19;;:5;:19;;;;5234:68;;;;;;;;;;;;;;;;;;;;;;5340:1;5321:21;;:7;:21;;;;5313:68;;;;;;;;;;;;;;;;;;;;;;5424:6;5394:11;:18;5406:5;5394:18;;;;;;;;;;;;;;;:27;5413:7;5394:27;;;;;;;;;;;;;;;:36;;;;5462:7;5446:32;;5455:5;5446:32;;;5471:6;5446:32;;;;;;;;;;;;;;;5148:338;;;:::o;4003:471::-;4119:1;4101:20;;:6;:20;;;;4093:70;;;;;;;;;;;;;;;;;;;;;;4203:1;4182:23;;:9;:23;;;;4174:71;;;;;;;;;;;;;;;;;;;;;;4278;4300:6;4278:71;;;;;;;;;;;;;;;;;:9;:17;4288:6;4278:17;;;;;;;;;;;;;;;;:21;;:71;;;;;:::i;:::-;4258:9;:17;4268:6;4258:17;;;;;;;;;;;;;;;:91;;;;4383:32;4408:6;4383:9;:20;4393:9;4383:20;;;;;;;;;;;;;;;;:24;;:32;;;;:::i;:::-;4360:9;:20;4370:9;4360:20;;;;;;;;;;;;;;;:55;;;;4448:9;4431:35;;4440:6;4431:35;;;4459:6;4431:35;;;;;;;;;;;;;;;4003:471;;;:::o;7006:192::-;7092:7;7125:1;7120;:6;;7128:12;7112:29;;;;;;;;;;;;;;;;;;;;;;;;;7152:9;7168:1;7164;:5;7152:17;;7189:1;7182:8;;;7006:192;;;;;:::o;7204:250::-;7262:7;7291:1;7286;:6;7282:47;;;7316:1;7309:8;;;;7282:47;7341:9;7357:1;7353;:5;7341:17;;7386:1;7381;7377;:5;;;;;;:10;7369:56;;;;;;;;;;;;;;;;;;;;;;7445:1;7438:8;;;7204:250;;;;;:::o;7460:132::-;7518:7;7545:39;7549:1;7552;7545:39;;;;;;;;;;;;;;;;;:3;:39::i;:::-;7538:46;;7460:132;;;;:::o;6864:136::-;6922:7;6949:43;6953:1;6956;6949:43;;;;;;;;;;;;;;;;;:3;:43::i;:::-;6942:50;;6864:136;;;;:::o;21777:501::-;21849:15;21837:27;;;;;;;;:8;;;;;;;;;;;:27;;;;;;;;;21833:80;;;21875:30;21897:7;21875:21;:30::i;:::-;21833:80;21935:11;21923:23;;;;;;;;:8;;;;;;;;;;;:23;;;;;;;;;21919:132;;;21982:7;21965:13;:11;:13::i;:::-;:24;;21957:55;;;;;;;;;;;;;;;;;;;;;;22021:22;22035:7;22021:13;:22::i;:::-;21919:132;22073:11;22061:23;;;;;;;;:8;;;;;;;;;;;:23;;;;;;;;;22057:132;;;22120:7;22103:13;:11;:13::i;:::-;:24;;22095:55;;;;;;;;;;;;;;;;;;;;;;22159:22;22173:7;22159:13;:22::i;:::-;22057:132;22211:14;22199:26;;;;;;;;:8;;;;;;;;;;;:26;;;;;;;;;22195:78;;;22236:29;22257:7;22236:20;:29::i;:::-;22195:78;21777:501;:::o;9177:176::-;9260:85;9279:5;9309;:14;;;:23;;;;9334:2;9338:5;9286:58;;;;;;;;;;;;;49:4:-1;39:7;30;26:21;22:32;13:7;6:49;9286:58:0;;;;;;;38:4:-1;29:7;25:18;67:10;61:17;96:58;199:8;192:4;186;182:15;179:29;167:10;160:49;0:215;;;9286:58:0;9260:18;:85::i;:::-;9177:176;;;:::o;6677:181::-;6735:7;6755:9;6771:1;6767;:5;6755:17;;6796:1;6791;:6;;6783:46;;;;;;;;;;;;;;;;;;;;;;6849:1;6842:8;;;6677:181;;;;:::o;23647:572::-;23704:19;23737:1;23726:13;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;23704:35;;23759:22;;;;;;;;23772:4;23759:22;;;;;;23779:1;23759:22;;;23748:5;23754:1;23748:8;;;;;;;;;;;;;:33;;;;23792:22;;:::i;:::-;23817:71;;;;;;;;23829:5;23817:71;;;;;;23836:21;23817:71;;;;;;;;;;;;23859:20;23817:71;;;;;;;;;;;;23881:6;23817:71;;;23792:96;;23897:21;;:::i;:::-;23944:19;23927:3;:14;;:36;;;;;;;;;;;;;;;;;;;;;;;23988:1;23972:3;:13;;:17;;;;;24011:3;23998;:10;;:16;;;;24045:6;;24023:3;:19;;:28;;;;;24087:4;24060:3;:16;;:32;;;;;;;;;;;24103:24;24147:1;24130:19;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;24103:46;;24168:3;24158:4;24163:1;24158:7;;;;;;;;;;;;;:13;;;;24187:4;;;;;;;;;;;24182:18;;;24201:5;24208:4;24182:31;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;24182:31:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;24182:31:0;;;;23647:572;;;;;:::o;23253:92::-;23314:9;;;;;;;;;;;23307:24;;;23332:6;23307:32;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;23307:32:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;23307:32:0;;;;23253:92;:::o;22858:105::-;22915:9;:7;:9::i;:::-;22910:23;;;22934:5;;;;;;;;;;;22941:6;22949:7;;;;;;;;;;;22910:47;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;22910:47:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;22910:47:0;;;;22858:105;:::o;21447:324::-;21510:9;21522:16;:14;:16::i;:::-;21510:28;;21545:10;21558:23;:21;:23::i;:::-;21545:36;;21602:7;21596:2;:13;;21588:44;;;;;;;;;;;;;;;;;;;;;;21686:14;21703:31;21732:1;21703:24;21724:2;21704:14;21710:7;21704:1;:5;;:14;;;;:::i;:::-;21703:20;;:24;;;;:::i;:::-;:28;;:31;;;;:::i;:::-;21686:48;;21741:24;21758:6;21741:16;:24::i;:::-;21447:324;;;;:::o;20599:508::-;20639:14;20656:17;:15;:17::i;:::-;20639:34;;20693:1;20684:6;:10;20680:87;;;20705:54;20727:31;20756:1;20727:24;:22;:24::i;:::-;:28;;:31;;;;:::i;:::-;20705:21;:54::i;:::-;20680:87;20782:13;:11;:13::i;:::-;20773:22;;20815:1;20806:6;:10;20802:70;;;20827:37;20841:22;:20;:22::i;:::-;20827:13;:37::i;:::-;20802:70;20887:16;:14;:16::i;:::-;20878:25;;20923:1;20914:6;:10;20910:87;;;20935:54;20956:32;20986:1;20956:25;:23;:25::i;:::-;:29;;:32;;;;:::i;:::-;20935:20;:54::i;:::-;20910:87;21012:13;:11;:13::i;:::-;21003:22;;21045:1;21036:6;:10;21032:70;;;21057:37;21071:22;:20;:22::i;:::-;21057:13;:37::i;:::-;21032:70;20599:508;:::o;23115:134::-;23214:1;23188:8;;;;;;;;;;;23179:23;;;23203:6;23179:31;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;23179:31:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;23179:31:0;;;;;;;101:4:-1;97:9;90:4;84;80:15;76:31;69:5;65:43;126:6;120:4;113:20;0:138;23179:31:0;;;;;;;;;:36;23171:72;;;;;;;;;;;;;;;;;;;;;;23115:134;:::o;22967:144::-;23077:1;23038:7;;;;;;;;;;;23030:21;;;23060:4;23067:6;23030:44;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;23030:44:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;23030:44:0;;;;;;;101:4:-1;97:9;90:4;84;80:15;76:31;69:5;65:43;126:6;120:4;113:20;0:138;23030:44:0;;;;;;;;;:48;23022:83;;;;;;;;;;;;;;;;;;;;;;22967:144;:::o;9573:347::-;9678:1;9669:5;:10;9668:62;;;;9728:1;9685:5;:15;;;9709:4;9716:7;9685:39;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;9685:39:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;9685:39:0;;;;;;;101:4:-1;97:9;90:4;84;80:15;76:31;69:5;65:43;126:6;120:4;113:20;0:138;9685:39:0;;;;;;;;;:44;9668:62;9660:152;;;;;;;;;;;;;;;;;;;;;;9823:89;9842:5;9872;:13;;;:22;;;;9896:7;9905:5;9849:62;;;;;;;;;;;;;49:4:-1;39:7;30;26:21;22:32;13:7;6:49;9849:62:0;;;;;;;38:4:-1;29:7;25:18;67:10;61:17;96:58;199:8;192:4;186;182:15;179:29;167:10;160:49;0:215;;;9849:62:0;9823:18;:89::i;:::-;9573:347;;;:::o;21113:328::-;21177:9;21189:17;:15;:17::i;:::-;21177:29;;21213:10;21226:24;:22;:24::i;:::-;21213:37;;21271:7;21265:2;:13;;21257:44;;;;;;;;;;;;;;;;;;;;;;21355:14;21372:31;21401:1;21372:24;21393:2;21373:14;21379:7;21373:1;:5;;:14;;;;:::i;:::-;21372:20;;:24;;;;:::i;:::-;:28;;:31;;;;:::i;:::-;21355:48;;21410:25;21428:6;21410:17;:25::i;:::-;21113:328;;;;:::o;9361:204::-;9462:95;9481:5;9511;:18;;;:27;;;;9540:4;9546:2;9550:5;9488:68;;;;;;;;;;;;;;49:4:-1;39:7;30;26:21;22:32;13:7;6:49;9488:68:0;;;;;;;38:4:-1;29:7;25:18;67:10;61:17;96:58;199:8;192:4;186;182:15;179:29;167:10;160:49;0:215;;;9488:68:0;9462:18;:95::i;:::-;9361:204;;;;:::o;4480:308::-;4575:1;4556:21;;:7;:21;;;;4548:65;;;;;;;;;;;;;;;;;;;;;;4641:24;4658:6;4641:12;;:16;;:24;;;;:::i;:::-;4626:12;:39;;;;4697:30;4720:6;4697:9;:18;4707:7;4697:18;;;;;;;;;;;;;;;;:22;;:30;;;;:::i;:::-;4676:9;:18;4686:7;4676:18;;;;;;;;;;;;;;;:51;;;;4764:7;4743:37;;4760:1;4743:37;;;4773:6;4743:37;;;;;;;;;;;;;;;4480:308;;:::o;2071:229::-;2165:1;2145:22;;:8;:22;;;;2137:73;;;;;;;;;;;;;;;;;;;;;;2255:8;2226:38;;2247:6;;;;;;;;;;;2226:38;;;;;;;;;;;;2284:8;2275:6;;:17;;;;;;;;;;;;;;;;;;2071:229;:::o;7598:258::-;7684:7;7783:1;7779;:5;7786:12;7771:28;;;;;;;;;;;;;;;;;;;;;;;;;7810:9;7826:1;7822;:5;;;;;;7810:17;;7847:1;7840:8;;;7598:258;;;;;:::o;10557:598::-;10645:27;10653:5;10645:25;;;:27::i;:::-;10637:71;;;;;;;;;;;;;;;;;;;;;;10782:12;10796:23;10831:5;10823:19;;10843:4;10823:25;;;;;;;;;;;;;;;;;;;;;;;14:1:-1;21;16:31;;;;75:4;69:11;64:16;;144:4;140:9;133:4;115:16;111:27;107:43;104:1;100:51;94:4;87:65;169:16;166:1;159:27;225:16;222:1;215:4;212:1;208:12;193:49;7:242;;16:31;36:4;31:9;;7:242;;10781:67:0;;;;10867:7;10859:52;;;;;;;;;;;;;;;;;;;;;;10948:1;10928:10;:17;:21;10924:224;;;11070:10;11059:30;;;;;;;;;;;;;;11051:85;;;;;;;;;;;;;;;;;;;;;;10924:224;10557:598;;;;:::o;23349:148::-;23461:1;23422:7;;;;;;;;;;;23414:21;;;23444:4;23451:6;23414:44;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;23414:44:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;23414:44:0;;;;;;;101:4:-1;97:9;90:4;84;80:15;76:31;69:5;65:43;126:6;120:4;113:20;0:138;23414:44:0;;;;;;;;;:48;23406:85;;;;;;;;;;;;;;;;;;;;;;23349:148;:::o;23501:140::-;23604:1;23576:8;;;;;;;;;;;23567:25;;;23593:6;23567:33;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;23567:33:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;23567:33:0;;;;;;;101:4:-1;97:9;90:4;84;80:15;76:31;69:5;65:43;126:6;120:4;113:20;0:138;23567:33:0;;;;;;;;;:38;23559:76;;;;;;;;;;;;;;;;;;;;;;23501:140;:::o;8194:374::-;8254:4;8271:16;8298:19;8320:66;8298:88;;;;8489:7;8477:20;8465:32;;8529:3;8517:15;;:8;:15;;:42;;;;;8548:11;8536:8;:23;;8517:42;8509:51;;;;8194:374;;;:::o;13693:11690::-;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;5:130:-1:-;;85:6;72:20;63:29;;97:33;124:5;97:33;;;57:78;;;;;142:134;;226:6;220:13;211:22;;238:33;265:5;238:33;;;205:71;;;;;283:128;;364:6;358:13;349:22;;376:30;400:5;376:30;;;343:68;;;;;419:444;;532:3;525:4;517:6;513:17;509:27;499:2;;550:1;547;540:12;499:2;580:6;574:13;602:65;617:49;659:6;617:49;;;602:65;;;593:74;;687:6;680:5;673:21;723:4;715:6;711:17;756:4;749:5;745:16;791:3;782:6;777:3;773:16;770:25;767:2;;;808:1;805;798:12;767:2;818:39;850:6;845:3;840;818:39;;;492:371;;;;;;;;896:493;;1017:4;1005:9;1000:3;996:19;992:30;989:2;;;1035:1;1032;1025:12;989:2;1053:20;1068:4;1053:20;;;1044:29;;1123:1;1154:57;1207:3;1198:6;1187:9;1183:22;1154:57;;;1148:3;1141:5;1137:15;1130:82;1083:140;1274:2;1307:60;1363:3;1354:6;1343:9;1339:22;1307:60;;;1300:4;1293:5;1289:16;1282:86;1233:146;983:406;;;;;1396:128;;1475:6;1462:20;1453:29;;1487:32;1513:5;1487:32;;;1447:77;;;;;1531:130;;1611:6;1598:20;1589:29;;1623:33;1650:5;1623:33;;;1583:78;;;;;1668:134;;1752:6;1746:13;1737:22;;1764:33;1791:5;1764:33;;;1731:71;;;;;1809:241;;1913:2;1901:9;1892:7;1888:23;1884:32;1881:2;;;1929:1;1926;1919:12;1881:2;1964:1;1981:53;2026:7;2017:6;2006:9;2002:22;1981:53;;;1971:63;;1943:97;1875:175;;;;;2057:263;;2172:2;2160:9;2151:7;2147:23;2143:32;2140:2;;;2188:1;2185;2178:12;2140:2;2223:1;2240:64;2296:7;2287:6;2276:9;2272:22;2240:64;;;2230:74;;2202:108;2134:186;;;;;2327:366;;;2448:2;2436:9;2427:7;2423:23;2419:32;2416:2;;;2464:1;2461;2454:12;2416:2;2499:1;2516:53;2561:7;2552:6;2541:9;2537:22;2516:53;;;2506:63;;2478:97;2606:2;2624:53;2669:7;2660:6;2649:9;2645:22;2624:53;;;2614:63;;2585:98;2410:283;;;;;;2700:491;;;;2838:2;2826:9;2817:7;2813:23;2809:32;2806:2;;;2854:1;2851;2844:12;2806:2;2889:1;2906:53;2951:7;2942:6;2931:9;2927:22;2906:53;;;2896:63;;2868:97;2996:2;3014:53;3059:7;3050:6;3039:9;3035:22;3014:53;;;3004:63;;2975:98;3104:2;3122:53;3167:7;3158:6;3147:9;3143:22;3122:53;;;3112:63;;3083:98;2800:391;;;;;;3198:366;;;3319:2;3307:9;3298:7;3294:23;3290:32;3287:2;;;3335:1;3332;3325:12;3287:2;3370:1;3387:53;3432:7;3423:6;3412:9;3408:22;3387:53;;;3377:63;;3349:97;3477:2;3495:53;3540:7;3531:6;3520:9;3516:22;3495:53;;;3485:63;;3456:98;3281:283;;;;;;3571:257;;3683:2;3671:9;3662:7;3658:23;3654:32;3651:2;;;3699:1;3696;3689:12;3651:2;3734:1;3751:61;3804:7;3795:6;3784:9;3780:22;3751:61;;;3741:71;;3713:105;3645:183;;;;;3835:908;;;;;;4028:3;4016:9;4007:7;4003:23;3999:33;3996:2;;;4045:1;4042;4035:12;3996:2;4101:1;4090:9;4086:17;4080:24;4124:18;4116:6;4113:30;4110:2;;;4156:1;4153;4146:12;4110:2;4176:74;4242:7;4233:6;4222:9;4218:22;4176:74;;;4166:84;;4059:197;4287:2;4305:64;4361:7;4352:6;4341:9;4337:22;4305:64;;;4295:74;;4266:109;4406:2;4424:64;4480:7;4471:6;4460:9;4456:22;4424:64;;;4414:74;;4385:109;4525:2;4543:64;4599:7;4590:6;4579:9;4575:22;4543:64;;;4533:74;;4504:109;4644:3;4663:64;4719:7;4710:6;4699:9;4695:22;4663:64;;;4653:74;;4623:110;3990:753;;;;;;;;;4750:305;;4886:2;4874:9;4865:7;4861:23;4857:32;4854:2;;;4902:1;4899;4892:12;4854:2;4937:1;4954:85;5031:7;5022:6;5011:9;5007:22;4954:85;;;4944:95;;4916:129;4848:207;;;;;5062:239;;5165:2;5153:9;5144:7;5140:23;5136:32;5133:2;;;5181:1;5178;5171:12;5133:2;5216:1;5233:52;5277:7;5268:6;5257:9;5253:22;5233:52;;;5223:62;;5195:96;5127:174;;;;;5308:241;;5412:2;5400:9;5391:7;5387:23;5383:32;5380:2;;;5428:1;5425;5418:12;5380:2;5463:1;5480:53;5525:7;5516:6;5505:9;5501:22;5480:53;;;5470:63;;5442:97;5374:175;;;;;5556:263;;5671:2;5659:9;5650:7;5646:23;5642:32;5639:2;;;5687:1;5684;5677:12;5639:2;5722:1;5739:64;5795:7;5786:6;5775:9;5771:22;5739:64;;;5729:74;;5701:108;5633:186;;;;;5827:253;;5976:98;6070:3;6062:6;5976:98;;;5962:112;;5955:125;;;;;6089:249;;6212:86;6294:3;6286:6;6212:86;;;6327:4;6322:3;6318:14;6304:28;;6205:133;;;;;6346:103;6419:24;6437:5;6419:24;;;6414:3;6407:37;6401:48;;;6456:113;6539:24;6557:5;6539:24;;;6534:3;6527:37;6521:48;;;6643:1040;;6836:78;6908:5;6836:78;;;6927:110;7030:6;7025:3;6927:110;;;6920:117;;7060:3;7102:4;7094:6;7090:17;7085:3;7081:27;7129:80;7203:5;7129:80;;;7229:7;7257:1;7242:402;7267:6;7264:1;7261:13;7242:402;;;7329:9;7323:4;7319:20;7314:3;7307:33;7374:6;7368:13;7396:112;7503:4;7488:13;7396:112;;;7388:120;;7525:84;7602:6;7525:84;;;7515:94;;7632:4;7627:3;7623:14;7616:21;;7299:345;7289:1;7286;7282:9;7277:14;;7242:402;;;7246:14;7657:4;7650:11;;7674:3;7667:10;;6815:868;;;;;;;;;;7746:834;;7927:72;7993:5;7927:72;;;8012:104;8109:6;8104:3;8012:104;;;8005:111;;8137:74;8205:5;8137:74;;;8231:7;8259:1;8244:314;8269:6;8266:1;8263:13;8244:314;;;8336:6;8330:13;8357:99;8452:3;8437:13;8357:99;;;8350:106;;8473:78;8544:6;8473:78;;;8463:88;;8301:257;8291:1;8288;8284:9;8279:14;;8244:314;;;8248:14;8571:3;8564:10;;7906:674;;;;;;;;8588:94;8655:21;8670:5;8655:21;;;8650:3;8643:34;8637:45;;;8689:104;8766:21;8781:5;8766:21;;;8761:3;8754:34;8748:45;;;8800:356;;8928:38;8960:5;8928:38;;;8978:88;9059:6;9054:3;8978:88;;;8971:95;;9071:52;9116:6;9111:3;9104:4;9097:5;9093:16;9071:52;;;9144:6;9139:3;9135:16;9128:23;;8908:248;;;;;;9163:315;;9259:34;9287:5;9259:34;;;9305:60;9358:6;9353:3;9305:60;;;9298:67;;9370:52;9415:6;9410:3;9403:4;9396:5;9392:16;9370:52;;;9443:29;9465:6;9443:29;;;9438:3;9434:39;9427:46;;9239:239;;;;;;9485:142;9571:50;9615:5;9571:50;;;9566:3;9559:63;9553:74;;;9634:156;9727:57;9778:5;9727:57;;;9722:3;9715:70;9709:81;;;9797:150;9887:54;9935:5;9887:54;;;9882:3;9875:67;9869:78;;;9954:144;10046:46;10086:5;10046:46;;;10041:3;10034:59;10028:70;;;10105:347;;10217:39;10250:5;10217:39;;;10268:71;10332:6;10327:3;10268:71;;;10261:78;;10344:52;10389:6;10384:3;10377:4;10370:5;10366:16;10344:52;;;10417:29;10439:6;10417:29;;;10412:3;10408:39;10401:46;;10197:255;;;;;;10460:465;;10620:67;10684:2;10679:3;10620:67;;;10613:74;;10720:66;10716:1;10711:3;10707:11;10700:87;10821:66;10816:2;10811:3;10807:12;10800:88;10916:2;10911:3;10907:12;10900:19;;10606:319;;;;10934:364;;11094:67;11158:2;11153:3;11094:67;;;11087:74;;11194:66;11190:1;11185:3;11181:11;11174:87;11289:2;11284:3;11280:12;11273:19;;11080:218;;;;11307:465;;11467:67;11531:2;11526:3;11467:67;;;11460:74;;11567:66;11563:1;11558:3;11554:11;11547:87;11668:66;11663:2;11658:3;11654:12;11647:88;11763:2;11758:3;11754:12;11747:19;;11453:319;;;;11781:465;;11941:67;12005:2;12000:3;11941:67;;;11934:74;;12041:66;12037:1;12032:3;12028:11;12021:87;12142:66;12137:2;12132:3;12128:12;12121:88;12237:2;12232:3;12228:12;12221:19;;11927:319;;;;12255:364;;12415:67;12479:2;12474:3;12415:67;;;12408:74;;12515:66;12511:1;12506:3;12502:11;12495:87;12610:2;12605:3;12601:12;12594:19;;12401:218;;;;12628:364;;12788:67;12852:2;12847:3;12788:67;;;12781:74;;12888:66;12884:1;12879:3;12875:11;12868:87;12983:2;12978:3;12974:12;12967:19;;12774:218;;;;13001:364;;13161:67;13225:2;13220:3;13161:67;;;13154:74;;13261:66;13257:1;13252:3;13248:11;13241:87;13356:2;13351:3;13347:12;13340:19;;13147:218;;;;13374:465;;13534:67;13598:2;13593:3;13534:67;;;13527:74;;13634:66;13630:1;13625:3;13621:11;13614:87;13735:66;13730:2;13725:3;13721:12;13714:88;13830:2;13825:3;13821:12;13814:19;;13520:319;;;;13848:364;;14008:67;14072:2;14067:3;14008:67;;;14001:74;;14108:66;14104:1;14099:3;14095:11;14088:87;14203:2;14198:3;14194:12;14187:19;;13994:218;;;;14221:364;;14381:67;14445:2;14440:3;14381:67;;;14374:74;;14481:66;14477:1;14472:3;14468:11;14461:87;14576:2;14571:3;14567:12;14560:19;;14367:218;;;;14594:364;;14754:67;14818:2;14813:3;14754:67;;;14747:74;;14854:66;14850:1;14845:3;14841:11;14834:87;14949:2;14944:3;14940:12;14933:19;;14740:218;;;;14967:364;;15127:67;15191:2;15186:3;15127:67;;;15120:74;;15227:66;15223:1;15218:3;15214:11;15207:87;15322:2;15317:3;15313:12;15306:19;;15113:218;;;;15340:465;;15500:67;15564:2;15559:3;15500:67;;;15493:74;;15600:66;15596:1;15591:3;15587:11;15580:87;15701:66;15696:2;15691:3;15687:12;15680:88;15796:2;15791:3;15787:12;15780:19;;15486:319;;;;15814:364;;15974:67;16038:2;16033:3;15974:67;;;15967:74;;16074:66;16070:1;16065:3;16061:11;16054:87;16169:2;16164:3;16160:12;16153:19;;15960:218;;;;16187:465;;16347:67;16411:2;16406:3;16347:67;;;16340:74;;16447:66;16443:1;16438:3;16434:11;16427:87;16548:66;16543:2;16538:3;16534:12;16527:88;16643:2;16638:3;16634:12;16627:19;;16333:319;;;;16661:364;;16821:67;16885:2;16880:3;16821:67;;;16814:74;;16921:66;16917:1;16912:3;16908:11;16901:87;17016:2;17011:3;17007:12;17000:19;;16807:218;;;;17034:364;;17194:67;17258:2;17253:3;17194:67;;;17187:74;;17294:66;17290:1;17285:3;17281:11;17274:87;17389:2;17384:3;17380:12;17373:19;;17180:218;;;;17407:465;;17567:67;17631:2;17626:3;17567:67;;;17560:74;;17667:66;17663:1;17658:3;17654:11;17647:87;17768:66;17763:2;17758:3;17754:12;17747:88;17863:2;17858:3;17854:12;17847:19;;17553:319;;;;17881:364;;18041:67;18105:2;18100:3;18041:67;;;18034:74;;18141:66;18137:1;18132:3;18128:11;18121:87;18236:2;18231:3;18227:12;18220:19;;18027:218;;;;18254:465;;18414:67;18478:2;18473:3;18414:67;;;18407:74;;18514:66;18510:1;18505:3;18501:11;18494:87;18615:66;18610:2;18605:3;18601:12;18594:88;18710:2;18705:3;18701:12;18694:19;;18400:319;;;;18728:364;;18888:67;18952:2;18947:3;18888:67;;;18881:74;;18988:66;18984:1;18979:3;18975:11;18968:87;19083:2;19078:3;19074:12;19067:19;;18874:218;;;;19101:364;;19261:67;19325:2;19320:3;19261:67;;;19254:74;;19361:66;19357:1;19352:3;19348:11;19341:87;19456:2;19451:3;19447:12;19440:19;;19247:218;;;;19534:1605;;19677:5;19672:3;19668:15;19767:3;19760:5;19756:15;19750:22;19778:75;19848:3;19843;19839:13;19825:12;19778:75;;;19698:161;19937:4;19930:5;19926:16;19920:23;19949:63;20006:4;20001:3;19997:14;19983:12;19949:63;;;19869:149;20093:4;20086:5;20082:16;20076:23;20105:117;20216:4;20211:3;20207:14;20193:12;20105:117;;;20028:200;20312:4;20305:5;20301:16;20295:23;20324:63;20381:4;20376:3;20372:14;20358:12;20324:63;;;20238:155;20479:4;20472:5;20468:16;20462:23;20491:63;20548:4;20543:3;20539:14;20525:12;20491:63;;;20403:157;20641:4;20634:5;20630:16;20624:23;20653:64;20710:5;20705:3;20701:15;20687:12;20653:64;;;20570:153;20806:4;20799:5;20795:16;20789:23;20818:64;20875:5;20870:3;20866:15;20852:12;20818:64;;;20733:155;20961:4;20954:5;20950:16;20944:23;21014:3;21008:4;21004:14;20996:5;20991:3;20987:15;20980:39;21034:67;21096:4;21082:12;21034:67;;;21026:75;;20898:215;21130:4;21123:11;;19650:1489;;;;;;21209:815;21346:4;21341:3;21337:14;21429:3;21422:5;21418:15;21412:22;21440:56;21491:3;21486;21482:13;21468:12;21440:56;;;21366:136;21583:4;21576:5;21572:16;21566:23;21595:83;21672:4;21667:3;21663:14;21649:12;21595:83;;;21512:172;21756:4;21749:5;21745:16;21739:23;21768:80;21842:4;21837:3;21833:14;21819:12;21768:80;;;21694:160;21928:4;21921:5;21917:16;21911:23;21940:63;21997:4;21992:3;21988:14;21974:12;21940:63;;;21864:145;21319:705;;;;22080:457;22203:4;22198:3;22194:14;22287:3;22280:5;22276:15;22270:22;22298:62;22355:3;22350;22346:13;22332:12;22298:62;;;22223:143;22441:4;22434:5;22430:16;22424:23;22453:63;22510:4;22505:3;22501:14;22487:12;22453:63;;;22376:146;22176:361;;;;22593:467;22726:4;22721:3;22717:14;22810:3;22803:5;22799:15;22793:22;22821:62;22878:3;22873;22869:13;22855:12;22821:62;;;22746:143;22964:4;22957:5;22953:16;22947:23;22976:63;23033:4;23028:3;23024:14;23010:12;22976:63;;;22899:146;22699:361;;;;23067:110;23148:23;23165:5;23148:23;;;23143:3;23136:36;23130:47;;;23184:103;23257:24;23275:5;23257:24;;;23252:3;23245:37;23239:48;;;23294:113;23377:24;23395:5;23377:24;;;23372:3;23365:37;23359:48;;;23414:107;23493:22;23509:5;23493:22;;;23488:3;23481:35;23475:46;;;23528:262;;23672:93;23761:3;23752:6;23672:93;;;23665:100;;23782:3;23775:10;;23653:137;;;;;23797:213;;23915:2;23904:9;23900:18;23892:26;;23929:71;23997:1;23986:9;23982:17;23973:6;23929:71;;;23886:124;;;;;24017:324;;24163:2;24152:9;24148:18;24140:26;;24177:71;24245:1;24234:9;24230:17;24221:6;24177:71;;;24259:72;24327:2;24316:9;24312:18;24303:6;24259:72;;;24134:207;;;;;;24348:435;;24522:2;24511:9;24507:18;24499:26;;24536:71;24604:1;24593:9;24589:17;24580:6;24536:71;;;24618:72;24686:2;24675:9;24671:18;24662:6;24618:72;;;24701;24769:2;24758:9;24754:18;24745:6;24701:72;;;24493:290;;;;;;;24790:324;;24936:2;24925:9;24921:18;24913:26;;24950:71;25018:1;25007:9;25003:17;24994:6;24950:71;;;25032:72;25100:2;25089:9;25085:18;25076:6;25032:72;;;24907:207;;;;;;25121:431;;25293:2;25282:9;25278:18;25270:26;;25307:71;25375:1;25364:9;25360:17;25351:6;25307:71;;;25389:72;25457:2;25446:9;25442:18;25433:6;25389:72;;;25472:70;25538:2;25527:9;25523:18;25514:6;25472:70;;;25264:288;;;;;;;25559:788;;25889:2;25878:9;25874:18;25866:26;;25939:9;25933:4;25929:20;25925:1;25914:9;25910:17;25903:47;25964:144;26103:4;26094:6;25964:144;;;25956:152;;26156:9;26150:4;26146:20;26141:2;26130:9;26126:18;26119:48;26181:156;26332:4;26323:6;26181:156;;;26173:164;;25860:487;;;;;;26354:201;;26466:2;26455:9;26451:18;26443:26;;26480:65;26542:1;26531:9;26527:17;26518:6;26480:65;;;26437:118;;;;;26562:231;;26689:2;26678:9;26674:18;26666:26;;26703:80;26780:1;26769:9;26765:17;26756:6;26703:80;;;26660:133;;;;;26800:301;;26938:2;26927:9;26923:18;26915:26;;26988:9;26982:4;26978:20;26974:1;26963:9;26959:17;26952:47;27013:78;27086:4;27077:6;27013:78;;;27005:86;;26909:192;;;;;27108:407;;27299:2;27288:9;27284:18;27276:26;;27349:9;27343:4;27339:20;27335:1;27324:9;27320:17;27313:47;27374:131;27500:4;27374:131;;;27366:139;;27270:245;;;;27522:407;;27713:2;27702:9;27698:18;27690:26;;27763:9;27757:4;27753:20;27749:1;27738:9;27734:17;27727:47;27788:131;27914:4;27788:131;;;27780:139;;27684:245;;;;27936:407;;28127:2;28116:9;28112:18;28104:26;;28177:9;28171:4;28167:20;28163:1;28152:9;28148:17;28141:47;28202:131;28328:4;28202:131;;;28194:139;;28098:245;;;;28350:407;;28541:2;28530:9;28526:18;28518:26;;28591:9;28585:4;28581:20;28577:1;28566:9;28562:17;28555:47;28616:131;28742:4;28616:131;;;28608:139;;28512:245;;;;28764:407;;28955:2;28944:9;28940:18;28932:26;;29005:9;28999:4;28995:20;28991:1;28980:9;28976:17;28969:47;29030:131;29156:4;29030:131;;;29022:139;;28926:245;;;;29178:407;;29369:2;29358:9;29354:18;29346:26;;29419:9;29413:4;29409:20;29405:1;29394:9;29390:17;29383:47;29444:131;29570:4;29444:131;;;29436:139;;29340:245;;;;29592:407;;29783:2;29772:9;29768:18;29760:26;;29833:9;29827:4;29823:20;29819:1;29808:9;29804:17;29797:47;29858:131;29984:4;29858:131;;;29850:139;;29754:245;;;;30006:407;;30197:2;30186:9;30182:18;30174:26;;30247:9;30241:4;30237:20;30233:1;30222:9;30218:17;30211:47;30272:131;30398:4;30272:131;;;30264:139;;30168:245;;;;30420:407;;30611:2;30600:9;30596:18;30588:26;;30661:9;30655:4;30651:20;30647:1;30636:9;30632:17;30625:47;30686:131;30812:4;30686:131;;;30678:139;;30582:245;;;;30834:407;;31025:2;31014:9;31010:18;31002:26;;31075:9;31069:4;31065:20;31061:1;31050:9;31046:17;31039:47;31100:131;31226:4;31100:131;;;31092:139;;30996:245;;;;31248:407;;31439:2;31428:9;31424:18;31416:26;;31489:9;31483:4;31479:20;31475:1;31464:9;31460:17;31453:47;31514:131;31640:4;31514:131;;;31506:139;;31410:245;;;;31662:407;;31853:2;31842:9;31838:18;31830:26;;31903:9;31897:4;31893:20;31889:1;31878:9;31874:17;31867:47;31928:131;32054:4;31928:131;;;31920:139;;31824:245;;;;32076:407;;32267:2;32256:9;32252:18;32244:26;;32317:9;32311:4;32307:20;32303:1;32292:9;32288:17;32281:47;32342:131;32468:4;32342:131;;;32334:139;;32238:245;;;;32490:407;;32681:2;32670:9;32666:18;32658:26;;32731:9;32725:4;32721:20;32717:1;32706:9;32702:17;32695:47;32756:131;32882:4;32756:131;;;32748:139;;32652:245;;;;32904:407;;33095:2;33084:9;33080:18;33072:26;;33145:9;33139:4;33135:20;33131:1;33120:9;33116:17;33109:47;33170:131;33296:4;33170:131;;;33162:139;;33066:245;;;;33318:407;;33509:2;33498:9;33494:18;33486:26;;33559:9;33553:4;33549:20;33545:1;33534:9;33530:17;33523:47;33584:131;33710:4;33584:131;;;33576:139;;33480:245;;;;33732:407;;33923:2;33912:9;33908:18;33900:26;;33973:9;33967:4;33963:20;33959:1;33948:9;33944:17;33937:47;33998:131;34124:4;33998:131;;;33990:139;;33894:245;;;;34146:407;;34337:2;34326:9;34322:18;34314:26;;34387:9;34381:4;34377:20;34373:1;34362:9;34358:17;34351:47;34412:131;34538:4;34412:131;;;34404:139;;34308:245;;;;34560:407;;34751:2;34740:9;34736:18;34728:26;;34801:9;34795:4;34791:20;34787:1;34776:9;34772:17;34765:47;34826:131;34952:4;34826:131;;;34818:139;;34722:245;;;;34974:407;;35165:2;35154:9;35150:18;35142:26;;35215:9;35209:4;35205:20;35201:1;35190:9;35186:17;35179:47;35240:131;35366:4;35240:131;;;35232:139;;35136:245;;;;35388:407;;35579:2;35568:9;35564:18;35556:26;;35629:9;35623:4;35619:20;35615:1;35604:9;35600:17;35593:47;35654:131;35780:4;35654:131;;;35646:139;;35550:245;;;;35802:407;;35993:2;35982:9;35978:18;35970:26;;36043:9;36037:4;36033:20;36029:1;36018:9;36014:17;36007:47;36068:131;36194:4;36068:131;;;36060:139;;35964:245;;;;36216:404;;36402:2;36391:9;36387:18;36379:26;;36416:111;36524:1;36513:9;36509:17;36500:6;36416:111;;;36538:72;36606:2;36595:9;36591:18;36582:6;36538:72;;;36373:247;;;;;;36627:209;;36743:2;36732:9;36728:18;36720:26;;36757:69;36823:1;36812:9;36808:17;36799:6;36757:69;;;36714:122;;;;;36843:213;;36961:2;36950:9;36946:18;36938:26;;36975:71;37043:1;37032:9;37028:17;37019:6;36975:71;;;36932:124;;;;;37063:205;;37177:2;37166:9;37162:18;37154:26;;37191:67;37255:1;37244:9;37240:17;37231:6;37191:67;;;37148:120;;;;;37275:256;;37337:2;37331:9;37321:19;;37375:4;37367:6;37363:17;37474:6;37462:10;37459:22;37438:18;37426:10;37423:34;37420:62;37417:2;;;37495:1;37492;37485:12;37417:2;37515:10;37511:2;37504:22;37315:216;;;;;37538:322;;37682:18;37674:6;37671:30;37668:2;;;37714:1;37711;37704:12;37668:2;37781:4;37777:9;37770:4;37762:6;37758:17;37754:33;37746:41;;37845:4;37839;37835:15;37827:23;;37605:255;;;;37867:175;;37977:3;37969:11;;38015:4;38010:3;38006:14;37998:22;;37963:79;;;;38049:169;;38153:3;38145:11;;38191:4;38186:3;38182:14;38174:22;;38139:79;;;;38225:161;;38358:5;38352:12;38342:22;;38323:63;;;;38393:155;;38520:5;38514:12;38504:22;;38485:63;;;;38555:117;;38644:5;38638:12;38628:22;;38609:63;;;;38679:121;;38772:5;38766:12;38756:22;;38737:63;;;;38807:122;;38901:5;38895:12;38885:22;;38866:63;;;;38936:132;;39058:4;39053:3;39049:14;39041:22;;39035:33;;;;39075:126;;39191:4;39186:3;39182:14;39174:22;;39168:33;;;;39209:202;;39363:6;39358:3;39351:19;39400:4;39395:3;39391:14;39376:29;;39344:67;;;;;39420:196;;39568:6;39563:3;39556:19;39605:4;39600:3;39596:14;39581:29;;39549:67;;;;;39625:152;;39729:6;39724:3;39717:19;39766:4;39761:3;39757:14;39742:29;;39710:67;;;;;39786:144;;39921:3;39906:18;;39899:31;;;;;39939:163;;40054:6;40049:3;40042:19;40091:4;40086:3;40082:14;40067:29;;40035:67;;;;;40110:91;;40172:24;40190:5;40172:24;;;40161:35;;40155:46;;;;40208:85;;40281:5;40274:13;40267:21;40256:32;;40250:43;;;;40300:136;;40377:5;40366:16;;40383:48;40425:5;40383:48;;;40360:76;;;;40443:150;;40527:5;40516:16;;40533:55;40582:5;40533:55;;;40510:83;;;;40600:144;;40681:5;40670:16;;40687:52;40733:5;40687:52;;;40664:80;;;;40751:128;;40824:5;40813:16;;40830:44;40868:5;40830:44;;;40807:72;;;;40886:84;;40958:6;40951:5;40947:18;40936:29;;40930:40;;;;40977:121;;41050:42;41043:5;41039:54;41028:65;;41022:76;;;;41105:72;;41167:5;41156:16;;41150:27;;;;41184:81;;41255:4;41248:5;41244:16;41233:27;;41227:38;;;;41272:136;;41364:39;41397:5;41364:39;;;41351:52;;41345:63;;;;41415:150;;41514:46;41554:5;41514:46;;;41501:59;;41495:70;;;;41572:144;;41668:43;41705:5;41668:43;;;41655:56;;41649:67;;;;41723:128;;41811:35;41840:5;41811:35;;;41798:48;;41792:59;;;;41859:268;41924:1;41931:101;41945:6;41942:1;41939:13;41931:101;;;42021:1;42016:3;42012:11;42006:18;42002:1;41997:3;41993:11;41986:39;41967:2;41964:1;41960:10;41955:15;;41931:101;;;42047:6;42044:1;42041:13;42038:2;;;42112:1;42103:6;42098:3;42094:16;42087:27;42038:2;41908:219;;;;;42135:97;;42223:2;42219:7;42214:2;42207:5;42203:14;42199:28;42189:38;;42183:49;;;;42240:106;42324:1;42317:5;42314:12;42304:2;;42330:9;42304:2;42298:48;;42353:113;42444:1;42437:5;42434:12;42424:2;;42450:9;42424:2;42418:48;;42473:110;42561:1;42554:5;42551:12;42541:2;;42567:9;42541:2;42535:48;;42590:102;42670:1;42663:5;42660:12;42650:2;;42676:9;42650:2;42644:48;;42699:117;42768:24;42786:5;42768:24;;;42761:5;42758:35;42748:2;;42807:1;42804;42797:12;42748:2;42742:74;;42823:111;42889:21;42904:5;42889:21;;;42882:5;42879:32;42869:2;;42925:1;42922;42915:12;42869:2;42863:71;;42941:115;43009:23;43026:5;43009:23;;;43002:5;42999:34;42989:2;;43047:1;43044;43037:12;42989:2;42983:73;;43063:117;43132:24;43150:5;43132:24;;;43125:5;43122:35;43112:2;;43171:1;43168;43161:12;43112:2;43106:74;

Swarm Source

bzzr://fa43538774eaa3c9881f8f483698538da0736cad83b244324b27312104d638a3

Block Transaction Difficulty Gas Used Reward
View All Blocks Produced

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

Validator Index Block Amount
View All Withdrawals

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

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.