ETH Price: $2,077.89 (-1.18%)
Gas: 0.03 Gwei

Contract

0x6358CE4a4df9Beff64A8D7bC975649C75A8Ea3D0
 

Overview

ETH Balance

0 ETH

Eth Value

$0.00

More Info

Private Name Tags

Multichain Info

No addresses found
Transaction Hash
Method
Block
From
To

There are no matching entries

Please try again later

View more zero value Internal Transactions in Advanced View mode

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

Block Transaction Difficulty Gas Used Reward
View All Blocks Produced

Validator Index Block Amount
View All Withdrawals

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

Contract Source Code Verified (Exact Match)

Contract Name:
DfFinanceDepositsMultiSig

Compiler Version
v0.5.17+commit.d19bba13

Optimization Enabled:
Yes with 200 runs

Other Settings:
default evmVersion, MIT license
/**
 *Submitted for verification at Etherscan.io on 2020-08-03
*/

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

// File: @openzeppelin\upgrades\contracts\Initializable.sol

pragma solidity >=0.4.24 <0.7.0;


/**
 * @title Initializable
 *
 * @dev Helper contract to support initializer functions. To use it, replace
 * the constructor with a function that has the `initializer` modifier.
 * WARNING: Unlike constructors, initializer functions must be manually
 * invoked. This applies both to deploying an Initializable contract, as well
 * as extending an Initializable contract via inheritance.
 * WARNING: When used with inheritance, manual care must be taken to not invoke
 * a parent initializer twice, or ensure that all initializers are idempotent,
 * because this is not dealt with automatically as with constructors.
 */
contract Initializable {

  /**
   * @dev Indicates that the contract has been initialized.
   */
  bool private initialized;

  /**
   * @dev Indicates that the contract is in the process of being initialized.
   */
  bool private initializing;

  /**
   * @dev Modifier to use in the initializer function of a contract.
   */
  modifier initializer() {
    require(initializing || isConstructor() || !initialized);

    bool isTopLevelCall = !initializing;
    if (isTopLevelCall) {
      initializing = true;
      initialized = true;
    }

    _;

    if (isTopLevelCall) {
      initializing = false;
    }
  }

  /// @dev Returns true if and only if the function is running in the constructor
  function isConstructor() private view returns (bool) {
    // extcodesize checks the size of the code stored in an address, and
    // address returns the current address. Since the code is still not
    // deployed when running a constructor, any checks on its code size will
    // yield zero, making it an effective way to detect if a contract is
    // under construction or not.
    address self = address(this);
    uint256 cs;
    assembly { cs := extcodesize(self) }
    return cs == 0;
  }

  // Reserved storage space to allow for layout changes in the future.
  uint256[50] private ______gap;
}

// File: contracts\upgradable\OwnableUpgradable.sol

pragma solidity ^0.5.16;

// import "../openzeppelin/upgrades/contracts/Initializable.sol";


contract OwnableUpgradable is Initializable {
    address payable public owner;
    address payable internal newOwnerCandidate;


    modifier onlyOwner {
        require(msg.sender == owner);
        _;
    }


    // ** INITIALIZERS – Constructors for Upgradable contracts **

    function initialize() public initializer {
        owner = msg.sender;
    }

    function initialize(address payable newOwner) public initializer {
        owner = newOwner;
    }


    function changeOwner(address payable newOwner) public onlyOwner {
        newOwnerCandidate = newOwner;
    }

    function acceptOwner() public {
        require(msg.sender == newOwnerCandidate);
        owner = newOwnerCandidate;
    }


    uint256[50] private ______gap;
}

// File: contracts\utils\SafeMath.sol

pragma solidity ^0.5.0;

/**
 * @dev Wrappers over Solidity's arithmetic operations with added overflow
 * checks.
 *
 * Arithmetic operations in Solidity wrap on overflow. This can easily result
 * in bugs, because programmers usually assume that an overflow raises an
 * error, which is the standard behavior in high level programming languages.
 * `SafeMath` restores this intuition by reverting the transaction when an
 * operation overflows.
 *
 * Using this library instead of the unchecked operations eliminates an entire
 * class of bugs, so it's recommended to use it always.
 */
library SafeMath {
    /**
     * @dev Returns the addition of two unsigned integers, reverting on
     * overflow.
     *
     * Counterpart to Solidity's `+` operator.
     *
     * Requirements:
     * - Addition cannot overflow.
     */
    function add(uint256 a, uint256 b) internal pure returns (uint256) {
        uint256 c = a + b;
        require(c >= a);

        return c;
    }

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

    /**
     * @dev Returns the subtraction of two unsigned integers, reverting with custom message on
     * overflow (when the result is negative).
     *
     * Counterpart to Solidity's `-` operator.
     *
     * Requirements:
     * - Subtraction cannot overflow.
     *
     * _Available since v2.4.0._
     */
    function sub(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) {
        require(b <= a, errorMessage);
        uint256 c = a - b;

        return c;
    }

    /**
     * @dev Returns the multiplication of two unsigned integers, reverting on
     * overflow.
     *
     * Counterpart to Solidity's `*` operator.
     *
     * Requirements:
     * - Multiplication cannot overflow.
     */
    function mul(uint256 a, uint256 b) internal pure returns (uint256) {
        // Gas optimization: this is cheaper than requiring 'a' not being zero, but the
        // benefit is lost if 'b' is also tested.
        // See: https://github.com/OpenZeppelin/openzeppelin-contracts/pull/522
        if (a == 0) {
            return 0;
        }

        uint256 c = a * b;
        require(c / a == b);

        return c;
    }

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

    /**
     * @dev Returns the integer division of two unsigned integers. Reverts with custom message on
     * division by zero. The result is rounded towards zero.
     *
     * Counterpart to Solidity's `/` operator. Note: this function uses a
     * `revert` opcode (which leaves remaining gas untouched) while Solidity
     * uses an invalid opcode to revert (consuming all remaining gas).
     *
     * Requirements:
     * - The divisor cannot be zero.
     *
     * _Available since v2.4.0._
     */
    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;
        // assert(a == b * c + a % b); // There is no case in which this doesn't hold

        return c;
    }

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

    /**
     * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo),
     * Reverts with custom message when dividing by zero.
     *
     * Counterpart to Solidity's `%` operator. This function uses a `revert`
     * opcode (which leaves remaining gas untouched) while Solidity uses an
     * invalid opcode to revert (consuming all remaining gas).
     *
     * Requirements:
     * - The divisor cannot be zero.
     *
     * _Available since v2.4.0._
     */
    function mod(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) {
        require(b != 0, errorMessage);
        return a % b;
    }
}

// File: contracts\utils\Address.sol

pragma solidity ^0.5.5;

/**
 * @dev Collection of functions related to the address type
 */
library Address {
    /**
     * @dev Returns true if `account` is a contract.
     *
     * This test is non-exhaustive, and there may be false-negatives: during the
     * execution of a contract's constructor, its address will be reported as
     * not containing a contract.
     *
     * IMPORTANT: It is unsafe to assume that an address for which this
     * function returns false is an externally-owned account (EOA) and not a
     * contract.
     */
    function isContract(address account) internal view returns (bool) {
        // This method relies in extcodesize, which returns 0 for contracts in
        // construction, since the code is only stored at the end of the
        // constructor execution.

        // According to EIP-1052, 0x0 is the value returned for not-yet created accounts
        // and 0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470 is returned
        // for accounts without code, i.e. `keccak256('')`
        bytes32 codehash;
        bytes32 accountHash = 0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470;
        // solhint-disable-next-line no-inline-assembly
        assembly { codehash := extcodehash(account) }
        return (codehash != 0x0 && codehash != accountHash);
    }

    /**
     * @dev Converts an `address` into `address payable`. Note that this is
     * simply a type cast: the actual underlying value is not changed.
     *
     * _Available since v2.4.0._
     */
    function toPayable(address account) internal pure returns (address payable) {
        return address(uint160(account));
    }

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

        // solhint-disable-next-line avoid-call-value
        (bool success, ) = recipient.call.value(amount)("");
        require(success);
    }
}

// File: contracts\interfaces\IToken.sol

pragma solidity ^0.5.16;

interface IToken {
    function decimals() external view returns (uint);
    function allowance(address owner, address spender) external view returns (uint);
    function balanceOf(address account) external view returns (uint);
    function approve(address spender, uint value) external;
    function transfer(address to, uint value) external returns (bool);
    function transferFrom(address from, address to, uint value) external returns (bool);
    function deposit() external payable;
    function withdraw(uint amount) external;
}

// File: contracts\utils\SafeERC20.sol

pragma solidity ^0.5.16;

// import "@openzeppelin/contracts-ethereum-package/contracts/math/SafeMath.sol";

// import "@openzeppelin/contracts-ethereum-package/contracts/utils/Address.sol";



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

    using SafeMath for uint256;
    using Address for address;

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

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

    function safeApprove(IToken token, address spender, uint256 value) internal {
        // safeApprove should only be called when setting an initial allowance,
        // or when resetting it to zero. To increase and decrease it, use
        // 'safeIncreaseAllowance' and 'safeDecreaseAllowance'
        // solhint-disable-next-line max-line-length
        require((value == 0) || (token.allowance(address(this), spender) == 0));
        callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, value));
    }

    function safeIncreaseAllowance(IToken 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(IToken token, address spender, uint256 value) internal {
        uint256 newAllowance = token.allowance(address(this), spender).sub(value);
        callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, newAllowance));
    }

    /**
     * @dev Imitates a Solidity high-level call (i.e. a regular function call to a contract), relaxing the requirement
     * on the return value: the return value is optional (but if data is returned, it must not be false).
     * @param token The token targeted by the call.
     * @param data The call data (encoded using abi.encode or one of its variants).
     */
    function callOptionalReturn(IToken token, bytes memory data) private {
        // We need to perform a low level call here, to bypass Solidity's return data size checking mechanism, since
        // we're implementing it ourselves.

        // A Solidity high level call has three parts:
        //  1. The target address is checked to verify it contains contract code
        //  2. The call itself is made, and success asserted
        //  3. The return value is decoded, which in turn checks the size of the returned data.
        // solhint-disable-next-line max-line-length
        require(address(token).isContract());

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

        if (returndata.length > 0) { // Return data is optional
            // solhint-disable-next-line max-line-length
            require(abi.decode(returndata, (bool)));
        }
    }
}

// File: contracts\utils\UniversalERC20.sol

pragma solidity ^0.5.16;

// import "@openzeppelin/contracts-ethereum-package/contracts/math/SafeMath.sol";
// import "./SafeMath.sol";



library UniversalERC20 {

    using SafeMath for uint256;
    using SafeERC20 for IToken;

    IToken private constant ZERO_ADDRESS = IToken(0x0000000000000000000000000000000000000000);
    IToken private constant ETH_ADDRESS = IToken(0xEeeeeEeeeEeEeeEeEeEeeEEEeeeeEeeeeeeeEEeE);

    function universalTransfer(IToken token, address to, uint256 amount) internal {
        universalTransfer(token, to, amount, false);
    }

    function universalTransfer(IToken token, address to, uint256 amount, bool mayFail) internal returns(bool) {
        if (amount == 0) {
            return true;
        }

        if (token == ZERO_ADDRESS || token == ETH_ADDRESS) {
            if (mayFail) {
                return address(uint160(to)).send(amount);
            } else {
                address(uint160(to)).transfer(amount);
                return true;
            }
        } else {
            token.safeTransfer(to, amount);
            return true;
        }
    }

    function universalApprove(IToken token, address to, uint256 amount) internal {
        if (token != ZERO_ADDRESS && token != ETH_ADDRESS) {
            token.safeApprove(to, amount);
        }
    }

    function universalTransferFrom(IToken token, address from, address to, uint256 amount) internal {
        if (amount == 0) {
            return;
        }

        if (token == ZERO_ADDRESS || token == ETH_ADDRESS) {
            require(from == msg.sender && msg.value >= amount, "msg.value is zero");
            if (to != address(this)) {
                address(uint160(to)).transfer(amount);
            }
            if (msg.value > amount) {
                msg.sender.transfer(uint256(msg.value).sub(amount));
            }
        } else {
            token.safeTransferFrom(from, to, amount);
        }
    }

    function universalBalanceOf(IToken token, address who) internal view returns (uint256) {
        if (token == ZERO_ADDRESS || token == ETH_ADDRESS) {
            return who.balance;
        } else {
            return token.balanceOf(who);
        }
    }
}

// File: contracts\upgradable\FundsMgrUpgradable.sol

pragma solidity ^0.5.16;

// import "../openzeppelin/upgrades/contracts/Initializable.sol";



contract FundsMgrUpgradable is Initializable, OwnableUpgradable {
    using UniversalERC20 for IToken;

    // Initializer – Constructor for Upgradable contracts
    function initialize() public initializer {
        OwnableUpgradable.initialize();  // Initialize Parent Contract
    }

    function initialize(address payable newOwner) public initializer {
        OwnableUpgradable.initialize(newOwner);  // Initialize Parent Contract
    }


    function withdraw(address token, uint256 amount) public onlyOwner {
        if (token == address(0x0)) {
            owner.transfer(amount);
        } else {
            IToken(token).universalTransfer(owner, amount);
        }
    }

    function withdrawAll(address[] memory tokens) public onlyOwner {
        for(uint256 i = 0; i < tokens.length;i++) {
            withdraw(tokens[i], IToken(tokens[i]).universalBalanceOf(address(this)));
        }
    }

    uint256[50] private ______gap;
}

// File: contracts\upgradable\AdminableUpgradable.sol

pragma solidity ^0.5.16;

// import "../openzeppelin/upgrades/contracts/Initializable.sol";



contract AdminableUpgradable is Initializable, OwnableUpgradable {
    mapping(address => bool) public admins;


    modifier onlyOwnerOrAdmin {
        require(msg.sender == owner ||
                admins[msg.sender], "Permission denied");
        _;
    }


    // Initializer – Constructor for Upgradable contracts
    function initialize() public initializer {
        OwnableUpgradable.initialize();  // Initialize Parent Contract
    }

    function initialize(address payable newOwner) public initializer {
        OwnableUpgradable.initialize(newOwner);  // Initialize Parent Contract
    }


    function setAdminPermission(address _admin, bool _status) public onlyOwner {
        admins[_admin] = _status;
    }

    function setAdminPermission(address[] memory _admins, bool _status) public onlyOwner {
        for (uint i = 0; i < _admins.length; i++) {
            admins[_admins[i]] = _status;
        }
    }


    uint256[50] private ______gap;
}

// File: contracts\constants\ConstantAddressesMainnet.sol

pragma solidity ^0.5.16;


contract ConstantAddresses {
    address public constant COMPTROLLER = 0x3d9819210A31b4961b30EF54bE2aeD79B9c9Cd3B;
    // address public constant COMPOUND_ORACLE = 0x1D8aEdc9E924730DD3f9641CDb4D1B92B848b4bd;


    address public constant DAI_ADDRESS = 0x6B175474E89094C44Da98b954EedeAC495271d0F;
    address public constant CDAI_ADDRESS = 0x5d3a536E4D6DbD6114cc1Ead35777bAB948E3643;

    address public constant COMP_ADDRESS = 0xc00e94Cb662C3520282E6f5717214004A7f26888;

    address public constant USDT_ADDRESS = 0xdAC17F958D2ee523a2206206994597C13D831ec7;
}

// File: contracts\utils\DSMath.sol

pragma solidity ^0.5.0;

contract DSMath {
    function add(uint x, uint y) internal pure returns (uint z) {
        require((z = x + y) >= x);
    }
    function sub(uint x, uint y) internal pure returns (uint z) {
        require((z = x - y) <= x);
    }
    function mul(uint x, uint y) internal pure returns (uint z) {
        require(y == 0 || (z = x * y) / y == x);
    }

    function min(uint x, uint y) internal pure returns (uint z) {
        return x <= y ? x : y;
    }
    function max(uint x, uint y) internal pure returns (uint z) {
        return x >= y ? x : y;
    }
    function imin(int x, int y) internal pure returns (int z) {
        return x <= y ? x : y;
    }
    function imax(int x, int y) internal pure returns (int z) {
        return x >= y ? x : y;
    }

    uint constant WAD = 10 ** 18;
    uint constant RAY = 10 ** 27;

    function wmul(uint x, uint y, uint base) internal pure returns (uint z) {
        z = add(mul(x, y), base / 2) / base;
    }

    function wmul(uint x, uint y) internal pure returns (uint z) {
        z = add(mul(x, y), WAD / 2) / WAD;
    }
    function rmul(uint x, uint y) internal pure returns (uint z) {
        z = add(mul(x, y), RAY / 2) / RAY;
    }
    function wdiv(uint x, uint y) internal pure returns (uint z) {
        z = add(mul(x, WAD), y / 2) / y;
    }
    function rdiv(uint x, uint y) internal pure returns (uint z) {
        z = add(mul(x, RAY), y / 2) / y;
    }

    // This famous algorithm is called "exponentiation by squaring"
    // and calculates x^n with x as fixed-point and n as regular unsigned.
    //
    // It's O(log n), instead of O(n) for naive repeated multiplication.
    //
    // These facts are why it works:
    //
    //  If n is even, then x^n = (x^2)^(n/2).
    //  If n is odd,  then x^n = x * x^(n-1),
    //   and applying the equation for even x gives
    //    x^n = x * (x^2)^((n-1) / 2).
    //
    //  Also, EVM division is flooring and
    //    floor[(n-1) / 2] = floor[n / 2].
    //
    /*function rpow(uint x, uint n) internal pure returns (uint z) {
        z = n % 2 != 0 ? x : RAY;

        for (n /= 2; n != 0; n /= 2) {
            x = rmul(x, x);

            if (n % 2 != 0) {
                z = rmul(z, x);
            }
        }
    }*/
}

// File: contracts\flashloan\interfaces\IFlashLoanReceiver.sol

pragma solidity ^0.5.16;

/**
* @title IFlashLoanReceiver interface
* @notice Interface for the Aave fee IFlashLoanReceiver.
* @author Aave
* @dev implement this interface to develop a flashloan-compatible flashLoanReceiver contract
**/
interface IFlashLoanReceiver {

    function executeOperation(address _reserve, uint256 _amount, uint256 _fee, bytes calldata _params) external;
}

// File: contracts\flashloan\interfaces\ILendingPoolAddressesProvider.sol

pragma solidity ^0.5.0;


/**
@title ILendingPoolAddressesProvider interface
@notice provides the interface to fetch the LendingPoolCore address
 */
interface ILendingPoolAddressesProvider {

    function getLendingPool() external view returns (address);
    function setLendingPoolImpl(address _pool) external;

    function getLendingPoolCore() external view returns (address payable);
    function setLendingPoolCoreImpl(address _lendingPoolCore) external;

    function getLendingPoolConfigurator() external view returns (address);
    function setLendingPoolConfiguratorImpl(address _configurator) external;

    function getLendingPoolDataProvider() external view returns (address);
    function setLendingPoolDataProviderImpl(address _provider) external;

    function getLendingPoolParametersProvider() external view returns (address);
    function setLendingPoolParametersProviderImpl(address _parametersProvider) external;

    function getTokenDistributor() external view returns (address);
    function setTokenDistributor(address _tokenDistributor) external;


    function getFeeProvider() external view returns (address);
    function setFeeProviderImpl(address _feeProvider) external;

    function getLendingPoolLiquidationManager() external view returns (address);
    function setLendingPoolLiquidationManager(address _manager) external;

    function getLendingPoolManager() external view returns (address);
    function setLendingPoolManager(address _lendingPoolManager) external;

    function getPriceOracle() external view returns (address);
    function setPriceOracle(address _priceOracle) external;

    function getLendingRateOracle() external view returns (address);
    function setLendingRateOracle(address _lendingRateOracle) external;

}

// File: contracts\utils\EthAddressLib.sol

pragma solidity ^0.5.0;


library EthAddressLib {

    /**
    * @dev returns the address used within the protocol to identify ETH
    * @return the address assigned to ETH
     */
    function ethAddress() internal pure returns(address) {
        return 0xEeeeeEeeeEeEeeEeEeEeeEEEeeeeEeeeeeeeEEeE;
    }
}

// File: contracts\flashloan\base\FlashLoanReceiverBase.sol

pragma solidity ^0.5.0;

// import "@openzeppelin/contracts-ethereum-package/contracts/token/ERC20/IERC20.sol";







contract FlashLoanReceiverBase is IFlashLoanReceiver {

    using SafeERC20 for IToken;


    // Mainnet Aave LendingPoolAddressesProvider address
     address public constant AAVE_ADDRESSES_PROVIDER = 0x24a42fD28C976A61Df5D00D0599C34c4f90748c8;

    // Kovan Aave LendingPoolAddressesProvider addres
    // address public constant AAVE_ADDRESSES_PROVIDER = 0x506B0B2CF20FAA8f38a4E2B524EE43e1f4458Cc5;


    function transferFundsBackToPoolInternal(address _reserve, uint256 _amount) internal {
        address payable core = ILendingPoolAddressesProvider(AAVE_ADDRESSES_PROVIDER).getLendingPoolCore();
        transferInternal(core, _reserve, _amount);
    }

    function transferInternal(address _destination, address _reserve, uint256  _amount) internal {

        if(_reserve == EthAddressLib.ethAddress()) {
            address payable receiverPayable = address(uint160(_destination));

            //solium-disable-next-line
            (bool result, ) = receiverPayable.call.value(_amount)("");

            require(result, "Transfer of ETH failed");
            return;
        }

        IToken(_reserve).safeTransfer(_destination, _amount);
    }

    function getBalanceInternal(address _target, address _reserve) internal view returns(uint256) {
        if(_reserve == EthAddressLib.ethAddress()) {
            return _target.balance;
        }

        return IToken(_reserve).balanceOf(_target);
    }

}

// File: contracts\multisig\MultiOwnable.sol

pragma solidity ^0.5.16;



contract MultiOwnable is
    Initializable
{

    struct VoteInfo {
        uint16 votesCounter;
        uint64 curVote;
        mapping(uint => mapping (address => bool)) isVoted; // [curVote][owner]
    }


    uint public constant MIN_VOTES = 2;

    mapping(bytes => VoteInfo) public votes;
    mapping(address => bool) public  multiOwners;

    uint public multiOwnersCounter;


    event VoteForCalldata(address _owner, bytes _data);


    modifier onlyMultiOwners {
        require(multiOwners[msg.sender], "Permission denied");

        uint curVote = votes[msg.data].curVote;

        // vote for current call
        if (!votes[msg.data].isVoted[curVote][msg.sender]) {
            votes[msg.data].isVoted[curVote][msg.sender] = true;
            votes[msg.data].votesCounter++;
        }

        if (votes[msg.data].votesCounter >= MIN_VOTES ||
            votes[msg.data].votesCounter >= multiOwnersCounter
        ){
            // iterate to new vote for this msg.data
            votes[msg.data].votesCounter = 0;
            votes[msg.data].curVote++;
            _;
        } else {
            emit VoteForCalldata(msg.sender, msg.data);
        }

    }


    // ** INITIALIZERS **

    function initialize() public initializer {
        _addOwner(msg.sender);
    }

    function initialize(address[] memory _newOwners) public initializer {
        require(_newOwners.length > 0);

        for (uint i = 0; i < _newOwners.length; i++) {
            _addOwner(_newOwners[i]);
        }
    }


    // ** ONLY_MULTI_OWNERS functions **


    function addOwner(address _newOwner) public onlyMultiOwners {
        _addOwner(_newOwner);
    }


    function addOwners(address[] memory _newOwners) public onlyMultiOwners {
        require(_newOwners.length > 0);

        for (uint i = 0; i < _newOwners.length; i++) {
            _addOwner(_newOwners[i]);
        }
    }

    function removeOwner(address _exOwner) public onlyMultiOwners {
        _removeOwner(_exOwner);
    }

    function removeOwners(address[] memory _exOwners) public onlyMultiOwners {
        require(_exOwners.length > 0);

        for (uint i = 0; i < _exOwners.length; i++) {
            _removeOwner(_exOwners[i]);
        }
    }


    // ** INTERNAL functions **

    function _addOwner(address _newOwner) internal {
        require(!multiOwners[_newOwner]);

        // UPD states
        multiOwners[_newOwner] = true;
        multiOwnersCounter++;
    }

    function _removeOwner(address _exOwner) internal {
        require(multiOwners[_exOwner]);
        require(multiOwnersCounter > 1);

        // UPD states
        multiOwners[_exOwner] = false;
        multiOwnersCounter--;   // safe
    }

}

// File: contracts\compound\interfaces\IDfWalletFactory.sol

pragma solidity ^0.5.16;


interface IDfWalletFactory {
    function createDfWallet() external returns (address dfWallet);
}

// File: contracts\compound\interfaces\ICompoundOracle.sol

pragma solidity ^0.5.16;


interface ICompoundOracle {
    function getUnderlyingPrice(address cToken) external view returns (uint);
}

// File: contracts\compound\interfaces\IComptroller.sol

pragma solidity ^0.5.16;


contract IComptroller {
    mapping(address => uint) public compAccrued;

    function claimComp(address holder, address[] memory cTokens) public;

    function enterMarkets(address[] calldata cTokens) external returns (uint256[] memory);

    function exitMarket(address cToken) external returns (uint256);

    function getAssetsIn(address account) external view returns (address[] memory);

    function getAccountLiquidity(address account) external view returns (uint256, uint256, uint256);

    function markets(address cTokenAddress) external view returns (bool, uint);

    struct CompMarketState {
        /// @notice The market's last updated compBorrowIndex or compSupplyIndex
        uint224 index;

        /// @notice The block number the index was last updated at
        uint32 block;
    }

    function compSupplyState(address) view public returns(uint224, uint32);

    function compBorrowState(address) view public returns(uint224, uint32);

//    mapping(address => CompMarketState) public compBorrowState;

    mapping(address => mapping(address => uint)) public compSupplierIndex;

    mapping(address => mapping(address => uint)) public compBorrowerIndex;
}

// File: contracts\compound\interfaces\IDfWallet.sol

pragma solidity ^0.5.16;


interface IDfWallet {

    function claimComp(address[] calldata cTokens) external;

    function borrow(address _cTokenAddr, uint _amount) external;

    function setDfFinanceClose(address _dfFinanceClose) external;

    function deposit(
        address _tokenIn, address _cTokenIn, uint _amountIn, address _tokenOut, address _cTokenOut, uint _amountOut
    ) external payable;

    function withdraw(
        address _tokenIn, address _cTokenIn, address _tokenOut, address _cTokenOut
    ) external payable;

    function withdraw(
        address _tokenIn, address _cTokenIn, uint256 amountRedeem, address _tokenOut, address _cTokenOut, uint256 amountPayback
    ) external payable returns(uint256);

    function withdrawToken(address _tokenAddr, address to, uint256 amount) external;

}

// File: contracts\compound\interfaces\ICToken.sol

pragma solidity ^0.5.16;


interface ICToken {
    function borrowIndex() view external returns (uint256);

    function mint(uint256 mintAmount) external returns (uint256);

    function mint() external payable;

    function redeem(uint256 redeemTokens) external returns (uint256);

    function redeemUnderlying(uint256 redeemAmount) external returns (uint256);

    function borrow(uint256 borrowAmount) external returns (uint256);

    function repayBorrow(uint256 repayAmount) external returns (uint256);

    function repayBorrow() external payable;

    function repayBorrowBehalf(address borrower, uint256 repayAmount) external returns (uint256);

    function repayBorrowBehalf(address borrower) external payable;

    function liquidateBorrow(address borrower, uint256 repayAmount, address cTokenCollateral)
        external
        returns (uint256);

    function liquidateBorrow(address borrower, address cTokenCollateral) external payable;

    function exchangeRateCurrent() external returns (uint256);

    function supplyRatePerBlock() external returns (uint256);

    function borrowRatePerBlock() external returns (uint256);

    function totalReserves() external returns (uint256);

    function reserveFactorMantissa() external returns (uint256);

    function borrowBalanceCurrent(address account) external returns (uint256);

    function borrowBalanceStored(address account) external view returns (uint256);

    function totalBorrowsCurrent() external returns (uint256);

    function getCash() external returns (uint256);

    function balanceOfUnderlying(address owner) external returns (uint256);

    function balanceOf(address owner) view external returns (uint256);

    function underlying() external returns (address);
}

// File: contracts\flashloan\interfaces\ILendingPool.sol

pragma solidity ^0.5.16;

interface ILendingPool {
    function addressesProvider () external view returns ( address );
    function deposit ( address _reserve, uint256 _amount, uint16 _referralCode ) external payable;
    function redeemUnderlying ( address _reserve, address _user, uint256 _amount ) external;
    function borrow ( address _reserve, uint256 _amount, uint256 _interestRateMode, uint16 _referralCode ) external;
    function repay ( address _reserve, uint256 _amount, address _onBehalfOf ) external payable;
    function swapBorrowRateMode ( address _reserve ) external;
    function rebalanceFixedBorrowRate ( address _reserve, address _user ) external;
    function setUserUseReserveAsCollateral ( address _reserve, bool _useAsCollateral ) external;
    function liquidationCall ( address _collateral, address _reserve, address _user, uint256 _purchaseAmount, bool _receiveAToken ) external payable;
    function flashLoan ( address _receiver, address _reserve, uint256 _amount, bytes calldata _params ) external;
    function getReserveConfigurationData ( address _reserve ) external view returns ( uint256 ltv, uint256 liquidationThreshold, uint256 liquidationDiscount, address interestRateStrategyAddress, bool usageAsCollateralEnabled, bool borrowingEnabled, bool fixedBorrowRateEnabled, bool isActive );
    function getReserveData ( address _reserve ) external view returns ( uint256 totalLiquidity, uint256 availableLiquidity, uint256 totalBorrowsFixed, uint256 totalBorrowsVariable, uint256 liquidityRate, uint256 variableBorrowRate, uint256 fixedBorrowRate, uint256 averageFixedBorrowRate, uint256 utilizationRate, uint256 liquidityIndex, uint256 variableBorrowIndex, address aTokenAddress, uint40 lastUpdateTimestamp );
    function getUserAccountData ( address _user ) external view returns ( uint256 totalLiquidityETH, uint256 totalCollateralETH, uint256 totalBorrowsETH, uint256 availableBorrowsETH, uint256 currentLiquidationThreshold, uint256 ltv, uint256 healthFactor );
    function getUserReserveData ( address _reserve, address _user ) external view returns ( uint256 currentATokenBalance, uint256 currentUnderlyingBalance, uint256 currentBorrowBalance, uint256 principalBorrowBalance, uint256 borrowRateMode, uint256 borrowRate, uint256 liquidityRate, uint256 originationFee, uint256 variableBorrowIndex, uint256 lastUpdateTimestamp, bool usageAsCollateralEnabled );
    function getReserves () external view;
}

