Contract 0x65bF64Ff5f51272f729BDcD7AcFB00677ced86Cd 9

 

Contract Overview

Kyber: Contract
Balance:
0.034780366243332101 Ether

EtherValue:
$43.92 (@ $1,262.77/ETH)

Token:
 
Txn Hash
Method
Block
From
To
Value
0xff8d62cc83527f860a5d0a5b6041e1d3f8db13664c56d505a786a00c74835845Transfer138042202021-12-14 15:52:42356 days 16 hrs ago0x517ed7f999806c767fccf0f31dbf54dfe010977b IN  Kyber: Contract0.00115997 Ether0.00174772 77.52171715
0x19c6182da3f458a07c052dfcf77ae00c5ee2e7de974903a0194982b74ee18a02Transfer108379682020-09-11 2:55:41816 days 5 hrs ago0xfb8caa905a2e87ef0790df090d90765f83eafd5a IN  Kyber: Contract0 Ether0.00318749131
0xb185f821c7b8b0fcb65102e10ebf84fb968c6d9b365d1d45baf2a3784b57ac2aList Pair For Re...103866612020-07-03 13:19:37885 days 19 hrs ago0x8180a5ca4e3b94045e05a9313777955f7518d757 IN  Kyber: Contract0 Ether0.0072825454
0x2d759f29579e9978ae9cf8a36487283f925ac8c1d9c076a21288b2c216267feeList Pair For Re...103596862020-06-29 8:25:58889 days 23 hrs ago0x8180a5ca4e3b94045e05a9313777955f7518d757 IN  Kyber: Contract0 Ether0.0013547133
0x7f2c41744df90edcf75f6bbac4b59aea9a957d98877988fdd039ba85116f06baList Pair For Re...103596752020-06-29 8:23:13890 days 1 min ago0x8180a5ca4e3b94045e05a9313777955f7518d757 IN  Kyber: Contract0 Ether0.0013408533
0x98c505832774ca0c5fd361bd4e2d6c82258591f953af81f60d2005f39bdf75d1List Pair For Re...103596672020-06-29 8:21:29890 days 3 mins ago0x8180a5ca4e3b94045e05a9313777955f7518d757 IN  Kyber: Contract0 Ether0.0013661633
0xfcf8573bc1c2a4e77fae935f0c4bc9e2ade0edf3d5c0c957a96762283b9f24caList Pair For Re...103596482020-06-29 8:17:28890 days 7 mins ago0x8180a5ca4e3b94045e05a9313777955f7518d757 IN  Kyber: Contract0 Ether0.0013496333
0xa4e27d150c12fe8687121c5b52762a5754831be6380fa790acf5c339ee15ef49List Pair For Re...103126112020-06-22 1:20:19897 days 7 hrs ago0x8180a5ca4e3b94045e05a9313777955f7518d757 IN  Kyber: Contract0 Ether0.0023323518
0x6c81e377dfef19b006b26eff3b6d93e4f38aecaa9008e56c39d8d1b66568db0cList Pair For Re...103125142020-06-22 1:02:07897 days 7 hrs ago0x8180a5ca4e3b94045e05a9313777955f7518d757 IN  Kyber: Contract0 Ether0.0008340717.2
0xa51a8c5a30b863f1c7e0e92ff199ea475bd4fd6b6c0f0b7195f50d353686f056List Pair For Re...103124552020-06-22 0:50:18897 days 7 hrs ago0x8180a5ca4e3b94045e05a9313777955f7518d757 IN  Kyber: Contract0 Ether0.0008872617.2
0x6ccacd468798d636f139f38a242a86e221d25092bd9714819ced24de2c6cc5edList Pair For Re...102829242020-06-17 11:15:36901 days 21 hrs ago0x8180a5ca4e3b94045e05a9313777955f7518d757 IN  Kyber: Contract0 Ether0.0015563638
0x667d9901a2d7227fb78701c40149b4202b4333f560a107d0114bca686cd328b8List Pair For Re...102309462020-06-09 10:26:53909 days 21 hrs ago0x8180a5ca4e3b94045e05a9313777955f7518d757 IN  Kyber: Contract0 Ether0.001378834
0x06fedb6545831345e68e61eb8ef8422a87f2fd713502caf0b72ac940a0fbc10aList Pair For Re...102309462020-06-09 10:26:53909 days 21 hrs ago0x8180a5ca4e3b94045e05a9313777955f7518d757 IN  Kyber: Contract0 Ether0.0013915134
0x3f4c0c1378af40206a8f253d03d8e6baf44d1f2fa2228b5a2f6ef211b8374d59List Pair For Re...102309412020-06-09 10:25:12909 days 21 hrs ago0x8180a5ca4e3b94045e05a9313777955f7518d757 IN  Kyber: Contract0 Ether0.0013940334
0xd7c97ca4002aeabdf3c712fbf284b805af9bf7336e2f597251fac62c83b817acList Pair For Re...102309372020-06-09 10:24:46909 days 21 hrs ago0x8180a5ca4e3b94045e05a9313777955f7518d757 IN  Kyber: Contract0 Ether0.0013777434
0x96240481198db59796d283c098775fc3d98db7403b88d464249be2920a62c5f0List Pair For Re...102309302020-06-09 10:23:50909 days 22 hrs ago0x8180a5ca4e3b94045e05a9313777955f7518d757 IN  Kyber: Contract0 Ether0.0014346535
0xddc24fa38d5c83b0117a618122edeac1a65cd45011e6d2336f2c75a3c0f43a14Transfer101759612020-05-31 21:17:01918 days 11 hrs ago0xeb8ce653bf9bac09c347e7c0aaeb2dbca22a2bc4 IN  Kyber: Contract0 Ether0.0003832617
0xf517978cb9bdec1487826032e641d657f79f43fa5b4604062e8b7c9ba87dc80fList Pair For Re...99600712020-04-28 9:10:55951 days 23 hrs ago0x8180a5ca4e3b94045e05a9313777955f7518d757 IN  Kyber: Contract0 Ether0.0005088111
0x759d1af65dc922a2a4056c66ec16374dc2c4d579b9632984188ef706f3dae694List Pair For Re...99600682020-04-28 9:10:14951 days 23 hrs ago0x8180a5ca4e3b94045e05a9313777955f7518d757 IN  Kyber: Contract0 Ether0.0004947911
0x297135edb50ea1a57f6c355a8917f10234131566b32f52c3286c58aa7620a3c5List Pair For Re...99600672020-04-28 9:09:52951 days 23 hrs ago0x8180a5ca4e3b94045e05a9313777955f7518d757 IN  Kyber: Contract0 Ether0.000445711
0x648c648fbe6253315fb26bdfe65bc454d33fcfd2913a1bc9927e8858e096c7caList Pair For Re...99600662020-04-28 9:09:43951 days 23 hrs ago0x8180a5ca4e3b94045e05a9313777955f7518d757 IN  Kyber: Contract0 Ether0.0004514111
0xe7bf991e523d83688df4b822f0ad3b7ca8d91bcbbbac74496be332ca23b20df4List Pair For Re...99600472020-04-28 9:06:49951 days 23 hrs ago0x8180a5ca4e3b94045e05a9313777955f7518d757 IN  Kyber: Contract0 Ether0.0004053410
0xc38cb536ce16af7ff79d7169c0ccd7f781d14b9edb6249bf5bf7d3042e2b4617List Pair For Re...99600312020-04-28 9:03:42951 days 23 hrs ago0x8180a5ca4e3b94045e05a9313777955f7518d757 IN  Kyber: Contract0 Ether0.0004052110
0x1d09d3337c05e78b60aa6534c79ff26ae51e44abb8d5e28ca63849650e02a14fList Pair For Re...99463692020-04-26 5:55:53954 days 2 hrs ago0x8180a5ca4e3b94045e05a9313777955f7518d757 IN  Kyber: Contract0 Ether0.00098648
0x6d7712ad8507d00170ddc14d934b413d17cfc236391405b0dcd8a272f06461bdList Pair For Re...99463672020-04-26 5:55:34954 days 2 hrs ago0x8180a5ca4e3b94045e05a9313777955f7518d757 IN  Kyber: Contract0 Ether0.001340068
[ Download CSV Export 
Latest 25 internal transaction
Parent Txn Hash Block From To Value
0x00f6f52e7560be68a5b793fc9c122238e15270581df3ef5402f75cc214362bba104106042020-07-07 6:17:36882 days 2 hrs ago Kyber: Contract0xc640caba272414689b21ebcd60d97b912359504d3.08774066 Ether
0x00f6f52e7560be68a5b793fc9c122238e15270581df3ef5402f75cc214362bba104106042020-07-07 6:17:36882 days 2 hrs ago Kyber: Reserve BAND Kyber: Contract3.08774066 Ether
0x8a2a618454319f8b76a96296d5e510bb18782987e700f84f80819f1ab0143008104106012020-07-07 6:17:15882 days 2 hrs ago Kyber: Contract Kyber: Reserve Uniswap1.50187894 Ether
0x8a2a618454319f8b76a96296d5e510bb18782987e700f84f80819f1ab0143008104106012020-07-07 6:17:15882 days 2 hrs ago Kyber: Reserve MFG Kyber: Contract1.50187894 Ether
0x03794033265146b65f04cb23b44d21ebb828a2ac5688420833c8dd66aa2b13f4104105992020-07-07 6:16:41882 days 2 hrs ago Kyber: Contract Kyber: Reserve 20.1 Ether
0x03794033265146b65f04cb23b44d21ebb828a2ac5688420833c8dd66aa2b13f4104105992020-07-07 6:16:41882 days 2 hrs ago Kyber: Proxy Kyber: Contract0.1 Ether
0x01f870f0c7573f3bbc02d8b8ab1af3a197ca91035735bef4d6c407fa03e68f3a104105982020-07-07 6:16:35882 days 2 hrs ago Kyber: Contract Kyber: Reserve0.62754245 Ether
0x01f870f0c7573f3bbc02d8b8ab1af3a197ca91035735bef4d6c407fa03e68f3a104105982020-07-07 6:16:35882 days 2 hrs ago Kyber: Proxy Kyber: Contract0.62754245 Ether
0x48a45b46110c03f795f32b1a867fdc2ff955c3e497bda6b3291efd21e5a6f9b6104105982020-07-07 6:16:35882 days 2 hrs ago Kyber: Contract Kyber: Reserve BAND3 Ether
0x48a45b46110c03f795f32b1a867fdc2ff955c3e497bda6b3291efd21e5a6f9b6104105982020-07-07 6:16:35882 days 2 hrs ago Kyber: Proxy Kyber: Contract3 Ether
0xe3a80317be920dcdcdfa9cec885177721a8f4c5b63e1a432509091b71a75bc89104105972020-07-07 6:16:27882 days 2 hrs ago Kyber: Contract Kyber: Reserve 20.1 Ether
0xe3a80317be920dcdcdfa9cec885177721a8f4c5b63e1a432509091b71a75bc89104105972020-07-07 6:16:27882 days 2 hrs ago Kyber: Proxy Kyber: Contract0.1 Ether
0x532f8ada25ca9fb8bd3a76383c29939af85061681e7b49bf44c2e4ee40bf163c104105952020-07-07 6:16:11882 days 2 hrs ago Kyber: Contract Kyber: Reserve0.00849119 Ether
0x532f8ada25ca9fb8bd3a76383c29939af85061681e7b49bf44c2e4ee40bf163c104105952020-07-07 6:16:11882 days 2 hrs ago Kyber: Proxy Kyber: Contract0.00849119 Ether
0xabef228dc4088e5fee67dcc15b8c952f39f619fa033624e9d3b7f0c596bab5df104105882020-07-07 6:14:49882 days 2 hrs ago Kyber: Contract Kyber: Reserve2.49625 Ether
0xabef228dc4088e5fee67dcc15b8c952f39f619fa033624e9d3b7f0c596bab5df104105882020-07-07 6:14:49882 days 2 hrs ago Kyber: Proxy Kyber: Contract2.49625 Ether
0x1502d0626a02c53c8dce4824a8f3176abda0589f471c040e711942e0e062893f104105822020-07-07 6:12:33882 days 2 hrs ago Kyber: Contract Kyber: Reserve 20.6491 Ether
0x1502d0626a02c53c8dce4824a8f3176abda0589f471c040e711942e0e062893f104105822020-07-07 6:12:33882 days 2 hrs ago Kyber: Proxy Kyber: Contract0.6491 Ether
0x6aa04ab3503cd725d4df23644eb5f5c7cad8349478784f6ec7cdc61e9cc066d9104105792020-07-07 6:11:12882 days 2 hrs ago Kyber: Contract Kyber: Reserve2.9955 Ether
0x6aa04ab3503cd725d4df23644eb5f5c7cad8349478784f6ec7cdc61e9cc066d9104105792020-07-07 6:11:12882 days 2 hrs ago Kyber: Proxy Kyber: Contract2.9955 Ether
0x88c7835ff137574089c839f2830f0f4dba91960ae946ed3cfd92765d88f4586e104105792020-07-07 6:11:12882 days 2 hrs ago Kyber: Contract0x60b2c767194902e3aea95c68cf8a50f6591558d02.55722026 Ether
0x88c7835ff137574089c839f2830f0f4dba91960ae946ed3cfd92765d88f4586e104105792020-07-07 6:11:12882 days 2 hrs ago Kyber: Reserve BAND Kyber: Contract2.55722026 Ether
0x76dfa2265d964eb55475f5b480d0b793082b3343dde44e1af7d08d878e9e1673104105772020-07-07 6:11:03882 days 2 hrs ago Kyber: Contract Kyber: Reserve BAND0.8709 Ether
0x76dfa2265d964eb55475f5b480d0b793082b3343dde44e1af7d08d878e9e1673104105772020-07-07 6:11:03882 days 2 hrs ago Kyber: Proxy Kyber: Contract0.8709 Ether
0xc36058e61bb8a9c9cf3c732d956d848e361b273dca28bf742111765f70d0edb5104105752020-07-07 6:10:50882 days 2 hrs ago Kyber: Contract Kyber: Reserve WETH0.03983299 Ether
[ Download CSV Export 
Loading

Similar Match Source Code
Note: This contract matches the deployed ByteCode of the Source Code for Contract 0xafbf0d08269a7eee8d587121f3b0616c8cef5077

Contract Name:
KyberNetwork

Compiler Version
v0.4.18+commit.9cf6e910

Optimization Enabled:
Yes with 200 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity Multiple files format)

File 4 of 12: KyberNetwork.sol
pragma solidity 0.4.18;


import "./ERC20Interface.sol";
import "./KyberReserveInterface.sol";
import "./KyberNetworkInterface.sol";
import "./Withdrawable.sol";
import "./Utils3.sol";
import "./WhiteListInterface.sol";
import "./ExpectedRateInterface.sol";
import "./FeeBurnerInterface.sol";


/**
 * @title Helps contracts guard against reentrancy attacks.
 */
contract ReentrancyGuard {

    /// @dev counter to allow mutex lock with only one SSTORE operation
    uint256 private guardCounter = 1;

    /**
     * @dev Prevents a function from calling itself, directly or indirectly.
     * Calling one `nonReentrant` function from
     * another is not supported. Instead, you can implement a
     * `private` function doing the actual work, and an `external`
     * wrapper marked as `nonReentrant`.
     */
    modifier nonReentrant() {
        guardCounter += 1;
        uint256 localCounter = guardCounter;
        _;
        require(localCounter == guardCounter);
    }
}


////////////////////////////////////////////////////////////////////////////////////////////////////////
/// @title Kyber Network main contract
contract KyberNetwork is Withdrawable, Utils3, KyberNetworkInterface, ReentrancyGuard {

    bytes public constant PERM_HINT = "PERM";
    uint  public constant PERM_HINT_GET_RATE = 1 << 255; // for get rate. bit mask hint.

    uint public negligibleRateDiff = 10; // basic rate steps will be in 0.01%
    KyberReserveInterface[] public reserves;
    mapping(address=>ReserveType) public reserveType;
    WhiteListInterface public whiteListContract;
    ExpectedRateInterface public expectedRateContract;
    FeeBurnerInterface    public feeBurnerContract;
    address               public kyberNetworkProxyContract;
    uint                  public maxGasPriceValue = 50 * 1000 * 1000 * 1000; // 50 gwei
    bool                  public isEnabled = false; // network is enabled
    mapping(bytes32=>uint) public infoFields; // this is only a UI field for external app.

    mapping(address=>address[]) public reservesPerTokenSrc; //reserves supporting token to eth
    mapping(address=>address[]) public reservesPerTokenDest;//reserves support eth to token

    enum ReserveType {NONE, PERMISSIONED, PERMISSIONLESS}
    bytes internal constant EMPTY_HINT = "";

    function KyberNetwork(address _admin) public {
        require(_admin != address(0));
        admin = _admin;
    }

    event EtherReceival(address indexed sender, uint amount);

    /* solhint-disable no-complex-fallback */
    function() public payable {
        EtherReceival(msg.sender, msg.value);
    }
    /* solhint-enable no-complex-fallback */

    struct TradeInput {
        address trader;
        ERC20 src;
        uint srcAmount;
        ERC20 dest;
        address destAddress;
        uint maxDestAmount;
        uint minConversionRate;
        address walletId;
        bytes hint;
    }

    function tradeWithHint(
        address trader,
        ERC20 src,
        uint srcAmount,
        ERC20 dest,
        address destAddress,
        uint maxDestAmount,
        uint minConversionRate,
        address walletId,
        bytes hint
    )
        public
        nonReentrant
        payable
        returns(uint)
    {
        require(msg.sender == kyberNetworkProxyContract);
        require((hint.length == 0) || (hint.length == 4));

        TradeInput memory tradeInput;

        tradeInput.trader = trader;
        tradeInput.src = src;
        tradeInput.srcAmount = srcAmount;
        tradeInput.dest = dest;
        tradeInput.destAddress = destAddress;
        tradeInput.maxDestAmount = maxDestAmount;
        tradeInput.minConversionRate = minConversionRate;
        tradeInput.walletId = walletId;
        tradeInput.hint = hint;

        return trade(tradeInput);
    }

    event AddReserveToNetwork(KyberReserveInterface indexed reserve, bool add, bool isPermissionless);

    /// @notice can be called only by operator
    /// @dev add or deletes a reserve to/from the network.
    /// @param reserve The reserve address.
    /// @param isPermissionless is the new reserve from permissionless type.
    function addReserve(KyberReserveInterface reserve, bool isPermissionless) public onlyOperator
        returns(bool)
    {
        require(reserveType[reserve] == ReserveType.NONE);
        reserves.push(reserve);

        reserveType[reserve] = isPermissionless ? ReserveType.PERMISSIONLESS : ReserveType.PERMISSIONED;

        AddReserveToNetwork(reserve, true, isPermissionless);

        return true;
    }

    event RemoveReserveFromNetwork(KyberReserveInterface reserve);

    /// @notice can be called only by operator
    /// @dev removes a reserve from Kyber network.
    /// @param reserve The reserve address.
    /// @param index in reserve array.
    function removeReserve(KyberReserveInterface reserve, uint index) public onlyOperator
        returns(bool)
    {

        require(reserveType[reserve] != ReserveType.NONE);
        require(reserves[index] == reserve);

        reserveType[reserve] = ReserveType.NONE;
        reserves[index] = reserves[reserves.length - 1];
        reserves.length--;

        RemoveReserveFromNetwork(reserve);

        return true;
    }

    event ListReservePairs(address indexed reserve, ERC20 src, ERC20 dest, bool add);

    /// @notice can be called only by operator
    /// @dev allow or prevent a specific reserve to trade a pair of tokens
    /// @param reserve The reserve address.
    /// @param token token address
    /// @param ethToToken will it support ether to token trade
    /// @param tokenToEth will it support token to ether trade
    /// @param add If true then list this pair, otherwise unlist it.
    function listPairForReserve(address reserve, ERC20 token, bool ethToToken, bool tokenToEth, bool add)
        public
        onlyOperator
        returns(bool)
    {
        require(reserveType[reserve] != ReserveType.NONE);

        if (ethToToken) {
            listPairs(reserve, token, false, add);

            ListReservePairs(reserve, ETH_TOKEN_ADDRESS, token, add);
        }

        if (tokenToEth) {
            listPairs(reserve, token, true, add);

            if (add) {
                require(token.approve(reserve, 2**255)); // approve infinity
            } else {
                require(token.approve(reserve, 0));
            }

            ListReservePairs(reserve, token, ETH_TOKEN_ADDRESS, add);
        }

        setDecimals(token);

        return true;
    }

    event WhiteListContractSet(WhiteListInterface newContract, WhiteListInterface currentContract);

    ///@param whiteList can be empty
    function setWhiteList(WhiteListInterface whiteList) public onlyAdmin {
        WhiteListContractSet(whiteList, whiteListContract);
        whiteListContract = whiteList;
    }

    event ExpectedRateContractSet(ExpectedRateInterface newContract, ExpectedRateInterface currentContract);

    function setExpectedRate(ExpectedRateInterface expectedRate) public onlyAdmin {
        require(expectedRate != address(0));

        ExpectedRateContractSet(expectedRate, expectedRateContract);
        expectedRateContract = expectedRate;
    }

    event FeeBurnerContractSet(FeeBurnerInterface newContract, FeeBurnerInterface currentContract);

    function setFeeBurner(FeeBurnerInterface feeBurner) public onlyAdmin {
        require(feeBurner != address(0));

        FeeBurnerContractSet(feeBurner, feeBurnerContract);
        feeBurnerContract = feeBurner;
    }

    event KyberNetwrokParamsSet(uint maxGasPrice, uint negligibleRateDiff);

    function setParams(
        uint                  _maxGasPrice,
        uint                  _negligibleRateDiff
    )
        public
        onlyAdmin
    {
        require(_negligibleRateDiff <= 100 * 100); // at most 100%

        maxGasPriceValue = _maxGasPrice;
        negligibleRateDiff = _negligibleRateDiff;
        KyberNetwrokParamsSet(maxGasPriceValue, negligibleRateDiff);
    }

    event KyberNetworkSetEnable(bool isEnabled);

    function setEnable(bool _enable) public onlyAdmin {
        if (_enable) {
            require(feeBurnerContract != address(0));
            require(expectedRateContract != address(0));
            require(kyberNetworkProxyContract != address(0));
        }
        isEnabled = _enable;

        KyberNetworkSetEnable(isEnabled);
    }

    function setInfo(bytes32 field, uint value) public onlyOperator {
        infoFields[field] = value;
    }

    event KyberProxySet(address proxy, address sender);

    function setKyberProxy(address networkProxy) public onlyAdmin {
        require(networkProxy != address(0));
        kyberNetworkProxyContract = networkProxy;
        KyberProxySet(kyberNetworkProxyContract, msg.sender);
    }

    /// @dev returns number of reserves
    /// @return number of reserves
    function getNumReserves() public view returns(uint) {
        return reserves.length;
    }

    /// @notice should be called off chain
    /// @dev get an array of all reserves
    /// @return An array of all reserves
    function getReserves() public view returns(KyberReserveInterface[]) {
        return reserves;
    }

    function maxGasPrice() public view returns(uint) {
        return maxGasPriceValue;
    }

    function getExpectedRate(ERC20 src, ERC20 dest, uint srcQty)
        public view
        returns(uint expectedRate, uint slippageRate)
    {
        require(expectedRateContract != address(0));
        if (src == dest) return (0,0);
        bool includePermissionless = true;

        if (srcQty & PERM_HINT_GET_RATE > 0) {
            includePermissionless = false;
            srcQty = srcQty & ~PERM_HINT_GET_RATE;
        }

        return expectedRateContract.getExpectedRate(src, dest, srcQty, includePermissionless);
    }

    function getExpectedRateOnlyPermission(ERC20 src, ERC20 dest, uint srcQty)
        public view
        returns(uint expectedRate, uint slippageRate)
    {
        require(expectedRateContract != address(0));
        if (src == dest) return (0,0);
        return expectedRateContract.getExpectedRate(src, dest, srcQty, false);
    }

    function getUserCapInWei(address user) public view returns(uint) {
        if (whiteListContract == address(0)) return (2 ** 255);
        return whiteListContract.getUserCapInWei(user);
    }

    function getUserCapInTokenWei(address user, ERC20 token) public view returns(uint) {
        //future feature
        user;
        token;
        require(false);
    }

    struct BestRateResult {
        uint rate;
        address reserve1;
        address reserve2;
        uint weiAmount;
        uint rateSrcToEth;
        uint rateEthToDest;
        uint destAmount;
    }

    /// @notice use token address ETH_TOKEN_ADDRESS for ether
    /// @dev best conversion rate for a pair of tokens, if number of reserves have small differences. randomize
    /// @param src Src token
    /// @param dest Destination token
    /// @return obsolete - used to return best reserve index. not relevant anymore for this API.
    function findBestRate(ERC20 src, ERC20 dest, uint srcAmount) public view returns(uint obsolete, uint rate) {
        BestRateResult memory result = findBestRateTokenToToken(src, dest, srcAmount, EMPTY_HINT);
        return(0, result.rate);
    }

    function findBestRateOnlyPermission(ERC20 src, ERC20 dest, uint srcAmount)
        public
        view
        returns(uint obsolete, uint rate)
    {
        BestRateResult memory result = findBestRateTokenToToken(src, dest, srcAmount, PERM_HINT);
        return(0, result.rate);
    }

    function enabled() public view returns(bool) {
        return isEnabled;
    }

    function info(bytes32 field) public view returns(uint) {
        return infoFields[field];
    }

    /* solhint-disable code-complexity */
    // Regarding complexity. Below code follows the required algorithm for choosing a reserve.
    //  It has been tested, reviewed and found to be clear enough.
    //@dev this function always src or dest are ether. can't do token to token
    function searchBestRate(ERC20 src, ERC20 dest, uint srcAmount, bool usePermissionless)
        public
        view
        returns(address, uint)
    {
        uint bestRate = 0;
        uint bestReserve = 0;
        uint numRelevantReserves = 0;

        //return 1 for ether to ether
        if (src == dest) return (reserves[bestReserve], PRECISION);

        address[] memory reserveArr;

        reserveArr = src == ETH_TOKEN_ADDRESS ? reservesPerTokenDest[dest] : reservesPerTokenSrc[src];

        if (reserveArr.length == 0) return (reserves[bestReserve], bestRate);

        uint[] memory rates = new uint[](reserveArr.length);
        uint[] memory reserveCandidates = new uint[](reserveArr.length);

        for (uint i = 0; i < reserveArr.length; i++) {
            //list all reserves that have this token.
            if (!usePermissionless && reserveType[reserveArr[i]] == ReserveType.PERMISSIONLESS) {
                continue;
            }

            rates[i] = (KyberReserveInterface(reserveArr[i])).getConversionRate(src, dest, srcAmount, block.number);

            if (rates[i] > bestRate) {
                //best rate is highest rate
                bestRate = rates[i];
            }
        }

        if (bestRate > 0) {
            uint smallestRelevantRate = (bestRate * 10000) / (10000 + negligibleRateDiff);

            for (i = 0; i < reserveArr.length; i++) {
                if (rates[i] >= smallestRelevantRate) {
                    reserveCandidates[numRelevantReserves++] = i;
                }
            }

            if (numRelevantReserves > 1) {
                //when encountering small rate diff from bestRate. draw from relevant reserves
                bestReserve = reserveCandidates[uint(block.blockhash(block.number-1)) % numRelevantReserves];
            } else {
                bestReserve = reserveCandidates[0];
            }

            bestRate = rates[bestReserve];
        }

        return (reserveArr[bestReserve], bestRate);
    }
    /* solhint-enable code-complexity */

    function getReservesRates(ERC20 token, uint optionalAmount) public view
        returns(address[] buyReserves, uint[] buyRates, address[] sellReserves, uint[] sellRates)
    {
        uint amount = optionalAmount > 0 ? optionalAmount : 1000;
        ERC20 ETH = ETH_TOKEN_ADDRESS;

        buyReserves = reservesPerTokenDest[token];
        buyRates = new uint[](buyReserves.length);

        for (uint i = 0; i < buyReserves.length; i++) {
            buyRates[i] = (KyberReserveInterface(buyReserves[i])).getConversionRate(ETH, token, amount, block.number);
        }

        sellReserves = reservesPerTokenSrc[token];
        sellRates = new uint[](sellReserves.length);

        for (i = 0; i < sellReserves.length; i++) {
            sellRates[i] = (KyberReserveInterface(sellReserves[i])).getConversionRate(token, ETH, amount, block.number);
        }
    }

    function findBestRateTokenToToken(ERC20 src, ERC20 dest, uint srcAmount, bytes hint) internal view
        returns(BestRateResult result)
    {
        //by default we use permission less reserves
        bool usePermissionless = true;

        // if hint in first 4 bytes == 'PERM' only permissioned reserves will be used.
        if ((hint.length >= 4) && (keccak256(hint[0], hint[1], hint[2], hint[3]) == keccak256(PERM_HINT))) {
            usePermissionless = false;
        }

        uint srcDecimals = getDecimals(src);
        uint destDecimals = getDecimals(dest);

        (result.reserve1, result.rateSrcToEth) =
            searchBestRate(src, ETH_TOKEN_ADDRESS, srcAmount, usePermissionless);

        result.weiAmount = calcDestAmountWithDecimals(srcDecimals, ETH_DECIMALS, srcAmount, result.rateSrcToEth);
        //if weiAmount is zero, return zero rate to avoid revert in ETH -> token call
        if (result.weiAmount == 0) {
            result.rate = 0;
            return;
        }
        
        (result.reserve2, result.rateEthToDest) =
            searchBestRate(ETH_TOKEN_ADDRESS, dest, result.weiAmount, usePermissionless);

        result.destAmount = calcDestAmountWithDecimals(ETH_DECIMALS, destDecimals, result.weiAmount, result.rateEthToDest);

        result.rate = calcRateFromQty(srcAmount, result.destAmount, srcDecimals, destDecimals);
    }

    function listPairs(address reserve, ERC20 token, bool isTokenToEth, bool add) internal {
        uint i;
        address[] storage reserveArr = reservesPerTokenDest[token];

        if (isTokenToEth) {
            reserveArr = reservesPerTokenSrc[token];
        }

        for (i = 0; i < reserveArr.length; i++) {
            if (reserve == reserveArr[i]) {
                if (add) {
                    break; //already added
                } else {
                    //remove
                    reserveArr[i] = reserveArr[reserveArr.length - 1];
                    reserveArr.length--;
                    break;
                }
            }
        }

        if (add && i == reserveArr.length) {
            //if reserve wasn't found add it
            reserveArr.push(reserve);
        }
    }

    event KyberTrade(address indexed trader, ERC20 src, ERC20 dest, uint srcAmount, uint dstAmount,
        address destAddress, uint ethWeiValue, address reserve1, address reserve2, bytes hint);

    /* solhint-disable function-max-lines */
    //  Most of the lines here are functions calls spread over multiple lines. We find this function readable enough
    /// @notice use token address ETH_TOKEN_ADDRESS for ether
    /// @dev trade api for kyber network.
    /// @param tradeInput structure of trade inputs
    function trade(TradeInput tradeInput) internal returns(uint) {
        require(isEnabled);
        require(tx.gasprice <= maxGasPriceValue);
        require(validateTradeInput(tradeInput.src, tradeInput.srcAmount, tradeInput.dest, tradeInput.destAddress));

        BestRateResult memory rateResult =
            findBestRateTokenToToken(tradeInput.src, tradeInput.dest, tradeInput.srcAmount, tradeInput.hint);

        require(rateResult.rate > 0);
        require(rateResult.rate < MAX_RATE);
        require(rateResult.rate >= tradeInput.minConversionRate);

        uint actualDestAmount;
        uint weiAmount;
        uint actualSrcAmount;

        (actualSrcAmount, weiAmount, actualDestAmount) = calcActualAmounts(tradeInput.src,
            tradeInput.dest,
            tradeInput.srcAmount,
            tradeInput.maxDestAmount,
            rateResult);

        require(getUserCapInWei(tradeInput.trader) >= weiAmount);
        require(handleChange(tradeInput.src, tradeInput.srcAmount, actualSrcAmount, tradeInput.trader));

        require(doReserveTrade(     //src to ETH
                tradeInput.src,
                actualSrcAmount,
                ETH_TOKEN_ADDRESS,
                this,
                weiAmount,
                KyberReserveInterface(rateResult.reserve1),
                rateResult.rateSrcToEth,
                true));

        require(doReserveTrade(     //Eth to dest
                ETH_TOKEN_ADDRESS,
                weiAmount,
                tradeInput.dest,
                tradeInput.destAddress,
                actualDestAmount,
                KyberReserveInterface(rateResult.reserve2),
                rateResult.rateEthToDest,
                true));

        if (tradeInput.src != ETH_TOKEN_ADDRESS) //"fake" trade. (ether to ether) - don't burn.
            require(feeBurnerContract.handleFees(weiAmount, rateResult.reserve1, tradeInput.walletId));
        if (tradeInput.dest != ETH_TOKEN_ADDRESS) //"fake" trade. (ether to ether) - don't burn.
            require(feeBurnerContract.handleFees(weiAmount, rateResult.reserve2, tradeInput.walletId));

        KyberTrade({
            trader: tradeInput.trader,
            src: tradeInput.src,
            dest: tradeInput.dest,
            srcAmount: actualSrcAmount,
            dstAmount: actualDestAmount,
            destAddress: tradeInput.destAddress,
            ethWeiValue: weiAmount,
            reserve1: (tradeInput.src == ETH_TOKEN_ADDRESS) ? address(0) : rateResult.reserve1,
            reserve2:  (tradeInput.dest == ETH_TOKEN_ADDRESS) ? address(0) : rateResult.reserve2,
            hint: tradeInput.hint
        });

        return actualDestAmount;
    }
    /* solhint-enable function-max-lines */

    function calcActualAmounts (ERC20 src, ERC20 dest, uint srcAmount, uint maxDestAmount, BestRateResult rateResult)
        internal view returns(uint actualSrcAmount, uint weiAmount, uint actualDestAmount)
    {
        if (rateResult.destAmount > maxDestAmount) {
            actualDestAmount = maxDestAmount;
            weiAmount = calcSrcAmount(ETH_TOKEN_ADDRESS, dest, actualDestAmount, rateResult.rateEthToDest);
            actualSrcAmount = calcSrcAmount(src, ETH_TOKEN_ADDRESS, weiAmount, rateResult.rateSrcToEth);
            require(actualSrcAmount <= srcAmount);
        } else {
            actualDestAmount = rateResult.destAmount;
            actualSrcAmount = srcAmount;
            weiAmount = rateResult.weiAmount;
        }
    }

    /// @notice use token address ETH_TOKEN_ADDRESS for ether
    /// @dev do one trade with a reserve
    /// @param src Src token
    /// @param amount amount of src tokens
    /// @param dest   Destination token
    /// @param destAddress Address to send tokens to
    /// @param reserve Reserve to use
    /// @param validate If true, additional validations are applicable
    /// @return true if trade is successful
    function doReserveTrade(
        ERC20 src,
        uint amount,
        ERC20 dest,
        address destAddress,
        uint expectedDestAmount,
        KyberReserveInterface reserve,
        uint conversionRate,
        bool validate
    )
        internal
        returns(bool)
    {
        uint callValue = 0;

        if (src == dest) {
            //this is for a "fake" trade when both src and dest are ethers.
            if (destAddress != (address(this)))
                destAddress.transfer(amount);
            return true;
        }

        if (src == ETH_TOKEN_ADDRESS) {
            callValue = amount;
        }

        // reserve sends tokens/eth to network. network sends it to destination
        require(reserve.trade.value(callValue)(src, amount, dest, this, conversionRate, validate));

        if (destAddress != address(this)) {
            //for token to token dest address is network. and Ether / token already here...
            if (dest == ETH_TOKEN_ADDRESS) {
                destAddress.transfer(expectedDestAmount);
            } else {
                require(dest.transfer(destAddress, expectedDestAmount));
            }
        }

        return true;
    }

    /// when user sets max dest amount we could have too many source tokens == change. so we send it back to user.
    function handleChange (ERC20 src, uint srcAmount, uint requiredSrcAmount, address trader) internal returns (bool) {

        if (requiredSrcAmount < srcAmount) {
            //if there is "change" send back to trader
            if (src == ETH_TOKEN_ADDRESS) {
                trader.transfer(srcAmount - requiredSrcAmount);
            } else {
                require(src.transfer(trader, (srcAmount - requiredSrcAmount)));
            }
        }

        return true;
    }

    /// @notice use token address ETH_TOKEN_ADDRESS for ether
    /// @dev checks that user sent ether/tokens to contract before trade
    /// @param src Src token
    /// @param srcAmount amount of src tokens
    /// @return true if tradeInput is valid
    function validateTradeInput(ERC20 src, uint srcAmount, ERC20 dest, address destAddress)
        internal
        view
        returns(bool)
    {
        require(srcAmount <= MAX_QTY);
        require(srcAmount != 0);
        require(destAddress != address(0));
        require(src != dest);

        if (src == ETH_TOKEN_ADDRESS) {
            require(msg.value == srcAmount);
        } else {
            require(msg.value == 0);
            //funds should have been moved to this contract already.
            require(src.balanceOf(this) >= srcAmount);
        }

        return true;
    }
}

File 1 of 12: ERC20Interface.sol
pragma solidity 0.4.18;


// https://github.com/ethereum/EIPs/issues/20
interface ERC20 {
    function totalSupply() public view returns (uint supply);
    function balanceOf(address _owner) public view returns (uint balance);
    function transfer(address _to, uint _value) public returns (bool success);
    function transferFrom(address _from, address _to, uint _value) public returns (bool success);
    function approve(address _spender, uint _value) public returns (bool success);
    function allowance(address _owner, address _spender) public view returns (uint remaining);
    function decimals() public view returns(uint digits);
    event Approval(address indexed _owner, address indexed _spender, uint _value);
}

File 2 of 12: ExpectedRateInterface.sol
pragma solidity 0.4.18;


import "./ERC20Interface.sol";


interface ExpectedRateInterface {
    function getExpectedRate(ERC20 src, ERC20 dest, uint srcQty, bool usePermissionless) public view
        returns (uint expectedRate, uint slippageRate);
}

File 3 of 12: FeeBurnerInterface.sol
pragma solidity 0.4.18;


interface FeeBurnerInterface {
    function handleFees (uint tradeWeiAmount, address reserve, address wallet) public returns(bool);
    function setReserveData(address reserve, uint feesInBps, address kncWallet) public;
}

File 5 of 12: KyberNetworkInterface.sol
pragma solidity 0.4.18;


import "./ERC20Interface.sol";


/// @title Kyber Network interface
interface KyberNetworkInterface {
    function maxGasPrice() public view returns(uint);
    function getUserCapInWei(address user) public view returns(uint);
    function getUserCapInTokenWei(address user, ERC20 token) public view returns(uint);
    function enabled() public view returns(bool);
    function info(bytes32 id) public view returns(uint);

    function getExpectedRate(ERC20 src, ERC20 dest, uint srcQty) public view
        returns (uint expectedRate, uint slippageRate);

    function tradeWithHint(address trader, ERC20 src, uint srcAmount, ERC20 dest, address destAddress,
        uint maxDestAmount, uint minConversionRate, address walletId, bytes hint) public payable returns(uint);
}

File 6 of 12: KyberReserveInterface.sol
pragma solidity 0.4.18;


import "./ERC20Interface.sol";

/// @title Kyber Reserve contract
interface KyberReserveInterface {

    function trade(
        ERC20 srcToken,
        uint srcAmount,
        ERC20 destToken,
        address destAddress,
        uint conversionRate,
        bool validate
    )
        public
        payable
        returns(bool);

    function getConversionRate(ERC20 src, ERC20 dest, uint srcQty, uint blockNumber) public view returns(uint);
}

File 7 of 12: PermissionGroups.sol
pragma solidity 0.4.18;


contract PermissionGroups {

    address public admin;
    address public pendingAdmin;
    mapping(address=>bool) internal operators;
    mapping(address=>bool) internal alerters;
    address[] internal operatorsGroup;
    address[] internal alertersGroup;
    uint constant internal MAX_GROUP_SIZE = 50;

    function PermissionGroups() public {
        admin = msg.sender;
    }

    modifier onlyAdmin() {
        require(msg.sender == admin);
        _;
    }

    modifier onlyOperator() {
        require(operators[msg.sender]);
        _;
    }

    modifier onlyAlerter() {
        require(alerters[msg.sender]);
        _;
    }

    function getOperators () external view returns(address[]) {
        return operatorsGroup;
    }

    function getAlerters () external view returns(address[]) {
        return alertersGroup;
    }

    event TransferAdminPending(address pendingAdmin);

    /**
     * @dev Allows the current admin to set the pendingAdmin address.
     * @param newAdmin The address to transfer ownership to.
     */
    function transferAdmin(address newAdmin) public onlyAdmin {
        require(newAdmin != address(0));
        TransferAdminPending(pendingAdmin);
        pendingAdmin = newAdmin;
    }

    /**
     * @dev Allows the current admin to set the admin in one tx. Useful initial deployment.
     * @param newAdmin The address to transfer ownership to.
     */
    function transferAdminQuickly(address newAdmin) public onlyAdmin {
        require(newAdmin != address(0));
        TransferAdminPending(newAdmin);
        AdminClaimed(newAdmin, admin);
        admin = newAdmin;
    }

    event AdminClaimed( address newAdmin, address previousAdmin);

    /**
     * @dev Allows the pendingAdmin address to finalize the change admin process.
     */
    function claimAdmin() public {
        require(pendingAdmin == msg.sender);
        AdminClaimed(pendingAdmin, admin);
        admin = pendingAdmin;
        pendingAdmin = address(0);
    }

    event AlerterAdded (address newAlerter, bool isAdd);

    function addAlerter(address newAlerter) public onlyAdmin {
        require(!alerters[newAlerter]); // prevent duplicates.
        require(alertersGroup.length < MAX_GROUP_SIZE);

        AlerterAdded(newAlerter, true);
        alerters[newAlerter] = true;
        alertersGroup.push(newAlerter);
    }

    function removeAlerter (address alerter) public onlyAdmin {
        require(alerters[alerter]);
        alerters[alerter] = false;

        for (uint i = 0; i < alertersGroup.length; ++i) {
            if (alertersGroup[i] == alerter) {
                alertersGroup[i] = alertersGroup[alertersGroup.length - 1];
                alertersGroup.length--;
                AlerterAdded(alerter, false);
                break;
            }
        }
    }

    event OperatorAdded(address newOperator, bool isAdd);

    function addOperator(address newOperator) public onlyAdmin {
        require(!operators[newOperator]); // prevent duplicates.
        require(operatorsGroup.length < MAX_GROUP_SIZE);

        OperatorAdded(newOperator, true);
        operators[newOperator] = true;
        operatorsGroup.push(newOperator);
    }

    function removeOperator (address operator) public onlyAdmin {
        require(operators[operator]);
        operators[operator] = false;

        for (uint i = 0; i < operatorsGroup.length; ++i) {
            if (operatorsGroup[i] == operator) {
                operatorsGroup[i] = operatorsGroup[operatorsGroup.length - 1];
                operatorsGroup.length -= 1;
                OperatorAdded(operator, false);
                break;
            }
        }
    }
}

File 8 of 12: Utils.sol
pragma solidity 0.4.18;


import "./ERC20Interface.sol";


/// @title Kyber constants contract
contract Utils {

    ERC20 constant internal ETH_TOKEN_ADDRESS = ERC20(0x00eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee);
    uint  constant internal PRECISION = (10**18);
    uint  constant internal MAX_QTY   = (10**28); // 10B tokens
    uint  constant internal MAX_RATE  = (PRECISION * 10**6); // up to 1M tokens per ETH
    uint  constant internal MAX_DECIMALS = 18;
    uint  constant internal ETH_DECIMALS = 18;
    mapping(address=>uint) internal decimals;

    function setDecimals(ERC20 token) internal {
        if (token == ETH_TOKEN_ADDRESS) decimals[token] = ETH_DECIMALS;
        else decimals[token] = token.decimals();
    }

    function getDecimals(ERC20 token) internal view returns(uint) {
        if (token == ETH_TOKEN_ADDRESS) return ETH_DECIMALS; // save storage access
        uint tokenDecimals = decimals[token];
        // technically, there might be token with decimals 0
        // moreover, very possible that old tokens have decimals 0
        // these tokens will just have higher gas fees.
        if(tokenDecimals == 0) return token.decimals();

        return tokenDecimals;
    }

    function calcDstQty(uint srcQty, uint srcDecimals, uint dstDecimals, uint rate) internal pure returns(uint) {
        require(srcQty <= MAX_QTY);
        require(rate <= MAX_RATE);

        if (dstDecimals >= srcDecimals) {
            require((dstDecimals - srcDecimals) <= MAX_DECIMALS);
            return (srcQty * rate * (10**(dstDecimals - srcDecimals))) / PRECISION;
        } else {
            require((srcDecimals - dstDecimals) <= MAX_DECIMALS);
            return (srcQty * rate) / (PRECISION * (10**(srcDecimals - dstDecimals)));
        }
    }

    function calcSrcQty(uint dstQty, uint srcDecimals, uint dstDecimals, uint rate) internal pure returns(uint) {
        require(dstQty <= MAX_QTY);
        require(rate <= MAX_RATE);
        
        //source quantity is rounded up. to avoid dest quantity being too low.
        uint numerator;
        uint denominator;
        if (srcDecimals >= dstDecimals) {
            require((srcDecimals - dstDecimals) <= MAX_DECIMALS);
            numerator = (PRECISION * dstQty * (10**(srcDecimals - dstDecimals)));
            denominator = rate;
        } else {
            require((dstDecimals - srcDecimals) <= MAX_DECIMALS);
            numerator = (PRECISION * dstQty);
            denominator = (rate * (10**(dstDecimals - srcDecimals)));
        }
        return (numerator + denominator - 1) / denominator; //avoid rounding down errors
    }
}

File 9 of 12: Utils2.sol
pragma solidity 0.4.18;


import "./Utils.sol";


contract Utils2 is Utils {

    /// @dev get the balance of a user.
    /// @param token The token type
    /// @return The balance
    function getBalance(ERC20 token, address user) public view returns(uint) {
        if (token == ETH_TOKEN_ADDRESS)
            return user.balance;
        else
            return token.balanceOf(user);
    }

    function getDecimalsSafe(ERC20 token) internal returns(uint) {

        if (decimals[token] == 0) {
            setDecimals(token);
        }

        return decimals[token];
    }

    function calcDestAmount(ERC20 src, ERC20 dest, uint srcAmount, uint rate) internal view returns(uint) {
        return calcDstQty(srcAmount, getDecimals(src), getDecimals(dest), rate);
    }

    function calcSrcAmount(ERC20 src, ERC20 dest, uint destAmount, uint rate) internal view returns(uint) {
        return calcSrcQty(destAmount, getDecimals(src), getDecimals(dest), rate);
    }

    function calcRateFromQty(uint srcAmount, uint destAmount, uint srcDecimals, uint dstDecimals)
        internal pure returns(uint)
    {
        require(srcAmount <= MAX_QTY);
        require(destAmount <= MAX_QTY);

        if (dstDecimals >= srcDecimals) {
            require((dstDecimals - srcDecimals) <= MAX_DECIMALS);
            return (destAmount * PRECISION / ((10 ** (dstDecimals - srcDecimals)) * srcAmount));
        } else {
            require((srcDecimals - dstDecimals) <= MAX_DECIMALS);
            return (destAmount * PRECISION * (10 ** (srcDecimals - dstDecimals)) / srcAmount);
        }
    }
}

File 10 of 12: Utils3.sol
pragma solidity 0.4.18;


import "./Utils2.sol";


contract Utils3 is Utils2 {

    function calcDestAmountWithDecimals(uint srcDecimals, uint destDecimals, uint srcAmount, uint rate) internal pure returns(uint) {
        return calcDstQty(srcAmount, srcDecimals, destDecimals, rate);
    }

}

File 11 of 12: WhiteListInterface.sol
pragma solidity 0.4.18;


contract WhiteListInterface {
    function getUserCapInWei(address user) external view returns (uint userCapWei);
}

File 12 of 12: Withdrawable.sol
pragma solidity 0.4.18;


import "./ERC20Interface.sol";
import "./PermissionGroups.sol";


/**
 * @title Contracts that should be able to recover tokens or ethers
 * @author Ilan Doron
 * @dev This allows to recover any tokens or Ethers received in a contract.
 * This will prevent any accidental loss of tokens.
 */
contract Withdrawable is PermissionGroups {

    event TokenWithdraw(ERC20 token, uint amount, address sendTo);

    /**
     * @dev Withdraw all ERC20 compatible tokens
     * @param token ERC20 The address of the token contract
     */
    function withdrawToken(ERC20 token, uint amount, address sendTo) external onlyAdmin {
        require(token.transfer(sendTo, amount));
        TokenWithdraw(token, amount, sendTo);
    }

    event EtherWithdraw(uint amount, address sendTo);

    /**
     * @dev Withdraw Ethers
     */
    function withdrawEther(uint amount, address sendTo) external onlyAdmin {
        sendTo.transfer(amount);
        EtherWithdraw(amount, sendTo);
    }
}

Contract Security Audit

Contract ABI

[{"constant":false,"inputs":[{"name":"alerter","type":"address"}],"name":"removeAlerter","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"trader","type":"address"},{"name":"src","type":"address"},{"name":"srcAmount","type":"uint256"},{"name":"dest","type":"address"},{"name":"destAddress","type":"address"},{"name":"maxDestAmount","type":"uint256"},{"name":"minConversionRate","type":"uint256"},{"name":"walletId","type":"address"},{"name":"hint","type":"bytes"}],"name":"tradeWithHint","outputs":[{"name":"","type":"uint256"}],"payable":true,"stateMutability":"payable","type":"function"},{"constant":true,"inputs":[],"name":"getReserves","outputs":[{"name":"","type":"address[]"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"src","type":"address"},{"name":"dest","type":"address"},{"name":"srcAmount","type":"uint256"},{"name":"usePermissionless","type":"bool"}],"name":"searchBestRate","outputs":[{"name":"","type":"address"},{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"","type":"bytes32"}],"name":"infoFields","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"feeBurner","type":"address"}],"name":"setFeeBurner","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"name":"src","type":"address"},{"name":"dest","type":"address"},{"name":"srcAmount","type":"uint256"}],"name":"findBestRateOnlyPermission","outputs":[{"name":"obsolete","type":"uint256"},{"name":"rate","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"enabled","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"reserve","type":"address"},{"name":"index","type":"uint256"}],"name":"removeReserve","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"pendingAdmin","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"getOperators","outputs":[{"name":"","type":"address[]"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"","type":"address"},{"name":"","type":"uint256"}],"name":"reservesPerTokenSrc","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"whiteList","type":"address"}],"name":"setWhiteList","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"token","type":"address"},{"name":"amount","type":"uint256"},{"name":"sendTo","type":"address"}],"name":"withdrawToken","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"maxGasPrice","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"newAlerter","type":"address"}],"name":"addAlerter","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"negligibleRateDiff","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"feeBurnerContract","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"expectedRate","type":"address"}],"name":"setExpectedRate","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"expectedRateContract","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"whiteListContract","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"field","type":"bytes32"},{"name":"value","type":"uint256"}],"name":"setInfo","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"name":"user","type":"address"}],"name":"getUserCapInWei","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"isEnabled","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"","type":"address"}],"name":"reserveType","outputs":[{"name":"","type":"uint8"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"newAdmin","type":"address"}],"name":"transferAdmin","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"_enable","type":"bool"}],"name":"setEnable","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[],"name":"claimAdmin","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"kyberNetworkProxyContract","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"newAdmin","type":"address"}],"name":"transferAdminQuickly","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"getAlerters","outputs":[{"name":"","type":"address[]"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"src","type":"address"},{"name":"dest","type":"address"},{"name":"srcQty","type":"uint256"}],"name":"getExpectedRate","outputs":[{"name":"expectedRate","type":"uint256"},{"name":"slippageRate","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"","type":"uint256"}],"name":"reserves","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"src","type":"address"},{"name":"dest","type":"address"},{"name":"srcQty","type":"uint256"}],"name":"getExpectedRateOnlyPermission","outputs":[{"name":"expectedRate","type":"uint256"},{"name":"slippageRate","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"PERM_HINT","outputs":[{"name":"","type":"bytes"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"user","type":"address"},{"name":"token","type":"address"}],"name":"getUserCapInTokenWei","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"","type":"address"},{"name":"","type":"uint256"}],"name":"reservesPerTokenDest","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"newOperator","type":"address"}],"name":"addOperator","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"reserve","type":"address"},{"name":"isPermissionless","type":"bool"}],"name":"addReserve","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"operator","type":"address"}],"name":"removeOperator","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"maxGasPriceValue","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"field","type":"bytes32"}],"name":"info","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"src","type":"address"},{"name":"dest","type":"address"},{"name":"srcAmount","type":"uint256"}],"name":"findBestRate","outputs":[{"name":"obsolete","type":"uint256"},{"name":"rate","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_maxGasPrice","type":"uint256"},{"name":"_negligibleRateDiff","type":"uint256"}],"name":"setParams","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"PERM_HINT_GET_RATE","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"networkProxy","type":"address"}],"name":"setKyberProxy","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"amount","type":"uint256"},{"name":"sendTo","type":"address"}],"name":"withdrawEther","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"getNumReserves","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"token","type":"address"},{"name":"user","type":"address"}],"name":"getBalance","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"reserve","type":"address"},{"name":"token","type":"address"},{"name":"ethToToken","type":"bool"},{"name":"tokenToEth","type":"bool"},{"name":"add","type":"bool"}],"name":"listPairForReserve","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"name":"token","type":"address"},{"name":"optionalAmount","type":"uint256"}],"name":"getReservesRates","outputs":[{"name":"buyReserves","type":"address[]"},{"name":"buyRates","type":"uint256[]"},{"name":"sellReserves","type":"address[]"},{"name":"sellRates","type":"uint256[]"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"admin","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"inputs":[{"name":"_admin","type":"address"}],"payable":false,"stateMutability":"nonpayable","type":"constructor"},{"payable":true,"stateMutability":"payable","type":"fallback"},{"anonymous":false,"inputs":[{"indexed":true,"name":"sender","type":"address"},{"indexed":false,"name":"amount","type":"uint256"}],"name":"EtherReceival","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"reserve","type":"address"},{"indexed":false,"name":"add","type":"bool"},{"indexed":false,"name":"isPermissionless","type":"bool"}],"name":"AddReserveToNetwork","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"name":"reserve","type":"address"}],"name":"RemoveReserveFromNetwork","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"reserve","type":"address"},{"indexed":false,"name":"src","type":"address"},{"indexed":false,"name":"dest","type":"address"},{"indexed":false,"name":"add","type":"bool"}],"name":"ListReservePairs","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"name":"newContract","type":"address"},{"indexed":false,"name":"currentContract","type":"address"}],"name":"WhiteListContractSet","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"name":"newContract","type":"address"},{"indexed":false,"name":"currentContract","type":"address"}],"name":"ExpectedRateContractSet","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"name":"newContract","type":"address"},{"indexed":false,"name":"currentContract","type":"address"}],"name":"FeeBurnerContractSet","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"name":"maxGasPrice","type":"uint256"},{"indexed":false,"name":"negligibleRateDiff","type":"uint256"}],"name":"KyberNetwrokParamsSet","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"name":"isEnabled","type":"bool"}],"name":"KyberNetworkSetEnable","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"name":"proxy","type":"address"},{"indexed":false,"name":"sender","type":"address"}],"name":"KyberProxySet","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"trader","type":"address"},{"indexed":false,"name":"src","type":"address"},{"indexed":false,"name":"dest","type":"address"},{"indexed":false,"name":"srcAmount","type":"uint256"},{"indexed":false,"name":"dstAmount","type":"uint256"},{"indexed":false,"name":"destAddress","type":"address"},{"indexed":false,"name":"ethWeiValue","type":"uint256"},{"indexed":false,"name":"reserve1","type":"address"},{"indexed":false,"name":"reserve2","type":"address"},{"indexed":false,"name":"hint","type":"bytes"}],"name":"KyberTrade","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"name":"token","type":"address"},{"indexed":false,"name":"amount","type":"uint256"},{"indexed":false,"name":"sendTo","type":"address"}],"name":"TokenWithdraw","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"name":"amount","type":"uint256"},{"indexed":false,"name":"sendTo","type":"address"}],"name":"EtherWithdraw","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"name":"pendingAdmin","type":"address"}],"name":"TransferAdminPending","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"name":"newAdmin","type":"address"},{"indexed":false,"name":"previousAdmin","type":"address"}],"name":"AdminClaimed","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"name":"newAlerter","type":"address"},{"indexed":false,"name":"isAdd","type":"bool"}],"name":"AlerterAdded","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"name":"newOperator","type":"address"},{"indexed":false,"name":"isAdd","type":"bool"}],"name":"OperatorAdded","type":"event"}]

