Contract 0x3179E4Cd7fF08EB14397E1C402d0De44E1523f2e

 
 
Txn Hash
Method
Block
From
To
Value
0x9dd65e0d2cfc4a12e7ca5c6199b2b2fc354b7183c2d4d5462a8cc580ce19f71ePerform Swap Col...90850202019-12-10 20:29:281083 days 6 hrs agoENS Name natew.eth IN  0x3179e4cd7ff08eb14397e1c402d0de44e1523f2e0.1 Ether0.007266642.4
0x637ac6e97179961e6da760b7a817eb428e56b994b1837c75755f0006af0fff49Perform Swap Col...90451082019-12-03 18:28:041090 days 8 hrs ago0xfa7ffa0586053a81cc56cda951fe1fb57dfd93be IN  0x3179e4cd7ff08eb14397e1c402d0de44e1523f2e0 Ether0.003602889
0xd5d3d20a2256ddcc1ba426fcbc4e03ad15595aca6607e26e7bb637c6e9976d26Perform Swap Col...88096822019-10-25 14:24:321129 days 12 hrs agoENS Name natew.eth IN  0x3179e4cd7ff08eb14397e1c402d0de44e1523f2e0 Ether0.001775455
0xda93836d7eb8ae514649c367d5c5d4d5115caac81fd37f4a6ca49418ca45cf24Perform Swap Col...88096762019-10-25 14:23:391129 days 12 hrs agoENS Name natew.eth IN  0x3179e4cd7ff08eb14397e1c402d0de44e1523f2e0 Ether0.003048895
0x684702bfe3b0a6be0530f37f2391b70e8d4aee7d597ae5b01cc8e50728f4f075Perform Swap Col...88096672019-10-25 14:21:561129 days 12 hrs agoENS Name natew.eth IN  0x3179e4cd7ff08eb14397e1c402d0de44e1523f2e0 Ether0.001733635
0x92b3a059baff21f5542750b1d569ac5b9180f8755547d50660915b6b448f16e8Perform Swap Col...87909792019-10-22 15:09:451132 days 11 hrs ago0xaf9c46150b93730a0fdd401ae76cf98c02b4dec9 IN  0x3179e4cd7ff08eb14397e1c402d0de44e1523f2e0 Ether0.00203911.5
0x7021c9fb33c71abace88152af7ba39b640dc2d71efb7b4bb2201a9f64c59a530Perform Swap Col...87909142019-10-22 14:50:161132 days 11 hrs ago0xaf9c46150b93730a0fdd401ae76cf98c02b4dec9 IN  0x3179e4cd7ff08eb14397e1c402d0de44e1523f2e0 Ether0.00045851.5
0x300afcc7562121e539b3760aedf5942585b26a781861b7bc1a34995ab02d04c7Perform Swap Col...87908612019-10-22 14:38:121132 days 12 hrs ago0xaf9c46150b93730a0fdd401ae76cf98c02b4dec9 IN  0x3179e4cd7ff08eb14397e1c402d0de44e1523f2e0 Ether0.000128431.5
0xab664c682382f539a53eef1322be72c1230b3a584d68d7c839d2e34ae80f65eaPerform Swap Col...86538302019-10-01 2:31:201154 days 9 mins agoENS Name bleznak.eth IN  0x3179e4cd7ff08eb14397e1c402d0de44e1523f2e0 Ether0.002235368
0x36438af92368d820553ebed6017d59412c4d38bae43dd768303cf01b33efcaa6Perform Swap Col...86538212019-10-01 2:29:231154 days 10 mins agoENS Name bleznak.eth IN  0x3179e4cd7ff08eb14397e1c402d0de44e1523f2e0 Ether0.000442671
0xce57dd07cf0c15d44efe37a1a094ef381ffe4b3fe1161fd4b6c217672f841b8fPerform Swap Col...86537372019-10-01 2:12:211154 days 28 mins agoENS Name bleznak.eth IN  0x3179e4cd7ff08eb14397e1c402d0de44e1523f2e0 Ether0.00469428
0xef957c9a9577637514530c13f2a6b4555ec73f945eafa0b4a6a3a05f19658935Perform Swap Col...86537192019-10-01 2:08:051154 days 32 mins agoENS Name bleznak.eth IN  0x3179e4cd7ff08eb14397e1c402d0de44e1523f2e0 Ether0.001182338
0xc80bd0724db39f8127fcdb0e9beb22dc7f81203fa078d8b3dcdd0fd44830bbb6Perform Swap Col...86530642019-09-30 23:35:461154 days 3 hrs agoENS Name bleznak.eth IN  0x3179e4cd7ff08eb14397e1c402d0de44e1523f2e0 Ether0.004575977.3806009
0x4459254a1e292ad2e6570793376f52e88b52030d3e92af570af072b53de00136Perform Swap Col...86530492019-09-30 23:33:211154 days 3 hrs agoENS Name bleznak.eth IN  0x3179e4cd7ff08eb14397e1c402d0de44e1523f2e0 Ether0.00431517
0xa3cfd4d6cfa4e18e250ab1fe9a1d7c8fee2b198fe3e86e3084675c227bf56127Perform Swap Col...86530362019-09-30 23:30:351154 days 3 hrs agoENS Name bleznak.eth IN  0x3179e4cd7ff08eb14397e1c402d0de44e1523f2e0 Ether0.00440167.5
0xb5aba35f5164ed25e8bee2aa21d9eb05f614c84aa17613f6484834aed231a0fePerform Swap Col...86530302019-09-30 23:29:361154 days 3 hrs agoENS Name bleznak.eth IN  0x3179e4cd7ff08eb14397e1c402d0de44e1523f2e0 Ether0.0058681610
0xc647791ae5fc6d6b5799799a5ea9c2fbc05efd11c1cf19d43630980ee9e9122dPerform Swap Col...86530222019-09-30 23:28:021154 days 3 hrs agoENS Name bleznak.eth IN  0x3179e4cd7ff08eb14397e1c402d0de44e1523f2e0 Ether0.0058681610
0x590e7a2f1e2e4ffd9fe5c4c81ce57da4a4cbbc63891d931e73ff3f0e683d72faPerform Swap Col...86530132019-09-30 23:26:321154 days 3 hrs agoENS Name bleznak.eth IN  0x3179e4cd7ff08eb14397e1c402d0de44e1523f2e10 Ether0.0025284510
0xedce9f509c2574e863c9b9c137b9fbc3ae421aa14fa95306003723973e18a361Perform Swap Col...86521542019-09-30 20:12:591154 days 6 hrs agoENS Name artiom.eth IN  0x3179e4cd7ff08eb14397e1c402d0de44e1523f2e0 Ether0.0067466310
0xed5831651ad98652870afeec8e48817738a73d91291ea527fcfb68f86346d3adPerform Swap Col...86519062019-09-30 19:26:431154 days 7 hrs ago0xa2bf6748e8e837e5569d64d74de1671979634f49 IN  0x3179e4cd7ff08eb14397e1c402d0de44e1523f2e0 Ether0.0032684710
0x85ce52a8a9e69c60069a556cab9c98c681feeac05bf8685343653948270619e4Perform Swap Col...86518552019-09-30 19:11:461154 days 7 hrs ago0xa2bf6748e8e837e5569d64d74de1671979634f49 IN  0x3179e4cd7ff08eb14397e1c402d0de44e1523f2e0 Ether0.003845719.8
0x765ad1021bd24387e8b126446829553ae6bc4f5e1e4b0945acc08a6374723a41Perform Swap Col...86518342019-09-30 19:06:201154 days 7 hrs agoVolatility Protocol: Deployer IN  0x3179e4cd7ff08eb14397e1c402d0de44e1523f2e2.83 Ether0.0048793310
0x2e74fd183b56008025910df6d27130b3f62179cb23b0bdd0131fad76419376c8Perform Swap Col...86518222019-09-30 19:04:091154 days 7 hrs ago0xa2bf6748e8e837e5569d64d74de1671979634f49 IN  0x3179e4cd7ff08eb14397e1c402d0de44e1523f2e0 Ether0.0133056212
0xcb465946b016d5e9f34b3bd762d4cae82498adaea55a1c7d19649ad4cad6a79aPerform Swap Col...86516322019-09-30 18:26:061154 days 8 hrs ago0xd76806ae0e783c2d2120a5a976d0c077d1c2b5ee IN  0x3179e4cd7ff08eb14397e1c402d0de44e1523f2e0.12334587 Ether0.002825816
0x5b11a69ca1de517c7c620989ba43bc4beffa7314317af05d364f51af8078dca8Perform Swap Col...86516242019-09-30 18:23:471154 days 8 hrs ago0xd76806ae0e783c2d2120a5a976d0c077d1c2b5ee IN  0x3179e4cd7ff08eb14397e1c402d0de44e1523f2e0.12471502 Ether0.001369155
[ Download CSV Export 
Latest 25 internal transaction
Parent Txn Hash Block From To Value
0x9dd65e0d2cfc4a12e7ca5c6199b2b2fc354b7183c2d4d5462a8cc580ce19f71e90850202019-12-10 20:29:281083 days 6 hrs ago 0x3179e4cd7ff08eb14397e1c402d0de44e1523f2eENS Name natew.eth0.09 Ether
0x9dd65e0d2cfc4a12e7ca5c6199b2b2fc354b7183c2d4d5462a8cc580ce19f71e90850202019-12-10 20:29:281083 days 6 hrs ago 0x3179e4cd7ff08eb14397e1c402d0de44e1523f2e 0x673afc80c778471b407de6298b4b7c4d518890dd0.01 Ether
0x637ac6e97179961e6da760b7a817eb428e56b994b1837c75755f0006af0fff4990451082019-12-03 18:28:041090 days 8 hrs ago 0x3179e4cd7ff08eb14397e1c402d0de44e1523f2e0xfa7ffa0586053a81cc56cda951fe1fb57dfd93be3.33606813 Ether
0x637ac6e97179961e6da760b7a817eb428e56b994b1837c75755f0006af0fff4990451082019-12-03 18:28:041090 days 8 hrs ago 0x3179e4cd7ff08eb14397e1c402d0de44e1523f2e 0x76edf2d56f60f3717c59e90b1c3cc95cd57427290.01676416 Ether
0x637ac6e97179961e6da760b7a817eb428e56b994b1837c75755f0006af0fff4990451082019-12-03 18:28:041090 days 8 hrs ago Kyber: Contract 0x3179e4cd7ff08eb14397e1c402d0de44e1523f2e3.35283229 Ether
0x7021c9fb33c71abace88152af7ba39b640dc2d71efb7b4bb2201a9f64c59a53087909142019-10-22 14:50:161132 days 11 hrs ago 0x3179e4cd7ff08eb14397e1c402d0de44e1523f2e 0xc095976bd18181f28626c5d48372debd7a8ce8d40.00100567 Ether
0x7021c9fb33c71abace88152af7ba39b640dc2d71efb7b4bb2201a9f64c59a53087909142019-10-22 14:50:161132 days 11 hrs ago 0x3179e4cd7ff08eb14397e1c402d0de44e1523f2e 0x76edf2d56f60f3717c59e90b1c3cc95cd57427290.00000505 Ether
0x7021c9fb33c71abace88152af7ba39b640dc2d71efb7b4bb2201a9f64c59a53087909142019-10-22 14:50:161132 days 11 hrs ago Uniswap: FUN 0x3179e4cd7ff08eb14397e1c402d0de44e1523f2e0.00101073 Ether
0xab664c682382f539a53eef1322be72c1230b3a584d68d7c839d2e34ae80f65ea86538302019-10-01 2:31:201154 days 9 mins ago 0x3179e4cd7ff08eb14397e1c402d0de44e1523f2eENS Name bleznak.eth9.1068728 Ether
0xab664c682382f539a53eef1322be72c1230b3a584d68d7c839d2e34ae80f65ea86538302019-10-01 2:31:201154 days 9 mins ago 0x3179e4cd7ff08eb14397e1c402d0de44e1523f2e 0xd53799e6f0728fdfb56b746dcd7b75dfcb422d740.02282424 Ether
0xab664c682382f539a53eef1322be72c1230b3a584d68d7c839d2e34ae80f65ea86538302019-10-01 2:31:201154 days 9 mins ago 0xccad17ba7d5014ab87c3931fe3fe1eadd69ed266 0x3179e4cd7ff08eb14397e1c402d0de44e1523f2e9.12969704 Ether
0x36438af92368d820553ebed6017d59412c4d38bae43dd768303cf01b33efcaa686538212019-10-01 2:29:231154 days 10 mins ago 0x3179e4cd7ff08eb14397e1c402d0de44e1523f2eENS Name bleznak.eth0.54821435 Ether
0x36438af92368d820553ebed6017d59412c4d38bae43dd768303cf01b33efcaa686538212019-10-01 2:29:231154 days 10 mins ago 0x3179e4cd7ff08eb14397e1c402d0de44e1523f2e 0xd53799e6f0728fdfb56b746dcd7b75dfcb422d740.00137397 Ether
0x36438af92368d820553ebed6017d59412c4d38bae43dd768303cf01b33efcaa686538212019-10-01 2:29:231154 days 10 mins ago 0x047ed17511d9287b2bf82a456aa87ba9cd45bb0d 0x3179e4cd7ff08eb14397e1c402d0de44e1523f2e0.54958832 Ether
0xce57dd07cf0c15d44efe37a1a094ef381ffe4b3fe1161fd4b6c217672f841b8f86537372019-10-01 2:12:211154 days 28 mins ago 0x3179e4cd7ff08eb14397e1c402d0de44e1523f2eENS Name bleznak.eth5.69926539 Ether
0xce57dd07cf0c15d44efe37a1a094ef381ffe4b3fe1161fd4b6c217672f841b8f86537372019-10-01 2:12:211154 days 28 mins ago 0x3179e4cd7ff08eb14397e1c402d0de44e1523f2e 0xd53799e6f0728fdfb56b746dcd7b75dfcb422d740.02423469 Ether
0xce57dd07cf0c15d44efe37a1a094ef381ffe4b3fe1161fd4b6c217672f841b8f86537372019-10-01 2:12:211154 days 28 mins ago 0xccad17ba7d5014ab87c3931fe3fe1eadd69ed266 0x3179e4cd7ff08eb14397e1c402d0de44e1523f2e5.72350008 Ether
0xce57dd07cf0c15d44efe37a1a094ef381ffe4b3fe1161fd4b6c217672f841b8f86537372019-10-01 2:12:211154 days 28 mins ago 0xccad17ba7d5014ab87c3931fe3fe1eadd69ed266 0x3179e4cd7ff08eb14397e1c402d0de44e1523f2e3.97037749 Ether
0xc80bd0724db39f8127fcdb0e9beb22dc7f81203fa078d8b3dcdd0fd44830bbb686530642019-09-30 23:35:461154 days 3 hrs ago 0xccad17ba7d5014ab87c3931fe3fe1eadd69ed266 0x3179e4cd7ff08eb14397e1c402d0de44e1523f2e3.57918309 Ether
0xc80bd0724db39f8127fcdb0e9beb22dc7f81203fa078d8b3dcdd0fd44830bbb686530642019-09-30 23:35:461154 days 3 hrs ago 0xccad17ba7d5014ab87c3931fe3fe1eadd69ed266 0x3179e4cd7ff08eb14397e1c402d0de44e1523f2e0.011 Ether
0x4459254a1e292ad2e6570793376f52e88b52030d3e92af570af072b53de0013686530492019-09-30 23:33:211154 days 3 hrs ago 0xccad17ba7d5014ab87c3931fe3fe1eadd69ed266 0x3179e4cd7ff08eb14397e1c402d0de44e1523f2e0.011 Ether
0xa3cfd4d6cfa4e18e250ab1fe9a1d7c8fee2b198fe3e86e3084675c227bf5612786530362019-09-30 23:30:351154 days 3 hrs ago 0x3179e4cd7ff08eb14397e1c402d0de44e1523f2eENS Name bleznak.eth9.93034862 Ether
0xa3cfd4d6cfa4e18e250ab1fe9a1d7c8fee2b198fe3e86e3084675c227bf5612786530362019-09-30 23:30:351154 days 3 hrs ago 0x3179e4cd7ff08eb14397e1c402d0de44e1523f2e 0xd53799e6f0728fdfb56b746dcd7b75dfcb422d740.02491566 Ether
0xa3cfd4d6cfa4e18e250ab1fe9a1d7c8fee2b198fe3e86e3084675c227bf5612786530362019-09-30 23:30:351154 days 3 hrs ago 0xccad17ba7d5014ab87c3931fe3fe1eadd69ed266 0x3179e4cd7ff08eb14397e1c402d0de44e1523f2e9.95526428 Ether
0xa3cfd4d6cfa4e18e250ab1fe9a1d7c8fee2b198fe3e86e3084675c227bf5612786530362019-09-30 23:30:351154 days 3 hrs ago 0xccad17ba7d5014ab87c3931fe3fe1eadd69ed266 0x3179e4cd7ff08eb14397e1c402d0de44e1523f2e0.011 Ether
[ Download CSV Export 
Loading

Contract Source Code Verified (Exact Match)

Contract Name:
TotlePrimary

Compiler Version
v0.5.7+commit.6da8b019

Optimization Enabled:
Yes with 999 runs

Other Settings:
default evmVersion

Contract Source Code (Solidity)

/**
 *Submitted for verification at Etherscan.io on 2019-07-17
*/

pragma solidity 0.5.7;
pragma experimental ABIEncoderV2;

/**
 * @title Ownable
 * @dev The Ownable contract has an owner address, and provides basic authorization control
 * functions, this simplifies the implementation of "user permissions".
 */
contract Ownable {
  address payable public owner;


  event OwnershipRenounced(address indexed previousOwner);
  event OwnershipTransferred(
    address indexed previousOwner,
    address indexed newOwner
  );


  /**
   * @dev The Ownable constructor sets the original `owner` of the contract to the sender
   * account.
   */
  constructor() public {
    owner = msg.sender;
  }

  /**
   * @dev Throws if called by any account other than the owner.
   */
  modifier onlyOwner() {
    require(msg.sender == owner);
    _;
  }

  /**
   * @dev Allows the current owner to relinquish control of the contract.
   * @notice Renouncing to ownership will leave the contract without an owner.
   * It will not be possible to call the functions with the `onlyOwner`
   * modifier anymore.
   */
  function renounceOwnership() public onlyOwner {
    emit OwnershipRenounced(owner);
    owner = address(0);
  }

  /**
   * @dev Allows the current owner to transfer control of the contract to a newOwner.
   * @param _newOwner The address to transfer ownership to.
   */
  function transferOwnership(address payable _newOwner) public onlyOwner {
    _transferOwnership(_newOwner);
  }

  /**
   * @dev Transfers control of the contract to a newOwner.
   * @param _newOwner The address to transfer ownership to.
   */
  function _transferOwnership(address payable _newOwner) internal {
    require(_newOwner != address(0));
    emit OwnershipTransferred(owner, _newOwner);
    owner = _newOwner;
  }
}

library ERC20SafeTransfer {
    function safeTransfer(address _tokenAddress, address _to, uint256 _value) internal returns (bool success) {
        (success,) = _tokenAddress.call(abi.encodeWithSignature("transfer(address,uint256)", _to, _value));
        require(success, "Transfer failed");

        return fetchReturnData();
    }

    function safeTransferFrom(address _tokenAddress, address _from, address _to, uint256 _value) internal returns (bool success) {
        (success,) = _tokenAddress.call(abi.encodeWithSignature("transferFrom(address,address,uint256)", _from, _to, _value));
        require(success, "Transfer From failed");

        return fetchReturnData();
    }

    function safeApprove(address _tokenAddress, address _spender, uint256 _value) internal returns (bool success) {
        (success,) = _tokenAddress.call(abi.encodeWithSignature("approve(address,uint256)", _spender, _value));
        require(success,  "Approve failed");

        return fetchReturnData();
    }

    function fetchReturnData() internal pure returns (bool success){
        assembly {
            switch returndatasize()
            case 0 {
                success := 1
            }
            case 32 {
                returndatacopy(0, 0, 32)
                success := mload(0)
            }
            default {
                revert(0, 0)
            }
        }
    }

}

/// @title A contract which allows its owner to withdraw any ether which is contained inside
contract Withdrawable is Ownable {

    /// @notice Withdraw ether contained in this contract and send it back to owner
    /// @dev onlyOwner modifier only allows the contract owner to run the code
    /// @param _token The address of the token that the user wants to withdraw
    /// @param _amount The amount of tokens that the caller wants to withdraw
    /// @return bool value indicating whether the transfer was successful
    function withdrawToken(address _token, uint256 _amount) external onlyOwner returns (bool) {
        return ERC20SafeTransfer.safeTransfer(_token, owner, _amount);
    }

    /// @notice Withdraw ether contained in this contract and send it back to owner
    /// @dev onlyOwner modifier only allows the contract owner to run the code
    /// @param _amount The amount of ether that the caller wants to withdraw
    function withdrawETH(uint256 _amount) external onlyOwner {
        owner.transfer(_amount);
    }
}

/**
 * @title ERC20 interface
 * @dev see https://github.com/ethereum/EIPs/issues/20
 */
contract ERC20 {
  function totalSupply() public view returns (uint256);

  function balanceOf(address _who) public view returns (uint256);

  function allowance(address _owner, address _spender)
    public view returns (uint256);

  function transfer(address _to, uint256 _value) public returns (bool);

  function approve(address _spender, uint256 _value)
    public returns (bool);

  function transferFrom(address _from, address _to, uint256 _value)
    public returns (bool);

  function decimals() public view returns (uint256);

  event Transfer(
    address indexed from,
    address indexed to,
    uint256 value
  );

  event Approval(
    address indexed owner,
    address indexed spender,
    uint256 value
  );
}

// File: contracts/lib/TokenTransferProxy.sol

/*

  Copyright 2018 ZeroEx Intl.

  Licensed under the Apache License, Version 2.0 (the "License");
  you may not use this file except in compliance with the License.
  You may obtain a copy of the License at

    http://www.apache.org/licenses/LICENSE-2.0

  Unless required by applicable law or agreed to in writing, software
  distributed under the License is distributed on an "AS IS" BASIS,
  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
  See the License for the specific language governing permissions and
  limitations under the License.

*/

/// @title TokenTransferProxy - Transfers tokens on behalf of contracts that have been approved via decentralized governance.
/// @author Amir Bandeali - <[email protected]>, Will Warren - <[email protected]>
contract TokenTransferProxy is Ownable {

    /// @dev Only authorized addresses can invoke functions with this modifier.
    modifier onlyAuthorized {
        require(authorized[msg.sender]);
        _;
    }

    modifier targetAuthorized(address target) {
        require(authorized[target]);
        _;
    }

    modifier targetNotAuthorized(address target) {
        require(!authorized[target]);
        _;
    }

    mapping (address => bool) public authorized;
    address[] public authorities;

    event LogAuthorizedAddressAdded(address indexed target, address indexed caller);
    event LogAuthorizedAddressRemoved(address indexed target, address indexed caller);

    /*
     * Public functions
     */

    /// @dev Authorizes an address.
    /// @param target Address to authorize.
    function addAuthorizedAddress(address target)
        public
        onlyOwner
        targetNotAuthorized(target)
    {
        authorized[target] = true;
        authorities.push(target);
        emit LogAuthorizedAddressAdded(target, msg.sender);
    }

    /// @dev Removes authorizion of an address.
    /// @param target Address to remove authorization from.
    function removeAuthorizedAddress(address target)
        public
        onlyOwner
        targetAuthorized(target)
    {
        delete authorized[target];
        for (uint i = 0; i < authorities.length; i++) {
            if (authorities[i] == target) {
                authorities[i] = authorities[authorities.length - 1];
                authorities.length -= 1;
                break;
            }
        }
        emit LogAuthorizedAddressRemoved(target, msg.sender);
    }

    /// @dev Calls into ERC20 Token contract, invoking transferFrom.
    /// @param token Address of token to transfer.
    /// @param from Address to transfer token from.
    /// @param to Address to transfer token to.
    /// @param value Amount of token to transfer.
    /// @return Success of transfer.
    function transferFrom(
        address token,
        address from,
        address to,
        uint value)
        public
        onlyAuthorized
        returns (bool)
    {
        require(ERC20SafeTransfer.safeTransferFrom(token, from, to, value));
        return true;
    }

    /*
     * Public view functions
     */

    /// @dev Gets all authorized addresses.
    /// @return Array of authorized addresses.
    function getAuthorizedAddresses()
        public
        view
        returns (address[] memory)
    {
        return authorities;
    }
}

/**
 * @title Pausable
 * @dev Base contract which allows children to implement an emergency stop mechanism.
 */
contract Pausable is Ownable {
  event Paused();
  event Unpaused();

  bool private _paused = false;

  /**
   * @return true if the contract is paused, false otherwise.
   */
  function paused() public view returns (bool) {
    return _paused;
  }

  /**
   * @dev Modifier to make a function callable only when the contract is not paused.
   */
  modifier whenNotPaused() {
    require(!_paused, "Contract is paused.");
    _;
  }

  /**
   * @dev Modifier to make a function callable only when the contract is paused.
   */
  modifier whenPaused() {
    require(_paused, "Contract not paused.");
    _;
  }

  /**
   * @dev called by the owner to pause, triggers stopped state
   */
  function pause() public onlyOwner whenNotPaused {
    _paused = true;
    emit Paused();
  }

  /**
   * @dev called by the owner to unpause, returns to normal state
   */
  function unpause() public onlyOwner whenPaused {
    _paused = false;
    emit Unpaused();
  }
}

/**
 * @title SafeMath
 * @dev Math operations with safety checks that revert on error
 */
library SafeMath {

  /**
  * @dev Multiplies two numbers, reverts on overflow.
  */
  function mul(uint256 _a, uint256 _b) internal pure returns (uint256) {
    // Gas optimization: this is cheaper than requiring 'a' not being zero, but the
    // benefit is lost if 'b' is also tested.
    // See: https://github.com/OpenZeppelin/openzeppelin-solidity/pull/522
    if (_a == 0) {
      return 0;
    }

    uint256 c = _a * _b;
    require(c / _a == _b);

    return c;
  }

  /**
  * @dev Integer division of two numbers truncating the quotient, reverts on division by zero.
  */
  function div(uint256 _a, uint256 _b) internal pure returns (uint256) {
    require(_b > 0); // Solidity only automatically asserts when dividing by 0
    uint256 c = _a / _b;
    // assert(_a == _b * c + _a % _b); // There is no case in which this doesn't hold

    return c;
  }

  /**
  * @dev Subtracts two numbers, reverts on overflow (i.e. if subtrahend is greater than minuend).
  */
  function sub(uint256 _a, uint256 _b) internal pure returns (uint256) {
    require(_b <= _a);
    uint256 c = _a - _b;

    return c;
  }

  /**
  * @dev Adds two numbers, reverts on overflow.
  */
  function add(uint256 _a, uint256 _b) internal pure returns (uint256) {
    uint256 c = _a + _b;
    require(c >= _a);

    return c;
  }

  /**
  * @dev Divides two numbers and returns the remainder (unsigned integer modulo),
  * reverts when dividing by zero.
  */
  function mod(uint256 a, uint256 b) internal pure returns (uint256) {
    require(b != 0);
    return a % b;
  }
}

/**
 * @title Math
 * @dev Assorted math operations
 */

library Math {
  function max(uint256 a, uint256 b) internal pure returns (uint256) {
    return a >= b ? a : b;
  }

  function min(uint256 a, uint256 b) internal pure returns (uint256) {
    return a < b ? a : b;
  }

  function average(uint256 a, uint256 b) internal pure returns (uint256) {
    // (a + b) / 2 can overflow, so we distribute
    return (a / 2) + (b / 2) + ((a % 2 + b % 2) / 2);
  }
}

/*
    Modified Util contract as used by Kyber Network
*/

library Utils {

    uint256 constant internal PRECISION = (10**18);
    uint256 constant internal MAX_QTY   = (10**28); // 10B tokens
    uint256 constant internal MAX_RATE  = (PRECISION * 10**6); // up to 1M tokens per ETH
    uint256 constant internal MAX_DECIMALS = 18;
    uint256 constant internal ETH_DECIMALS = 18;
    uint256 constant internal MAX_UINT = 2**256-1;
    address constant internal ETH_ADDRESS = address(0x0);

    // Currently constants can't be accessed from other contracts, so providing functions to do that here
    function precision() internal pure returns (uint256) { return PRECISION; }
    function max_qty() internal pure returns (uint256) { return MAX_QTY; }
    function max_rate() internal pure returns (uint256) { return MAX_RATE; }
    function max_decimals() internal pure returns (uint256) { return MAX_DECIMALS; }
    function eth_decimals() internal pure returns (uint256) { return ETH_DECIMALS; }
    function max_uint() internal pure returns (uint256) { return MAX_UINT; }
    function eth_address() internal pure returns (address) { return ETH_ADDRESS; }

    /// @notice Retrieve the number of decimals used for a given ERC20 token
    /// @dev As decimals are an optional feature in ERC20, this contract uses `call` to
    /// ensure that an exception doesn't cause transaction failure
    /// @param token the token for which we should retrieve the decimals
    /// @return decimals the number of decimals in the given token
    function getDecimals(address token)
        internal
        returns (uint256 decimals)
    {
        bytes4 functionSig = bytes4(keccak256("decimals()"));

        /// @dev Using assembly due to issues with current solidity `address.call()`
        /// implementation: https://github.com/ethereum/solidity/issues/2884
        assembly {
            // Pointer to next free memory slot
            let ptr := mload(0x40)
            // Store functionSig variable at ptr
            mstore(ptr,functionSig)
            let functionSigLength := 0x04
            let wordLength := 0x20

            let success := call(
                                5000, // Amount of gas
                                token, // Address to call
                                0, // ether to send
                                ptr, // ptr to input data
                                functionSigLength, // size of data
                                ptr, // where to store output data (overwrite input)
                                wordLength // size of output data (32 bytes)
                               )

            switch success
            case 0 {
                decimals := 0 // If the token doesn't implement `decimals()`, return 0 as default
            }
            case 1 {
                decimals := mload(ptr) // Set decimals to return data from call
            }
            mstore(0x40,add(ptr,0x04)) // Reset the free memory pointer to the next known free location
        }
    }

    /// @dev Checks that a given address has its token allowance and balance set above the given amount
    /// @param tokenOwner the address which should have custody of the token
    /// @param tokenAddress the address of the token to check
    /// @param tokenAmount the amount of the token which should be set
    /// @param addressToAllow the address which should be allowed to transfer the token
    /// @return bool true if the allowance and balance is set, false if not
    function tokenAllowanceAndBalanceSet(
        address tokenOwner,
        address tokenAddress,
        uint256 tokenAmount,
        address addressToAllow
    )
        internal
        view
        returns (bool)
    {
        return (
            ERC20(tokenAddress).allowance(tokenOwner, addressToAllow) >= tokenAmount &&
            ERC20(tokenAddress).balanceOf(tokenOwner) >= tokenAmount
        );
    }

    function calcDstQty(uint srcQty, uint srcDecimals, uint dstDecimals, uint rate) internal pure returns (uint) {
        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) {

        //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
    }

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

    function calcSrcAmount(ERC20 src, ERC20 dest, uint destAmount, uint rate) internal returns (uint) {
        return calcSrcQty(destAmount, getDecimals(address(src)), getDecimals(address(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);
        }
    }

    /// @notice Bringing this in from the Math library as we've run out of space in TotlePrimary (see EIP-170)
    function min(uint256 a, uint256 b) internal pure returns (uint256) {
        return a < b ? a : b;
    }
}

contract Partner {

    address payable public partnerBeneficiary;
    uint256 public partnerPercentage; //This is out of 1 ETH, e.g. 0.5 ETH is 50% of the fee

    uint256 public companyPercentage;
    address payable public companyBeneficiary;

    event LogPayout(
        address[] tokens,
        uint256[] amount
    );

    function init(
        address payable _companyBeneficiary,
        uint256 _companyPercentage,
        address payable _partnerBeneficiary,
        uint256 _partnerPercentage
    ) public {
        require(companyBeneficiary == address(0x0) && partnerBeneficiary == address(0x0));
        companyBeneficiary = _companyBeneficiary;
        companyPercentage = _companyPercentage;
        partnerBeneficiary = _partnerBeneficiary;
        partnerPercentage = _partnerPercentage;
    }

    function payout(
        address[] memory tokens,
        uint256[] memory amounts
    ) public {
        // Payout both the partner and the company at the same time
        for(uint256 index = 0; index<tokens.length; index++){
            uint256 partnerAmount = SafeMath.div(SafeMath.mul(amounts[index], partnerPercentage), getTotalFeePercentage());
            uint256 companyAmount = amounts[index] - partnerAmount;
            if(tokens[index] == Utils.eth_address()){
                partnerBeneficiary.transfer(partnerAmount);
                companyBeneficiary.transfer(companyAmount);
            } else {
                ERC20SafeTransfer.safeTransfer(tokens[index], partnerBeneficiary, partnerAmount);
                ERC20SafeTransfer.safeTransfer(tokens[index], companyBeneficiary, companyAmount);
            }
        }
	emit LogPayout(tokens,amounts);
    }

    function getTotalFeePercentage() public view returns (uint256){
        return partnerPercentage + companyPercentage;
    }

    function() external payable {

    }
}

/// @title Interface for all exchange handler contracts
contract ExchangeHandler is Withdrawable, Pausable {

    /*
    *   State Variables
    */

    /* Logger public logger; */
    /*
    *   Modifiers
    */

    function performOrder(
        bytes memory genericPayload,
        uint256 availableToSpend,
        uint256 targetAmount,
        bool targetAmountIsSource
    )
        public
        payable
        returns (uint256 amountSpentOnOrder, uint256 amountReceivedFromOrder);

}

/// @title The primary contract for Totle
contract TotlePrimary is Withdrawable, Pausable {

    /*
    *   State Variables
    */

    TokenTransferProxy public tokenTransferProxy;
    mapping(address => bool) public signers;
    /* Logger public logger; */

    /*
    *   Types
    */

    // Structs
    struct Order {
        address payable exchangeHandler;
        bytes encodedPayload;
    }

    struct Trade {
        address sourceToken;
        address destinationToken;
        uint256 amount;
        bool isSourceAmount; //true if amount is sourceToken, false if it's destinationToken
        Order[] orders;
    }

    struct Swap {
        Trade[] trades;
        uint256 minimumExchangeRate;
        uint256 minimumDestinationAmount;
        uint256 sourceAmount;
        uint256 tradeToTakeFeeFrom;
        bool takeFeeFromSource; //Takes the fee before the trade if true, takes it after if false
        address payable redirectAddress;
        bool required;
    }

    struct SwapCollection {
        Swap[] swaps;
        address payable partnerContract;
        uint256 expirationBlock;
        bytes32 id;
        uint8 v;
        bytes32 r;
        bytes32 s;
    }

    struct TokenBalance {
        address tokenAddress;
        uint256 balance;
    }

    struct FeeVariables {
        uint256 feePercentage;
        Partner partner;
        uint256 totalFee;
    }

    struct AmountsSpentReceived{
        uint256 spent;
        uint256 received;
    }
    /*
    *   Events
    */

    event LogSwapCollection(
        bytes32 indexed id,
        address indexed partnerContract,
        address indexed user
    );

    event LogSwap(
        bytes32 indexed id,
        address sourceAsset,
        address destinationAsset,
        uint256 sourceAmount,
        uint256 destinationAmount,
        address feeAsset,
        uint256 feeAmount
    );

    /// @notice Constructor
    /// @param _tokenTransferProxy address of the TokenTransferProxy
    /// @param _signer the suggester's address that signs the payloads. More can be added with add/removeSigner functions
    constructor (address _tokenTransferProxy, address _signer/*, address _logger*/) public {
        tokenTransferProxy = TokenTransferProxy(_tokenTransferProxy);
        signers[_signer] = true;
        /* logger = Logger(_logger); */
    }

    /*
    *   Public functions
    */

    modifier notExpired(SwapCollection memory swaps) {
        require(swaps.expirationBlock > block.number, "Expired");
        _;
    }

    modifier validSignature(SwapCollection memory swaps){
        bytes32 hash = keccak256(abi.encode(swaps.swaps, swaps.partnerContract, swaps.expirationBlock, swaps.id, msg.sender));
        require(signers[ecrecover(keccak256(abi.encodePacked("\x19Ethereum Signed Message:\n32", hash)), swaps.v, swaps.r, swaps.s)], "Invalid signature");
        _;
    }

    /// @notice Performs the requested set of swaps
    /// @param swaps The struct that defines the collection of swaps to perform
    function performSwapCollection(
        SwapCollection memory swaps
    )
        public
        payable
        whenNotPaused
        notExpired(swaps)
        validSignature(swaps)
    {
        TokenBalance[20] memory balances;
        balances[0] = TokenBalance(address(Utils.eth_address()), msg.value);
        //this.log("Created eth balance", balances[0].balance, 0x0);
        for(uint256 swapIndex = 0; swapIndex < swaps.swaps.length; swapIndex++){
            //this.log("About to perform swap", swapIndex, swaps.id);
            performSwap(swaps.id, swaps.swaps[swapIndex], balances, swaps.partnerContract);
        }
        emit LogSwapCollection(swaps.id, swaps.partnerContract, msg.sender);
        transferAllTokensToUser(balances);
    }

    function addSigner(address newSigner) public onlyOwner {
         signers[newSigner] = true;
    }

    function removeSigner(address signer) public onlyOwner {
         signers[signer] = false;
    }

    /*
    *   Internal functions
    */


    function performSwap(
        bytes32 swapCollectionId,
        Swap memory swap,
        TokenBalance[20] memory balances,
        address payable partnerContract
    )
        internal
    {
        if(!transferFromSenderDifference(balances, swap.trades[0].sourceToken, swap.sourceAmount)){
            if(swap.required){
                revert("Failed to get tokens for swap");
            } else {
                return;
            }
        }
        uint256 amountSpentFirstTrade = 0;
        uint256 amountReceived = 0;
        uint256 feeAmount = 0;
        for(uint256 tradeIndex = 0; tradeIndex < swap.trades.length; tradeIndex++){
            if(tradeIndex == swap.tradeToTakeFeeFrom && swap.takeFeeFromSource){
                feeAmount = takeFee(balances, swap.trades[tradeIndex].sourceToken, partnerContract,tradeIndex==0 ? swap.sourceAmount : amountReceived);
            }
            uint256 tempSpent;
            //this.log("About to performTrade",0,0x0);
            (tempSpent, amountReceived) = performTrade(
                swap.trades[tradeIndex],
                balances,
                Utils.min(
                    tradeIndex == 0 ? swap.sourceAmount : amountReceived,
                    balances[findToken(balances, swap.trades[tradeIndex].sourceToken)].balance
                )
            );
            if(!swap.trades[tradeIndex].isSourceAmount && amountReceived < swap.trades[tradeIndex].amount){
                if(swap.required){
                    revert("Not enough destination amount");
                }
                return;
            }
            if(tradeIndex == 0){
                amountSpentFirstTrade = tempSpent;
                if(feeAmount != 0){
                    amountSpentFirstTrade += feeAmount;
                }
            }
            if(tradeIndex == swap.tradeToTakeFeeFrom && !swap.takeFeeFromSource){
                feeAmount = takeFee(balances, swap.trades[tradeIndex].destinationToken, partnerContract, amountReceived);
                amountReceived -= feeAmount;
            }
        }
        //this.log("About to emit LogSwap", 0, 0x0);
        emit LogSwap(
            swapCollectionId,
            swap.trades[0].sourceToken,
            swap.trades[swap.trades.length-1].destinationToken,
            amountSpentFirstTrade,
            amountReceived,
            swap.takeFeeFromSource?swap.trades[swap.tradeToTakeFeeFrom].sourceToken:swap.trades[swap.tradeToTakeFeeFrom].destinationToken,
            feeAmount
        );

        if(amountReceived < swap.minimumDestinationAmount){
            //this.log("Minimum destination amount failed", 0, 0x0);
            revert("Got less than minimumDestinationAmount");
        } else if (minimumRateFailed(swap.trades[0].sourceToken, swap.trades[swap.trades.length-1].destinationToken,swap.sourceAmount, amountReceived, swap.minimumExchangeRate)){
            //this.log("Minimum rate failed", 0, 0x0);
            revert("Minimum exchange rate not met");
        }
        if(swap.redirectAddress != msg.sender && swap.redirectAddress != address(0x0)){
            //this.log("About to redirect tokens", amountReceived, 0x0);
            uint256 destinationTokenIndex = findToken(balances,swap.trades[swap.trades.length-1].destinationToken);
            uint256 amountToSend = Math.min(amountReceived, balances[destinationTokenIndex].balance);
            transferTokens(balances, destinationTokenIndex, swap.redirectAddress, amountToSend);
            removeBalance(balances, swap.trades[swap.trades.length-1].destinationToken, amountToSend);
        }
    }

    function performTrade(
        Trade memory trade, 
        TokenBalance[20] memory balances,
        uint256 availableToSpend
    ) 
        internal returns (uint256 totalSpent, uint256 totalReceived)
    {
        uint256 tempSpent = 0;
        uint256 tempReceived = 0;
        for(uint256 orderIndex = 0; orderIndex < trade.orders.length; orderIndex++){
            if((availableToSpend - totalSpent) * 10000 < availableToSpend){
                break;
            } else if(!trade.isSourceAmount && tempReceived == trade.amount){
                break;
            } else if (trade.isSourceAmount && tempSpent == trade.amount){
                break;
            }
            //this.log("About to perform order", orderIndex,0x0);
            (tempSpent, tempReceived) = performOrder(
                trade.orders[orderIndex], 
                availableToSpend - totalSpent,
                trade.isSourceAmount ? availableToSpend - totalSpent : trade.amount - totalReceived, 
                trade.isSourceAmount,
                trade.sourceToken, 
                balances);
            //this.log("Order performed",0,0x0);
            totalSpent += tempSpent;
            totalReceived += tempReceived;
        }
        addBalance(balances, trade.destinationToken, tempReceived);
        removeBalance(balances, trade.sourceToken, tempSpent);
        //this.log("Trade performed",tempSpent, 0);
    }

    function performOrder(
        Order memory order, 
        uint256 availableToSpend,
        uint256 targetAmount,
        bool isSourceAmount,
        address tokenToSpend,
        TokenBalance[20] memory balances
    )
        internal returns (uint256 spent, uint256 received)
    {
        //this.log("Performing order", availableToSpend, 0x0);

        if(tokenToSpend == Utils.eth_address()){
            (spent, received) = ExchangeHandler(order.exchangeHandler).performOrder.value(availableToSpend)(order.encodedPayload, availableToSpend, targetAmount, isSourceAmount);

        } else {
            transferTokens(balances, findToken(balances, tokenToSpend), order.exchangeHandler, availableToSpend);
            (spent, received) = ExchangeHandler(order.exchangeHandler).performOrder(order.encodedPayload, availableToSpend, targetAmount, isSourceAmount);
        }
        //this.log("Performing order", spent,0x0);
        //this.log("Performing order", received,0x0);
    }

    function minimumRateFailed(
        address sourceToken,
        address destinationToken,
        uint256 sourceAmount,
        uint256 destinationAmount,
        uint256 minimumExchangeRate
    )
        internal returns(bool failed)
    {
        //this.log("About to get source decimals",sourceAmount,0x0);
        uint256 sourceDecimals = sourceToken == Utils.eth_address() ? 18 : Utils.getDecimals(sourceToken);
        //this.log("About to get destination decimals",destinationAmount,0x0);
        uint256 destinationDecimals = destinationToken == Utils.eth_address() ? 18 : Utils.getDecimals(destinationToken);
        //this.log("About to calculate amount got",0,0x0);
        uint256 rateGot = Utils.calcRateFromQty(sourceAmount, destinationAmount, sourceDecimals, destinationDecimals);
        //this.log("Minimum rate failed", rateGot, 0x0);
        return rateGot < minimumExchangeRate;
    }

    function takeFee(
        TokenBalance[20] memory balances,
        address token,
        address payable partnerContract,
        uint256 amountTraded
    )
        internal
        returns (uint256 feeAmount)
    {
        Partner partner = Partner(partnerContract);
        uint256 feePercentage = partner.getTotalFeePercentage();
        //this.log("Got fee percentage", feePercentage, 0x0);
        feeAmount = calculateFee(amountTraded, feePercentage);
        //this.log("Taking fee", feeAmount, 0);
        transferTokens(balances, findToken(balances, token), partnerContract, feeAmount);
        removeBalance(balances, findToken(balances, token), feeAmount);
        //this.log("Took fee", 0, 0x0);
        return feeAmount;
    }

    function transferFromSenderDifference(
        TokenBalance[20] memory balances,
        address token,
        uint256 sourceAmount
    )
        internal returns (bool)
    {
        if(token == Utils.eth_address()){
            if(sourceAmount>balances[0].balance){
                //this.log("Not enough eth", 0,0x0);
                return false;
            }
            //this.log("Enough eth", 0,0x0);
            return true;
        }

        uint256 tokenIndex = findToken(balances, token);
        if(sourceAmount>balances[tokenIndex].balance){
            //this.log("Transferring in token", 0,0x0);
            bool success;
            (success,) = address(tokenTransferProxy).call(abi.encodeWithSignature("transferFrom(address,address,address,uint256)", token, msg.sender, address(this), sourceAmount - balances[tokenIndex].balance));
            if(success){
                //this.log("Got enough token", 0,0x0);
                balances[tokenIndex].balance = sourceAmount;
                return true;
            }
            //this.log("Didn't get enough token", 0,0x0);
            return false;
        }
        return true;
    }

    function transferAllTokensToUser(
        TokenBalance[20] memory balances
    )
        internal
    {
        //this.log("About to transfer all tokens", 0, 0x0);
        for(uint256 balanceIndex = 0; balanceIndex < balances.length; balanceIndex++){
            if(balanceIndex != 0 && balances[balanceIndex].tokenAddress == address(0x0)){
                return;
            }
            //this.log("Transferring tokens", uint256(balances[balanceIndex].balance),0x0);
            transferTokens(balances, balanceIndex, msg.sender, balances[balanceIndex].balance);
        }
    }



    function transferTokens(
        TokenBalance[20] memory balances,
        uint256 tokenIndex,
        address payable destination,
        uint256 tokenAmount
    )
        internal
    {
        if(tokenAmount > 0){
            if(balances[tokenIndex].tokenAddress == Utils.eth_address()){
                destination.transfer(tokenAmount);
            } else {
                ERC20SafeTransfer.safeTransfer(balances[tokenIndex].tokenAddress, destination, tokenAmount);
            }
        }
    }

    function findToken(
        TokenBalance[20] memory balances,
        address token
    )
        internal pure returns (uint256)
    {
        for(uint256 index = 0; index < balances.length; index++){
            if(balances[index].tokenAddress == token){
                return index;
            } else if (index != 0 && balances[index].tokenAddress == address(0x0)){
                balances[index] = TokenBalance(token, 0);
                return index;
            }
        }
    }

    function addBalance(
        TokenBalance[20] memory balances,
        address tokenAddress,
        uint256 amountToAdd
    )
        internal
        pure
    {
        uint256 tokenIndex = findToken(balances, tokenAddress);
        addBalance(balances, tokenIndex, amountToAdd);
    }

    function addBalance(
        TokenBalance[20] memory balances,
        uint256 balanceIndex,
        uint256 amountToAdd
    )
        internal
        pure
    {
       balances[balanceIndex].balance += amountToAdd;
    }

    function removeBalance(
        TokenBalance[20] memory balances,
        address tokenAddress,
        uint256 amountToRemove
    )
        internal
        pure
    {
        uint256 tokenIndex = findToken(balances, tokenAddress);
        removeBalance(balances, tokenIndex, amountToRemove);
    }

    function removeBalance(
        TokenBalance[20] memory balances,
        uint256 balanceIndex,
        uint256 amountToRemove
    )
        internal
        pure
    {
        balances[balanceIndex].balance -= amountToRemove;
    }

    // @notice Calculates the fee amount given a fee percentage and amount
    // @param amount the amount to calculate the fee based on
    // @param fee the percentage, out of 1 eth (e.g. 0.01 ETH would be 1%)
    function calculateFee(uint256 amount, uint256 fee) internal pure returns (uint256){
        return SafeMath.div(SafeMath.mul(amount, fee), 1 ether);
    }

    /*
    *   Payable fallback function
    */

    /// @notice payable fallback to allow handler or exchange contracts to return ether
    /// @dev only accounts containing code (ie. contracts) can send ether to contract
    function() external payable whenNotPaused {
        // Check in here that the sender is a contract! (to stop accidents)
        uint256 size;
        address sender = msg.sender;
        assembly {
            size := extcodesize(sender)
        }
        if (size == 0) {
            revert("EOA cannot send ether to primary fallback");
        }
    }
    event Log(string a, uint256 b, bytes32 c);

    function log(string memory a, uint256 b, bytes32 c) public {
        emit Log(a,b,c);
    }
}

Contract Security Audit

Contract ABI

[{"constant":false,"inputs":[{"name":"signer","type":"address"}],"name":"removeSigner","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"tokenTransferProxy","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[],"name":"unpause","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"paused","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[],"name":"renounceOwnership","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"name":"","type":"address"}],"name":"signers","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[],"name":"pause","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"owner","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_token","type":"address"},{"name":"_amount","type":"uint256"}],"name":"withdrawToken","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"components":[{"components":[{"components":[{"name":"sourceToken","type":"address"},{"name":"destinationToken","type":"address"},{"name":"amount","type":"uint256"},{"name":"isSourceAmount","type":"bool"},{"components":[{"name":"exchangeHandler","type":"address"},{"name":"encodedPayload","type":"bytes"}],"name":"orders","type":"tuple[]"}],"name":"trades","type":"tuple[]"},{"name":"minimumExchangeRate","type":"uint256"},{"name":"minimumDestinationAmount","type":"uint256"},{"name":"sourceAmount","type":"uint256"},{"name":"tradeToTakeFeeFrom","type":"uint256"},{"name":"takeFeeFromSource","type":"bool"},{"name":"redirectAddress","type":"address"},{"name":"required","type":"bool"}],"name":"swaps","type":"tuple[]"},{"name":"partnerContract","type":"address"},{"name":"expirationBlock","type":"uint256"},{"name":"id","type":"bytes32"},{"name":"v","type":"uint8"},{"name":"r","type":"bytes32"},{"name":"s","type":"bytes32"}],"name":"swaps","type":"tuple"}],"name":"performSwapCollection","outputs":[],"payable":true,"stateMutability":"payable","type":"function"},{"constant":false,"inputs":[{"name":"newSigner","type":"address"}],"name":"addSigner","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"_amount","type":"uint256"}],"name":"withdrawETH","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"_newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"a","type":"string"},{"name":"b","type":"uint256"},{"name":"c","type":"bytes32"}],"name":"log","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"inputs":[{"name":"_tokenTransferProxy","type":"address"},{"name":"_signer","type":"address"}],"payable":false,"stateMutability":"nonpayable","type":"constructor"},{"payable":true,"stateMutability":"payable","type":"fallback"},{"anonymous":false,"inputs":[{"indexed":true,"name":"id","type":"bytes32"},{"indexed":true,"name":"partnerContract","type":"address"},{"indexed":true,"name":"user","type":"address"}],"name":"LogSwapCollection","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"id","type":"bytes32"},{"indexed":false,"name":"sourceAsset","type":"address"},{"indexed":false,"name":"destinationAsset","type":"address"},{"indexed":false,"name":"sourceAmount","type":"uint256"},{"indexed":false,"name":"destinationAmount","type":"uint256"},{"indexed":false,"name":"feeAsset","type":"address"},{"indexed":false,"name":"feeAmount","type":"uint256"}],"name":"LogSwap","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"name":"a","type":"string"},{"indexed":false,"name":"b","type":"uint256"},{"indexed":false,"name":"c","type":"bytes32"}],"name":"Log","type":"event"},{"anonymous":false,"inputs":[],"name":"Paused","type":"event"},{"anonymous":false,"inputs":[],"name":"Unpaused","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"previousOwner","type":"address"}],"name":"OwnershipRenounced","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"previousOwner","type":"address"},{"indexed":true,"name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"}]