// File: contracts\interfaces\IOneInchExchange.sol

pragma solidity ^0.5.16;

interface IOneInchExchange {
    function spender() external view returns (address);
}

// File: contracts\interfaces\IComptrollerLensInterface.sol

interface IComptrollerLensInterface {
    function markets(address) external view returns (bool, uint);
    function getAccountLiquidity(address) external view returns (uint, uint, uint);
    function claimComp(address) external;
    function compAccrued(address) external view returns (uint);
}

// File: contracts\deposits\DfFinanceDepositsMultiSig.sol

pragma solidity ^0.5.16;
pragma experimental ABIEncoderV2;









// **INTERFACES**











contract DfFinanceDepositsMultiSig is
    Initializable,
    DSMath,
    ConstantAddresses,
    FundsMgrUpgradable,
    AdminableUpgradable,
    FlashLoanReceiverBase,
    MultiOwnable
{
    using UniversalERC20 for IToken;
    using SafeMath for uint256;


    struct UserData {
        address owner;
        uint256 deposit; //
        // uint256 targetAmount; // 6 decimals
        uint64 compClaimed;
        uint64 compClaimedinUSD; // 6 decimals
        uint64 activeFeeScheme; // 0 - fee scheme is disabled
        uint64 gap2;
    }

    // struct CompBalanceMetadataExt {
    //     uint balance;
    //     uint votes;
    //     address delegate;
    //     uint allocated;
    // }

    enum OP {
        UNKNOWN,
        OPEN,
        CLOSE,
        PARTIALLYCLOSE
    }


    IDfWalletFactory public dfWalletFactory;

    uint256 public fee;
    address public rewardWallet;
    address public usdtExchanger;

    mapping(address => UserData) public wallets;

    OP private state;


    event DfOpenDeposit(address indexed dfWallet, uint256 amount);
    event DfAddDeposit(address indexed dfWallet, uint256 amount);
    event DfCloseDeposit(
        address indexed dfWallet, address indexed tokenReceiver, uint256 amountDAI, uint256 tokensSent
    );
    event CompSwap(uint256 timestamp, uint256 compPrice);


    modifier balanceCheck {
        uint256 startBalance = IToken(DAI_ADDRESS).balanceOf(address(this));
        _;
        require(IToken(DAI_ADDRESS).balanceOf(address(this)) >= startBalance);
    }


    // ** INITIALIZER – Constructor for Upgradable contracts **

    function initialize() public initializer {
        AdminableUpgradable.initialize();   // Initialize Parent Contract
        MultiOwnable.initialize();          // Initialize Parent Contract
        // FundsMgrUpgradable.initialize(); // Init in AdminableUpgradable

        // dfWalletFactory = IDfWalletFactory(0x0b7B605F6e5715933EF83505F1db9F2Df3C52FF4);
    }


    // ** PUBLIC VIEW functions **
    // function isClosed(address addrWallet) public view returns(bool) {
    //     return wallets[addrWallet].deposit == 0 && wallets[addrWallet].owner != address(0x0);
    // }

    function getCompBalanceMetadataExt(address account) public returns (uint256 balance, uint256 allocated) {
        IComptrollerLensInterface comptroller = IComptrollerLensInterface(COMPTROLLER);
        IToken comp = IToken(COMP_ADDRESS);
        balance = comp.balanceOf(account);
        comptroller.claimComp(account);
        uint256 newBalance = comp.balanceOf(account);
        uint256 accrued = comptroller.compAccrued(account);
        uint256 total = add(accrued, newBalance);
        allocated = sub(total, balance);
    }


    // ** CREATE DEPOSIT PUBLIC functions **

    // function createStrategyDepositMulti(uint256 amountDAI, uint256 flashLoanAmount, uint32 times) balanceCheck public {
    //     address dfWallet = createStrategyDeposit(amountDAI, flashLoanAmount, address(0x0));
    //     for(uint32 t = 0; t < times;t++) {
    //         createStrategyDeposit(amountDAI, flashLoanAmount, dfWallet);
    //     }
    // }

    function createStrategyDepositUsingAave(uint256 amountDAI, uint256 flashLoanAmount, address dfWallet) public returns (address) {

        if (dfWallet == address(0x0)) {
            dfWallet = dfWalletFactory.createDfWallet();
            IToken(DAI_ADDRESS).approve(dfWallet, uint256(-1));
            wallets[dfWallet] = UserData(msg.sender, amountDAI, 0, 0, 0, 0);
            emit DfOpenDeposit(dfWallet, amountDAI);
        } else {
            require(wallets[dfWallet].owner == msg.sender);
            wallets[dfWallet].deposit = add(wallets[dfWallet].deposit, amountDAI);
            emit DfAddDeposit(dfWallet, amountDAI);
        }
        // Transfer tokens to wallet
        IToken(DAI_ADDRESS).universalTransferFrom(msg.sender, dfWallet, amountDAI);

        ILendingPool lendingPool = ILendingPool(ILendingPoolAddressesProvider(AAVE_ADDRESSES_PROVIDER).getLendingPool());
        state = OP.OPEN;
        lendingPool.flashLoan(address(this), DAI_ADDRESS, flashLoanAmount, abi.encodePacked(dfWallet, amountDAI));
        state = OP.UNKNOWN;

        return dfWallet;
    }

    function createStrategyDeposit(uint256 amountDAI, uint256 flashLoanAmount, address dfWallet) public balanceCheck returns (address) {
        if (dfWallet == address(0x0)) {
            dfWallet = dfWalletFactory.createDfWallet();
            IToken(DAI_ADDRESS).approve(dfWallet, uint256(-1));
            wallets[dfWallet] = UserData(msg.sender, amountDAI, 0, 0, 0, 0);
            emit DfOpenDeposit(dfWallet, amountDAI);
        } else {
            require(wallets[dfWallet].owner == msg.sender);
            wallets[dfWallet].deposit = add(wallets[dfWallet].deposit, amountDAI);
            emit DfAddDeposit(dfWallet, amountDAI);
        }

        // Transfer tokens to wallet
        IToken(DAI_ADDRESS).universalTransferFrom(msg.sender, address(this), amountDAI);

        uint256 totalFunds = flashLoanAmount + amountDAI;

        IToken(DAI_ADDRESS).transfer(dfWallet, totalFunds);

        IDfWallet(dfWallet).deposit(DAI_ADDRESS, CDAI_ADDRESS, totalFunds, DAI_ADDRESS, CDAI_ADDRESS, flashLoanAmount);

        IDfWallet(dfWallet).withdrawToken(DAI_ADDRESS, address(this), flashLoanAmount);

        return dfWallet;
    }


    // ** ONLY_MULTI_OWNERS functions **

    function setRewardWallet(address _rewardWallet) public onlyMultiOwners {
        require(_rewardWallet != address(0), "Address must not be zero");
        rewardWallet = _rewardWallet;
    }

    function closeDepositDAIUsingAave(address dfWallet, address tokenReceiver, uint256 amountDAI, uint256 minAmountDAI) public onlyMultiOwners {
        require(tokenReceiver != address(0x0));

        uint256 startBalance = IToken(DAI_ADDRESS).balanceOf(address(this));

        ILendingPool lendingPool = ILendingPool(ILendingPoolAddressesProvider(AAVE_ADDRESSES_PROVIDER).getLendingPool());

        uint256 flashLoanAmount;
        if (amountDAI == uint(-1)) {
            flashLoanAmount = ICToken(CDAI_ADDRESS).borrowBalanceCurrent(dfWallet);
            state = OP.CLOSE;
        } else {
            flashLoanAmount = amountDAI.mul(3);
            state = OP.PARTIALLYCLOSE;
        }

        lendingPool.flashLoan(address(this), DAI_ADDRESS, flashLoanAmount, abi.encodePacked(dfWallet));
        state = OP.UNKNOWN;

        uint256 tokensSent = sub(IToken(DAI_ADDRESS).balanceOf(address(this)), startBalance);

        require(tokensSent >= minAmountDAI);

        IToken(DAI_ADDRESS).transfer(tokenReceiver, tokensSent); // tokensSent will be less then amountDAI because of flash loan

        emit DfCloseDeposit(dfWallet, tokenReceiver, amountDAI, tokensSent);
    }


    function closeDepositDAI(address dfWallet, address tokenReceiver, uint256 amountDAI, uint256 minAmountDAI, uint256 useOwnBalance) public balanceCheck onlyMultiOwners {
        require(tokenReceiver != address(0x0));

        uint256 startBalance = IToken(DAI_ADDRESS).balanceOf(address(this));

        if (useOwnBalance > 0) IToken(DAI_ADDRESS).transferFrom(msg.sender, address(this), useOwnBalance);

        if (IToken(DAI_ADDRESS).allowance(address(this), dfWallet) != uint256(-1)) {
            IToken(DAI_ADDRESS).approve(dfWallet, uint256(-1));
        }

        if (amountDAI == uint(-1)) {
            IDfWallet(dfWallet).withdraw(DAI_ADDRESS, CDAI_ADDRESS, uint(-1), DAI_ADDRESS, CDAI_ADDRESS, uint(-1));
        } else {
            uint256 flashLoanAmount = amountDAI.mul(3);
            uint256 cDaiToExtract = flashLoanAmount.add(amountDAI).mul(1e18).div(ICToken(CDAI_ADDRESS).exchangeRateCurrent());
            IDfWallet(dfWallet).withdraw(DAI_ADDRESS, CDAI_ADDRESS, cDaiToExtract, DAI_ADDRESS, CDAI_ADDRESS, flashLoanAmount);
        }

        if (useOwnBalance > 0) IToken(DAI_ADDRESS).transfer(msg.sender, useOwnBalance);

        uint256 tokensSent = sub(IToken(DAI_ADDRESS).balanceOf(address(this)), startBalance);
        require(tokensSent >= minAmountDAI);
        IToken(DAI_ADDRESS).transfer(tokenReceiver, tokensSent); // tokensSent will be less then amountDAI because of fee

        emit DfCloseDeposit(dfWallet, tokenReceiver, amountDAI, tokensSent);
    }

    // Universal call
    function externalCallEth(address payable[] memory  _to, bytes[] memory _data, uint256[] memory ethAmount) public onlyMultiOwners payable {

        require(msg.sender == owner);

        for(uint16 i = 0; i < _to.length; i++) {
            _cast(_to[i], _data[i], ethAmount[i]);
        }

    }


    // ** ONLY_OWNER_OR_ADMIN functions **

    function setDfWalletFactory(address _dfWalletFactory) public onlyOwnerOrAdmin {
        require(_dfWalletFactory != address(0));
        dfWalletFactory = IDfWalletFactory(_dfWalletFactory);
    }

    function changeFee(uint256 _fee) public onlyMultiOwners {
        require(msg.sender == owner);
        require(_fee < 100);
        fee = _fee;
    }

    function setUSDTExchangeAddress(address _newAddress) public onlyOwnerOrAdmin {
        usdtExchanger = _newAddress;
    }

    function claimComps(
        address dfWallet, uint256 minUsdForComp, uint256 compPriceInUsdt, bytes memory data
    ) public onlyOwnerOrAdmin returns(uint256) {
        require(rewardWallet != address(0), "Address of rewardWallet must not be zero");

        uint256 compTokenBalance = IToken(COMP_ADDRESS).balanceOf(address(this));
        address[] memory cTokens = new address[](1);
        cTokens[0] = CDAI_ADDRESS;
        IDfWallet(dfWallet).claimComp(cTokens);

        compTokenBalance = sub(IToken(COMP_ADDRESS).balanceOf(address(this)), compTokenBalance);

        if(minUsdForComp > 0) {
            uint256 usdtAmount = _exchange(IToken(COMP_ADDRESS), compTokenBalance, IToken(USDT_ADDRESS), minUsdForComp, data);
            usdtAmount = _distFees(USDT_ADDRESS, usdtAmount, dfWallet);

            IToken(USDT_ADDRESS).universalTransfer(rewardWallet, usdtAmount);
            wallets[dfWallet].compClaimedinUSD += uint64(usdtAmount);
            return usdtAmount;
        } else if(compPriceInUsdt > 0) {
            // Swap COMPs to USDT
            uint256 usdtAmount = wmul(compTokenBalance, compPriceInUsdt) / 10**18; // COMP to USDT
            IToken(USDT_ADDRESS).universalTransferFrom(usdtExchanger, address(this), usdtAmount);
            IToken(COMP_ADDRESS).transfer(usdtExchanger, compTokenBalance);
            emit CompSwap(block.timestamp, compPriceInUsdt);

            // distribution fee
            usdtAmount = _distFees(USDT_ADDRESS, usdtAmount, dfWallet);

            IToken(USDT_ADDRESS).universalTransfer(rewardWallet, usdtAmount);
            wallets[dfWallet].compClaimedinUSD += uint64(usdtAmount);
            return usdtAmount;
        } else {
            compTokenBalance = _distFees(COMP_ADDRESS, compTokenBalance, dfWallet);
            IToken(COMP_ADDRESS).transfer(rewardWallet, compTokenBalance);
            wallets[dfWallet].compClaimed += uint64(compTokenBalance / 1e12); // 6 decemals
            return compTokenBalance;
        }
    }


    // ** AAVE CALLBACK function **

    function executeOperation(
        address _reserve,
        uint256 _amountFlashLoan,
        uint256 _fee,
        bytes memory _data
    )
    public {
        require(state != OP.UNKNOWN);

        address dfWallet = _bytesToAddress(_data);

        require(_amountFlashLoan <= getBalanceInternal(address(this), _reserve));

        if (IToken(DAI_ADDRESS).allowance(address(this), dfWallet) != uint256(-1)) {
            IToken(DAI_ADDRESS).approve(dfWallet, uint256(-1));
        }

        uint256 totalDebt = add(_amountFlashLoan, _fee);
        if (state == OP.OPEN) {
            uint256 deposit;
            assembly {
                deposit := mload(add(_data,52))
            }

            uint256 totalFunds = _amountFlashLoan + deposit;

            IToken(DAI_ADDRESS).transfer(dfWallet, _amountFlashLoan);

            IDfWallet(dfWallet).deposit(DAI_ADDRESS, CDAI_ADDRESS, totalFunds, DAI_ADDRESS, CDAI_ADDRESS, totalDebt);

            IDfWallet(dfWallet).withdrawToken(DAI_ADDRESS, address(this), totalDebt); // TODO: remove it
        } else if (state == OP.CLOSE) {
            IDfWallet(dfWallet).withdraw(DAI_ADDRESS, CDAI_ADDRESS, uint256(-1), DAI_ADDRESS, CDAI_ADDRESS, uint256(-1));
        } else if (state == OP.PARTIALLYCLOSE) {
            // _amountFlashLoan.div(3) - user token requested
            uint256 cDaiToExtract =  _amountFlashLoan.add(_amountFlashLoan.div(3)).mul(1e18).div(ICToken(CDAI_ADDRESS).exchangeRateCurrent());

            IDfWallet(dfWallet).withdraw(DAI_ADDRESS, CDAI_ADDRESS, cDaiToExtract, DAI_ADDRESS, CDAI_ADDRESS, _amountFlashLoan);
            // require(_amountFlashLoan.div(3) >= sub(receivedAmount, _fee), "Fee greater then user amount"); // user pay fee for flash loan
        }

        // Time to transfer the funds back
        transferFundsBackToPoolInternal(_reserve, totalDebt);
    }


    // ** PRIVATE & INTERNAL functions **

    function _bytesToAddress(bytes memory bys) private pure returns (address addr) {
        assembly {
            addr := mload(add(bys,20))
        }
    }

    function _cast(address payable _to, bytes memory _data, uint256 ethAmount) internal {
        bytes32 response;

        assembly {
            let succeeded := call(sub(gas, 5000), _to, ethAmount, add(_data, 0x20), mload(_data), 0, 32)
            response := mload(0)
            switch iszero(succeeded)
            case 1 {
                revert(0, 0)
            }
        }
    }

    // return new reward balance
    function _distFees(address _token, uint256 _reward, address _dfWallet) internal returns (uint256) {
        uint256 feeReward;

        // global fee scheme
        feeReward = uint256(fee) * _reward / 100;
        if (feeReward > 0) {
            IToken(_token).universalTransfer(owner, feeReward);
        }

        return sub(_reward, feeReward);
    }

    function _exchange(
        IToken _fromToken, uint _maxFromTokenAmount, IToken _toToken, uint _minToTokenAmount, bytes memory _data
    ) internal returns(uint) {

        IOneInchExchange ex = IOneInchExchange(0x11111254369792b2Ca5d084aB5eEA397cA8fa48B); // TODO: set state var

        if (_fromToken.allowance(address(this), address(ex.spender())) != uint256(-1)) {
            _fromToken.approve(address(ex.spender()), uint256(-1));
        }

        uint fromTokenBalance = _fromToken.universalBalanceOf(address(this));
        uint toTokenBalance = _toToken.universalBalanceOf(address(this));

        // Proxy call for avoid out of gas in fallback (because of .transfer())
        // proxyEx.exchange(_fromToken, _maxFromTokenAmount, _data);
        bytes32 response;
        assembly {
            // call(g, a, v, in, insize, out, outsize)
            let succeeded := call(sub(gas, 5000), ex, 0, add(_data, 0x20), mload(_data), 0, 32)
            response := mload(0)      // load delegatecall output
        }

        require(_fromToken.universalBalanceOf(address(this)) + _maxFromTokenAmount >= fromTokenBalance, "Exchange error 1");

        uint256 newBalanceToToken = _toToken.universalBalanceOf(address(this));
        require(newBalanceToToken >= toTokenBalance + _minToTokenAmount, "Exchange error 2");

        return sub(newBalanceToToken, toTokenBalance); // how many tokens received
    }


    // ** FALLBACK function **
    function() external payable {}
}

Contract Security Audit

Contract ABI