60606040526001600755600a600855640ba43b7400600f556010805460ff19169055341561002c57600080fd5b604051602080613d108339810160405280805160008054600160a060020a03191633600160a060020a039081169190911790915590925082161515905061007257600080fd5b60008054600160a060020a03909216600160a060020a0319909216919091179055613c6e806100a26000396000f3006060604052600436106102585763ffffffff60e060020a60003504166301a12fd38114610297578063088322ef146102b85780630902f1ac146103485780630c235d96146103ae5780631610b59b146103fd5780631a79464e146104135780631dc1f78d14610432578063238dafe014610472578063249715b31461049957806326782247146104bb57806327a099d8146104ea5780632ab8fc2d146104fd57806339e899ee1461051f5780633ccdbb281461053e5780633de39c1114610567578063408ee7fe1461057a5780634cef5a5c14610599578063579425b7146105ac5780635d270cdc146105bf5780635dada964146105de5780635ed5ea28146105f15780635f65d703146106045780636432679f1461061d5780636aa633b61461063c578063749f95bf1461064f57806375829def146106925780637726bed3146106b157806377f50f97146106c9578063785250da146106dc5780637acc8678146106ef5780637c423f541461070e578063809a9e55146107215780638334278d1461074957806385dc0c561461075f5780638b98a2c5146107875780638eaaeecf14610811578063937e909b146108365780639870d7fe14610858578063a0d7bb1b14610877578063ac8a584a1461089b578063b2d111f6146108ba578063b64a097e146108cd578063b8388aca146108e3578063c0324c771461090b578063c0919ac614610924578063c6c3f3f914610937578063ce56c45414610956578063cfff25bb14610978578063d4fac45d1461098b578063e02584bf146109b0578063f7d7a428146109e4578063f851a44014610b29575b33600160a060020a03167f75f33ed68675112c77094e7c5b073890598be1d23e27cd7f6907b4a7d98ac6193460405190815260200160405180910390a2005b34156102a257600080fd5b6102b6600160a060020a0360043516610b3c565b005b610336600160a060020a0360048035821691602480358216926044359260643581169260843582169260a4359260c4359260e4359091169190610124906101043590810190830135806020601f82018190048102016040519081016040528181529291906020840183838082843750949650610cac95505050505050565b60405190815260200160405180910390f35b341561035357600080fd5b61035b610d67565b60405160208082528190810183818151815260200191508051906020019060200280838360005b8381101561039a578082015183820152602001610382565b505050509050019250505060405180910390f35b34156103b957600080fd5b6103db600160a060020a03600435811690602435166044356064351515610dd0565b604051600160a060020a03909216825260208201526040908101905180910390f35b341561040857600080fd5b6103366004356111e0565b341561041e57600080fd5b6102b6600160a060020a03600435166111f2565b341561043d57600080fd5b61045a600160a060020a0360043581169060243516604435611297565b60405191825260208201526040908101905180910390f35b341561047d57600080fd5b6104856112f6565b604051901515815260200160405180910390f35b34156104a457600080fd5b610485600160a060020a03600435166024356112ff565b34156104c657600080fd5b6104ce61146c565b604051600160a060020a03909116815260200160405180910390f35b34156104f557600080fd5b61035b61147b565b341561050857600080fd5b6104ce600160a060020a03600435166024356114e1565b341561052a57600080fd5b6102b6600160a060020a0360043516611518565b341561054957600080fd5b6102b6600160a060020a0360043581169060243590604435166115a8565b341561057257600080fd5b61033661169f565b341561058557600080fd5b6102b6600160a060020a03600435166116a5565b34156105a457600080fd5b6103366117a1565b34156105b757600080fd5b6104ce6117a7565b34156105ca57600080fd5b6102b6600160a060020a03600435166117b6565b34156105e957600080fd5b6104ce61185b565b34156105fc57600080fd5b6104ce61186a565b341561060f57600080fd5b6102b6600435602435611879565b341561062857600080fd5b610336600160a060020a03600435166118b2565b341561064757600080fd5b61048561194d565b341561065a57600080fd5b61066e600160a060020a0360043516611956565b6040518082600281111561067e57fe5b60ff16815260200191505060405180910390f35b341561069d57600080fd5b6102b6600160a060020a036004351661196b565b34156106bc57600080fd5b6102b66004351515611a06565b34156106d457600080fd5b6102b6611ab7565b34156106e757600080fd5b6104ce611b51565b34156106fa57600080fd5b6102b6600160a060020a0360043516611b60565b341561071957600080fd5b61035b611c42565b341561072c57600080fd5b61045a600160a060020a0360043581169060243516604435611ca8565b341561075457600080fd5b6104ce600435611dc7565b341561076a57600080fd5b61045a600160a060020a0360043581169060243516604435611def565b341561079257600080fd5b61079a611ecf565b60405160208082528190810183818151815260200191508051906020019080838360005b838110156107d65780820151838201526020016107be565b50505050905090810190601f1680156108035780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b341561081c57600080fd5b610336600160a060020a0360043581169060243516611f06565b341561084157600080fd5b6104ce600160a060020a0360043516602435611f0c565b341561086357600080fd5b6102b6600160a060020a0360043516611f27565b341561088257600080fd5b610485600160a060020a03600435166024351515611ff7565b34156108a657600080fd5b6102b6600160a060020a0360043516612118565b34156108c557600080fd5b610336612284565b34156108d857600080fd5b61033660043561228a565b34156108ee57600080fd5b61045a600160a060020a036004358116906024351660443561229c565b341561091657600080fd5b6102b66004356024356122c1565b341561092f57600080fd5b610336612333565b341561094257600080fd5b6102b6600160a060020a036004351661233b565b341561096157600080fd5b6102b6600435600160a060020a03602435166123d6565b341561098357600080fd5b610336612469565b341561099657600080fd5b610336600160a060020a036004358116906024351661246f565b34156109bb57600080fd5b610485600160a060020a036004358116906024351660443515156064351515608435151561251a565b34156109ef57600080fd5b610a06600160a060020a036004351660243561279f565b6040518080602001806020018060200180602001858103855289818151815260200191508051906020019060200280838360005b83811015610a52578082015183820152602001610a3a565b50505050905001858103845288818151815260200191508051906020019060200280838360005b83811015610a91578082015183820152602001610a79565b50505050905001858103835287818151815260200191508051906020019060200280838360005b83811015610ad0578082015183820152602001610ab8565b50505050905001858103825286818151815260200191508051906020019060200280838360005b83811015610b0f578082015183820152602001610af7565b505050509050019850505050505050505060405180910390f35b3415610b3457600080fd5b6104ce612ad0565b6000805433600160a060020a03908116911614610b5857600080fd5b600160a060020a03821660009081526003602052604090205460ff161515610b7f57600080fd5b50600160a060020a0381166000908152600360205260408120805460ff191690555b600554811015610ca85781600160a060020a0316600582815481101515610bc457fe5b600091825260209091200154600160a060020a03161415610ca057600580546000198101908110610bf157fe5b60009182526020909120015460058054600160a060020a039092169183908110610c1757fe5b60009182526020909120018054600160a060020a031916600160a060020a03929092169190911790556005805490610c53906000198301613b26565b507f5611bf3e417d124f97bf2c788843ea8bb502b66079fbee02158ef30b172cb762826000604051600160a060020a039092168252151560208201526040908101905180910390a1610ca8565b600101610ba1565b5050565b6000610cb6613b4f565b6007805460010190819055600e5433600160a060020a03908116911614610cdc57600080fd5b83511580610ceb575083516004145b1515610cf657600080fd5b600160a060020a03808d1683528b81166020840152604083018b90528981166060840152888116608084015260a0830188905260c08301879052851660e08301526101008201849052610d4882612adf565b92506007548114610d5857600080fd5b50509998505050505050505050565b610d6f613ba2565b6009805480602002602001604051908101604052809291908181526020018280548015610dc557602002820191906000526020600020905b8154600160a060020a03168152600190910190602001808311610da7575b505050505090505b90565b6000806000806000610de0613ba2565b610de8613ba2565b610df0613ba2565b6000806000975060009650600095508c600160a060020a03168e600160a060020a03161415610e4e576009805488908110610e2757fe5b600091825260209091200154600160a060020a03169950670de0b6b3a764000098506111cf565b600160a060020a038e16600080516020613c2383398151915214610e8957600160a060020a038e166000908152601260205260409020610ea2565b600160a060020a038d1660009081526013602052604090205b805480602002602001604051908101604052809291908181526020018280548015610ef657602002820191906000526020600020905b8154600160a060020a03168152600190910190602001808311610ed8575b5050505050945084511515610f34576009805488908110610f1357fe5b600091825260209091200154600160a060020a0316995096975087966111cf565b8451604051805910610f435750595b908082528060200260200182016040525093508451604051805910610f655750595b90808252806020026020018201604052509250600091505b84518210156110d6578a158015610fd557506002600a6000878581518110610fa157fe5b90602001906020020151600160a060020a0316815260208101919091526040016000205460ff166002811115610fd357fe5b145b15610fdf576110cb565b848281518110610feb57fe5b90602001906020020151600160a060020a0316637cd442728f8f8f4360006040516020015260405160e060020a63ffffffff8716028152600160a060020a03948516600482015292909316602483015260448201526064810191909152608401602060405180830381600087803b151561106457600080fd5b6102c65a03f1151561107557600080fd5b5050506040518051905084838151811061108b57fe5b60209081029091010152878483815181106110a257fe5b9060200190602002015111156110cb578382815181106110be57fe5b9060200190602002015197505b600190910190610f7d565b60008811156111b3576008546127100188612710028115156110f457fe5b049050600091505b845182101561114a578084838151811061111257fe5b906020019060200201511061113f578183878060010198508151811061113457fe5b602090810290910101525b6001909101906110fc565b600186111561118057828660001943014081151561116457fe5b068151811061116f57fe5b90602001906020020151965061119a565b8260008151811061118d57fe5b9060200190602002015196505b8387815181106111a657fe5b9060200190602002015197505b8487815181106111bf57fe5b9060200190602002015188995099505b505050505050505094509492505050565b60116020526000908152604090205481565b60005433600160a060020a0390811691161461120d57600080fd5b600160a060020a038116151561122257600080fd5b600d547f91251c8b04e3ed4b921776c3aced2ad433c3701257fc5666cb35239ec4df5411908290600160a060020a0316604051600160a060020a039283168152911660208201526040908101905180910390a1600d8054600160a060020a031916600160a060020a0392909216919091179055565b6000806112a2613bb4565b6112e186868660408051908101604052600481527f5045524d000000000000000000000000000000000000000000000000000000006020820152612f41565b90506000815190935091505b50935093915050565b60105460ff1690565b600160a060020a03331660009081526002602052604081205460ff16151561132657600080fd5b600160a060020a0383166000908152600a602052604081205460ff16600281111561134d57fe5b141561135857600080fd5b82600160a060020a031660098381548110151561137157fe5b600091825260209091200154600160a060020a03161461139057600080fd5b600160a060020a0383166000908152600a60205260409020805460ff191690556009805460001981019081106113c257fe5b60009182526020909120015460098054600160a060020a0390921691849081106113e857fe5b60009182526020909120018054600160a060020a031916600160a060020a03929092169190911790556009805490611424906000198301613b26565b507f861f07ab6bad95b71c362ed240dc0082c3d9bbfe75e7830be646ef0d61da311783604051600160a060020a03909116815260200160405180910390a15060015b92915050565b600154600160a060020a031681565b611483613ba2565b6004805480602002602001604051908101604052809291908181526020018280548015610dc557602002820191906000526020600020908154600160a060020a03168152600190910190602001808311610da7575050505050905090565b6012602052816000526040600020818154811015156114fc57fe5b600091825260209091200154600160a060020a03169150829050565b60005433600160a060020a0390811691161461153357600080fd5b600b547f1eae61fde1a37f65af69f00b4269aa5fda423f684194d303865cba6c650b2366908290600160a060020a0316604051600160a060020a039283168152911660208201526040908101905180910390a1600b8054600160a060020a031916600160a060020a0392909216919091179055565b60005433600160a060020a039081169116146115c357600080fd5b82600160a060020a031663a9059cbb828460006040516020015260405160e060020a63ffffffff8516028152600160a060020a0390921660048301526024820152604401602060405180830381600087803b151561162057600080fd5b6102c65a03f1151561163157600080fd5b50505060405180519050151561164657600080fd5b7f72cb8a894ddb372ceec3d2a7648d86f17d5a15caae0e986c53109b8a9a9385e6838383604051600160a060020a03938416815260208101929092529091166040808301919091526060909101905180910390a1505050565b600f5490565b60005433600160a060020a039081169116146116c057600080fd5b600160a060020a03811660009081526003602052604090205460ff16156116e657600080fd5b600554603290106116f657600080fd5b7f5611bf3e417d124f97bf2c788843ea8bb502b66079fbee02158ef30b172cb762816001604051600160a060020a039092168252151560208201526040908101905180910390a1600160a060020a0381166000908152600360205260409020805460ff1916600190811790915560058054909181016117758382613b26565b5060009182526020909120018054600160a060020a031916600160a060020a0392909216919091179055565b60085481565b600d54600160a060020a031681565b60005433600160a060020a039081169116146117d157600080fd5b600160a060020a03811615156117e657600080fd5b600c547fa2446ac1a8b17e6d40c1cafcbf076b945fdc5f897c970e6e19915760def475ad908290600160a060020a0316604051600160a060020a039283168152911660208201526040908101905180910390a1600c8054600160a060020a031916600160a060020a0392909216919091179055565b600c54600160a060020a031681565b600b54600160a060020a031681565b600160a060020a03331660009081526002602052604090205460ff1615156118a057600080fd5b60009182526011602052604090912055565b600b54600090600160a060020a031615156118d2575060ff60020a611948565b600b54600160a060020a0316636432679f8360006040516020015260405160e060020a63ffffffff8416028152600160a060020a039091166004820152602401602060405180830381600087803b151561192b57600080fd5b6102c65a03f1151561193c57600080fd5b50505060405180519150505b919050565b60105460ff1681565b600a6020526000908152604090205460ff1681565b60005433600160a060020a0390811691161461198657600080fd5b600160a060020a038116151561199b57600080fd5b6001547f3b81caf78fa51ecbc8acb482fd7012a277b428d9b80f9d156e8a54107496cc4090600160a060020a0316604051600160a060020a03909116815260200160405180910390a160018054600160a060020a031916600160a060020a0392909216919091179055565b60005433600160a060020a03908116911614611a2157600080fd5b8015611a6c57600d54600160a060020a03161515611a3e57600080fd5b600c54600160a060020a03161515611a5557600080fd5b600e54600160a060020a03161515611a6c57600080fd5b6010805460ff191682151517908190557f8a846a525e22497042ee2f99423a8ff8bbb831d3ae5384692bf6040f591c1eba9060ff16604051901515815260200160405180910390a150565b60015433600160a060020a03908116911614611ad257600080fd5b6001546000547f65da1cfc2c2e81576ad96afb24a581f8e109b7a403b35cbd3243a1c99efdb9ed91600160a060020a039081169116604051600160a060020a039283168152911660208201526040908101905180910390a16001805460008054600160a060020a0319908116600160a060020a03841617909155169055565b600e54600160a060020a031681565b60005433600160a060020a03908116911614611b7b57600080fd5b600160a060020a0381161515611b9057600080fd5b7f3b81caf78fa51ecbc8acb482fd7012a277b428d9b80f9d156e8a54107496cc4081604051600160a060020a03909116815260200160405180910390a16000547f65da1cfc2c2e81576ad96afb24a581f8e109b7a403b35cbd3243a1c99efdb9ed908290600160a060020a0316604051600160a060020a039283168152911660208201526040908101905180910390a160008054600160a060020a031916600160a060020a0392909216919091179055565b611c4a613ba2565b6005805480602002602001604051908101604052809291908181526020018280548015610dc557602002820191906000526020600020908154600160a060020a03168152600190910190602001808311610da7575050505050905090565b600c5460009081908190600160a060020a03161515611cc657600080fd5b84600160a060020a031686600160a060020a03161415611cec57600092508291506112ed565b506001600060ff60020a85161115611d2857507f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff929092169160005b600c54600160a060020a031663d38d2bea8787878560006040516040015260405160e060020a63ffffffff8716028152600160a060020a039485166004820152929093166024830152604482015290151560648201526084016040805180830381600087803b1515611d9957600080fd5b6102c65a03f11515611daa57600080fd5b505050604051805190602001805190509250925050935093915050565b6009805482908110611dd557fe5b600091825260209091200154600160a060020a0316905081565b600c546000908190600160a060020a03161515611e0b57600080fd5b83600160a060020a031685600160a060020a03161415611e3057506000905080611ec7565b600c54600160a060020a031663d38d2bea8686866000806040516040015260405160e060020a63ffffffff8716028152600160a060020a039485166004820152929093166024830152604482015290151560648201526084016040805180830381600087803b1515611ea157600080fd5b6102c65a03f11515611eb257600080fd5b50505060405180519060200180519050915091505b935093915050565b60408051908101604052600481527f5045524d00000000000000000000000000000000000000000000000000000000602082015281565b60008080fd5b6013602052816000526040600020818154811015156114fc57fe5b60005433600160a060020a03908116911614611f4257600080fd5b600160a060020a03811660009081526002602052604090205460ff1615611f6857600080fd5b60045460329010611f7857600080fd5b7f091a7a4b85135fdd7e8dbc18b12fabe5cc191ea867aa3c2e1a24a102af61d58b816001604051600160a060020a039092168252151560208201526040908101905180910390a1600160a060020a0381166000908152600260205260409020805460ff1916600190811790915560048054909181016117758382613b26565b600160a060020a03331660009081526002602052604081205460ff16151561201e57600080fd5b600160a060020a0383166000908152600a602052604081205460ff16600281111561204557fe5b1461204f57600080fd5b60098054600181016120618382613b26565b5060009182526020909120018054600160a060020a031916600160a060020a03851617905581612092576001612095565b60025b600160a060020a0384166000908152600a60205260409020805460ff191660018360028111156120c157fe5b021790555082600160a060020a03167f4d99ce7cd99dfb1a7692e50c2e9b8d84c1b420f1d439ca8c4de0171acac119076001846040519115158252151560208201526040908101905180910390a250600192915050565b6000805433600160a060020a0390811691161461213457600080fd5b600160a060020a03821660009081526002602052604090205460ff16151561215b57600080fd5b50600160a060020a0381166000908152600260205260408120805460ff191690555b600454811015610ca85781600160a060020a03166004828154811015156121a057fe5b600091825260209091200154600160a060020a0316141561227c576004805460001981019081106121cd57fe5b60009182526020909120015460048054600160a060020a0390921691839081106121f357fe5b60009182526020909120018054600160a060020a031916600160a060020a039290921691909117905560048054600019019061222f9082613b26565b507f091a7a4b85135fdd7e8dbc18b12fabe5cc191ea867aa3c2e1a24a102af61d58b826000604051600160a060020a039092168252151560208201526040908101905180910390a1610ca8565b60010161217d565b600f5481565b60009081526011602052604090205490565b6000806122a7613bb4565b6112e1868686602060405190810160405260008152612f41565b60005433600160a060020a039081169116146122dc57600080fd5b6127108111156122eb57600080fd5b600f82905560088190557fc1bdc2503431144078ba3cb975f03be0f6c1d365cf490875e7534b4ca70c863e828260405191825260208201526040908101905180910390a15050565b60ff60020a81565b60005433600160a060020a0390811691161461235657600080fd5b600160a060020a038116151561236b57600080fd5b600e8054600160a060020a031916600160a060020a0383811691909117918290557ffdd305502f7797ff3390aa08825f7f6aec92c27a94e103bfaf45452b4cf1d4f4911633604051600160a060020a039283168152911660208201526040908101905180910390a150565b60005433600160a060020a039081169116146123f157600080fd5b600160a060020a03811682156108fc0283604051600060405180830381858888f19350505050151561242257600080fd5b7fec47e7ed86c86774d1a72c19f35c639911393fe7c1a34031fdbd260890da90de8282604051918252600160a060020a031660208201526040908101905180910390a15050565b60095490565b6000600160a060020a038316600080516020613c2383398151915214156124a15750600160a060020a03811631611466565b82600160a060020a03166370a082318360006040516020015260405160e060020a63ffffffff8416028152600160a060020a039091166004820152602401602060405180830381600087803b15156124f857600080fd5b6102c65a03f1151561250957600080fd5b505050604051805190509050611466565b600160a060020a03331660009081526002602052604081205460ff16151561254157600080fd5b600160a060020a0386166000908152600a602052604081205460ff16600281111561256857fe5b141561257357600080fd5b83156125f4576125868686600085613198565b85600160a060020a03167fadb5a4f14d89b3a5ffb3900ac1ea4574d991f93887f6199fabaf25393644e01c600080516020613c238339815191528785604051600160a060020a0393841681529190921660208201529015156040808301919091526060909101905180910390a25b821561278a576126078686600185613198565b81156126995784600160a060020a031663095ea7b38760ff60020a60006040516020015260405160e060020a63ffffffff8516028152600160a060020a0390921660048301526024820152604401602060405180830381600087803b151561266e57600080fd5b6102c65a03f1151561267f57600080fd5b50505060405180519050151561269457600080fd5b61271c565b84600160a060020a031663095ea7b3876000806040516020015260405160e060020a63ffffffff8516028152600160a060020a0390921660048301526024820152604401602060405180830381600087803b15156126f657600080fd5b6102c65a03f1151561270757600080fd5b50505060405180519050151561271c57600080fd5b85600160a060020a03167fadb5a4f14d89b3a5ffb3900ac1ea4574d991f93887f6199fabaf25393644e01c86600080516020613c2383398151915285604051600160a060020a0393841681529190921660208201529015156040808301919091526060909101905180910390a25b612793856132ea565b50600195945050505050565b6127a7613ba2565b6127af613ba2565b6127b7613ba2565b6127bf613ba2565b60008060008088116127d3576103e86127d5565b875b9250600080516020613c238339815191529150601360008a600160a060020a0316600160a060020a0316815260200190815260200160002080548060200260200160405190810160405280929190818152602001828054801561286157602002820191906000526020600020905b8154600160a060020a03168152600190910190602001808311612843575b5050505050965086516040518059106128775750595b90808252806020026020018201604052509550600090505b8651811015612956578681815181106128a457fe5b90602001906020020151600160a060020a0316637cd44272838b864360006040516020015260405160e060020a63ffffffff8716028152600160a060020a03948516600482015292909316602483015260448201526064810191909152608401602060405180830381600087803b151561291d57600080fd5b6102c65a03f1151561292e57600080fd5b5050506040518051905086828151811061294457fe5b6020908102909101015260010161288f565b601260008a600160a060020a0316600160a060020a031681526020019081526020016000208054806020026020016040519081016040528092919081815260200182805480156129cf57602002820191906000526020600020905b8154600160a060020a031681526001909101906020018083116129b1575b5050505050945084516040518059106129e55750595b90808252806020026020018201604052509350600090505b8451811015612ac457848181518110612a1257fe5b90602001906020020151600160a060020a0316637cd442728a84864360006040516020015260405160e060020a63ffffffff8716028152600160a060020a03948516600482015292909316602483015260448201526064810191909152608401602060405180830381600087803b1515612a8b57600080fd5b6102c65a03f11515612a9c57600080fd5b50505060405180519050848281518110612ab257fe5b602090810290910101526001016129fd565b50505092959194509250565b600054600160a060020a031681565b6000612ae9613bb4565b6010546000908190819060ff161515612b0157600080fd5b600f543a1115612b1057600080fd5b612b2c86602001518760400151886060015189608001516133a7565b1515612b3757600080fd5b612b54866020015187606001518860400151896101000151612f41565b93506000845111612b6457600080fd5b69d3c21bcecceda1000000845110612b7b57600080fd5b8560c0015184511015612b8d57600080fd5b612baa8660200151876060015188604001518960a00151886134c3565b94509250905081612bbb87516118b2565b1015612bc657600080fd5b612bdb86602001518760400151838951613545565b1515612be657600080fd5b612c11866020015182600080516020613c23833981519152308689602001518a608001516001613627565b1515612c1c57600080fd5b612c4b600080516020613c2383398151915283886060015189608001518789604001518a60a001516001613627565b1515612c5657600080fd5b600080516020613c238339815191526020870151600160a060020a031614612d0f57600d54600160a060020a031663fd062d3b8360208701518960e0015160006040516020015260405160e060020a63ffffffff86160281526004810193909352600160a060020a039182166024840152166044820152606401602060405180830381600087803b1515612ce957600080fd5b6102c65a03f11515612cfa57600080fd5b505050604051805190501515612d0f57600080fd5b600080516020613c238339815191526060870151600160a060020a031614612dc857600d54600160a060020a031663fd062d3b8360408701518960e0015160006040516020015260405160e060020a63ffffffff86160281526004810193909352600160a060020a039182166024840152166044820152606401602060405180830381600087803b1515612da257600080fd5b6102c65a03f11515612db357600080fd5b505050604051805190501515612dc857600080fd5b8551600160a060020a03167fd30ca399cb43507ecec6a629a35cf45eb98cda550c27696dcb0d8c4a3873ce6c8760200151886060015184878b6080015188600080516020613c2383398151915260208f0151600160a060020a031614612e32578b60200151612e35565b60005b600080516020613c23833981519152600160a060020a03168f60600151600160a060020a031614612e6a578c60400151612e6d565b60005b8f6101000151604051600160a060020a03808b16825289811660208301526040820189905260608201889052868116608083015260a0820186905284811660c0830152831660e0820152610120610100820181815290820183818151815260200191508051906020019080838360005b83811015612ef5578082015183820152602001612edd565b50505050905090810190601f168015612f225780820380516001836020036101000a031916815260200191505b509a505050505050505050505060405180910390a25090949350505050565b612f49613bb4565b600160008060048551101580156130b65750604080519081016040908152600482527f5045524d000000000000000000000000000000000000000000000000000000006020830152518082805190602001908083835b60208310612fbe5780518252601f199092019160209182019101612f9f565b6001836020036101000a038019825116818451161790925250505091909101925060409150505190819003902085600081518110612ff857fe5b016020015160f860020a900460f860020a028660018151811061301757fe5b016020015160f860020a900460f860020a028760028151811061303657fe5b016020015160f860020a900460f860020a028860038151811061305557fe5b016020015160f860020a900460f860020a026040517fff000000000000000000000000000000000000000000000000000000000000009485168152928416600184015290831660028301529091166003820152600401604051908190039020145b156130c057600092505b6130c988613864565b91506130d487613864565b90506130f088600080516020613c238339815191528886610dd0565b60808601908152600160a060020a039091166020860152613118908390601290899051613922565b6060850190815251151561312f576000845261318d565b61314d600080516020613c2383398151915288866060015186610dd0565b60a0860152600160a060020a0316604085015261317560128260608701518760a00151613922565b60c0850190815261318a908790518484613939565b84525b505050949350505050565b600160a060020a038316600090815260136020526040812083156131d05750600160a060020a03841660009081526012602052604090205b600091505b80548210156132985780828154811015156131ec57fe5b600091825260209091200154600160a060020a038781169116141561328d57821561321657613298565b80548190600019810190811061322857fe5b6000918252602090912001548154600160a060020a039091169082908490811061324e57fe5b60009182526020909120018054600160a060020a031916600160a060020a03929092169190911790558054613287826000198301613b26565b50613298565b6001909101906131d5565b8280156132a55750805482145b156132e25780548190600181016132bc8382613b26565b5060009182526020909120018054600160a060020a031916600160a060020a0388161790555b505050505050565b600160a060020a038116600080516020613c23833981519152141561332a57600160a060020a0381166000908152600660205260409020601290556133a4565b80600160a060020a031663313ce5676000604051602001526040518163ffffffff1660e060020a028152600401602060405180830381600087803b151561337057600080fd5b6102c65a03f1151561338157600080fd5b5050506040518051600160a060020a038316600090815260066020526040902055505b50565b60006b204fce5e3e250261100000008411156133c257600080fd5b8315156133ce57600080fd5b600160a060020a03821615156133e357600080fd5b600160a060020a0385811690841614156133fc57600080fd5b600160a060020a038516600080516020613c23833981519152141561342c5734841461342757600080fd5b6134b7565b341561343757600080fd5b8385600160a060020a03166370a082313060006040516020015260405160e060020a63ffffffff8416028152600160a060020a039091166004820152602401602060405180830381600087803b151561348f57600080fd5b6102c65a03f115156134a057600080fd5b50505060405180519050101515156134b757600080fd5b5060015b949350505050565b6000806000848460c0015111156135285750836134f4600080516020613c23833981519152888360a08801516139d4565b915061351488600080516020613c238339815191528487608001516139d4565b92508583111561352357600080fd5b61353a565b8360c001519050859250836060015191505b955095509592505050565b6000838310156134b757600160a060020a038516600080516020613c2383398151915214156135a257600160a060020a03821683850380156108fc0290604051600060405180830381858888f19350505050151561342757600080fd5b84600160a060020a031663a9059cbb8385870360006040516020015260405160e060020a63ffffffff8516028152600160a060020a0390921660048301526024820152604401602060405180830381600087803b151561360157600080fd5b6102c65a03f1151561361257600080fd5b5050506040518051905015156134b757600080fd5b600080600160a060020a038a811690891614156136935730600160a060020a031687600160a060020a031614151561368a57600160a060020a03871689156108fc028a604051600060405180830381858888f19350505050151561368a57600080fd5b60019150613857565b600160a060020a038a16600080516020613c2383398151915214156136b55750875b84600160a060020a0316636cf69811828c8c8c308a8a60006040516020015260405160e060020a63ffffffff8a16028152600160a060020a0396871660048201526024810195909552928516604485015293166064830152608482019290925290151560a482015260c4016020604051808303818588803b151561373857600080fd5b6125ee5a03f1151561374957600080fd5b5050505060405180519050151561375f57600080fd5b30600160a060020a031687600160a060020a031614151561385257600160a060020a038816600080516020613c2383398151915214156137cf57600160a060020a03871686156108fc0287604051600060405180830381858888f1935050505015156137ca57600080fd5b613852565b87600160a060020a031663a9059cbb888860006040516020015260405160e060020a63ffffffff8516028152600160a060020a0390921660048301526024820152604401602060405180830381600087803b151561382c57600080fd5b6102c65a03f1151561383d57600080fd5b50505060405180519050151561385257600080fd5b600191505b5098975050505050505050565b600080600160a060020a038316600080516020613c23833981519152141561388f576012915061391c565b50600160a060020a0382166000908152600660205260409020548015156139185782600160a060020a031663313ce5676000604051602001526040518163ffffffff1660e060020a028152600401602060405180830381600087803b15156138f657600080fd5b6102c65a03f1151561390757600080fd5b50505060405180519050915061391c565b8091505b50919050565b6000613930838686856139f2565b95945050505050565b60006b204fce5e3e2502611000000085111561395457600080fd5b6b204fce5e3e2502611000000084111561396d57600080fd5b8282106139a8576012838303111561398457600080fd5b84838303600a0a02670de0b6b3a764000085028115156139a057fe5b0490506134bb565b601282840311156139b857600080fd5b84828403600a0a670de0b6b3a76400008602028115156139a057fe5b6000613930836139e387613864565b6139ec87613864565b85613a7f565b60006b204fce5e3e25026110000000851115613a0d57600080fd5b69d3c21bcecceda1000000821115613a2457600080fd5b838310613a535760128484031115613a3b57600080fd5b670de0b6b3a7640000858302858503600a0a026139a0565b60128385031115613a6357600080fd5b828403600a0a670de0b6b3a7640000028286028115156139a057fe5b600080806b204fce5e3e25026110000000871115613a9c57600080fd5b69d3c21bcecceda1000000841115613ab357600080fd5b848610613ae45760128587031115613aca57600080fd5b5050828403600a0a8502670de0b6b3a76400000282613b0a565b60128686031115613af457600080fd5b5050670de0b6b3a76400008502848403600a0a83025b80600182840103811515613b1a57fe5b04979650505050505050565b815481835581811511613b4a57600083815260209020613b4a918101908301613c04565b505050565b6101206040519081016040908152600080835260208301819052908201819052606082018190526080820181905260a0820181905260c0820181905260e08201526101008101613b9d613ba2565b905290565b60206040519081016040526000815290565b60e060405190810160405280600081526020016000600160a060020a031681526020016000600160a060020a03168152602001600081526020016000815260200160008152602001600081525090565b610dcd91905b80821115613c1e5760008155600101613c0a565b50905600000000000000000000000000eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeea165627a7a723058200f970f05bb18f66eba80f09dd1f88bd42267981f9b6a7b666f30d306bdc040e4002900000000000000000000000064743588ccf318c144c4e8410a82f554131b2b48