608060405260008054600160a01b60ff02191690553480156200002157600080fd5b50604051604080620027c18339810180604052620000439190810190620000a2565b60008054336001600160a01b0319918216178255600180549091166001600160a01b0394851617815591909216825260026020526040909120805460ff1916909117905562000100565b60006200009b8251620000e1565b9392505050565b60008060408385031215620000b657600080fd5b6000620000c485856200008d565b9250506020620000d7858286016200008d565b9150509250929050565b6000620000ee82620000f4565b92915050565b6001600160a01b031690565b6126b180620001106000396000f3fe6080604052600436106100dd5760003560e01c80638da5cb5b1161007f578063eb12d61e11610059578063eb12d61e1461025e578063f14210a61461027e578063f2fde38b1461029e578063faa6a1b9146102be576100dd565b80638da5cb5b146102095780639e281a981461022b578063a32305a21461024b576100dd565b80635c975abb116100bb5780635c975abb1461019d578063715018a6146101bf578063736c0d5b146101d45780638456cb59146101f4576100dd565b80630e316ab71461013b5780630eefdbad1461015d5780633f4ba83a14610188575b600054600160a01b900460ff161561011357604051600160e51b62461bcd02815260040161010a9061254d565b60405180910390fd5b33803b908161013757604051600160e51b62461bcd02815260040161010a906124fd565b5050005b34801561014757600080fd5b5061015b610156366004611b6f565b6102de565b005b34801561016957600080fd5b50610172610316565b60405161017f91906124a2565b60405180910390f35b34801561019457600080fd5b5061015b610325565b3480156101a957600080fd5b506101b26103af565b60405161017f9190612432565b3480156101cb57600080fd5b5061015b6103bf565b3480156101e057600080fd5b506101b26101ef366004611b6f565b61042b565b34801561020057600080fd5b5061015b610440565b34801561021557600080fd5b5061021e6104d1565b60405161017f9190612329565b34801561023757600080fd5b506101b2610246366004611b8d565b6104e0565b61015b610259366004611c2b565b610519565b34801561026a57600080fd5b5061015b610279366004611b6f565b610732565b34801561028a57600080fd5b5061015b610299366004611c60565b61076d565b3480156102aa57600080fd5b5061015b6102b9366004611b6f565b6107c1565b3480156102ca57600080fd5b5061015b6102d9366004611bc7565b6107e4565b6000546001600160a01b031633146102f557600080fd5b6001600160a01b03166000908152600260205260409020805460ff19169055565b6001546001600160a01b031681565b6000546001600160a01b0316331461033c57600080fd5b600054600160a01b900460ff1661036857604051600160e51b62461bcd02815260040161010a906124dd565b6000805474ff0000000000000000000000000000000000000000191681556040517fa45f47fdea8a1efdd9029a5691c7f759c32b7c698632b563573e155625d169339190a1565b600054600160a01b900460ff1690565b6000546001600160a01b031633146103d657600080fd5b600080546040516001600160a01b03909116917ff8df31144d9c2f0f6b59d69b8b98abd5459d07f2742c4df920b25aae33c6482091a26000805473ffffffffffffffffffffffffffffffffffffffff19169055565b60026020526000908152604090205460ff1681565b6000546001600160a01b0316331461045757600080fd5b600054600160a01b900460ff161561048457604051600160e51b62461bcd02815260040161010a9061254d565b6000805474ff00000000000000000000000000000000000000001916600160a01b1781556040517f9e87fac88ff661f02d44f95383c817fece4bce600a3dab7a54406878b965e7529190a1565b6000546001600160a01b031681565b600080546001600160a01b031633146104f857600080fd5b6000546105109084906001600160a01b031684610824565b90505b92915050565b600054600160a01b900460ff161561054657604051600160e51b62461bcd02815260040161010a9061254d565b804381604001511161056d57604051600160e51b62461bcd02815260040161010a9061256d565b8160008160000151826020015183604001518460600151336040516020016105999594939291906123e1565b604051602081830303815290604052805190602001209050600260006001836040516020016105c891906122fe565b6040516020818303038152906040528051906020012085608001518660a001518760c001516040516000815260200160405260405161060a9493929190612440565b6020604051602081039080840390855afa15801561062c573d6000803e3d6000fd5b505060408051601f1901516001600160a01b03168352602083019390935250016000205460ff1661067257604051600160e51b62461bcd02815260040161010a9061250d565b61067a6116e5565b604051806040016040528061068d610920565b6001600160a01b0316815234602090910152815260005b8551518110156106e1576106d98660600151876000015183815181106106c657fe5b6020026020010151848960200151610925565b6001016106a4565b506020850151606086015160405133926001600160a01b031691907fc3dcfccc2c1c6fe2a908d1825ba2e62b5b2d61a6b9c500791f75cdc538bdeb9d90600090a461072b81610d4b565b5050505050565b6000546001600160a01b0316331461074957600080fd5b6001600160a01b03166000908152600260205260409020805460ff19166001179055565b6000546001600160a01b0316331461078457600080fd5b600080546040516001600160a01b039091169183156108fc02918491818181858888f193505050501580156107bd573d6000803e3d6000fd5b5050565b6000546001600160a01b031633146107d857600080fd5b6107e181610db3565b50565b7fcc410ffa3e9942e8763e877fc47f77578aaff21d03fac001ec2568600a4919c1838383604051610817939291906124b0565b60405180910390a1505050565b6000836001600160a01b031683836040516024016108439291906123c6565b60408051601f198184030181529181526020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fa9059cbb00000000000000000000000000000000000000000000000000000000179052516108a691906122f2565b6000604051808303816000865af19150503d80600081146108e3576040519150601f19603f3d011682016040523d82523d6000602084013e6108e8565b606091505b5050809150508061090e57604051600160e51b62461bcd02815260040161010a906124ed565b610916610e2e565b90505b9392505050565b600090565b61095082846000015160008151811061093a57fe5b6020026020010151600001518560600151610e5d565b61097e578260e001511561097957604051600160e51b62461bcd02815260040161010a9061252d565b610d45565b60008080805b865151811015610b3a578660800151811480156109a257508660a001515b156109e4576109e186886000015183815181106109bb57fe5b60200260200101516000015187846000146109d657866109dc565b8a606001515b610fee565b91505b6000610a5c886000015183815181106109f957fe5b602002602001015188610a5785600014610a135787610a19565b8b606001515b8b610a3f8d8f600001518a81518110610a2e57fe5b6020026020010151600001516110a9565b60148110610a4957fe5b60200201516020015161115c565b611172565b8951805191965091925083908110610a7057fe5b602002602001015160600151158015610aa157508751805183908110610a9257fe5b60200260200101516040015184105b15610ad5578760e0015115610acb57604051600160e51b62461bcd02815260040161010a9061255d565b5050505050610d45565b81610ae8579350838215610ae857938201935b876080015182148015610afd57508760a00151155b15610b3157610b298789600001518481518110610b1657fe5b6020026020010151602001518887610fee565b925082840393505b50600101610984565b50867f7c396f87ca37e7dab636d7ffad74fe2ef4729fda118a0a2c105bf74f4890437f8760000151600081518110610b6e57fe5b602090810291909101015151885180516000198101908110610b8c57fe5b60200260200101516020015186868b60a00151610bc5578b5160808d015181518110610bb457fe5b602002602001015160200151610be3565b8b5160808d015181518110610bd657fe5b6020026020010151600001515b87604051610bf69695949392919061236c565b60405180910390a28560400151821015610c2557604051600160e51b62461bcd02815260040161010a9061253d565b610c738660000151600081518110610c3957fe5b602090810291909101015151875180516000198101908110610c5757fe5b6020026020010151602001518860600151858a60200151611258565b15610c9357604051600160e51b62461bcd02815260040161010a9061251d565b60c08601516001600160a01b03163314801590610cbc575060c08601516001600160a01b031615155b15610d415785518051600091610cee918891906000198101908110610cdd57fe5b6020026020010151602001516110a9565b90506000610d0284888460148110610a4957fe5b9050610d1487838a60c00151846112e2565b87518051610d3e9189916000198101908110610d2c57fe5b60200260200101516020015183611372565b50505b5050505b50505050565b60005b60148110156107bd578015801590610d8057506000828260148110610d6f57fe5b6020020151516001600160a01b0316145b15610d8b57506107e1565b610dab828233858560148110610d9d57fe5b6020020151602001516112e2565b600101610d4e565b6001600160a01b038116610dc657600080fd5b600080546040516001600160a01b03808516939216917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e091a36000805473ffffffffffffffffffffffffffffffffffffffff19166001600160a01b0392909216919091179055565b60003d8015610e445760208114610e4d57600080fd5b60019150610e59565b60206000803e60005191505b5090565b6000610e67610920565b6001600160a01b0316836001600160a01b03161415610e9d57835160200151821115610e9557506000610919565b506001610919565b6000610ea985856110a9565b9050848160148110610eb757fe5b602002015160200151831115610fe3576001546000906001600160a01b0316853330898660148110610ee557fe5b6020020151602001518803604051602401610f039493929190612337565b60408051601f198184030181529181526020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167f15dacbea0000000000000000000000000000000000000000000000000000000017905251610f6691906122f2565b6000604051808303816000865af19150503d8060008114610fa3576040519150601f19603f3d011682016040523d82523d6000602084013e610fa8565b606091505b50909150508015610fd85783868360148110610fc057fe5b60200201516020018181525050600192505050610919565b600092505050610919565b506001949350505050565b6000808390506000816001600160a01b031663064367bb6040518163ffffffff1660e01b815260040160206040518083038186803b15801561102f57600080fd5b505afa158015611043573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052506110679190810190611c7e565b9050611073848261138b565b925061108a8761108389896110a9565b87866112e2565b61109e8761109889896110a9565b856113a8565b50505b949350505050565b6000805b601481101561115557826001600160a01b03168482601481106110cc57fe5b6020020151516001600160a01b031614156110e8579050610513565b80158015906111115750600084826014811061110057fe5b6020020151516001600160a01b0316145b1561114d576040518060400160405280846001600160a01b03168152602001600081525084826014811061114157fe5b60200201529050610513565b6001016110ad565b5092915050565b600081831061116b5781610510565b5090919050565b6000808080805b87608001515181101561122f57858587036127100210156111995761122f565b87606001511580156111ae5750876040015182145b156111b85761122f565b876060015180156111cc5750876040015183145b156111d65761122f565b61121a886080015182815181106111e957fe5b60200260200101518688038a6060015161120957868b604001510361120d565b8789035b60608c01518c518c6113cd565b95810195948501949093509150600101611179565b5061123f86886020015183611569565b61124e86886000015184611372565b5050935093915050565b600080611263610920565b6001600160a01b0316876001600160a01b0316146112895761128487611582565b61128c565b60125b90506000611298610920565b6001600160a01b0316876001600160a01b0316146112be576112b987611582565b6112c1565b60125b905060006112d1878785856115e0565b851193505050505b95945050505050565b8015610d45576112f0610920565b6001600160a01b031684846014811061130557fe5b6020020151516001600160a01b03161415611356576040516001600160a01b0383169082156108fc029083906000818181858888f19350505050158015611350573d6000803e3d6000fd5b50610d45565b61072b84846014811061136557fe5b6020020151518383610824565b600061137e84846110a9565b9050610d458482846113a8565b600061051061139a8484611677565b670de0b6b3a764000061169e565b808383601481106113b557fe5b60200201516020018181510391508181525050505050565b6000806113d8610920565b6001600160a01b0316846001600160a01b031614156114a057875160208901516040517f0345c2a60000000000000000000000000000000000000000000000000000000081526001600160a01b0390921691630345c2a6918a91611445919083908c908c90600401612468565b60408051808303818588803b15801561145d57600080fd5b505af1158015611471573d6000803e3d6000fd5b50505050506040513d601f19601f820116820180604052506114969190810190611c9c565b909250905061155e565b6114b6836114ae85876110a9565b8a518a6112e2565b875160208901516040517f0345c2a60000000000000000000000000000000000000000000000000000000081526001600160a01b0390921691630345c2a691611507918b908b908b90600401612468565b6040805180830381600087803b15801561152057600080fd5b505af1158015611534573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052506115589190810190611c9c565b90925090505b965096945050505050565b600061157584846110a9565b9050610d458482846116c0565b6000806040516115919061231e565b6040519081900381208082529150600460208083838160008a611388f18080156115c257600181146115cb576115d0565b600096506115d0565b845196505b5050505060040160405250919050565b60006b204fce5e3e250261100000008511156115fb57600080fd5b6b204fce5e3e2502611000000084111561161457600080fd5b82821061164d576012838303111561162b57600080fd5b84838303600a0a02670de0b6b3a764000085028161164557fe5b0490506110a1565b6012828403111561165d57600080fd5b84828403600a0a670de0b6b3a76400008602028161164557fe5b60008261168657506000610513565b8282028284828161169357fe5b041461051057600080fd5b60008082116116ac57600080fd5b60008284816116b757fe5b04949350505050565b808383601481106116cd57fe5b60200201516020018181510191508181525050505050565b6040518061050001604052806014905b6116fd611713565b8152602001906001900390816116f55790505090565b604080518082019091526000808252602082015290565b60006105108235612605565b600082601f83011261174757600080fd5b813561175a611755826125a4565b61257d565b81815260209384019390925082018360005b83811015611798578135860161178288826118c3565b845250602092830192919091019060010161176c565b5050505092915050565b600082601f8301126117b357600080fd5b81356117c1611755826125a4565b81815260209384019390925082018360005b8381101561179857813586016117e988826119e4565b84525060209283019291909101906001016117d3565b600082601f83011261181057600080fd5b813561181e611755826125a4565b81815260209384019390925082018360005b8381101561179857813586016118468882611abc565b8452506020928301929190910190600101611830565b60006105108235612610565b60006105108235612615565b600082601f83011261188557600080fd5b8135611893611755826125c5565b915080825260208301602083018583830111156118af57600080fd5b6118ba838284612635565b50505092915050565b6000604082840312156118d557600080fd5b6118df604061257d565b905060006118ed848461172a565b825250602082013567ffffffffffffffff81111561190a57600080fd5b61191684828501611874565b60208301525092915050565b600060e0828403121561193457600080fd5b61193e60e061257d565b9050813567ffffffffffffffff81111561195757600080fd5b611963848285016117a2565b82525060206119748484830161172a565b602083015250604061198884828501611868565b604083015250606061199c84828501611868565b60608301525060806119b084828501611b63565b60808301525060a06119c484828501611868565b60a08301525060c06119d884828501611868565b60c08301525092915050565b600061010082840312156119f757600080fd5b611a0261010061257d565b9050813567ffffffffffffffff811115611a1b57600080fd5b611a27848285016117ff565b8252506020611a3884848301611868565b6020830152506040611a4c84828501611868565b6040830152506060611a6084828501611868565b6060830152506080611a7484828501611868565b60808301525060a0611a888482850161185c565b60a08301525060c0611a9c8482850161172a565b60c08301525060e0611ab08482850161185c565b60e08301525092915050565b600060a08284031215611ace57600080fd5b611ad860a061257d565b90506000611ae6848461172a565b8252506020611af78484830161172a565b6020830152506040611b0b84828501611868565b6040830152506060611b1f8482850161185c565b606083015250608082013567ffffffffffffffff811115611b3f57600080fd5b611b4b84828501611736565b60808301525092915050565b60006105108251612615565b60006105108235612624565b600060208284031215611b8157600080fd5b60006110a1848461172a565b60008060408385031215611ba057600080fd5b6000611bac858561172a565b9250506020611bbd85828601611868565b9150509250929050565b600080600060608486031215611bdc57600080fd5b833567ffffffffffffffff811115611bf357600080fd5b611bff86828701611874565b9350506020611c1086828701611868565b9250506040611c2186828701611868565b9150509250925092565b600060208284031215611c3d57600080fd5b813567ffffffffffffffff811115611c5457600080fd5b6110a184828501611922565b600060208284031215611c7257600080fd5b60006110a18484611868565b600060208284031215611c9057600080fd5b60006110a18484611b57565b60008060408385031215611caf57600080fd5b6000611cbb8585611b57565b9250506020611bbd85828601611b57565b600061051083836121b0565b600061051083836121dc565b60006105108383612284565b611cf981612605565b82525050565b6000611d0a826125f3565b611d1481856125f7565b935083602082028501611d26856125ed565b60005b84811015611d5d578383038852611d41838351611ccc565b9250611d4c826125ed565b602098909801979150600101611d29565b50909695505050505050565b6000611d74826125f3565b611d7e81856125f7565b935083602082028501611d90856125ed565b60005b84811015611d5d578383038852611dab838351611cd8565b9250611db6826125ed565b602098909801979150600101611d93565b6000611dd2826125f3565b611ddc81856125f7565b935083602082028501611dee856125ed565b60005b84811015611d5d578383038852611e09838351611ce4565b9250611e14826125ed565b602098909801979150600101611df1565b611cf981612610565b611cf981612615565b611cf9611e4382612615565b612615565b6000611e53826125f3565b611e5d8185612600565b9350611e6d818560208601612641565b9290920192915050565b6000611e82826125f3565b611e8c81856125f7565b9350611e9c818560208601612641565b611ea58161266d565b9093019392505050565b611cf98161262a565b6000611ec56014836125f7565b7f436f6e7472616374206e6f74207061757365642e000000000000000000000000815260200192915050565b6000611efe601c83612600565b7f19457468657265756d205369676e6564204d6573736167653a0a3332000000008152601c0192915050565b6000611f37600f836125f7565b7f5472616e73666572206661696c65640000000000000000000000000000000000815260200192915050565b6000611f70600a83612600565b7f646563696d616c732829000000000000000000000000000000000000000000008152600a0192915050565b6000611fa96029836125f7565b7f454f412063616e6e6f742073656e6420657468657220746f207072696d61727981527f2066616c6c6261636b0000000000000000000000000000000000000000000000602082015260400192915050565b60006120086011836125f7565b7f496e76616c6964207369676e6174757265000000000000000000000000000000815260200192915050565b6000612041601d836125f7565b7f4d696e696d756d2065786368616e67652072617465206e6f74206d6574000000815260200192915050565b600061207a601d836125f7565b7f4661696c656420746f2067657420746f6b656e7320666f722073776170000000815260200192915050565b60006120b36026836125f7565b7f476f74206c657373207468616e206d696e696d756d44657374696e6174696f6e81527f416d6f756e740000000000000000000000000000000000000000000000000000602082015260400192915050565b60006121126013836125f7565b7f436f6e7472616374206973207061757365642e00000000000000000000000000815260200192915050565b600061214b601d836125f7565b7f4e6f7420656e6f7567682064657374696e6174696f6e20616d6f756e74000000815260200192915050565b60006121846007836125f7565b7f4578706972656400000000000000000000000000000000000000000000000000815260200192915050565b805160009060408401906121c48582611cf0565b50602083015184820360208601526112d98282611e77565b8051610100808452600091908401906121f58282611dc7565b915050602083015161220a6020860182611e2e565b50604083015161221d6040860182611e2e565b5060608301516122306060860182611e2e565b5060808301516122436080860182611e2e565b5060a083015161225660a0860182611e25565b5060c083015161226960c0860182611cf0565b5060e083015161227c60e0860182611e25565b509392505050565b805160009060a08401906122988582611cf0565b5060208301516122ab6020860182611cf0565b5060408301516122be6040860182611e2e565b5060608301516122d16060860182611e25565b50608083015184820360808601526112d98282611cff565b611cf981612624565b60006109198284611e48565b600061230982611ef1565b91506123158284611e37565b50602001919050565b600061051382611f63565b602081016105138284611cf0565b608081016123458287611cf0565b6123526020830186611cf0565b61235f6040830185611cf0565b6112d96060830184611e2e565b60c0810161237a8289611cf0565b6123876020830188611cf0565b6123946040830187611e2e565b6123a16060830186611e2e565b6123ae6080830185611cf0565b6123bb60a0830184611e2e565b979650505050505050565b604081016123d48285611cf0565b6109196020830184611e2e565b60a080825281016123f28188611d69565b90506124016020830187611cf0565b61240e6040830186611e2e565b61241b6060830185611e2e565b6124286080830184611cf0565b9695505050505050565b602081016105138284611e25565b6080810161244e8287611e2e565b61245b60208301866122e9565b61235f6040830185611e2e565b608080825281016124798187611e77565b90506124886020830186611e2e565b6124956040830185611e2e565b6112d96060830184611e25565b602081016105138284611eaf565b606080825281016124c18186611e77565b90506124d06020830185611e2e565b6110a16040830184611e2e565b6020808252810161051381611eb8565b6020808252810161051381611f2a565b6020808252810161051381611f9c565b6020808252810161051381611ffb565b6020808252810161051381612034565b602080825281016105138161206d565b60208082528101610513816120a6565b6020808252810161051381612105565b602080825281016105138161213e565b6020808252810161051381612177565b60405181810167ffffffffffffffff8111828210171561259c57600080fd5b604052919050565b600067ffffffffffffffff8211156125bb57600080fd5b5060209081020190565b600067ffffffffffffffff8211156125dc57600080fd5b506020601f91909101601f19160190565b60200190565b5190565b90815260200190565b919050565b600061051382612618565b151590565b90565b6001600160a01b031690565b60ff1690565b600061051382612605565b82818337506000910152565b60005b8381101561265c578181015183820152602001612644565b83811115610d455750506000910152565b601f01601f19169056fea265627a7a72305820c860ff8c74e1bc9b8d320509a2026e1c5e94775e298aff93f7d8b3aec79313af6c6578706572696d656e74616cf5003700000000000000000000000074758acfce059f503a7e6b0fc2c8737600f9f2c4000000000000000000000000c2d7cf95645d33006175b78989035c7c9061d3f9

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

