ETH Price: $3,125.96 (+0.20%)
Gas: 3 Gwei

Contract

0x2F9EC37d6CcFFf1caB21733BdaDEdE11c823cCB0
 

Overview

ETH Balance

0 ETH

Eth Value

$0.00
Transaction Hash
Method
Block
From
To
Value
0x1049f3c2fc0413115f5d7807e08684cea6bfa09fea3646da78900a25728f9487Convert By Path(pending)2024-05-19 21:55:518 hrs ago1716155751IN
Bancor: Swaps
0 ETH(Pending)(Pending)
0xcaef750484da4d59491b6b326511d84f3b0d7de76b6aa360833bf4977c302659Convert By Path(pending)2024-05-19 7:33:4222 hrs ago1716104022IN
Bancor: Swaps
0.026261 ETH(Pending)(Pending)
0xdd249045b95392b413a741fe2fa07e7727ceda14700bf6a9456e5d8d2ce0f5c8Convert By Path(pending)2024-05-19 6:09:1723 hrs ago1716098957IN
Bancor: Swaps
0.00025 ETH(Pending)(Pending)
0x6eb222974d12c9d018d051eb2a222deb42dbf54878f1d03372e29b6e95c5f9e1Convert By Path(pending)2024-05-19 2:31:3827 hrs ago1716085898IN
Bancor: Swaps
0 ETH(Pending)(Pending)
Convert By Path199091302024-05-20 5:44:1112 mins ago1716183851IN
Bancor: Swaps
1.91260845 ETH0.0017323613.58949461
Convert By Path199091212024-05-20 5:42:2313 mins ago1716183743IN
Bancor: Swaps
1.9128757 ETH0.001737513.62987316
Convert By Path199089602024-05-20 5:09:5946 mins ago1716181799IN
Bancor: Swaps
0 ETH0.000423052.69441582
Convert By Path199089422024-05-20 5:06:2349 mins ago1716181583IN
Bancor: Swaps
1.91430009 ETH0.0018363414.40522863
Convert By Path199089392024-05-20 5:05:4750 mins ago1716181547IN
Bancor: Swaps
2 ETH0.000418472.89497295
Convert By Path199089372024-05-20 5:05:2350 mins ago1716181523IN
Bancor: Swaps
2 ETH0.000387382.68816
Convert By Path199089282024-05-20 5:03:3552 mins ago1716181415IN
Bancor: Swaps
2 ETH0.00039653.11095134
Convert By Path199089222024-05-20 5:02:1154 mins ago1716181331IN
Bancor: Swaps
2 ETH0.00043312.99614786
Convert By Path199088872024-05-20 4:54:591 hr ago1716180899IN
Bancor: Swaps
0 ETH0.000494783.15123006
Convert By Path199088392024-05-20 4:45:111 hr ago1716180311IN
Bancor: Swaps
0 ETH0.000472983.04019683
Convert By Path199087442024-05-20 4:26:111 hr ago1716179171IN
Bancor: Swaps
0 ETH0.000463252.97764458
Convert By Path199087402024-05-20 4:25:231 hr ago1716179123IN
Bancor: Swaps
0 ETH0.000455562.78386794
Convert By Path199087272024-05-20 4:22:471 hr ago1716178967IN
Bancor: Swaps
0 ETH0.000432542.9518241
Convert By Path199079532024-05-20 1:47:234 hrs ago1716169643IN
Bancor: Swaps
0 ETH0.000457572.91426656
Convert By Path199078762024-05-20 1:31:594 hrs ago1716168719IN
Bancor: Swaps
0 ETH0.000506653.25664633
Convert By Path199074712024-05-20 0:10:355 hrs ago1716163835IN
Bancor: Swaps
0 ETH0.000513333.29983802
Convert By Path199072602024-05-19 23:27:596 hrs ago1716161279IN
Bancor: Swaps
0 ETH0.000469483.01770711
Convert By Path199071312024-05-19 23:02:116 hrs ago1716159731IN
Bancor: Swaps
0 ETH0.000398492.56141261
Convert By Path199071172024-05-19 22:59:236 hrs ago1716159563IN
Bancor: Swaps
0 ETH0.000559252.70832798
Convert By Path199069922024-05-19 22:33:597 hrs ago1716158039IN
Bancor: Swaps
0 ETH0.000438532.79321036
Convert By Path199066912024-05-19 21:33:118 hrs ago1716154391IN
Bancor: Swaps
0 ETH0.001019584.25780734
View all transactions

Latest 25 internal transactions (View All)

Advanced mode:
Parent Transaction Hash Block From To Value
199091772024-05-20 5:53:352 mins ago1716184415
Bancor: Swaps
2.4 ETH
199091772024-05-20 5:53:352 mins ago1716184415
Bancor: Swaps
2.4 ETH
199091712024-05-20 5:52:233 mins ago1716184343
Bancor: Swaps
1.893504 ETH
199091712024-05-20 5:52:233 mins ago1716184343
Bancor: Swaps
1.893504 ETH
199091662024-05-20 5:51:234 mins ago1716184283
Bancor: Swaps
1.656816 ETH
199091662024-05-20 5:51:234 mins ago1716184283
Bancor: Swaps
1.656816 ETH
199091622024-05-20 5:50:355 mins ago1716184235
Bancor: Swaps
1.18677 ETH
199091622024-05-20 5:50:355 mins ago1716184235
Bancor: Swaps
1.18677 ETH
199091552024-05-20 5:49:117 mins ago1716184151
Bancor: Swaps
2.38143 ETH
199091552024-05-20 5:49:117 mins ago1716184151
Bancor: Swaps
2.38143 ETH
199091502024-05-20 5:48:118 mins ago1716184091
Bancor: Swaps
1.190715 ETH
199091502024-05-20 5:48:118 mins ago1716184091
Bancor: Swaps
1.190715 ETH
199091482024-05-20 5:47:478 mins ago1716184067
Bancor: Swaps
2.38143 ETH
199091482024-05-20 5:47:478 mins ago1716184067
Bancor: Swaps
2.38143 ETH
199091402024-05-20 5:46:1110 mins ago1716183971
Bancor: Swaps
2.38143 ETH
199091402024-05-20 5:46:1110 mins ago1716183971
Bancor: Swaps
2.38143 ETH
199091382024-05-20 5:45:4710 mins ago1716183947
Bancor: Swaps
0.95688 ETH
199091382024-05-20 5:45:4710 mins ago1716183947
Bancor: Swaps
0.95688 ETH
199091342024-05-20 5:44:5911 mins ago1716183899
Bancor: Swaps
2.4 ETH
199091342024-05-20 5:44:5911 mins ago1716183899
Bancor: Swaps
2.4 ETH
199091322024-05-20 5:44:3511 mins ago1716183875
Bancor: Swaps
0.95379574 ETH
199091322024-05-20 5:44:3511 mins ago1716183875
Bancor: Swaps
0.95379574 ETH
199091302024-05-20 5:44:1112 mins ago1716183851
Bancor: Swaps
1.91260845 ETH
199091252024-05-20 5:43:1113 mins ago1716183791
Bancor: Swaps
2.37456 ETH
199091252024-05-20 5:43:1113 mins ago1716183791
Bancor: Swaps
2.37456 ETH
View All Internal Transactions
Loading...
Loading

Contract Source Code Verified (Exact Match)

Contract Name:
BancorNetwork

Compiler Version
v0.4.26+commit.4563c3fc

Optimization Enabled:
Yes with 200 runs

Other Settings:
default evmVersion, Apache-2.0 license

Contract Source Code (Solidity)

/**
 *Submitted for verification at Etherscan.io on 2020-06-18
*/

// File: contracts/token/interfaces/IERC20Token.sol

pragma solidity 0.4.26;

/*
    ERC20 Standard Token interface
*/
contract IERC20Token {
    // these functions aren't abstract since the compiler emits automatically generated getter functions as external
    function name() public view returns (string) {this;}
    function symbol() public view returns (string) {this;}
    function decimals() public view returns (uint8) {this;}
    function totalSupply() public view returns (uint256) {this;}
    function balanceOf(address _owner) public view returns (uint256) {_owner; this;}
    function allowance(address _owner, address _spender) public view returns (uint256) {_owner; _spender; this;}

    function transfer(address _to, uint256 _value) public returns (bool success);
    function transferFrom(address _from, address _to, uint256 _value) public returns (bool success);
    function approve(address _spender, uint256 _value) public returns (bool success);
}

// File: contracts/IBancorNetwork.sol

pragma solidity 0.4.26;


/*
    Bancor Network interface
*/
contract IBancorNetwork {
    function convert2(
        IERC20Token[] _path,
        uint256 _amount,
        uint256 _minReturn,
        address _affiliateAccount,
        uint256 _affiliateFee
    ) public payable returns (uint256);

    function claimAndConvert2(
        IERC20Token[] _path,
        uint256 _amount,
        uint256 _minReturn,
        address _affiliateAccount,
        uint256 _affiliateFee
    ) public returns (uint256);

    function convertFor2(
        IERC20Token[] _path,
        uint256 _amount,
        uint256 _minReturn,
        address _for,
        address _affiliateAccount,
        uint256 _affiliateFee
    ) public payable returns (uint256);

    function claimAndConvertFor2(
        IERC20Token[] _path,
        uint256 _amount,
        uint256 _minReturn,
        address _for,
        address _affiliateAccount,
        uint256 _affiliateFee
    ) public returns (uint256);

    // deprecated, backward compatibility
    function convert(
        IERC20Token[] _path,
        uint256 _amount,
        uint256 _minReturn
    ) public payable returns (uint256);

    // deprecated, backward compatibility
    function claimAndConvert(
        IERC20Token[] _path,
        uint256 _amount,
        uint256 _minReturn
    ) public returns (uint256);

    // deprecated, backward compatibility
    function convertFor(
        IERC20Token[] _path,
        uint256 _amount,
        uint256 _minReturn,
        address _for
    ) public payable returns (uint256);

    // deprecated, backward compatibility
    function claimAndConvertFor(
        IERC20Token[] _path,
        uint256 _amount,
        uint256 _minReturn,
        address _for
    ) public returns (uint256);
}

// File: contracts/IConversionPathFinder.sol

pragma solidity 0.4.26;


/*
    Conversion Path Finder interface
*/
contract IConversionPathFinder {
    function findPath(address _sourceToken, address _targetToken) public view returns (address[] memory);
}

// File: contracts/utility/interfaces/IOwned.sol

pragma solidity 0.4.26;

/*
    Owned contract interface
*/
contract IOwned {
    // this function isn't abstract since the compiler emits automatically generated getter functions as external
    function owner() public view returns (address) {this;}

    function transferOwnership(address _newOwner) public;
    function acceptOwnership() public;
}

// File: contracts/utility/interfaces/ITokenHolder.sol

pragma solidity 0.4.26;



/*
    Token Holder interface
*/
contract ITokenHolder is IOwned {
    function withdrawTokens(IERC20Token _token, address _to, uint256 _amount) public;
}

// File: contracts/converter/interfaces/IConverterAnchor.sol

pragma solidity 0.4.26;



/*
    Converter Anchor interface
*/
contract IConverterAnchor is IOwned, ITokenHolder {
}

// File: contracts/utility/interfaces/IWhitelist.sol

pragma solidity 0.4.26;

/*
    Whitelist interface
*/
contract IWhitelist {
    function isWhitelisted(address _address) public view returns (bool);
}

// File: contracts/converter/interfaces/IConverter.sol

pragma solidity 0.4.26;





/*
    Converter interface
*/
contract IConverter is IOwned {
    function converterType() public pure returns (uint16);
    function anchor() public view returns (IConverterAnchor) {this;}
    function isActive() public view returns (bool);

    function rateAndFee(IERC20Token _sourceToken, IERC20Token _targetToken, uint256 _amount) public view returns (uint256, uint256);
    function convert(IERC20Token _sourceToken,
                     IERC20Token _targetToken,
                     uint256 _amount,
                     address _trader,
                     address _beneficiary) public payable returns (uint256);

    function conversionWhitelist() public view returns (IWhitelist) {this;}
    function conversionFee() public view returns (uint32) {this;}
    function maxConversionFee() public view returns (uint32) {this;}
    function reserveBalance(IERC20Token _reserveToken) public view returns (uint256);
    function() external payable;

    function transferAnchorOwnership(address _newOwner) public;
    function acceptAnchorOwnership() public;
    function setConversionFee(uint32 _conversionFee) public;
    function setConversionWhitelist(IWhitelist _whitelist) public;
    function withdrawTokens(IERC20Token _token, address _to, uint256 _amount) public;
    function withdrawETH(address _to) public;
    function addReserve(IERC20Token _token, uint32 _ratio) public;

    // deprecated, backward compatibility
    function token() public view returns (IConverterAnchor);
    function transferTokenOwnership(address _newOwner) public;
    function acceptTokenOwnership() public;
    function connectors(address _address) public view returns (uint256, uint32, bool, bool, bool);
    function getConnectorBalance(IERC20Token _connectorToken) public view returns (uint256);
    function connectorTokens(uint256 _index) public view returns (IERC20Token);
    function connectorTokenCount() public view returns (uint16);
}

// File: contracts/converter/interfaces/IBancorFormula.sol

pragma solidity 0.4.26;

/*
    Bancor Formula interface
*/
contract IBancorFormula {
    function purchaseRate(uint256 _supply,
                          uint256 _reserveBalance,
                          uint32 _reserveWeight,
                          uint256 _amount)
                          public view returns (uint256);

    function saleRate(uint256 _supply,
                      uint256 _reserveBalance,
                      uint32 _reserveWeight,
                      uint256 _amount)
                      public view returns (uint256);

    function crossReserveRate(uint256 _sourceReserveBalance,
                              uint32 _sourceReserveWeight,
                              uint256 _targetReserveBalance,
                              uint32 _targetReserveWeight,
                              uint256 _amount)
                              public view returns (uint256);

    function fundCost(uint256 _supply,
                      uint256 _reserveBalance,
                      uint32 _reserveRatio,
                      uint256 _amount)
                      public view returns (uint256);

    function liquidateRate(uint256 _supply,
                           uint256 _reserveBalance,
                           uint32 _reserveRatio,
                           uint256 _amount)
                           public view returns (uint256);
}

// File: contracts/utility/Owned.sol

pragma solidity 0.4.26;


/**
  * @dev Provides support and utilities for contract ownership
*/
contract Owned is IOwned {
    address public owner;
    address public newOwner;

    /**
      * @dev triggered when the owner is updated
      *
      * @param _prevOwner previous owner
      * @param _newOwner  new owner
    */
    event OwnerUpdate(address indexed _prevOwner, address indexed _newOwner);

    /**
      * @dev initializes a new Owned instance
    */
    constructor() public {
        owner = msg.sender;
    }

    // allows execution by the owner only
    modifier ownerOnly {
        _ownerOnly();
        _;
    }

    // error message binary size optimization
    function _ownerOnly() internal view {
        require(msg.sender == owner, "ERR_ACCESS_DENIED");
    }

    /**
      * @dev allows transferring the contract ownership
      * the new owner still needs to accept the transfer
      * can only be called by the contract owner
      *
      * @param _newOwner    new contract owner
    */
    function transferOwnership(address _newOwner) public ownerOnly {
        require(_newOwner != owner, "ERR_SAME_OWNER");
        newOwner = _newOwner;
    }

    /**
      * @dev used by a new owner to accept an ownership transfer
    */
    function acceptOwnership() public {
        require(msg.sender == newOwner, "ERR_ACCESS_DENIED");
        emit OwnerUpdate(owner, newOwner);
        owner = newOwner;
        newOwner = address(0);
    }
}

// File: contracts/utility/Utils.sol

pragma solidity 0.4.26;

/**
  * @dev Utilities & Common Modifiers
*/
contract Utils {
    // verifies that a value is greater than zero
    modifier greaterThanZero(uint256 _value) {
        _greaterThanZero(_value);
        _;
    }

    // error message binary size optimization
    function _greaterThanZero(uint256 _value) internal pure {
        require(_value > 0, "ERR_ZERO_VALUE");
    }

    // validates an address - currently only checks that it isn't null
    modifier validAddress(address _address) {
        _validAddress(_address);
        _;
    }

    // error message binary size optimization
    function _validAddress(address _address) internal pure {
        require(_address != address(0), "ERR_INVALID_ADDRESS");
    }

    // verifies that the address is different than this contract address
    modifier notThis(address _address) {
        _notThis(_address);
        _;
    }

    // error message binary size optimization
    function _notThis(address _address) internal view {
        require(_address != address(this), "ERR_ADDRESS_IS_SELF");
    }
}

// File: contracts/utility/interfaces/IContractRegistry.sol

pragma solidity 0.4.26;

/*
    Contract Registry interface
*/
contract IContractRegistry {
    function addressOf(bytes32 _contractName) public view returns (address);

    // deprecated, backward compatibility
    function getAddress(bytes32 _contractName) public view returns (address);
}

// File: contracts/utility/ContractRegistryClient.sol

pragma solidity 0.4.26;




/**
  * @dev Base contract for ContractRegistry clients
*/
contract ContractRegistryClient is Owned, Utils {
    bytes32 internal constant CONTRACT_REGISTRY = "ContractRegistry";
    bytes32 internal constant BANCOR_NETWORK = "BancorNetwork";
    bytes32 internal constant BANCOR_FORMULA = "BancorFormula";
    bytes32 internal constant CONVERTER_FACTORY = "ConverterFactory";
    bytes32 internal constant CONVERSION_PATH_FINDER = "ConversionPathFinder";
    bytes32 internal constant CONVERTER_UPGRADER = "BancorConverterUpgrader";
    bytes32 internal constant CONVERTER_REGISTRY = "BancorConverterRegistry";
    bytes32 internal constant CONVERTER_REGISTRY_DATA = "BancorConverterRegistryData";
    bytes32 internal constant BNT_TOKEN = "BNTToken";
    bytes32 internal constant BANCOR_X = "BancorX";
    bytes32 internal constant BANCOR_X_UPGRADER = "BancorXUpgrader";

    IContractRegistry public registry;      // address of the current contract-registry
    IContractRegistry public prevRegistry;  // address of the previous contract-registry
    bool public onlyOwnerCanUpdateRegistry; // only an owner can update the contract-registry

    /**
      * @dev verifies that the caller is mapped to the given contract name
      *
      * @param _contractName    contract name
    */
    modifier only(bytes32 _contractName) {
        _only(_contractName);
        _;
    }

    // error message binary size optimization
    function _only(bytes32 _contractName) internal view {
        require(msg.sender == addressOf(_contractName), "ERR_ACCESS_DENIED");
    }

    /**
      * @dev initializes a new ContractRegistryClient instance
      *
      * @param  _registry   address of a contract-registry contract
    */
    constructor(IContractRegistry _registry) internal validAddress(_registry) {
        registry = IContractRegistry(_registry);
        prevRegistry = IContractRegistry(_registry);
    }

    /**
      * @dev updates to the new contract-registry
     */
    function updateRegistry() public {
        // verify that this function is permitted
        require(msg.sender == owner || !onlyOwnerCanUpdateRegistry, "ERR_ACCESS_DENIED");

        // get the new contract-registry
        IContractRegistry newRegistry = IContractRegistry(addressOf(CONTRACT_REGISTRY));

        // verify that the new contract-registry is different and not zero
        require(newRegistry != address(registry) && newRegistry != address(0), "ERR_INVALID_REGISTRY");

        // verify that the new contract-registry is pointing to a non-zero contract-registry
        require(newRegistry.addressOf(CONTRACT_REGISTRY) != address(0), "ERR_INVALID_REGISTRY");

        // save a backup of the current contract-registry before replacing it
        prevRegistry = registry;

        // replace the current contract-registry with the new contract-registry
        registry = newRegistry;
    }

    /**
      * @dev restores the previous contract-registry
    */
    function restoreRegistry() public ownerOnly {
        // restore the previous contract-registry
        registry = prevRegistry;
    }

    /**
      * @dev restricts the permission to update the contract-registry
      *
      * @param _onlyOwnerCanUpdateRegistry  indicates whether or not permission is restricted to owner only
    */
    function restrictRegistryUpdate(bool _onlyOwnerCanUpdateRegistry) public ownerOnly {
        // change the permission to update the contract-registry
        onlyOwnerCanUpdateRegistry = _onlyOwnerCanUpdateRegistry;
    }

    /**
      * @dev returns the address associated with the given contract name
      *
      * @param _contractName    contract name
      *
      * @return contract address
    */
    function addressOf(bytes32 _contractName) internal view returns (address) {
        return registry.addressOf(_contractName);
    }
}