Deployed ByteCode Sourcemap

1127:23145:3:-;;;;;;;;;-1:-1:-1;;;1127:23145:3;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2575:10;-1:-1:-1;;;;;2561:36:3;;2587:9;2561:36;;;;;;;;;;;;;;1127:23145;2381:451:6;;;;;;;;;;-1:-1:-1;;;;;2381:451:6;;;;;;;2908:894:3;;-1:-1:-1;;;;;2908:894:3;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;2908:894:3;;-1:-1:-1;2908:894:3;;-1:-1:-1;;;;;;2908:894:3;;;;;;;;;;;;;;;;9078:100;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23:1:-1;8:100;33:3;30:1;27:2;8:100;;;99:1;94:3;90;84:5;71:3;;;64:6;52:2;45:3;8:100;;;12:14;3:109;;;;;;;;;;;;;;;;;12083:1998:3;;;;;;;;;;-1:-1:-1;;;;;12083:1998:3;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;12083:1998:3;;;;;;;;;;;;;;;;;;;;1911:40;;;;;;;;;;;;;;7289:218;;;;;;;;;;-1:-1:-1;;;;;7289:218:3;;;;;11322:286;;;;;;;;;;-1:-1:-1;;;;;11322:286:3;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;11614:78;;;;;;;;;;;;;;;;;;;;;;;;;;;;;4803:424;;;;;;;;;;-1:-1:-1;;;;;4803:424:3;;;;;;;85:27:6;;;;;;;;;;;;;;;-1:-1:-1;;;;;85:27:6;;;;;;;;;;;;;;670:96;;;;;;;;;;;;2003:54:3;;;;;;;;;;-1:-1:-1;;;;;2003:54:3;;;;;;;6646:175;;;;;;;;;;-1:-1:-1;;;;;6646:175:3;;;;;560:186:11;;;;;;;;;;-1:-1:-1;;;;;560:186:11;;;;;;;;;;;;;9184:89:3;;;;;;;;;;;;2074:301:6;;;;;;;;;;-1:-1:-1;;;;;2074:301:6;;;;;1356:35:3;;;;;;;;;;;;1637:46;;;;;;;;;;;;6937:245;;;;;;;;;;-1:-1:-1;;;;;6937:245:3;;;;;1582:49;;;;;;;;;;;;1533:43;;;;;;;;;;;;8379:106;;;;;;;;;;;;;;;;10151:192;;;;;;;;;;-1:-1:-1;;;;;10151:192:3;;;;;1837:46;;;;;;;;;;;;1479:48;;;;;;;;;;-1:-1:-1;;;;;1479:48:3;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1074:183:6;;;;;;;;;;-1:-1:-1;;;;;1074:183:6;;;;;8038:335:3;;;;;;;;;;;;;;;;1821:189:6;;;;;;;;;;;;1689:54:3;;;;;;;;;;;;1432:218:6;;;;;;;;;;-1:-1:-1;;;;;1432:218:6;;;;;772:94;;;;;;;;;;;;9279:529:3;;;;;;;;;;-1:-1:-1;;;;;9279:529:3;;;;;;;;;;;;1434:39;;;;;;;;;;;;;;9814:331;;;;;;;;;;-1:-1:-1;;;;;9814:331:3;;;;;;;;;;;;1220:40;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23:1:-1;8:100;33:3;30:1;27:2;8:100;;;99:1;94:3;90;84:5;71:3;;;64:6;52:2;45:3;8:100;;;12:14;3:109;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;10349:168:3;;;;;;;;;;-1:-1:-1;;;;;10349:168:3;;;;;;;;;;2098:55;;;;;;;;;;-1:-1:-1;;;;;2098:55:3;;;;;;;2897:312:6;;;;;;;;;;-1:-1:-1;;;;;2897:312:6;;;;;4139:409:3;;;;;;;;;;-1:-1:-1;;;;;4139:409:3;;;;;;;;;3215:469:6;;;;;;;;;;-1:-1:-1;;;;;3215:469:6;;;;;1749:71:3;;;;;;;;;;;;11698:96;;;;;;;;;;;;;;11071:245;;;;;;;;;;-1:-1:-1;;;;;11071:245:3;;;;;;;;;;;;7590:392;;;;;;;;;;;;;;;;1266:51;;;;;;;;;;;;8548:226;;;;;;;;;;-1:-1:-1;;;;;8548:226:3;;;;;851:150:11;;;;;;;;;;;;-1:-1:-1;;;;;851:150:11;;;;;8855:91:3;;;;;;;;;;;;186:208:8;;;;;;;;;;-1:-1:-1;;;;;186:208:8;;;;;;;;;;5716:786:3;;;;;;;;;;-1:-1:-1;;;;;5716:786:3;;;;;;;;;;;;;;;;;;;;;;14128:864;;;;;;;;;;-1:-1:-1;;;;;14128:864:3;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23:1:-1;8:100;33:3;30:1;27:2;8:100;;;99:1;94:3;90;84:5;71:3;;;64:6;52:2;45:3;8:100;;;12:14;3:109;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23:1;8:100;33:3;30:1;27:2;8:100;;;99:1;94:3;90;84:5;71:3;;;64:6;52:2;45:3;8:100;;;12:14;3:109;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23:1;8:100;33:3;30:1;27:2;8:100;;;99:1;94:3;90;84:5;71:3;;;64:6;52:2;45:3;8:100;;;12:14;3:109;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23:1;8:100;33:3;30:1;27:2;8:100;;;99:1;94:3;90;84:5;71:3;;;64:6;52:2;45:3;8:100;;;12:14;3:109;;;;;;;;;;;;;;;;;;;;;;;59:20:6;;;;;;;;;;;;2381:451;2526:6;466:5;;452:10;-1:-1:-1;;;;;452:19:6;;;466:5;;452:19;444:28;;;;;;-1:-1:-1;;;;;2457:17:6;;;;;;:8;:17;;;;;;;;2449:26;;;;;;;;-1:-1:-1;;;;;;2485:17:6;;2505:5;2485:17;;;:8;:17;;;;;:25;;-1:-1:-1;;2485:25:6;;;2521:305;2542:13;:20;2538:24;;2521:305;;;2607:7;-1:-1:-1;;;;;2587:27:6;:13;2601:1;2587:16;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;2587:16:6;:27;2583:233;;;2653:13;2667:20;;-1:-1:-1;;2667:24:6;;;2653:39;;;;;;;;;;;;;;;;2634:13;:16;;-1:-1:-1;;;;;2653:39:6;;;;2648:1;;2634:16;;;;;;;;;;;;;;;:58;;-1:-1:-1;;;;;;2634:58:6;-1:-1:-1;;;;;2634:58:6;;;;;;;;;;2710:13;:22;;;;;-1:-1:-1;;2710:22:6;;;:::i;:::-;;2750:28;2763:7;2772:5;2750:28;;-1:-1:-1;;;;;2750:28:6;;;;;;;;;;;;;;;;;;;;;;2796:5;;2583:233;2564:3;;2521:305;;;2381:451;;:::o;2908:894:3:-;3227:4;3365:28;;:::i;:::-;851:12;:17;;867:1;851:17;;;;;3269:25;;3255:10;-1:-1:-1;;;;;3255:39:3;;;3269:25;;3255:39;3247:48;;;;;;3314:4;:11;:16;;3313:40;;;3336:4;:11;3351:1;3336:16;3313:40;3305:49;;;;;;;;-1:-1:-1;;;;;3404:26:3;;;;;3440:20;;;:14;;;:20;3470;;;:32;;;3512:22;;;:15;;;:22;3544:36;;;:22;;;:36;3590:24;;;:40;;;3640:28;;;:48;;;3698:30;;:19;;;:30;3738:15;;;:22;;;3778:17;3404:10;3778:5;:17::i;:::-;3771:24;;958:12;;942:28;;934:37;;;;;;2908:894;;;;;;;;;;;;;:::o;9078:100::-;9121:23;;:::i;:::-;9163:8;9156:15;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;9156:15:3;;;;;;;;;;;;;;;;;;;;;;;9078:100;;:::o;12083:1998::-;12214:7;12223:4;12243:13;12270:16;12300:24;12446:27;;:::i;:::-;12667:19;;:::i;:::-;12728:31;;:::i;:::-;12807:6;13345:25;12259:1;12243:17;;12289:1;12270:20;;12327:1;12300:28;;12388:4;-1:-1:-1;;;;;12381:11:3;:3;-1:-1:-1;;;;;12381:11:3;;12377:58;;;12402:8;:21;;12411:11;;12402:21;;;;;;;;;;;;;;;;-1:-1:-1;;;;;12402:21:3;;-1:-1:-1;255:6:7;;-1:-1:-1;12394:41:3;;12377:58;-1:-1:-1;;;;;12497:24:3;;-1:-1:-1;;;;;;;;;;;12497:24:3;:80;;-1:-1:-1;;;;;12553:24:3;;;;;;:19;:24;;;;;12497:80;;;-1:-1:-1;;;;;12524:26:3;;;;;;:20;:26;;;;;12497:80;12484:93;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;12484:93:3;;;;;;;;;;;;;;;;;;;;;;;12592:10;:17;:22;12588:68;;;12624:8;:21;;12633:11;;12624:21;;;;;;;;;;;;;;;;-1:-1:-1;;;;;12624:21:3;;-1:-1:-1;12647:8:3;;-1:-1:-1;12647:8:3;;12616:40;;12588:68;12700:10;:17;12689:29;;;;;;;;;;;;;;;;;;;;;;;;12667:51;;12773:10;:17;12762:29;;;;;;;;;;;;;;;;;;;;;;;;12728:63;;12816:1;12807:10;;12802:501;12823:10;:17;12819:1;:21;12802:501;;;12920:17;12919:18;:78;;;;-1:-1:-1;12971:26:3;12941:11;:26;12953:10;12964:1;12953:13;;;;;;;;;;;;;;;;-1:-1:-1;;;;;12941:26:3;;;;;;;;;;;;-1:-1:-1;12941:26:3;;;;:56;;;;;;;;;12919:78;12915:125;;;13017:8;;12915:125;13088:10;13099:1;13088:13;;;;;;;;;;;;;;;;-1:-1:-1;;;;;13065:56:3;;13122:3;13127:4;13133:9;13144:12;13065:92;;;;;;;;-1:-1:-1;;;13065:92:3;;;;;;-1:-1:-1;;;;;13065:92:3;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;13054:5;13060:1;13054:8;;;;;;;;;;;;;;;;:103;13187:8;13176:5;13182:1;13176:5;:8;;;;;;;;;;;;;;;:19;13172:121;;;13270:5;13276:1;13270:8;;;;;;;;;;;;;;;;13259:19;;13172:121;12842:3;;;;;12802:501;;;13328:1;13317:8;:12;13313:709;;;13403:18;;13395:5;:26;13374:8;13385:5;13374:16;13373:49;;;;;;;;13345:77;;13446:1;13442:5;;13437:195;13453:10;:17;13449:1;:21;13437:195;;;13511:20;13499:5;13505:1;13499:8;;;;;;;;;;;;;;;;:32;13495:123;;13598:1;13555:17;13573:21;;;;;;13555:40;;;;;;;;;;;;;;;;:44;13495:123;13472:3;;;;;13437:195;;;13672:1;13650:19;:23;13646:322;;;13802:17;13860:19;-1:-1:-1;;13841:12:3;:14;13825:31;13820:59;;;;;;;;13802:78;;;;;;;;;;;;;;;;13788:92;;13646:322;;;13933:17;13951:1;13933:20;;;;;;;;;;;;;;;;13919:34;;13646:322;13993:5;13999:11;13993:18;;;;;;;;;;;;;;;;13982:29;;13313:709;14040:10;14051:11;14040:23;;;;;;;;;;;;;;;;14065:8;14032:42;;;;12083:1998;;;;;;;;;;;;;;;;:::o;1911:40::-;;;;;;;;;;;;;:::o;7289:218::-;466:5:6;;452:10;-1:-1:-1;;;;;452:19:6;;;466:5;;452:19;444:28;;;;;;-1:-1:-1;;;;;7376:23:3;;;;7368:32;;;;;;7443:17;;7411:50;;7432:9;;-1:-1:-1;;;;;7443:17:3;7411:50;;-1:-1:-1;;;;;7411:50:3;;;;;;;;;;;;;;;;;;;;;;7471:17;:29;;-1:-1:-1;;;;;;7471:29:3;-1:-1:-1;;;;;7471:29:3;;;;;;;;;;7289:218::o;11322:286::-;11441:13;11456:9;11481:28;;:::i;:::-;11512:57;11537:3;11542:4;11548:9;11559;;;;;;;;;;;;;;;;11512:24;:57::i;:::-;11481:88;-1:-1:-1;11586:1:3;11481:88;11589:11;11579:22;;-1:-1:-1;11579:22:3;-1:-1:-1;11322:286:3;;;;;;;;:::o;11614:78::-;11676:9;;;;11614:78;:::o;4803:424::-;-1:-1:-1;;;;;548:10:6;538:21;4905:4:3;538:21:6;;;:9;:21;;;;;;;;530:30;;;;;;;;-1:-1:-1;;;;;4934:20:3;;4958:16;4934:20;;;:11;:20;;;;;;;;:40;;;;;;;;;;4926:49;;;;;;5012:7;-1:-1:-1;;;;;4993:26:3;:8;5002:5;4993:15;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;4993:15:3;:26;4985:35;;;;;;-1:-1:-1;;;;;5031:20:3;;5054:16;5031:20;;;:11;:20;;;;;:39;;-1:-1:-1;;5031:39:3;;;5098:8;5107:15;;-1:-1:-1;;5107:19:3;;;5098:29;;;;;;;;;;;;;;;;5080:8;:15;;-1:-1:-1;;;;;5098:29:3;;;;5089:5;;5080:15;;;;;;;;;;;;;;;:47;;-1:-1:-1;;;;;;5080:47:3;-1:-1:-1;;;;;5080:47:3;;;;;;;;;;5137:8;:17;;;;;-1:-1:-1;;5137:17:3;;;:::i;:::-;;5165:33;5190:7;5165:33;;-1:-1:-1;;;;;5165:33:3;;;;;;;;;;;;;;-1:-1:-1;5216:4:3;570:1:6;4803:424:3;;;;:::o;85:27:6:-;;;-1:-1:-1;;;;;85:27:6;;:::o;670:96::-;717:9;;:::i;:::-;745:14;738:21;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;738:21:6;;;;;;;;;;;;;;;;;;;;;;670:96;:::o;2003:54:3:-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;2003:54:3;;-1:-1:-1;2003:54:3;;-1:-1:-1;2003:54:3:o;6646:175::-;466:5:6;;452:10;-1:-1:-1;;;;;452:19:6;;;466:5;;452:19;444:28;;;;;;6757:17:3;;6725:50;;6746:9;;-1:-1:-1;;;;;6757:17:3;6725:50;;-1:-1:-1;;;;;6725:50:3;;;;;;;;;;;;;;;;;;;;;;6785:17;:29;;-1:-1:-1;;;;;;6785:29:3;-1:-1:-1;;;;;6785:29:3;;;;;;;;;;6646:175::o;560:186:11:-;466:5:6;;452:10;-1:-1:-1;;;;;452:19:6;;;466:5;;452:19;444:28;;;;;;662:5:11;-1:-1:-1;;;;;662:14:11;;677:6;685;662:30;;;;;;;;-1:-1:-1;;;662:30:11;;;;;;-1:-1:-1;;;;;662:30:11;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;654:39;;;;;;;;703:36;717:5;724:6;732;703:36;;-1:-1:-1;;;;;703:36:11;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;560:186;;;:::o;9184:89:3:-;9250:16;;9184:89;:::o;2074:301:6:-;466:5;;452:10;-1:-1:-1;;;;;452:19:6;;;466:5;;452:19;444:28;;;;;;-1:-1:-1;;;;;2150:20:6;;;;;;:8;:20;;;;;;;;2149:21;2141:30;;;;;;2212:13;:20;328:2;2212:37;;2204:46;;;;;;2261:30;2274:10;2286:4;2261:30;;-1:-1:-1;;;;;2261:30:6;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;2301:20:6;;;;;;:8;:20;;;;;:27;;-1:-1:-1;;2301:27:6;2324:4;2301:27;;;;;;2338:13;:30;;:13;;:30;;;:13;:30;;:::i;:::-;-1:-1:-1;2338:30:6;;;;;;;;;;;-1:-1:-1;;;;;;2338:30:6;-1:-1:-1;;;;;2338:30:6;;;;;;;;;;2074:301::o;1356:35:3:-;;;;:::o;1637:46::-;;;-1:-1:-1;;;;;1637:46:3;;:::o;6937:245::-;466:5:6;;452:10;-1:-1:-1;;;;;452:19:6;;;466:5;;452:19;444:28;;;;;;-1:-1:-1;;;;;7033:26:3;;;;7025:35;;;;;;7109:20;;7071:59;;7095:12;;-1:-1:-1;;;;;7109:20:3;7071:59;;-1:-1:-1;;;;;7071:59:3;;;;;;;;;;;;;;;;;;;;;;7140:20;:35;;-1:-1:-1;;;;;;7140:35:3;-1:-1:-1;;;;;7140:35:3;;;;;;;;;;6937:245::o;1582:49::-;;;-1:-1:-1;;;;;1582:49:3;;:::o;1533:43::-;;;-1:-1:-1;;;;;1533:43:3;;:::o;8379:106::-;-1:-1:-1;;;;;548:10:6;538:21;;;;;:9;:21;;;;;;;;530:30;;;;;;;;8453:17:3;;;;:10;:17;;;;;;:25;8379:106::o;10151:192::-;10230:17;;10210:4;;-1:-1:-1;;;;;10230:17:3;:31;10226:54;;;-1:-1:-1;;;;10263:17:3;;10226:54;10297:17;;-1:-1:-1;;;;;10297:17:3;:33;10331:4;10297:17;:39;;;;;;;-1:-1:-1;;;10297:39:3;;;;;;-1:-1:-1;;;;;10297:39:3;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;10151:192:3;;;;:::o;1837:46::-;;;;;;:::o;1479:48::-;;;;;;;;;;;;;;;:::o;1074:183:6:-;466:5;;452:10;-1:-1:-1;;;;;452:19:6;;;466:5;;452:19;444:28;;;;;;-1:-1:-1;;;;;1150:22:6;;;;1142:31;;;;;;1204:12;;1183:34;;-1:-1:-1;;;;;1204:12:6;1183:34;;-1:-1:-1;;;;;1183:34:6;;;;;;;;;;;;;;1227:12;:23;;-1:-1:-1;;;;;;1227:23:6;-1:-1:-1;;;;;1227:23:6;;;;;;;;;;1074:183::o;8038:335:3:-;466:5:6;;452:10;-1:-1:-1;;;;;452:19:6;;;466:5;;452:19;444:28;;;;;;8102:7:3;8098:197;;;8133:17;;-1:-1:-1;;;;;8133:17:3;:31;;8125:40;;;;;;8187:20;;-1:-1:-1;;;;;8187:20:3;:34;;8179:43;;;;;;8244:25;;-1:-1:-1;;;;;8244:25:3;:39;;8236:48;;;;;;8304:9;:19;;-1:-1:-1;;8304:19:3;;;;;;;;;8334:32;;8304:19;8356:9;8334:32;;;;;;;;;;;;;;;;8038:335;:::o;1821:189:6:-;1868:12;;1884:10;-1:-1:-1;;;;;1868:26:6;;;:12;;:26;1860:35;;;;;;1918:12;;;1932:5;1905:33;;-1:-1:-1;;;;;1918:12:6;;;;1932:5;1905:33;;-1:-1:-1;;;;;1905:33:6;;;;;;;;;;;;;;;;;;;;;;1956:12;;;;1948:20;;-1:-1:-1;;;;;;1948:20:6;;;-1:-1:-1;;;;;1956:12:6;;1948:20;;;;1978:25;;;1821:189::o;1689:54:3:-;;;-1:-1:-1;;;;;1689:54:3;;:::o;1432:218:6:-;466:5;;452:10;-1:-1:-1;;;;;452:19:6;;;466:5;;452:19;444:28;;;;;;-1:-1:-1;;;;;1515:22:6;;;;1507:31;;;;;;1548:30;1569:8;1548:30;;-1:-1:-1;;;;;1548:30:6;;;;;;;;;;;;;;1611:5;;1588:29;;1601:8;;-1:-1:-1;;;;;1611:5:6;1588:29;;-1:-1:-1;;;;;1588:29:6;;;;;;;;;;;;;;;;;;;;;;1627:5;:16;;-1:-1:-1;;;;;;1627:16:6;-1:-1:-1;;;;;1627:16:6;;;;;;;;;;1432:218::o;772:94::-;818:9;;:::i;:::-;846:13;839:20;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;839:20:6;;;;;;;;;;;;;;;;;;;;;;772:94;:::o;9279:529:3:-;9436:20;;9376:17;;;;;;-1:-1:-1;;;;;9436:20:3;:34;;9428:43;;;;;;9492:4;-1:-1:-1;;;;;9485:11:3;:3;-1:-1:-1;;;;;9485:11:3;;9481:29;;;9506:1;;-1:-1:-1;9506:1:3;;-1:-1:-1;9498:12:3;;9481:29;-1:-1:-1;9549:4:3;9598:1;-1:-1:-1;;;9568:27:3;;:31;9564:142;;;-1:-1:-1;9676:19:3;9667:28;;;;;9639:5;9564:142;9723:20;;-1:-1:-1;;;;;9723:20:3;:36;9760:3;9765:4;9771:6;9779:21;9723:20;:78;;;;;;;-1:-1:-1;;;9723:78:3;;;;;;-1:-1:-1;;;;;9723:78:3;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;9716:85;;;;9279:529;;;;;;;:::o;1434:39::-;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;1434:39:3;;-1:-1:-1;1434:39:3;:::o;9814:331::-;9985:20;;9925:17;;;;-1:-1:-1;;;;;9985:20:3;:34;;9977:43;;;;;;10041:4;-1:-1:-1;;;;;10034:11:3;:3;-1:-1:-1;;;;;10034:11:3;;10030:29;;;-1:-1:-1;10055:1:3;;-1:-1:-1;10055:1:3;10047:12;;10030:29;10076:20;;-1:-1:-1;;;;;10076:20:3;:36;10113:3;10118:4;10124:6;10076:20;;:62;;;;;;;-1:-1:-1;;;10076:62:3;;;;;;-1:-1:-1;;;;;10076:62:3;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;10069:69;;;;9814:331;;;;;;;:::o;1220:40::-;;;;;;;;;;;;;;;;;;:::o;10349:168::-;10426:4;10496:14;;;2098:55;;;;;;;;;;;;;;;;;;;;2897:312:6;466:5;;452:10;-1:-1:-1;;;;;452:19:6;;;466:5;;452:19;444:28;;;;;;-1:-1:-1;;;;;2975:22:6;;;;;;:9;:22;;;;;;;;2974:23;2966:32;;;;;;3039:14;:21;328:2;3039:38;;3031:47;;;;;;3089:32;3103:11;3116:4;3089:32;;-1:-1:-1;;;;;3089:32:6;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;3131:22:6;;;;;;:9;:22;;;;;:29;;-1:-1:-1;;3131:29:6;3156:4;3131:29;;;;;;3170:14;:32;;:14;;:32;;;:14;:32;;:::i;4139:409:3:-;-1:-1:-1;;;;;548:10:6;538:21;4249:4:3;538:21:6;;;:9;:21;;;;;;;;530:30;;;;;;;;-1:-1:-1;;;;;4277:20:3;;4301:16;4277:20;;;:11;:20;;;;;;;;:40;;;;;;;;;4269:49;;;;;;4328:8;:22;;;;;;:8;:22;;:::i;:::-;-1:-1:-1;4328:22:3;;;;;;;;;;;-1:-1:-1;;;;;;4328:22:3;-1:-1:-1;;;;;4328:22:3;;;;;4384:16;:72;;4432:24;4384:72;;;4403:26;4384:72;-1:-1:-1;;;;;4361:20:3;;;;;;:11;:20;;;;;:95;;-1:-1:-1;;4361:95:3;;;;;;;;;;;;;;;;4487:7;-1:-1:-1;;;;;4467:52:3;;4496:4;4502:16;4467:52;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;4537:4:3;4139:409;;;;:::o;3215:469:6:-;3366:6;466:5;;452:10;-1:-1:-1;;;;;452:19:6;;;466:5;;452:19;444:28;;;;;;-1:-1:-1;;;;;3293:19:6;;;;;;:9;:19;;;;;;;;3285:28;;;;;;;;-1:-1:-1;;;;;;3323:19:6;;3345:5;3323:19;;;:9;:19;;;;;:27;;-1:-1:-1;;3323:27:6;;;3361:317;3382:14;:21;3378:25;;3361:317;;;3449:8;-1:-1:-1;;;;;3428:29:6;:14;3443:1;3428:17;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;3428:17:6;:29;3424:244;;;3497:14;3512:21;;-1:-1:-1;;3512:25:6;;;3497:41;;;;;;;;;;;;;;;;3477:14;:17;;-1:-1:-1;;;;;3497:41:6;;;;3492:1;;3477:17;;;;;;;;;;;;;;;:61;;-1:-1:-1;;;;;;3477:61:6;-1:-1:-1;;;;;3477:61:6;;;;;;;;;;3556:14;:26;;-1:-1:-1;;3556:26:6;;;;;;:::i;:::-;;3600:30;3614:8;3624:5;3600:30;;-1:-1:-1;;;;;3600:30:6;;;;;;;;;;;;;;;;;;;;;;3648:5;;3424:244;3405:3;;3361:317;;1749:71:3;;;;:::o;11698:96::-;11747:4;11770:17;;;:10;:17;;;;;;;11698:96::o;11071:245::-;11152:13;11167:9;11188:28;;:::i;:::-;11219:58;11244:3;11249:4;11255:9;11266:10;;;;;;;;;;;11219:24;:58::i;7590:392::-;466:5:6;;452:10;-1:-1:-1;;;;;452:19:6;;;466:5;;452:19;444:28;;;;;;7788:9:3;7765:32;;;7757:41;;;;;;7825:16;:31;;;7866:18;:40;;;7916:59;7844:12;7887:19;7916:59;;;;;;;;;;;;;;;;;;;;7590:392;;:::o;1266:51::-;-1:-1:-1;;;1266:51:3;:::o;8548:226::-;466:5:6;;452:10;-1:-1:-1;;;;;452:19:6;;;466:5;;452:19;444:28;;;;;;-1:-1:-1;;;;;8628:26:3;;;;8620:35;;;;;;8665:25;:40;;-1:-1:-1;;;;;;8665:40:3;-1:-1:-1;;;;;8665:40:3;;;;;;;;;;;8715:52;;8729:25;8756:10;8715:52;;-1:-1:-1;;;;;8715:52:3;;;;;;;;;;;;;;;;;;;;;;8548:226;:::o;851:150:11:-;466:5:6;;452:10;-1:-1:-1;;;;;452:19:6;;;466:5;;452:19;444:28;;;;;;-1:-1:-1;;;;;932:15:11;;:23;;;;948:6;932:23;;;;;;;;;;;;;;;;;;;;;;;;;;965:29;979:6;987;965:29;;;;;-1:-1:-1;;;;;965:29:11;;;;;;;;;;;;;;;;851:150;;:::o;8855:91:3:-;8924:8;:15;8855:91;:::o;186:208:8:-;253:4;-1:-1:-1;;;;;273:26:8;;-1:-1:-1;;;;;;;;;;;273:26:8;269:118;;;-1:-1:-1;;;;;;320:12:8;;;313:19;;269:118;366:5;-1:-1:-1;;;;;366:15:8;;382:4;366:21;;;;;;;;-1:-1:-1;;;366:21:8;;;;;;-1:-1:-1;;;;;366:21:8;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;359:28;;;;5716:786:3;-1:-1:-1;;;;;548:10:6;538:21;5870:4:3;538:21:6;;;:9;:21;;;;;;;;530:30;;;;;;;;-1:-1:-1;;;;;5898:20:3;;5922:16;5898:20;;;:11;:20;;;;;;;;:40;;;;;;;;;;5890:49;;;;;;5954:10;5950:149;;;5980:37;5990:7;5999:5;6006;6013:3;5980:9;:37::i;:::-;6049:7;-1:-1:-1;;;;;6032:56:3;;-1:-1:-1;;;;;;;;;;;6077:5:3;6084:3;6032:56;;-1:-1:-1;;;;;6032:56:3;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;5950:149;6113:10;6109:336;;;6139:36;6149:7;6158:5;6165:4;6171:3;6139:9;:36::i;:::-;6194:3;6190:174;;;6225:5;-1:-1:-1;;;;;6225:13:3;;6239:7;-1:-1:-1;;;6225:30:3;;;;;;;;-1:-1:-1;;;6225:30:3;;;;;;-1:-1:-1;;;;;6225:30:3;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;6217:39;;;;;;;;6190:174;;;6323:5;-1:-1:-1;;;;;6323:13:3;;6337:7;6346:1;6323:25;;;;;;;;-1:-1:-1;;;6323:25:3;;;;;;-1:-1:-1;;;;;6323:25:3;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;6315:34;;;;;;;;6395:7;-1:-1:-1;;;;;6378:56:3;;6404:5;-1:-1:-1;;;;;;;;;;;6430:3:3;6378:56;;-1:-1:-1;;;;;6378:56:3;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;6109:336;6455:18;6467:5;6455:11;:18::i;:::-;-1:-1:-1;6491:4:3;5716:786;;;;;;;:::o;14128:864::-;14216:21;;:::i;:::-;14239:15;;:::i;:::-;14256:22;;:::i;:::-;14280:16;;:::i;:::-;14312:11;14378:9;14526:6;14343:1;14326:14;:18;:42;;14364:4;14326:42;;;14347:14;14326:42;14312:56;;-1:-1:-1;;;;;;;;;;;14378:29:3;;14432:20;:27;14453:5;-1:-1:-1;;;;;14432:27:3;-1:-1:-1;;;;;14432:27:3;;;;;;;;;;;;14418:41;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;14418:41:3;;;;;;;;;;;;;;;;;;;;;;;14491:11;:18;14480:30;;;;;;;;;;;;;;;;;;;;;;;;14469:41;;14535:1;14526:10;;14521:176;14542:11;:18;14538:1;:22;14521:176;;;14618:11;14630:1;14618:14;;;;;;;;;;;;;;;;-1:-1:-1;;;;;14595:57:3;;14653:3;14658:5;14665:6;14673:12;14595:91;;;;;;;;-1:-1:-1;;;14595:91:3;;;;;;-1:-1:-1;;;;;14595:91:3;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;14581:8;14590:1;14581:11;;;;;;;;;;;;;;;;:105;14562:3;;14521:176;;;14722:19;:26;14742:5;-1:-1:-1;;;;;14722:26:3;-1:-1:-1;;;;;14722:26:3;;;;;;;;;;;;14707:41;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;14707:41:3;;;;;;;;;;;;;;;;;;;;;;;14781:12;:19;14770:31;;;;;;;;;;;;;;;;;;;;;;;;14758:43;;14821:1;14817:5;;14812:174;14828:12;:19;14824:1;:23;14812:174;;;14906:12;14919:1;14906:15;;;;;;;;;;;;;;;;-1:-1:-1;;;;;14883:58:3;;14942:5;14949:3;14954:6;14962:12;14883:92;;;;;;;;-1:-1:-1;;;14883:92:3;;;;;;-1:-1:-1;;;;;14883:92:3;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;14868:9;14878:1;14868:12;;;;;;;;;;;;;;;;:107;14849:3;;14812:174;;;14128:864;;;;;;;;;;:::o;59:20:6:-;;;-1:-1:-1;;;;;59:20:6;;:::o;17714:2683:3:-;17769:4;17980:32;;:::i;:::-;17793:9;;18284:21;;;;;;17793:9;;17785:18;;;;;;;;17836:16;;17821:11;:31;;17813:40;;;;;;17871:97;17890:10;:14;;;17906:10;:20;;;17928:10;:15;;;17945:10;:22;;;17871:18;:97::i;:::-;17863:106;;;;;;;;18027:96;18052:10;:14;;;18068:10;:15;;;18085:10;:20;;;18107:10;:15;;;18027:24;:96::i;:::-;17980:143;-1:-1:-1;18160:1:3;17980:143;18142:15;:19;18134:28;;;;;;369:17:7;18180:10:3;:15;:26;18172:35;;;;;;18244:10;:28;;;18225:10;:15;:47;;18217:56;;;;;;18419:158;18437:10;:14;;;18465:10;:15;;;18494:10;:20;;;18528:10;:24;;;18566:10;18419:17;:158::i;:::-;18370:207;-1:-1:-1;18370:207:3;-1:-1:-1;18370:207:3;-1:-1:-1;18370:207:3;18596:34;18612:10;:17;18596:15;:34::i;:::-;:47;;18588:56;;;;;;18662:86;18675:10;:14;;;18691:10;:20;;;18713:15;18730:10;:17;18662:12;:86::i;:::-;18654:95;;;;;;;;18768:304;18817:10;:14;;;18849:15;-1:-1:-1;;;;;;;;;;;18917:4:3;18939:9;18988:10;:19;;;19026:10;:23;;;19067:4;18768:14;:304::i;:::-;18760:313;;;;;;;;19092:326;-1:-1:-1;;;;;;;;;;;19177:9:3;19204:10;:15;;;19237:10;:22;;;19277:16;19333:10;:19;;;19371:10;:24;;;19413:4;19092:14;:326::i;:::-;19084:335;;;;;;;;-1:-1:-1;;;;;;;;;;;19434:14:3;;;;-1:-1:-1;;;;;19434:35:3;;19430:190;;19538:17;;-1:-1:-1;;;;;19538:17:3;:28;19567:9;19578:19;;;;19599:10;:19;;;19538:81;;;;;;;;-1:-1:-1;;;19538:81:3;;;;;;;;;;;;;-1:-1:-1;;;;;19538:81:3;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;19530:90;;;;;;;;-1:-1:-1;;;;;;;;;;;19634:15:3;;;;-1:-1:-1;;;;;19634:36:3;;19630:191;;19739:17;;-1:-1:-1;;;;;19739:17:3;:28;19768:9;19779:19;;;;19800:10;:19;;;19739:81;;;;;;;;-1:-1:-1;;;19739:81:3;;;;;;;;;;;;;-1:-1:-1;;;;;19739:81:3;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;19731:90;;;;;;;;19865:10;:17;-1:-1:-1;;;;;19832:524:3;;19901:10;:14;;;19935:10;:15;;;19975;20015:16;20058:10;:22;;;20107:9;-1:-1:-1;;;;;;;;;;;20141:14:3;;;;-1:-1:-1;;;;;20141:35:3;;20140:72;;20193:10;:19;;;20140:72;;;20188:1;20140:72;-1:-1:-1;;;;;;;;;;;;;;;;20238:36:3;:10;:15;;;-1:-1:-1;;;;;20238:36:3;;20237:73;;20291:10;:19;;;20237:73;;;20286:1;20237:73;20330:10;:15;;;19832:524;;-1:-1:-1;;;;;19832:524:3;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23:1:-1;8:100;33:3;30:1;27:2;8:100;;;99:1;94:3;90;84:5;71:3;;;64:6;52:2;45:3;8:100;;;12:14;3:109;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1;20374:16:3;;17714:2683;-1:-1:-1;;;;17714:2683:3:o;14998:1380::-;15113:21;;:::i;:::-;15228:4;15203:22;;15350:1;15335:4;:11;:16;;15334:93;;;;;15416:9;;;;;;;;;;;;;;;;;;15406:20;;;;;;;;;;;;36:153:-1;66:2;58;;36:153;;182:3;176:5;164:6;;-1:-1;;139:3;;;;98:2;89:3;;;;114;36:153;;;274:1;267:3;263:2;259:3;254;250;246;315:4;311:3;305;299:5;295:3;356:4;350:3;344:5;340:3;377:2;365:6;;;-1:-1;;;3:399;;;;;-1:-1;3:399;;-1:-1;;3:399;;;;;;;15367:4:3;15357:69;15367:4;:7;;;;;;;;;;;-1:-1:-1;;;15367:7:3;;-1:-1:-1;;;15367:7:3;15376:4;15381:1;15376:7;;;;;;;;;;;;-1:-1:-1;;;15376:7:3;;-1:-1:-1;;;15376:7:3;15385:4;15390:1;15385:7;;;;;;;;;;;;-1:-1:-1;;;15385:7:3;;-1:-1:-1;;;15385:7:3;15394:4;15399:1;15394:7;;;;;;;;;;;;-1:-1:-1;;;15394:7:3;;-1:-1:-1;;;15394:7:3;15357:45;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:69;15334:93;15330:149;;;15463:5;15443:25;;15330:149;15508:16;15520:3;15508:11;:16::i;:::-;15489:35;;15554:17;15566:4;15554:11;:17::i;:::-;15534:37;;15635:68;15650:3;-1:-1:-1;;;;;;;;;;;15674:9:3;15685:17;15635:14;:68::i;:::-;15600:19;;;15582:121;;;-1:-1:-1;;;;;15582:121:3;;;15583:15;;;15582:121;15733:85;;15760:11;;506:2:7;;15787:9:3;;15798:19;15733:26;:85::i;:::-;15714:16;;;:104;;;15918:16;:21;15914:87;;;15969:1;15955:15;;15984:7;;15914:87;16073:76;-1:-1:-1;;;;;;;;;;;16107:4:3;16113:6;:16;;;16131:17;16073:14;:76::i;:::-;16037:20;;;16019:130;-1:-1:-1;;;;;16019:130:3;16020:15;;;16019:130;16180:94;506:2:7;16221:12:3;-1:-1:-1;16235:16:3;;;16253:6;:20;;;16180:26;:94::i;:::-;16160:17;;;:114;;;16299:72;;16315:9;;16326:17;16345:11;16358:12;16299:15;:72::i;:::-;16285:86;;14998:1380;;;;;;;;;;:::o;16384:809::-;-1:-1:-1;;;;;16528:27:3;;16481:6;16528:27;;;:20;:27;;;;;16566:82;;;;-1:-1:-1;;;;;;16611:26:3;;;;;;:19;:26;;;;;16566:82;16667:1;16663:5;;16658:390;16674:17;;16670:21;;16658:390;;;16727:10;16738:1;16727:13;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;16716:24:3;;;16727:13;;16716:24;16712:326;;;16764:3;16760:264;;;16791:5;;16760:264;16915:17;;16904:10;;-1:-1:-1;;16915:21:3;;;16904:33;;;;;;;;;;;;;;;;16888:13;;-1:-1:-1;;;;;16904:33:3;;;;16888:10;;16899:1;;16888:13;;;;;;;;;;;;;;;:49;;-1:-1:-1;;;;;;16888:49:3;-1:-1:-1;;;;;16888:49:3;;;;;;;;;;16959:19;;;;-1:-1:-1;;16959:19:3;;;:::i;:::-;;17000:5;;16760:264;16693:3;;;;;16658:390;;;17062:3;:29;;;;-1:-1:-1;17074:17:3;;17069:22;;17062:29;17058:129;;;17152:24;;:10;;:24;;;;:10;:24;;:::i;:::-;-1:-1:-1;17152:24:3;;;;;;;;;;;-1:-1:-1;;;;;;17152:24:3;-1:-1:-1;;;;;17152:24:3;;;;;17058:129;16384:809;;;;;;:::o;561:171:7:-;-1:-1:-1;;;;;618:26:7;;-1:-1:-1;;;;;;;;;;;618:26:7;614:111;;;-1:-1:-1;;;;;646:15:7;;;;;;:8;:15;;;;;506:2;646:30;;614:111;;;709:5;-1:-1:-1;;;;;709:14:7;;:16;;;;;;;;;;;-1:-1:-1;;;709:16:7;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;691:15:7;;;;;;:8;:15;;;;;:34;-1:-1:-1;614:111:7;561:171;:::o;23677:593:3:-;23811:4;305:6:7;23839:20:3;;;23831:29;;;;;;23878:14;;;23870:23;;;;;;-1:-1:-1;;;;;23911:25:3;;;;23903:34;;;;;;-1:-1:-1;;;;;23955:11:3;;;;;;;;23947:20;;;;;;-1:-1:-1;;;;;23982:24:3;;-1:-1:-1;;;;;;;;;;;23982:24:3;23978:264;;;24030:9;:22;;24022:31;;;;;;23978:264;;;24092:9;:14;24084:23;;;;;;24221:9;24198:3;-1:-1:-1;;;;;24198:13:3;;24212:4;24198:19;;;;;;;;-1:-1:-1;;;24198:19:3;;;;;;-1:-1:-1;;;;;24198:19:3;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:32;;24190:41;;;;;;;;-1:-1:-1;24259:4:3;23677:593;;;;;;;:::o;20447:747::-;20591:20;20613:14;20629:21;20694:13;20670:10;:21;;;:37;20666:522;;;-1:-1:-1;20742:13:3;20781:82;-1:-1:-1;;;;;;;;;;;20814:4:3;20742:13;20838:24;;;;20781:13;:82::i;:::-;20769:94;;20895:73;20909:3;-1:-1:-1;;;;;;;;;;;20933:9:3;20944:10;:23;;;20895:13;:73::i;:::-;20877:91;-1:-1:-1;20990:28:3;;;;20982:37;;;;;;20666:522;;;21069:10;:21;;;21050:40;;21122:9;21104:27;;21157:10;:20;;;21145:32;;20666:522;20447:747;;;;;;;;;:::o;22940:477::-;23048:4;23089:9;23069:17;:29;23065:324;;;-1:-1:-1;;;;;23173:24:3;;-1:-1:-1;;;;;;;;;;;23173:24:3;23169:210;;;-1:-1:-1;;;;;23217:15:3;;23233:29;;;23217:46;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23169:210;23310:3;-1:-1:-1;;;;;23310:12:3;;23323:6;23344:17;23332:9;:29;23310:53;;;;;;;;-1:-1:-1;;;23310:53:3;;;;;;-1:-1:-1;;;;;23310:53:3;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23302:62;;;;;;;21621:1198;21897:4;;-1:-1:-1;;;;;21950:11:3;;;;;;;21946:223;;;22081:4;-1:-1:-1;;;;;22057:30:3;:11;-1:-1:-1;;;;;22057:30:3;;;22053:80;;;-1:-1:-1;;;;;22105:20:3;;:28;;;;22126:6;22105:28;;;;;;;;;;;;;;;;;;;;;;;;;;22154:4;22147:11;;;;21946:223;-1:-1:-1;;;;;22183:24:3;;-1:-1:-1;;;;;;;;;;;22183:24:3;22179:73;;;-1:-1:-1;22235:6:3;22179:73;22350:7;-1:-1:-1;;;;;22350:13:3;;22370:9;22381:3;22386:6;22394:4;22400;22406:14;22422:8;22350:81;;;;;;;;-1:-1:-1;;;22350:81:3;;;;;;-1:-1:-1;;;;;22350:81:3;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;22342:90;;;;;;;;22470:4;-1:-1:-1;;;;;22447:28:3;:11;-1:-1:-1;;;;;22447:28:3;;;22443:348;;;-1:-1:-1;;;;;22587:25:3;;-1:-1:-1;;;;;;;;;;;22587:25:3;22583:198;;;-1:-1:-1;;;;;22632:20:3;;:40;;;;22653:18;22632:40;;;;;;;;;;;;;;;;;;;;;;;;;;22583:198;;;22719:4;-1:-1:-1;;;;;22719:13:3;;22733:11;22746:18;22719:46;;;;;;;;-1:-1:-1;;;22719:46:3;;;;;;-1:-1:-1;;;;;22719:46:3;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;22711:55;;;;;;;;22808:4;22801:11;;21621:1198;;;;;;;;;;;;:::o;738:470:7:-;794:4;;-1:-1:-1;;;;;814:26:7;;-1:-1:-1;;;;;;;;;;;814:26:7;810:51;;;506:2;842:19;;;;810:51;-1:-1:-1;;;;;;915:15:7;;;;;;:8;:15;;;;;;1127:18;;1124:46;;;1154:5;-1:-1:-1;;;;;1154:14:7;;:16;;;;;;;;;;;-1:-1:-1;;;1154:16:7;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1147:23;;;;1124:46;1188:13;1181:20;;738:470;;;;;:::o;84:206:9:-;206:4;229:54;240:9;251:11;264:12;278:4;229:10;:54::i;:::-;222:61;84:206;-1:-1:-1;;;;;84:206:9:o;979:614:8:-;1103:4;305:6:7;1131:20:8;;;1123:29;;;;;;305:6:7;1170:21:8;;;1162:30;;;;;;1207:26;;;1203:384;;459:2:7;1258:25:8;;;1257:43;;1249:52;;;;;;1387:9;1371:11;1357;:25;1350:2;:33;1349:47;255:6:7;1323:10:8;:22;:74;;;;;;;;1315:83;;;;1203:384;459:2:7;1438:25:8;;;1437:43;;1429:52;;;;;;1566:9;1550:11;1536;:25;1529:2;:33;255:6:7;1503:10:8;:22;:60;:72;;;;;;782:191;878:4;901:65;912:10;924:16;936:3;924:11;:16::i;:::-;942:17;954:4;942:11;:17::i;:::-;961:4;901:10;:65::i;1214:558:7:-;1316:4;305:6;1340:17;;;1332:26;;;;;;369:17;1376:16;;;1368:25;;;;;;1408:26;;;1404:362;;459:2;1459:25;;;1458:43;;1450:52;;;;;;255:6;1524:13;;;1546:25;;;1541:2;:31;1524:49;1523:63;;1404:362;459:2;1626:25;;;1625:43;;1617:52;;;;;;1741:11;1727;:25;1722:2;:31;255:6;1709:45;1700:4;1691:6;:13;1690:65;;;;;;1778:844;1880:4;;;305:6;1904:17;;;1896:26;;;;;;369:17;1940:16;;;1932:25;;;;;;2109:26;;;2105:422;;459:2;2160:25;;;2159:43;;2151:52;;;;;;-1:-1:-1;;2257:25:7;;;2252:2;:31;2230:54;;255:6;2230:54;2313:4;2105:422;;;459:2;2357:25;;;2356:43;;2348:52;;;;;;-1:-1:-1;;255:6:7;2427:18;;2488:25;;;2483:2;:31;2475:40;;2105:422;2575:11;2570:1;2556:11;2544:9;:23;:27;2543:43;;;;;;;;;1778:844;-1:-1:-1;;;;;;;1778:844:7:o;1127:23145:3:-;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;:::o;:::-;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;-1:-1:-1;;;;;1127:23145:3;;;;;;-1:-1:-1;;;;;1127:23145:3;;;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;

Swarm Source

bzzr://0f970f05bb18f66eba80f09dd1f88bd42267981f9b6a7b666f30d306bdc040e4
Block Transaction Difficulty Gas Used Reward
Block Uncle Number Difficulty Gas Used Reward
Loading
Loading
Make sure to use the "Vote Down" button for any spammy posts, and the "Vote Up" for interesting conversations.

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.