00000000000000000000000074758acfce059f503a7e6b0fc2c8737600f9f2c4000000000000000000000000c2d7cf95645d33006175b78989035c7c9061d3f9

-----Decoded View---------------
Arg [0] : _tokenTransferProxy (address): 0x74758AcFcE059f503a7E6B0fC2c8737600f9F2c4
Arg [1] : _signer (address): 0xC2D7CF95645D33006175B78989035C7c9061d3F9

-----Encoded View---------------
2 Constructor Arguments found :
Arg [0] : 00000000000000000000000074758acfce059f503a7e6b0fc2c8737600f9f2c4
Arg [1] : 000000000000000000000000c2d7cf95645d33006175b78989035c7c9061d3f9


Deployed ByteCode Sourcemap

21034:17043:0:-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;9148:7;;-1:-1:-1;;;9148:7:0;;;;9147:8;9139:40;;;;-1:-1:-1;;;;;9139:40:0;;;;;;;;;;;;;;;;;37732:10;37785:19;;;37829:9;37825:93;;37855:51;;-1:-1:-1;;;;;37855:51:0;;;;;;;;37825:93;9186:1;;21034:17043;25011:98;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;25011:98:0;;;;;;;;:::i;:::-;;21134:44;;8:9:-1;5:2;;;30:1;27;20:12;5:2;21134:44:0;;;:::i;:::-;;;;;;;;;;;;;;;;9644:97;;8:9:-1;5:2;;;30:1;27;20:12;5:2;9644:97:0;;;:::i;8929:72::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;8929:72:0;;;:::i;:::-;;;;;;;;1081:114;;8:9:-1;5:2;;;30:1;27;20:12;5:2;1081:114:0;;;:::i;21185:39::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;21185:39:0;;;;;;;;:::i;9462:95::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;9462:95:0;;;:::i;278:28::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;278:28:0;;;:::i;:::-;;;;;;;;3768:170;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;3768:170:0;;;;;;;;:::i;24122:773::-;;;;;;;;;:::i;24903:100::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;24903:100:0;;;;;;;;:::i;4189:99::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;4189:99:0;;;;;;;;:::i;1363:113::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;1363:113:0;;;;;;;;:::i;37981:93::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;37981:93:0;;;;;;;;:::i;25011:98::-;789:5;;-1:-1:-1;;;;;789:5:0;775:10;:19;767:28;;;;;;-1:-1:-1;;;;;25078:15:0;25096:5;25078:15;;;:7;:15;;;;;:23;;-1:-1:-1;;25078:23:0;;;25011:98::o;21134:44::-;;;-1:-1:-1;;;;;21134:44:0;;:::o;9644:97::-;789:5;;-1:-1:-1;;;;;789:5:0;775:10;:19;767:28;;;;;;9332:7;;-1:-1:-1;;;9332:7:0;;;;9324:40;;;;-1:-1:-1;;;;;9324:40:0;;;;;;;;;9708:5;9698:15;;-1:-1:-1;;9698:15:0;;;9725:10;;;;9708:5;9725:10;9644:97::o;8929:72::-;8968:4;8988:7;-1:-1:-1;;;8988:7:0;;;;;8929:72::o;1081:114::-;789:5;;-1:-1:-1;;;;;789:5:0;775:10;:19;767:28;;;;;;1158:5;;;1139:25;;-1:-1:-1;;;;;1158:5:0;;;;1139:25;;;1187:1;1171:18;;-1:-1:-1;;1171:18:0;;;1081:114::o;21185:39::-;;;;;;;;;;;;;;;:::o;9462:95::-;789:5;;-1:-1:-1;;;;;789:5:0;775:10;:19;767:28;;;;;;9148:7;;-1:-1:-1;;;9148:7:0;;;;9147:8;9139:40;;;;-1:-1:-1;;;;;9139:40:0;;;;;;;;;9517:7;:14;;-1:-1:-1;;9517:14:0;-1:-1:-1;;;9517:14:0;;;9543:8;;;;9517:7;9543:8;9462:95::o;278:28::-;;;-1:-1:-1;;;;;278:28:0;;:::o;3768:170::-;3852:4;789:5;;-1:-1:-1;;;;;789:5:0;775:10;:19;767:28;;;;;;3915:5;;3876:54;;3907:6;;-1:-1:-1;;;;;3915:5:0;3922:7;3876:30;:54::i;:::-;3869:61;;802:1;3768:170;;;;:::o;24122:773::-;9148:7;;-1:-1:-1;;;9148:7:0;;;;9147:8;9139:40;;;;-1:-1:-1;;;;;9139:40:0;;;;;;;;;24274:5;23571:12;23547:5;:21;;;:36;23539:56;;;;-1:-1:-1;;;;;23539:56:0;;;;;;;;;24305:5;23686:12;23722:5;:11;;;23735:5;:21;;;23758:5;:21;;;23781:5;:8;;;23791:10;23711:91;;;;;;;;;;;;;;;;49:4:-1;39:7;30;26:21;22:32;13:7;6:49;23711:91:0;;;23701:102;;;;;;23686:117;;23822:7;:116;23830:107;23903:4;23850:58;;;;;;;;;;;;49:4:-1;39:7;30;26:21;22:32;13:7;6:49;23850:58:0;;;23840:69;;;;;;23911:5;:7;;;23920:5;:7;;;23929:5;:7;;;23830:107;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;-1:-1;;23830:107:0;;;-1:-1:-1;;23830:107:0;;-1:-1:-1;;;;;23822:116:0;;;23830:107;23822:116;;;;;;-1:-1:-1;23822:116:0;-1:-1:-1;23822:116:0;;;;23814:146;;;;-1:-1:-1;;;;;23814:146:0;;;;;;;;;24328:32;;:::i;:::-;24385:53;;;;;;;;24406:19;:17;:19::i;:::-;-1:-1:-1;;;;;24385:53:0;;;24428:9;24385:53;;;;;24371:67;;-1:-1:-1;24519:247:0;24558:11;;:18;24546:30;;24519:247;;;24676:78;24688:5;:8;;;24698:5;:11;;;24710:9;24698:22;;;;;;;;;;;;;;24722:8;24732:5;:21;;;24676:11;:78::i;:::-;24578:11;;24519:247;;;-1:-1:-1;24809:21:0;;;;24799:8;;;;24781:62;;24832:10;;-1:-1:-1;;;;;24781:62:0;;24799:8;24781:62;;;;;24854:33;24878:8;24854:23;:33::i;:::-;23971:1;23606;;9186;24122:773;:::o;24903:100::-;789:5;;-1:-1:-1;;;;;789:5:0;775:10;:19;767:28;;;;;;-1:-1:-1;;;;;24970:18:0;;;;;:7;:18;;;;;:25;;-1:-1:-1;;24970:25:0;24991:4;24970:25;;;24903:100::o;4189:99::-;789:5;;-1:-1:-1;;;;;789:5:0;775:10;:19;767:28;;;;;;4257:5;;;:23;;-1:-1:-1;;;;;4257:5:0;;;;:23;;;;;4272:7;;4257:23;:5;:23;4272:7;4257:5;:23;;;;;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;4257:23:0;4189:99;:::o;1363:113::-;789:5;;-1:-1:-1;;;;;789:5:0;775:10;:19;767:28;;;;;;1441:29;1460:9;1441:18;:29::i;:::-;1363:113;:::o;37981:93::-;38056:10;38060:1;38062;38064;38056:10;;;;;;;;;;;;;;;;;37981:93;;;:::o;1840:306::-;1932:12;1970:13;-1:-1:-1;;;;;1970:18:0;2042:3;2047:6;1989:65;;;;;;;;;;;;;;-1:-1:-1;;26:21;;;22:32;6:49;;1989:65:0;;;49:4:-1;25:18;;61:17;;1989:65:0;182:15:-1;1989:65:0;179:29:-1;160:49;;1970:85:0;;;1989:65;1970:85;;;;;;;;;;;;;;;;;;14:1:-1;21;16:31;;;;75:4;69:11;64:16;;144:4;140:9;133:4;115:16;111:27;107:43;104:1;100:51;94:4;87:65;169:16;166:1;159:27;225:16;222:1;215:4;212:1;208:12;193:49;7:242;;16:31;36:4;31:9;;7:242;;1957:98:0;;;;;2074:7;2066:35;;;;-1:-1:-1;;;;;2066:35:0;;;;;;;;;2121:17;:15;:17::i;:::-;2114:24;;1840:306;;;;;;:::o;13047:78::-;13093:7;13047:78;:::o;25165:3671::-;25378:85;25407:8;25417:4;:11;;;25429:1;25417:14;;;;;;;;;;;;;;:26;;;25445:4;:17;;;25378:28;:85::i;:::-;25374:254;;25482:4;:13;;;25479:138;;;25515:39;;-1:-1:-1;;;;;25515:39:0;;;;;;;;25479:138;25595:7;;25479:138;25638:29;;;;25751:1531;25792:11;;:18;25779:31;;25751:1531;;;25857:4;:23;;;25843:10;:37;:63;;;;;25884:4;:22;;;25843:63;25840:236;;;25938:122;25946:8;25956:4;:11;;;25968:10;25956:23;;;;;;;;;;;;;;:35;;;25993:15;26009:10;26021:1;26009:13;:50;;26045:14;26009:50;;;26025:4;:17;;;26009:50;25938:7;:122::i;:::-;25926:134;;25840:236;26090:17;26208:315;26239:4;:11;;;26251:10;26239:23;;;;;;;;;;;;;;26281:8;26308:200;26340:10;26354:1;26340:15;:52;;26378:14;26340:52;;;26358:4;:17;;;26340:52;26415:8;26424:56;26434:8;26444:4;:11;;;26456:10;26444:23;;;;;;;;;;;;;;:35;;;26424:9;:56::i;:::-;26415:66;;;;;;;;;;;:74;;;26308:9;:200::i;:::-;26208:12;:315::i;:::-;26542:11;;:23;;26178:345;;-1:-1:-1;26178:345:0;;-1:-1:-1;26554:10:0;;26542:23;;;;;;;;;;;;:38;;;26541:39;:90;;;;-1:-1:-1;26601:11:0;;:23;;26613:10;;26601:23;;;;;;;;;;;;:30;;;26584:14;:47;26541:90;26538:252;;;26654:4;:13;;;26651:99;;;26691:39;;-1:-1:-1;;;;;26691:39:0;;;;;;;;26651:99;26768:7;;;;;;;26538:252;26807:15;26804:200;;26866:9;-1:-1:-1;26866:9:0;26897:14;;26894:95;;26935:34;;;;26894:95;27035:4;:23;;;27021:10;:37;:64;;;;;27063:4;:22;;;27062:23;27021:64;27018:253;;;27117:92;27125:8;27135:4;:11;;;27147:10;27135:23;;;;;;;;;;;;;;:40;;;27177:15;27194:14;27117:7;:92::i;:::-;27105:104;;27246:9;27228:27;;;;27018:253;-1:-1:-1;25812:12:0;;25751:1531;;;;27373:16;27351:384;27404:4;:11;;;27416:1;27404:14;;;;;;;;;;;;;;;;;;:26;27445:11;;27457:18;;-1:-1:-1;;27457:20:0;;;27445:33;;;;;;;;;;;;:50;;;27510:21;27546:14;27575:4;:22;;;:125;;27647:11;;27659:23;;;;27647:36;;;;;;;;;;;;;;:53;;;27575:125;;;27598:11;;27610:23;;;;27598:36;;;;;;;;;;;;;;:48;;;27575:125;27715:9;27351:384;;;;;;;;;;;;;;;;;;;;27768:4;:29;;;27751:14;:46;27748:485;;;27883:48;;-1:-1:-1;;;;;27883:48:0;;;;;;;;27748:485;27953:157;27971:4;:11;;;27983:1;27971:14;;;;;;;;;;;;;;;;;;:26;27999:11;;28011:18;;-1:-1:-1;;28011:20:0;;;27999:33;;;;;;;;;;;;:50;;;28050:4;:17;;;28069:14;28085:4;:24;;;27953:17;:157::i;:::-;27949:284;;;28182:39;;-1:-1:-1;;;;;28182:39:0;;;;;;;;27949:284;28246:20;;;;-1:-1:-1;;;;;28246:34:0;28270:10;28246:34;;;;:74;;-1:-1:-1;28284:20:0;;;;-1:-1:-1;;;;;28284:36:0;;;28246:74;28243:586;;;28461:11;;28473:18;;28410:29;;28442:70;;28452:8;;28461:11;-1:-1:-1;;28473:20:0;;;28461:33;;;;;;;;;;;;:50;;;28442:9;:70::i;:::-;28410:102;;28527:20;28550:65;28559:14;28575:8;28584:21;28575:31;;;;;;28550:65;28527:88;;28630:83;28645:8;28655:21;28678:4;:20;;;28700:12;28630:14;:83::i;:::-;28752:11;;28764:18;;28728:89;;28742:8;;-1:-1:-1;;28764:20:0;;;28752:33;;;;;;;;;;;;:50;;;28804:12;28728:13;:89::i;:::-;28243:586;;;25165:3671;;;;;;;;:::o;34202:595::-;34384:20;34380:410;34425:15;34410:12;:30;34380:410;;;34475:17;;;;;:72;;-1:-1:-1;34543:3:0;34496:8;34505:12;34496:22;;;;;;;;;;;:35;-1:-1:-1;;;;;34496:51:0;;34475:72;34472:117;;;34567:7;;;34472:117;34696:82;34711:8;34721:12;34735:10;34747:8;34756:12;34747:22;;;;;;;;;;;:30;;;34696:14;:82::i;:::-;34442:14;;34380:410;;1617:183;-1:-1:-1;;;;;1696:23:0;;1688:32;;;;;;1753:5;;;1732:38;;-1:-1:-1;;;;;1732:38:0;;;;1753:5;;;1732:38;;;1777:5;:17;;-1:-1:-1;;1777:17:0;-1:-1:-1;;;;;1777:17:0;;;;;;;;;;1617:183::o;2833:391::-;2883:12;2938:16;2968:53;;;;3040:2;3035:103;;;;3189:1;3186;3179:12;2968:53;3005:1;2994:12;;2968:53;;3035:103;3083:2;3080:1;3077;3062:24;3121:1;3115:8;3104:19;;2931:275;;2916:301;:::o;33007:1187::-;33177:4;33211:19;:17;:19::i;:::-;-1:-1:-1;;;;;33202:28:0;:5;-1:-1:-1;;;;;33202:28:0;;33199:267;;;33262:11;;;:19;;33249:32;;33246:137;;;-1:-1:-1;33362:5:0;33355:12;;33246:137;-1:-1:-1;33450:4:0;33443:11;;33199:267;33478:18;33499:26;33509:8;33519:5;33499:9;:26::i;:::-;33478:47;;33552:8;33561:10;33552:20;;;;;;;;;;;:28;;;33539:12;:41;33536:629;;;33701:18;;33653:12;;-1:-1:-1;;;;;33701:18:0;33799:5;33806:10;33826:4;33848:8;33857:10;33848:20;;;;;;;;;;;:28;;;33833:12;:43;33726:151;;;;;;;;;;;;;;;;-1:-1:-1;;26:21;;;22:32;6:49;;33726:151:0;;;49:4:-1;25:18;;61:17;;33726:151:0;182:15:-1;33726:151:0;179:29:-1;160:49;;33693:185:0;;;33726:151;33693:185;;;;;;;;;;;;;;;;;;14:1:-1;21;16:31;;;;75:4;69:11;64:16;;144:4;140:9;133:4;115:16;111:27;107:43;104:1;100:51;94:4;87:65;169:16;166:1;159:27;225:16;222:1;215:4;212:1;208:12;193:49;7:242;;16:31;36:4;31:9;;7:242;-1:-1;33680:198:0;;-1:-1:-1;;33893:175:0;;;;34010:12;33979:8;33988:10;33979:20;;;;;;;;;;;:28;;:43;;;;;34048:4;34041:11;;;;;;33893:175;34148:5;34141:12;;;;;;33536:629;-1:-1:-1;34182:4:0;;33007:1187;-1:-1:-1;;;;33007:1187:0:o;32240:759::-;32440:17;32475:15;32501;32475:42;;32528:21;32552:7;-1:-1:-1;;;;;32552:29:0;;:31;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;32552:31:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;32552:31:0;;;;;;;101:4:-1;97:9;90:4;84;80:15;76:31;69:5;65:43;126:6;120:4;113:20;0:138;32552:31:0;;;;;;;;;32528:55;;32669:41;32682:12;32696:13;32669:12;:41::i;:::-;32657:53;;32770:80;32785:8;32795:26;32805:8;32815:5;32795:9;:26::i;:::-;32823:15;32840:9;32770:14;:80::i;:::-;32861:62;32875:8;32885:26;32895:8;32905:5;32885:9;:26::i;:::-;32913:9;32861:13;:62::i;:::-;-1:-1:-1;;32240:759:0;;;;;;;:::o;35334:502::-;35459:7;;35484:345;35515:15;35507:5;:23;35484:345;;;35590:5;-1:-1:-1;;;;;35558:37:0;:8;35567:5;35558:15;;;;;;;;;;;:28;-1:-1:-1;;;;;35558:37:0;;35555:263;;;35622:5;-1:-1:-1;35615:12:0;;35555:263;35653:10;;;;;:58;;-1:-1:-1;35707:3:0;35667:8;35676:5;35667:15;;;;;;;;;;;:28;-1:-1:-1;;;;;35667:44:0;;35653:58;35649:169;;;35749:22;;;;;;;;35762:5;-1:-1:-1;;;;;35749:22:0;;;;;35769:1;35749:22;;;35731:8;35740:5;35731:15;;;;;;;;;;:40;35797:5;-1:-1:-1;35790:12:0;;35649:169;35532:7;;35484:345;;;;35334:502;;;;:::o;18436:106::-;18494:7;18525:1;18521;:5;:13;;18533:1;18521:13;;;-1:-1:-1;18529:1:0;;18436:106;-1:-1:-1;18436:106:0:o;28844:1443::-;29009:18;;;;;29135:959;29176:5;:12;;;:19;29163:10;:32;29135:959;;;29270:16;29248:10;29229:16;:29;29262:5;29228:39;:58;29225:305;;;29306:5;;29225:305;29337:5;:20;;;29336:21;:53;;;;;29377:5;:12;;;29361;:28;29336:53;29333:197;;;29409:5;;29333:197;29440:5;:20;;;:49;;;;;29477:5;:12;;;29464:9;:25;29440:49;29436:94;;;29509:5;;29436:94;29639:311;29670:5;:12;;;29683:10;29670:24;;;;;;;;;;;;;;29733:10;29714:16;:29;29762:5;:20;;;:83;;29832:13;29817:5;:12;;;:28;29762:83;;;29804:10;29785:16;:29;29762:83;29865:20;;;;29904:17;;29941:8;29639:12;:311::i;:::-;30015:23;;;;30053:29;;;;29611:339;;-1:-1:-1;29611:339:0;-1:-1:-1;29197:12:0;;29135:959;;;;30104:58;30115:8;30125:5;:22;;;30149:12;30104:10;:58::i;:::-;30173:53;30187:8;30197:5;:17;;;30216:9;30173:13;:53::i;:::-;28844:1443;;;;;;;;:::o;31310:922::-;31540:11;31639:22;31679:19;:17;:19::i;:::-;-1:-1:-1;;;;;31664:34:0;:11;-1:-1:-1;;;;;31664:34:0;;:72;;31706:30;31724:11;31706:17;:30::i;:::-;31664:72;;;31701:2;31664:72;31639:97;;31827:27;31877:19;:17;:19::i;:::-;-1:-1:-1;;;;;31857:39:0;:16;-1:-1:-1;;;;;31857:39:0;;:82;;31904:35;31922:16;31904:17;:35::i;:::-;31857:82;;;31899:2;31857:82;31827:112;;32010:15;32028:91;32050:12;32064:17;32083:14;32099:19;32028:21;:91::i;:::-;32195:29;-1:-1:-1;32195:29:0;-1:-1:-1;;;;31310:922:0;;;;;;;;:::o;34809:517::-;35017:15;;35014:305;;35088:19;:17;:19::i;:::-;-1:-1:-1;;;;;35051:56:0;:8;35060:10;35051:20;;;;;;;;;;;:33;-1:-1:-1;;;;;35051:56:0;;35048:260;;;35127:33;;-1:-1:-1;;;;;35127:20:0;;;:33;;;;;35148:11;;35127:33;;;;35148:11;35127:20;:33;;;;;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;35127:33:0;35048:260;;;35201:91;35232:8;35241:10;35232:20;;;;;;;;;;;:33;35267:11;35280;35201:30;:91::i;36388:309::-;36573:18;36594:33;36604:8;36614:12;36594:9;:33::i;:::-;36573:54;;36638:51;36652:8;36662:10;36674:14;36638:13;:51::i;37169:156::-;37243:7;37269:48;37282:25;37295:6;37303:3;37282:12;:25::i;:::-;37309:7;37269:12;:48::i;36705:241::-;36924:14;36890:8;36899:12;36890:22;;;;;;;;;;;:30;;:48;;;;;;;;;;;36705:241;;;:::o;30295:1007::-;30551:13;30566:16;30685:19;:17;:19::i;:::-;-1:-1:-1;;;;;30669:35:0;:12;-1:-1:-1;;;;;30669:35:0;;30666:522;;;30756:21;;30816:20;;;;30740:145;;;;;-1:-1:-1;;;;;30740:51:0;;;;;;30798:16;;30740:145;;30816:20;30798:16;;30856:12;;30870:14;;30740:145;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;30740:145:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;30740:145:0;;;;;;;;101:4:-1;97:9;90:4;84;80:15;76:31;69:5;65:43;126:6;120:4;113:20;0:138;30740:145:0;;;;;;;;;30720:165;;-1:-1:-1;30720:165:0;-1:-1:-1;30666:522:0;;;30920:100;30935:8;30945:33;30955:8;30965:12;30945:9;:33::i;:::-;30980:21;;31003:16;30920:14;:100::i;:::-;31071:21;;31107:20;;;;31055:121;;;;;-1:-1:-1;;;;;31055:51:0;;;;;;:121;;31129:16;;31147:12;;31161:14;;31055:121;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;31055:121:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;31055:121:0;;;;;;;101:4:-1;97:9;90:4;84;80:15;76:31;69:5;65:43;126:6;120:4;113:20;0:138;31055:121:0;;;;;;;;;31035:141;;-1:-1:-1;31035:141:0;-1:-1:-1;30666:522:0;30295:1007;;;;;;;;;:::o;35844:297::-;36023:18;36044:33;36054:8;36064:12;36044:9;:33::i;:::-;36023:54;;36088:45;36099:8;36109:10;36121:11;36088:10;:45::i;13510:1532::-;13582:16;13616:18;13644:23;;;;;;;;;;;;;;;14004;;;13644;-1:-1:-1;14066:4:0;14102;;13644:23;14066:4;13644:23;14291:1;14232:5;14176:4;14137:498;14658:7;14679:122;;;;14820:1;14815:104;;;;14651:268;;14679:122;14717:1;14705:13;;14679:122;;14815:104;14859:3;14853:10;14841:22;;14651:268;-1:-1:-1;;;;14953:4:0;14945:13;14940:4;14933:26;-1:-1:-1;13854:1181:0;;-1:-1:-1;13854:1181:0:o;17688:628::-;17814:4;12124:6;17844:9;:20;;17836:29;;;;;;12124:6;17884:10;:21;;17876:30;;;;;;17938:11;17923;:26;17919:390;;12284:2;17989:11;17975;:25;17974:43;;17966:52;;;;;;18105:9;18089:11;18075;:25;18068:2;:33;18067:47;12071:6;18041:10;:22;:74;;;;;;18033:83;;;;17919:390;12284:2;18172:11;18158;:25;18157:43;;18149:52;;;;;;18287:9;18271:11;18257;:25;18250:2;:33;12071:6;18224:10;:22;:60;:72;;;;9935:400;9995:7;10223;10219:38;;-1:-1:-1;10248:1:0;10241:8;;10219:38;10277:7;;;10282:2;10277;:7;:2;10299:6;;;;;:12;10291:21;;;;;10450:285;10510:7;10539:1;10534:2;:6;10526:15;;;;;;10606:9;10623:2;10618;:7;;;;;;;10450:285;-1:-1:-1;;;;10450:285:0:o;36149:231::-;36361:11;36327:8;36336:12;36327:22;;;;;;;;;;;:30;;:45;;;;;;;;;;;36149:231;;;:::o;21034:17043::-;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;-1:-1:-1;21034:17043:0;;;;;;;;:::o;5:118:-1:-;;72:46;110:6;97:20;72:46;;307:727;;439:3;432:4;424:6;420:17;416:27;406:2;;457:1;454;447:12;406:2;494:6;481:20;516:95;531:79;603:6;531:79;;;516:95;;;639:21;;;683:4;671:17;;;;507:104;;-1:-1;696:14;;671:17;791:1;776:252;801:6;798:1;795:13;776:252;;;884:3;871:17;863:6;859:30;908:56;960:3;948:10;908:56;;;896:69;;-1:-1;988:4;979:14;;;;1007;;;;;823:1;816:9;776:252;;;780:14;399:635;;;;;;;;1077:724;;1208:3;1201:4;1193:6;1189:17;1185:27;1175:2;;1226:1;1223;1216:12;1175:2;1263:6;1250:20;1285:94;1300:78;1371:6;1300:78;;1285:94;1407:21;;;1451:4;1439:17;;;;1276:103;;-1:-1;1464:14;;1439:17;1559:1;1544:251;1569:6;1566:1;1563:13;1544:251;;;1652:3;1639:17;1631:6;1627:30;1676:55;1727:3;1715:10;1676:55;;;1664:68;;-1:-1;1755:4;1746:14;;;;1774;;;;;1591:1;1584:9;1544:251;;1845:727;;1977:3;1970:4;1962:6;1958:17;1954:27;1944:2;;1995:1;1992;1985:12;1944:2;2032:6;2019:20;2054:95;2069:79;2141:6;2069:79;;2054:95;2177:21;;;2221:4;2209:17;;;;2045:104;;-1:-1;2234:14;;2209:17;2329:1;2314:252;2339:6;2336:1;2333:13;2314:252;;;2422:3;2409:17;2401:6;2397:30;2446:56;2498:3;2486:10;2446:56;;;2434:69;;-1:-1;2526:4;2517:14;;;;2545;;;;;2361:1;2354:9;2314:252;;2580:112;;2644:43;2679:6;2666:20;2644:43;;2699:118;;2766:46;2804:6;2791:20;2766:46;;2825:432;;2922:3;2915:4;2907:6;2903:17;2899:27;2889:2;;2940:1;2937;2930:12;2889:2;2977:6;2964:20;2999:60;3014:44;3051:6;3014:44;;2999:60;2990:69;;3079:6;3072:5;3065:21;3115:4;3107:6;3103:17;3148:4;3141:5;3137:16;3183:3;3174:6;3169:3;3165:16;3162:25;3159:2;;;3200:1;3197;3190:12;3159:2;3210:41;3244:6;3239:3;3234;3210:41;;;2882:375;;;;;;;;3748:580;;3856:4;3844:9;3839:3;3835:19;3831:30;3828:2;;;3874:1;3871;3864:12;3828:2;3892:20;3907:4;3892:20;;;3883:29;-1:-1;3973:1;4004:57;4057:3;4037:9;4004:57;;;3980:82;;-1:-1;4161:2;4146:18;;4133:32;4185:18;4174:30;;4171:2;;;4217:1;4214;4207:12;4171:2;4252:54;4302:3;4293:6;4282:9;4278:22;4252:54;;;4245:4;4238:5;4234:16;4227:80;4083:235;3822:506;;;;;4376:1339;;4497:4;4485:9;4480:3;4476:19;4472:30;4469:2;;;4515:1;4512;4505:12;4469:2;4533:20;4548:4;4533:20;;;4524:29;-1:-1;4604:31;;4655:18;4644:30;;4641:2;;;4687:1;4684;4677:12;4641:2;4721:88;4805:3;4796:6;4785:9;4781:22;4721:88;;;4697:113;;-1:-1;4882:2;4915:57;4968:3;4944:22;;;4915:57;;;4908:4;4901:5;4897:16;4890:83;4831:153;5045:2;5078:49;5123:3;5114:6;5103:9;5099:22;5078:49;;;5071:4;5064:5;5060:16;5053:75;4994:145;5187:2;5220:49;5265:3;5256:6;5245:9;5241:22;5220:49;;;5213:4;5206:5;5202:16;5195:75;5149:132;5328:3;5362:47;5405:3;5396:6;5385:9;5381:22;5362:47;;;5355:4;5348:5;5344:16;5337:73;5291:130;5468:3;5502:49;5547:3;5538:6;5527:9;5523:22;5502:49;;;5495:4;5488:5;5484:16;5477:75;5431:132;5610:3;5644:49;5689:3;5680:6;5669:9;5665:22;5644:49;;;5637:4;5630:5;5626:16;5619:75;5573:132;4463:1252;;;;;5753:1544;;5860:5;5848:9;5843:3;5839:19;5835:31;5832:2;;;5879:1;5876;5869:12;5832:2;5897:21;5912:5;5897:21;;;5888:30;-1:-1;5970:31;;6021:18;6010:30;;6007:2;;;6053:1;6050;6043:12;6007:2;6087:89;6172:3;6163:6;6152:9;6148:22;6087:89;;;6063:114;;-1:-1;6253:2;6286:49;6331:3;6307:22;;;6286:49;;;6279:4;6272:5;6268:16;6261:75;6198:149;6417:2;6450:49;6495:3;6486:6;6475:9;6471:22;6450:49;;;6443:4;6436:5;6432:16;6425:75;6357:154;6569:2;6602:49;6647:3;6638:6;6627:9;6623:22;6602:49;;;6595:4;6588:5;6584:16;6577:75;6521:142;6727:3;6761:49;6806:3;6797:6;6786:9;6782:22;6761:49;;;6754:4;6747:5;6743:16;6736:75;6673:149;6885:3;6919:46;6961:3;6952:6;6941:9;6937:22;6919:46;;;6912:4;6905:5;6901:16;6894:72;6832:145;7038:3;7072:57;7125:3;7116:6;7105:9;7101:22;7072:57;;;7065:4;7058:5;7054:16;7047:83;6987:154;7195:3;7229:46;7271:3;7262:6;7251:9;7247:22;7229:46;;;7222:4;7215:5;7211:16;7204:72;7151:136;5826:1471;;;;;7336:1049;;7444:4;7432:9;7427:3;7423:19;7419:30;7416:2;;;7462:1;7459;7452:12;7416:2;7480:20;7495:4;7480:20;;;7471:29;-1:-1;7557:1;7588:49;7633:3;7613:9;7588:49;;;7564:74;;-1:-1;7711:2;7744:49;7789:3;7765:22;;;7744:49;;;7737:4;7730:5;7726:16;7719:75;7659:146;7857:2;7890:49;7935:3;7926:6;7915:9;7911:22;7890:49;;;7883:4;7876:5;7872:16;7865:75;7815:136;8011:2;8044:46;8086:3;8077:6;8066:9;8062:22;8044:46;;;8037:4;8030:5;8026:16;8019:72;7961:141;8182:3;8171:9;8167:19;8154:33;8207:18;8199:6;8196:30;8193:2;;;8239:1;8236;8229:12;8193:2;8274:89;8359:3;8350:6;8339:9;8335:22;8274:89;;;8267:4;8260:5;8256:16;8249:115;8112:263;7410:975;;;;;8517:122;;8595:39;8626:6;8620:13;8595:39;;8646:114;;8711:44;8747:6;8734:20;8711:44;;8767:241;;8871:2;8859:9;8850:7;8846:23;8842:32;8839:2;;;8887:1;8884;8877:12;8839:2;8922:1;8939:53;8984:7;8964:9;8939:53;;9279:366;;;9400:2;9388:9;9379:7;9375:23;9371:32;9368:2;;;9416:1;9413;9406:12;9368:2;9451:1;9468:53;9513:7;9493:9;9468:53;;;9458:63;;9430:97;9558:2;9576:53;9621:7;9612:6;9601:9;9597:22;9576:53;;;9566:63;;9537:98;9362:283;;;;;;9652:597;;;;9800:2;9788:9;9779:7;9775:23;9771:32;9768:2;;;9816:1;9813;9806:12;9768:2;9851:31;;9902:18;9891:30;;9888:2;;;9934:1;9931;9924:12;9888:2;9954:63;10009:7;10000:6;9989:9;9985:22;9954:63;;;9944:73;;9830:193;10054:2;10072:53;10117:7;10108:6;10097:9;10093:22;10072:53;;;10062:63;;10033:98;10162:2;10180:53;10225:7;10216:6;10205:9;10201:22;10180:53;;;10170:63;;10141:98;9762:487;;;;;;10256:391;;10392:2;10380:9;10371:7;10367:23;10363:32;10360:2;;;10408:1;10405;10398:12;10360:2;10443:31;;10494:18;10483:30;;10480:2;;;10526:1;10523;10516:12;10480:2;10546:85;10623:7;10614:6;10603:9;10599:22;10546:85;;10654:241;;10758:2;10746:9;10737:7;10733:23;10729:32;10726:2;;;10774:1;10771;10764:12;10726:2;10809:1;10826:53;10871:7;10851:9;10826:53;;10902:263;;11017:2;11005:9;10996:7;10992:23;10988:32;10985:2;;;11033:1;11030;11023:12;10985:2;11068:1;11085:64;11141:7;11121:9;11085:64;;11172:399;;;11304:2;11292:9;11283:7;11279:23;11275:32;11272:2;;;11320:1;11317;11310:12;11272:2;11355:1;11372:64;11428:7;11408:9;11372:64;;;11362:74;;11334:108;11473:2;11491:64;11547:7;11538:6;11527:9;11523:22;11491:64;;11579:233;;11718:88;11802:3;11794:6;11718:88;;11821:229;;11958:86;12040:3;12032:6;11958:86;;12059:233;;12198:88;12282:3;12274:6;12198:88;;12300:134;12389:39;12422:5;12389:39;;;12384:3;12377:52;12371:63;;;12903:895;;13072:69;13135:5;13072:69;;;13154:95;13242:6;13237:3;13154:95;;;13147:102;;13272:3;13314:4;13306:6;13302:17;13297:3;13293:27;13340:71;13405:5;13340:71;;;13432:1;13417:342;13442:6;13439:1;13436:13;13417:342;;;13504:9;13498:4;13494:20;13489:3;13482:33;13530:102;13627:4;13618:6;13612:13;13530:102;;;13522:110;;13649:75;13717:6;13649:75;;;13747:4;13738:14;;;;;13639:85;-1:-1;13464:1;13457:9;13417:342;;;-1:-1;13772:4;;13051:747;-1:-1;;;;;;13051:747;13871:907;;14048:68;14110:5;14048:68;;;14129:104;14226:6;14221:3;14129:104;;;14122:111;;14256:3;14298:4;14290:6;14286:17;14281:3;14277:27;14324:70;14388:5;14324:70;;;14415:1;14400:339;14425:6;14422:1;14419:13;14400:339;;;14487:9;14481:4;14477:20;14472:3;14465:33;14513:100;14608:4;14599:6;14593:13;14513:100;;;14505:108;;14630:74;14697:6;14630:74;;;14727:4;14718:14;;;;;14620:84;-1:-1;14447:1;14440:9;14400:339;;14853:895;;15022:69;15085:5;15022:69;;;15104:95;15192:6;15187:3;15104:95;;;15097:102;;15222:3;15264:4;15256:6;15252:17;15247:3;15243:27;15290:71;15355:5;15290:71;;;15382:1;15367:342;15392:6;15389:1;15386:13;15367:342;;;15454:9;15448:4;15444:20;15439:3;15432:33;15480:102;15577:4;15568:6;15562:13;15480:102;;;15472:110;;15599:75;15667:6;15599:75;;;15697:4;15688:14;;;;;15589:85;-1:-1;15414:1;15407:9;15367:342;;15756:101;15823:28;15845:5;15823:28;;15982:120;16065:31;16090:5;16065:31;;16109:159;16210:52;16230:31;16255:5;16230:31;;;16210:52;;16275:356;;16403:38;16435:5;16403:38;;;16453:88;16534:6;16529:3;16453:88;;;16446:95;;16546:52;16591:6;16586:3;16579:4;16572:5;16568:16;16546:52;;;16610:16;;;;;16383:248;-1:-1;;16383:248;16638:315;;16734:34;16762:5;16734:34;;;16780:60;16833:6;16828:3;16780:60;;;16773:67;;16845:52;16890:6;16885:3;16878:4;16871:5;16867:16;16845:52;;;16918:29;16940:6;16918:29;;;16909:39;;;;16714:239;-1:-1;;;16714:239;17302:178;17411:63;17468:5;17411:63;;17842:364;;18002:67;18066:2;18061:3;18002:67;;;18102:66;18082:87;;18197:2;18188:12;;17988:218;-1:-1;;17988:218;18215:400;;18393:85;18475:2;18470:3;18393:85;;;18511:66;18491:87;;18606:2;18597:12;;18379:236;-1:-1;;18379:236;18624:364;;18784:67;18848:2;18843:3;18784:67;;;18884:66;18864:87;;18979:2;18970:12;;18770:218;-1:-1;;18770:218;18997:400;;19175:85;19257:2;19252:3;19175:85;;;19293:66;19273:87;;19388:2;19379:12;;19161:236;-1:-1;;19161:236;19406:465;;19566:67;19630:2;19625:3;19566:67;;;19666:66;19646:87;;19767:66;19762:2;19753:12;;19746:88;19862:2;19853:12;;19552:319;-1:-1;;19552:319;19880:364;;20040:67;20104:2;20099:3;20040:67;;;20140:66;20120:87;;20235:2;20226:12;;20026:218;-1:-1;;20026:218;20253:364;;20413:67;20477:2;20472:3;20413:67;;;20513:66;20493:87;;20608:2;20599:12;;20399:218;-1:-1;;20399:218;20626:364;;20786:67;20850:2;20845:3;20786:67;;;20886:66;20866:87;;20981:2;20972:12;;20772:218;-1:-1;;20772:218;20999:465;;21159:67;21223:2;21218:3;21159:67;;;21259:66;21239:87;;21360:66;21355:2;21346:12;;21339:88;21455:2;21446:12;;21145:319;-1:-1;;21145:319;21473:364;;21633:67;21697:2;21692:3;21633:67;;;21733:66;21713:87;;21828:2;21819:12;;21619:218;-1:-1;;21619:218;21846:364;;22006:67;22070:2;22065:3;22006:67;;;22106:66;22086:87;;22201:2;22192:12;;21992:218;-1:-1;;21992:218;22219:363;;22379:66;22443:1;22438:3;22379:66;;;22478;22458:87;;22573:2;22564:12;;22365:217;-1:-1;;22365:217;22651:578;22860:22;;22651:578;;22784:4;22775:14;;;22888:77;22779:3;22860:22;22888:77;;;22804:167;23053:4;23046:5;23042:16;23036:23;23105:3;23099:4;23095:14;23088:4;23083:3;23079:14;23072:38;23125:66;23186:4;23173:11;23125:66;;23295:1613;23494:22;;23426:5;23529:37;;;23295:1613;;23417:15;;;;23581:136;23417:15;23494:22;23581:136;;;23573:144;;23447:282;23816:4;23809:5;23805:16;23799:23;23828:62;23884:4;23879:3;23875:14;23862:11;23828:62;;;23739:157;23988:4;23981:5;23977:16;23971:23;24000:62;24056:4;24051:3;24047:14;24034:11;24000:62;;;23906:162;24148:4;24141:5;24137:16;24131:23;24160:62;24216:4;24211:3;24207:14;24194:11;24160:62;;;24078:150;24314:4;24307:5;24303:16;24297:23;24326:62;24382:4;24377:3;24373:14;24360:11;24326:62;;;24238:156;24479:4;24472:5;24468:16;24462:23;24491:56;24541:4;24536:3;24532:14;24519:11;24491:56;;;24404:149;24636:4;24629:5;24625:16;24619:23;24648:78;24720:4;24715:3;24711:14;24698:11;24648:78;;;24563:169;24808:4;24801:5;24797:16;24791:23;24820:56;24870:4;24865:3;24861:14;24848:11;24820:56;;;-1:-1;24899:4;23399:1509;-1:-1;;;23399:1509;24976:1094;25181:22;;24976:1094;;25109:4;25100:14;;;25209:61;25104:3;25181:22;25209:61;;;25129:147;25360:4;25353:5;25349:16;25343:23;25372:62;25428:4;25423:3;25419:14;25406:11;25372:62;;;25286:154;25514:4;25507:5;25503:16;25497:23;25526:62;25582:4;25577:3;25573:14;25560:11;25526:62;;;25450:144;25676:4;25669:5;25665:16;25659:23;25688:56;25738:4;25733:3;25729:14;25716:11;25688:56;;;25604:146;25824:4;25817:5;25813:16;25807:23;25876:3;25870:4;25866:14;25859:4;25854:3;25850:14;25843:38;25896:136;26027:4;26014:11;25896:136;;26321:114;26400:29;26423:5;26400:29;;26442:262;;26586:93;26675:3;26666:6;26586:93;;26711:511;;26938:148;27082:3;26938:148;;;26931:155;;27097:75;27168:3;27159:6;27097:75;;;-1:-1;27194:2;27185:12;;26919:303;-1:-1;26919:303;27229:372;;27428:148;27572:3;27428:148;;27608:245;27742:2;27727:18;;27756:87;27731:9;27816:6;27756:87;;27860:611;28094:3;28079:19;;28109:71;28083:9;28153:6;28109:71;;;28191:88;28275:2;28264:9;28260:18;28251:6;28191:88;;;28290;28374:2;28363:9;28359:18;28350:6;28290:88;;;28389:72;28457:2;28446:9;28442:18;28433:6;28389:72;;28478:771;28736:3;28721:19;;28751:71;28725:9;28795:6;28751:71;;;28833:72;28901:2;28890:9;28886:18;28877:6;28833:72;;;28916;28984:2;28973:9;28969:18;28960:6;28916:72;;;28999;29067:2;29056:9;29052:18;29043:6;28999:72;;;29082:73;29150:3;29139:9;29135:19;29126:6;29082:73;;;29166;29234:3;29223:9;29219:19;29210:6;29166:73;;;28707:542;;;;;;;;;;29256:324;29402:2;29387:18;;29416:71;29391:9;29460:6;29416:71;;;29498:72;29566:2;29555:9;29551:18;29542:6;29498:72;;29587:935;29931:3;29946:47;;;29916:19;;30007:140;29916:19;30133:6;30007:140;;;29999:148;;30158:88;30242:2;30231:9;30227:18;30218:6;30158:88;;;30257:72;30325:2;30314:9;30310:18;30301:6;30257:72;;;30340;30408:2;30397:9;30393:18;30384:6;30340:72;;;30423:89;30507:3;30496:9;30492:19;30483:6;30423:89;;;29902:620;;;;;;;;;30529:201;30641:2;30626:18;;30655:65;30630:9;30693:6;30655:65;;30737:539;30935:3;30920:19;;30950:71;30924:9;30994:6;30950:71;;;31032:68;31096:2;31085:9;31081:18;31072:6;31032:68;;;31111:72;31179:2;31168:9;31164:18;31155:6;31111:72;;31283:611;31493:3;31508:47;;;31478:19;;31569:72;31478:19;31627:6;31569:72;;;31561:80;;31652:72;31720:2;31709:9;31705:18;31696:6;31652:72;;;31735;31803:2;31792:9;31788:18;31779:6;31735:72;;;31818:66;31880:2;31869:9;31865:18;31856:6;31818:66;;31901:265;32045:2;32030:18;;32059:97;32034:9;32129:6;32059:97;;32173:523;32367:2;32381:47;;;32352:18;;32442:78;32352:18;32506:6;32442:78;;;32434:86;;32531:72;32599:2;32588:9;32584:18;32575:6;32531:72;;;32614;32682:2;32671:9;32667:18;32658:6;32614:72;;32703:407;32894:2;32908:47;;;32879:18;;32969:131;32879:18;32969:131;;33117:407;33308:2;33322:47;;;33293:18;;33383:131;33293:18;33383:131;;33531:407;33722:2;33736:47;;;33707:18;;33797:131;33707:18;33797:131;;33945:407;34136:2;34150:47;;;34121:18;;34211:131;34121:18;34211:131;;34359:407;34550:2;34564:47;;;34535:18;;34625:131;34535:18;34625:131;;34773:407;34964:2;34978:47;;;34949:18;;35039:131;34949:18;35039:131;;35187:407;35378:2;35392:47;;;35363:18;;35453:131;35363:18;35453:131;;35601:407;35792:2;35806:47;;;35777:18;;35867:131;35777:18;35867:131;;36015:407;36206:2;36220:47;;;36191:18;;36281:131;36191:18;36281:131;;36429:407;36620:2;36634:47;;;36605:18;;36695:131;36605:18;36695:131;;36843:256;36905:2;36899:9;36931:17;;;37006:18;36991:34;;37027:22;;;36988:62;36985:2;;;37063:1;37060;37053:12;36985:2;37079;37072:22;36883:216;;-1:-1;36883:216;37106:273;;37280:18;37272:6;37269:30;37266:2;;;37312:1;37309;37302:12;37266:2;-1:-1;37341:4;37329:17;;;37359:15;;37203:176;37945:254;;38084:18;38076:6;38073:30;38070:2;;;38116:1;38113;38106:12;38070:2;-1:-1;38189:4;38160;38137:17;;;;-1:-1;;38133:33;38179:15;;38007:192;38474:136;38598:4;38586:17;;38567:43;38912:122;39017:12;;39001:33;40027:187;40154:19;;;40203:4;40194:14;;40147:67;40956:144;41091:3;41069:31;-1:-1;41069:31;41434:105;;41503:31;41528:5;41503:31;;41666:92;41739:13;41732:21;;41715:43;41765:79;41834:5;41817:27;41851:128;-1:-1;;;;;41920:54;;41903:76;42072:88;42150:4;42139:16;;42122:38;42900:173;;43005:63;43062:5;43005:63;;43229:145;43310:6;43305:3;43300;43287:30;-1:-1;43366:1;43348:16;;43341:27;43280:94;43383:268;43448:1;43455:101;43469:6;43466:1;43463:13;43455:101;;;43536:11;;;43530:18;43517:11;;;43510:39;43491:2;43484:10;43455:101;;;43571:6;43568:1;43565:13;43562:2;;;-1:-1;;43636:1;43618:16;;43611:27;43432:219;43740:97;43828:2;43808:14;-1:-1;;43804:28;;43788:49

Swarm Source

bzzr://c860ff8c74e1bc9b8d320509a2026e1c5e94775e298aff93f7d8b3aec79313af
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.