// File: contracts/utility/ReentrancyGuard.sol

pragma solidity 0.4.26;

/**
  * @dev ReentrancyGuard
  *
  * The contract provides protection against re-entrancy - calling a function (directly or
  * indirectly) from within itself.
*/
contract ReentrancyGuard {
    // true while protected code is being executed, false otherwise
    bool private locked = false;

    /**
      * @dev ensures instantiation only by sub-contracts
    */
    constructor() internal {}

    // protects a function against reentrancy attacks
    modifier protected() {
        _protected();
        locked = true;
        _;
        locked = false;
    }

    // error message binary size optimization
    function _protected() internal view {
        require(!locked, "ERR_REENTRANCY");
    }
}

// File: contracts/utility/TokenHandler.sol

pragma solidity 0.4.26;


contract TokenHandler {
    bytes4 private constant APPROVE_FUNC_SELECTOR = bytes4(keccak256("approve(address,uint256)"));
    bytes4 private constant TRANSFER_FUNC_SELECTOR = bytes4(keccak256("transfer(address,uint256)"));
    bytes4 private constant TRANSFER_FROM_FUNC_SELECTOR = bytes4(keccak256("transferFrom(address,address,uint256)"));

    /**
      * @dev executes the ERC20 token's `approve` function and reverts upon failure
      * the main purpose of this function is to prevent a non standard ERC20 token
      * from failing silently
      *
      * @param _token   ERC20 token address
      * @param _spender approved address
      * @param _value   allowance amount
    */
    function safeApprove(IERC20Token _token, address _spender, uint256 _value) internal {
       execute(_token, abi.encodeWithSelector(APPROVE_FUNC_SELECTOR, _spender, _value));
    }

    /**
      * @dev executes the ERC20 token's `transfer` function and reverts upon failure
      * the main purpose of this function is to prevent a non standard ERC20 token
      * from failing silently
      *
      * @param _token   ERC20 token address
      * @param _to      target address
      * @param _value   transfer amount
    */
    function safeTransfer(IERC20Token _token, address _to, uint256 _value) internal {
       execute(_token, abi.encodeWithSelector(TRANSFER_FUNC_SELECTOR, _to, _value));
    }

    /**
      * @dev executes the ERC20 token's `transferFrom` function and reverts upon failure
      * the main purpose of this function is to prevent a non standard ERC20 token
      * from failing silently
      *
      * @param _token   ERC20 token address
      * @param _from    source address
      * @param _to      target address
      * @param _value   transfer amount
    */
    function safeTransferFrom(IERC20Token _token, address _from, address _to, uint256 _value) internal {
       execute(_token, abi.encodeWithSelector(TRANSFER_FROM_FUNC_SELECTOR, _from, _to, _value));
    }

    /**
      * @dev executes a function on the ERC20 token and reverts upon failure
      * the main purpose of this function is to prevent a non standard ERC20 token
      * from failing silently
      *
      * @param _token   ERC20 token address
      * @param _data    data to pass in to the token's contract for execution
    */
    function execute(IERC20Token _token, bytes memory _data) private {
        uint256[1] memory ret = [uint256(1)];

        assembly {
            let success := call(
                gas,            // gas remaining
                _token,         // destination address
                0,              // no ether
                add(_data, 32), // input buffer (starts after the first 32 bytes in the `data` array)
                mload(_data),   // input length (loaded from the first 32 bytes in the `data` array)
                ret,            // output buffer
                32              // output length
            )
            if iszero(success) {
                revert(0, 0)
            }
        }

        require(ret[0] != 0, "ERR_TRANSFER_FAILED");
    }
}

// File: contracts/utility/TokenHolder.sol

pragma solidity 0.4.26;






/**
  * @dev We consider every contract to be a 'token holder' since it's currently not possible
  * for a contract to deny receiving tokens.
  *
  * The TokenHolder's contract sole purpose is to provide a safety mechanism that allows
  * the owner to send tokens that were sent to the contract by mistake back to their sender.
  *
  * Note that we use the non standard ERC-20 interface which has no return value for transfer
  * in order to support both non standard as well as standard token contracts.
  * see https://github.com/ethereum/solidity/issues/4116
*/
contract TokenHolder is ITokenHolder, TokenHandler, Owned, Utils {
    /**
      * @dev withdraws tokens held by the contract and sends them to an account
      * can only be called by the owner
      *
      * @param _token   ERC20 token contract address
      * @param _to      account to receive the new amount
      * @param _amount  amount to withdraw
    */
    function withdrawTokens(IERC20Token _token, address _to, uint256 _amount)
        public
        ownerOnly
        validAddress(_token)
        validAddress(_to)
        notThis(_to)
    {
        safeTransfer(_token, _to, _amount);
    }
}

// File: contracts/utility/SafeMath.sol

pragma solidity 0.4.26;

/**
  * @dev Library for basic math operations with overflow/underflow protection
*/
library SafeMath {
    /**
      * @dev returns the sum of _x and _y, reverts if the calculation overflows
      *
      * @param _x   value 1
      * @param _y   value 2
      *
      * @return sum
    */
    function add(uint256 _x, uint256 _y) internal pure returns (uint256) {
        uint256 z = _x + _y;
        require(z >= _x, "ERR_OVERFLOW");
        return z;
    }

    /**
      * @dev returns the difference of _x minus _y, reverts if the calculation underflows
      *
      * @param _x   minuend
      * @param _y   subtrahend
      *
      * @return difference
    */
    function sub(uint256 _x, uint256 _y) internal pure returns (uint256) {
        require(_x >= _y, "ERR_UNDERFLOW");
        return _x - _y;
    }

    /**
      * @dev returns the product of multiplying _x by _y, reverts if the calculation overflows
      *
      * @param _x   factor 1
      * @param _y   factor 2
      *
      * @return product
    */
    function mul(uint256 _x, uint256 _y) internal pure returns (uint256) {
        // gas optimization
        if (_x == 0)
            return 0;

        uint256 z = _x * _y;
        require(z / _x == _y, "ERR_OVERFLOW");
        return z;
    }

    /**
      * @dev Integer division of two numbers truncating the quotient, reverts on division by zero.
      *
      * @param _x   dividend
      * @param _y   divisor
      *
      * @return quotient
    */
    function div(uint256 _x, uint256 _y) internal pure returns (uint256) {
        require(_y > 0, "ERR_DIVIDE_BY_ZERO");
        uint256 c = _x / _y;
        return c;
    }
}

// File: contracts/token/interfaces/IEtherToken.sol

pragma solidity 0.4.26;


/*
    Ether Token interface
*/
contract IEtherToken is IERC20Token {
    function deposit() public payable;
    function withdraw(uint256 _amount) public;
    function depositTo(address _to) public payable;
    function withdrawTo(address _to, uint256 _amount) public;
}

// File: contracts/token/interfaces/ISmartToken.sol

pragma solidity 0.4.26;




/*
    Smart Token interface
*/
contract ISmartToken is IConverterAnchor, IERC20Token {
    function disableTransfers(bool _disable) public;
    function issue(address _to, uint256 _amount) public;
    function destroy(address _from, uint256 _amount) public;
}

// File: contracts/bancorx/interfaces/IBancorX.sol

pragma solidity 0.4.26;


contract IBancorX {
    function token() public view returns (IERC20Token) {this;}
    function xTransfer(bytes32 _toBlockchain, bytes32 _to, uint256 _amount, uint256 _id) public;
    function getXTransferAmount(uint256 _xTransferId, address _for) public view returns (uint256);
}

// File: contracts/BancorNetwork.sol

pragma solidity 0.4.26;













// interface of older converters for backward compatibility
contract ILegacyConverter {
    function change(IERC20Token _sourceToken, IERC20Token _targetToken, uint256 _amount, uint256 _minReturn) public returns (uint256);
}