API
[{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"timestamp","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"compPrice","type":"uint256"}],"name":"CompSwap","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"dfWallet","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"DfAddDeposit","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"dfWallet","type":"address"},{"indexed":true,"internalType":"address","name":"tokenReceiver","type":"address"},{"indexed":false,"internalType":"uint256","name":"amountDAI","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"tokensSent","type":"uint256"}],"name":"DfCloseDeposit","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"dfWallet","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"DfOpenDeposit","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"_owner","type":"address"},{"indexed":false,"internalType":"bytes","name":"_data","type":"bytes"}],"name":"VoteForCalldata","type":"event"},{"payable":true,"stateMutability":"payable","type":"fallback"},{"constant":true,"inputs":[],"name":"AAVE_ADDRESSES_PROVIDER","outputs":[{"internalType":"address","name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"CDAI_ADDRESS","outputs":[{"internalType":"address","name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"COMPTROLLER","outputs":[{"internalType":"address","name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"COMP_ADDRESS","outputs":[{"internalType":"address","name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"DAI_ADDRESS","outputs":[{"internalType":"address","name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"MIN_VOTES","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"USDT_ADDRESS","outputs":[{"internalType":"address","name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[],"name":"acceptOwner","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"_newOwner","type":"address"}],"name":"addOwner","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"address[]","name":"_newOwners","type":"address[]"}],"name":"addOwners","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"admins","outputs":[{"internalType":"bool","name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"internalType":"uint256","name":"_fee","type":"uint256"}],"name":"changeFee","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"address payable","name":"newOwner","type":"address"}],"name":"changeOwner","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"dfWallet","type":"address"},{"internalType":"uint256","name":"minUsdForComp","type":"uint256"},{"internalType":"uint256","name":"compPriceInUsdt","type":"uint256"},{"internalType":"bytes","name":"data","type":"bytes"}],"name":"claimComps","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"dfWallet","type":"address"},{"internalType":"address","name":"tokenReceiver","type":"address"},{"internalType":"uint256","name":"amountDAI","type":"uint256"},{"internalType":"uint256","name":"minAmountDAI","type":"uint256"},{"internalType":"uint256","name":"useOwnBalance","type":"uint256"}],"name":"closeDepositDAI","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"dfWallet","type":"address"},{"internalType":"address","name":"tokenReceiver","type":"address"},{"internalType":"uint256","name":"amountDAI","type":"uint256"},{"internalType":"uint256","name":"minAmountDAI","type":"uint256"}],"name":"closeDepositDAIUsingAave","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"uint256","name":"amountDAI","type":"uint256"},{"internalType":"uint256","name":"flashLoanAmount","type":"uint256"},{"internalType":"address","name":"dfWallet","type":"address"}],"name":"createStrategyDeposit","outputs":[{"internalType":"address","name":"","type":"address"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"uint256","name":"amountDAI","type":"uint256"},{"internalType":"uint256","name":"flashLoanAmount","type":"uint256"},{"internalType":"address","name":"dfWallet","type":"address"}],"name":"createStrategyDepositUsingAave","outputs":[{"internalType":"address","name":"","type":"address"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"dfWalletFactory","outputs":[{"internalType":"contract IDfWalletFactory","name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"_reserve","type":"address"},{"internalType":"uint256","name":"_amountFlashLoan","type":"uint256"},{"internalType":"uint256","name":"_fee","type":"uint256"},{"internalType":"bytes","name":"_data","type":"bytes"}],"name":"executeOperation","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"address payable[]","name":"_to","type":"address[]"},{"internalType":"bytes[]","name":"_data","type":"bytes[]"},{"internalType":"uint256[]","name":"ethAmount","type":"uint256[]"}],"name":"externalCallEth","outputs":[],"payable":true,"stateMutability":"payable","type":"function"},{"constant":true,"inputs":[],"name":"fee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"getCompBalanceMetadataExt","outputs":[{"internalType":"uint256","name":"balance","type":"uint256"},{"internalType":"uint256","name":"allocated","type":"uint256"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[],"name":"initialize","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"address[]","name":"_newOwners","type":"address[]"}],"name":"initialize","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"address payable","name":"newOwner","type":"address"}],"name":"initialize","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"multiOwners","outputs":[{"internalType":"bool","name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"multiOwnersCounter","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"owner","outputs":[{"internalType":"address payable","name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"_exOwner","type":"address"}],"name":"removeOwner","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"address[]","name":"_exOwners","type":"address[]"}],"name":"removeOwners","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"rewardWallet","outputs":[{"internalType":"address","name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"_admin","type":"address"},{"internalType":"bool","name":"_status","type":"bool"}],"name":"setAdminPermission","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"address[]","name":"_admins","type":"address[]"},{"internalType":"bool","name":"_status","type":"bool"}],"name":"setAdminPermission","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"_dfWalletFactory","type":"address"}],"name":"setDfWalletFactory","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"_rewardWallet","type":"address"}],"name":"setRewardWallet","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"_newAddress","type":"address"}],"name":"setUSDTExchangeAddress","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"usdtExchanger","outputs":[{"internalType":"address","name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"bytes","name":"","type":"bytes"}],"name":"votes","outputs":[{"internalType":"uint16","name":"votesCounter","type":"uint16"},{"internalType":"uint64","name":"curVote","type":"uint64"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"wallets","outputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"uint256","name":"deposit","type":"uint256"},{"internalType":"uint64","name":"compClaimed","type":"uint64"},{"internalType":"uint64","name":"compClaimedinUSD","type":"uint64"},{"internalType":"uint64","name":"activeFeeScheme","type":"uint64"},{"internalType":"uint64","name":"gap2","type":"uint64"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"token","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"withdraw","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"address[]","name":"tokens","type":"address[]"}],"name":"withdrawAll","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"}]

608060405234801561001057600080fd5b50615f6a80620000216000396000f3fe6080604052600436106102515760003560e01c80638129fc1c11610139578063c1892058116100b6578063eb21d9c41161007a578063eb21d9c4146106a0578063ebbc4965146106c0578063ee872558146106d5578063f3fef3a3146106f5578063fb75b2c714610715578063fc6019551461072a57610251565b8063c189205814610623578063c4d66de814610638578063cb9d122314610658578063ddca3f431461066b578063e9bca3241461068057610251565b80639f6a18cf116100fd5780639f6a18cf1461058e578063a224cee7146105ae578063a6f9dae1146105ce578063a9a5e3af146105ee578063b2b8b7dc1461060e57610251565b80638129fc1c146104f2578063899b8bcd1461050757806389b08f11146105275780638da5cb5b146105595780639aba1ce01461056e57610251565b80635958621e116101d25780636c46a2c5116101965780636c46a2c5146104325780636ddc6322146104525780636ded3d76146104725780637065cb481461049257806375f3974b146104b257806377deeef2146104d257610251565b80635958621e146103a85780635f82c67e146103c85780636568a279146103dd5780636a1db1bf146103fd5780636a51b63d1461041d57610251565b806324308b0a1161021957806324308b0a146103035780632a4c0a1a146103185780632a53ecf91461032d578063429b62e51461034d5780634d0415141461037a57610251565b80630531b2ad14610253578063067369461461027e57806311b2e10e146102a0578063173825d9146102b55780632072cdd1146102d5575b005b34801561025f57600080fd5b5061026861074c565b6040516102759190615afb565b60405180910390f35b34801561028a57600080fd5b50610293610764565b6040516102759190615d83565b3480156102ac57600080fd5b50610268610769565b3480156102c157600080fd5b506102516102d03660046153f9565b610781565b3480156102e157600080fd5b506102f56102f03660046156f9565b6109dc565b604051610275929190615d68565b34801561030f57600080fd5b50610268610a0e565b34801561032457600080fd5b50610268610a1d565b34801561033957600080fd5b50610251610348366004615496565b610a2f565b34801561035957600080fd5b5061036d6103683660046153f9565b6113ef565b6040516102759190615ccb565b34801561038657600080fd5b5061039a6103953660046153f9565b611404565b604051610275929190615d91565b3480156103b457600080fd5b506102516103c33660046153f9565b61162e565b3480156103d457600080fd5b50610268611889565b3480156103e957600080fd5b506102516103f83660046155e1565b6118a1565b34801561040957600080fd5b5061025161041836600461572d565b611912565b34801561042957600080fd5b50610293611b57565b34801561043e57600080fd5b5061025161044d3660046155e1565b611b5d565b34801561045e57600080fd5b5061026861046d366004615769565b611db3565b34801561047e57600080fd5b5061026861048d366004615769565b6121e0565b34801561049e57600080fd5b506102516104ad3660046153f9565b61276c565b3480156104be57600080fd5b506102516104cd36600461550b565b61298a565b3480156104de57600080fd5b506102516104ed366004615435565b6129cc565b3480156104fe57600080fd5b50610251613013565b34801561051357600080fd5b506102516105223660046153f9565b613093565b34801561053357600080fd5b506105476105423660046153f9565b61310c565b60405161027596959493929190615c6b565b34801561056557600080fd5b5061026861315f565b34801561057a57600080fd5b506102516105893660046153f9565b61316e565b34801561059a57600080fd5b506102936105a9366004615575565b6131d4565b3480156105ba57600080fd5b506102516105c93660046155e1565b6136f6565b3480156105da57600080fd5b506102516105e93660046153f9565b613798565b3480156105fa57600080fd5b506102516106093660046155e1565b6137d1565b34801561061a57600080fd5b50610268613a21565b34801561062f57600080fd5b50610268613a39565b34801561064457600080fd5b506102516106533660046153f9565b613a51565b61025161066636600461564a565b613aca565b34801561067757600080fd5b50610293613d97565b34801561068c57600080fd5b5061036d61069b3660046153f9565b613d9d565b3480156106ac57600080fd5b506102516106bb366004615615565b613db2565b3480156106cc57600080fd5b50610251613e25565b3480156106e157600080fd5b506102516106f0366004615575565b613e60565b34801561070157600080fd5b50610251610710366004615545565b6143a3565b34801561072157600080fd5b50610268614422565b34801561073657600080fd5b5061073f614431565b6040516102759190615cd9565b735d3a536e4d6dbd6114cc1ead35777bab948e364381565b600281565b7324a42fd28c976a61df5d00d0599c34c4f90748c881565b33600090815260cd602052604090205460ff166107b95760405162461bcd60e51b81526004016107b090615d18565b60405180910390fd5b600060cc6000366040516107ce929190615ad7565b908152604051908190036020018120546001600160401b036201000090910416915060cc90610801906000903690615ad7565b908152604080516020928190038301902060008481526001909101835281812033825290925290205460ff166108b457600160cc600036604051610846929190615ad7565b9081526040805160209281900383018120600086815260019091018452828120338252909352908220805460ff19169315159390931790925560cc9161088e91903690615ad7565b908152604051908190036020019020805461ffff8082166001011661ffff199091161790555b600260cc6000366040516108c9929190615ad7565b9081526040519081900360200190205461ffff16101580610912575060ce5460cc6000366040516108fb929190615ad7565b9081526040519081900360200190205461ffff1610155b156109ad57600060cc60003660405161092c929190615ad7565b908152604051908190036020018120805461ffff9390931661ffff199093169290921790915560cc90610963906000903690615ad7565b908152604051908190036020019020805460016001600160401b0362010000808404821692909201160269ffffffffffffffff0000199091161790556109a882614440565b6109d8565b600080516020615f08833981519152336000366040516109cf93929190615b9e565b60405180910390a15b5050565b805160208183018101805160cc8252928201919093012091525461ffff8116906201000090046001600160401b031682565b60d2546001600160a01b031681565b600080516020615ee883398151915281565b6040516370a0823160e01b8152600090600080516020615ee8833981519152906370a0823190610a63903090600401615b09565b60206040518083038186803b158015610a7b57600080fd5b505afa158015610a8f573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250610ab3919081019061574b565b33600090815260cd602052604090205490915060ff16610ae55760405162461bcd60e51b81526004016107b090615d18565b600060cc600036604051610afa929190615ad7565b908152604051908190036020018120546001600160401b036201000090910416915060cc90610b2d906000903690615ad7565b908152604080516020928190038301902060008481526001909101835281812033825290925290205460ff16610be057600160cc600036604051610b72929190615ad7565b9081526040805160209281900383018120600086815260019091018452828120338252909352908220805460ff19169315159390931790925560cc91610bba91903690615ad7565b908152604051908190036020019020805461ffff8082166001011661ffff199091161790555b600260cc600036604051610bf5929190615ad7565b9081526040519081900360200190205461ffff16101580610c3e575060ce5460cc600036604051610c27929190615ad7565b9081526040519081900360200190205461ffff1610155b1561132d57600060cc600036604051610c58929190615ad7565b908152604051908190036020018120805461ffff9390931661ffff199093169290921790915560cc90610c8f906000903690615ad7565b908152604051908190036020019020805460016001600160401b0362010000808404821692909201160269ffffffffffffffff0000199091161790556001600160a01b038616610cde57600080fd5b6040516370a0823160e01b8152600090600080516020615ee8833981519152906370a0823190610d12903090600401615b09565b60206040518083038186803b158015610d2a57600080fd5b505afa158015610d3e573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250610d62919081019061574b565b90508315610df3576040516323b872dd60e01b8152600080516020615ee8833981519152906323b872dd90610d9f90339030908990600401615b32565b602060405180830381600087803b158015610db957600080fd5b505af1158015610dcd573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250610df191908101906156db565b505b604051636eb1769f60e11b815260001990600080516020615ee88339815191529063dd62ed3e90610e2a9030908d90600401615b17565b60206040518083038186803b158015610e4257600080fd5b505afa158015610e56573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250610e7a919081019061574b565b14610ee75760405163095ea7b360e01b8152600080516020615ee88339815191529063095ea7b390610eb4908b9060001990600401615c5d565b600060405180830381600087803b158015610ece57600080fd5b505af1158015610ee2573d6000803e3d6000fd5b505050505b600019861415610fa357604051630d6b883f60e21b81526001600160a01b038916906335ae20fc90610f4b90600080516020615ee883398151915290735d3a536e4d6dbd6114cc1ead35777bab948e36439060001990839083908390600401615c03565b602060405180830381600087803b158015610f6557600080fd5b505af1158015610f79573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250610f9d919081019061574b565b50611129565b6000610fb687600363ffffffff61449f16565b90506000611078735d3a536e4d6dbd6114cc1ead35777bab948e36436001600160a01b031663bd6d894d6040518163ffffffff1660e01b8152600401602060405180830381600087803b15801561100c57600080fd5b505af1158015611020573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250611044919081019061574b565b61106c670de0b6b3a7640000611060868d63ffffffff6144cf16565b9063ffffffff61449f16565b9063ffffffff6144e116565b604051630d6b883f60e21b81529091506001600160a01b038b16906335ae20fc906110d390600080516020615ee883398151915290735d3a536e4d6dbd6114cc1ead35777bab948e3643908690839083908a90600401615c03565b602060405180830381600087803b1580156110ed57600080fd5b505af1158015611101573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250611125919081019061574b565b5050505b83156111b65760405163a9059cbb60e01b8152600080516020615ee88339815191529063a9059cbb906111629033908890600401615bbf565b602060405180830381600087803b15801561117c57600080fd5b505af1158015611190573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052506111b491908101906156db565b505b6040516370a0823160e01b815260009061124490600080516020615ee8833981519152906370a08231906111ee903090600401615b09565b60206040518083038186803b15801561120657600080fd5b505afa15801561121a573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525061123e919081019061574b565b83614523565b90508581101561125357600080fd5b60405163a9059cbb60e01b8152600080516020615ee88339815191529063a9059cbb90611286908b908590600401615c5d565b602060405180830381600087803b1580156112a057600080fd5b505af11580156112b4573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052506112d891908101906156db565b50876001600160a01b0316896001600160a01b03167f1d66ffd6dc4cc59859af98690da66dab744745de617a1e2d809ae4f905524908898460405161131e929190615d91565b60405180910390a35050611358565b600080516020615f088339815191523360003660405161134f93929190615b9e565b60405180910390a15b506040516370a0823160e01b81528190600080516020615ee8833981519152906370a082319061138c903090600401615b09565b60206040518083038186803b1580156113a457600080fd5b505afa1580156113b8573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052506113dc919081019061574b565b10156113e757600080fd5b505050505050565b60996020526000908152604090205460ff1681565b6040516370a0823160e01b81526000908190733d9819210a31b4961b30ef54be2aed79b9c9cd3b9073c00e94cb662c3520282e6f5717214004a7f268889081906370a0823190611458908890600401615afb565b60206040518083038186803b15801561147057600080fd5b505afa158015611484573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052506114a8919081019061574b565b6040516374d7814960e11b81529094506001600160a01b0383169063e9af0292906114d7908890600401615afb565b600060405180830381600087803b1580156114f157600080fd5b505af1158015611505573d6000803e3d6000fd5b50506040516370a0823160e01b8152600092506001600160a01b03841691506370a0823190611538908990600401615afb565b60206040518083038186803b15801561155057600080fd5b505afa158015611564573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250611588919081019061574b565b90506000836001600160a01b031663cc7ebdc4886040518263ffffffff1660e01b81526004016115b89190615afb565b60206040518083038186803b1580156115d057600080fd5b505afa1580156115e4573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250611608919081019061574b565b905060006116168284614533565b90506116228188614523565b95505050505050915091565b33600090815260cd602052604090205460ff1661165d5760405162461bcd60e51b81526004016107b090615d18565b600060cc600036604051611672929190615ad7565b908152604051908190036020018120546001600160401b036201000090910416915060cc906116a5906000903690615ad7565b908152604080516020928190038301902060008481526001909101835281812033825290925290205460ff1661175857600160cc6000366040516116ea929190615ad7565b9081526040805160209281900383018120600086815260019091018452828120338252909352908220805460ff19169315159390931790925560cc9161173291903690615ad7565b908152604051908190036020019020805461ffff8082166001011661ffff199091161790555b600260cc60003660405161176d929190615ad7565b9081526040519081900360200190205461ffff161015806117b6575060ce5460cc60003660405161179f929190615ad7565b9081526040519081900360200190205461ffff1610155b156109ad57600060cc6000366040516117d0929190615ad7565b908152604051908190036020018120805461ffff9390931661ffff199093169290921790915560cc90611807906000903690615ad7565b908152604051908190036020019020805460016001600160401b0362010000808404821692909201160269ffffffffffffffff0000199091161790556001600160a01b0382166118695760405162461bcd60e51b81526004016107b090615d58565b60d180546001600160a01b0319166001600160a01b0384161790556109d8565b733d9819210a31b4961b30ef54be2aed79b9c9cd3b81565b6033546001600160a01b031633146118b857600080fd5b60005b81518110156109d85761190a8282815181106118d357fe5b6020026020010151610710308585815181106118eb57fe5b60200260200101516001600160a01b031661454390919063ffffffff16565b6001016118bb565b33600090815260cd602052604090205460ff166119415760405162461bcd60e51b81526004016107b090615d18565b600060cc600036604051611956929190615ad7565b908152604051908190036020018120546001600160401b036201000090910416915060cc90611989906000903690615ad7565b908152604080516020928190038301902060008481526001909101835281812033825290925290205460ff16611a3c57600160cc6000366040516119ce929190615ad7565b9081526040805160209281900383018120600086815260019091018452828120338252909352908220805460ff19169315159390931790925560cc91611a1691903690615ad7565b908152604051908190036020019020805461ffff8082166001011661ffff199091161790555b600260cc600036604051611a51929190615ad7565b9081526040519081900360200190205461ffff16101580611a9a575060ce5460cc600036604051611a83929190615ad7565b9081526040519081900360200190205461ffff1610155b156109ad57600060cc600036604051611ab4929190615ad7565b908152604051908190036020018120805461ffff9390931661ffff199093169290921790915560cc90611aeb906000903690615ad7565b908152604051908190036020019020805460016001600160401b0362010000808404821692909201160269ffffffffffffffff000019909116179055603354336001600160a01b0390911614611b4057600080fd5b60648210611b4d57600080fd5b60d08290556109d8565b60ce5481565b33600090815260cd602052604090205460ff16611b8c5760405162461bcd60e51b81526004016107b090615d18565b600060cc600036604051611ba1929190615ad7565b908152604051908190036020018120546001600160401b036201000090910416915060cc90611bd4906000903690615ad7565b908152604080516020928190038301902060008481526001909101835281812033825290925290205460ff16611c8757600160cc600036604051611c19929190615ad7565b9081526040805160209281900383018120600086815260019091018452828120338252909352908220805460ff19169315159390931790925560cc91611c6191903690615ad7565b908152604051908190036020019020805461ffff8082166001011661ffff199091161790555b600260cc600036604051611c9c929190615ad7565b9081526040519081900360200190205461ffff16101580611ce5575060ce5460cc600036604051611cce929190615ad7565b9081526040519081900360200190205461ffff1610155b156109ad57600060cc600036604051611cff929190615ad7565b908152604051908190036020018120805461ffff9390931661ffff199093169290921790915560cc90611d36906000903690615ad7565b908152604051908190036020019020805460016001600160401b0362010000808404821692909201160269ffffffffffffffff0000199091161790558151611d7d57600080fd5b60005b8251811015611dad57611da5838281518110611d9857fe5b6020026020010151614610565b600101611d80565b506109d8565b60006001600160a01b038216611fd65760cf60009054906101000a90046001600160a01b03166001600160a01b031663069b6cac6040518163ffffffff1660e01b8152600401602060405180830381600087803b158015611e1357600080fd5b505af1158015611e27573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250611e4b9190810190615417565b60405163095ea7b360e01b8152909250600080516020615ee88339815191529063095ea7b390611e8390859060001990600401615c5d565b600060405180830381600087803b158015611e9d57600080fd5b505af1158015611eb1573d6000803e3d6000fd5b50506040805160c08101825233815260208082018981526000838501818152606085018281526080860183815260a087018481526001600160a01b038d811680875260d3909852948990209751885495166001600160a01b0319909516949094178755935160018701559051600290950180549151935192516001600160401b03908116600160c01b026001600160c01b03948216600160801b0267ffffffffffffffff60801b19968316600160401b0267ffffffffffffffff60401b199990931667ffffffffffffffff199095169490941797909716179390931617169290921790915590519092507fb65a69d3cf00ac7e6e4c1faca98de3519940db7b75770d171e5164211a9674349150611fc9908790615d83565b60405180910390a261207b565b6001600160a01b03828116600090815260d36020526040902054163314611ffc57600080fd5b6001600160a01b038216600090815260d360205260409020600101546120229085614533565b6001600160a01b038316600081815260d36020526040908190206001019290925590517f23b30c811c0afa7005aecbb581a3a5bbd8fcb7feddcf8bcd5e2156ec62bbbbd490612072908790615d83565b60405180910390a25b61209b600080516020615ee883398151915233848763ffffffff61466616565b60007324a42fd28c976a61df5d00d0599c34c4f90748c86001600160a01b0316630261bf8b6040518163ffffffff1660e01b815260040160206040518083038186803b1580156120ea57600080fd5b505afa1580156120fe573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052506121229190810190615417565b60d4805491925060019160ff191682800217905550806001600160a01b0316635cffe9de30600080516020615ee883398151915287878a60405160200161216a929190615ab1565b6040516020818303038152906040526040518563ffffffff1660e01b81526004016121989493929190615b5a565b600060405180830381600087803b1580156121b257600080fd5b505af11580156121c6573d6000803e3d6000fd5b505060d4805460ff191690555083925050505b9392505050565b6040516370a0823160e01b81526000908190600080516020615ee8833981519152906370a0823190612216903090600401615b09565b60206040518083038186803b15801561222e57600080fd5b505afa158015612242573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250612266919081019061574b565b90506001600160a01b0383166124895760cf60009054906101000a90046001600160a01b03166001600160a01b031663069b6cac6040518163ffffffff1660e01b8152600401602060405180830381600087803b1580156122c657600080fd5b505af11580156122da573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052506122fe9190810190615417565b60405163095ea7b360e01b8152909350600080516020615ee88339815191529063095ea7b39061233690869060001990600401615c5d565b600060405180830381600087803b15801561235057600080fd5b505af1158015612364573d6000803e3d6000fd5b50506040805160c08101825233815260208082018a81526000838501818152606085018281526080860183815260a087018481526001600160a01b038e811680875260d3909852948990209751885495166001600160a01b0319909516949094178755935160018701559051600290950180549151935192516001600160401b03908116600160c01b026001600160c01b03948216600160801b0267ffffffffffffffff60801b19968316600160401b0267ffffffffffffffff60401b199990931667ffffffffffffffff199095169490941797909716179390931617169290921790915590519092507fb65a69d3cf00ac7e6e4c1faca98de3519940db7b75770d171e5164211a967434915061247c908890615d83565b60405180910390a261252e565b6001600160a01b03838116600090815260d360205260409020541633146124af57600080fd5b6001600160a01b038316600090815260d360205260409020600101546124d59086614533565b6001600160a01b038416600081815260d36020526040908190206001019290925590517f23b30c811c0afa7005aecbb581a3a5bbd8fcb7feddcf8bcd5e2156ec62bbbbd490612525908890615d83565b60405180910390a25b61254e600080516020615ee883398151915233308863ffffffff61466616565b60405163a9059cbb60e01b815284860190600080516020615ee88339815191529063a9059cbb906125859087908590600401615c5d565b602060405180830381600087803b15801561259f57600080fd5b505af11580156125b3573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052506125d791908101906156db565b506040516302d35a5960e01b81526001600160a01b038516906302d35a599061263090600080516020615ee883398151915290735d3a536e4d6dbd6114cc1ead35777bab948e3643908690839083908d90600401615c03565b600060405180830381600087803b15801561264a57600080fd5b505af115801561265e573d6000803e3d6000fd5b50506040516301e3366760e01b81526001600160a01b03871692506301e3366791506126a090600080516020615ee88339815191529030908a90600401615bda565b600060405180830381600087803b1580156126ba57600080fd5b505af11580156126ce573d6000803e3d6000fd5b50505050839250506040516370a0823160e01b81528190600080516020615ee8833981519152906370a0823190612709903090600401615b09565b60206040518083038186803b15801561272157600080fd5b505afa158015612735573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250612759919081019061574b565b101561276457600080fd5b509392505050565b33600090815260cd602052604090205460ff1661279b5760405162461bcd60e51b81526004016107b090615d18565b600060cc6000366040516127b0929190615ad7565b908152604051908190036020018120546001600160401b036201000090910416915060cc906127e3906000903690615ad7565b908152604080516020928190038301902060008481526001909101835281812033825290925290205460ff1661289657600160cc600036604051612828929190615ad7565b9081526040805160209281900383018120600086815260019091018452828120338252909352908220805460ff19169315159390931790925560cc9161287091903690615ad7565b908152604051908190036020019020805461ffff8082166001011661ffff199091161790555b600260cc6000366040516128ab929190615ad7565b9081526040519081900360200190205461ffff161015806128f4575060ce5460cc6000366040516128dd929190615ad7565b9081526040519081900360200190205461ffff1610155b156109ad57600060cc60003660405161290e929190615ad7565b908152604051908190036020018120805461ffff9390931661ffff199093169290921790915560cc90612945906000903690615ad7565b908152604051908190036020019020805460016001600160401b0362010000808404821692909201160269ffffffffffffffff0000199091161790556109a882614610565b6033546001600160a01b031633146129a157600080fd5b6001600160a01b03919091166000908152609960205260409020805460ff1916911515919091179055565b33600090815260cd602052604090205460ff166129fb5760405162461bcd60e51b81526004016107b090615d18565b600060cc600036604051612a10929190615ad7565b908152604051908190036020018120546001600160401b036201000090910416915060cc90612a43906000903690615ad7565b908152604080516020928190038301902060008481526001909101835281812033825290925290205460ff16612af657600160cc600036604051612a88929190615ad7565b9081526040805160209281900383018120600086815260019091018452828120338252909352908220805460ff19169315159390931790925560cc91612ad091903690615ad7565b908152604051908190036020019020805461ffff8082166001011661ffff199091161790555b600260cc600036604051612b0b929190615ad7565b9081526040519081900360200190205461ffff16101580612b54575060ce5460cc600036604051612b3d929190615ad7565b9081526040519081900360200190205461ffff1610155b15612fe157600060cc600036604051612b6e929190615ad7565b908152604051908190036020018120805461ffff9390931661ffff199093169290921790915560cc90612ba5906000903690615ad7565b908152604051908190036020019020805460016001600160401b0362010000808404821692909201160269ffffffffffffffff0000199091161790556001600160a01b038416612bf457600080fd5b6040516370a0823160e01b8152600090600080516020615ee8833981519152906370a0823190612c28903090600401615b09565b60206040518083038186803b158015612c4057600080fd5b505afa158015612c54573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250612c78919081019061574b565b905060007324a42fd28c976a61df5d00d0599c34c4f90748c86001600160a01b0316630261bf8b6040518163ffffffff1660e01b815260040160206040518083038186803b158015612cc957600080fd5b505afa158015612cdd573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250612d019190810190615417565b90506000600019861415612dac576040516305eff7ef60e21b8152735d3a536e4d6dbd6114cc1ead35777bab948e3643906317bfdfbc90612d46908b90600401615afb565b602060405180830381600087803b158015612d6057600080fd5b505af1158015612d74573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250612d98919081019061574b565b60d4805460ff191660021790559050612dcd565b612dbd86600363ffffffff61449f16565b60d4805460ff1916600317905590505b816001600160a01b0316635cffe9de30600080516020615ee8833981519152848c604051602001612dfe9190615a9c565b6040516020818303038152906040526040518563ffffffff1660e01b8152600401612e2c9493929190615b5a565b600060405180830381600087803b158015612e4657600080fd5b505af1158015612e5a573d6000803e3d6000fd5b505060d4805460ff1916905550506040516370a0823160e01b8152600090612ef690600080516020615ee8833981519152906370a0823190612ea0903090600401615b09565b60206040518083038186803b158015612eb857600080fd5b505afa158015612ecc573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250612ef0919081019061574b565b85614523565b905085811015612f0557600080fd5b60405163a9059cbb60e01b8152600080516020615ee88339815191529063a9059cbb90612f38908b908590600401615c5d565b602060405180830381600087803b158015612f5257600080fd5b505af1158015612f66573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250612f8a91908101906156db565b50876001600160a01b0316896001600160a01b03167f1d66ffd6dc4cc59859af98690da66dab744745de617a1e2d809ae4f9055249088984604051612fd0929190615d91565b60405180910390a35050505061300c565b600080516020615f088339815191523360003660405161300393929190615b9e565b60405180910390a15b5050505050565b600054610100900460ff168061302c575061302c614787565b8061303a575060005460ff16155b61304357600080fd5b600054610100900460ff1615801561306e576000805460ff1961ff0019909116610100171660011790555b61307661478d565b61307e6147f0565b8015613090576000805461ff00191690555b50565b6033546001600160a01b03163314806130bb57503360009081526099602052604090205460ff165b6130d75760405162461bcd60e51b81526004016107b090615d18565b6001600160a01b0381166130ea57600080fd5b60cf80546001600160a01b0319166001600160a01b0392909216919091179055565b60d3602052600090815260409020805460018201546002909201546001600160a01b0390911691906001600160401b0380821691600160401b8104821691600160801b8204811691600160c01b90041686565b6033546001600160a01b031681565b6033546001600160a01b031633148061319657503360009081526099602052604090205460ff165b6131b25760405162461bcd60e51b81526004016107b090615d18565b60d280546001600160a01b0319166001600160a01b0392909216919091179055565b6033546000906001600160a01b03163314806131ff57503360009081526099602052604090205460ff165b61321b5760405162461bcd60e51b81526004016107b090615d18565b60d1546001600160a01b03166132435760405162461bcd60e51b81526004016107b090615d28565b6040516370a0823160e01b815260009073c00e94cb662c3520282e6f5717214004a7f26888906370a082319061327d903090600401615b09565b60206040518083038186803b15801561329557600080fd5b505afa1580156132a9573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052506132cd919081019061574b565b6040805160018082528183019092529192506060919060208083019080388339019050509050735d3a536e4d6dbd6114cc1ead35777bab948e36438160008151811061331557fe5b6001600160a01b03928316602091820292909201015260405163dd0c4d3f60e01b81529088169063dd0c4d3f90613350908490600401615cba565b600060405180830381600087803b15801561336a57600080fd5b505af115801561337e573d6000803e3d6000fd5b50506040516370a0823160e01b81526133bd925073c00e94cb662c3520282e6f5717214004a7f2688891506370a08231906111ee903090600401615b09565b915085156134a45760006133fc73c00e94cb662c3520282e6f5717214004a7f268888473dac17f958d2ee523a2206206994597c13d831ec78a89614854565b905061341d73dac17f958d2ee523a2206206994597c13d831ec7828a614b1d565b60d1549091506134529073dac17f958d2ee523a2206206994597c13d831ec7906001600160a01b03168363ffffffff614b6a16565b6001600160a01b038816600090815260d36020526040902060020180546001600160401b03600160401b808304821685019091160267ffffffffffffffff60401b1990911617905592506136ee915050565b84156135ed576000670de0b6b3a76400006134bf8488614b77565b816134c657fe5b60d25491900491506134fe9073dac17f958d2ee523a2206206994597c13d831ec7906001600160a01b0316308463ffffffff61466616565b60d25460405163a9059cbb60e01b815273c00e94cb662c3520282e6f5717214004a7f268889163a9059cbb91613542916001600160a01b0316908790600401615c5d565b602060405180830381600087803b15801561355c57600080fd5b505af1158015613570573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525061359491908101906156db565b507f855da74d86689b845f6f0732c84e952fc55fcc5b81e077c74696aa606fb99d5242876040516135c6929190615d91565b60405180910390a161341d73dac17f958d2ee523a2206206994597c13d831ec7828a614b1d565b61360c73c00e94cb662c3520282e6f5717214004a7f268888389614b1d565b60d15460405163a9059cbb60e01b815291935073c00e94cb662c3520282e6f5717214004a7f268889163a9059cbb91613655916001600160a01b03909116908690600401615c5d565b602060405180830381600087803b15801561366f57600080fd5b505af1158015613683573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052506136a791908101906156db565b50506001600160a01b038616600090815260d36020526040902060020180546001600160401b0380821664e8d4a510008504011667ffffffffffffffff1990911617905590505b949350505050565b600054610100900460ff168061370f575061370f614787565b8061371d575060005460ff16155b61372657600080fd5b600054610100900460ff16158015613751576000805460ff1961ff0019909116610100171660011790555b600082511161375f57600080fd5b60005b82518110156137825761377a838281518110611d9857fe5b600101613762565b5080156109d8576000805461ff00191690555050565b6033546001600160a01b031633146137af57600080fd5b603480546001600160a01b0319166001600160a01b0392909216919091179055565b33600090815260cd602052604090205460ff166138005760405162461bcd60e51b81526004016107b090615d18565b600060cc600036604051613815929190615ad7565b908152604051908190036020018120546001600160401b036201000090910416915060cc90613848906000903690615ad7565b908152604080516020928190038301902060008481526001909101835281812033825290925290205460ff166138fb57600160cc60003660405161388d929190615ad7565b9081526040805160209281900383018120600086815260019091018452828120338252909352908220805460ff19169315159390931790925560cc916138d591903690615ad7565b908152604051908190036020019020805461ffff8082166001011661ffff199091161790555b600260cc600036604051613910929190615ad7565b9081526040519081900360200190205461ffff16101580613959575060ce5460cc600036604051613942929190615ad7565b9081526040519081900360200190205461ffff1610155b156109ad57600060cc600036604051613973929190615ad7565b908152604051908190036020018120805461ffff9390931661ffff199093169290921790915560cc906139aa906000903690615ad7565b908152604051908190036020019020805460016001600160401b0362010000808404821692909201160269ffffffffffffffff00001990911617905581516139f157600080fd5b60005b8251811015611dad57613a19838281518110613a0c57fe5b6020026020010151614440565b6001016139f4565b73c00e94cb662c3520282e6f5717214004a7f2688881565b73dac17f958d2ee523a2206206994597c13d831ec781565b600054610100900460ff1680613a6a5750613a6a614787565b80613a78575060005460ff16155b613a8157600080fd5b600054610100900460ff16158015613aac576000805460ff1961ff0019909116610100171660011790555b613ab582614bac565b80156109d8576000805461ff00191690555050565b33600090815260cd602052604090205460ff16613af95760405162461bcd60e51b81526004016107b090615d18565b600060cc600036604051613b0e929190615ad7565b908152604051908190036020018120546001600160401b036201000090910416915060cc90613b41906000903690615ad7565b908152604080516020928190038301902060008481526001909101835281812033825290925290205460ff16613bf457600160cc600036604051613b86929190615ad7565b9081526040805160209281900383018120600086815260019091018452828120338252909352908220805460ff19169315159390931790925560cc91613bce91903690615ad7565b908152604051908190036020019020805461ffff8082166001011661ffff199091161790555b600260cc600036604051613c09929190615ad7565b9081526040519081900360200190205461ffff16101580613c52575060ce5460cc600036604051613c3b929190615ad7565b9081526040519081900360200190205461ffff1610155b15613d6657600060cc600036604051613c6c929190615ad7565b908152604051908190036020018120805461ffff9390931661ffff199093169290921790915560cc90613ca3906000903690615ad7565b908152604051908190036020019020805460016001600160401b0362010000808404821692909201160269ffffffffffffffff000019909116179055603354336001600160a01b0390911614613cf857600080fd5b60005b84518161ffff161015613d6057613d58858261ffff1681518110613d1b57fe5b6020026020010151858361ffff1681518110613d3357fe5b6020026020010151858461ffff1681518110613d4b57fe5b6020026020010151614c37565b600101613cfb565b50613d91565b600080516020615f0883398151915233600036604051613d8893929190615b9e565b60405180910390a15b50505050565b60d05481565b60cd6020526000908152604090205460ff1681565b6033546001600160a01b03163314613dc957600080fd5b60005b8251811015613e20578160996000858481518110613de657fe5b6020908102919091018101516001600160a01b03168252810191909152604001600020805460ff1916911515919091179055600101613dcc565b505050565b6034546001600160a01b03163314613e3c57600080fd5b603454603380546001600160a01b0319166001600160a01b03909216919091179055565b600060d45460ff166003811115613e7357fe5b1415613e7e57600080fd5b6000613e8982614c64565b9050613e953086614c6b565b841115613ea157600080fd5b604051636eb1769f60e11b815260001990600080516020615ee88339815191529063dd62ed3e90613ed89030908690600401615b17565b60206040518083038186803b158015613ef057600080fd5b505afa158015613f04573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250613f28919081019061574b565b14613f955760405163095ea7b360e01b8152600080516020615ee88339815191529063095ea7b390613f6290849060001990600401615c5d565b600060405180830381600087803b158015613f7c57600080fd5b505af1158015613f90573d6000803e3d6000fd5b505050505b6000613fa18585614533565b9050600160d45460ff166003811115613fb657fe5b141561414c57603483015160405163a9059cbb60e01b815286820190600080516020615ee88339815191529063a9059cbb90613ff89087908b90600401615c5d565b602060405180830381600087803b15801561401257600080fd5b505af1158015614026573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525061404a91908101906156db565b506040516302d35a5960e01b81526001600160a01b038516906302d35a59906140a390600080516020615ee883398151915290735d3a536e4d6dbd6114cc1ead35777bab948e3643908690839083908b90600401615c03565b600060405180830381600087803b1580156140bd57600080fd5b505af11580156140d1573d6000803e3d6000fd5b50506040516301e3366760e01b81526001600160a01b03871692506301e33667915061411390600080516020615ee88339815191529030908890600401615bda565b600060405180830381600087803b15801561412d57600080fd5b505af1158015614141573d6000803e3d6000fd5b505050505050614399565b600260d45460ff16600381111561415f57fe5b141561421757604051630d6b883f60e21b81526001600160a01b038316906335ae20fc906141bf90600080516020615ee883398151915290735d3a536e4d6dbd6114cc1ead35777bab948e36439060001990839083908390600401615c03565b602060405180830381600087803b1580156141d957600080fd5b505af11580156141ed573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250614211919081019061574b565b50614399565b600360d45460ff16600381111561422a57fe5b14156143995760006142e9735d3a536e4d6dbd6114cc1ead35777bab948e36436001600160a01b031663bd6d894d6040518163ffffffff1660e01b8152600401602060405180830381600087803b15801561428457600080fd5b505af1158015614298573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052506142bc919081019061574b565b61106c670de0b6b3a76400006110606142dc8b600363ffffffff6144e116565b8b9063ffffffff6144cf16565b604051630d6b883f60e21b81529091506001600160a01b038416906335ae20fc9061434490600080516020615ee883398151915290735d3a536e4d6dbd6114cc1ead35777bab948e3643908690839083908e90600401615c03565b602060405180830381600087803b15801561435e57600080fd5b505af1158015614372573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250614396919081019061574b565b50505b6113e78682614d1b565b6033546001600160a01b031633146143ba57600080fd5b6001600160a01b038216614402576033546040516001600160a01b039091169082156108fc029083906000818181858888f19350505050158015611dad573d6000803e3d6000fd5b6033546109d8906001600160a01b0384811691168363ffffffff614b6a16565b60d1546001600160a01b031681565b60cf546001600160a01b031681565b6001600160a01b038116600090815260cd602052604090205460ff1661446557600080fd5b600160ce541161447457600080fd5b6001600160a01b0316600090815260cd60205260409020805460ff1916905560ce8054600019019055565b6000826144ae575060006144c9565b828202828482816144bb57fe5b04146144c657600080fd5b90505b92915050565b6000828201838110156144c657600080fd5b60006144c683836040518060400160405280601a81526020017f536166654d6174683a206469766973696f6e206279207a65726f000000000000815250614daf565b808203828111156144c957600080fd5b808201828110156144c957600080fd5b60006001600160a01b038316158061457757506001600160a01b03831673eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee145b1561458d57506001600160a01b038116316144c9565b6040516370a0823160e01b81526001600160a01b038416906370a08231906145b9908590600401615afb565b60206040518083038186803b1580156145d157600080fd5b505afa1580156145e5573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250614609919081019061574b565b90506144c9565b6001600160a01b038116600090815260cd602052604090205460ff161561463657600080fd5b6001600160a01b0316600090815260cd60205260409020805460ff1916600190811790915560ce80549091019055565b8061467057613d91565b6001600160a01b03841615806146a257506001600160a01b03841673eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee145b1561476c576001600160a01b038316331480156146bf5750803410155b6146db5760405162461bcd60e51b81526004016107b090615cf8565b6001600160a01b0382163014614723576040516001600160a01b0383169082156108fc029083906000818181858888f19350505050158015614721573d6000803e3d6000fd5b505b8034111561476757336108fc61473f348463ffffffff614de616565b6040518115909202916000818181858888f19350505050158015613d60573d6000803e3d6000fd5b613d91565b613d916001600160a01b03851684848463ffffffff614df216565b303b1590565b600054610100900460ff16806147a657506147a6614787565b806147b4575060005460ff16155b6147bd57600080fd5b600054610100900460ff161580156147e8576000805460ff1961ff0019909116610100171660011790555b61307e614e4d565b600054610100900460ff16806148095750614809614787565b80614817575060005460ff16155b61482057600080fd5b600054610100900460ff1615801561484b576000805460ff1961ff0019909116610100171660011790555b61307e33614610565b6000807311111254369792b2ca5d084ab5eea397ca8fa48b9050600019876001600160a01b031663dd62ed3e30846001600160a01b031663e8edc8166040518163ffffffff1660e01b815260040160206040518083038186803b1580156148ba57600080fd5b505afa1580156148ce573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052506148f29190810190615417565b6040518363ffffffff1660e01b815260040161490f929190615b17565b60206040518083038186803b15801561492757600080fd5b505afa15801561493b573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525061495f919081019061574b565b14614a3757866001600160a01b031663095ea7b3826001600160a01b031663e8edc8166040518163ffffffff1660e01b815260040160206040518083038186803b1580156149ac57600080fd5b505afa1580156149c0573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052506149e49190810190615417565b6000196040518363ffffffff1660e01b8152600401614a04929190615c5d565b600060405180830381600087803b158015614a1e57600080fd5b505af1158015614a32573d6000803e3d6000fd5b505050505b6000614a526001600160a01b0389163063ffffffff61454316565b90506000614a6f6001600160a01b0388163063ffffffff61454316565b90506000602060008751602089016000886113885a03f150506000518289614aa66001600160a01b038d163063ffffffff61454316565b011015614ac55760405162461bcd60e51b81526004016107b090615d08565b6000614ae06001600160a01b038a163063ffffffff61454316565b9050878301811015614b045760405162461bcd60e51b81526004016107b090615d48565b614b0e8184614523565b9b9a5050505050505050505050565b60008060648460d0540281614b2e57fe5b0490508015614b5757603354614b57906001600160a01b0387811691168363ffffffff614b6a16565b614b618482614523565b95945050505050565b613d918383836000614ece565b6000670de0b6b3a7640000614b9d614b8f8585614fa8565b6706f05b59d3b20000614533565b81614ba457fe5b049392505050565b600054610100900460ff1680614bc55750614bc5614787565b80614bd3575060005460ff16155b614bdc57600080fd5b600054610100900460ff16158015614c07576000805460ff1961ff0019909116610100171660011790555b603380546001600160a01b0319166001600160a01b03841617905580156109d8576000805461ff00191690555050565b60006020600084516020860185886113885a03f16000519150801560018114614c5f576113e7565b600080fd5b6014015190565b6000614c75614fcc565b6001600160a01b0316826001600160a01b03161415614c9f57506001600160a01b038216316144c9565b6040516370a0823160e01b81526001600160a01b038316906370a0823190614ccb908690600401615afb565b60206040518083038186803b158015614ce357600080fd5b505afa158015614cf7573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052506144c6919081019061574b565b60007324a42fd28c976a61df5d00d0599c34c4f90748c86001600160a01b031663ed6ff7606040518163ffffffff1660e01b815260040160206040518083038186803b158015614d6a57600080fd5b505afa158015614d7e573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250614da29190810190615417565b9050613e20818484614fe4565b60008183614dd05760405162461bcd60e51b81526004016107b09190615ce7565b506000838581614ddc57fe5b0495945050505050565b60006144c68383614de6565b604051613d919085906323b872dd60e01b90614e1690879087908790602401615be8565b60408051601f198184030181529190526020810180516001600160e01b03166001600160e01b0319909316929092179091526150a7565b600054610100900460ff1680614e665750614e66614787565b80614e74575060005460ff16155b614e7d57600080fd5b600054610100900460ff16158015614ea8576000805460ff1961ff0019909116610100171660011790555b603380546001600160a01b031916331790558015613090576000805461ff001916905550565b600082614edd575060016136ee565b6001600160a01b0385161580614f0f57506001600160a01b03851673eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee145b15614f86578115614f46576040516001600160a01b0385169084156108fc029085906000818181858888f1935050505090506136ee565b6040516001600160a01b0385169084156108fc029085906000818181858888f19350505050158015614f7c573d6000803e3d6000fd5b50600190506136ee565b614fa06001600160a01b038616858563ffffffff61515316565b5060016136ee565b6000811580614fc357505080820282828281614fc057fe5b04145b6144c957600080fd5b73eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee90565b614fec614fcc565b6001600160a01b0316826001600160a01b0316141561508d5760008390506000816001600160a01b03168360405161502390615af0565b60006040518083038185875af1925050503d8060008114615060576040519150601f19603f3d011682016040523d82523d6000602084013e615065565b606091505b50509050806150865760405162461bcd60e51b81526004016107b090615d38565b5050613e20565b613e206001600160a01b038316848363ffffffff61515316565b6150b9826001600160a01b0316615175565b6150c257600080fd5b60006060836001600160a01b0316836040516150de9190615ae4565b6000604051808303816000865af19150503d806000811461511b576040519150601f19603f3d011682016040523d82523d6000602084013e615120565b606091505b50915091508161512f57600080fd5b805115613d91578080602001905161514a91908101906156db565b613d9157600080fd5b604051613e2090849063a9059cbb60e01b90614e169086908690602401615c5d565b6000813f7fc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a47081158015906136ee5750141592915050565b80356144c981615ec1565b80516144c981615ec1565b600082601f8301126151d357600080fd5b81356151e66151e182615dc5565b615d9f565b9150818183526020840193506020810190508385602084028201111561520b57600080fd5b60005b83811015615237578161522188826151ac565b845250602092830192919091019060010161520e565b5050505092915050565b600082601f83011261525257600080fd5b81356152606151e182615dc5565b9150818183526020840193506020810190508385602084028201111561528557600080fd5b60005b83811015615237578161529b88826151ac565b8452506020928301929190910190600101615288565b600082601f8301126152c257600080fd5b81356152d06151e182615dc5565b81815260209384019390925082018360005b8381101561523757813586016152f88882615394565b84525060209283019291909101906001016152e2565b600082601f83011261531f57600080fd5b813561532d6151e182615dc5565b9150818183526020840193506020810190508385602084028201111561535257600080fd5b60005b83811015615237578161536888826153e3565b8452506020928301929190910190600101615355565b80356144c981615ed5565b80516144c981615ed5565b600082601f8301126153a557600080fd5b81356153b36151e182615de5565b915080825260208301602083018583830111156153cf57600080fd5b6153da838284615e68565b50505092915050565b80356144c981615ede565b80516144c981615ede565b60006020828403121561540b57600080fd5b60006136ee84846151ac565b60006020828403121561542957600080fd5b60006136ee84846151b7565b6000806000806080858703121561544b57600080fd5b600061545787876151ac565b9450506020615468878288016151ac565b9350506040615479878288016153e3565b925050606061548a878288016153e3565b91505092959194509250565b600080600080600060a086880312156154ae57600080fd5b60006154ba88886151ac565b95505060206154cb888289016151ac565b94505060406154dc888289016153e3565b93505060606154ed888289016153e3565b92505060806154fe888289016153e3565b9150509295509295909350565b6000806040838503121561551e57600080fd5b600061552a85856151ac565b925050602061553b8582860161537e565b9150509250929050565b6000806040838503121561555857600080fd5b600061556485856151ac565b925050602061553b858286016153e3565b6000806000806080858703121561558b57600080fd5b600061559787876151ac565b94505060206155a8878288016153e3565b93505060406155b9878288016153e3565b92505060608501356001600160401b038111156155d557600080fd5b61548a87828801615394565b6000602082840312156155f357600080fd5b81356001600160401b0381111561560957600080fd5b6136ee848285016151c2565b6000806040838503121561562857600080fd5b82356001600160401b0381111561563e57600080fd5b61552a858286016151c2565b60008060006060848603121561565f57600080fd5b83356001600160401b0381111561567557600080fd5b61568186828701615241565b93505060208401356001600160401b0381111561569d57600080fd5b6156a9868287016152b1565b92505060408401356001600160401b038111156156c557600080fd5b6156d18682870161530e565b9150509250925092565b6000602082840312156156ed57600080fd5b60006136ee8484615389565b60006020828403121561570b57600080fd5b81356001600160401b0381111561572157600080fd5b6136ee84828501615394565b60006020828403121561573f57600080fd5b60006136ee84846153e3565b60006020828403121561575d57600080fd5b60006136ee84846153ee565b60008060006060848603121561577e57600080fd5b600061578a86866153e3565b935050602061579b868287016153e3565b92505060406156d1868287016151ac565b60006157b883836157cf565b505060200190565b6157c981615e56565b82525050565b6157c981615e24565b6157c96157e482615e24565b615ea0565b60006157f482615e12565b6157fe8185615e16565b935061580983615e0c565b8060005b8381101561583757815161582188826157ac565b975061582c83615e0c565b92505060010161580d565b509495945050505050565b6157c981615e2f565b60006158578385615e16565b9350615864838584615e68565b61586d83615eb1565b9093019392505050565b60006158838385615e1f565b9350615890838584615e68565b50500190565b60006158a182615e12565b6158ab8185615e16565b93506158bb818560208601615e74565b61586d81615eb1565b60006158cf82615e12565b6158d98185615e1f565b93506158e9818560208601615e74565b9290920192915050565b6157c981615e5d565b6000615909601183615e16565b706d73672e76616c7565206973207a65726f60781b815260200192915050565b6000615936601083615e16565b6f45786368616e6765206572726f72203160801b815260200192915050565b6000615962601183615e16565b7014195c9b5a5cdcda5bdb8819195b9a5959607a1b815260200192915050565b600061598f602883615e16565b7f41646472657373206f662072657761726457616c6c6574206d757374206e6f74815267206265207a65726f60c01b602082015260400192915050565b60006159d9601683615e16565b75151c985b9cd9995c881bd9881155120819985a5b195960521b815260200192915050565b6000615a0b601083615e16565b6f22bc31b430b733b29032b93937b9101960811b815260200192915050565b6000615a37601883615e16565b7f41646472657373206d757374206e6f74206265207a65726f0000000000000000815260200192915050565b60006144c9600083615e1f565b6157c981615e34565b6157c981615e47565b6157c9615a8e82615e47565b615e47565b6157c981615e4a565b6000615aa882846157d8565b50601401919050565b6000615abd82856157d8565b601482019150615acd8284615a82565b5060200192915050565b60006136ee828486615877565b60006121d982846158c4565b60006144c982615a63565b602081016144c982846157cf565b602081016144c982846157c0565b60408101615b2582856157c0565b6121d960208301846157cf565b60608101615b4082866157c0565b615b4d60208301856157c0565b6136ee6040830184615a79565b60808101615b6882876157c0565b615b7560208301866157cf565b615b826040830185615a79565b8181036060830152615b948184615896565b9695505050505050565b60408101615bac82866157c0565b8181036020830152614b6181848661584b565b60408101615bcd82856157c0565b6121d96020830184615a79565b60608101615b4082866157cf565b60608101615bf682866157cf565b615b4d60208301856157cf565b60c08101615c1182896157cf565b615c1e60208301886157cf565b615c2b6040830187615a79565b615c3860608301866157cf565b615c4560808301856157cf565b615c5260a0830184615a79565b979650505050505050565b60408101615bcd82856157cf565b60c08101615c7982896157cf565b615c866020830188615a79565b615c936040830187615a93565b615ca06060830186615a93565b615cad6080830185615a93565b615c5260a0830184615a93565b602080825281016144c681846157e9565b602081016144c98284615842565b602081016144c982846158f3565b602080825281016144c68184615896565b602080825281016144c9816158fc565b602080825281016144c981615929565b602080825281016144c981615955565b602080825281016144c981615982565b602080825281016144c9816159cc565b602080825281016144c9816159fe565b602080825281016144c981615a2a565b60408101615d768285615a70565b6121d96020830184615a93565b602081016144c98284615a79565b60408101615bcd8285615a79565b6040518181016001600160401b0381118282101715615dbd57600080fd5b604052919050565b60006001600160401b03821115615ddb57600080fd5b5060209081020190565b60006001600160401b03821115615dfb57600080fd5b506020601f91909101601f19160190565b60200190565b5190565b90815260200190565b919050565b60006144c982615e3b565b151590565b61ffff1690565b6001600160a01b031690565b90565b6001600160401b031690565b60006144c9825b60006144c982615e24565b82818337506000910152565b60005b83811015615e8f578181015183820152602001615e77565b83811115613d915750506000910152565b60006144c98260006144c982615ebb565b601f01601f191690565b60601b90565b615eca81615e24565b811461309057600080fd5b615eca81615e2f565b615eca81615e4756fe0000000000000000000000006b175474e89094c44da98b954eedeac495271d0fdfcfb5e25d61e13410c59c6087810407824cbdf17e25c145cfb55560acca9aa0a365627a7a723158201abc07de78abf7fd8cc19004160c96eb2d1bedc83a27e9173131adee7a8ecf906c6578706572696d656e74616cf564736f6c63430005110040

Deployed Bytecode

0x6080604052600436106102515760003560e01c80638129fc1c11610139578063c1892058116100b6578063eb21d9c41161007a578063eb21d9c4146106a0578063ebbc4965146106c0578063ee872558146106d5578063f3fef3a3146106f5578063fb75b2c714610715578063fc6019551461072a57610251565b8063c189205814610623578063c4d66de814610638578063cb9d122314610658578063ddca3f431461066b578063e9bca3241461068057610251565b80639f6a18cf116100fd5780639f6a18cf1461058e578063a224cee7146105ae578063a6f9dae1146105ce578063a9a5e3af146105ee578063b2b8b7dc1461060e57610251565b80638129fc1c146104f2578063899b8bcd1461050757806389b08f11146105275780638da5cb5b146105595780639aba1ce01461056e57610251565b80635958621e116101d25780636c46a2c5116101965780636c46a2c5146104325780636ddc6322146104525780636ded3d76146104725780637065cb481461049257806375f3974b146104b257806377deeef2146104d257610251565b80635958621e146103a85780635f82c67e146103c85780636568a279146103dd5780636a1db1bf146103fd5780636a51b63d1461041d57610251565b806324308b0a1161021957806324308b0a146103035780632a4c0a1a146103185780632a53ecf91461032d578063429b62e51461034d5780634d0415141461037a57610251565b80630531b2ad14610253578063067369461461027e57806311b2e10e146102a0578063173825d9146102b55780632072cdd1146102d5575b005b34801561025f57600080fd5b5061026861074c565b6040516102759190615afb565b60405180910390f35b34801561028a57600080fd5b50610293610764565b6040516102759190615d83565b3480156102ac57600080fd5b50610268610769565b3480156102c157600080fd5b506102516102d03660046153f9565b610781565b3480156102e157600080fd5b506102f56102f03660046156f9565b6109dc565b604051610275929190615d68565b34801561030f57600080fd5b50610268610a0e565b34801561032457600080fd5b50610268610a1d565b34801561033957600080fd5b50610251610348366004615496565b610a2f565b34801561035957600080fd5b5061036d6103683660046153f9565b6113ef565b6040516102759190615ccb565b34801561038657600080fd5b5061039a6103953660046153f9565b611404565b604051610275929190615d91565b3480156103b457600080fd5b506102516103c33660046153f9565b61162e565b3480156103d457600080fd5b50610268611889565b3480156103e957600080fd5b506102516103f83660046155e1565b6118a1565b34801561040957600080fd5b5061025161041836600461572d565b611912565b34801561042957600080fd5b50610293611b57565b34801561043e57600080fd5b5061025161044d3660046155e1565b611b5d565b34801561045e57600080fd5b5061026861046d366004615769565b611db3565b34801561047e57600080fd5b5061026861048d366004615769565b6121e0565b34801561049e57600080fd5b506102516104ad3660046153f9565b61276c565b3480156104be57600080fd5b506102516104cd36600461550b565b61298a565b3480156104de57600080fd5b506102516104ed366004615435565b6129cc565b3480156104fe57600080fd5b50610251613013565b34801561051357600080fd5b506102516105223660046153f9565b613093565b34801561053357600080fd5b506105476105423660046153f9565b61310c565b60405161027596959493929190615c6b565b34801561056557600080fd5b5061026861315f565b34801561057a57600080fd5b506102516105893660046153f9565b61316e565b34801561059a57600080fd5b506102936105a9366004615575565b6131d4565b3480156105ba57600080fd5b506102516105c93660046155e1565b6136f6565b3480156105da57600080fd5b506102516105e93660046153f9565b613798565b3480156105fa57600080fd5b506102516106093660046155e1565b6137d1565b34801561061a57600080fd5b50610268613a21565b34801561062f57600080fd5b50610268613a39565b34801561064457600080fd5b506102516106533660046153f9565b613a51565b61025161066636600461564a565b613aca565b34801561067757600080fd5b50610293613d97565b34801561068c57600080fd5b5061036d61069b3660046153f9565b613d9d565b3480156106ac57600080fd5b506102516106bb366004615615565b613db2565b3480156106cc57600080fd5b50610251613e25565b3480156106e157600080fd5b506102516106f0366004615575565b613e60565b34801561070157600080fd5b50610251610710366004615545565b6143a3565b34801561072157600080fd5b50610268614422565b34801561073657600080fd5b5061073f614431565b6040516102759190615cd9565b735d3a536e4d6dbd6114cc1ead35777bab948e364381565b600281565b7324a42fd28c976a61df5d00d0599c34c4f90748c881565b33600090815260cd602052604090205460ff166107b95760405162461bcd60e51b81526004016107b090615d18565b60405180910390fd5b600060cc6000366040516107ce929190615ad7565b908152604051908190036020018120546001600160401b036201000090910416915060cc90610801906000903690615ad7565b908152604080516020928190038301902060008481526001909101835281812033825290925290205460ff166108b457600160cc600036604051610846929190615ad7565b9081526040805160209281900383018120600086815260019091018452828120338252909352908220805460ff19169315159390931790925560cc9161088e91903690615ad7565b908152604051908190036020019020805461ffff8082166001011661ffff199091161790555b600260cc6000366040516108c9929190615ad7565b9081526040519081900360200190205461ffff16101580610912575060ce5460cc6000366040516108fb929190615ad7565b9081526040519081900360200190205461ffff1610155b156109ad57600060cc60003660405161092c929190615ad7565b908152604051908190036020018120805461ffff9390931661ffff199093169290921790915560cc90610963906000903690615ad7565b908152604051908190036020019020805460016001600160401b0362010000808404821692909201160269ffffffffffffffff0000199091161790556109a882614440565b6109d8565b600080516020615f08833981519152336000366040516109cf93929190615b9e565b60405180910390a15b5050565b805160208183018101805160cc8252928201919093012091525461ffff8116906201000090046001600160401b031682565b60d2546001600160a01b031681565b600080516020615ee883398151915281565b6040516370a0823160e01b8152600090600080516020615ee8833981519152906370a0823190610a63903090600401615b09565b60206040518083038186803b158015610a7b57600080fd5b505afa158015610a8f573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250610ab3919081019061574b565b33600090815260cd602052604090205490915060ff16610ae55760405162461bcd60e51b81526004016107b090615d18565b600060cc600036604051610afa929190615ad7565b908152604051908190036020018120546001600160401b036201000090910416915060cc90610b2d906000903690615ad7565b908152604080516020928190038301902060008481526001909101835281812033825290925290205460ff16610be057600160cc600036604051610b72929190615ad7565b9081526040805160209281900383018120600086815260019091018452828120338252909352908220805460ff19169315159390931790925560cc91610bba91903690615ad7565b908152604051908190036020019020805461ffff8082166001011661ffff199091161790555b600260cc600036604051610bf5929190615ad7565b9081526040519081900360200190205461ffff16101580610c3e575060ce5460cc600036604051610c27929190615ad7565b9081526040519081900360200190205461ffff1610155b1561132d57600060cc600036604051610c58929190615ad7565b908152604051908190036020018120805461ffff9390931661ffff199093169290921790915560cc90610c8f906000903690615ad7565b908152604051908190036020019020805460016001600160401b0362010000808404821692909201160269ffffffffffffffff0000199091161790556001600160a01b038616610cde57600080fd5b6040516370a0823160e01b8152600090600080516020615ee8833981519152906370a0823190610d12903090600401615b09565b60206040518083038186803b158015610d2a57600080fd5b505afa158015610d3e573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250610d62919081019061574b565b90508315610df3576040516323b872dd60e01b8152600080516020615ee8833981519152906323b872dd90610d9f90339030908990600401615b32565b602060405180830381600087803b158015610db957600080fd5b505af1158015610dcd573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250610df191908101906156db565b505b604051636eb1769f60e11b815260001990600080516020615ee88339815191529063dd62ed3e90610e2a9030908d90600401615b17565b60206040518083038186803b158015610e4257600080fd5b505afa158015610e56573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250610e7a919081019061574b565b14610ee75760405163095ea7b360e01b8152600080516020615ee88339815191529063095ea7b390610eb4908b9060001990600401615c5d565b600060405180830381600087803b158015610ece57600080fd5b505af1158015610ee2573d6000803e3d6000fd5b505050505b600019861415610fa357604051630d6b883f60e21b81526001600160a01b038916906335ae20fc90610f4b90600080516020615ee883398151915290735d3a536e4d6dbd6114cc1ead35777bab948e36439060001990839083908390600401615c03565b602060405180830381600087803b158015610f6557600080fd5b505af1158015610f79573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250610f9d919081019061574b565b50611129565b6000610fb687600363ffffffff61449f16565b90506000611078735d3a536e4d6dbd6114cc1ead35777bab948e36436001600160a01b031663bd6d894d6040518163ffffffff1660e01b8152600401602060405180830381600087803b15801561100c57600080fd5b505af1158015611020573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250611044919081019061574b565b61106c670de0b6b3a7640000611060868d63ffffffff6144cf16565b9063ffffffff61449f16565b9063ffffffff6144e116565b604051630d6b883f60e21b81529091506001600160a01b038b16906335ae20fc906110d390600080516020615ee883398151915290735d3a536e4d6dbd6114cc1ead35777bab948e3643908690839083908a90600401615c03565b602060405180830381600087803b1580156110ed57600080fd5b505af1158015611101573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250611125919081019061574b565b5050505b83156111b65760405163a9059cbb60e01b8152600080516020615ee88339815191529063a9059cbb906111629033908890600401615bbf565b602060405180830381600087803b15801561117c57600080fd5b505af1158015611190573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052506111b491908101906156db565b505b6040516370a0823160e01b815260009061124490600080516020615ee8833981519152906370a08231906111ee903090600401615b09565b60206040518083038186803b15801561120657600080fd5b505afa15801561121a573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525061123e919081019061574b565b83614523565b90508581101561125357600080fd5b60405163a9059cbb60e01b8152600080516020615ee88339815191529063a9059cbb90611286908b908590600401615c5d565b602060405180830381600087803b1580156112a057600080fd5b505af11580156112b4573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052506112d891908101906156db565b50876001600160a01b0316896001600160a01b03167f1d66ffd6dc4cc59859af98690da66dab744745de617a1e2d809ae4f905524908898460405161131e929190615d91565b60405180910390a35050611358565b600080516020615f088339815191523360003660405161134f93929190615b9e565b60405180910390a15b506040516370a0823160e01b81528190600080516020615ee8833981519152906370a082319061138c903090600401615b09565b60206040518083038186803b1580156113a457600080fd5b505afa1580156113b8573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052506113dc919081019061574b565b10156113e757600080fd5b505050505050565b60996020526000908152604090205460ff1681565b6040516370a0823160e01b81526000908190733d9819210a31b4961b30ef54be2aed79b9c9cd3b9073c00e94cb662c3520282e6f5717214004a7f268889081906370a0823190611458908890600401615afb565b60206040518083038186803b15801561147057600080fd5b505afa158015611484573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052506114a8919081019061574b565b6040516374d7814960e11b81529094506001600160a01b0383169063e9af0292906114d7908890600401615afb565b600060405180830381600087803b1580156114f157600080fd5b505af1158015611505573d6000803e3d6000fd5b50506040516370a0823160e01b8152600092506001600160a01b03841691506370a0823190611538908990600401615afb565b60206040518083038186803b15801561155057600080fd5b505afa158015611564573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250611588919081019061574b565b90506000836001600160a01b031663cc7ebdc4886040518263ffffffff1660e01b81526004016115b89190615afb565b60206040518083038186803b1580156115d057600080fd5b505afa1580156115e4573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250611608919081019061574b565b905060006116168284614533565b90506116228188614523565b95505050505050915091565b33600090815260cd602052604090205460ff1661165d5760405162461bcd60e51b81526004016107b090615d18565b600060cc600036604051611672929190615ad7565b908152604051908190036020018120546001600160401b036201000090910416915060cc906116a5906000903690615ad7565b908152604080516020928190038301902060008481526001909101835281812033825290925290205460ff1661175857600160cc6000366040516116ea929190615ad7565b9081526040805160209281900383018120600086815260019091018452828120338252909352908220805460ff19169315159390931790925560cc9161173291903690615ad7565b908152604051908190036020019020805461ffff8082166001011661ffff199091161790555b600260cc60003660405161176d929190615ad7565b9081526040519081900360200190205461ffff161015806117b6575060ce5460cc60003660405161179f929190615ad7565b9081526040519081900360200190205461ffff1610155b156109ad57600060cc6000366040516117d0929190615ad7565b908152604051908190036020018120805461ffff9390931661ffff199093169290921790915560cc90611807906000903690615ad7565b908152604051908190036020019020805460016001600160401b0362010000808404821692909201160269ffffffffffffffff0000199091161790556001600160a01b0382166118695760405162461bcd60e51b81526004016107b090615d58565b60d180546001600160a01b0319166001600160a01b0384161790556109d8565b733d9819210a31b4961b30ef54be2aed79b9c9cd3b81565b6033546001600160a01b031633146118b857600080fd5b60005b81518110156109d85761190a8282815181106118d357fe5b6020026020010151610710308585815181106118eb57fe5b60200260200101516001600160a01b031661454390919063ffffffff16565b6001016118bb565b33600090815260cd602052604090205460ff166119415760405162461bcd60e51b81526004016107b090615d18565b600060cc600036604051611956929190615ad7565b908152604051908190036020018120546001600160401b036201000090910416915060cc90611989906000903690615ad7565b908152604080516020928190038301902060008481526001909101835281812033825290925290205460ff16611a3c57600160cc6000366040516119ce929190615ad7565b9081526040805160209281900383018120600086815260019091018452828120338252909352908220805460ff19169315159390931790925560cc91611a1691903690615ad7565b908152604051908190036020019020805461ffff8082166001011661ffff199091161790555b600260cc600036604051611a51929190615ad7565b9081526040519081900360200190205461ffff16101580611a9a575060ce5460cc600036604051611a83929190615ad7565b9081526040519081900360200190205461ffff1610155b156109ad57600060cc600036604051611ab4929190615ad7565b908152604051908190036020018120805461ffff9390931661ffff199093169290921790915560cc90611aeb906000903690615ad7565b908152604051908190036020019020805460016001600160401b0362010000808404821692909201160269ffffffffffffffff000019909116179055603354336001600160a01b0390911614611b4057600080fd5b60648210611b4d57600080fd5b60d08290556109d8565b60ce5481565b33600090815260cd602052604090205460ff16611b8c5760405162461bcd60e51b81526004016107b090615d18565b600060cc600036604051611ba1929190615ad7565b908152604051908190036020018120546001600160401b036201000090910416915060cc90611bd4906000903690615ad7565b908152604080516020928190038301902060008481526001909101835281812033825290925290205460ff16611c8757600160cc600036604051611c19929190615ad7565b9081526040805160209281900383018120600086815260019091018452828120338252909352908220805460ff19169315159390931790925560cc91611c6191903690615ad7565b908152604051908190036020019020805461ffff8082166001011661ffff199091161790555b600260cc600036604051611c9c929190615ad7565b9081526040519081900360200190205461ffff16101580611ce5575060ce5460cc600036604051611cce929190615ad7565b9081526040519081900360200190205461ffff1610155b156109ad57600060cc600036604051611cff929190615ad7565b908152604051908190036020018120805461ffff9390931661ffff199093169290921790915560cc90611d36906000903690615ad7565b908152604051908190036020019020805460016001600160401b0362010000808404821692909201160269ffffffffffffffff0000199091161790558151611d7d57600080fd5b60005b8251811015611dad57611da5838281518110611d9857fe5b6020026020010151614610565b600101611d80565b506109d8565b60006001600160a01b038216611fd65760cf60009054906101000a90046001600160a01b03166001600160a01b031663069b6cac6040518163ffffffff1660e01b8152600401602060405180830381600087803b158015611e1357600080fd5b505af1158015611e27573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250611e4b9190810190615417565b60405163095ea7b360e01b8152909250600080516020615ee88339815191529063095ea7b390611e8390859060001990600401615c5d565b600060405180830381600087803b158015611e9d57600080fd5b505af1158015611eb1573d6000803e3d6000fd5b50506040805160c08101825233815260208082018981526000838501818152606085018281526080860183815260a087018481526001600160a01b038d811680875260d3909852948990209751885495166001600160a01b0319909516949094178755935160018701559051600290950180549151935192516001600160401b03908116600160c01b026001600160c01b03948216600160801b0267ffffffffffffffff60801b19968316600160401b0267ffffffffffffffff60401b199990931667ffffffffffffffff199095169490941797909716179390931617169290921790915590519092507fb65a69d3cf00ac7e6e4c1faca98de3519940db7b75770d171e5164211a9674349150611fc9908790615d83565b60405180910390a261207b565b6001600160a01b03828116600090815260d36020526040902054163314611ffc57600080fd5b6001600160a01b038216600090815260d360205260409020600101546120229085614533565b6001600160a01b038316600081815260d36020526040908190206001019290925590517f23b30c811c0afa7005aecbb581a3a5bbd8fcb7feddcf8bcd5e2156ec62bbbbd490612072908790615d83565b60405180910390a25b61209b600080516020615ee883398151915233848763ffffffff61466616565b60007324a42fd28c976a61df5d00d0599c34c4f90748c86001600160a01b0316630261bf8b6040518163ffffffff1660e01b815260040160206040518083038186803b1580156120ea57600080fd5b505afa1580156120fe573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052506121229190810190615417565b60d4805491925060019160ff191682800217905550806001600160a01b0316635cffe9de30600080516020615ee883398151915287878a60405160200161216a929190615ab1565b6040516020818303038152906040526040518563ffffffff1660e01b81526004016121989493929190615b5a565b600060405180830381600087803b1580156121b257600080fd5b505af11580156121c6573d6000803e3d6000fd5b505060d4805460ff191690555083925050505b9392505050565b6040516370a0823160e01b81526000908190600080516020615ee8833981519152906370a0823190612216903090600401615b09565b60206040518083038186803b15801561222e57600080fd5b505afa158015612242573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250612266919081019061574b565b90506001600160a01b0383166124895760cf60009054906101000a90046001600160a01b03166001600160a01b031663069b6cac6040518163ffffffff1660e01b8152600401602060405180830381600087803b1580156122c657600080fd5b505af11580156122da573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052506122fe9190810190615417565b60405163095ea7b360e01b8152909350600080516020615ee88339815191529063095ea7b39061233690869060001990600401615c5d565b600060405180830381600087803b15801561235057600080fd5b505af1158015612364573d6000803e3d6000fd5b50506040805160c08101825233815260208082018a81526000838501818152606085018281526080860183815260a087018481526001600160a01b038e811680875260d3909852948990209751885495166001600160a01b0319909516949094178755935160018701559051600290950180549151935192516001600160401b03908116600160c01b026001600160c01b03948216600160801b0267ffffffffffffffff60801b19968316600160401b0267ffffffffffffffff60401b199990931667ffffffffffffffff199095169490941797909716179390931617169290921790915590519092507fb65a69d3cf00ac7e6e4c1faca98de3519940db7b75770d171e5164211a967434915061247c908890615d83565b60405180910390a261252e565b6001600160a01b03838116600090815260d360205260409020541633146124af57600080fd5b6001600160a01b038316600090815260d360205260409020600101546124d59086614533565b6001600160a01b038416600081815260d36020526040908190206001019290925590517f23b30c811c0afa7005aecbb581a3a5bbd8fcb7feddcf8bcd5e2156ec62bbbbd490612525908890615d83565b60405180910390a25b61254e600080516020615ee883398151915233308863ffffffff61466616565b60405163a9059cbb60e01b815284860190600080516020615ee88339815191529063a9059cbb906125859087908590600401615c5d565b602060405180830381600087803b15801561259f57600080fd5b505af11580156125b3573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052506125d791908101906156db565b506040516302d35a5960e01b81526001600160a01b038516906302d35a599061263090600080516020615ee883398151915290735d3a536e4d6dbd6114cc1ead35777bab948e3643908690839083908d90600401615c03565b600060405180830381600087803b15801561264a57600080fd5b505af115801561265e573d6000803e3d6000fd5b50506040516301e3366760e01b81526001600160a01b03871692506301e3366791506126a090600080516020615ee88339815191529030908a90600401615bda565b600060405180830381600087803b1580156126ba57600080fd5b505af11580156126ce573d6000803e3d6000fd5b50505050839250506040516370a0823160e01b81528190600080516020615ee8833981519152906370a0823190612709903090600401615b09565b60206040518083038186803b15801561272157600080fd5b505afa158015612735573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250612759919081019061574b565b101561276457600080fd5b509392505050565b33600090815260cd602052604090205460ff1661279b5760405162461bcd60e51b81526004016107b090615d18565b600060cc6000366040516127b0929190615ad7565b908152604051908190036020018120546001600160401b036201000090910416915060cc906127e3906000903690615ad7565b908152604080516020928190038301902060008481526001909101835281812033825290925290205460ff1661289657600160cc600036604051612828929190615ad7565b9081526040805160209281900383018120600086815260019091018452828120338252909352908220805460ff19169315159390931790925560cc9161287091903690615ad7565b908152604051908190036020019020805461ffff8082166001011661ffff199091161790555b600260cc6000366040516128ab929190615ad7565b9081526040519081900360200190205461ffff161015806128f4575060ce5460cc6000366040516128dd929190615ad7565b9081526040519081900360200190205461ffff1610155b156109ad57600060cc60003660405161290e929190615ad7565b908152604051908190036020018120805461ffff9390931661ffff199093169290921790915560cc90612945906000903690615ad7565b908152604051908190036020019020805460016001600160401b0362010000808404821692909201160269ffffffffffffffff0000199091161790556109a882614610565b6033546001600160a01b031633146129a157600080fd5b6001600160a01b03919091166000908152609960205260409020805460ff1916911515919091179055565b33600090815260cd602052604090205460ff166129fb5760405162461bcd60e51b81526004016107b090615d18565b600060cc600036604051612a10929190615ad7565b908152604051908190036020018120546001600160401b036201000090910416915060cc90612a43906000903690615ad7565b908152604080516020928190038301902060008481526001909101835281812033825290925290205460ff16612af657600160cc600036604051612a88929190615ad7565b9081526040805160209281900383018120600086815260019091018452828120338252909352908220805460ff19169315159390931790925560cc91612ad091903690615ad7565b908152604051908190036020019020805461ffff8082166001011661ffff199091161790555b600260cc600036604051612b0b929190615ad7565b9081526040519081900360200190205461ffff16101580612b54575060ce5460cc600036604051612b3d929190615ad7565b9081526040519081900360200190205461ffff1610155b15612fe157600060cc600036604051612b6e929190615ad7565b908152604051908190036020018120805461ffff9390931661ffff199093169290921790915560cc90612ba5906000903690615ad7565b908152604051908190036020019020805460016001600160401b0362010000808404821692909201160269ffffffffffffffff0000199091161790556001600160a01b038416612bf457600080fd5b6040516370a0823160e01b8152600090600080516020615ee8833981519152906370a0823190612c28903090600401615b09565b60206040518083038186803b158015612c4057600080fd5b505afa158015612c54573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250612c78919081019061574b565b905060007324a42fd28c976a61df5d00d0599c34c4f90748c86001600160a01b0316630261bf8b6040518163ffffffff1660e01b815260040160206040518083038186803b158015612cc957600080fd5b505afa158015612cdd573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250612d019190810190615417565b90506000600019861415612dac576040516305eff7ef60e21b8152735d3a536e4d6dbd6114cc1ead35777bab948e3643906317bfdfbc90612d46908b90600401615afb565b602060405180830381600087803b158015612d6057600080fd5b505af1158015612d74573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250612d98919081019061574b565b60d4805460ff191660021790559050612dcd565b612dbd86600363ffffffff61449f16565b60d4805460ff1916600317905590505b816001600160a01b0316635cffe9de30600080516020615ee8833981519152848c604051602001612dfe9190615a9c565b6040516020818303038152906040526040518563ffffffff1660e01b8152600401612e2c9493929190615b5a565b600060405180830381600087803b158015612e4657600080fd5b505af1158015612e5a573d6000803e3d6000fd5b505060d4805460ff1916905550506040516370a0823160e01b8152600090612ef690600080516020615ee8833981519152906370a0823190612ea0903090600401615b09565b60206040518083038186803b158015612eb857600080fd5b505afa158015612ecc573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250612ef0919081019061574b565b85614523565b905085811015612f0557600080fd5b60405163a9059cbb60e01b8152600080516020615ee88339815191529063a9059cbb90612f38908b908590600401615c5d565b602060405180830381600087803b158015612f5257600080fd5b505af1158015612f66573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250612f8a91908101906156db565b50876001600160a01b0316896001600160a01b03167f1d66ffd6dc4cc59859af98690da66dab744745de617a1e2d809ae4f9055249088984604051612fd0929190615d91565b60405180910390a35050505061300c565b600080516020615f088339815191523360003660405161300393929190615b9e565b60405180910390a15b5050505050565b600054610100900460ff168061302c575061302c614787565b8061303a575060005460ff16155b61304357600080fd5b600054610100900460ff1615801561306e576000805460ff1961ff0019909116610100171660011790555b61307661478d565b61307e6147f0565b8015613090576000805461ff00191690555b50565b6033546001600160a01b03163314806130bb57503360009081526099602052604090205460ff165b6130d75760405162461bcd60e51b81526004016107b090615d18565b6001600160a01b0381166130ea57600080fd5b60cf80546001600160a01b0319166001600160a01b0392909216919091179055565b60d3602052600090815260409020805460018201546002909201546001600160a01b0390911691906001600160401b0380821691600160401b8104821691600160801b8204811691600160c01b90041686565b6033546001600160a01b031681565b6033546001600160a01b031633148061319657503360009081526099602052604090205460ff165b6131b25760405162461bcd60e51b81526004016107b090615d18565b60d280546001600160a01b0319166001600160a01b0392909216919091179055565b6033546000906001600160a01b03163314806131ff57503360009081526099602052604090205460ff165b61321b5760405162461bcd60e51b81526004016107b090615d18565b60d1546001600160a01b03166132435760405162461bcd60e51b81526004016107b090615d28565b6040516370a0823160e01b815260009073c00e94cb662c3520282e6f5717214004a7f26888906370a082319061327d903090600401615b09565b60206040518083038186803b15801561329557600080fd5b505afa1580156132a9573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052506132cd919081019061574b565b6040805160018082528183019092529192506060919060208083019080388339019050509050735d3a536e4d6dbd6114cc1ead35777bab948e36438160008151811061331557fe5b6001600160a01b03928316602091820292909201015260405163dd0c4d3f60e01b81529088169063dd0c4d3f90613350908490600401615cba565b600060405180830381600087803b15801561336a57600080fd5b505af115801561337e573d6000803e3d6000fd5b50506040516370a0823160e01b81526133bd925073c00e94cb662c3520282e6f5717214004a7f2688891506370a08231906111ee903090600401615b09565b915085156134a45760006133fc73c00e94cb662c3520282e6f5717214004a7f268888473dac17f958d2ee523a2206206994597c13d831ec78a89614854565b905061341d73dac17f958d2ee523a2206206994597c13d831ec7828a614b1d565b60d1549091506134529073dac17f958d2ee523a2206206994597c13d831ec7906001600160a01b03168363ffffffff614b6a16565b6001600160a01b038816600090815260d36020526040902060020180546001600160401b03600160401b808304821685019091160267ffffffffffffffff60401b1990911617905592506136ee915050565b84156135ed576000670de0b6b3a76400006134bf8488614b77565b816134c657fe5b60d25491900491506134fe9073dac17f958d2ee523a2206206994597c13d831ec7906001600160a01b0316308463ffffffff61466616565b60d25460405163a9059cbb60e01b815273c00e94cb662c3520282e6f5717214004a7f268889163a9059cbb91613542916001600160a01b0316908790600401615c5d565b602060405180830381600087803b15801561355c57600080fd5b505af1158015613570573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525061359491908101906156db565b507f855da74d86689b845f6f0732c84e952fc55fcc5b81e077c74696aa606fb99d5242876040516135c6929190615d91565b60405180910390a161341d73dac17f958d2ee523a2206206994597c13d831ec7828a614b1d565b61360c73c00e94cb662c3520282e6f5717214004a7f268888389614b1d565b60d15460405163a9059cbb60e01b815291935073c00e94cb662c3520282e6f5717214004a7f268889163a9059cbb91613655916001600160a01b03909116908690600401615c5d565b602060405180830381600087803b15801561366f57600080fd5b505af1158015613683573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052506136a791908101906156db565b50506001600160a01b038616600090815260d36020526040902060020180546001600160401b0380821664e8d4a510008504011667ffffffffffffffff1990911617905590505b949350505050565b600054610100900460ff168061370f575061370f614787565b8061371d575060005460ff16155b61372657600080fd5b600054610100900460ff16158015613751576000805460ff1961ff0019909116610100171660011790555b600082511161375f57600080fd5b60005b82518110156137825761377a838281518110611d9857fe5b600101613762565b5080156109d8576000805461ff00191690555050565b6033546001600160a01b031633146137af57600080fd5b603480546001600160a01b0319166001600160a01b0392909216919091179055565b33600090815260cd602052604090205460ff166138005760405162461bcd60e51b81526004016107b090615d18565b600060cc600036604051613815929190615ad7565b908152604051908190036020018120546001600160401b036201000090910416915060cc90613848906000903690615ad7565b908152604080516020928190038301902060008481526001909101835281812033825290925290205460ff166138fb57600160cc60003660405161388d929190615ad7565b9081526040805160209281900383018120600086815260019091018452828120338252909352908220805460ff19169315159390931790925560cc916138d591903690615ad7565b908152604051908190036020019020805461ffff8082166001011661ffff199091161790555b600260cc600036604051613910929190615ad7565b9081526040519081900360200190205461ffff16101580613959575060ce5460cc600036604051613942929190615ad7565b9081526040519081900360200190205461ffff1610155b156109ad57600060cc600036604051613973929190615ad7565b908152604051908190036020018120805461ffff9390931661ffff199093169290921790915560cc906139aa906000903690615ad7565b908152604051908190036020019020805460016001600160401b0362010000808404821692909201160269ffffffffffffffff00001990911617905581516139f157600080fd5b60005b8251811015611dad57613a19838281518110613a0c57fe5b6020026020010151614440565b6001016139f4565b73c00e94cb662c3520282e6f5717214004a7f2688881565b73dac17f958d2ee523a2206206994597c13d831ec781565b600054610100900460ff1680613a6a5750613a6a614787565b80613a78575060005460ff16155b613a8157600080fd5b600054610100900460ff16158015613aac576000805460ff1961ff0019909116610100171660011790555b613ab582614bac565b80156109d8576000805461ff00191690555050565b33600090815260cd602052604090205460ff16613af95760405162461bcd60e51b81526004016107b090615d18565b600060cc600036604051613b0e929190615ad7565b908152604051908190036020018120546001600160401b036201000090910416915060cc90613b41906000903690615ad7565b908152604080516020928190038301902060008481526001909101835281812033825290925290205460ff16613bf457600160cc600036604051613b86929190615ad7565b9081526040805160209281900383018120600086815260019091018452828120338252909352908220805460ff19169315159390931790925560cc91613bce91903690615ad7565b908152604051908190036020019020805461ffff8082166001011661ffff199091161790555b600260cc600036604051613c09929190615ad7565b9081526040519081900360200190205461ffff16101580613c52575060ce5460cc600036604051613c3b929190615ad7565b9081526040519081900360200190205461ffff1610155b15613d6657600060cc600036604051613c6c929190615ad7565b908152604051908190036020018120805461ffff9390931661ffff199093169290921790915560cc90613ca3906000903690615ad7565b908152604051908190036020019020805460016001600160401b0362010000808404821692909201160269ffffffffffffffff000019909116179055603354336001600160a01b0390911614613cf857600080fd5b60005b84518161ffff161015613d6057613d58858261ffff1681518110613d1b57fe5b6020026020010151858361ffff1681518110613d3357fe5b6020026020010151858461ffff1681518110613d4b57fe5b6020026020010151614c37565b600101613cfb565b50613d91565b600080516020615f0883398151915233600036604051613d8893929190615b9e565b60405180910390a15b50505050565b60d05481565b60cd6020526000908152604090205460ff1681565b6033546001600160a01b03163314613dc957600080fd5b60005b8251811015613e20578160996000858481518110613de657fe5b6020908102919091018101516001600160a01b03168252810191909152604001600020805460ff1916911515919091179055600101613dcc565b505050565b6034546001600160a01b03163314613e3c57600080fd5b603454603380546001600160a01b0319166001600160a01b03909216919091179055565b600060d45460ff166003811115613e7357fe5b1415613e7e57600080fd5b6000613e8982614c64565b9050613e953086614c6b565b841115613ea157600080fd5b604051636eb1769f60e11b815260001990600080516020615ee88339815191529063dd62ed3e90613ed89030908690600401615b17565b60206040518083038186803b158015613ef057600080fd5b505afa158015613f04573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250613f28919081019061574b565b14613f955760405163095ea7b360e01b8152600080516020615ee88339815191529063095ea7b390613f6290849060001990600401615c5d565b600060405180830381600087803b158015613f7c57600080fd5b505af1158015613f90573d6000803e3d6000fd5b505050505b6000613fa18585614533565b9050600160d45460ff166003811115613fb657fe5b141561414c57603483015160405163a9059cbb60e01b815286820190600080516020615ee88339815191529063a9059cbb90613ff89087908b90600401615c5d565b602060405180830381600087803b15801561401257600080fd5b505af1158015614026573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525061404a91908101906156db565b506040516302d35a5960e01b81526001600160a01b038516906302d35a59906140a390600080516020615ee883398151915290735d3a536e4d6dbd6114cc1ead35777bab948e3643908690839083908b90600401615c03565b600060405180830381600087803b1580156140bd57600080fd5b505af11580156140d1573d6000803e3d6000fd5b50506040516301e3366760e01b81526001600160a01b03871692506301e33667915061411390600080516020615ee88339815191529030908890600401615bda565b600060405180830381600087803b15801561412d57600080fd5b505af1158015614141573d6000803e3d6000fd5b505050505050614399565b600260d45460ff16600381111561415f57fe5b141561421757604051630d6b883f60e21b81526001600160a01b038316906335ae20fc906141bf90600080516020615ee883398151915290735d3a536e4d6dbd6114cc1ead35777bab948e36439060001990839083908390600401615c03565b602060405180830381600087803b1580156141d957600080fd5b505af11580156141ed573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250614211919081019061574b565b50614399565b600360d45460ff16600381111561422a57fe5b14156143995760006142e9735d3a536e4d6dbd6114cc1ead35777bab948e36436001600160a01b031663bd6d894d6040518163ffffffff1660e01b8152600401602060405180830381600087803b15801561428457600080fd5b505af1158015614298573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052506142bc919081019061574b565b61106c670de0b6b3a76400006110606142dc8b600363ffffffff6144e116565b8b9063ffffffff6144cf16565b604051630d6b883f60e21b81529091506001600160a01b038416906335ae20fc9061434490600080516020615ee883398151915290735d3a536e4d6dbd6114cc1ead35777bab948e3643908690839083908e90600401615c03565b602060405180830381600087803b15801561435e57600080fd5b505af1158015614372573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250614396919081019061574b565b50505b6113e78682614d1b565b6033546001600160a01b031633146143ba57600080fd5b6001600160a01b038216614402576033546040516001600160a01b039091169082156108fc029083906000818181858888f19350505050158015611dad573d6000803e3d6000fd5b6033546109d8906001600160a01b0384811691168363ffffffff614b6a16565b60d1546001600160a01b031681565b60cf546001600160a01b031681565b6001600160a01b038116600090815260cd602052604090205460ff1661446557600080fd5b600160ce541161447457600080fd5b6001600160a01b0316600090815260cd60205260409020805460ff1916905560ce8054600019019055565b6000826144ae575060006144c9565b828202828482816144bb57fe5b04146144c657600080fd5b90505b92915050565b6000828201838110156144c657600080fd5b60006144c683836040518060400160405280601a81526020017f536166654d6174683a206469766973696f6e206279207a65726f000000000000815250614daf565b808203828111156144c957600080fd5b808201828110156144c957600080fd5b60006001600160a01b038316158061457757506001600160a01b03831673eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee145b1561458d57506001600160a01b038116316144c9565b6040516370a0823160e01b81526001600160a01b038416906370a08231906145b9908590600401615afb565b60206040518083038186803b1580156145d157600080fd5b505afa1580156145e5573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250614609919081019061574b565b90506144c9565b6001600160a01b038116600090815260cd602052604090205460ff161561463657600080fd5b6001600160a01b0316600090815260cd60205260409020805460ff1916600190811790915560ce80549091019055565b8061467057613d91565b6001600160a01b03841615806146a257506001600160a01b03841673eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee145b1561476c576001600160a01b038316331480156146bf5750803410155b6146db5760405162461bcd60e51b81526004016107b090615cf8565b6001600160a01b0382163014614723576040516001600160a01b0383169082156108fc029083906000818181858888f19350505050158015614721573d6000803e3d6000fd5b505b8034111561476757336108fc61473f348463ffffffff614de616565b6040518115909202916000818181858888f19350505050158015613d60573d6000803e3d6000fd5b613d91565b613d916001600160a01b03851684848463ffffffff614df216565b303b1590565b600054610100900460ff16806147a657506147a6614787565b806147b4575060005460ff16155b6147bd57600080fd5b600054610100900460ff161580156147e8576000805460ff1961ff0019909116610100171660011790555b61307e614e4d565b600054610100900460ff16806148095750614809614787565b80614817575060005460ff16155b61482057600080fd5b600054610100900460ff1615801561484b576000805460ff1961ff0019909116610100171660011790555b61307e33614610565b6000807311111254369792b2ca5d084ab5eea397ca8fa48b9050600019876001600160a01b031663dd62ed3e30846001600160a01b031663e8edc8166040518163ffffffff1660e01b815260040160206040518083038186803b1580156148ba57600080fd5b505afa1580156148ce573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052506148f29190810190615417565b6040518363ffffffff1660e01b815260040161490f929190615b17565b60206040518083038186803b15801561492757600080fd5b505afa15801561493b573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525061495f919081019061574b565b14614a3757866001600160a01b031663095ea7b3826001600160a01b031663e8edc8166040518163ffffffff1660e01b815260040160206040518083038186803b1580156149ac57600080fd5b505afa1580156149c0573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052506149e49190810190615417565b6000196040518363ffffffff1660e01b8152600401614a04929190615c5d565b600060405180830381600087803b158015614a1e57600080fd5b505af1158015614a32573d6000803e3d6000fd5b505050505b6000614a526001600160a01b0389163063ffffffff61454316565b90506000614a6f6001600160a01b0388163063ffffffff61454316565b90506000602060008751602089016000886113885a03f150506000518289614aa66001600160a01b038d163063ffffffff61454316565b011015614ac55760405162461bcd60e51b81526004016107b090615d08565b6000614ae06001600160a01b038a163063ffffffff61454316565b9050878301811015614b045760405162461bcd60e51b81526004016107b090615d48565b614b0e8184614523565b9b9a5050505050505050505050565b60008060648460d0540281614b2e57fe5b0490508015614b5757603354614b57906001600160a01b0387811691168363ffffffff614b6a16565b614b618482614523565b95945050505050565b613d918383836000614ece565b6000670de0b6b3a7640000614b9d614b8f8585614fa8565b6706f05b59d3b20000614533565b81614ba457fe5b049392505050565b600054610100900460ff1680614bc55750614bc5614787565b80614bd3575060005460ff16155b614bdc57600080fd5b600054610100900460ff16158015614c07576000805460ff1961ff0019909116610100171660011790555b603380546001600160a01b0319166001600160a01b03841617905580156109d8576000805461ff00191690555050565b60006020600084516020860185886113885a03f16000519150801560018114614c5f576113e7565b600080fd5b6014015190565b6000614c75614fcc565b6001600160a01b0316826001600160a01b03161415614c9f57506001600160a01b038216316144c9565b6040516370a0823160e01b81526001600160a01b038316906370a0823190614ccb908690600401615afb565b60206040518083038186803b158015614ce357600080fd5b505afa158015614cf7573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052506144c6919081019061574b565b60007324a42fd28c976a61df5d00d0599c34c4f90748c86001600160a01b031663ed6ff7606040518163ffffffff1660e01b815260040160206040518083038186803b158015614d6a57600080fd5b505afa158015614d7e573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250614da29190810190615417565b9050613e20818484614fe4565b60008183614dd05760405162461bcd60e51b81526004016107b09190615ce7565b506000838581614ddc57fe5b0495945050505050565b60006144c68383614de6565b604051613d919085906323b872dd60e01b90614e1690879087908790602401615be8565b60408051601f198184030181529190526020810180516001600160e01b03166001600160e01b0319909316929092179091526150a7565b600054610100900460ff1680614e665750614e66614787565b80614e74575060005460ff16155b614e7d57600080fd5b600054610100900460ff16158015614ea8576000805460ff1961ff0019909116610100171660011790555b603380546001600160a01b031916331790558015613090576000805461ff001916905550565b600082614edd575060016136ee565b6001600160a01b0385161580614f0f57506001600160a01b03851673eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee145b15614f86578115614f46576040516001600160a01b0385169084156108fc029085906000818181858888f1935050505090506136ee565b6040516001600160a01b0385169084156108fc029085906000818181858888f19350505050158015614f7c573d6000803e3d6000fd5b50600190506136ee565b614fa06001600160a01b038616858563ffffffff61515316565b5060016136ee565b6000811580614fc357505080820282828281614fc057fe5b04145b6144c957600080fd5b73eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee90565b614fec614fcc565b6001600160a01b0316826001600160a01b0316141561508d5760008390506000816001600160a01b03168360405161502390615af0565b60006040518083038185875af1925050503d8060008114615060576040519150601f19603f3d011682016040523d82523d6000602084013e615065565b606091505b50509050806150865760405162461bcd60e51b81526004016107b090615d38565b5050613e20565b613e206001600160a01b038316848363ffffffff61515316565b6150b9826001600160a01b0316615175565b6150c257600080fd5b60006060836001600160a01b0316836040516150de9190615ae4565b6000604051808303816000865af19150503d806000811461511b576040519150601f19603f3d011682016040523d82523d6000602084013e615120565b606091505b50915091508161512f57600080fd5b805115613d91578080602001905161514a91908101906156db565b613d9157600080fd5b604051613e2090849063a9059cbb60e01b90614e169086908690602401615c5d565b6000813f7fc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a47081158015906136ee5750141592915050565b80356144c981615ec1565b80516144c981615ec1565b600082601f8301126151d357600080fd5b81356151e66151e182615dc5565b615d9f565b9150818183526020840193506020810190508385602084028201111561520b57600080fd5b60005b83811015615237578161522188826151ac565b845250602092830192919091019060010161520e565b5050505092915050565b600082601f83011261525257600080fd5b81356152606151e182615dc5565b9150818183526020840193506020810190508385602084028201111561528557600080fd5b60005b83811015615237578161529b88826151ac565b8452506020928301929190910190600101615288565b600082601f8301126152c257600080fd5b81356152d06151e182615dc5565b81815260209384019390925082018360005b8381101561523757813586016152f88882615394565b84525060209283019291909101906001016152e2565b600082601f83011261531f57600080fd5b813561532d6151e182615dc5565b9150818183526020840193506020810190508385602084028201111561535257600080fd5b60005b83811015615237578161536888826153e3565b8452506020928301929190910190600101615355565b80356144c981615ed5565b80516144c981615ed5565b600082601f8301126153a557600080fd5b81356153b36151e182615de5565b915080825260208301602083018583830111156153cf57600080fd5b6153da838284615e68565b50505092915050565b80356144c981615ede565b80516144c981615ede565b60006020828403121561540b57600080fd5b60006136ee84846151ac565b60006020828403121561542957600080fd5b60006136ee84846151b7565b6000806000806080858703121561544b57600080fd5b600061545787876151ac565b9450506020615468878288016151ac565b9350506040615479878288016153e3565b925050606061548a878288016153e3565b91505092959194509250565b600080600080600060a086880312156154ae57600080fd5b60006154ba88886151ac565b95505060206154cb888289016151ac565b94505060406154dc888289016153e3565b93505060606154ed888289016153e3565b92505060806154fe888289016153e3565b9150509295509295909350565b6000806040838503121561551e57600080fd5b600061552a85856151ac565b925050602061553b8582860161537e565b9150509250929050565b6000806040838503121561555857600080fd5b600061556485856151ac565b925050602061553b858286016153e3565b6000806000806080858703121561558b57600080fd5b600061559787876151ac565b94505060206155a8878288016153e3565b93505060406155b9878288016153e3565b92505060608501356001600160401b038111156155d557600080fd5b61548a87828801615394565b6000602082840312156155f357600080fd5b81356001600160401b0381111561560957600080fd5b6136ee848285016151c2565b6000806040838503121561562857600080fd5b82356001600160401b0381111561563e57600080fd5b61552a858286016151c2565b60008060006060848603121561565f57600080fd5b83356001600160401b0381111561567557600080fd5b61568186828701615241565b93505060208401356001600160401b0381111561569d57600080fd5b6156a9868287016152b1565b92505060408401356001600160401b038111156156c557600080fd5b6156d18682870161530e565b9150509250925092565b6000602082840312156156ed57600080fd5b60006136ee8484615389565b60006020828403121561570b57600080fd5b81356001600160401b0381111561572157600080fd5b6136ee84828501615394565b60006020828403121561573f57600080fd5b60006136ee84846153e3565b60006020828403121561575d57600080fd5b60006136ee84846153ee565b60008060006060848603121561577e57600080fd5b600061578a86866153e3565b935050602061579b868287016153e3565b92505060406156d1868287016151ac565b60006157b883836157cf565b505060200190565b6157c981615e56565b82525050565b6157c981615e24565b6157c96157e482615e24565b615ea0565b60006157f482615e12565b6157fe8185615e16565b935061580983615e0c565b8060005b8381101561583757815161582188826157ac565b975061582c83615e0c565b92505060010161580d565b509495945050505050565b6157c981615e2f565b60006158578385615e16565b9350615864838584615e68565b61586d83615eb1565b9093019392505050565b60006158838385615e1f565b9350615890838584615e68565b50500190565b60006158a182615e12565b6158ab8185615e16565b93506158bb818560208601615e74565b61586d81615eb1565b60006158cf82615e12565b6158d98185615e1f565b93506158e9818560208601615e74565b9290920192915050565b6157c981615e5d565b6000615909601183615e16565b706d73672e76616c7565206973207a65726f60781b815260200192915050565b6000615936601083615e16565b6f45786368616e6765206572726f72203160801b815260200192915050565b6000615962601183615e16565b7014195c9b5a5cdcda5bdb8819195b9a5959607a1b815260200192915050565b600061598f602883615e16565b7f41646472657373206f662072657761726457616c6c6574206d757374206e6f74815267206265207a65726f60c01b602082015260400192915050565b60006159d9601683615e16565b75151c985b9cd9995c881bd9881155120819985a5b195960521b815260200192915050565b6000615a0b601083615e16565b6f22bc31b430b733b29032b93937b9101960811b815260200192915050565b6000615a37601883615e16565b7f41646472657373206d757374206e6f74206265207a65726f0000000000000000815260200192915050565b60006144c9600083615e1f565b6157c981615e34565b6157c981615e47565b6157c9615a8e82615e47565b615e47565b6157c981615e4a565b6000615aa882846157d8565b50601401919050565b6000615abd82856157d8565b601482019150615acd8284615a82565b5060200192915050565b60006136ee828486615877565b60006121d982846158c4565b60006144c982615a63565b602081016144c982846157cf565b602081016144c982846157c0565b60408101615b2582856157c0565b6121d960208301846157cf565b60608101615b4082866157c0565b615b4d60208301856157c0565b6136ee6040830184615a79565b60808101615b6882876157c0565b615b7560208301866157cf565b615b826040830185615a79565b8181036060830152615b948184615896565b9695505050505050565b60408101615bac82866157c0565b8181036020830152614b6181848661584b565b60408101615bcd82856157c0565b6121d96020830184615a79565b60608101615b4082866157cf565b60608101615bf682866157cf565b615b4d60208301856157cf565b60c08101615c1182896157cf565b615c1e60208301886157cf565b615c2b6040830187615a79565b615c3860608301866157cf565b615c4560808301856157cf565b615c5260a0830184615a79565b979650505050505050565b60408101615bcd82856157cf565b60c08101615c7982896157cf565b615c866020830188615a79565b615c936040830187615a93565b615ca06060830186615a93565b615cad6080830185615a93565b615c5260a0830184615a93565b602080825281016144c681846157e9565b602081016144c98284615842565b602081016144c982846158f3565b602080825281016144c68184615896565b602080825281016144c9816158fc565b602080825281016144c981615929565b602080825281016144c981615955565b602080825281016144c981615982565b602080825281016144c9816159cc565b602080825281016144c9816159fe565b602080825281016144c981615a2a565b60408101615d768285615a70565b6121d96020830184615a93565b602081016144c98284615a79565b60408101615bcd8285615a79565b6040518181016001600160401b0381118282101715615dbd57600080fd5b604052919050565b60006001600160401b03821115615ddb57600080fd5b5060209081020190565b60006001600160401b03821115615dfb57600080fd5b506020601f91909101601f19160190565b60200190565b5190565b90815260200190565b919050565b60006144c982615e3b565b151590565b61ffff1690565b6001600160a01b031690565b90565b6001600160401b031690565b60006144c9825b60006144c982615e24565b82818337506000910152565b60005b83811015615e8f578181015183820152602001615e77565b83811115613d915750506000910152565b60006144c98260006144c982615ebb565b601f01601f191690565b60601b90565b615eca81615e24565b811461309057600080fd5b615eca81615e2f565b615eca81615e4756fe0000000000000000000000006b175474e89094c44da98b954eedeac495271d0fdfcfb5e25d61e13410c59c6087810407824cbdf17e25c145cfb55560acca9aa0a365627a7a723158201abc07de78abf7fd8cc19004160c96eb2d1bedc83a27e9173131adee7a8ecf906c6578706572696d656e74616cf564736f6c63430005110040

Deployed Bytecode Sourcemap

38532:15911:0:-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;20872:81;;8:9:-1;5:2;;;30:1;27;20:12;5:2;20872:81:0;;;:::i;:::-;;;;;;;;;;;;;;;;28213:34;;8:9:-1;5:2;;;30:1;27;20:12;5:2;28213:34:0;;;:::i;:::-;;;;;;;;26604:92;;8:9:-1;5:2;;;30:1;27;20:12;5:2;26604:92:0;;;:::i;29960:103::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;29960:103:0;;;;;;;;:::i;28256:39::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;28256:39:0;;;;;;;;:::i;:::-;;;;;;;;;39468:28;;8:9:-1;5:2;;;30:1;27;20:12;5:2;39468:28:0;;;:::i;20785:80::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;20785:80:0;;;:::i;45507:1514::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;45507:1514:0;;;;;;;;:::i;19545:38::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;19545:38:0;;;;;;;;:::i;:::-;;;;;;;;40799:540;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;40799:540:0;;;;;;;;:::i;:::-;;;;;;;;;44094:193;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;44094:193:0;;;;;;;;:::i;20600:80::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;20600:80:0;;;:::i;19048:222::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;19048:222:0;;;;;;;;:::i;47618:154::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;47618:154:0;;;;;;;;:::i;28355:30::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;28355:30:0;;;:::i;29724:228::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;29724:228:0;;;;;;;;:::i;41767:1107::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;41767:1107:0;;;;;;;;:::i;42882:1158::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;42882:1158:0;;;;;;;;:::i;29615:99::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;29615:99:0;;;;;;;;:::i;20102:118::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;20102:118:0;;;;;;;;:::i;44295:1202::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;44295:1202:0;;;;;;;;:::i;40200:369::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;40200:369:0;;;:::i;47411:199::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;47411:199:0;;;;;;;;:::i;39505:43::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;39505:43:0;;;;;;;;:::i;:::-;;;;;;;;;;;;;2368:28;;8:9:-1;5:2;;;30:1;27;20:12;5:2;2368:28:0;;;:::i;47780:123::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;47780:123:0;;;;;;;;:::i;47911:2032::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;47911:2032:0;;;;;;;;:::i;29334:225::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;29334:225:0;;;;;;;;:::i;2811:111::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;2811:111:0;;;;;;;;:::i;30071:230::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;30071:230:0;;;;;;;;:::i;20962:81::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;20962:81:0;;;:::i;21052:::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;21052:81:0;;;:::i;19939:153::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;19939:153:0;;;;;;;;:::i;47052:303::-;;;;;;;;;:::i;39409:18::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;39409:18:0;;;:::i;28302:44::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;28302:44:0;;;;;;;;:::i;20228:200::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;20228:200:0;;;;;;;;:::i;2930:125::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;2930:125:0;;;:::i;49992:1901::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;49992:1901:0;;;;;;;;:::i;18801:239::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;18801:239:0;;;;;;;;:::i;39434:27::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;39434:27:0;;;:::i;39361:39::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;39361:39:0;;;:::i;:::-;;;;;;;;20872:81;20911:42;20872:81;:::o;28213:34::-;28246:1;28213:34;:::o;26604:92::-;26654:42;26604:92;:::o;29960:103::-;28513:10;28501:23;;;;:11;:23;;;;;;;;28493:53;;;;-1:-1:-1;;;28493:53:0;;;;;;;;;;;;;;;;;28559:12;28574:5;28580:8;;28574:15;;;;;;;;;;;;;;;;;;;;;;:23;-1:-1:-1;;;;;28574:23:0;;;;;;-1:-1:-1;28649:5:0;;:15;;28574:23;;28655:8;;28649:15;;;;;;;;;;;;;;;;;;:32;;;;:23;;;;:32;;;;;28682:10;28649:44;;;;;;;;;;28644:174;;28757:4;28710:5;28716:8;;28710:15;;;;;;;;;;;;;;;;;;;;;;;;:32;;;;:23;;;;:32;;;;;28743:10;28710:44;;;;;;;;:51;;-1:-1:-1;;28710:51:0;;;;;;;;;;;28776:5;;:15;;28710:32;28782:8;;28776:15;;;;;;;;;;;;;;;;:30;;;;;;;;;-1:-1:-1;;28776:30:0;;;;;;28644:174;28246:1;28834:5;28840:8;;28834:15;;;;;;;;;;;;;;;;;;;;;;:28;;;:41;;;:108;;;28924:18;;28892:5;28898:8;;28892:15;;;;;;;;;;;;;;;;;;;;;;:28;;;:50;;28834:108;28830:367;;;29053:1;29022:5;29028:8;;29022:15;;;;;;;;;;;;;;;;;;;;;;:32;;;;;;;-1:-1:-1;;29022:32:0;;;;;;;;;;29069:5;;:15;;29022:28;;29075:8;;29069:15;;;;;;;;;;;;;;;;:25;;;-1:-1:-1;;;;;29069:25:0;;;;;;;;;;;;-1:-1:-1;;29069:25:0;;;;;;30033:22;30046:8;30033:12;:22::i;:::-;28830:367;;;-1:-1:-1;;;;;;;;;;;29164:10:0;29176:8;;29148:37;;;;;;;;;;;;;;;;;28830:367;29960:103;;:::o;28256:39::-;22:14:-1;;169:4;143:32;;;;;198:20;;28256:39:0;224:31:-1;;156:18;;;283;;;;273:49;328:32;;28256:39:0;;;;;;;;-1:-1:-1;;;;;28256:39:0;;:::o;39468:28::-;;;-1:-1:-1;;;;;39468:28:0;;:::o;20785:80::-;-1:-1:-1;;;;;;;;;;;20785:80:0;:::o;45507:1514::-;39977:44;;-1:-1:-1;;;39977:44:0;;39954:20;;-1:-1:-1;;;;;;;;;;;20823:42:0;39977:29;;:44;;40015:4;;39977:44;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;39977:44:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;39977: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;39977:44:0;;;;;;;;;28513:10;28501:23;;;;:11;:23;;;;;;39954:67;;-1:-1:-1;28501:23:0;;28493:53;;;;-1:-1:-1;;;28493:53:0;;;;;;;;;28559:12;28574:5;28580:8;;28574:15;;;;;;;;;;;;;;;;;;;;;;:23;-1:-1:-1;;;;;28574:23:0;;;;;;-1:-1:-1;28649:5:0;;:15;;28574:23;;28655:8;;28649:15;;;;;;;;;;;;;;;;;;:32;;;;:23;;;;:32;;;;;28682:10;28649:44;;;;;;;;;;28644:174;;28757:4;28710:5;28716:8;;28710:15;;;;;;;;;;;;;;;;;;;;;;;;:32;;;;:23;;;;:32;;;;;28743:10;28710:44;;;;;;;;:51;;-1:-1:-1;;28710:51:0;;;;;;;;;;;28776:5;;:15;;28710:32;28782:8;;28776:15;;;;;;;;;;;;;;;;:30;;;;;;;;;-1:-1:-1;;28776:30:0;;;;;;28644:174;28246:1;28834:5;28840:8;;28834:15;;;;;;;;;;;;;;;;;;;;;;:28;;;:41;;;:108;;;28924:18;;28892:5;28898:8;;28892:15;;;;;;;;;;;;;;;;;;;;;;:28;;;:50;;28834:108;28830:367;;;29053:1;29022:5;29028:8;;29022:15;;;;;;;;;;;;;;;;;;;;;;:32;;;;;;;-1:-1:-1;;29022:32:0;;;;;;;;;;29069:5;;:15;;29022:28;;29075:8;;29069:15;;;;;;;;;;;;;;;;:25;;;-1:-1:-1;;;;;29069:25:0;;;;;;;;;;;;-1:-1:-1;;29069:25:0;;;;;;-1:-1:-1;;;;;45692:29:0;;45684:38;;;;;;45758:44;;-1:-1:-1;;;45758:44:0;;45735:20;;-1:-1:-1;;;;;;;;;;;20823:42:0;45758:29;;:44;;45796:4;;45758:44;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;45758:44:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;45758: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;45758:44:0;;;;;;;;;45735:67;-1:-1:-1;45819:17:0;;45815:97;;45838:74;;-1:-1:-1;;;45838:74:0;;-1:-1:-1;;;;;;;;;;;20823:42:0;45838:32;;:74;;45871:10;;45891:4;;45898:13;;45838:74;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;45838:74:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;45838:74: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;45838:74:0;;;;;;;;;;45815:97;45929:54;;-1:-1:-1;;;45929:54:0;;-1:-1:-1;;45995:2:0;-1:-1:-1;;;;;;;;;;;20823:42:0;45929:29;;:54;;45967:4;;45974:8;;45929:54;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;45929:54:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;45929:54: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;45929:54:0;;;;;;;;;:69;45925:152;;46015:50;;-1:-1:-1;;;46015:50:0;;-1:-1:-1;;;;;;;;;;;20823:42:0;46015:27;;:50;;46043:8;;-1:-1:-1;;46061:2:0;46015:50;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;46015:50:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;46015:50:0;;;;45925:152;-1:-1:-1;;46093:9:0;:21;46089:488;;;46131:102;;-1:-1:-1;;;46131:102:0;;-1:-1:-1;;;;;46131:28:0;;;;;:102;;-1:-1:-1;;;;;;;;;;;20823:42:0;20911;;-1:-1:-1;;46192:2:0;20823:42;;20911;;46192:2;;46131:102;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;46131:102:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;46131:102: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;46131:102:0;;;;;;;;;;46089:488;;;46266:23;46292:16;:9;46306:1;46292:16;:13;:16;:::i;:::-;46266:42;;46323:21;46347:89;20911:42;-1:-1:-1;;;;;46392:41:0;;:43;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;46392:43:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;46392:43: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;46392:43:0;;;;;;;;;46347:40;46382:4;46347:30;:15;46367:9;46347:30;:19;:30;:::i;:::-;:34;:40;:34;:40;:::i;:::-;:44;:89;:44;:89;:::i;:::-;46451:114;;-1:-1:-1;;;46451:114:0;;46323:113;;-1:-1:-1;;;;;;46451:28:0;;;;;:114;;-1:-1:-1;;;;;;;;;;;20823:42:0;20911;;46323:113;;20823:42;;20911;;46549:15;;46451:114;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;46451:114:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;46451:114: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;46451:114:0;;;;;;;;;;46089:488;;;46593:17;;46589:78;;46612:55;;-1:-1:-1;;;46612:55:0;;-1:-1:-1;;;;;;;;;;;20823:42:0;46612:28;;:55;;46641:10;;46653:13;;46612:55;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;46612:55:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;46612: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;46612:55:0;;;;;;;;;;46589:78;46705:44;;-1:-1:-1;;;46705:44:0;;46680:18;;46701:63;;-1:-1:-1;;;;;;;;;;;20823:42:0;46705:29;;:44;;46743:4;;46705:44;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;46705:44:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;46705: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;46705:44:0;;;;;;;;;46751:12;46701:3;:63::i;:::-;46680:84;;46797:12;46783:10;:26;;46775:35;;;;;;46821:55;;-1:-1:-1;;;46821:55:0;;-1:-1:-1;;;;;;;;;;;20823:42:0;46821:28;;:55;;46850:13;;46865:10;;46821:55;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;46821:55:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;46821: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;46821:55:0;;;;;;;;;;46976:13;-1:-1:-1;;;;;46951:62:0;46966:8;-1:-1:-1;;;;;46951:62:0;;46991:9;47002:10;46951:62;;;;;;;;;;;;;;;;29109:1;;28830:367;;;-1:-1:-1;;;;;;;;;;;29164:10:0;29176:8;;29148:37;;;;;;;;;;;;;;;;;28830:367;-1:-1:-1;40052:44:0;;-1:-1:-1;;;40052:44:0;;40100:12;;-1:-1:-1;;;;;;;;;;;20823:42:0;40052:29;;:44;;40090:4;;40052:44;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;40052:44:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;40052: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;40052:44:0;;;;;;;;;:60;;40044:69;;;;;;45507:1514;;;;;;:::o;19545:38::-;;;;;;;;;;;;;;;:::o;40799:540::-;41058:23;;-1:-1:-1;;;41058:23:0;;40867:15;;;;20638:42;;21001;;;;41058:14;;:23;;41073:7;;41058:23;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;41058:23:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;41058:23: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;41058:23:0;;;;;;;;;41092:30;;-1:-1:-1;;;41092:30:0;;41048:33;;-1:-1:-1;;;;;;41092:21:0;;;;;:30;;41114:7;;41092:30;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;41092:30:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;-1:-1;;41154:23:0;;-1:-1:-1;;;41154:23:0;;41133:18;;-1:-1:-1;;;;;;41154:14:0;;;-1:-1:-1;41154:14:0;;:23;;41169:7;;41154:23;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;41154:23:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;41154:23: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;41154:23:0;;;;;;;;;41133:44;;41188:15;41206:11;-1:-1:-1;;;;;41206:23:0;;41230:7;41206:32;;;;;;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;41206:32:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;41206: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;41206:32:0;;;;;;;;;41188:50;;41249:13;41265:24;41269:7;41278:10;41265:3;:24::i;:::-;41249:40;;41312:19;41316:5;41323:7;41312:3;:19::i;:::-;41300:31;;40799:540;;;;;;;;:::o;44094:193::-;28513:10;28501:23;;;;:11;:23;;;;;;;;28493:53;;;;-1:-1:-1;;;28493:53:0;;;;;;;;;28559:12;28574:5;28580:8;;28574:15;;;;;;;;;;;;;;;;;;;;;;:23;-1:-1:-1;;;;;28574:23:0;;;;;;-1:-1:-1;28649:5:0;;:15;;28574:23;;28655:8;;28649:15;;;;;;;;;;;;;;;;;;:32;;;;:23;;;;:32;;;;;28682:10;28649:44;;;;;;;;;;28644:174;;28757:4;28710:5;28716:8;;28710:15;;;;;;;;;;;;;;;;;;;;;;;;:32;;;;:23;;;;:32;;;;;28743:10;28710:44;;;;;;;;:51;;-1:-1:-1;;28710:51:0;;;;;;;;;;;28776:5;;:15;;28710:32;28782:8;;28776:15;;;;;;;;;;;;;;;;:30;;;;;;;;;-1:-1:-1;;28776:30:0;;;;;;28644:174;28246:1;28834:5;28840:8;;28834:15;;;;;;;;;;;;;;;;;;;;;;:28;;;:41;;;:108;;;28924:18;;28892:5;28898:8;;28892:15;;;;;;;;;;;;;;;;;;;;;;:28;;;:50;;28834:108;28830:367;;;29053:1;29022:5;29028:8;;29022:15;;;;;;;;;;;;;;;;;;;;;;:32;;;;;;;-1:-1:-1;;29022:32:0;;;;;;;;;;29069:5;;:15;;29022:28;;29075:8;;29069:15;;;;;;;;;;;;;;;;:25;;;-1:-1:-1;;;;;29069:25:0;;;;;;;;;;;;-1:-1:-1;;29069:25:0;;;;;;-1:-1:-1;;;;;44184:27:0;;44176:64;;;;-1:-1:-1;;;44176:64:0;;;;;;;;;44251:12;:28;;-1:-1:-1;;;;;;44251:28:0;-1:-1:-1;;;;;44251:28:0;;;;;28830:367;;20600:80;20638:42;20600:80;:::o;19048:222::-;2508:5;;-1:-1:-1;;;;;2508:5:0;2494:10;:19;2486:28;;;;;;19126:9;19122:141;19145:6;:13;19141:1;:17;19122:141;;;19179:72;19188:6;19195:1;19188:9;;;;;;;;;;;;;;19199:51;19244:4;19206:6;19213:1;19206:9;;;;;;;;;;;;;;-1:-1:-1;;;;;19199:36:0;;;:51;;;;:::i;19179:72::-;19159:3;;19122:141;;47618:154;28513:10;28501:23;;;;:11;:23;;;;;;;;28493:53;;;;-1:-1:-1;;;28493:53:0;;;;;;;;;28559:12;28574:5;28580:8;;28574:15;;;;;;;;;;;;;;;;;;;;;;:23;-1:-1:-1;;;;;28574:23:0;;;;;;-1:-1:-1;28649:5:0;;:15;;28574:23;;28655:8;;28649:15;;;;;;;;;;;;;;;;;;:32;;;;:23;;;;:32;;;;;28682:10;28649:44;;;;;;;;;;28644:174;;28757:4;28710:5;28716:8;;28710:15;;;;;;;;;;;;;;;;;;;;;;;;:32;;;;:23;;;;:32;;;;;28743:10;28710:44;;;;;;;;:51;;-1:-1:-1;;28710:51:0;;;;;;;;;;;28776:5;;:15;;28710:32;28782:8;;28776:15;;;;;;;;;;;;;;;;:30;;;;;;;;;-1:-1:-1;;28776:30:0;;;;;;28644:174;28246:1;28834:5;28840:8;;28834:15;;;;;;;;;;;;;;;;;;;;;;:28;;;:41;;;:108;;;28924:18;;28892:5;28898:8;;28892:15;;;;;;;;;;;;;;;;;;;;;;:28;;;:50;;28834:108;28830:367;;;29053:1;29022:5;29028:8;;29022:15;;;;;;;;;;;;;;;;;;;;;;:32;;;;;;;-1:-1:-1;;29022:32:0;;;;;;;;;;29069:5;;:15;;29022:28;;29075:8;;29069:15;;;;;;;;;;;;;;;;:25;;;-1:-1:-1;;;;;29069:25:0;;;;;;;;;;;;-1:-1:-1;;29069:25:0;;;;;;47707:5;;47693:10;-1:-1:-1;;;;;47707:5:0;;;47693:19;47685:28;;;;;;47739:3;47732:4;:10;47724:19;;;;;;47754:3;:10;;;28830:367;;28355:30;;;;:::o;29724:228::-;28513:10;28501:23;;;;:11;:23;;;;;;;;28493:53;;;;-1:-1:-1;;;28493:53:0;;;;;;;;;28559:12;28574:5;28580:8;;28574:15;;;;;;;;;;;;;;;;;;;;;;:23;-1:-1:-1;;;;;28574:23:0;;;;;;-1:-1:-1;28649:5:0;;:15;;28574:23;;28655:8;;28649:15;;;;;;;;;;;;;;;;;;:32;;;;:23;;;;:32;;;;;28682:10;28649:44;;;;;;;;;;28644:174;;28757:4;28710:5;28716:8;;28710:15;;;;;;;;;;;;;;;;;;;;;;;;:32;;;;:23;;;;:32;;;;;28743:10;28710:44;;;;;;;;:51;;-1:-1:-1;;28710:51:0;;;;;;;;;;;28776:5;;:15;;28710:32;28782:8;;28776:15;;;;;;;;;;;;;;;;:30;;;;;;;;;-1:-1:-1;;28776:30:0;;;;;;28644:174;28246:1;28834:5;28840:8;;28834:15;;;;;;;;;;;;;;;;;;;;;;:28;;;:41;;;:108;;;28924:18;;28892:5;28898:8;;28892:15;;;;;;;;;;;;;;;;;;;;;;:28;;;:50;;28834:108;28830:367;;;29053:1;29022:5;29028:8;;29022:15;;;;;;;;;;;;;;;;;;;;;;:32;;;;;;;-1:-1:-1;;29022:32:0;;;;;;;;;;29069:5;;:15;;29022:28;;29075:8;;29069:15;;;;;;;;;;;;;;;;:25;;;-1:-1:-1;;;;;29069:25:0;;;;;;;;;;;;-1:-1:-1;;29069:25:0;;;;;;29814:17;;29806:30;;;;;;29854:6;29849:96;29870:10;:17;29866:1;:21;29849:96;;;29909:24;29919:10;29930:1;29919:13;;;;;;;;;;;;;;29909:9;:24::i;:::-;29889:3;;29849:96;;;;28830:367;;41767:1107;41885:7;-1:-1:-1;;;;;41911:24:0;;41907:513;;41963:15;;;;;;;;;-1:-1:-1;;;;;41963:15:0;-1:-1:-1;;;;;41963:30:0;;:32;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;41963:32:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;41963: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;41963:32:0;;;;;;;;;42010:50;;-1:-1:-1;;;42010:50:0;;41952:43;;-1:-1:-1;;;;;;;;;;;;20823:42:0;42010:27;;:50;;41952:43;;-1:-1:-1;;42056:2:0;42010:50;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;42010:50:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;-1:-1;;42095:43:0;;;;;;;;42104:10;42095:43;;;;;;;;;-1:-1:-1;42095:43:0;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;42075:17:0;;;;;;:7;:17;;;;;;;:63;;;;;;-1:-1:-1;;;;;;42075:63:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;42075:63:0;;;-1:-1:-1;;;42075:63:0;-1:-1:-1;;;;;42075:63:0;;;-1:-1:-1;;;42075:63:0;-1:-1:-1;;;;42075:63:0;;;-1:-1:-1;;;42075:63:0;-1:-1:-1;;;;42075:63:0;;;;-1:-1:-1;;42075:63:0;;;;;;;;;;;;;;;;;;;;;;;;;42158:34;;42075:17;;-1:-1:-1;42158:34:0;;-1:-1:-1;42158:34:0;;42116:9;;42158:34;;;;;;;;;;41907:513;;;-1:-1:-1;;;;;42233:17:0;;;;;;;:7;:17;;;;;:23;;42260:10;42233:37;42225:46;;;;;;-1:-1:-1;;;;;42318:17:0;;;;;;:7;:17;;;;;:25;;;42314:41;;42345:9;42314:3;:41::i;:::-;-1:-1:-1;;;;;42286:17:0;;;;;;:7;:17;;;;;;;:25;;:69;;;;42375:33;;;;;;42398:9;;42375:33;;;;;;;;;;41907:513;42468:74;-1:-1:-1;;;;;;;;;;;42510:10:0;42522:8;42532:9;42468:74;:41;:74;:::i;:::-;42555:24;26654:42;-1:-1:-1;;;;;42595:69:0;;:71;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;42595:71:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;42595:71: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;42595:71:0;;;;;;;;;42678:5;:15;;42555:112;;-1:-1:-1;42686:7:0;;-1:-1:-1;;42678:15:0;42686:7;;42678:15;;;;;42704:11;-1:-1:-1;;;;;42704:21:0;;42734:4;-1:-1:-1;;;;;;;;;;;42754:15:0;42788:8;42798:9;42771:37;;;;;;;;;;;;;49:4:-1;39:7;30;26:21;22:32;13:7;6:49;42771:37:0;;;42704:105;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;42704:105:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;-1:-1;;42820:5:0;:18;;-1:-1:-1;;42820:18:0;;;-1:-1:-1;42858:8:0;;-1:-1:-1;;;41767:1107:0;;;;;;:::o;42882:1158::-;39977:44;;-1:-1:-1;;;39977:44:0;;43004:7;;;;-1:-1:-1;;;;;;;;;;;20823:42:0;39977:29;;:44;;40015:4;;39977:44;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;39977:44:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;39977: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;39977:44:0;;;;;;;;;39954:67;-1:-1:-1;;;;;;43028:24:0;;43024:513;;43080:15;;;;;;;;;-1:-1:-1;;;;;43080:15:0;-1:-1:-1;;;;;43080:30:0;;:32;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;43080:32:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;43080: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;43080:32:0;;;;;;;;;43127:50;;-1:-1:-1;;;43127:50:0;;43069:43;;-1:-1:-1;;;;;;;;;;;;20823:42:0;43127:27;;:50;;43069:43;;-1:-1:-1;;43173:2:0;43127:50;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;43127:50:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;-1:-1;;43212:43:0;;;;;;;;43221:10;43212:43;;;;;;;;;-1:-1:-1;43212:43:0;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;43192:17:0;;;;;;:7;:17;;;;;;;:63;;;;;;-1:-1:-1;;;;;;43192:63:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;43192:63:0;;;-1:-1:-1;;;43192:63:0;-1:-1:-1;;;;;43192:63:0;;;-1:-1:-1;;;43192:63:0;-1:-1:-1;;;;43192:63:0;;;-1:-1:-1;;;43192:63:0;-1:-1:-1;;;;43192:63:0;;;;-1:-1:-1;;43192:63:0;;;;;;;;;;;;;;;;;;;;;;;;;43275:34;;43192:17;;-1:-1:-1;43275:34:0;;-1:-1:-1;43275:34:0;;43233:9;;43275:34;;;;;;;;;;43024:513;;;-1:-1:-1;;;;;43350:17:0;;;;;;;:7;:17;;;;;:23;;43377:10;43350:37;43342:46;;;;;;-1:-1:-1;;;;;43435:17:0;;;;;;:7;:17;;;;;:25;;;43431:41;;43462:9;43431:3;:41::i;:::-;-1:-1:-1;;;;;43403:17:0;;;;;;:7;:17;;;;;;;:25;;:69;;;;43492:33;;;;;;43515:9;;43492:33;;;;;;;;;;43024:513;43587:79;-1:-1:-1;;;;;;;;;;;43629:10:0;43649:4;43656:9;43587:79;:41;:79;:::i;:::-;43740:50;;-1:-1:-1;;;43740:50:0;;43700:27;;;;-1:-1:-1;;;;;;;;;;;20823:42:0;43740:28;;:50;;43769:8;;43700:27;;43740:50;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;43740:50:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;43740:50: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;43740:50:0;;;;;;;;;-1:-1:-1;43803:110:0;;-1:-1:-1;;;43803:110:0;;-1:-1:-1;;;;;43803:27:0;;;;;:110;;-1:-1:-1;;;;;;;;;;;20823:42:0;20911;;43858:10;;20823:42;;20911;;43897:15;;43803:110;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;43803:110:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;-1:-1;;43926:78:0;;-1:-1:-1;;;43926:78:0;;-1:-1:-1;;;;;43926:33:0;;;-1:-1:-1;43926:33:0;;-1:-1:-1;43926:78:0;;-1:-1:-1;;;;;;;;;;;20823:42:0;43981:4;;43988:15;;43926:78;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;43926:78:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;43926:78:0;;;;44024:8;44017:15;;;40052:44;;-1:-1:-1;;;40052:44:0;;40100:12;;-1:-1:-1;;;;;;;;;;;20823:42:0;40052:29;;:44;;40090:4;;40052:44;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;40052:44:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;40052: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;40052:44:0;;;;;;;;;:60;;40044:69;;;;;;42882:1158;;;;;;:::o;29615:99::-;28513:10;28501:23;;;;:11;:23;;;;;;;;28493:53;;;;-1:-1:-1;;;28493:53:0;;;;;;;;;28559:12;28574:5;28580:8;;28574:15;;;;;;;;;;;;;;;;;;;;;;:23;-1:-1:-1;;;;;28574:23:0;;;;;;-1:-1:-1;28649:5:0;;:15;;28574:23;;28655:8;;28649:15;;;;;;;;;;;;;;;;;;:32;;;;:23;;;;:32;;;;;28682:10;28649:44;;;;;;;;;;28644:174;;28757:4;28710:5;28716:8;;28710:15;;;;;;;;;;;;;;;;;;;;;;;;:32;;;;:23;;;;:32;;;;;28743:10;28710:44;;;;;;;;:51;;-1:-1:-1;;28710:51:0;;;;;;;;;;;28776:5;;:15;;28710:32;28782:8;;28776:15;;;;;;;;;;;;;;;;:30;;;;;;;;;-1:-1:-1;;28776:30:0;;;;;;28644:174;28246:1;28834:5;28840:8;;28834:15;;;;;;;;;;;;;;;;;;;;;;:28;;;:41;;;:108;;;28924:18;;28892:5;28898:8;;28892:15;;;;;;;;;;;;;;;;;;;;;;:28;;;:50;;28834:108;28830:367;;;29053:1;29022:5;29028:8;;29022:15;;;;;;;;;;;;;;;;;;;;;;:32;;;;;;;-1:-1:-1;;29022:32:0;;;;;;;;;;29069:5;;:15;;29022:28;;29075:8;;29069:15;;;;;;;;;;;;;;;;:25;;;-1:-1:-1;;;;;29069:25:0;;;;;;;;;;;;-1:-1:-1;;29069:25:0;;;;;;29686:20;29696:9;29686;:20::i;20102:118::-;2508:5;;-1:-1:-1;;;;;2508:5:0;2494:10;:19;2486:28;;;;;;-1:-1:-1;;;;;20188:14:0;;;;;;;;:6;:14;;;;;:24;;-1:-1:-1;;20188:24:0;;;;;;;;;;20102:118::o;44295:1202::-;28513:10;28501:23;;;;:11;:23;;;;;;;;28493:53;;;;-1:-1:-1;;;28493:53:0;;;;;;;;;28559:12;28574:5;28580:8;;28574:15;;;;;;;;;;;;;;;;;;;;;;:23;-1:-1:-1;;;;;28574:23:0;;;;;;-1:-1:-1;28649:5:0;;:15;;28574:23;;28655:8;;28649:15;;;;;;;;;;;;;;;;;;:32;;;;:23;;;;:32;;;;;28682:10;28649:44;;;;;;;;;;28644:174;;28757:4;28710:5;28716:8;;28710:15;;;;;;;;;;;;;;;;;;;;;;;;:32;;;;:23;;;;:32;;;;;28743:10;28710:44;;;;;;;;:51;;-1:-1:-1;;28710:51:0;;;;;;;;;;;28776:5;;:15;;28710:32;28782:8;;28776:15;;;;;;;;;;;;;;;;:30;;;;;;;;;-1:-1:-1;;28776:30:0;;;;;;28644:174;28246:1;28834:5;28840:8;;28834:15;;;;;;;;;;;;;;;;;;;;;;:28;;;:41;;;:108;;;28924:18;;28892:5;28898:8;;28892:15;;;;;;;;;;;;;;;;;;;;;;:28;;;:50;;28834:108;28830:367;;;29053:1;29022:5;29028:8;;29022:15;;;;;;;;;;;;;;;;;;;;;;:32;;;;;;;-1:-1:-1;;29022:32:0;;;;;;;;;;29069:5;;:15;;29022:28;;29075:8;;29069:15;;;;;;;;;;;;;;;;:25;;;-1:-1:-1;;;;;29069:25:0;;;;;;;;;;;;-1:-1:-1;;29069:25:0;;;;;;-1:-1:-1;;;;;44453:29:0;;44445:38;;;;;;44519:44;;-1:-1:-1;;;44519:44:0;;44496:20;;-1:-1:-1;;;;;;;;;;;20823:42:0;44519:29;;:44;;44557:4;;44519:44;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;44519:44:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;44519: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;44519:44:0;;;;;;;;;44496:67;;44576:24;26654:42;-1:-1:-1;;;;;44616:69:0;;:71;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;44616:71:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;44616:71: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;44616:71:0;;;;;;;;;44576:112;;44701:23;-1:-1:-1;;44739:9:0;:21;44735:262;;;44795:52;;-1:-1:-1;;;44795:52:0;;20911:42;;44795;;:52;;44838:8;;44795:52;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;44795:52:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;44795:52: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;44795:52:0;;;;;;;;;44862:5;:16;;-1:-1:-1;;44862:16:0;44870:8;44862:16;;;44777:70;-1:-1:-1;44735:262:0;;;44929:16;:9;44943:1;44929:16;:13;:16;:::i;:::-;44960:5;:25;;-1:-1:-1;;44960:25:0;44968:17;44960:25;;;44911:34;-1:-1:-1;44735:262:0;45009:11;-1:-1:-1;;;;;45009:21:0;;45039:4;-1:-1:-1;;;;;;;;;;;45059:15:0;45093:8;45076:26;;;;;;;;;;;;49:4:-1;39:7;30;26:21;22:32;13:7;6:49;45076:26:0;;;45009:94;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;45009:94:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;-1:-1;;45114:5:0;:18;;-1:-1:-1;;45114:18:0;;;-1:-1:-1;;45170:44:0;;-1:-1:-1;;;45170:44:0;;45122:10;;45166:63;;-1:-1:-1;;;;;;;;;;;20823:42:0;45170:29;;:44;;45208:4;;45170:44;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;45170:44:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;45170: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;45170:44:0;;;;;;;;;45216:12;45166:3;:63::i;:::-;45145:84;;45264:12;45250:10;:26;;45242:35;;;;;;45290:55;;-1:-1:-1;;;45290:55:0;;-1:-1:-1;;;;;;;;;;;20823:42:0;45290:28;;:55;;45319:13;;45334:10;;45290:55;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;45290:55:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;45290: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;45290:55:0;;;;;;;;;;45452:13;-1:-1:-1;;;;;45427:62:0;45442:8;-1:-1:-1;;;;;45427:62:0;;45467:9;45478:10;45427:62;;;;;;;;;;;;;;;;29109:1;;;;28830:367;;;-1:-1:-1;;;;;;;;;;;29164:10:0;29176:8;;29148:37;;;;;;;;;;;;;;;;;28830:367;44295:1202;;;;;:::o;40200:369::-;1189:12;;;;;;;;:31;;;1205:15;:13;:15::i;:::-;1189:47;;;-1:-1:-1;1225:11:0;;;;1224:12;1189:47;1181:56;;;;;;1246:19;1269:12;;;;;;1268:13;1288:83;;;;1317:12;:19;;-1:-1:-1;;;;1317:19:0;;;;;1345:18;1332:4;1345:18;;;1288:83;40252:32;:30;:32::i;:::-;40327:25;:23;:25::i;:::-;1393:14;1389:57;;;1433:5;1418:20;;-1:-1:-1;;1418:20:0;;;1389:57;40200:369;:::o;47411:199::-;19653:5;;-1:-1:-1;;;;;19653:5:0;19639:10;:19;;:58;;-1:-1:-1;19686:10:0;19679:18;;;;:6;:18;;;;;;;;19639:58;19631:88;;;;-1:-1:-1;;;19631:88:0;;;;;;;;;-1:-1:-1;;;;;47508:30:0;;47500:39;;;;;;47550:15;:52;;-1:-1:-1;;;;;;47550:52:0;-1:-1:-1;;;;;47550:52:0;;;;;;;;;;47411:199::o;39505:43::-;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;39505:43:0;;;;;-1:-1:-1;;;;;39505:43:0;;;;-1:-1:-1;;;39505:43:0;;;;;-1:-1:-1;;;39505:43:0;;;;;-1:-1:-1;;;39505:43:0;;;;:::o;2368:28::-;;;-1:-1:-1;;;;;2368:28:0;;:::o;47780:123::-;19653:5;;-1:-1:-1;;;;;19653:5:0;19639:10;:19;;:58;;-1:-1:-1;19686:10:0;19679:18;;;;:6;:18;;;;;;;;19639:58;19631:88;;;;-1:-1:-1;;;19631:88:0;;;;;;;;;47868:13;:27;;-1:-1:-1;;;;;;47868:27:0;-1:-1:-1;;;;;47868:27:0;;;;;;;;;;47780:123::o;47911:2032::-;19653:5;;48064:7;;-1:-1:-1;;;;;19653:5:0;19639:10;:19;;:58;;-1:-1:-1;19686:10:0;19679:18;;;;:6;:18;;;;;;;;19639:58;19631:88;;;;-1:-1:-1;;;19631:88:0;;;;;;;;;48092:12;;-1:-1:-1;;;;;48092:12:0;48084:79;;;;-1:-1:-1;;;48084:79:0;;;;;;;;;48203:45;;-1:-1:-1;;;48203:45:0;;48176:24;;21001:42;;48203:30;;:45;;48242:4;;48203:45;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;48203:45:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;48203:45: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;48203:45:0;;;;;;;;;48286:16;;;48300:1;48286:16;;;;;;;;;48176:72;;-1:-1:-1;48259:24:0;;48286:16;;;;;;;105:10:-1;48286:16:0;88:34:-1;136:17;;-1:-1;48286:16:0;48259:43;;20911:42;48313:7;48321:1;48313:10;;;;;;;;-1:-1:-1;;;;;48313:25:0;;;:10;;;;;;;;;:25;48349:38;;-1:-1:-1;;;48349:38:0;;:29;;;;;;:38;;48379:7;;48349:38;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;48349:38:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;-1:-1;;48423:45:0;;-1:-1:-1;;;48423:45:0;;48419:68;;-1:-1:-1;21001:42:0;;-1:-1:-1;48423:30:0;;:45;;48462:4;;48423:45;;;;48419:68;48400:87;-1:-1:-1;48503:17:0;;48500:1436;;48537:18;48558:92;21001:42;48590:16;21091:42;48630:13;48645:4;48558:9;:92::i;:::-;48537:113;;48678:45;21091:42;48702:10;48714:8;48678:9;:45::i;:::-;48779:12;;48665:58;;-1:-1:-1;48740:64:0;;21091:42;;-1:-1:-1;;;;;48779:12:0;48665:58;48740:64;:38;:64;:::i;:::-;-1:-1:-1;;;;;48819:17:0;;;;;;:7;:17;;;;;:34;;:56;;-1:-1:-1;;;;;;;;48819:56:0;;;;;;;;;;;-1:-1:-1;;;;48819:56:0;;;;;;48864:10;-1:-1:-1;48890:17:0;;-1:-1:-1;;48890:17:0;48500:1436;48928:19;;48925:1011;;48999:18;49062:6;49020:39;49025:16;49043:15;49020:4;:39::i;:::-;:48;;;;;49142:13;;49020:48;;;;-1:-1:-1;49099:84:0;;21091:42;;-1:-1:-1;;;;;49142:13:0;49165:4;49020:48;49099:84;:42;:84;:::i;:::-;49228:13;;49198:62;;-1:-1:-1;;;49198:62:0;;21001:42;;49198:29;;:62;;-1:-1:-1;;;;;49228:13:0;;49243:16;;49198:62;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;49198:62:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;49198:62: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;49198:62:0;;;;;;;;;;49280:42;49289:15;49306;49280:42;;;;;;;;;;;;;;;;49385:45;21091:42;49409:10;49421:8;49385:9;:45::i;48925:1011::-;49666:51;21001:42;49690:16;49708:8;49666:9;:51::i;:::-;49762:12;;49732:61;;-1:-1:-1;;;49732:61:0;;49647:70;;-1:-1:-1;21001:42:0;;49732:29;;:61;;-1:-1:-1;;;;;49762:12:0;;;;49647:70;;49732:61;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;49732:61:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;49732:61: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;49732:61:0;;;;;;;;;-1:-1:-1;;;;;;;49808:17:0;;;;;;:7;:17;;;;;:29;;:64;;-1:-1:-1;;;;;49808:64:0;;;49867:4;49848:23;;49808:64;;-1:-1:-1;;49808:64:0;;;;;;49848:16;-1:-1:-1;19730:1:0;47911:2032;;;;;;:::o;29334:225::-;1189:12;;;;;;;;:31;;;1205:15;:13;:15::i;:::-;1189:47;;;-1:-1:-1;1225:11:0;;;;1224:12;1189:47;1181:56;;;;;;1246:19;1269:12;;;;;;1268:13;1288:83;;;;1317:12;:19;;-1:-1:-1;;;;1317:19:0;;;;;1345:18;1332:4;1345:18;;;1288:83;29441:1;29421:10;:17;:21;29413:30;;;;;;29461:6;29456:96;29477:10;:17;29473:1;:21;29456:96;;;29516:24;29526:10;29537:1;29526:13;;;;;;;29516:24;29496:3;;29456:96;;;;1393:14;1389:57;;;1433:5;1418:20;;-1:-1:-1;;1418:20:0;;;29334:225;;:::o;2811:111::-;2508:5;;-1:-1:-1;;;;;2508:5:0;2494:10;:19;2486:28;;;;;;2886:17;:28;;-1:-1:-1;;;;;;2886:28:0;-1:-1:-1;;;;;2886:28:0;;;;;;;;;;2811:111::o;30071:230::-;28513:10;28501:23;;;;:11;:23;;;;;;;;28493:53;;;;-1:-1:-1;;;28493:53:0;;;;;;;;;28559:12;28574:5;28580:8;;28574:15;;;;;;;;;;;;;;;;;;;;;;:23;-1:-1:-1;;;;;28574:23:0;;;;;;-1:-1:-1;28649:5:0;;:15;;28574:23;;28655:8;;28649:15;;;;;;;;;;;;;;;;;;:32;;;;:23;;;;:32;;;;;28682:10;28649:44;;;;;;;;;;28644:174;;28757:4;28710:5;28716:8;;28710:15;;;;;;;;;;;;;;;;;;;;;;;;:32;;;;:23;;;;:32;;;;;28743:10;28710:44;;;;;;;;:51;;-1:-1:-1;;28710:51:0;;;;;;;;;;;28776:5;;:15;;28710:32;28782:8;;28776:15;;;;;;;;;;;;;;;;:30;;;;;;;;;-1:-1:-1;;28776:30:0;;;;;;28644:174;28246:1;28834:5;28840:8;;28834:15;;;;;;;;;;;;;;;;;;;;;;:28;;;:41;;;:108;;;28924:18;;28892:5;28898:8;;28892:15;;;;;;;;;;;;;;;;;;;;;;:28;;;:50;;28834:108;28830:367;;;29053:1;29022:5;29028:8;;29022:15;;;;;;;;;;;;;;;;;;;;;;:32;;;;;;;-1:-1:-1;;29022:32:0;;;;;;;;;;29069:5;;:15;;29022:28;;29075:8;;29069:15;;;;;;;;;;;;;;;;:25;;;-1:-1:-1;;;;;29069:25:0;;;;;;;;;;;;-1:-1:-1;;29069:25:0;;;;;;30163:16;;30155:29;;;;;;30202:6;30197:97;30218:9;:16;30214:1;:20;30197:97;;;30256:26;30269:9;30279:1;30269:12;;;;;;;;;;;;;;30256;:26::i;:::-;30236:3;;30197:97;;20962:81;21001:42;20962:81;:::o;21052:::-;21091:42;21052:81;:::o;19939:153::-;1189:12;;;;;;;;:31;;;1205:15;:13;:15::i;:::-;1189:47;;;-1:-1:-1;1225:11:0;;;;1224:12;1189:47;1181:56;;;;;;1246:19;1269:12;;;;;;1268:13;1288:83;;;;1317:12;:19;;-1:-1:-1;;;;1317:19:0;;;;;1345:18;1332:4;1345:18;;;1288:83;20015:38;20044:8;20015:28;:38::i;:::-;1393:14;1389:57;;;1433:5;1418:20;;-1:-1:-1;;1418:20:0;;;19939:153;;:::o;47052:303::-;28513:10;28501:23;;;;:11;:23;;;;;;;;28493:53;;;;-1:-1:-1;;;28493:53:0;;;;;;;;;28559:12;28574:5;28580:8;;28574:15;;;;;;;;;;;;;;;;;;;;;;:23;-1:-1:-1;;;;;28574:23:0;;;;;;-1:-1:-1;28649:5:0;;:15;;28574:23;;28655:8;;28649:15;;;;;;;;;;;;;;;;;;:32;;;;:23;;;;:32;;;;;28682:10;28649:44;;;;;;;;;;28644:174;;28757:4;28710:5;28716:8;;28710:15;;;;;;;;;;;;;;;;;;;;;;;;:32;;;;:23;;;;:32;;;;;28743:10;28710:44;;;;;;;;:51;;-1:-1:-1;;28710:51:0;;;;;;;;;;;28776:5;;:15;;28710:32;28782:8;;28776:15;;;;;;;;;;;;;;;;:30;;;;;;;;;-1:-1:-1;;28776:30:0;;;;;;28644:174;28246:1;28834:5;28840:8;;28834:15;;;;;;;;;;;;;;;;;;;;;;:28;;;:41;;;:108;;;28924:18;;28892:5;28898:8;;28892:15;;;;;;;;;;;;;;;;;;;;;;:28;;;:50;;28834:108;28830:367;;;29053:1;29022:5;29028:8;;29022:15;;;;;;;;;;;;;;;;;;;;;;:32;;;;;;;-1:-1:-1;;29022:32:0;;;;;;;;;;29069:5;;:15;;29022:28;;29075:8;;29069:15;;;;;;;;;;;;;;;;:25;;;-1:-1:-1;;;;;29069:25:0;;;;;;;;;;;;-1:-1:-1;;29069:25:0;;;;;;47224:5;;47210:10;-1:-1:-1;;;;;47224:5:0;;;47210:19;47202:28;;;;;;47247:8;47243:103;47265:3;:10;47261:1;:14;;;47243:103;;;47297:37;47303:3;47307:1;47303:6;;;;;;;;;;;;;;;;47311:5;47317:1;47311:8;;;;;;;;;;;;;;;;47321:9;47331:1;47321:12;;;;;;;;;;;;;;;;47297:5;:37::i;:::-;47277:3;;47243:103;;;;28830:367;;;-1:-1:-1;;;;;;;;;;;29164:10:0;29176:8;;29148:37;;;;;;;;;;;;;;;;;28830:367;47052:303;;;;:::o;39409:18::-;;;;:::o;28302:44::-;;;;;;;;;;;;;;;:::o;20228:200::-;2508:5;;-1:-1:-1;;;;;2508:5:0;2494:10;:19;2486:28;;;;;;20329:6;20324:97;20345:7;:14;20341:1;:18;20324:97;;;20402:7;20381:6;:18;20388:7;20396:1;20388:10;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;20381:18:0;;;;;;;;;;;-1:-1:-1;20381:18:0;:28;;-1:-1:-1;;20381:28:0;;;;;;;;;;-1:-1:-1;20361:3:0;20324:97;;;;20228:200;;:::o;2930:125::-;2993:17;;-1:-1:-1;;;;;2993:17:0;2979:10;:31;2971:40;;;;;;3030:17;;3022:5;:25;;-1:-1:-1;;;;;;3022:25:0;-1:-1:-1;;;;;3030:17:0;;;3022:25;;;;;;2930:125::o;49992:1901::-;50179:10;50170:5;;;;:19;;;;;;;;;;50162:28;;;;;;50203:16;50222:22;50238:5;50222:15;:22::i;:::-;50203:41;;50285:43;50312:4;50319:8;50285:18;:43::i;:::-;50265:16;:63;;50257:72;;;;;;50346:54;;-1:-1:-1;;;50346:54:0;;-1:-1:-1;;50412:2:0;-1:-1:-1;;;;;;;;;;;20823:42:0;50346:29;;:54;;50384:4;;50391:8;;50346:54;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;50346:54:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;50346:54: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;50346:54:0;;;;;;;;;:69;50342:152;;50432:50;;-1:-1:-1;;;50432:50:0;;-1:-1:-1;;;;;;;;;;;20823:42:0;50432:27;;:50;;50460:8;;-1:-1:-1;;50478:2:0;50432:50;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;50432:50:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;50432:50:0;;;;50342:152;50506:17;50526:27;50530:16;50548:4;50526:3;:27::i;:::-;50506:47;-1:-1:-1;50577:7:0;50568:5;;;;:16;;;;;;;;;50564:1213;;;50686:2;50676:13;;50670:20;50785:56;;-1:-1:-1;;;50785:56:0;;50742:26;;;;-1:-1:-1;;;;;;;;;;;20823:42:0;50785:28;;:56;;50814:8;;50742:16;;50785:56;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;50785:56:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;50785: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;50785:56:0;;;;;;;;;-1:-1:-1;50858:104:0;;-1:-1:-1;;;50858:104:0;;-1:-1:-1;;;;;50858:27:0;;;;;:104;;-1:-1:-1;;;;;;;;;;;20823:42:0;20911;;50913:10;;20823:42;;20911;;50952:9;;50858:104;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;50858:104:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;-1:-1;;50979:72:0;;-1:-1:-1;;;50979:72:0;;-1:-1:-1;;;;;50979:33:0;;;-1:-1:-1;50979:33:0;;-1:-1:-1;50979:72:0;;-1:-1:-1;;;;;;;;;;;20823:42:0;51034:4;;51041:9;;50979:72;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;50979:72:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;50979:72:0;;;;50564:1213;;;;;51101:8;51092:5;;;;:17;;;;;;;;;51088:689;;;51126:108;;-1:-1:-1;;;51126:108:0;;-1:-1:-1;;;;;51126:28:0;;;;;:108;;-1:-1:-1;;;;;;;;;;;20823:42:0;20911;;-1:-1:-1;;51190:2:0;20823:42;;20911;;51190:2;;51126:108;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;51126:108:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;51126:108: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;51126:108:0;;;;;;;;;;51088:689;;;51265:17;51256:5;;;;:26;;;;;;;;;51252:525;;;51362:21;51387:104;20911:42;-1:-1:-1;;;;;51447:41:0;;:43;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;51447:43:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;51447:43: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;51447:43:0;;;;;;;;;51387:55;51437:4;51387:45;51408:23;:16;51429:1;51408:23;:20;:23;:::i;:::-;51387:16;;:45;:20;:45;:::i;:104::-;51508:115;;-1:-1:-1;;;51508:115:0;;51362:129;;-1:-1:-1;;;;;;51508:28:0;;;;;:115;;-1:-1:-1;;;;;;;;;;;20823:42:0;20911;;51362:129;;20823:42;;20911;;51606:16;;51508:115;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;51508:115:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;51508:115: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;51508:115:0;;;;;;;;;;51252:525;;51833:52;51865:8;51875:9;51833:31;:52::i;18801:239::-;2508:5;;-1:-1:-1;;;;;2508:5:0;2494:10;:19;2486:28;;;;;;-1:-1:-1;;;;;18882:21:0;;18878:155;;18920:5;;:22;;-1:-1:-1;;;;;18920:5:0;;;;:22;;;;;18935:6;;18920:5;:22;:5;:22;18935:6;18920:5;:22;;;;;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;18878:155:0;19007:5;;18975:46;;-1:-1:-1;;;;;18975:31:0;;;;19007:5;19014:6;18975:46;:31;:46;:::i;39434:27::-;;;-1:-1:-1;;;;;39434:27:0;;:::o;39361:39::-;;;-1:-1:-1;;;;;39361:39:0;;:::o;30548:246::-;-1:-1:-1;;;;;30616:21:0;;;;;;:11;:21;;;;;;;;30608:30;;;;;;30678:1;30657:18;;:22;30649:31;;;;;;-1:-1:-1;;;;;30716:21:0;30740:5;30716:21;;;:11;:21;;;;;:29;;-1:-1:-1;;30716:29:0;;;30756:18;:20;;-1:-1:-1;;30756:20:0;;;30548:246::o;5309:434::-;5367:7;5612:6;5608:47;;-1:-1:-1;5642:1:0;5635:8;;5608:47;5679:5;;;5683:1;5679;:5;:1;5703:5;;;;;:10;5695:19;;;;;;5734:1;-1:-1:-1;5309:434:0;;;;;:::o;4002:150::-;4060:7;4092:5;;;4116:6;;;;4108:15;;;;;6211:132;6269:7;6296:39;6300:1;6303;6296:39;;;;;;;;;;;;;;;;;:3;:39::i;21340:104::-;21424:5;;;21419:16;;;;21411:25;;;;;21230:104;21314:5;;;21309:16;;;;21301:25;;;;;17912:261;17990:7;-1:-1:-1;;;;;18014:21:0;;;;:45;;-1:-1:-1;;;;;;18039:20:0;;16300:42;18039:20;18014:45;18010:156;;;-1:-1:-1;;;;;;18083:11:0;;;18076:18;;18010:156;18134:20;;-1:-1:-1;;;18134:20:0;;-1:-1:-1;;;;;18134:15:0;;;;;:20;;18150:3;;18134:20;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;18134:20:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;18134:20: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;18134:20:0;;;;;;;;;18127:27;;;;30346:194;-1:-1:-1;;;;;30413:22:0;;;;;;:11;:22;;;;;;;;30412:23;30404:32;;;;;;-1:-1:-1;;;;;30472:22:0;;;;;:11;:22;;;;;:29;;-1:-1:-1;;30472:29:0;30497:4;30472:29;;;;;;30512:18;:20;;;;;;;30346:194::o;17271:633::-;17382:11;17378:50;;17410:7;;17378:50;-1:-1:-1;;;;;17444:21:0;;;;:45;;-1:-1:-1;;;;;;17469:20:0;;16300:42;17469:20;17444:45;17440:457;;;-1:-1:-1;;;;;17514:18:0;;17522:10;17514:18;:41;;;;;17549:6;17536:9;:19;;17514:41;17506:71;;;;-1:-1:-1;;;17506:71:0;;;;;;;;;-1:-1:-1;;;;;17596:19:0;;17610:4;17596:19;17592:97;;17636:37;;-1:-1:-1;;;;;17636:29:0;;;:37;;;;;17666:6;;17636:37;;;;17666:6;17636:29;:37;;;;;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;17636:37:0;17592:97;17719:6;17707:9;:18;17703:110;;;17746:10;:51;17766:30;17774:9;17789:6;17766:30;:22;:30;:::i;:::-;17746:51;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;17703:110:0;17440:457;;;17845:40;-1:-1:-1;;;;;17845:22:0;;17868:4;17874:2;17878:6;17845:40;:22;:40;:::i;1540:508::-;1957:4;2003:17;2035:7;1540:508;:::o;19810:121::-;1189:12;;;;;;;;:31;;;1205:15;:13;:15::i;:::-;1189:47;;;-1:-1:-1;1225:11:0;;;;1224:12;1189:47;1181:56;;;;;;1246:19;1269:12;;;;;;1268:13;1288:83;;;;1317:12;:19;;-1:-1:-1;;;;1317:19:0;;;;;1345:18;1332:4;1345:18;;;1288:83;19862:30;:28;:30::i;29245:81::-;1189:12;;;;;;;;:31;;;1205:15;:13;:15::i;:::-;1189:47;;;-1:-1:-1;1225:11:0;;;;1224:12;1189:47;1181:56;;;;;;1246:19;1269:12;;;;;;1268:13;1288:83;;;;1317:12;:19;;-1:-1:-1;;;;1317:19:0;;;;;1345:18;1332:4;1345:18;;;1288:83;29297:21;29307:10;29297:9;:21::i;52927:1441::-;53085:4;53104:19;53143:42;53104:82;;-1:-1:-1;;53226:10:0;-1:-1:-1;;;;;53226:20:0;;53255:4;53270:2;-1:-1:-1;;;;;53270:10:0;;:12;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;53270:12:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;53270:12: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;53270:12:0;;;;;;;;;53226:58;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;53226:58:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;53226:58: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;53226:58:0;;;;;;;;;:73;53222:160;;53316:10;-1:-1:-1;;;;;53316:18:0;;53343:2;-1:-1:-1;;;;;53343:10:0;;:12;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;53343:12:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;53343:12: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;53343:12:0;;;;;;;;;-1:-1:-1;;53316:54:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;53316:54:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;53316:54:0;;;;53222:160;53394:21;53418:44;-1:-1:-1;;;;;53418:29:0;;53456:4;53418:44;:29;:44;:::i;:::-;53394:68;-1:-1:-1;53473:19:0;53495:42;-1:-1:-1;;;;;53495:27:0;;53531:4;53495:42;:27;:42;:::i;:::-;53473:64;;53701:16;53888:2;53885:1;53877:5;53871:12;53864:4;53857:5;53853:16;53850:1;53846:2;53839:4;53834:3;53830:14;53825:66;-1:-1:-1;;53923:1:0;53917:8;54059:16;54036:19;53989:44;-1:-1:-1;;;;;53989:29:0;;54027:4;53989:44;:29;:44;:::i;:::-;:66;:86;;53981:115;;;;-1:-1:-1;;;53981:115:0;;;;;;;;;54109:25;54137:42;-1:-1:-1;;;;;54137:27:0;;54173:4;54137:42;:27;:42;:::i;:::-;54109:70;;54236:17;54219:14;:34;54198:17;:55;;54190:84;;;;-1:-1:-1;;;54190:84:0;;;;;;;;;54294:38;54298:17;54317:14;54294:3;:38::i;:::-;54287:45;52927:1441;-1:-1:-1;;;;;;;;;;;52927:1441:0:o;52553:366::-;52642:7;52662:17;52759:3;52749:7;52742:3;;52734:22;:28;;;;;;;-1:-1:-1;52777:13:0;;52773:96;;52840:5;;52807:50;;-1:-1:-1;;;;;52807:32:0;;;;52840:5;52847:9;52807:50;:32;:50;:::i;:::-;52888:23;52892:7;52901:9;52888:3;:23::i;:::-;52881:30;52553:366;-1:-1:-1;;;;;52553:366:0:o;16352:140::-;16441:43;16459:5;16466:2;16470:6;16478:5;16441:17;:43::i;22204:113::-;22257:6;22018:8;22280:23;22284:9;22288:1;22291;22284:3;:9::i;:::-;22295:7;22280:3;:23::i;:::-;:29;;;;;;;22204:113;-1:-1:-1;;;22204:113:0:o;2701:100::-;1189:12;;;;;;;;:31;;;1205:15;:13;:15::i;:::-;1189:47;;;-1:-1:-1;1225:11:0;;;;1224:12;1189:47;1181:56;;;;;;1246:19;1269:12;;;;;;1268:13;1288:83;;;;1317:12;:19;;-1:-1:-1;;;;1317:19:0;;;;;1345:18;1332:4;1345:18;;;1288:83;2777:5;:16;;-1:-1:-1;;;;;;2777:16:0;-1:-1:-1;;;;;2777:16:0;;;;;1389:57;;;;1433:5;1418:20;;-1:-1:-1;;1418:20:0;;;2701:100;;:::o;52114:397::-;52209:16;52351:2;52348:1;52340:5;52334:12;52327:4;52320:5;52316:16;52305:9;52300:3;52293:4;52288:3;52284:14;52279:75;52386:1;52380:8;52368:20;;52416:9;52409:17;52445:1;52440:53;;;;52402:91;;52440:53;52476:1;52473;52466:12;51948:158;52084:2;52076:11;52070:18;;52047:52::o;27641:259::-;27726:7;27761:26;:24;:26::i;:::-;-1:-1:-1;;;;;27749:38:0;:8;-1:-1:-1;;;;;27749:38:0;;27746:92;;;-1:-1:-1;;;;;;27811:15:0;;;27804:22;;27746:92;27857:35;;-1:-1:-1;;;27857:35:0;;-1:-1:-1;;;;;27857:26:0;;;;;:35;;27884:7;;27857:35;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;27857:35:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;27857: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;27857:35:0;;;;;;;;26866:254;26962:20;26654:42;-1:-1:-1;;;;;26985:73:0;;:75;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;26985:75:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;26985:75: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;26985:75:0;;;;;;;;;26962:98;;27071:41;27088:4;27094:8;27104:7;27071:16;:41::i;6873:345::-;6959:7;7061:12;7054:5;7046:28;;;;-1:-1:-1;;;7046:28:0;;;;;;;;;;;7085:9;7101:1;7097;:5;;;;;;;6873:345;-1:-1:-1;;;;;6873:345:0:o;4427:102::-;4485:7;4512:9;4516:1;4519;4512:3;:9::i;13133:204::-;13260:68;;13234:95;;13253:5;;-1:-1:-1;;;13283:27:0;13260:68;;13312:4;;13318:2;;13322:5;;13260:68;;;;;;;;-1:-1:-1;;26:21;;;22:32;6:49;;13260:68:0;;;49:4:-1;25:18;;61:17;;-1:-1;;;;;182:15;-1:-1;;;;;;13260:68:0;;;179:29:-1;;;;160:49;;;13234:18:0;:95::i;2615:78::-;1189:12;;;;;;;;:31;;;1205:15;:13;:15::i;:::-;1189:47;;;-1:-1:-1;1225:11:0;;;;1224:12;1189:47;1181:56;;;;;;1246:19;1269:12;;;;;;1268:13;1288:83;;;;1317:12;:19;;-1:-1:-1;;;;1317:19:0;;;;;1345:18;1332:4;1345:18;;;1288:83;2667:5;:18;;-1:-1:-1;;;;;;2667:18:0;2675:10;2667:18;;;1389:57;;;;1433:5;1418:20;;-1:-1:-1;;1418:20:0;;;2615:78;:::o;16500:553::-;16600:4;16621:11;16617:55;;-1:-1:-1;16656:4:0;16649:11;;16617:55;-1:-1:-1;;;;;16688:21:0;;;;:45;;-1:-1:-1;;;;;;16713:20:0;;16300:42;16713:20;16688:45;16684:362;;;16754:7;16750:196;;;16789:33;;-1:-1:-1;;;;;16789:25:0;;;:33;;;;;16815:6;;16789:33;;;;16815:6;16789:25;:33;;;;;;;16782:40;;;;16750:196;16863:37;;-1:-1:-1;;;;;16863:29:0;;;:37;;;;;16893:6;;16863:37;;;;16893:6;16863:29;:37;;;;;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;16863:37:0;16926:4;16919:11;;;;16684:362;16978:30;-1:-1:-1;;;;;16978:18:0;;16997:2;17001:6;16978:30;:18;:30;:::i;:::-;-1:-1:-1;17030:4:0;17023:11;;21450:118;21502:6;21529;;;:30;;-1:-1:-1;;21544:5:0;;;21558:1;21553;21544:5;21553:1;21539:15;;;;;:20;21529:30;21521:39;;;;;26126:121;26197:42;26126:121;:::o;27128:505::-;27249:26;:24;:26::i;:::-;-1:-1:-1;;;;;27237:38:0;:8;-1:-1:-1;;;;;27237:38:0;;27234:327;;;27292:31;27342:12;27292:64;;27414:11;27431:15;-1:-1:-1;;;;;27431:20:0;27458:7;27431:39;;;;;;;;;;;;;;;;;;;;;;;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;;27413:57:0;;;27495:6;27487:41;;;;-1:-1:-1;;;27487:41:0;;;;;;;;;27543:7;;;;27234:327;27573:52;-1:-1:-1;;;;;27573:29:0;;27603:12;27617:7;27573:52;:29;:52;:::i;14862:997::-;15466:27;15474:5;-1:-1:-1;;;;;15466:25:0;;:27::i;:::-;15458:36;;;;;;15568:12;15582:23;15617:5;-1:-1:-1;;;;;15609:19:0;15629:4;15609: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;;15567:67:0;;;;15653:7;15645:16;;;;;;15678:17;;:21;15674:178;;15820:10;15809:30;;;;;;;;;;;;;;15801:39;;;;;12949:176;13058:58;;13032:85;;13051:5;;-1:-1:-1;;;13081:23:0;13058:58;;13106:2;;13110:5;;13058:58;;;;9111:810;9171:4;9830:20;;9673:66;9870:15;;;;;:42;;-1:-1:-1;9889:23:0;;;9862:51;-1:-1:-1;;9111:810:0:o;5:130:-1:-;72:20;;97:33;72:20;97:33;;142:134;220:13;;238:33;220:13;238:33;;611:707;;728:3;721:4;713:6;709:17;705:27;695:2;;746:1;743;736:12;695:2;783:6;770:20;805:80;820:64;877:6;820:64;;;805:80;;;796:89;;902:5;927:6;920:5;913:21;957:4;949:6;945:17;935:27;;979:4;974:3;970:14;963:21;;1032:6;1079:3;1071:4;1063:6;1059:17;1054:3;1050:27;1047:36;1044:2;;;1096:1;1093;1086:12;1044:2;1121:1;1106:206;1131:6;1128:1;1125:13;1106:206;;;1189:3;1211:37;1244:3;1232:10;1211:37;;;1199:50;;-1:-1;1272:4;1263:14;;;;1291;;;;;1153:1;1146:9;1106:206;;;1110:14;688:630;;;;;;;;1352:731;;1477:3;1470:4;1462:6;1458:17;1454:27;1444:2;;1495:1;1492;1485:12;1444:2;1532:6;1519:20;1554:88;1569:72;1634:6;1569:72;;1554:88;1545:97;;1659:5;1684:6;1677:5;1670:21;1714:4;1706:6;1702:17;1692:27;;1736:4;1731:3;1727:14;1720:21;;1789:6;1836:3;1828:4;1820:6;1816:17;1811:3;1807:27;1804:36;1801:2;;;1853:1;1850;1843:12;1801:2;1878:1;1863:214;1888:6;1885:1;1882:13;1863:214;;;1946:3;1968:45;2009:3;1997:10;1968:45;;;1956:58;;-1:-1;2037:4;2028:14;;;;2056;;;;;1910:1;1903:9;1863:214;;2107:693;;2229:3;2222:4;2214:6;2210:17;2206:27;2196:2;;2247:1;2244;2237:12;2196:2;2284:6;2271:20;2306:85;2321:69;2383:6;2321:69;;2306:85;2419:21;;;2463:4;2451:17;;;;2297:94;;-1:-1;2476:14;;2451:17;2571:1;2556:238;2581:6;2578:1;2575:13;2556:238;;;2664:3;2651:17;2643:6;2639:30;2688:42;2726:3;2714:10;2688:42;;;2676:55;;-1:-1;2754:4;2745:14;;;;2773;;;;;2603:1;2596:9;2556:238;;2826:707;;2943:3;2936:4;2928:6;2924:17;2920:27;2910:2;;2961:1;2958;2951:12;2910:2;2998:6;2985:20;3020:80;3035:64;3092:6;3035:64;;3020:80;3011:89;;3117:5;3142:6;3135:5;3128:21;3172:4;3164:6;3160:17;3150:27;;3194:4;3189:3;3185:14;3178:21;;3247:6;3294:3;3286:4;3278:6;3274:17;3269:3;3265:27;3262:36;3259:2;;;3311:1;3308;3301:12;3259:2;3336:1;3321:206;3346:6;3343:1;3340:13;3321:206;;;3404:3;3426:37;3459:3;3447:10;3426:37;;;3414:50;;-1:-1;3487:4;3478:14;;;;3506;;;;;3368:1;3361:9;3321:206;;3541:124;3605:20;;3630:30;3605:20;3630:30;;3672:128;3747:13;;3765:30;3747:13;3765:30;;3808:432;;3905:3;3898:4;3890:6;3886:17;3882:27;3872:2;;3923:1;3920;3913:12;3872:2;3960:6;3947:20;3982:60;3997:44;4034:6;3997:44;;3982:60;3973:69;;4062:6;4055:5;4048:21;4098:4;4090:6;4086:17;4131:4;4124:5;4120:16;4166:3;4157:6;4152:3;4148:16;4145:25;4142:2;;;4183:1;4180;4173:12;4142:2;4193:41;4227:6;4222:3;4217;4193:41;;;3865:375;;;;;;;;4697:130;4764:20;;4789:33;4764:20;4789:33;;4834:134;4912:13;;4930:33;4912:13;4930:33;;4975:241;;5079:2;5067:9;5058:7;5054:23;5050:32;5047:2;;;5095:1;5092;5085:12;5047:2;5130:1;5147:53;5192:7;5172:9;5147:53;;5223:263;;5338:2;5326:9;5317:7;5313:23;5309:32;5306:2;;;5354:1;5351;5344:12;5306:2;5389:1;5406:64;5462:7;5442:9;5406:64;;6043:617;;;;;6198:3;6186:9;6177:7;6173:23;6169:33;6166:2;;;6215:1;6212;6205:12;6166:2;6250:1;6267:53;6312:7;6292:9;6267:53;;;6257:63;;6229:97;6357:2;6375:53;6420:7;6411:6;6400:9;6396:22;6375:53;;;6365:63;;6336:98;6465:2;6483:53;6528:7;6519:6;6508:9;6504:22;6483:53;;;6473:63;;6444:98;6573:2;6591:53;6636:7;6627:6;6616:9;6612:22;6591:53;;;6581:63;;6552:98;6160:500;;;;;;;;6667:743;;;;;;6839:3;6827:9;6818:7;6814:23;6810:33;6807:2;;;6856:1;6853;6846:12;6807:2;6891:1;6908:53;6953:7;6933:9;6908:53;;;6898:63;;6870:97;6998:2;7016:53;7061:7;7052:6;7041:9;7037:22;7016:53;;;7006:63;;6977:98;7106:2;7124:53;7169:7;7160:6;7149:9;7145:22;7124:53;;;7114:63;;7085:98;7214:2;7232:53;7277:7;7268:6;7257:9;7253:22;7232:53;;;7222:63;;7193:98;7322:3;7341:53;7386:7;7377:6;7366:9;7362:22;7341:53;;;7331:63;;7301:99;6801:609;;;;;;;;;7417:360;;;7535:2;7523:9;7514:7;7510:23;7506:32;7503:2;;;7551:1;7548;7541:12;7503:2;7586:1;7603:53;7648:7;7628:9;7603:53;;;7593:63;;7565:97;7693:2;7711:50;7753:7;7744:6;7733:9;7729:22;7711:50;;;7701:60;;7672:95;7497:280;;;;;;7784:366;;;7905:2;7893:9;7884:7;7880:23;7876:32;7873:2;;;7921:1;7918;7911:12;7873:2;7956:1;7973:53;8018:7;7998:9;7973:53;;;7963:63;;7935:97;8063:2;8081:53;8126:7;8117:6;8106:9;8102:22;8081:53;;8157:721;;;;;8321:3;8309:9;8300:7;8296:23;8292:33;8289:2;;;8338:1;8335;8328:12;8289:2;8373:1;8390:53;8435:7;8415:9;8390:53;;;8380:63;;8352:97;8480:2;8498:53;8543:7;8534:6;8523:9;8519:22;8498:53;;;8488:63;;8459:98;8588:2;8606:53;8651:7;8642:6;8631:9;8627:22;8606:53;;;8596:63;;8567:98;8724:2;8713:9;8709:18;8696:32;-1:-1;;;;;8740:6;8737:30;8734:2;;;8780:1;8777;8770:12;8734:2;8800:62;8854:7;8845:6;8834:9;8830:22;8800:62;;8885:377;;9014:2;9002:9;8993:7;8989:23;8985:32;8982:2;;;9030:1;9027;9020:12;8982:2;9065:31;;-1:-1;;;;;9105:30;;9102:2;;;9148:1;9145;9138:12;9102:2;9168:78;9238:7;9229:6;9218:9;9214:22;9168:78;;9269:496;;;9412:2;9400:9;9391:7;9387:23;9383:32;9380:2;;;9428:1;9425;9418:12;9380:2;9463:31;;-1:-1;;;;;9503:30;;9500:2;;;9546:1;9543;9536:12;9500:2;9566:78;9636:7;9627:6;9616:9;9612:22;9566:78;;9772:925;;;;9998:2;9986:9;9977:7;9973:23;9969:32;9966:2;;;10014:1;10011;10004:12;9966:2;10049:31;;-1:-1;;;;;10089:30;;10086:2;;;10132:1;10129;10122:12;10086:2;10152:86;10230:7;10221:6;10210:9;10206:22;10152:86;;;10142:96;;10028:216;10303:2;10292:9;10288:18;10275:32;-1:-1;;;;;10319:6;10316:30;10313:2;;;10359:1;10356;10349:12;10313:2;10379:83;10454:7;10445:6;10434:9;10430:22;10379:83;;;10369:93;;10254:214;10527:2;10516:9;10512:18;10499:32;-1:-1;;;;;10543:6;10540:30;10537:2;;;10583:1;10580;10573:12;10537:2;10603:78;10673:7;10664:6;10653:9;10649:22;10603:78;;;10593:88;;10478:209;9960:737;;;;;;10704:257;;10816:2;10804:9;10795:7;10791:23;10787:32;10784:2;;;10832:1;10829;10822:12;10784:2;10867:1;10884:61;10937:7;10917:9;10884:61;;10968:337;;11077:2;11065:9;11056:7;11052:23;11048:32;11045:2;;;11093:1;11090;11083:12;11045:2;11128:31;;-1:-1;;;;;11168:30;;11165:2;;;11211:1;11208;11201:12;11165:2;11231:58;11281:7;11272:6;11261:9;11257:22;11231:58;;11312:241;;11416:2;11404:9;11395:7;11391:23;11387:32;11384:2;;;11432:1;11429;11422:12;11384:2;11467:1;11484:53;11529:7;11509:9;11484:53;;11560:263;;11675:2;11663:9;11654:7;11650:23;11646:32;11643:2;;;11691:1;11688;11681:12;11643:2;11726:1;11743:64;11799:7;11779:9;11743:64;;11830:491;;;;11968:2;11956:9;11947:7;11943:23;11939:32;11936:2;;;11984:1;11981;11974:12;11936:2;12019:1;12036:53;12081:7;12061:9;12036:53;;;12026:63;;11998:97;12126:2;12144:53;12189:7;12180:6;12169:9;12165:22;12144:53;;;12134:63;;12105:98;12234:2;12252:53;12297:7;12288:6;12277:9;12273:22;12252:53;;12329:173;;12416:46;12458:3;12450:6;12416:46;;;-1:-1;;12491:4;12482:14;;12409:93;12510:142;12601:45;12640:5;12601:45;;;12596:3;12589:58;12583:69;;;12659:137;12758:32;12784:5;12758:32;;13033:152;13134:45;13154:24;13172:5;13154:24;;;13134:45;;13223:690;;13368:54;13416:5;13368:54;;;13435:86;13514:6;13509:3;13435:86;;;13428:93;;13542:56;13592:5;13542:56;;;13618:7;13646:1;13631:260;13656:6;13653:1;13650:13;13631:260;;;13723:6;13717:13;13744:63;13803:3;13788:13;13744:63;;;13737:70;;13824:60;13877:6;13824:60;;;13814:70;-1:-1;;13678:1;13671:9;13631:260;;;-1:-1;13904:3;;13347:566;-1:-1;;;;;13347:566;13921:104;13998:21;14013:5;13998:21;;14055:297;;14169:70;14232:6;14227:3;14169:70;;;14162:77;;14251:43;14287:6;14282:3;14275:5;14251:43;;;14316:29;14338:6;14316:29;;;14307:39;;;;14155:197;-1:-1;;;14155:197;14383:310;;14515:88;14596:6;14591:3;14515:88;;;14508:95;;14615:43;14651:6;14646:3;14639:5;14615:43;;;-1:-1;;14671:16;;14501:192;14701:343;;14811:38;14843:5;14811:38;;;14861:70;14924:6;14919:3;14861:70;;;14854:77;;14936:52;14981:6;14976:3;14969:4;14962:5;14958:16;14936:52;;;15009:29;15031:6;15009:29;;15051:356;;15179:38;15211:5;15179:38;;;15229:88;15310:6;15305:3;15229:88;;;15222:95;;15322:52;15367:6;15362:3;15355:4;15348:5;15344:16;15322:52;;;15386:16;;;;;15159:248;-1:-1;;15159:248;15414:176;15522:62;15578:5;15522:62;;15952:317;;16112:67;16176:2;16171:3;16112:67;;;-1:-1;;;16192:40;;16260:2;16251:12;;16098:171;-1:-1;;16098:171;16278:316;;16438:67;16502:2;16497:3;16438:67;;;-1:-1;;;16518:39;;16585:2;16576:12;;16424:170;-1:-1;;16424:170;16603:317;;16763:67;16827:2;16822:3;16763:67;;;-1:-1;;;16843:40;;16911:2;16902:12;;16749:171;-1:-1;;16749:171;16929:377;;17089:67;17153:2;17148:3;17089:67;;;17189:34;17169:55;;-1:-1;;;17253:2;17244:12;;17237:32;17297:2;17288:12;;17075:231;-1:-1;;17075:231;17315:322;;17475:67;17539:2;17534:3;17475:67;;;-1:-1;;;17555:45;;17628:2;17619:12;;17461:176;-1:-1;;17461:176;17646:316;;17806:67;17870:2;17865:3;17806:67;;;-1:-1;;;17886:39;;17953:2;17944:12;;17792:170;-1:-1;;17792:170;17971:324;;18131:67;18195:2;18190:3;18131:67;;;18231:26;18211:47;;18286:2;18277:12;;18117:178;-1:-1;;18117:178;18304:296;;18481:83;18562:1;18557:3;18481:83;;18608:110;18689:23;18706:5;18689:23;;18725:113;18808:24;18826:5;18808:24;;18845:152;18946:45;18966:24;18984:5;18966:24;;;18946:45;;19004:110;19085:23;19102:5;19085:23;;19121:244;;19240:75;19311:3;19302:6;19240:75;;;-1:-1;19337:2;19328:12;;19228:137;-1:-1;19228:137;19372:383;;19519:75;19590:3;19581:6;19519:75;;;19616:2;19611:3;19607:12;19600:19;;19630:75;19701:3;19692:6;19630:75;;;-1:-1;19727:2;19718:12;;19507:248;-1:-1;;19507:248;19762:282;;19916:103;20015:3;20006:6;19998;19916:103;;20051:262;;20195:93;20284:3;20275:6;20195:93;;20320:370;;20518:147;20661:3;20518:147;;20697:213;20815:2;20800:18;;20829:71;20804:9;20873:6;20829:71;;20917:229;21043:2;21028:18;;21057:79;21032:9;21109:6;21057:79;;21405:340;21559:2;21544:18;;21573:79;21548:9;21625:6;21573:79;;;21663:72;21731:2;21720:9;21716:18;21707:6;21663:72;;21752:467;21942:2;21927:18;;21956:79;21931:9;22008:6;21956:79;;;22046:80;22122:2;22111:9;22107:18;22098:6;22046:80;;;22137:72;22205:2;22194:9;22190:18;22181:6;22137:72;;22226:647;22454:3;22439:19;;22469:79;22443:9;22521:6;22469:79;;;22559:72;22627:2;22616:9;22612:18;22603:6;22559:72;;;22642;22710:2;22699:9;22695:18;22686:6;22642:72;;;22762:9;22756:4;22752:20;22747:2;22736:9;22732:18;22725:48;22787:76;22858:4;22849:6;22787:76;;;22779:84;22425:448;-1:-1;;;;;;22425:448;22880:444;23062:2;23047:18;;23076:79;23051:9;23128:6;23076:79;;;23203:9;23197:4;23193:20;23188:2;23177:9;23173:18;23166:48;23228:86;23309:4;23300:6;23292;23228:86;;23331:340;23485:2;23470:18;;23499:79;23474:9;23551:6;23499:79;;;23589:72;23657:2;23646:9;23642:18;23633:6;23589:72;;23678:451;23860:2;23845:18;;23874:71;23849:9;23918:6;23874:71;;24136:435;24310:2;24295:18;;24324:71;24299:9;24368:6;24324:71;;;24406:72;24474:2;24463:9;24459:18;24450:6;24406:72;;24578:771;24836:3;24821:19;;24851:71;24825:9;24895:6;24851:71;;;24933:72;25001:2;24990:9;24986:18;24977:6;24933:72;;;25016;25084:2;25073:9;25069:18;25060:6;25016:72;;;25099;25167:2;25156:9;25152:18;25143:6;25099:72;;;25182:73;25250:3;25239:9;25235:19;25226:6;25182:73;;;25266;25334:3;25323:9;25319:19;25310:6;25266:73;;;24807:542;;;;;;;;;;25356:324;25502:2;25487:18;;25516:71;25491:9;25560:6;25516:71;;25687:755;25937:3;25922:19;;25952:71;25926:9;25996:6;25952:71;;;26034:72;26102:2;26091:9;26087:18;26078:6;26034:72;;;26117:70;26183:2;26172:9;26168:18;26159:6;26117:70;;;26198;26264:2;26253:9;26249:18;26240:6;26198:70;;;26279:71;26345:3;26334:9;26330:19;26321:6;26279:71;;;26361;26427:3;26416:9;26412:19;26403:6;26361:71;;26449:361;26617:2;26631:47;;;26602:18;;26692:108;26602:18;26786:6;26692:108;;26817:201;26929:2;26914:18;;26943:65;26918:9;26981:6;26943:65;;27025:263;27168:2;27153:18;;27182:96;27157:9;27251:6;27182:96;;27295:301;27433:2;27447:47;;;27418:18;;27508:78;27418:18;27572:6;27508:78;;27603:407;27794:2;27808:47;;;27779:18;;27869:131;27779:18;27869:131;;28017:407;28208:2;28222:47;;;28193:18;;28283:131;28193:18;28283:131;;28431:407;28622:2;28636:47;;;28607:18;;28697:131;28607:18;28697:131;;28845:407;29036:2;29050:47;;;29021:18;;29111:131;29021:18;29111:131;;29259:407;29450:2;29464:47;;;29435:18;;29525:131;29435:18;29525:131;;29673:407;29864:2;29878:47;;;29849:18;;29939:131;29849:18;29939:131;;30087:407;30278:2;30292:47;;;30263:18;;30353:131;30263:18;30353:131;;30501:316;30643:2;30628:18;;30657:69;30632:9;30699:6;30657:69;;;30737:70;30803:2;30792:9;30788:18;30779:6;30737:70;;30824:213;30942:2;30927:18;;30956:71;30931:9;31000:6;30956:71;;31044:324;31190:2;31175:18;;31204:71;31179:9;31248:6;31204:71;;31375:256;31437:2;31431:9;31463:17;;;-1:-1;;;;;31523:34;;31559:22;;;31520:62;31517:2;;;31595:1;31592;31585:12;31517:2;31611;31604:22;31415:216;;-1:-1;31415:216;31638:304;;-1:-1;;;;;31789:6;31786:30;31783:2;;;31829:1;31826;31819:12;31783:2;-1:-1;31864:4;31852:17;;;31917:15;;31720:222;32895:317;;-1:-1;;;;;33026:6;33023:30;33020:2;;;33066:1;33063;33056:12;33020:2;-1:-1;33197:4;33133;33110:17;;;;-1:-1;;33106:33;33187:15;;32957:255;33547:151;33671:4;33662:14;;33619:79;33705:137;33808:12;;33779:63;34222:178;34340:19;;;34389:4;34380:14;;34333:67;34580:144;34715:3;34693:31;-1:-1;34693:31;34904:91;;34966:24;34984:5;34966:24;;35108:85;35174:13;35167:21;;35150:43;35200:84;35272:6;35261:18;;35244:40;35291:121;-1:-1;;;;;35353:54;;35336:76;35419:72;35481:5;35464:27;35498:96;-1:-1;;;;;35559:30;;35542:52;35601:129;;35688:37;35719:5;35737:171;;35841:62;35897:5;35841:62;;36299:145;36380:6;36375:3;36370;36357:30;-1:-1;36436:1;36418:16;;36411:27;36350:94;36453:268;36518:1;36525:101;36539:6;36536:1;36533:13;36525:101;;;36606:11;;;36600:18;36587:11;;;36580:39;36561:2;36554:10;36525:101;;;36641:6;36638:1;36635:13;36632:2;;;-1:-1;;36706:1;36688:16;;36681:27;36502:219;36729:95;;36793:26;36813:5;36831:89;36895:20;36909:5;36895:20;;37008:97;37096:2;37076:14;-1:-1;;37072:28;;37056:49;37113:94;37187:2;37183:14;;37155:52;37215:117;37284:24;37302:5;37284:24;;;37277:5;37274:35;37264:2;;37323:1;37320;37313:12;37479:111;37545:21;37560:5;37545:21;;37597:117;37666:24;37684:5;37666:24;

Swarm Source

bzzr://1abc07de78abf7fd8cc19004160c96eb2d1bedc83a27e9173131adee7a8ecf90

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

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.