/**
  * @dev The BancorNetwork contract is the main entry point for Bancor token conversions.
  * It also allows for the conversion of any token in the Bancor Network to any other token in a single
  * transaction by providing a conversion path.
  *
  * A note on Conversion Path: Conversion path is a data structure that is used when converting a token
  * to another token in the Bancor Network, when the conversion cannot necessarily be done by a single
  * converter and might require multiple 'hops'.
  * The path defines which converters should be used and what kind of conversion should be done in each step.
  *
  * The path format doesn't include complex structure; instead, it is represented by a single array
  * in which each 'hop' is represented by a 2-tuple - converter anchor & target token.
  * In addition, the first element is always the source token.
  * The converter anchor is only used as a pointer to a converter (since converter addresses are more
  * likely to change as opposed to anchor addresses).
  *
  * Format:
  * [source token, converter anchor, target token, converter anchor, target token...]
*/
contract BancorNetwork is IBancorNetwork, TokenHolder, ContractRegistryClient, ReentrancyGuard {
    using SafeMath for uint256;

    uint256 private constant CONVERSION_FEE_RESOLUTION = 1000000;
    uint256 private constant AFFILIATE_FEE_RESOLUTION = 1000000;
    address private constant ETH_RESERVE_ADDRESS = 0xEeeeeEeeeEeEeeEeEeEeeEEEeeeeEeeeeeeeEEeE;

    struct ConversionStep {
        IConverter converter;
        IConverterAnchor anchor;
        IERC20Token sourceToken;
        IERC20Token targetToken;
        address beneficiary;
        bool isV28OrHigherConverter;
        bool processAffiliateFee;
    }

    uint256 public maxAffiliateFee = 30000;     // maximum affiliate-fee

    mapping (address => bool) public etherTokens;       // list of all supported ether tokens

    /**
      * @dev triggered when a conversion between two tokens occurs
      *
      * @param _smartToken  anchor governed by the converter
      * @param _fromToken   source ERC20 token
      * @param _toToken     target ERC20 token
      * @param _fromAmount  amount converted, in the source token
      * @param _toAmount    amount returned, minus conversion fee
      * @param _trader      wallet that initiated the trade
    */
    event Conversion(
        address indexed _smartToken,
        address indexed _fromToken,
        address indexed _toToken,
        uint256 _fromAmount,
        uint256 _toAmount,
        address _trader
    );

    /**
      * @dev initializes a new BancorNetwork instance
      *
      * @param _registry    address of a contract registry contract
    */
    constructor(IContractRegistry _registry) ContractRegistryClient(_registry) public {
        etherTokens[ETH_RESERVE_ADDRESS] = true;
    }

    /**
      * @dev allows the owner to update the maximum affiliate-fee
      *
      * @param _maxAffiliateFee   maximum affiliate-fee
    */
    function setMaxAffiliateFee(uint256 _maxAffiliateFee)
        public
        ownerOnly
    {
        require(_maxAffiliateFee <= AFFILIATE_FEE_RESOLUTION, "ERR_INVALID_AFFILIATE_FEE");
        maxAffiliateFee = _maxAffiliateFee;
    }

    /**
      * @dev allows the owner to register/unregister ether tokens
      *
      * @param _token       ether token contract address
      * @param _register    true to register, false to unregister
    */
    function registerEtherToken(IEtherToken _token, bool _register)
        public
        ownerOnly
        validAddress(_token)
        notThis(_token)
    {
        etherTokens[_token] = _register;
    }

    /**
      * @dev returns the conversion path between two tokens in the network
      * note that this method is quite expensive in terms of gas and should generally be called off-chain
      *
      * @param _sourceToken source token address
      * @param _targetToken target token address
      *
      * @return conversion path between the two tokens
    */
    function conversionPath(IERC20Token _sourceToken, IERC20Token _targetToken) public view returns (address[]) {
        IConversionPathFinder pathFinder = IConversionPathFinder(addressOf(CONVERSION_PATH_FINDER));
        return pathFinder.findPath(_sourceToken, _targetToken);
    }

    /**
      * @dev returns the expected rate of converting a given amount on a given path
      * note that there is no support for circular paths
      *
      * @param _path        conversion path (see conversion path format above)
      * @param _amount      amount of _path[0] tokens received from the sender
      *
      * @return expected rate
    */
    function rateByPath(IERC20Token[] _path, uint256 _amount) public view returns (uint256) {
        uint256 amount;
        uint256 fee;
        uint256 supply;
        uint256 balance;
        uint32 weight;
        IConverter converter;
        IBancorFormula formula = IBancorFormula(addressOf(BANCOR_FORMULA));

        amount = _amount;

        // verify that the number of elements is larger than 2 and odd
        require(_path.length > 2 && _path.length % 2 == 1, "ERR_INVALID_PATH");

        // iterate over the conversion path
        for (uint256 i = 2; i < _path.length; i += 2) {
            IERC20Token sourceToken = _path[i - 2];
            IERC20Token anchor = _path[i - 1];
            IERC20Token targetToken = _path[i];

            converter = IConverter(IConverterAnchor(anchor).owner());

            // backward compatibility
            sourceToken = getConverterTokenAddress(converter, sourceToken);
            targetToken = getConverterTokenAddress(converter, targetToken);

            if (targetToken == anchor) { // buy the smart token
                // check if the current smart token has changed
                if (i < 3 || anchor != _path[i - 3])
                    supply = ISmartToken(anchor).totalSupply();

                // get the amount & the conversion fee
                balance = converter.getConnectorBalance(sourceToken);
                (, weight, , , ) = converter.connectors(sourceToken);
                amount = formula.purchaseRate(supply, balance, weight, amount);
                fee = amount.mul(converter.conversionFee()).div(CONVERSION_FEE_RESOLUTION);
                amount -= fee;

                // update the smart token supply for the next iteration
                supply = supply.add(amount);
            }
            else if (sourceToken == anchor) { // sell the smart token
                // check if the current smart token has changed
                if (i < 3 || anchor != _path[i - 3])
                    supply = ISmartToken(anchor).totalSupply();

                // get the amount & the conversion fee
                balance = converter.getConnectorBalance(targetToken);
                (, weight, , , ) = converter.connectors(targetToken);
                amount = formula.saleRate(supply, balance, weight, amount);
                fee = amount.mul(converter.conversionFee()).div(CONVERSION_FEE_RESOLUTION);
                amount -= fee;

                // update the smart token supply for the next iteration
                supply = supply.sub(amount);
            }
            else { // cross reserve conversion
                (amount, fee) = getReturn(converter, sourceToken, targetToken, amount);
            }
        }

        return amount;
    }

    /**
      * @dev converts the token to any other token in the bancor network by following
      * a predefined conversion path and transfers the result tokens to a target account
      * affiliate account/fee can also be passed in to receive a conversion fee (on top of the liquidity provider fees)
      * note that the network should already have been given allowance of the source token (if not ETH)
      *
      * @param _path                conversion path, see conversion path format above
      * @param _amount              amount to convert from, in the source token
      * @param _minReturn           if the conversion results in an amount smaller than the minimum return - it is cancelled, must be greater than zero
      * @param _beneficiary         account that will receive the conversion result or 0x0 to send the result to the sender account
      * @param _affiliateAccount    wallet address to receive the affiliate fee or 0x0 to disable affiliate fee
      * @param _affiliateFee        affiliate fee in PPM or 0 to disable affiliate fee
      *
      * @return amount of tokens received from the conversion
    */
    function convertByPath(IERC20Token[] _path, uint256 _amount, uint256 _minReturn, address _beneficiary, address _affiliateAccount, uint256 _affiliateFee)
        public
        payable
        protected
        greaterThanZero(_minReturn)
        returns (uint256)
    {
        // verify that the path contrains at least a single 'hop' and that the number of elements is odd
        require(_path.length > 2 && _path.length % 2 == 1, "ERR_INVALID_PATH");

        // validate msg.value and prepare the source token for the conversion
        handleSourceToken(_path[0], IConverterAnchor(_path[1]), _amount);

        // check if affiliate fee is enabled
        bool affiliateFeeEnabled = false;
        if (address(_affiliateAccount) == 0) {
            require(_affiliateFee == 0, "ERR_INVALID_AFFILIATE_FEE");
        }
        else {
            require(0 < _affiliateFee && _affiliateFee <= maxAffiliateFee, "ERR_INVALID_AFFILIATE_FEE");
            affiliateFeeEnabled = true;
        }

        // check if beneficiary is set
        address beneficiary = msg.sender;
        if (_beneficiary != address(0))
            beneficiary = _beneficiary;

        // convert and get the resulting amount
        ConversionStep[] memory data = createConversionData(_path, beneficiary, affiliateFeeEnabled);
        uint256 amount = doConversion(data, _amount, _minReturn, _affiliateAccount, _affiliateFee);

        // handle the conversion target tokens
        handleTargetToken(data, amount, beneficiary);

        return amount;
    }

    /**
      * @dev converts any other token to BNT in the bancor network by following
      a predefined conversion path and transfers the result to an account on a different blockchain
      * note that the network should already have been given allowance of the source token (if not ETH)
      *
      * @param _path                conversion path, see conversion path format above
      * @param _amount              amount to convert from, in the source token
      * @param _minReturn           if the conversion results in an amount smaller than the minimum return - it is cancelled, must be greater than zero
      * @param _targetBlockchain    blockchain BNT will be issued on
      * @param _targetAccount       address/account on the target blockchain to send the BNT to
      * @param _conversionId        pre-determined unique (if non zero) id which refers to this transaction
      *
      * @return the amount of BNT received from this conversion
    */
    function xConvert(
        IERC20Token[] _path,
        uint256 _amount,
        uint256 _minReturn,
        bytes32 _targetBlockchain,
        bytes32 _targetAccount,
        uint256 _conversionId
    )
        public
        payable
        returns (uint256)
    {
        return xConvert2(_path, _amount, _minReturn, _targetBlockchain, _targetAccount, _conversionId, address(0), 0);
    }

    /**
      * @dev converts any other token to BNT in the bancor network by following
      a predefined conversion path and transfers the result to an account on a different blockchain
      * note that the network should already have been given allowance of the source token (if not ETH)
      *
      * @param _path                conversion path, see conversion path format above
      * @param _amount              amount to convert from, in the source token
      * @param _minReturn           if the conversion results in an amount smaller than the minimum return - it is cancelled, must be greater than zero
      * @param _targetBlockchain    blockchain BNT will be issued on
      * @param _targetAccount       address/account on the target blockchain to send the BNT to
      * @param _conversionId        pre-determined unique (if non zero) id which refers to this transaction
      * @param _affiliateAccount    affiliate account
      * @param _affiliateFee        affiliate fee in PPM
      *
      * @return the amount of BNT received from this conversion
    */
    function xConvert2(
        IERC20Token[] _path,
        uint256 _amount,
        uint256 _minReturn,
        bytes32 _targetBlockchain,
        bytes32 _targetAccount,
        uint256 _conversionId,
        address _affiliateAccount,
        uint256 _affiliateFee
    )
        public
        payable
        greaterThanZero(_minReturn)
        returns (uint256)
    {
        IERC20Token targetToken = _path[_path.length - 1];
        IBancorX bancorX = IBancorX(addressOf(BANCOR_X));

        // verify that the destination token is BNT
        require(targetToken == addressOf(BNT_TOKEN), "ERR_INVALID_TARGET_TOKEN");

        // convert and get the resulting amount
        uint256 amount = convertByPath(_path, _amount, _minReturn, this, _affiliateAccount, _affiliateFee);

        // grant BancorX allowance
        ensureAllowance(targetToken, bancorX, amount);

        // transfer the resulting amount to BancorX
        bancorX.xTransfer(_targetBlockchain, _targetAccount, amount, _conversionId);

        return amount;
    }

    /**
      * @dev allows a user to convert a token that was sent from another blockchain into any other
      * token on the BancorNetwork
      * ideally this transaction is created before the previous conversion is even complete, so
      * so the input amount isn't known at that point - the amount is actually take from the
      * BancorX contract directly by specifying the conversion id
      *
      * @param _path            conversion path
      * @param _bancorX         address of the BancorX contract for the source token
      * @param _conversionId    pre-determined unique (if non zero) id which refers to this conversion
      * @param _minReturn       if the conversion results in an amount smaller than the minimum return - it is cancelled, must be nonzero
      * @param _beneficiary     wallet to receive the conversion result
      *
      * @return amount of tokens received from the conversion
    */
    function completeXConversion(IERC20Token[] _path, IBancorX _bancorX, uint256 _conversionId, uint256 _minReturn, address _beneficiary)
        public returns (uint256)
    {
        // verify that the source token is the BancorX token
        require(_path[0] == _bancorX.token(), "ERR_INVALID_SOURCE_TOKEN");

        // get conversion amount from BancorX contract
        uint256 amount = _bancorX.getXTransferAmount(_conversionId, msg.sender);

        // perform the conversion
        return convertByPath(_path, amount, _minReturn, _beneficiary, address(0), 0);
    }

    /**
      * @dev executes the actual conversion by following the conversion path
      *
      * @param _data                conversion data, see ConversionStep struct above
      * @param _amount              amount to convert from, in the source token
      * @param _minReturn           if the conversion results in an amount smaller than the minimum return - it is cancelled, must be greater than zero
      * @param _affiliateAccount    affiliate account
      * @param _affiliateFee        affiliate fee in PPM
      *
      * @return amount of tokens received from the conversion
    */
    function doConversion(
        ConversionStep[] _data,
        uint256 _amount,
        uint256 _minReturn,
        address _affiliateAccount,
        uint256 _affiliateFee
    ) private returns (uint256) {
        uint256 toAmount;
        uint256 fromAmount = _amount;

        // iterate over the conversion data
        for (uint256 i = 0; i < _data.length; i++) {
            ConversionStep memory stepData = _data[i];

            // newer converter
            if (stepData.isV28OrHigherConverter) {
                // transfer the tokens to the converter only if the network contract currently holds the tokens
                // not needed with ETH or if it's the first conversion step
                if (i != 0 && _data[i - 1].beneficiary == address(this) && !etherTokens[stepData.sourceToken])
                    safeTransfer(stepData.sourceToken, stepData.converter, fromAmount);
            }
            // older converter
            // if the source token is the smart token, no need to do any transfers as the converter controls it
            else if (stepData.sourceToken != ISmartToken(stepData.anchor)) {
                // grant allowance for it to transfer the tokens from the network contract
                ensureAllowance(stepData.sourceToken, stepData.converter, fromAmount);
            }

            // do the conversion
            if (!stepData.isV28OrHigherConverter)
                toAmount = ILegacyConverter(stepData.converter).change(stepData.sourceToken, stepData.targetToken, fromAmount, 1);
            else if (etherTokens[stepData.sourceToken])
                toAmount = stepData.converter.convert.value(msg.value)(stepData.sourceToken, stepData.targetToken, fromAmount, msg.sender, stepData.beneficiary);
            else
                toAmount = stepData.converter.convert(stepData.sourceToken, stepData.targetToken, fromAmount, msg.sender, stepData.beneficiary);

            // pay affiliate-fee if needed
            if (stepData.processAffiliateFee) {
                uint256 affiliateAmount = toAmount.mul(_affiliateFee).div(AFFILIATE_FEE_RESOLUTION);
                require(stepData.targetToken.transfer(_affiliateAccount, affiliateAmount), "ERR_FEE_TRANSFER_FAILED");
                toAmount -= affiliateAmount;
            }

            emit Conversion(stepData.anchor, stepData.sourceToken, stepData.targetToken, fromAmount, toAmount, msg.sender);
            fromAmount = toAmount;
        }

        // ensure the trade meets the minimum requested amount
        require(toAmount >= _minReturn, "ERR_RETURN_TOO_LOW");

        return toAmount;
    }

    /**
      * @dev validates msg.value and prepares the conversion source token for the conversion
      *
      * @param _sourceToken source token of the first conversion step
      * @param _anchor      converter anchor of the first conversion step
      * @param _amount      amount to convert from, in the source token
    */
    function handleSourceToken(IERC20Token _sourceToken, IConverterAnchor _anchor, uint256 _amount) private {
        IConverter firstConverter = IConverter(_anchor.owner());
        bool isNewerConverter = isV28OrHigherConverter(firstConverter);

        // ETH
        if (msg.value > 0) {
            // validate msg.value
            require(msg.value == _amount, "ERR_ETH_AMOUNT_MISMATCH");

            // EtherToken converter - deposit the ETH into the EtherToken
            // note that it can still be a non ETH converter if the path is wrong
            // but such conversion will simply revert
            if (!isNewerConverter)
                IEtherToken(getConverterEtherTokenAddress(firstConverter)).deposit.value(msg.value)();
        }
        // EtherToken
        else if (etherTokens[_sourceToken]) {
            // claim the tokens - if the source token is ETH reserve, this call will fail
            // since in that case the transaction must be sent with msg.value
            safeTransferFrom(_sourceToken, msg.sender, this, _amount);

            // ETH converter - withdraw the ETH
            if (isNewerConverter)
                IEtherToken(_sourceToken).withdraw(_amount);
        }
        // other ERC20 token
        else {
            // newer converter - transfer the tokens from the sender directly to the converter
            // otherwise claim the tokens
            if (isNewerConverter)
                safeTransferFrom(_sourceToken, msg.sender, firstConverter, _amount);
            else
                safeTransferFrom(_sourceToken, msg.sender, this, _amount);
        }
    }

    /**
      * @dev handles the conversion target token if the network still holds it at the end of the conversion
      *
      * @param _data        conversion data, see ConversionStep struct above
      * @param _amount      conversion return amount, in the target token
      * @param _beneficiary wallet to receive the conversion result
    */
    function handleTargetToken(ConversionStep[] _data, uint256 _amount, address _beneficiary) private {
        ConversionStep memory stepData = _data[_data.length - 1];

        // network contract doesn't hold the tokens, do nothing
        if (stepData.beneficiary != address(this))
            return;

        IERC20Token targetToken = stepData.targetToken;

        // ETH / EtherToken
        if (etherTokens[targetToken]) {
            // newer converter should send ETH directly to the beneficiary
            assert(!stepData.isV28OrHigherConverter);

            // EtherToken converter - withdraw the ETH and transfer to the beneficiary
            IEtherToken(targetToken).withdrawTo(_beneficiary, _amount);
        }
        // other ERC20 token
        else {
            safeTransfer(targetToken, _beneficiary, _amount);
        }
    }

    /**
      * @dev creates a memory cache of all conversion steps data to minimize logic and external calls during conversions
      *
      * @param _conversionPath      conversion path, see conversion path format above
      * @param _beneficiary         wallet to receive the conversion result
      * @param _affiliateFeeEnabled true if affiliate fee was requested by the sender, false if not
      *
      * @return cached conversion data to be ingested later on by the conversion flow
    */
    function createConversionData(IERC20Token[] _conversionPath, address _beneficiary, bool _affiliateFeeEnabled) private view returns (ConversionStep[]) {
        ConversionStep[] memory data = new ConversionStep[](_conversionPath.length / 2);

        bool affiliateFeeProcessed = false;
        address bntToken = addressOf(BNT_TOKEN);
        // iterate the conversion path and create the conversion data for each step
        uint256 i;
        for (i = 0; i < _conversionPath.length - 1; i += 2) {
            IConverterAnchor anchor = IConverterAnchor(_conversionPath[i + 1]);
            IConverter converter = IConverter(anchor.owner());
            IERC20Token targetToken = _conversionPath[i + 2];

            // check if the affiliate fee should be processed in this step
            bool processAffiliateFee = _affiliateFeeEnabled && !affiliateFeeProcessed && targetToken == bntToken;
            if (processAffiliateFee)
                affiliateFeeProcessed = true;

            data[i / 2] = ConversionStep({
                // set the converter anchor
                anchor: anchor,

                // set the converter
                converter: converter,

                // set the source/target tokens
                sourceToken: _conversionPath[i],
                targetToken: targetToken,

                // requires knowledge about the next step, so initialize in the next phase
                beneficiary: address(0),

                // set flags
                isV28OrHigherConverter: isV28OrHigherConverter(converter),
                processAffiliateFee: processAffiliateFee
            });
        }

        // ETH support
        // source is ETH
        ConversionStep memory stepData = data[0];
        if (etherTokens[stepData.sourceToken]) {
            // newer converter - replace the source token address with ETH reserve address
            if (stepData.isV28OrHigherConverter)
                stepData.sourceToken = IERC20Token(ETH_RESERVE_ADDRESS);
            // older converter - replace the source token with the EtherToken address used by the converter
            else
                stepData.sourceToken = IERC20Token(getConverterEtherTokenAddress(stepData.converter));
        }

        // target is ETH
        stepData = data[data.length - 1];
        if (etherTokens[stepData.targetToken]) {
            // newer converter - replace the target token address with ETH reserve address
            if (stepData.isV28OrHigherConverter)
                stepData.targetToken = IERC20Token(ETH_RESERVE_ADDRESS);
            // older converter - replace the target token with the EtherToken address used by the converter
            else
                stepData.targetToken = IERC20Token(getConverterEtherTokenAddress(stepData.converter));
        }

        // set the beneficiary for each step
        for (i = 0; i < data.length; i++) {
            stepData = data[i];

            // first check if the converter in this step is newer as older converters don't even support the beneficiary argument
            if (stepData.isV28OrHigherConverter) {
                // if affiliate fee is processed in this step, beneficiary is the network contract
                if (stepData.processAffiliateFee)
                    stepData.beneficiary = this;
                // if it's the last step, beneficiary is the final beneficiary
                else if (i == data.length - 1)
                    stepData.beneficiary = _beneficiary;
                // if the converter in the next step is newer, beneficiary is the next converter
                else if (data[i + 1].isV28OrHigherConverter)
                    stepData.beneficiary = data[i + 1].converter;
                // the converter in the next step is older, beneficiary is the network contract
                else
                    stepData.beneficiary = this;
            }
            else {
                // converter in this step is older, beneficiary is the network contract
                stepData.beneficiary = this;
            }
        }

        return data;
    }

    /**
      * @dev utility, checks whether allowance for the given spender exists and approves one if it doesn't.
      * Note that we use the non standard erc-20 interface in which `approve` has no return value so that
      * this function will work for both standard and non standard tokens
      *
      * @param _token   token to check the allowance in
      * @param _spender approved address
      * @param _value   allowance amount
    */
    function ensureAllowance(IERC20Token _token, address _spender, uint256 _value) private {
        uint256 allowance = _token.allowance(this, _spender);
        if (allowance < _value) {
            if (allowance > 0)
                safeApprove(_token, _spender, 0);
            safeApprove(_token, _spender, _value);
        }
    }

    // legacy - returns the address of an EtherToken used by the converter
    function getConverterEtherTokenAddress(IConverter _converter) private view returns (address) {
        uint256 reserveCount = _converter.connectorTokenCount();
        for (uint256 i = 0; i < reserveCount; i++) {
            address reserveTokenAddress = _converter.connectorTokens(i);
            if (etherTokens[reserveTokenAddress])
                return reserveTokenAddress;
        }

        return ETH_RESERVE_ADDRESS;
    }

    // legacy - if the token is an ether token, returns the ETH reserve address
    // used by the converter, otherwise returns the input token address
    function getConverterTokenAddress(IConverter _converter, IERC20Token _token) private view returns (IERC20Token) {
        if (!etherTokens[_token])
            return _token;

        if (isV28OrHigherConverter(_converter))
            return IERC20Token(ETH_RESERVE_ADDRESS);

        return IERC20Token(getConverterEtherTokenAddress(_converter));
    }

    bytes4 private constant GET_RETURN_FUNC_SELECTOR = bytes4(keccak256("getReturn(address,address,uint256)"));

    // using assembly code since older converter versions have different return values
    function getReturn(address _dest, address _sourceToken, address _targetToken, uint256 _amount) internal view returns (uint256, uint256) {
        uint256[2] memory ret;
        bytes memory data = abi.encodeWithSelector(GET_RETURN_FUNC_SELECTOR, _sourceToken, _targetToken, _amount);

        assembly {
            let success := staticcall(
                gas,           // gas remaining
                _dest,         // destination address
                add(data, 32), // input buffer (starts after the first 32 bytes in the `data` array)
                mload(data),   // input length (loaded from the first 32 bytes in the `data` array)
                ret,           // output buffer
                64             // output length
            )
            if iszero(success) {
                revert(0, 0)
            }
        }

        return (ret[0], ret[1]);
    }

    bytes4 private constant IS_V28_OR_HIGHER_FUNC_SELECTOR = bytes4(keccak256("isV28OrHigher()"));

    // using assembly code to identify converter version
    // can't rely on the version number since the function had a different signature in older converters
    function isV28OrHigherConverter(IConverter _converter) internal view returns (bool) {
        bool success;
        uint256[1] memory ret;
        bytes memory data = abi.encodeWithSelector(IS_V28_OR_HIGHER_FUNC_SELECTOR);

        assembly {
            success := staticcall(
                5000,          // isV28OrHigher consumes 190 gas, but just for extra safety
                _converter,    // destination address
                add(data, 32), // input buffer (starts after the first 32 bytes in the `data` array)
                mload(data),   // input length (loaded from the first 32 bytes in the `data` array)
                ret,           // output buffer
                32             // output length
            )
        }

        return success && ret[0] != 0;
    }

    /**
      * @dev deprecated, backward compatibility
    */
    function getReturnByPath(IERC20Token[] _path, uint256 _amount) public view returns (uint256, uint256) {
        return (rateByPath(_path, _amount), 0);
    }

    /**
      * @dev deprecated, backward compatibility
    */
    function convert(IERC20Token[] _path, uint256 _amount, uint256 _minReturn) public payable returns (uint256) {
        return convertByPath(_path, _amount, _minReturn, address(0), address(0), 0);
    }

    /**
      * @dev deprecated, backward compatibility
    */
    function convert2(
        IERC20Token[] _path,
        uint256 _amount,
        uint256 _minReturn,
        address _affiliateAccount,
        uint256 _affiliateFee
    )
        public
        payable
        returns (uint256)
    {
        return convertByPath(_path, _amount, _minReturn, address(0), _affiliateAccount, _affiliateFee);
    }

    /**
      * @dev deprecated, backward compatibility
    */
    function convertFor(IERC20Token[] _path, uint256 _amount, uint256 _minReturn, address _beneficiary) public payable returns (uint256) {
        return convertByPath(_path, _amount, _minReturn, _beneficiary, address(0), 0);
    }

    /**
      * @dev deprecated, backward compatibility
    */
    function convertFor2(
        IERC20Token[] _path,
        uint256 _amount,
        uint256 _minReturn,
        address _beneficiary,
        address _affiliateAccount,
        uint256 _affiliateFee
    )
        public
        payable
        greaterThanZero(_minReturn)
        returns (uint256)
    {
        return convertByPath(_path, _amount, _minReturn, _beneficiary, _affiliateAccount, _affiliateFee);
    }

    /**
      * @dev deprecated, backward compatibility
    */
    function claimAndConvert(IERC20Token[] _path, uint256 _amount, uint256 _minReturn) public returns (uint256) {
        return convertByPath(_path, _amount, _minReturn, address(0), address(0), 0);
    }

    /**
      * @dev deprecated, backward compatibility
    */
    function claimAndConvert2(
        IERC20Token[] _path,
        uint256 _amount,
        uint256 _minReturn,
        address _affiliateAccount,
        uint256 _affiliateFee
    )
        public
        returns (uint256)
    {
        return convertByPath(_path, _amount, _minReturn, address(0), _affiliateAccount, _affiliateFee);
    }

    /**
      * @dev deprecated, backward compatibility
    */
    function claimAndConvertFor(IERC20Token[] _path, uint256 _amount, uint256 _minReturn, address _beneficiary) public returns (uint256) {
        return convertByPath(_path, _amount, _minReturn, _beneficiary, address(0), 0);
    }

    /**
      * @dev deprecated, backward compatibility
    */
    function claimAndConvertFor2(
        IERC20Token[] _path,
        uint256 _amount,
        uint256 _minReturn,
        address _beneficiary,
        address _affiliateAccount,
        uint256 _affiliateFee
    )
        public
        returns (uint256)
    {
        return convertByPath(_path, _amount, _minReturn, _beneficiary, _affiliateAccount, _affiliateFee);
    }
}

Contract Security Audit

Contract ABI

[{"constant":false,"inputs":[{"name":"_onlyOwnerCanUpdateRegistry","type":"bool"}],"name":"restrictRegistryUpdate","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"_token","type":"address"},{"name":"_register","type":"bool"}],"name":"registerEtherToken","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"name":"_path","type":"address[]"},{"name":"_amount","type":"uint256"}],"name":"getReturnByPath","outputs":[{"name":"","type":"uint256"},{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_path","type":"address[]"},{"name":"_amount","type":"uint256"},{"name":"_minReturn","type":"uint256"},{"name":"_beneficiary","type":"address"},{"name":"_affiliateAccount","type":"address"},{"name":"_affiliateFee","type":"uint256"}],"name":"claimAndConvertFor2","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"onlyOwnerCanUpdateRegistry","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[],"name":"updateRegistry","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"_path","type":"address[]"},{"name":"_amount","type":"uint256"},{"name":"_minReturn","type":"uint256"},{"name":"_affiliateAccount","type":"address"},{"name":"_affiliateFee","type":"uint256"}],"name":"convert2","outputs":[{"name":"","type":"uint256"}],"payable":true,"stateMutability":"payable","type":"function"},{"constant":true,"inputs":[],"name":"maxAffiliateFee","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_token","type":"address"},{"name":"_to","type":"address"},{"name":"_amount","type":"uint256"}],"name":"withdrawTokens","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"prevRegistry","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[],"name":"acceptOwnership","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"registry","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"_path","type":"address[]"},{"name":"_amount","type":"uint256"}],"name":"rateByPath","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"","type":"address"}],"name":"etherTokens","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_path","type":"address[]"},{"name":"_bancorX","type":"address"},{"name":"_conversionId","type":"uint256"},{"name":"_minReturn","type":"uint256"},{"name":"_beneficiary","type":"address"}],"name":"completeXConversion","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"owner","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_path","type":"address[]"},{"name":"_amount","type":"uint256"},{"name":"_minReturn","type":"uint256"},{"name":"_beneficiary","type":"address"},{"name":"_affiliateAccount","type":"address"},{"name":"_affiliateFee","type":"uint256"}],"name":"convertFor2","outputs":[{"name":"","type":"uint256"}],"payable":true,"stateMutability":"payable","type":"function"},{"constant":false,"inputs":[{"name":"_path","type":"address[]"},{"name":"_amount","type":"uint256"},{"name":"_minReturn","type":"uint256"},{"name":"_beneficiary","type":"address"}],"name":"claimAndConvertFor","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[],"name":"restoreRegistry","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"_path","type":"address[]"},{"name":"_amount","type":"uint256"},{"name":"_minReturn","type":"uint256"},{"name":"_beneficiary","type":"address"},{"name":"_affiliateAccount","type":"address"},{"name":"_affiliateFee","type":"uint256"}],"name":"convertByPath","outputs":[{"name":"","type":"uint256"}],"payable":true,"stateMutability":"payable","type":"function"},{"constant":false,"inputs":[{"name":"_path","type":"address[]"},{"name":"_amount","type":"uint256"},{"name":"_minReturn","type":"uint256"},{"name":"_targetBlockchain","type":"bytes32"},{"name":"_targetAccount","type":"bytes32"},{"name":"_conversionId","type":"uint256"}],"name":"xConvert","outputs":[{"name":"","type":"uint256"}],"payable":true,"stateMutability":"payable","type":"function"},{"constant":false,"inputs":[{"name":"_path","type":"address[]"},{"name":"_amount","type":"uint256"},{"name":"_minReturn","type":"uint256"}],"name":"claimAndConvert","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"_path","type":"address[]"},{"name":"_amount","type":"uint256"},{"name":"_minReturn","type":"uint256"},{"name":"_beneficiary","type":"address"}],"name":"convertFor","outputs":[{"name":"","type":"uint256"}],"payable":true,"stateMutability":"payable","type":"function"},{"constant":false,"inputs":[{"name":"_path","type":"address[]"},{"name":"_amount","type":"uint256"},{"name":"_minReturn","type":"uint256"},{"name":"_targetBlockchain","type":"bytes32"},{"name":"_targetAccount","type":"bytes32"},{"name":"_conversionId","type":"uint256"},{"name":"_affiliateAccount","type":"address"},{"name":"_affiliateFee","type":"uint256"}],"name":"xConvert2","outputs":[{"name":"","type":"uint256"}],"payable":true,"stateMutability":"payable","type":"function"},{"constant":true,"inputs":[],"name":"newOwner","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"_sourceToken","type":"address"},{"name":"_targetToken","type":"address"}],"name":"conversionPath","outputs":[{"name":"","type":"address[]"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_path","type":"address[]"},{"name":"_amount","type":"uint256"},{"name":"_minReturn","type":"uint256"},{"name":"_affiliateAccount","type":"address"},{"name":"_affiliateFee","type":"uint256"}],"name":"claimAndConvert2","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"_newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"_path","type":"address[]"},{"name":"_amount","type":"uint256"},{"name":"_minReturn","type":"uint256"}],"name":"convert","outputs":[{"name":"","type":"uint256"}],"payable":true,"stateMutability":"payable","type":"function"},{"constant":false,"inputs":[{"name":"_maxAffiliateFee","type":"uint256"}],"name":"setMaxAffiliateFee","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"inputs":[{"name":"_registry","type":"address"}],"payable":false,"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"name":"_smartToken","type":"address"},{"indexed":true,"name":"_fromToken","type":"address"},{"indexed":true,"name":"_toToken","type":"address"},{"indexed":false,"name":"_fromAmount","type":"uint256"},{"indexed":false,"name":"_toAmount","type":"uint256"},{"indexed":false,"name":"_trader","type":"address"}],"name":"Conversion","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"_prevOwner","type":"address"},{"indexed":true,"name":"_newOwner","type":"address"}],"name":"OwnerUpdate","type":"event"}]

60806040526003805460a860020a60ff02191690556175306004553480156200002757600080fd5b5060405160208062003791833981016040525160008054600160a060020a0319163317905580806200006281640100000000620000dd810204565b5060028054600160a060020a03909216600160a060020a03199283168117909155600380549092161790555073eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee60005260056020527fa1829a9003092132f585b6ccdd167c19fe9774dbdea4260287e8a8e8ca8185d7805460ff1916600117905562000158565b600160a060020a03811615156200015557604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601360248201527f4552525f494e56414c49445f4144445245535300000000000000000000000000604482015290519081900360640190fd5b50565b61362980620001686000396000f3006080604052600436106101665763ffffffff60e060020a600035041663024c7ec7811461016b57806302ef521e146101875780630c8496cc146101ad5780632978c10e1461021d5780632fe8a6ad146102a657806349d10b64146102cf578063569706eb146102e45780635d732ff2146103475780635e35359e1461035c57806361cd756e1461038657806379ba5097146103b75780637b103999146103cc5780637f9c0ecd146103e15780638077ccf71461043857806389f9cc61146104595780638da5cb5b146104cc578063ab6214ce146104e1578063b1e9932b1461054b578063b4a176d3146105b6578063b77d239b146105cb578063c52173de14610635578063c7ba24bc14610694578063c98fefed146106f2578063cb32564e14610750578063d4ee1d90146107c4578063d734fa19146107d9578063e57738e514610850578063f2fde38b146108c0578063f3898a97146108e1578063f3bc7d2a14610932575b600080fd5b34801561017757600080fd5b50610185600435151561094a565b005b34801561019357600080fd5b50610185600160a060020a03600435166024351515610992565b3480156101b957600080fd5b50604080516020600480358082013583810280860185019096528085526102049536959394602494938501929182918501908490808284375094975050933594506109db9350505050565b6040805192835260208301919091528051918290030190f35b34801561022957600080fd5b50604080516020600480358082013583810280860185019096528085526102949536959394602494938501929182918501908490808284375094975050843595505050602083013592600160a060020a036040820135811693506060820135169150608001356109f3565b60408051918252519081900360200190f35b3480156102b257600080fd5b506102bb610a0e565b604080519115158252519081900360200190f35b3480156102db57600080fd5b50610185610a2f565b604080516020600480358082013583810280860185019096528085526102949536959394602494938501929182918501908490808284375094975050843595505050602083013592600160a060020a036040820135169250606001359050610cae565b34801561035357600080fd5b50610294610cc9565b34801561036857600080fd5b50610185600160a060020a0360043581169060243516604435610ccf565b34801561039257600080fd5b5061039b610d08565b60408051600160a060020a039092168252519081900360200190f35b3480156103c357600080fd5b50610185610d17565b3480156103d857600080fd5b5061039b610dea565b3480156103ed57600080fd5b5060408051602060048035808201358381028086018501909652808552610294953695939460249493850192918291850190849080828437509497505093359450610df99350505050565b34801561044457600080fd5b506102bb600160a060020a0360043516611628565b34801561046557600080fd5b50604080516020600480358082013583810280860185019096528085526102949536959394602494938501929182918501908490808284375094975050600160a060020a03853581169650602086013595604081013595506060013516925061163d915050565b3480156104d857600080fd5b5061039b6117d2565b604080516020600480358082013583810280860185019096528085526102949536959394602494938501929182918501908490808284375094975050843595505050602083013592600160a060020a036040820135811693506060820135169150608001356117e1565b34801561055757600080fd5b5060408051602060048035808201358381028086018501909652808552610294953695939460249493850192918291850190849080828437509497505084359550505060208301359260400135600160a060020a031691506118079050565b3480156105c257600080fd5b50610185611821565b604080516020600480358082013583810280860185019096528085526102949536959394602494938501929182918501908490808284375094975050843595505050602083013592600160a060020a0360408201358116935060608201351691506080013561185a565b604080516020600480358082013583810280860185019096528085526102949536959394602494938501929182918501908490808284375094975050843595505050602083013592604081013592506060810135915060800135611a9a565b3480156106a057600080fd5b506040805160206004803580820135838102808601850190965280855261029495369593946024949385019291829185019084908082843750949750508435955050506020909201359150611aad9050565b60408051602060048035808201358381028086018501909652808552610294953695939460249493850192918291850190849080828437509497505084359550505060208301359260400135600160a060020a031691506118079050565b6040805160206004803580820135838102808601850190965280855261029495369593946024949385019291829185019084908082843750949750508435955050506020830135926040810135925060608101359150608081013590600160a060020a0360a0820135169060c00135611ac7565b3480156107d057600080fd5b5061039b611c65565b3480156107e557600080fd5b50610800600160a060020a0360043581169060243516611c74565b60408051602080825283518183015283519192839290830191858101910280838360005b8381101561083c578181015183820152602001610824565b505050509050019250505060405180910390f35b34801561085c57600080fd5b50604080516020600480358082013583810280860185019096528085526102949536959394602494938501929182918501908490808284375094975050843595505050602083013592600160a060020a036040820135169250606001359050610cae565b3480156108cc57600080fd5b50610185600160a060020a0360043516611da5565b6040805160206004803580820135838102808601850190965280855261029495369593946024949385019291829185019084908082843750949750508435955050506020909201359150611aad9050565b34801561093e57600080fd5b50610185600435611e42565b610952611eaa565b60038054911515740100000000000000000000000000000000000000000274ff000000000000000000000000000000000000000019909216919091179055565b61099a611eaa565b816109a481611f0e565b826109ae81611f71565b5050600160a060020a03919091166000908152600560205260409020805460ff1916911515919091179055565b6000806109e88484610df9565b946000945092505050565b6000610a0387878787878761185a565b979650505050505050565b60035474010000000000000000000000000000000000000000900460ff1681565b60008054600160a060020a0316331480610a64575060035474010000000000000000000000000000000000000000900460ff16155b1515610aba576040805160e560020a62461bcd02815260206004820152601160248201527f4552525f4143434553535f44454e494544000000000000000000000000000000604482015290519081900360640190fd5b610ae37f436f6e7472616374526567697374727900000000000000000000000000000000611fd2565b600254909150600160a060020a03808316911614801590610b0c5750600160a060020a03811615155b1515610b62576040805160e560020a62461bcd02815260206004820152601460248201527f4552525f494e56414c49445f5245474953545259000000000000000000000000604482015290519081900360640190fd5b604080517fbb34534c0000000000000000000000000000000000000000000000000000000081527f436f6e747261637452656769737472790000000000000000000000000000000060048201529051600091600160a060020a0384169163bb34534c9160248082019260209290919082900301818787803b158015610be657600080fd5b505af1158015610bfa573d6000803e3d6000fd5b505050506040513d6020811015610c1057600080fd5b5051600160a060020a03161415610c71576040805160e560020a62461bcd02815260206004820152601460248201527f4552525f494e56414c49445f5245474953545259000000000000000000000000604482015290519081900360640190fd5b6002805460038054600160a060020a0380841673ffffffffffffffffffffffffffffffffffffffff19928316179092559091169216919091179055565b6000610cbf8686866000878761185a565b9695505050505050565b60045481565b610cd7611eaa565b82610ce181611f0e565b82610ceb81611f0e565b83610cf581611f71565b610d0086868661206a565b505050505050565b600354600160a060020a031681565b600154600160a060020a03163314610d79576040805160e560020a62461bcd02815260206004820152601160248201527f4552525f4143434553535f44454e494544000000000000000000000000000000604482015290519081900360640190fd5b60015460008054604051600160a060020a0393841693909116917f343765429aea5a34b3ff6a3785a98a5abb2597aca87bfbb58632c173d585373a91a3600180546000805473ffffffffffffffffffffffffffffffffffffffff19908116600160a060020a03841617909155169055565b600254600160a060020a031681565b600080600080600080600080600080600080610e347f42616e636f72466f726d756c6100000000000000000000000000000000000000611fd2565b94508c9a5060028e51118015610e4f57508d51600290066001145b1515610ea5576040805160e560020a62461bcd02815260206004820152601060248201527f4552525f494e56414c49445f5041544800000000000000000000000000000000604482015290519081900360640190fd5b600293505b8d51841015611616578d60028503815181101515610ec457fe5b9060200190602002015192508d60018503815181101515610ee157fe5b9060200190602002015191508d84815181101515610efb57fe5b90602001906020020151905081600160a060020a0316638da5cb5b6040518163ffffffff1660e060020a028152600401602060405180830381600087803b158015610f4557600080fd5b505af1158015610f59573d6000803e3d6000fd5b505050506040513d6020811015610f6f57600080fd5b50519550610f7d86846120f7565b9250610f8986826120f7565b905081600160a060020a031681600160a060020a031614156112ea576003841080610fe057508d60038503815181101515610fc057fe5b90602001906020020151600160a060020a031682600160a060020a031614155b156110525781600160a060020a03166318160ddd6040518163ffffffff1660e060020a028152600401602060405180830381600087803b15801561102357600080fd5b505af1158015611037573d6000803e3d6000fd5b505050506040513d602081101561104d57600080fd5b505198505b85600160a060020a031663d8959512846040518263ffffffff1660e060020a0281526004018082600160a060020a0316600160a060020a03168152602001915050602060405180830381600087803b1580156110ad57600080fd5b505af11580156110c1573d6000803e3d6000fd5b505050506040513d60208110156110d757600080fd5b5051604080517f0e53aae9000000000000000000000000000000000000000000000000000000008152600160a060020a0386811660048301529151929a5090881691630e53aae99160248082019260a0929091908290030181600087803b15801561114157600080fd5b505af1158015611155573d6000803e3d6000fd5b505050506040513d60a081101561116b57600080fd5b50602090810151604080517f48d73fed000000000000000000000000000000000000000000000000000000008152600481018d9052602481018c905263ffffffff83166044820152606481018f90529051919950600160a060020a038816926348d73fed926084808401938290030181600087803b1580156111ec57600080fd5b505af1158015611200573d6000803e3d6000fd5b505050506040513d602081101561121657600080fd5b5051604080517f579cd3ca0000000000000000000000000000000000000000000000000000000081529051919c506112cc91620f4240916112c091600160a060020a038b169163579cd3ca9160048083019260209291908290030181600087803b15801561128357600080fd5b505af1158015611297573d6000803e3d6000fd5b505050506040513d60208110156112ad57600080fd5b50518e9063ffffffff9081169061215b16565b9063ffffffff6121db16565b9a8b90039a99506112e3898c63ffffffff61224916565b985061160b565b81600160a060020a031683600160a060020a031614156115f957600384108061133f57508d6003850381518110151561131f57fe5b90602001906020020151600160a060020a031682600160a060020a031614155b156113b15781600160a060020a03166318160ddd6040518163ffffffff1660e060020a028152600401602060405180830381600087803b15801561138257600080fd5b505af1158015611396573d6000803e3d6000fd5b505050506040513d60208110156113ac57600080fd5b505198505b85600160a060020a031663d8959512826040518263ffffffff1660e060020a0281526004018082600160a060020a0316600160a060020a03168152602001915050602060405180830381600087803b15801561140c57600080fd5b505af1158015611420573d6000803e3d6000fd5b505050506040513d602081101561143657600080fd5b5051604080517f0e53aae9000000000000000000000000000000000000000000000000000000008152600160a060020a0384811660048301529151929a5090881691630e53aae99160248082019260a0929091908290030181600087803b1580156114a057600080fd5b505af11580156114b4573d6000803e3d6000fd5b505050506040513d60a08110156114ca57600080fd5b50602090810151604080517ff732f1c9000000000000000000000000000000000000000000000000000000008152600481018d9052602481018c905263ffffffff83166044820152606481018f90529051919950600160a060020a0388169263f732f1c9926084808401938290030181600087803b15801561154b57600080fd5b505af115801561155f573d6000803e3d6000fd5b505050506040513d602081101561157557600080fd5b5051604080517f579cd3ca0000000000000000000000000000000000000000000000000000000081529051919c506115e291620f4240916112c091600160a060020a038b169163579cd3ca9160048083019260209291908290030181600087803b15801561128357600080fd5b9a8b90039a99506112e3898c63ffffffff6122a616565b6116058684838e612306565b909b5099505b600284019350610eaa565b50989c9b505050505050505050505050565b60056020526000908152604090205460ff1681565b60008085600160a060020a031663fc0c546a6040518163ffffffff1660e060020a028152600401602060405180830381600087803b15801561167e57600080fd5b505af1158015611692573d6000803e3d6000fd5b505050506040513d60208110156116a857600080fd5b50518751600160a060020a0390911690889060009081106116c557fe5b60209081029091010151600160a060020a03161461172d576040805160e560020a62461bcd02815260206004820152601860248201527f4552525f494e56414c49445f534f555243455f544f4b454e0000000000000000604482015290519081900360640190fd5b604080517faafd6b76000000000000000000000000000000000000000000000000000000008152600481018790523360248201529051600160a060020a0388169163aafd6b769160448083019260209291908290030181600087803b15801561179557600080fd5b505af11580156117a9573d6000803e3d6000fd5b505050506040513d60208110156117bf57600080fd5b50519050610a038782868660008061185a565b600054600160a060020a031681565b6000846117ed816123ea565b6117fb88888888888861185a565b98975050505050505050565b60006118188585858560008061185a565b95945050505050565b611829611eaa565b6003546002805473ffffffffffffffffffffffffffffffffffffffff1916600160a060020a03909216919091179055565b60008060006060600061186b612442565b6003805475ff00000000000000000000000000000000000000000019167501000000000000000000000000000000000000000000179055886118ac816123ea565b60028c511180156118c257508b51600290066001145b1515611918576040805160e560020a62461bcd02815260206004820152601060248201527f4552525f494e56414c49445f5041544800000000000000000000000000000000604482015290519081900360640190fd5b6119538c600081518110151561192a57fe5b906020019060200201518d600181518110151561194357fe5b906020019060200201518d6124b6565b60009450600160a060020a03881615156119c25786156119bd576040805160e560020a62461bcd02815260206004820152601960248201527f4552525f494e56414c49445f414646494c494154455f46454500000000000000604482015290519081900360640190fd5b611a2f565b8660001080156119d457506004548711155b1515611a2a576040805160e560020a62461bcd02815260206004820152601960248201527f4552525f494e56414c49445f414646494c494154455f46454500000000000000604482015290519081900360640190fd5b600194505b339350600160a060020a03891615611a45578893505b611a508c85876126ba565b9250611a5f838c8c8b8b612ad1565b9150611a6c838386613031565b506003805475ff000000000000000000000000000000000000000000191690559a9950505050505050505050565b6000610a03878787878787600080611ac7565b6000611abf848484600080600061185a565b949350505050565b60008060008089611ad7816123ea565b8c518d906000198101908110611ae957fe5b906020019060200201519350611b1e7f42616e636f725800000000000000000000000000000000000000000000000000611fd2565b9250611b497f424e54546f6b656e000000000000000000000000000000000000000000000000611fd2565b600160a060020a03858116911614611bab576040805160e560020a62461bcd02815260206004820152601860248201527f4552525f494e56414c49445f5441524745545f544f4b454e0000000000000000604482015290519081900360640190fd5b611bb98d8d8d308b8b61185a565b9150611bc6848484613114565b604080517f427c0374000000000000000000000000000000000000000000000000000000008152600481018c9052602481018b905260448101849052606481018a90529051600160a060020a0385169163427c037491608480830192600092919082900301818387803b158015611c3c57600080fd5b505af1158015611c50573d6000803e3d6000fd5b50939f9e505050505050505050505050505050565b600154600160a060020a031681565b60606000611ca17f436f6e76657273696f6e5061746846696e646572000000000000000000000000611fd2565b604080517fa1c421cd000000000000000000000000000000000000000000000000000000008152600160a060020a038781166004830152868116602483015291519293509083169163a1c421cd9160448082019260009290919082900301818387803b158015611d1057600080fd5b505af1158015611d24573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526020811015611d4d57600080fd5b810190808051640100000000811115611d6557600080fd5b82016020810184811115611d7857600080fd5b8151856020820283011164010000000082111715611d9557600080fd5b50909550505050505b5092915050565b611dad611eaa565b600054600160a060020a0382811691161415611e13576040805160e560020a62461bcd02815260206004820152600e60248201527f4552525f53414d455f4f574e4552000000000000000000000000000000000000604482015290519081900360640190fd5b6001805473ffffffffffffffffffffffffffffffffffffffff1916600160a060020a0392909216919091179055565b611e4a611eaa565b620f4240811115611ea5576040805160e560020a62461bcd02815260206004820152601960248201527f4552525f494e56414c49445f414646494c494154455f46454500000000000000604482015290519081900360640190fd5b600455565b600054600160a060020a03163314611f0c576040805160e560020a62461bcd02815260206004820152601160248201527f4552525f4143434553535f44454e494544000000000000000000000000000000604482015290519081900360640190fd5b565b600160a060020a0381161515611f6e576040805160e560020a62461bcd02815260206004820152601360248201527f4552525f494e56414c49445f4144445245535300000000000000000000000000604482015290519081900360640190fd5b50565b600160a060020a038116301415611f6e576040805160e560020a62461bcd02815260206004820152601360248201527f4552525f414444524553535f49535f53454c4600000000000000000000000000604482015290519081900360640190fd5b600254604080517fbb34534c000000000000000000000000000000000000000000000000000000008152600481018490529051600092600160a060020a03169163bb34534c91602480830192602092919082900301818787803b15801561203857600080fd5b505af115801561204c573d6000803e3d6000fd5b505050506040513d602081101561206257600080fd5b505192915050565b604080517f7472616e7366657228616464726573732c75696e74323536290000000000000081528151908190036019018120600160a060020a03851660248301526044808301859052835180840390910181526064909201909252602081018051600160e060020a0316600160e060020a0319909316929092179091526120f29084906131db565b505050565b600160a060020a03811660009081526005602052604081205460ff161515612120575080612155565b61212983613269565b15612149575073eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee612155565b612152836132fa565b90505b92915050565b60008083151561216e5760009150611d9e565b5082820282848281151561217e57fe5b04146121d4576040805160e560020a62461bcd02815260206004820152600c60248201527f4552525f4f564552464c4f570000000000000000000000000000000000000000604482015290519081900360640190fd5b9392505050565b600080808311612235576040805160e560020a62461bcd02815260206004820152601260248201527f4552525f4449564944455f42595f5a45524f0000000000000000000000000000604482015290519081900360640190fd5b828481151561224057fe5b04949350505050565b6000828201838110156121d4576040805160e560020a62461bcd02815260206004820152600c60248201527f4552525f4f564552464c4f570000000000000000000000000000000000000000604482015290519081900360640190fd5b600081831015612300576040805160e560020a62461bcd02815260206004820152600d60248201527f4552525f554e444552464c4f5700000000000000000000000000000000000000604482015290519081900360640190fd5b50900390565b600080612311613587565b604080517f67657452657475726e28616464726573732c616464726573732c75696e74323581527f36290000000000000000000000000000000000000000000000000000000000006020808301919091528251918290036022018220600160a060020a03808b16602485015289166044840152606480840189905284518085039091018152608490930184529082018051600160e060020a0316600160e060020a0319909216919091178152815191929184918b5afa8015156123d357600080fd5b505080516020909101519097909650945050505050565b60008111611f6e576040805160e560020a62461bcd02815260206004820152600e60248201527f4552525f5a45524f5f56414c5545000000000000000000000000000000000000604482015290519081900360640190fd5b6003547501000000000000000000000000000000000000000000900460ff1615611f0c576040805160e560020a62461bcd02815260206004820152600e60248201527f4552525f5245454e5452414e4359000000000000000000000000000000000000604482015290519081900360640190fd5b60008083600160a060020a0316638da5cb5b6040518163ffffffff1660e060020a028152600401602060405180830381600087803b1580156124f757600080fd5b505af115801561250b573d6000803e3d6000fd5b505050506040513d602081101561252157600080fd5b5051915061252e82613269565b905060003411156125fc57348314612590576040805160e560020a62461bcd02815260206004820152601760248201527f4552525f4554485f414d4f554e545f4d49534d41544348000000000000000000604482015290519081900360640190fd5b8015156125f7576125a0826132fa565b600160a060020a031663d0e30db0346040518263ffffffff1660e060020a0281526004016000604051808303818588803b1580156125dd57600080fd5b505af11580156125f1573d6000803e3d6000fd5b50505050505b6126b3565b600160a060020a03851660009081526005602052604090205460ff16156126955761262985333086613447565b80156125f75784600160a060020a0316632e1a7d4d846040518263ffffffff1660e060020a02815260040180828152602001915050600060405180830381600087803b15801561267857600080fd5b505af115801561268c573d6000803e3d6000fd5b505050506126b3565b80156126a7576125f785338486613447565b6126b385333086613447565b5050505050565b60608060008060008060008060006126d06135a2565b8c516002900460405190808252806020026020018201604052801561270f57816020015b6126fc6135a2565b8152602001906001900390816126f45790505b5098506000975061273f7f424e54546f6b656e000000000000000000000000000000000000000000000000611fd2565b9650600095505b60018d51038610156128da578c8660010181518110151561276357fe5b90602001906020020151945084600160a060020a0316638da5cb5b6040518163ffffffff1660e060020a028152600401602060405180830381600087803b1580156127ad57600080fd5b505af11580156127c1573d6000803e3d6000fd5b505050506040513d60208110156127d757600080fd5b50518d519094508d90600288019081106127ed57fe5b9060200190602002015192508a8015612804575087155b8015612821575086600160a060020a031683600160a060020a0316145b9150811561282e57600197505b60e06040519081016040528085600160a060020a0316815260200186600160a060020a031681526020018e8881518110151561286657fe5b90602001906020020151600160a060020a0316815260200184600160a060020a031681526020016000600160a060020a031681526020016128a686613269565b1515815283151560209091015289600288048151811015156128c457fe5b6020908102909101015260029590950194612746565b8860008151811015156128e957fe5b6020908102909101810151604080820151600160a060020a0316600090815260059093529091205490915060ff161561295f578060a00151156129455773eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee604082015261295f565b8051612950906132fa565b600160a060020a031660408201525b88518990600019810190811061297157fe5b60209081029091018101516060810151600160a060020a03166000908152600590925260409091205490915060ff16156129e8578060a00151156129ce5773eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee60608201526129e8565b80516129d9906132fa565b600160a060020a031660608201525b600095505b8851861015612ac0578886815181101515612a0457fe5b9060200190602002015190508060a0015115612aae578060c0015115612a2f57306080820152612aa9565b6001895103861415612a4f57600160a060020a038c166080820152612aa9565b8886600101815181101515612a6057fe5b9060200190602002015160a0015115612aa2578886600101815181101515612a8457fe5b6020908102909101015151600160a060020a03166080820152612aa9565b3060808201525b612ab5565b3060808201525b6001909501946129ed565b50969b9a5050505050505050505050565b600080600080612adf6135a2565b6000899350600092505b8a51831015612fca578a83815181101515612b0057fe5b9060200190602002015191508160a0015115612b91578215801590612b4d57508a5130908c906000198601908110612b3457fe5b9060200190602002015160800151600160a060020a0316145b8015612b745750604080830151600160a060020a031660009081526005602052205460ff16155b15612b8c57612b8c826040015183600001518661206a565b612bc7565b8160200151600160a060020a03168260400151600160a060020a0316141515612bc757612bc78260400151836000015186613114565b8160a001511515612c8a578151604080840151606085015182517f5e5144eb000000000000000000000000000000000000000000000000000000008152600160a060020a039283166004820152908216602482015260448101889052600160648201529151921691635e5144eb916084808201926020929091908290030181600087803b158015612c5757600080fd5b505af1158015612c6b573d6000803e3d6000fd5b505050506040513d6020811015612c8157600080fd5b50519450612e27565b604080830151600160a060020a031660009081526005602052205460ff1615612d685781516040808401516060850151608086015183517fe8dc12ff000000000000000000000000000000000000000000000000000000008152600160a060020a03938416600482015291831660248301526044820189905233606483015282166084820152915192169163e8dc12ff91349160a480830192602092919082900301818588803b158015612d3d57600080fd5b505af1158015612d51573d6000803e3d6000fd5b50505050506040513d6020811015612c8157600080fd5b81516040808401516060850151608086015183517fe8dc12ff000000000000000000000000000000000000000000000000000000008152600160a060020a03938416600482015291831660248301526044820189905233606483015282166084820152915192169163e8dc12ff9160a4808201926020929091908290030181600087803b158015612df857600080fd5b505af1158015612e0c573d6000803e3d6000fd5b505050506040513d6020811015612e2257600080fd5b505194505b8160c0015115612f3957612e48620f42406112c0878a63ffffffff61215b16565b90508160600151600160a060020a031663a9059cbb89836040518363ffffffff1660e060020a0281526004018083600160a060020a0316600160a060020a0316815260200182815260200192505050602060405180830381600087803b158015612eb157600080fd5b505af1158015612ec5573d6000803e3d6000fd5b505050506040513d6020811015612edb57600080fd5b50511515612f33576040805160e560020a62461bcd02815260206004820152601760248201527f4552525f4645455f5452414e534645525f4641494c4544000000000000000000604482015290519081900360640190fd5b80850394505b8160600151600160a060020a03168260400151600160a060020a03168360200151600160a060020a03167f7154b38b5dd31bb3122436a96d4e09aba5b323ae1fd580025fab55074334c0958789336040518084815260200183815260200182600160a060020a0316600160a060020a03168152602001935050505060405180910390a4849350600190920191612ae9565b88851015613022576040805160e560020a62461bcd02815260206004820152601260248201527f4552525f52455455524e5f544f4f5f4c4f570000000000000000000000000000604482015290519081900360640190fd5b50929998505050505050505050565b6130396135a2565b600084600186510381518110151561304d57fe5b602090810290910101516080810151909250600160a060020a03163014613073576126b3565b506060810151600160a060020a03811660009081526005602052604090205460ff16156131095760a0820151156130a657fe5b80600160a060020a031663205c287884866040518363ffffffff1660e060020a0281526004018083600160a060020a0316600160a060020a0316815260200182815260200192505050600060405180830381600087803b15801561267857600080fd5b6126b381848661206a565b604080517fdd62ed3e000000000000000000000000000000000000000000000000000000008152306004820152600160a060020a038481166024830152915160009286169163dd62ed3e91604480830192602092919082900301818787803b15801561317f57600080fd5b505af1158015613193573d6000803e3d6000fd5b505050506040513d60208110156131a957600080fd5b50519050818110156131d55760008111156131ca576131ca848460006134ff565b6131d58484846134ff565b50505050565b6131e36135de565b602060405190810160405280600181525090506020818351602085016000875af180151561321057600080fd5b50805115156120f2576040805160e560020a62461bcd02815260206004820152601360248201527f4552525f5452414e534645525f4641494c454400000000000000000000000000604482015290519081900360640190fd5b6000806132746135de565b604080517f69735632384f72486967686572282900000000000000000000000000000000008152815190819003600f018120600482526024820190925260208082018051600160e060020a0316600160e060020a0319909416939093178352815191929091849188611388fa92508280156132ef5750815115155b93505b505050919050565b60008060008084600160a060020a03166371f52bf36040518163ffffffff1660e060020a028152600401602060405180830381600087803b15801561333e57600080fd5b505af1158015613352573d6000803e3d6000fd5b505050506040513d602081101561336857600080fd5b505161ffff169250600091505b828210156134295784600160a060020a03166319b64015836040518263ffffffff1660e060020a02815260040180828152602001915050602060405180830381600087803b1580156133c657600080fd5b505af11580156133da573d6000803e3d6000fd5b505050506040513d60208110156133f057600080fd5b5051600160a060020a03811660009081526005602052604090205490915060ff161561341e578093506132f2565b600190910190613375565b5073eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee949350505050565b604080517f7472616e7366657246726f6d28616464726573732c616464726573732c75696e81527f74323536290000000000000000000000000000000000000000000000000000006020808301919091528251918290036025018220600160a060020a03808816602485015286166044840152606480840186905284518085039091018152608490930190935281018051600160e060020a0316600160e060020a0319909316929092179091526131d59085906131db565b604080517f617070726f766528616464726573732c75696e7432353629000000000000000081528151908190036018018120600160a060020a03851660248301526044808301859052835180840390910181526064909201909252602081018051600160e060020a0316600160e060020a0319909316929092179091526120f29084906131db565b60408051808201825290600290829080388339509192915050565b6040805160e081018252600080825260208201819052918101829052606081018290526080810182905260a0810182905260c081019190915290565b60206040519081016040528060019060208202803883395091929150505600a165627a7a723058204c6d6f7ef1fe9e0170d19e339c72b77e0e50abade5d2e911ba59ffce0be46622002900000000000000000000000052ae12abe5d8bd778bd5397f99ca900624cfadd4

Deployed Bytecode

0x6080604052600436106101665763ffffffff60e060020a600035041663024c7ec7811461016b57806302ef521e146101875780630c8496cc146101ad5780632978c10e1461021d5780632fe8a6ad146102a657806349d10b64146102cf578063569706eb146102e45780635d732ff2146103475780635e35359e1461035c57806361cd756e1461038657806379ba5097146103b75780637b103999146103cc5780637f9c0ecd146103e15780638077ccf71461043857806389f9cc61146104595780638da5cb5b146104cc578063ab6214ce146104e1578063b1e9932b1461054b578063b4a176d3146105b6578063b77d239b146105cb578063c52173de14610635578063c7ba24bc14610694578063c98fefed146106f2578063cb32564e14610750578063d4ee1d90146107c4578063d734fa19146107d9578063e57738e514610850578063f2fde38b146108c0578063f3898a97146108e1578063f3bc7d2a14610932575b600080fd5b34801561017757600080fd5b50610185600435151561094a565b005b34801561019357600080fd5b50610185600160a060020a03600435166024351515610992565b3480156101b957600080fd5b50604080516020600480358082013583810280860185019096528085526102049536959394602494938501929182918501908490808284375094975050933594506109db9350505050565b6040805192835260208301919091528051918290030190f35b34801561022957600080fd5b50604080516020600480358082013583810280860185019096528085526102949536959394602494938501929182918501908490808284375094975050843595505050602083013592600160a060020a036040820135811693506060820135169150608001356109f3565b60408051918252519081900360200190f35b3480156102b257600080fd5b506102bb610a0e565b604080519115158252519081900360200190f35b3480156102db57600080fd5b50610185610a2f565b604080516020600480358082013583810280860185019096528085526102949536959394602494938501929182918501908490808284375094975050843595505050602083013592600160a060020a036040820135169250606001359050610cae565b34801561035357600080fd5b50610294610cc9565b34801561036857600080fd5b50610185600160a060020a0360043581169060243516604435610ccf565b34801561039257600080fd5b5061039b610d08565b60408051600160a060020a039092168252519081900360200190f35b3480156103c357600080fd5b50610185610d17565b3480156103d857600080fd5b5061039b610dea565b3480156103ed57600080fd5b5060408051602060048035808201358381028086018501909652808552610294953695939460249493850192918291850190849080828437509497505093359450610df99350505050565b34801561044457600080fd5b506102bb600160a060020a0360043516611628565b34801561046557600080fd5b50604080516020600480358082013583810280860185019096528085526102949536959394602494938501929182918501908490808284375094975050600160a060020a03853581169650602086013595604081013595506060013516925061163d915050565b3480156104d857600080fd5b5061039b6117d2565b604080516020600480358082013583810280860185019096528085526102949536959394602494938501929182918501908490808284375094975050843595505050602083013592600160a060020a036040820135811693506060820135169150608001356117e1565b34801561055757600080fd5b5060408051602060048035808201358381028086018501909652808552610294953695939460249493850192918291850190849080828437509497505084359550505060208301359260400135600160a060020a031691506118079050565b3480156105c257600080fd5b50610185611821565b604080516020600480358082013583810280860185019096528085526102949536959394602494938501929182918501908490808284375094975050843595505050602083013592600160a060020a0360408201358116935060608201351691506080013561185a565b604080516020600480358082013583810280860185019096528085526102949536959394602494938501929182918501908490808284375094975050843595505050602083013592604081013592506060810135915060800135611a9a565b3480156106a057600080fd5b506040805160206004803580820135838102808601850190965280855261029495369593946024949385019291829185019084908082843750949750508435955050506020909201359150611aad9050565b60408051602060048035808201358381028086018501909652808552610294953695939460249493850192918291850190849080828437509497505084359550505060208301359260400135600160a060020a031691506118079050565b6040805160206004803580820135838102808601850190965280855261029495369593946024949385019291829185019084908082843750949750508435955050506020830135926040810135925060608101359150608081013590600160a060020a0360a0820135169060c00135611ac7565b3480156107d057600080fd5b5061039b611c65565b3480156107e557600080fd5b50610800600160a060020a0360043581169060243516611c74565b60408051602080825283518183015283519192839290830191858101910280838360005b8381101561083c578181015183820152602001610824565b505050509050019250505060405180910390f35b34801561085c57600080fd5b50604080516020600480358082013583810280860185019096528085526102949536959394602494938501929182918501908490808284375094975050843595505050602083013592600160a060020a036040820135169250606001359050610cae565b3480156108cc57600080fd5b50610185600160a060020a0360043516611da5565b6040805160206004803580820135838102808601850190965280855261029495369593946024949385019291829185019084908082843750949750508435955050506020909201359150611aad9050565b34801561093e57600080fd5b50610185600435611e42565b610952611eaa565b60038054911515740100000000000000000000000000000000000000000274ff000000000000000000000000000000000000000019909216919091179055565b61099a611eaa565b816109a481611f0e565b826109ae81611f71565b5050600160a060020a03919091166000908152600560205260409020805460ff1916911515919091179055565b6000806109e88484610df9565b946000945092505050565b6000610a0387878787878761185a565b979650505050505050565b60035474010000000000000000000000000000000000000000900460ff1681565b60008054600160a060020a0316331480610a64575060035474010000000000000000000000000000000000000000900460ff16155b1515610aba576040805160e560020a62461bcd02815260206004820152601160248201527f4552525f4143434553535f44454e494544000000000000000000000000000000604482015290519081900360640190fd5b610ae37f436f6e7472616374526567697374727900000000000000000000000000000000611fd2565b600254909150600160a060020a03808316911614801590610b0c5750600160a060020a03811615155b1515610b62576040805160e560020a62461bcd02815260206004820152601460248201527f4552525f494e56414c49445f5245474953545259000000000000000000000000604482015290519081900360640190fd5b604080517fbb34534c0000000000000000000000000000000000000000000000000000000081527f436f6e747261637452656769737472790000000000000000000000000000000060048201529051600091600160a060020a0384169163bb34534c9160248082019260209290919082900301818787803b158015610be657600080fd5b505af1158015610bfa573d6000803e3d6000fd5b505050506040513d6020811015610c1057600080fd5b5051600160a060020a03161415610c71576040805160e560020a62461bcd02815260206004820152601460248201527f4552525f494e56414c49445f5245474953545259000000000000000000000000604482015290519081900360640190fd5b6002805460038054600160a060020a0380841673ffffffffffffffffffffffffffffffffffffffff19928316179092559091169216919091179055565b6000610cbf8686866000878761185a565b9695505050505050565b60045481565b610cd7611eaa565b82610ce181611f0e565b82610ceb81611f0e565b83610cf581611f71565b610d0086868661206a565b505050505050565b600354600160a060020a031681565b600154600160a060020a03163314610d79576040805160e560020a62461bcd02815260206004820152601160248201527f4552525f4143434553535f44454e494544000000000000000000000000000000604482015290519081900360640190fd5b60015460008054604051600160a060020a0393841693909116917f343765429aea5a34b3ff6a3785a98a5abb2597aca87bfbb58632c173d585373a91a3600180546000805473ffffffffffffffffffffffffffffffffffffffff19908116600160a060020a03841617909155169055565b600254600160a060020a031681565b600080600080600080600080600080600080610e347f42616e636f72466f726d756c6100000000000000000000000000000000000000611fd2565b94508c9a5060028e51118015610e4f57508d51600290066001145b1515610ea5576040805160e560020a62461bcd02815260206004820152601060248201527f4552525f494e56414c49445f5041544800000000000000000000000000000000604482015290519081900360640190fd5b600293505b8d51841015611616578d60028503815181101515610ec457fe5b9060200190602002015192508d60018503815181101515610ee157fe5b9060200190602002015191508d84815181101515610efb57fe5b90602001906020020151905081600160a060020a0316638da5cb5b6040518163ffffffff1660e060020a028152600401602060405180830381600087803b158015610f4557600080fd5b505af1158015610f59573d6000803e3d6000fd5b505050506040513d6020811015610f6f57600080fd5b50519550610f7d86846120f7565b9250610f8986826120f7565b905081600160a060020a031681600160a060020a031614156112ea576003841080610fe057508d60038503815181101515610fc057fe5b90602001906020020151600160a060020a031682600160a060020a031614155b156110525781600160a060020a03166318160ddd6040518163ffffffff1660e060020a028152600401602060405180830381600087803b15801561102357600080fd5b505af1158015611037573d6000803e3d6000fd5b505050506040513d602081101561104d57600080fd5b505198505b85600160a060020a031663d8959512846040518263ffffffff1660e060020a0281526004018082600160a060020a0316600160a060020a03168152602001915050602060405180830381600087803b1580156110ad57600080fd5b505af11580156110c1573d6000803e3d6000fd5b505050506040513d60208110156110d757600080fd5b5051604080517f0e53aae9000000000000000000000000000000000000000000000000000000008152600160a060020a0386811660048301529151929a5090881691630e53aae99160248082019260a0929091908290030181600087803b15801561114157600080fd5b505af1158015611155573d6000803e3d6000fd5b505050506040513d60a081101561116b57600080fd5b50602090810151604080517f48d73fed000000000000000000000000000000000000000000000000000000008152600481018d9052602481018c905263ffffffff83166044820152606481018f90529051919950600160a060020a038816926348d73fed926084808401938290030181600087803b1580156111ec57600080fd5b505af1158015611200573d6000803e3d6000fd5b505050506040513d602081101561121657600080fd5b5051604080517f579cd3ca0000000000000000000000000000000000000000000000000000000081529051919c506112cc91620f4240916112c091600160a060020a038b169163579cd3ca9160048083019260209291908290030181600087803b15801561128357600080fd5b505af1158015611297573d6000803e3d6000fd5b505050506040513d60208110156112ad57600080fd5b50518e9063ffffffff9081169061215b16565b9063ffffffff6121db16565b9a8b90039a99506112e3898c63ffffffff61224916565b985061160b565b81600160a060020a031683600160a060020a031614156115f957600384108061133f57508d6003850381518110151561131f57fe5b90602001906020020151600160a060020a031682600160a060020a031614155b156113b15781600160a060020a03166318160ddd6040518163ffffffff1660e060020a028152600401602060405180830381600087803b15801561138257600080fd5b505af1158015611396573d6000803e3d6000fd5b505050506040513d60208110156113ac57600080fd5b505198505b85600160a060020a031663d8959512826040518263ffffffff1660e060020a0281526004018082600160a060020a0316600160a060020a03168152602001915050602060405180830381600087803b15801561140c57600080fd5b505af1158015611420573d6000803e3d6000fd5b505050506040513d602081101561143657600080fd5b5051604080517f0e53aae9000000000000000000000000000000000000000000000000000000008152600160a060020a0384811660048301529151929a5090881691630e53aae99160248082019260a0929091908290030181600087803b1580156114a057600080fd5b505af11580156114b4573d6000803e3d6000fd5b505050506040513d60a08110156114ca57600080fd5b50602090810151604080517ff732f1c9000000000000000000000000000000000000000000000000000000008152600481018d9052602481018c905263ffffffff83166044820152606481018f90529051919950600160a060020a0388169263f732f1c9926084808401938290030181600087803b15801561154b57600080fd5b505af115801561155f573d6000803e3d6000fd5b505050506040513d602081101561157557600080fd5b5051604080517f579cd3ca0000000000000000000000000000000000000000000000000000000081529051919c506115e291620f4240916112c091600160a060020a038b169163579cd3ca9160048083019260209291908290030181600087803b15801561128357600080fd5b9a8b90039a99506112e3898c63ffffffff6122a616565b6116058684838e612306565b909b5099505b600284019350610eaa565b50989c9b505050505050505050505050565b60056020526000908152604090205460ff1681565b60008085600160a060020a031663fc0c546a6040518163ffffffff1660e060020a028152600401602060405180830381600087803b15801561167e57600080fd5b505af1158015611692573d6000803e3d6000fd5b505050506040513d60208110156116a857600080fd5b50518751600160a060020a0390911690889060009081106116c557fe5b60209081029091010151600160a060020a03161461172d576040805160e560020a62461bcd02815260206004820152601860248201527f4552525f494e56414c49445f534f555243455f544f4b454e0000000000000000604482015290519081900360640190fd5b604080517faafd6b76000000000000000000000000000000000000000000000000000000008152600481018790523360248201529051600160a060020a0388169163aafd6b769160448083019260209291908290030181600087803b15801561179557600080fd5b505af11580156117a9573d6000803e3d6000fd5b505050506040513d60208110156117bf57600080fd5b50519050610a038782868660008061185a565b600054600160a060020a031681565b6000846117ed816123ea565b6117fb88888888888861185a565b98975050505050505050565b60006118188585858560008061185a565b95945050505050565b611829611eaa565b6003546002805473ffffffffffffffffffffffffffffffffffffffff1916600160a060020a03909216919091179055565b60008060006060600061186b612442565b6003805475ff00000000000000000000000000000000000000000019167501000000000000000000000000000000000000000000179055886118ac816123ea565b60028c511180156118c257508b51600290066001145b1515611918576040805160e560020a62461bcd02815260206004820152601060248201527f4552525f494e56414c49445f5041544800000000000000000000000000000000604482015290519081900360640190fd5b6119538c600081518110151561192a57fe5b906020019060200201518d600181518110151561194357fe5b906020019060200201518d6124b6565b60009450600160a060020a03881615156119c25786156119bd576040805160e560020a62461bcd02815260206004820152601960248201527f4552525f494e56414c49445f414646494c494154455f46454500000000000000604482015290519081900360640190fd5b611a2f565b8660001080156119d457506004548711155b1515611a2a576040805160e560020a62461bcd02815260206004820152601960248201527f4552525f494e56414c49445f414646494c494154455f46454500000000000000604482015290519081900360640190fd5b600194505b339350600160a060020a03891615611a45578893505b611a508c85876126ba565b9250611a5f838c8c8b8b612ad1565b9150611a6c838386613031565b506003805475ff000000000000000000000000000000000000000000191690559a9950505050505050505050565b6000610a03878787878787600080611ac7565b6000611abf848484600080600061185a565b949350505050565b60008060008089611ad7816123ea565b8c518d906000198101908110611ae957fe5b906020019060200201519350611b1e7f42616e636f725800000000000000000000000000000000000000000000000000611fd2565b9250611b497f424e54546f6b656e000000000000000000000000000000000000000000000000611fd2565b600160a060020a03858116911614611bab576040805160e560020a62461bcd02815260206004820152601860248201527f4552525f494e56414c49445f5441524745545f544f4b454e0000000000000000604482015290519081900360640190fd5b611bb98d8d8d308b8b61185a565b9150611bc6848484613114565b604080517f427c0374000000000000000000000000000000000000000000000000000000008152600481018c9052602481018b905260448101849052606481018a90529051600160a060020a0385169163427c037491608480830192600092919082900301818387803b158015611c3c57600080fd5b505af1158015611c50573d6000803e3d6000fd5b50939f9e505050505050505050505050505050565b600154600160a060020a031681565b60606000611ca17f436f6e76657273696f6e5061746846696e646572000000000000000000000000611fd2565b604080517fa1c421cd000000000000000000000000000000000000000000000000000000008152600160a060020a038781166004830152868116602483015291519293509083169163a1c421cd9160448082019260009290919082900301818387803b158015611d1057600080fd5b505af1158015611d24573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526020811015611d4d57600080fd5b810190808051640100000000811115611d6557600080fd5b82016020810184811115611d7857600080fd5b8151856020820283011164010000000082111715611d9557600080fd5b50909550505050505b5092915050565b611dad611eaa565b600054600160a060020a0382811691161415611e13576040805160e560020a62461bcd02815260206004820152600e60248201527f4552525f53414d455f4f574e4552000000000000000000000000000000000000604482015290519081900360640190fd5b6001805473ffffffffffffffffffffffffffffffffffffffff1916600160a060020a0392909216919091179055565b611e4a611eaa565b620f4240811115611ea5576040805160e560020a62461bcd02815260206004820152601960248201527f4552525f494e56414c49445f414646494c494154455f46454500000000000000604482015290519081900360640190fd5b600455565b600054600160a060020a03163314611f0c576040805160e560020a62461bcd02815260206004820152601160248201527f4552525f4143434553535f44454e494544000000000000000000000000000000604482015290519081900360640190fd5b565b600160a060020a0381161515611f6e576040805160e560020a62461bcd02815260206004820152601360248201527f4552525f494e56414c49445f4144445245535300000000000000000000000000604482015290519081900360640190fd5b50565b600160a060020a038116301415611f6e576040805160e560020a62461bcd02815260206004820152601360248201527f4552525f414444524553535f49535f53454c4600000000000000000000000000604482015290519081900360640190fd5b600254604080517fbb34534c000000000000000000000000000000000000000000000000000000008152600481018490529051600092600160a060020a03169163bb34534c91602480830192602092919082900301818787803b15801561203857600080fd5b505af115801561204c573d6000803e3d6000fd5b505050506040513d602081101561206257600080fd5b505192915050565b604080517f7472616e7366657228616464726573732c75696e74323536290000000000000081528151908190036019018120600160a060020a03851660248301526044808301859052835180840390910181526064909201909252602081018051600160e060020a0316600160e060020a0319909316929092179091526120f29084906131db565b505050565b600160a060020a03811660009081526005602052604081205460ff161515612120575080612155565b61212983613269565b15612149575073eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee612155565b612152836132fa565b90505b92915050565b60008083151561216e5760009150611d9e565b5082820282848281151561217e57fe5b04146121d4576040805160e560020a62461bcd02815260206004820152600c60248201527f4552525f4f564552464c4f570000000000000000000000000000000000000000604482015290519081900360640190fd5b9392505050565b600080808311612235576040805160e560020a62461bcd02815260206004820152601260248201527f4552525f4449564944455f42595f5a45524f0000000000000000000000000000604482015290519081900360640190fd5b828481151561224057fe5b04949350505050565b6000828201838110156121d4576040805160e560020a62461bcd02815260206004820152600c60248201527f4552525f4f564552464c4f570000000000000000000000000000000000000000604482015290519081900360640190fd5b600081831015612300576040805160e560020a62461bcd02815260206004820152600d60248201527f4552525f554e444552464c4f5700000000000000000000000000000000000000604482015290519081900360640190fd5b50900390565b600080612311613587565b604080517f67657452657475726e28616464726573732c616464726573732c75696e74323581527f36290000000000000000000000000000000000000000000000000000000000006020808301919091528251918290036022018220600160a060020a03808b16602485015289166044840152606480840189905284518085039091018152608490930184529082018051600160e060020a0316600160e060020a0319909216919091178152815191929184918b5afa8015156123d357600080fd5b505080516020909101519097909650945050505050565b60008111611f6e576040805160e560020a62461bcd02815260206004820152600e60248201527f4552525f5a45524f5f56414c5545000000000000000000000000000000000000604482015290519081900360640190fd5b6003547501000000000000000000000000000000000000000000900460ff1615611f0c576040805160e560020a62461bcd02815260206004820152600e60248201527f4552525f5245454e5452414e4359000000000000000000000000000000000000604482015290519081900360640190fd5b60008083600160a060020a0316638da5cb5b6040518163ffffffff1660e060020a028152600401602060405180830381600087803b1580156124f757600080fd5b505af115801561250b573d6000803e3d6000fd5b505050506040513d602081101561252157600080fd5b5051915061252e82613269565b905060003411156125fc57348314612590576040805160e560020a62461bcd02815260206004820152601760248201527f4552525f4554485f414d4f554e545f4d49534d41544348000000000000000000604482015290519081900360640190fd5b8015156125f7576125a0826132fa565b600160a060020a031663d0e30db0346040518263ffffffff1660e060020a0281526004016000604051808303818588803b1580156125dd57600080fd5b505af11580156125f1573d6000803e3d6000fd5b50505050505b6126b3565b600160a060020a03851660009081526005602052604090205460ff16156126955761262985333086613447565b80156125f75784600160a060020a0316632e1a7d4d846040518263ffffffff1660e060020a02815260040180828152602001915050600060405180830381600087803b15801561267857600080fd5b505af115801561268c573d6000803e3d6000fd5b505050506126b3565b80156126a7576125f785338486613447565b6126b385333086613447565b5050505050565b60608060008060008060008060006126d06135a2565b8c516002900460405190808252806020026020018201604052801561270f57816020015b6126fc6135a2565b8152602001906001900390816126f45790505b5098506000975061273f7f424e54546f6b656e000000000000000000000000000000000000000000000000611fd2565b9650600095505b60018d51038610156128da578c8660010181518110151561276357fe5b90602001906020020151945084600160a060020a0316638da5cb5b6040518163ffffffff1660e060020a028152600401602060405180830381600087803b1580156127ad57600080fd5b505af11580156127c1573d6000803e3d6000fd5b505050506040513d60208110156127d757600080fd5b50518d519094508d90600288019081106127ed57fe5b9060200190602002015192508a8015612804575087155b8015612821575086600160a060020a031683600160a060020a0316145b9150811561282e57600197505b60e06040519081016040528085600160a060020a0316815260200186600160a060020a031681526020018e8881518110151561286657fe5b90602001906020020151600160a060020a0316815260200184600160a060020a031681526020016000600160a060020a031681526020016128a686613269565b1515815283151560209091015289600288048151811015156128c457fe5b6020908102909101015260029590950194612746565b8860008151811015156128e957fe5b6020908102909101810151604080820151600160a060020a0316600090815260059093529091205490915060ff161561295f578060a00151156129455773eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee604082015261295f565b8051612950906132fa565b600160a060020a031660408201525b88518990600019810190811061297157fe5b60209081029091018101516060810151600160a060020a03166000908152600590925260409091205490915060ff16156129e8578060a00151156129ce5773eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee60608201526129e8565b80516129d9906132fa565b600160a060020a031660608201525b600095505b8851861015612ac0578886815181101515612a0457fe5b9060200190602002015190508060a0015115612aae578060c0015115612a2f57306080820152612aa9565b6001895103861415612a4f57600160a060020a038c166080820152612aa9565b8886600101815181101515612a6057fe5b9060200190602002015160a0015115612aa2578886600101815181101515612a8457fe5b6020908102909101015151600160a060020a03166080820152612aa9565b3060808201525b612ab5565b3060808201525b6001909501946129ed565b50969b9a5050505050505050505050565b600080600080612adf6135a2565b6000899350600092505b8a51831015612fca578a83815181101515612b0057fe5b9060200190602002015191508160a0015115612b91578215801590612b4d57508a5130908c906000198601908110612b3457fe5b9060200190602002015160800151600160a060020a0316145b8015612b745750604080830151600160a060020a031660009081526005602052205460ff16155b15612b8c57612b8c826040015183600001518661206a565b612bc7565b8160200151600160a060020a03168260400151600160a060020a0316141515612bc757612bc78260400151836000015186613114565b8160a001511515612c8a578151604080840151606085015182517f5e5144eb000000000000000000000000000000000000000000000000000000008152600160a060020a039283166004820152908216602482015260448101889052600160648201529151921691635e5144eb916084808201926020929091908290030181600087803b158015612c5757600080fd5b505af1158015612c6b573d6000803e3d6000fd5b505050506040513d6020811015612c8157600080fd5b50519450612e27565b604080830151600160a060020a031660009081526005602052205460ff1615612d685781516040808401516060850151608086015183517fe8dc12ff000000000000000000000000000000000000000000000000000000008152600160a060020a03938416600482015291831660248301526044820189905233606483015282166084820152915192169163e8dc12ff91349160a480830192602092919082900301818588803b158015612d3d57600080fd5b505af1158015612d51573d6000803e3d6000fd5b50505050506040513d6020811015612c8157600080fd5b81516040808401516060850151608086015183517fe8dc12ff000000000000000000000000000000000000000000000000000000008152600160a060020a03938416600482015291831660248301526044820189905233606483015282166084820152915192169163e8dc12ff9160a4808201926020929091908290030181600087803b158015612df857600080fd5b505af1158015612e0c573d6000803e3d6000fd5b505050506040513d6020811015612e2257600080fd5b505194505b8160c0015115612f3957612e48620f42406112c0878a63ffffffff61215b16565b90508160600151600160a060020a031663a9059cbb89836040518363ffffffff1660e060020a0281526004018083600160a060020a0316600160a060020a0316815260200182815260200192505050602060405180830381600087803b158015612eb157600080fd5b505af1158015612ec5573d6000803e3d6000fd5b505050506040513d6020811015612edb57600080fd5b50511515612f33576040805160e560020a62461bcd02815260206004820152601760248201527f4552525f4645455f5452414e534645525f4641494c4544000000000000000000604482015290519081900360640190fd5b80850394505b8160600151600160a060020a03168260400151600160a060020a03168360200151600160a060020a03167f7154b38b5dd31bb3122436a96d4e09aba5b323ae1fd580025fab55074334c0958789336040518084815260200183815260200182600160a060020a0316600160a060020a03168152602001935050505060405180910390a4849350600190920191612ae9565b88851015613022576040805160e560020a62461bcd02815260206004820152601260248201527f4552525f52455455524e5f544f4f5f4c4f570000000000000000000000000000604482015290519081900360640190fd5b50929998505050505050505050565b6130396135a2565b600084600186510381518110151561304d57fe5b602090810290910101516080810151909250600160a060020a03163014613073576126b3565b506060810151600160a060020a03811660009081526005602052604090205460ff16156131095760a0820151156130a657fe5b80600160a060020a031663205c287884866040518363ffffffff1660e060020a0281526004018083600160a060020a0316600160a060020a0316815260200182815260200192505050600060405180830381600087803b15801561267857600080fd5b6126b381848661206a565b604080517fdd62ed3e000000000000000000000000000000000000000000000000000000008152306004820152600160a060020a038481166024830152915160009286169163dd62ed3e91604480830192602092919082900301818787803b15801561317f57600080fd5b505af1158015613193573d6000803e3d6000fd5b505050506040513d60208110156131a957600080fd5b50519050818110156131d55760008111156131ca576131ca848460006134ff565b6131d58484846134ff565b50505050565b6131e36135de565b602060405190810160405280600181525090506020818351602085016000875af180151561321057600080fd5b50805115156120f2576040805160e560020a62461bcd02815260206004820152601360248201527f4552525f5452414e534645525f4641494c454400000000000000000000000000604482015290519081900360640190fd5b6000806132746135de565b604080517f69735632384f72486967686572282900000000000000000000000000000000008152815190819003600f018120600482526024820190925260208082018051600160e060020a0316600160e060020a0319909416939093178352815191929091849188611388fa92508280156132ef5750815115155b93505b505050919050565b60008060008084600160a060020a03166371f52bf36040518163ffffffff1660e060020a028152600401602060405180830381600087803b15801561333e57600080fd5b505af1158015613352573d6000803e3d6000fd5b505050506040513d602081101561336857600080fd5b505161ffff169250600091505b828210156134295784600160a060020a03166319b64015836040518263ffffffff1660e060020a02815260040180828152602001915050602060405180830381600087803b1580156133c657600080fd5b505af11580156133da573d6000803e3d6000fd5b505050506040513d60208110156133f057600080fd5b5051600160a060020a03811660009081526005602052604090205490915060ff161561341e578093506132f2565b600190910190613375565b5073eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee949350505050565b604080517f7472616e7366657246726f6d28616464726573732c616464726573732c75696e81527f74323536290000000000000000000000000000000000000000000000000000006020808301919091528251918290036025018220600160a060020a03808816602485015286166044840152606480840186905284518085039091018152608490930190935281018051600160e060020a0316600160e060020a0319909316929092179091526131d59085906131db565b604080517f617070726f766528616464726573732c75696e7432353629000000000000000081528151908190036018018120600160a060020a03851660248301526044808301859052835180840390910181526064909201909252602081018051600160e060020a0316600160e060020a0319909316929092179091526120f29084906131db565b60408051808201825290600290829080388339509192915050565b6040805160e081018252600080825260208201819052918101829052606081018290526080810182905260a0810182905260c081019190915290565b60206040519081016040528060019060208202803883395091929150505600a165627a7a723058204c6d6f7ef1fe9e0170d19e339c72b77e0e50abade5d2e911ba59ffce0be466220029

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

00000000000000000000000052ae12abe5d8bd778bd5397f99ca900624cfadd4

-----Decoded View---------------
Arg [0] : _registry (address): 0x52Ae12ABe5D8BD778BD5397F99cA900624CfADD4

-----Encoded View---------------
1 Constructor Arguments found :
Arg [0] : 00000000000000000000000052ae12abe5d8bd778bd5397f99ca900624cfadd4


Deployed Bytecode Sourcemap

24652:32764:0:-;;;;;;;;;-1:-1:-1;;;24652:32764:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;14362:224;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;14362:224:0;;;;;;;;;27054:209;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;27054:209:0;-1:-1:-1;;;;;27054:209:0;;;;;;;;;54285:159;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;54285:159:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;54285:159:0;;-1:-1:-1;;54285:159:0;;;-1:-1:-1;54285:159:0;;-1:-1:-1;;;;54285:159:0;;;;;;;;;;;;;;;;;;;;;;;;57030:383;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;57030:383:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;57030:383:0;;-1:-1:-1;;57030:383:0;;;-1:-1:-1;;;57030:383:0;;;;;-1:-1:-1;;;;;57030:383:0;;;;;;;-1:-1:-1;57030:383:0;;;;;;-1:-1:-1;57030:383:0;;;;;;;;;;;;;;;;;;;;;12049:38;;8:9:-1;5:2;;;30:1;27;20:12;5:2;12049:38:0;;;;;;;;;;;;;;;;;;;;;;13007:925;;8:9:-1;5:2;;;30:1;27;20:12;5:2;13007:925:0;;;;54794:356;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;54794:356:0;;-1:-1:-1;;54794:356:0;;;-1:-1:-1;;;54794:356:0;;;;;-1:-1:-1;;;;;54794:356:0;;;;;;-1:-1:-1;54794:356:0;;;;-1:-1:-1;54794:356:0;;25294:38;;8:9:-1;5:2;;;30:1;27;20:12;5:2;25294:38:0;;;;20031:246;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;20031:246:0;-1:-1:-1;;;;;20031:246:0;;;;;;;;;;;;11959:37;;8:9:-1;5:2;;;30:1;27;20:12;5:2;11959:37:0;;;;;;;;-1:-1:-1;;;;;11959:37:0;;;;;;;;;;;;;;9140:208;;8:9:-1;5:2;;;30:1;27;20:12;5:2;9140:208:0;;;;11870:33;;8:9:-1;5:2;;;30:1;27;20:12;5:2;11870:33:0;;;;28305:2807;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;28305:2807:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;28305:2807:0;;-1:-1:-1;;28305:2807:0;;;-1:-1:-1;28305:2807:0;;-1:-1:-1;;;;28305:2807:0;25370:44;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;25370:44:0;-1:-1:-1;;;;;25370:44:0;;;;;38369:583;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;38369:583:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;38369:583:0;;-1:-1:-1;;;;;;;38369:583:0;;;;;-1:-1:-1;38369:583:0;;;;;;;;;;-1:-1:-1;38369:583:0;;;;;-1:-1:-1;38369:583:0;;-1:-1:-1;;38369:583:0;7955:20;;8:9:-1;5:2;;;30:1;27;20:12;5:2;7955:20:0;;;;55527:429;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;55527:429:0;;-1:-1:-1;;55527:429:0;;;-1:-1:-1;;;55527:429:0;;;;;-1:-1:-1;;;;;55527:429:0;;;;;;;-1:-1:-1;55527:429:0;;;;;;-1:-1:-1;55527:429:0;;;;;56727:229;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;56727:229:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;56727:229:0;;-1:-1:-1;;56727:229:0;;;-1:-1:-1;;;56727:229:0;;;;;;;;-1:-1:-1;;;;;56727:229:0;;-1:-1:-1;56727:229:0;;-1:-1:-1;56727:229:0;14011:137;;8:9:-1;5:2;;;30:1;27;20:12;5:2;14011:137:0;;;;32276:1573;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;32276:1573:0;;-1:-1:-1;;32276:1573:0;;;-1:-1:-1;;;32276:1573:0;;;;;-1:-1:-1;;;;;32276:1573:0;;;;;;;-1:-1:-1;32276:1573:0;;;;;;-1:-1:-1;32276:1573:0;;;;;34841:404;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;34841:404:0;;-1:-1:-1;;34841:404:0;;;-1:-1:-1;;;34841:404:0;;;;;;;;;;-1:-1:-1;34841:404:0;;;;;-1:-1:-1;34841:404:0;;;;;56030:202;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;56030:202:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;56030:202:0;;-1:-1:-1;;56030:202:0;;;-1:-1:-1;;;56030:202:0;;;;;;-1:-1:-1;56030:202:0;;-1:-1:-1;56030:202:0;55224:229;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;55224:229:0;;-1:-1:-1;;55224:229:0;;;-1:-1:-1;;;55224:229:0;;;;;;;;-1:-1:-1;;;;;55224:229:0;;-1:-1:-1;55224:229:0;;-1:-1:-1;55224:229:0;36350:1068;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;36350:1068:0;;-1:-1:-1;;36350:1068:0;;;-1:-1:-1;;;36350:1068:0;;;;;;;;;;-1:-1:-1;36350:1068:0;;;;;-1:-1:-1;36350:1068:0;;;;;-1:-1:-1;;;;;36350:1068:0;;;;;;;;;;;7982:23;;8:9:-1;5:2;;;30:1;27;20:12;5:2;7982:23:0;;;;27645:283;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;27645:283:0;-1:-1:-1;;;;;27645:283:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8:100:-1;33:3;30:1;27:10;8:100;;;90:11;;;84:18;71:11;;;64:39;52:2;45:10;8:100;;;12:14;27645:283:0;;;;;;;;;;;;;;;;;56306:347;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;56306:347:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;56306:347:0;;-1:-1:-1;;56306:347:0;;;-1:-1:-1;;;56306:347:0;;;;;-1:-1:-1;;;;;56306:347:0;;;;;;-1:-1:-1;56306:347:0;;;;-1:-1:-1;56306:347:0;;8891:158;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;8891:158:0;-1:-1:-1;;;;;8891:158:0;;;;;54518:202;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;54518:202:0;;-1:-1:-1;;54518:202:0;;;-1:-1:-1;;;54518:202:0;;;;;;-1:-1:-1;54518:202:0;;-1:-1:-1;54518:202:0;26588:240;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;26588:240:0;;;;;14362:224;8453:12;:10;:12::i;:::-;14522:26;:56;;;;;;;-1:-1:-1;;14522:56:0;;;;;;;;;14362:224::o;27054:209::-;8453:12;:10;:12::i;:::-;27175:6;9937:23;9951:8;9937:13;:23::i;:::-;27200:6;10291:18;10300:8;10291;:18::i;:::-;-1:-1:-1;;;;;;;27224:19:0;;;;;;;;:11;:19;;;;;:31;;-1:-1:-1;;27224:31:0;;;;;;;;;;27054:209::o;54285:159::-;54369:7;54378;54406:26;54417:5;54424:7;54406:10;:26::i;:::-;54398:38;54434:1;;-1:-1:-1;54285:159:0;-1:-1:-1;;;54285:159:0:o;57030:383::-;57284:7;57316:89;57330:5;57337:7;57346:10;57358:12;57372:17;57391:13;57316;:89::i;:::-;57309:96;57030:383;-1:-1:-1;;;;;;;57030:383:0:o;12049:38::-;;;;;;;;;:::o;13007:925::-;13237:29;13124:5;;-1:-1:-1;;;;;13124:5:0;13110:10;:19;;:50;;-1:-1:-1;13134:26:0;;;;;;;13133:27;13110:50;13102:80;;;;;;;-1:-1:-1;;;;;13102:80:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;13287:28;13297:17;13287:9;:28::i;:::-;13436:8;;13237:79;;-1:-1:-1;;;;;;13413:32:0;;;13436:8;;13413:32;;;;:61;;-1:-1:-1;;;;;;13449:25:0;;;;13413:61;13405:94;;;;;;;-1:-1:-1;;;;;13405:94:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;13614:40;;;;;;13636:17;13614:40;;;;;;13666:1;;-1:-1:-1;;;;;13614:21:0;;;;;:40;;;;;;;;;;;;;;;13666:1;13614:21;:40;;;5:2:-1;;;;30:1;27;20:12;5:2;13614:40:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;13614:40:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;13614:40:0;-1:-1:-1;;;;;13614:54:0;;;13606:87;;;;;-1:-1:-1;;;;;13606:87:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;13800:8;;;13785:12;:23;;-1:-1:-1;;;;;13800:8:0;;;-1:-1:-1;;13785:23:0;;;;;;;13902:22;;;;;;;;;;;13007:925::o;54794:356::-;55023:7;55055:87;55069:5;55076:7;55085:10;55105:1;55109:17;55128:13;55055;:87::i;:::-;55048:94;54794:356;-1:-1:-1;;;;;;54794:356:0:o;25294:38::-;;;;:::o;20031:246::-;8453:12;:10;:12::i;:::-;20162:6;9937:23;9951:8;9937:13;:23::i;:::-;20192:3;9937:23;9951:8;9937:13;:23::i;:::-;20214:3;10291:18;10300:8;10291;:18::i;:::-;20235:34;20248:6;20256:3;20261:7;20235:12;:34::i;:::-;9971:1;;8476;20031:246;;;:::o;11959:37::-;;;-1:-1:-1;;;;;11959:37:0;;:::o;9140:208::-;9207:8;;-1:-1:-1;;;;;9207:8:0;9193:10;:22;9185:52;;;;;-1:-1:-1;;;;;9185:52:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;9272:8;;;9265:5;;9253:28;;-1:-1:-1;;;;;9272:8:0;;;;9265:5;;;;9253:28;;;9300:8;;;;9292:16;;-1:-1:-1;;9292:16:0;;;-1:-1:-1;;;;;9300:8:0;;9292:16;;;;9319:21;;;9140:208::o;11870:33::-;;;-1:-1:-1;;;;;11870:33:0;;:::o;28305:2807::-;28384:7;28404:14;28429:11;28451:14;28476:15;28502:13;28526:20;28557:22;28870:9;28926:23;28979:18;29027:23;28597:25;28607:14;28597:9;:25::i;:::-;28557:66;;28645:7;28636:16;;28760:1;28745:5;:12;:16;:41;;;;-1:-1:-1;28765:12:0;;28780:1;;28765:16;28785:1;28765:21;28745:41;28737:70;;;;;;;-1:-1:-1;;;;;28737:70:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;28882:1;28870:13;;28865:2214;28889:5;:12;28885:1;:16;28865:2214;;;28952:5;28962:1;28958;:5;28952:12;;;;;;;;;;;;;;;;;;28926:38;;29000:5;29010:1;29006;:5;29000:12;;;;;;;;;;;;;;;;;;28979:33;;29053:5;29059:1;29053:8;;;;;;;;;;;;;;;;;;29027:34;;29118:6;-1:-1:-1;;;;;29101:30:0;;:32;;;;;-1:-1:-1;;;29101:32:0;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;29101:32:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;29101:32:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;29101:32:0;;-1:-1:-1;29204:48:0;29101:32;29240:11;29204:24;:48::i;:::-;29190:62;;29281:48;29306:9;29317:11;29281:24;:48::i;:::-;29267:62;;29365:6;-1:-1:-1;;;;;29350:21:0;:11;-1:-1:-1;;;;;29350:21:0;;29346:1722;;;29488:1;29484;:5;:31;;;;29503:5;29513:1;29509;:5;29503:12;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;29493:22:0;:6;-1:-1:-1;;;;;29493:22:0;;;29484:31;29480:100;;;29559:6;-1:-1:-1;;;;;29547:31:0;;:33;;;;;-1:-1:-1;;;29547:33:0;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;29547:33:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;29547:33:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;29547:33:0;;-1:-1:-1;29480:100:0;29667:9;-1:-1:-1;;;;;29667:29:0;;29697:11;29667:42;;;;;-1:-1:-1;;;29667:42:0;;;;;;;-1:-1:-1;;;;;29667:42:0;-1:-1:-1;;;;;29667:42:0;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;29667:42:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;29667:42:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;29667:42:0;29747:33;;;;;;-1:-1:-1;;;;;29747:33:0;;;;;;;;;29667:42;;-1:-1:-1;29747:20:0;;;;;;:33;;;;;;;;;;;;;;;-1:-1:-1;29747:20:0;:33;;;5:2:-1;;;;30:1;27;20:12;5:2;29747:33:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;29747:33:0;;;;;;;13:3:-1;8;5:12;2:2;;;30:1;27;20:12;2:2;-1:-1;29747:33:0;;;;;;29808:53;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;29747:33;;-1:-1:-1;;;;;;29808:20:0;;;;;:53;;;;;;;;;;-1:-1:-1;29808:20:0;:53;;;5:2:-1;;;;30:1;27;20:12;5:2;29808:53:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;29808:53:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;29808:53:0;29897:25;;;;;;;;29808:53;;-1:-1:-1;29886:68:0;;24842:7;;29886:37;;-1:-1:-1;;;;;29897:23:0;;;;;:25;;;;;29808:53;;29897:25;;;;;;;;:23;:25;;;5:2:-1;;;;30:1;27;20:12;5:2;29897:25:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;29897:25:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;29897:25:0;29886:6;;:37;;;;;:10;:37;:::i;:::-;:41;:68;:41;:68;:::i;:::-;29973:13;;;;;29880:74;-1:-1:-1;30089:18:0;:6;29973:13;30089:18;:10;:18;:::i;:::-;30080:27;;29346:1722;;;30161:6;-1:-1:-1;;;;;30146:21:0;:11;-1:-1:-1;;;;;30146:21:0;;30142:926;;;30285:1;30281;:5;:31;;;;30300:5;30310:1;30306;:5;30300:12;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;30290:22:0;:6;-1:-1:-1;;;;;30290:22:0;;;30281:31;30277:100;;;30356:6;-1:-1:-1;;;;;30344:31:0;;:33;;;;;-1:-1:-1;;;30344:33:0;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;30344:33:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;30344:33:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;30344:33:0;;-1:-1:-1;30277:100:0;30464:9;-1:-1:-1;;;;;30464:29:0;;30494:11;30464:42;;;;;-1:-1:-1;;;30464:42:0;;;;;;;-1:-1:-1;;;;;30464:42:0;-1:-1:-1;;;;;30464:42:0;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;30464:42:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;30464:42:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;30464:42:0;30544:33;;;;;;-1:-1:-1;;;;;30544:33:0;;;;;;;;;30464:42;;-1:-1:-1;30544:20:0;;;;;;:33;;;;;;;;;;;;;;;-1:-1:-1;30544:20:0;:33;;;5:2:-1;;;;30:1;27;20:12;5:2;30544:33:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;30544:33:0;;;;;;;13:3:-1;8;5:12;2:2;;;30:1;27;20:12;2:2;-1:-1;30544:33:0;;;;;;30605:49;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30544:33;;-1:-1:-1;;;;;;30605:16:0;;;;;:49;;;;;;;;;;-1:-1:-1;30605:16:0;:49;;;5:2:-1;;;;30:1;27;20:12;5:2;30605:49:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;30605:49:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;30605:49:0;30690:25;;;;;;;;30605:49;;-1:-1:-1;30679:68:0;;24842:7;;30679:37;;-1:-1:-1;;;;;30690:23:0;;;;;:25;;;;;30605:49;;30690:25;;;;;;;;:23;:25;;;5:2:-1;;;;30:1;27;20:12;30679:68:0;30766:13;;;;;30673:74;-1:-1:-1;30882:18:0;:6;30766:13;30882:18;:10;:18;:::i;30142:926::-;30998:54;31008:9;31019:11;31032;31045:6;30998:9;:54::i;:::-;30982:70;;-1:-1:-1;30982:70:0;-1:-1:-1;30142:926:0;28908:1;28903:6;;;;28865:2214;;;-1:-1:-1;31098:6:0;;28305:2807;-1:-1:-1;;;;;;;;;;;;28305:2807:0:o;25370:44::-;;;;;;;;;;;;;;;:::o;38369:583::-;38528:7;38749:14;38635:8;-1:-1:-1;;;;;38635:14:0;;:16;;;;;-1:-1:-1;;;38635:16:0;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;38635:16:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;38635:16:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;38635:16:0;38623:8;;-1:-1:-1;;;;;38623:28:0;;;;:5;;38629:1;;38623:8;;;;;;;;;;;;;;;-1:-1:-1;;;;;38623:28:0;;38615:65;;;;;-1:-1:-1;;;;;38615:65:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;38766:54;;;;;;;;;;;;38809:10;38766:54;;;;;;-1:-1:-1;;;;;38766:27:0;;;;;:54;;;;;;;;;;;;;;-1:-1:-1;38766:27:0;:54;;;5:2:-1;;;;30:1;27;20:12;5:2;38766:54:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;38766:54:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;38766:54:0;;-1:-1:-1;38875:69:0;38889:5;38766:54;38904:10;38916:12;38938:1;;38875:13;:69::i;7955:20::-;;;-1:-1:-1;;;;;7955:20:0;;:::o;55527:429::-;55827:7;55797:10;9595:24;9612:6;9595:16;:24::i;:::-;55859:89;55873:5;55880:7;55889:10;55901:12;55915:17;55934:13;55859;:89::i;:::-;55852:96;55527:429;-1:-1:-1;;;;;;;;55527:429:0:o;56727:229::-;56851:7;56878:70;56892:5;56899:7;56908:10;56920:12;56942:1;56946;56878:13;:70::i;:::-;56871:77;56727:229;-1:-1:-1;;;;;56727:229:0:o;14011:137::-;8453:12;:10;:12::i;:::-;14128;;14117:8;:23;;-1:-1:-1;;14117:23:0;-1:-1:-1;;;;;14128:12:0;;;14117:23;;;;;;14011:137::o;32276:1573::-;32536:7;32952:24;33341:19;33517:28;33620:14;15502:12;:10;:12::i;:::-;15525:6;:13;;-1:-1:-1;;15525:13:0;;;;;32506:10;9595:24;32506:10;9595:16;:24::i;:::-;32690:1;32675:5;:12;:16;:41;;;;-1:-1:-1;32695:12:0;;32710:1;;32695:16;32715:1;32695:21;32675:41;32667:70;;;;;;;-1:-1:-1;;;;;32667:70:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;32829:64;32847:5;32853:1;32847:8;;;;;;;;;;;;;;;;;;32874:5;32880:1;32874:8;;;;;;;;;;;;;;;;;;32885:7;32829:17;:64::i;:::-;32979:5;;-1:-1:-1;;;;;;32999:31:0;;;32995:294;;;33055:18;;33047:56;;;;;-1:-1:-1;;;;;33047:56:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;32995:294;;;33157:13;33153:1;:17;:53;;;;;33191:15;;33174:13;:32;;33153:53;33145:91;;;;;;;-1:-1:-1;;;;;33145:91:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;33273:4;33251:26;;32995:294;33363:10;;-1:-1:-1;;;;;;33388:26:0;;;33384:71;;33443:12;33429:26;;33384:71;33548:61;33569:5;33576:11;33589:19;33548:20;:61::i;:::-;33517:92;;33637:73;33650:4;33656:7;33665:10;33677:17;33696:13;33637:12;:73::i;:::-;33620:90;;33771:44;33789:4;33795:6;33803:11;33771:17;:44::i;:::-;-1:-1:-1;15561:6:0;:14;;-1:-1:-1;;15561:14:0;;;33835:6;32276:1573;-1:-1:-1;;;;;;;;;;32276:1573:0:o;34841:404::-;35103:7;35135:102;35145:5;35152:7;35161:10;35173:17;35192:14;35208:13;35231:1;35235;35135:9;:102::i;56030:202::-;56129:7;56156:68;56170:5;56177:7;56186:10;56206:1;56218;56222;56156:13;:68::i;:::-;56149:75;56030:202;-1:-1:-1;;;;56030:202:0:o;36350:1068::-;36718:7;36743:23;36803:16;37051:14;36688:10;9595:24;9612:6;9595:16;:24::i;:::-;36775:12;;36769:5;;-1:-1:-1;;36775:16:0;;;36769:23;;;;;;;;;;;;;;36743:49;;36831:19;36841:8;36831:9;:19::i;:::-;36803:48;;36940:20;36950:9;36940;:20::i;:::-;-1:-1:-1;;;;;36925:35:0;;;;;;36917:72;;;;;-1:-1:-1;;;;;36917:72:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;37068:81;37082:5;37089:7;37098:10;37110:4;37116:17;37135:13;37068;:81::i;:::-;37051:98;;37198:45;37214:11;37227:7;37236:6;37198:15;:45::i;:::-;37309:75;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;37309:17:0;;;;;:75;;;;;;;;;;;;;;;:17;:75;;;5:2:-1;;;;30:1;27;20:12;5:2;37309:75:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;-1:-1;37404:6:0;;36350:1068;-1:-1:-1;;;;;;;;;;;;;;;36350:1068:0:o;7982:23::-;;;-1:-1:-1;;;;;7982:23:0;;:::o;27645:283::-;27742:9;27764:32;27821:33;27831:22;27821:9;:33::i;:::-;27873:47;;;;;;-1:-1:-1;;;;;27873:47:0;;;;;;;;;;;;;;;;27764:91;;-1:-1:-1;27873:19:0;;;;;;:47;;;;;-1:-1:-1;;27873:47:0;;;;;;;;-1:-1:-1;27873:19:0;:47;;;5:2:-1;;;;30:1;27;20:12;5:2;27873:47:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;27873:47:0;;;;;;39:16:-1;36:1;17:17;2:54;101:4;27873:47:0;80:15:-1;;;-1:-1;;76:31;65:43;;120:4;113:20;13:2;5:11;;2:2;;;29:1;26;19:12;2:2;27873:47:0;;;;;;20:11:-1;15:3;12:20;9:2;;;45:1;42;35:12;9:2;64:21;;126:4;117:14;;142:31;;;139:2;;;186:1;183;176:12;139:2;224:3;218:10;339:9;333:2;319:12;315:21;297:16;293:44;290:59;268:11;254:12;251:29;239:119;236:2;;;371:1;368;361:12;236:2;-1:-1;27873:47:0;;-1:-1:-1;;;;;27645:283:0;;;;;;:::o;8891:158::-;8453:12;:10;:12::i;:::-;8986:5;;-1:-1:-1;;;;;8973:18:0;;;8986:5;;8973:18;;8965:45;;;;;-1:-1:-1;;;;;8965:45:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;9021:8;:20;;-1:-1:-1;;9021:20:0;-1:-1:-1;;;;;9021:20:0;;;;;;;;;;8891:158::o;26588:240::-;8453:12;:10;:12::i;:::-;24908:7;26701:44;;;26693:82;;;;;-1:-1:-1;;;;;26693:82:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;26786:15;:34;26588:240::o;8540:104::-;8609:5;;-1:-1:-1;;;;;8609:5:0;8595:10;:19;8587:49;;;;;-1:-1:-1;;;;;8587:49:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;8540:104::o;10035:128::-;-1:-1:-1;;;;;10109:22:0;;;;10101:54;;;;;-1:-1:-1;;;;;10101:54:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;10035:128;:::o;10384:126::-;-1:-1:-1;;;;;10453:25:0;;10473:4;10453:25;;10445:57;;;;;-1:-1:-1;;;;;10445:57:0;;;;;;;;;;;;;;;;;;;;;;;;;;;14784:133;14876:8;;:33;;;;;;;;;;;;;;14849:7;;-1:-1:-1;;;;;14876:8:0;;:18;;:33;;;;;;;;;;;;;;14849:7;14876:8;:33;;;5:2:-1;;;;30:1;27;20:12;5:2;14876:33:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;14876:33:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;14876:33:0;;14784:133;-1:-1:-1;;14784:133:0:o;17060:174::-;15995:38;;;;;;;;;;;;;;;;-1:-1:-1;;;;;17166:59:0;;;;;;;;;;;;;;;26:21:-1;;;22:32;;;6:49;;17166:59:0;;;;;;;;25:18:-1;;61:17;;-1:-1;;;;;182:15;-1:-1;;;;;;17166:59:0;;;179:29:-1;;;;160:49;;;17150:76:0;;17158:6;;17150:7;:76::i;:::-;17060:174;;;:::o;51657:362::-;-1:-1:-1;;;;;51785:19:0;;51756:11;51785:19;;;:11;:19;;;;;;;;51784:20;51780:52;;;-1:-1:-1;51826:6:0;51819:13;;51780:52;51849:34;51872:10;51849:22;:34::i;:::-;51845:92;;;-1:-1:-1;24969:42:0;51898:39;;51845:92;51969:41;51999:10;51969:29;:41::i;:::-;51950:61;;51657:362;;;;;:::o;21424:250::-;21484:7;;21537;;21533:34;;;21566:1;21559:8;;;;21533:34;-1:-1:-1;21592:7:0;;;21597:2;21592;:7;21618:6;;;;;;;;:12;21610:37;;;;;-1:-1:-1;;;;;21610:37:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;21665:1;21424:250;-1:-1:-1;;;21424:250:0:o;21902:174::-;21962:7;;21990:6;;;21982:37;;;;;-1:-1:-1;;;;;21982:37:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;22047:2;22042;:7;;;;;;;;;21902:174;-1:-1:-1;;;;21902:174:0:o;20661:169::-;20721:7;20753;;;20779;;;;20771:32;;;;;-1:-1:-1;;;;;20771:32:0;;;;;;;;;;;;;;;;;;;;;;;;;;;21053:147;21113:7;21141:8;;;;21133:34;;;;;-1:-1:-1;;;;;21133:34:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;21185:7:0;;;21053:147::o;52230:900::-;52348:7;52357;52377:21;;:::i;:::-;52085:47;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;52429:85:0;;;;;;;;;;;;;;;;;;;;;;26:21:-1;;;22:32;;;6:49;;52429:85:0;;;;;;25:18:-1;;;61:17;;-1:-1;;;;;182:15;-1:-1;;;;;;52429:85:0;;;179:29:-1;;;;160:49;;52801:11:0;;52429:85;;52085:47;52902:3;;52644:5;52595:3;52566:431;53021:7;53014:15;53011:2;;;53059:1;53056;53049:12;53011:2;-1:-1:-1;;53107:6:0;;;53115;;;;53107;;53115;;-1:-1:-1;52230:900:0;-1:-1:-1;;;;;52230:900:0:o;9694:112::-;9778:1;9769:10;;9761:37;;;;;-1:-1:-1;;;;;9761:37:0;;;;;;;;;;;;;;;;;;;;;;;;;;;15638:89;15694:6;;;;;;;15693:7;15685:34;;;;;-1:-1:-1;;;;;15685:34:0;;;;;;;;;;;;;;;;;;;;;;;;;;;42581:1653;42696:25;42762:21;42735:7;-1:-1:-1;;;;;42735:13:0;;:15;;;;;-1:-1:-1;;;42735:15:0;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;42735:15:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;42735:15:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;42735:15:0;;-1:-1:-1;42786:38:0;42735:15;42786:22;:38::i;:::-;42762:62;;42869:1;42857:9;:13;42853:1374;;;42930:9;:20;;42922:56;;;;;-1:-1:-1;;;;;42922:56:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;43213:16;43212:17;43208:125;;;43260:45;43290:14;43260:29;:45::i;:::-;-1:-1:-1;;;;;43248:66:0;;43321:9;43248:85;;;;;-1:-1:-1;;;43248:85:0;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;43248:85:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;43248:85:0;;;;;43208:125;42853:1374;;;-1:-1:-1;;;;;43387:25:0;;;;;;:11;:25;;;;;;;;43383:844;;;43599:57;43616:12;43630:10;43642:4;43648:7;43599:16;:57::i;:::-;43726:16;43722:82;;;43773:12;-1:-1:-1;;;;;43761:34:0;;43796:7;43761:43;;;;;-1:-1:-1;;;43761:43:0;;;;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;43761:43:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;43761:43:0;;;;43383:844;;;44019:16;44015:200;;;44054:67;44071:12;44085:10;44097:14;44113:7;44054:16;:67::i;44015:200::-;44158:57;44175:12;44189:10;44201:4;44207:7;44158:16;:57::i;:::-;42581:1653;;;;;:::o;45985:4180::-;46117:16;46146:28;46238:26;46283:16;46418:9;46505:23;46586:20;46650:23;46791:24;47716:30;;:::i;:::-;46198:22;;46223:1;;46198:26;46177:48;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;46146:79;;46267:5;46238:34;;46302:20;46312:9;46302;:20::i;:::-;46283:39;;46447:1;46443:5;;46438:1216;46479:1;46454:15;:22;:26;46450:1;:30;46438:1216;;;46548:15;46564:1;46568;46564:5;46548:22;;;;;;;;;;;;;;;;;;46505:66;;46620:6;-1:-1:-1;;;;;46620:12:0;;:14;;;;;-1:-1:-1;;;46620:14:0;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;46620:14:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;46620:14:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;46620:14:0;46676:22;;46620:14;;-1:-1:-1;46676:15:0;;46696:1;46692:5;;;46676:22;;;;;;;;;;;;;;46650:48;;46818:20;:46;;;;;46843:21;46842:22;46818:46;:73;;;;;46883:8;-1:-1:-1;;;;;46868:23:0;:11;-1:-1:-1;;;;;46868:23:0;;46818:73;46791:100;;46910:19;46906:70;;;46972:4;46948:28;;46906:70;47007:635;;;;;;;;;47170:9;-1:-1:-1;;;;;47007:635:0;;;;;47094:6;-1:-1:-1;;;;;47007:635:0;;;;;47262:15;47278:1;47262:18;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;47007:635:0;;;;;47312:11;-1:-1:-1;;;;;47007:635:0;;;;;47457:1;-1:-1:-1;;;;;47007:635:0;;;;;47534:33;47557:9;47534:22;:33::i;:::-;47007:635;;;;;;;;;;;;46993:4;47002:1;46998;:5;46993:11;;;;;;;;;;;;;;;;;;:649;46487:1;46482:6;;;;;46438:1216;;;47749:4;47754:1;47749:7;;;;;;;;;;;;;;;;;;;;47783:20;;;;;-1:-1:-1;;;;;47771:33:0;;;;;:11;:33;;;;;;;47749:7;;-1:-1:-1;47771:33:0;;47767:498;;;47917:8;:31;;;47913:340;;;24969:42;47967:20;;;:55;47913:340;;;48233:18;;48203:49;;:29;:49::i;:::-;-1:-1:-1;;;;;48168:85:0;:20;;;:85;47913:340;48319:11;;48314:4;;-1:-1:-1;;48319:15:0;;;48314:21;;;;;;;;;;;;;;;;48362:20;;;;-1:-1:-1;;;;;48350:33:0;;;;;:11;:33;;;;;;;;48314:21;;-1:-1:-1;48350:33:0;;48346:498;;;48496:8;:31;;;48492:340;;;24969:42;48546:20;;;:55;48492:340;;;48812:18;;48782:49;;:29;:49::i;:::-;-1:-1:-1;;;;;48747:85:0;:20;;;:85;48492:340;48911:1;48907:5;;48902:1232;48918:4;:11;48914:1;:15;48902:1232;;;48962:4;48967:1;48962:7;;;;;;;;;;;;;;;;;;48951:18;;49121:8;:31;;;49117:1006;;;49277:8;:28;;;49273:664;;;49351:4;49328:20;;;:27;49273:664;;;49482:1;49468:4;:11;:15;49463:1;:20;49459:478;;;-1:-1:-1;;;;;49506:35:0;;:20;;;:35;49459:478;;;49667:4;49672:1;49676;49672:5;49667:11;;;;;;;;;;;;;;;;;;:34;;;49663:274;;;49747:4;49752:1;49756;49752:5;49747:11;;;;;;;;;;;;;;;;;;;:21;-1:-1:-1;;;;;49724:44:0;:20;;;:44;49663:274;;;49933:4;49910:20;;;:27;49663:274;49117:1006;;;50103:4;50080:20;;;:27;49117:1006;48931:3;;;;;48902:1232;;;-1:-1:-1;50153:4:0;;45985:4180;-1:-1:-1;;;;;;;;;;;45985:4180:0:o;39569:2665::-;39771:7;39791:16;39818:18;39909:9;39962:30;;:::i;:::-;41630:23;39839:7;39818:28;;39921:1;39909:13;;39904:2165;39928:5;:12;39924:1;:16;39904:2165;;;39995:5;40001:1;39995:8;;;;;;;;;;;;;;;;;;39962:41;;40056:8;:31;;;40052:862;;;40302:6;;;;;:51;;-1:-1:-1;40312:12:0;;40348:4;;40312:5;;-1:-1:-1;;40318:5:0;;;40312:12;;;;;;;;;;;;;;:24;;;-1:-1:-1;;;;;40312:41:0;;40302:51;:89;;;;-1:-1:-1;40370:20:0;;;;;-1:-1:-1;;;;;40358:33:0;;;;;:11;:33;;;;;;40357:34;40302:89;40298:182;;;40414:66;40427:8;:20;;;40449:8;:18;;;40469:10;40414:12;:66::i;:::-;40052:862;;;40700:8;:15;;;-1:-1:-1;;;;;40664:52:0;:8;:20;;;-1:-1:-1;;;;;40664:52:0;;;40660:254;;;40829:69;40845:8;:20;;;40867:8;:18;;;40887:10;40829:15;:69::i;:::-;40969:8;:31;;;40968:32;40964:552;;;41047:18;;41074:20;;;;;41096;;;;41030:102;;;;;-1:-1:-1;;;;;41030:102:0;;;;;;;;;;;;;;;;;;;;41130:1;41030:102;;;;;;:43;;;;;:102;;;;;;;;;;;;;;;41047:18;41030:43;:102;;;5:2:-1;;;;30:1;27;20:12;5:2;41030:102:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;41030:102:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;41030:102:0;;-1:-1:-1;40964:552:0;;;41168:20;;;;;-1:-1:-1;;;;;41156:33:0;;;;;:11;:33;;;;;;41152:364;;;41219:18;;41263:20;;;;;41285;;;;41331;;;;41219:133;;;;;-1:-1:-1;;;;;41219:133:0;;;;;;;;;;;;;;;;;;;;41319:10;41219:133;;;;;;;;;;;;:26;;;;;41252:9;;41219:133;;;;;;;;;;;;;;41252:9;41219:26;:133;;;5:2:-1;;;;30:1;27;20:12;5:2;41219:133:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;41219:133:0;;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;41152:364:0;41400:18;;41427:20;;;;;41449;;;;41495;;;;41400:116;;;;;-1:-1:-1;;;;;41400:116:0;;;;;;;;;;;;;;;;;;;;41483:10;41400:116;;;;;;;;;;;;:26;;;;;:116;;;;;;;;;;;;;;;:18;:26;:116;;;5:2:-1;;;;30:1;27;20:12;5:2;41400:116:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;41400:116:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;41400:116:0;;-1:-1:-1;41152:364:0;41581:8;:28;;;41577:318;;;41656:57;24908:7;41656:27;:8;41669:13;41656:27;:12;:27;:::i;:57::-;41630:83;;41740:8;:20;;;-1:-1:-1;;;;;41740:29:0;;41770:17;41789:15;41740:65;;;;;-1:-1:-1;;;41740:65:0;;;;;;;-1:-1:-1;;;;;41740:65:0;-1:-1:-1;;;;;41740:65:0;;;;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;41740:65:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;41740:65:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;41740:65:0;41732:101;;;;;;;-1:-1:-1;;;;;41732:101:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;41864:15;41852:27;;;;41577:318;41966:8;:20;;;-1:-1:-1;;;;;41916:105:0;41944:8;:20;;;-1:-1:-1;;;;;41916:105:0;41927:8;:15;;;-1:-1:-1;;;;;41916:105:0;;41988:10;42000:8;42010:10;41916:105;;;;;;;;;;;;;;-1:-1:-1;;;;;41916:105:0;-1:-1:-1;;;;;41916:105:0;;;;;;;;;;;;;;;;;42049:8;;-1:-1:-1;39942:3:0;;;;;39904:2165;;;42153:22;;;;42145:53;;;;;-1:-1:-1;;;;;42145:53:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;42218:8:0;;39569:2665;-1:-1:-1;;;;;;;;;39569:2665:0:o;44599:869::-;44708:30;;:::i;:::-;44917:23;44741:5;44762:1;44747:5;:12;:16;44741:23;;;;;;;;;;;;;;;;;;;44846:20;;;;44741:23;;-1:-1:-1;;;;;;44846:37:0;44878:4;44846:37;44842:63;;44898:7;;44842:63;-1:-1:-1;44943:20:0;;;;-1:-1:-1;;;;;45009:24:0;;;;;;:11;:24;;;;;;;;45005:456;;;45134:31;;;;45133:32;45126:40;;;;45283:11;-1:-1:-1;;;;;45271:35:0;;45307:12;45321:7;45271:58;;;;;-1:-1:-1;;;45271:58:0;;;;;;;-1:-1:-1;;;;;45271:58:0;-1:-1:-1;;;;;45271:58:0;;;;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;45005:456:0;45401:48;45414:11;45427:12;45441:7;45401:12;:48::i;50631:339::-;50749:32;;;;;;50766:4;50749:32;;;;-1:-1:-1;;;;;50749:32:0;;;;;;;;;50729:17;;50749:16;;;;;:32;;;;;;;;;;;;;;50729:17;50749:16;:32;;;5:2:-1;;;;30:1;27;20:12;5:2;50749:32:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;50749:32:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;50749:32:0;;-1:-1:-1;50796:18:0;;;50792:171;;;50847:1;50835:9;:13;50831:68;;;50867:32;50879:6;50887:8;50897:1;50867:11;:32::i;:::-;50914:37;50926:6;50934:8;50944:6;50914:11;:37::i;:::-;50631:339;;;;:::o;18195:793::-;18271:21;;:::i;:::-;:36;;;;;;;;;18304:1;18271:36;;;;;18788:2;18738:3;18642:5;18636:12;18544:2;18537:5;18533:14;18488:1;18432:6;18382:3;18359:476;18859:7;18852:15;18849:2;;;18897:1;18894;18887:12;18849:2;-1:-1:-1;18945:6:0;;:11;;18937:43;;;;;-1:-1:-1;;;;;18937:43:0;;;;;;;;;;;;;;;;;;;;;;;;;;;53404:807;53482:4;53499:12;53522:21;;:::i;:::-;53202:28;;;;;;;;;;;;;;;;22:32:-1;6:49;;53574:54:0;;;;;;49:4:-1;25:18;;;61:17;;-1:-1;;;;;182:15;-1:-1;;;;;;53574:54:0;;;179:29:-1;;;;160:49;;53955:11:0;;53202:28;;49:4:-1;;54056:3:0;;53798:10;53705:4;53676:475;53665:486;;54181:7;:22;;;;-1:-1:-1;54192:6:0;;:11;;54181:22;54174:29;;53404:807;;;;;;;:::o;51054:441::-;51138:7;51158:20;51229:9;51282:27;51181:10;-1:-1:-1;;;;;51181:30:0;;:32;;;;;-1:-1:-1;;;51181:32:0;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;51181:32:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;51181:32:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;51181:32:0;51158:55;;;-1:-1:-1;51241:1:0;;-1:-1:-1;51224:225:0;51248:12;51244:1;:16;51224:225;;;51312:10;-1:-1:-1;;;;;51312:26:0;;51339:1;51312:29;;;;;-1:-1:-1;;;51312:29:0;;;;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;51312:29:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;51312:29:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;51312:29:0;-1:-1:-1;;;;;51360:32:0;;;;;;:11;51312:29;51360:32;;;;;51312:29;;-1:-1:-1;51360:32:0;;51356:81;;;51418:19;51411:26;;;;51356:81;51262:3;;;;;51224:225;;;-1:-1:-1;24969:42:0;;51054:441;-1:-1:-1;;;;51054:441:0:o;17639:205::-;16102:50;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;17764:71:0;;;;;;;;;;;;;;;;;;;;;;26:21:-1;;;22:32;;;6:49;;17764:71:0;;;;;;;25:18:-1;;61:17;;-1:-1;;;;;182:15;-1:-1;;;;;;17764:71:0;;;179:29:-1;;;;160:49;;;17748:88:0;;17756:6;;17748:7;:88::i;16517:182::-;15894:37;;;;;;;;;;;;;;;;-1:-1:-1;;;;;16627:63:0;;;;;;;;;;;;;;;26:21:-1;;;22:32;;;6:49;;16627:63:0;;;;;;;;25:18:-1;;61:17;;-1:-1;;;;;182:15;-1:-1;;;;;;16627:63:0;;;179:29:-1;;;;160:49;;;16611:80:0;;16619:6;;16611:7;:80::i;24652:32764::-;;;;;;;;;;;;;;;105:10:-1;24652:32764:0;88:34:-1;-1:-1;24652:32764:0;;;-1:-1:-1;;24652:32764:0:o;:::-;;;;;;;;;-1:-1:-1;24652:32764:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;29:2:-1;21:6;17:15;117:4;105:10;97:6;88:34;-1:-1;24652:32764:0;;;-1:-1:-1;;24652:32764:0:o

Swarm Source

bzzr://4c6d6f7ef1fe9e0170d19e339c72b77e0e50abade5d2e911ba59ffce0be46622

Block Transaction Difficulty Gas Used Reward
View All Blocks Produced

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

Validator Index Block Amount
View All Withdrawals

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

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