ETH Price: $2,072.15 (+4.35%)

Contract

0x4Ee0066F6e37268129fA760a4CA532Bce9e86355
 

Overview

ETH Balance

0 ETH

Eth Value

$0.00

More Info

Private Name Tags

Multichain Info

No addresses found
Transaction Hash
Method
Block
From
To
Set Earliest Set...78917852019-06-04 8:25:542491 days ago1559636754IN
0x4Ee0066F...ce9e86355
0 ETH0.0029867100
Set Earliest Set...77971702019-05-20 13:38:202506 days ago1558359500IN
0x4Ee0066F...ce9e86355
0 ETH0.0029931100
Set Earliest Set...77008612019-05-05 12:17:202521 days ago1557058640IN
0x4Ee0066F...ce9e86355
0 ETH0.0029931100
Set Earliest Set...76441932019-04-26 16:58:542529 days ago1556297934IN
0x4Ee0066F...ce9e86355
0 ETH0.0299311,000
Set Earliest Set...76441932019-04-26 16:58:542529 days ago1556297934IN
0x4Ee0066F...ce9e86355
0 ETH0.0299311,000
Set Earliest Set...76441932019-04-26 16:58:542529 days ago1556297934IN
0x4Ee0066F...ce9e86355
0 ETH0.0029931100
Set Earliest Set...76441932019-04-26 16:58:542529 days ago1556297934IN
0x4Ee0066F...ce9e86355
0 ETH0.0005986220
Enable Service A...75882722019-04-17 23:28:372538 days ago1555543717IN
0x4Ee0066F...ce9e86355
0 ETH0.0090694100
Register Service75882712019-04-17 23:28:362538 days ago1555543716IN
0x4Ee0066F...ce9e86355
0 ETH0.0067276100
Enable Service A...75882692019-04-17 23:28:142538 days ago1555543694IN
0x4Ee0066F...ce9e86355
0 ETH0.0090694100
Register Service75882672019-04-17 23:28:022538 days ago1555543682IN
0x4Ee0066F...ce9e86355
0 ETH0.0067276100
Set Earliest Set...75882652019-04-17 23:27:442538 days ago1555543664IN
0x4Ee0066F...ce9e86355
0 ETH0.0044931100
Set Update Delay...75882632019-04-17 23:27:112538 days ago1555543631IN
0x4Ee0066F...ce9e86355
0 ETH0.007347100
Set Fraud Stake ...75882612019-04-17 23:26:452538 days ago1555543605IN
0x4Ee0066F...ce9e86355
0 ETH0.0088225100
Set Operator Set...75882582019-04-17 23:26:152538 days ago1555543575IN
0x4Ee0066F...ce9e86355
0 ETH0.0088159100
Set Wallet Settl...75882562019-04-17 23:25:522538 days ago1555543552IN
0x4Ee0066F...ce9e86355
0 ETH0.0087851100
Set Settlement C...75882542019-04-17 23:25:082538 days ago1555543508IN
0x4Ee0066F...ce9e86355
0 ETH0.0087989100
Set Cancel Order...75882522019-04-17 23:24:522538 days ago1555543492IN
0x4Ee0066F...ce9e86355
0 ETH0.0088209100
Set Wallet Lock ...75882502019-04-17 23:24:442538 days ago1555543484IN
0x4Ee0066F...ce9e86355
0 ETH0.0087573100
Set Payment Mini...75882482019-04-17 23:24:012538 days ago1555543441IN
0x4Ee0066F...ce9e86355
0 ETH0.0087437100
Set Payment Fee75882472019-04-17 23:23:282538 days ago1555543408IN
0x4Ee0066F...ce9e86355
0 ETH0.0092182100
Set Trade Taker ...75882462019-04-17 23:23:142538 days ago1555543394IN
0x4Ee0066F...ce9e86355
0 ETH0.0087965100
Set Trade Taker ...75882432019-04-17 23:22:582538 days ago1555543378IN
0x4Ee0066F...ce9e86355
0 ETH0.0092272100
Set Trade Maker ...75882412019-04-17 23:21:562538 days ago1555543316IN
0x4Ee0066F...ce9e86355
0 ETH0.0088735100
Set Trade Maker ...75882392019-04-17 23:21:352538 days ago1555543295IN
0x4Ee0066F...ce9e86355
0 ETH0.0091676100
View all transactions

View more zero value Internal Transactions in Advanced View mode

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

Block Transaction Difficulty Gas Used Reward
View All Blocks Produced

Validator Index Block Amount
View All Withdrawals

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

Contract Source Code Verified (Exact Match)

Contract Name:
Configuration

Compiler Version
v0.4.25+commit.59dbf8f1

Optimization Enabled:
Yes with 0 runs

Other Settings:
default evmVersion
/**
 *Submitted for verification at Etherscan.io on 2019-07-11
*/

pragma solidity ^0.4.25;

pragma experimental ABIEncoderV2;

/*
 * Hubii Nahmii
 *
 * Compliant with the Hubii Nahmii specification v0.12.
 *
 * Copyright (C) 2017-2018 Hubii AS
 */


/**
 * @title Modifiable
 * @notice A contract with basic modifiers
 */
contract Modifiable {
    //
    // Modifiers
    // -----------------------------------------------------------------------------------------------------------------
    modifier notNullAddress(address _address) {
        require(_address != address(0));
        _;
    }

    modifier notThisAddress(address _address) {
        require(_address != address(this));
        _;
    }

    modifier notNullOrThisAddress(address _address) {
        require(_address != address(0));
        require(_address != address(this));
        _;
    }

    modifier notSameAddresses(address _address1, address _address2) {
        if (_address1 != _address2)
            _;
    }
}

/*
 * Hubii Nahmii
 *
 * Compliant with the Hubii Nahmii specification v0.12.
 *
 * Copyright (C) 2017-2018 Hubii AS
 */



/**
 * @title SelfDestructible
 * @notice Contract that allows for self-destruction
 */
contract SelfDestructible {
    //
    // Variables
    // -----------------------------------------------------------------------------------------------------------------
    bool public selfDestructionDisabled;

    //
    // Events
    // -----------------------------------------------------------------------------------------------------------------
    event SelfDestructionDisabledEvent(address wallet);
    event TriggerSelfDestructionEvent(address wallet);

    //
    // Functions
    // -----------------------------------------------------------------------------------------------------------------
    /// @notice Get the address of the destructor role
    function destructor()
    public
    view
    returns (address);

    /// @notice Disable self-destruction of this contract
    /// @dev This operation can not be undone
    function disableSelfDestruction()
    public
    {
        // Require that sender is the assigned destructor
        require(destructor() == msg.sender);

        // Disable self-destruction
        selfDestructionDisabled = true;

        // Emit event
        emit SelfDestructionDisabledEvent(msg.sender);
    }

    /// @notice Destroy this contract
    function triggerSelfDestruction()
    public
    {
        // Require that sender is the assigned destructor
        require(destructor() == msg.sender);

        // Require that self-destruction has not been disabled
        require(!selfDestructionDisabled);

        // Emit event
        emit TriggerSelfDestructionEvent(msg.sender);

        // Self-destruct and reward destructor
        selfdestruct(msg.sender);
    }
}

/*
 * Hubii Nahmii
 *
 * Compliant with the Hubii Nahmii specification v0.12.
 *
 * Copyright (C) 2017-2018 Hubii AS
 */






/**
 * @title Ownable
 * @notice A modifiable that has ownership roles
 */
contract Ownable is Modifiable, SelfDestructible {
    //
    // Variables
    // -----------------------------------------------------------------------------------------------------------------
    address public deployer;
    address public operator;

    //
    // Events
    // -----------------------------------------------------------------------------------------------------------------
    event SetDeployerEvent(address oldDeployer, address newDeployer);
    event SetOperatorEvent(address oldOperator, address newOperator);

    //
    // Constructor
    // -----------------------------------------------------------------------------------------------------------------
    constructor(address _deployer) internal notNullOrThisAddress(_deployer) {
        deployer = _deployer;
        operator = _deployer;
    }

    //
    // Functions
    // -----------------------------------------------------------------------------------------------------------------
    /// @notice Return the address that is able to initiate self-destruction
    function destructor()
    public
    view
    returns (address)
    {
        return deployer;
    }

    /// @notice Set the deployer of this contract
    /// @param newDeployer The address of the new deployer
    function setDeployer(address newDeployer)
    public
    onlyDeployer
    notNullOrThisAddress(newDeployer)
    {
        if (newDeployer != deployer) {
            // Set new deployer
            address oldDeployer = deployer;
            deployer = newDeployer;

            // Emit event
            emit SetDeployerEvent(oldDeployer, newDeployer);
        }
    }

    /// @notice Set the operator of this contract
    /// @param newOperator The address of the new operator
    function setOperator(address newOperator)
    public
    onlyOperator
    notNullOrThisAddress(newOperator)
    {
        if (newOperator != operator) {
            // Set new operator
            address oldOperator = operator;
            operator = newOperator;

            // Emit event
            emit SetOperatorEvent(oldOperator, newOperator);
        }
    }

    /// @notice Gauge whether message sender is deployer or not
    /// @return true if msg.sender is deployer, else false
    function isDeployer()
    internal
    view
    returns (bool)
    {
        return msg.sender == deployer;
    }

    /// @notice Gauge whether message sender is operator or not
    /// @return true if msg.sender is operator, else false
    function isOperator()
    internal
    view
    returns (bool)
    {
        return msg.sender == operator;
    }

    /// @notice Gauge whether message sender is operator or deployer on the one hand, or none of these on these on
    /// on the other hand
    /// @return true if msg.sender is operator, else false
    function isDeployerOrOperator()
    internal
    view
    returns (bool)
    {
        return isDeployer() || isOperator();
    }

    // Modifiers
    // -----------------------------------------------------------------------------------------------------------------
    modifier onlyDeployer() {
        require(isDeployer());
        _;
    }

    modifier notDeployer() {
        require(!isDeployer());
        _;
    }

    modifier onlyOperator() {
        require(isOperator());
        _;
    }

    modifier notOperator() {
        require(!isOperator());
        _;
    }

    modifier onlyDeployerOrOperator() {
        require(isDeployerOrOperator());
        _;
    }

    modifier notDeployerOrOperator() {
        require(!isDeployerOrOperator());
        _;
    }
}

/*
 * Hubii Nahmii
 *
 * Compliant with the Hubii Nahmii specification v0.12.
 *
 * Copyright (C) 2017-2018 Hubii AS
 */





/**
 * @title Servable
 * @notice An ownable that contains registered services and their actions
 */
contract Servable is Ownable {
    //
    // Types
    // -----------------------------------------------------------------------------------------------------------------
    struct ServiceInfo {
        bool registered;
        uint256 activationTimestamp;
        mapping(bytes32 => bool) actionsEnabledMap;
        bytes32[] actionsList;
    }

    //
    // Variables
    // -----------------------------------------------------------------------------------------------------------------
    mapping(address => ServiceInfo) internal registeredServicesMap;
    uint256 public serviceActivationTimeout;

    //
    // Events
    // -----------------------------------------------------------------------------------------------------------------
    event ServiceActivationTimeoutEvent(uint256 timeoutInSeconds);
    event RegisterServiceEvent(address service);
    event RegisterServiceDeferredEvent(address service, uint256 timeout);
    event DeregisterServiceEvent(address service);
    event EnableServiceActionEvent(address service, string action);
    event DisableServiceActionEvent(address service, string action);

    //
    // Functions
    // -----------------------------------------------------------------------------------------------------------------
    /// @notice Set the service activation timeout
    /// @param timeoutInSeconds The set timeout in unit of seconds
    function setServiceActivationTimeout(uint256 timeoutInSeconds)
    public
    onlyDeployer
    {
        serviceActivationTimeout = timeoutInSeconds;

        // Emit event
        emit ServiceActivationTimeoutEvent(timeoutInSeconds);
    }

    /// @notice Register a service contract whose activation is immediate
    /// @param service The address of the service contract to be registered
    function registerService(address service)
    public
    onlyDeployer
    notNullOrThisAddress(service)
    {
        _registerService(service, 0);

        // Emit event
        emit RegisterServiceEvent(service);
    }

    /// @notice Register a service contract whose activation is deferred by the service activation timeout
    /// @param service The address of the service contract to be registered
    function registerServiceDeferred(address service)
    public
    onlyDeployer
    notNullOrThisAddress(service)
    {
        _registerService(service, serviceActivationTimeout);

        // Emit event
        emit RegisterServiceDeferredEvent(service, serviceActivationTimeout);
    }

    /// @notice Deregister a service contract
    /// @param service The address of the service contract to be deregistered
    function deregisterService(address service)
    public
    onlyDeployer
    notNullOrThisAddress(service)
    {
        require(registeredServicesMap[service].registered);

        registeredServicesMap[service].registered = false;

        // Emit event
        emit DeregisterServiceEvent(service);
    }

    /// @notice Enable a named action in an already registered service contract
    /// @param service The address of the registered service contract
    /// @param action The name of the action to be enabled
    function enableServiceAction(address service, string action)
    public
    onlyDeployer
    notNullOrThisAddress(service)
    {
        require(registeredServicesMap[service].registered);

        bytes32 actionHash = hashString(action);

        require(!registeredServicesMap[service].actionsEnabledMap[actionHash]);

        registeredServicesMap[service].actionsEnabledMap[actionHash] = true;
        registeredServicesMap[service].actionsList.push(actionHash);

        // Emit event
        emit EnableServiceActionEvent(service, action);
    }

    /// @notice Enable a named action in a service contract
    /// @param service The address of the service contract
    /// @param action The name of the action to be disabled
    function disableServiceAction(address service, string action)
    public
    onlyDeployer
    notNullOrThisAddress(service)
    {
        bytes32 actionHash = hashString(action);

        require(registeredServicesMap[service].actionsEnabledMap[actionHash]);

        registeredServicesMap[service].actionsEnabledMap[actionHash] = false;

        // Emit event
        emit DisableServiceActionEvent(service, action);
    }

    /// @notice Gauge whether a service contract is registered
    /// @param service The address of the service contract
    /// @return true if service is registered, else false
    function isRegisteredService(address service)
    public
    view
    returns (bool)
    {
        return registeredServicesMap[service].registered;
    }

    /// @notice Gauge whether a service contract is registered and active
    /// @param service The address of the service contract
    /// @return true if service is registered and activate, else false
    function isRegisteredActiveService(address service)
    public
    view
    returns (bool)
    {
        return isRegisteredService(service) && block.timestamp >= registeredServicesMap[service].activationTimestamp;
    }

    /// @notice Gauge whether a service contract action is enabled which implies also registered and active
    /// @param service The address of the service contract
    /// @param action The name of action
    function isEnabledServiceAction(address service, string action)
    public
    view
    returns (bool)
    {
        bytes32 actionHash = hashString(action);
        return isRegisteredActiveService(service) && registeredServicesMap[service].actionsEnabledMap[actionHash];
    }

    //
    // Internal functions
    // -----------------------------------------------------------------------------------------------------------------
    function hashString(string _string)
    internal
    pure
    returns (bytes32)
    {
        return keccak256(abi.encodePacked(_string));
    }

    //
    // Private functions
    // -----------------------------------------------------------------------------------------------------------------
    function _registerService(address service, uint256 timeout)
    private
    {
        if (!registeredServicesMap[service].registered) {
            registeredServicesMap[service].registered = true;
            registeredServicesMap[service].activationTimestamp = block.timestamp + timeout;
        }
    }

    //
    // Modifiers
    // -----------------------------------------------------------------------------------------------------------------
    modifier onlyActiveService() {
        require(isRegisteredActiveService(msg.sender));
        _;
    }

    modifier onlyEnabledServiceAction(string action) {
        require(isEnabledServiceAction(msg.sender, action));
        _;
    }
}

/*
 * Hubii Nahmii
 *
 * Compliant with the Hubii Nahmii specification v0.12.
 *
 * Copyright (C) 2017-2018 Hubii AS based on Open-Zeppelin's SafeMath library
 */



/**
 * @title     SafeMathIntLib
 * @dev       Math operations with safety checks that throw on error
 */
library SafeMathIntLib {
    int256 constant INT256_MIN = int256((uint256(1) << 255));
    int256 constant INT256_MAX = int256(~((uint256(1) << 255)));

    //
    //Functions below accept positive and negative integers and result must not overflow.
    //
    function div(int256 a, int256 b)
    internal
    pure
    returns (int256)
    {
        require(a != INT256_MIN || b != - 1);
        return a / b;
    }

    function mul(int256 a, int256 b)
    internal
    pure
    returns (int256)
    {
        require(a != - 1 || b != INT256_MIN);
        // overflow
        require(b != - 1 || a != INT256_MIN);
        // overflow
        int256 c = a * b;
        require((b == 0) || (c / b == a));
        return c;
    }

    function sub(int256 a, int256 b)
    internal
    pure
    returns (int256)
    {
        require((b >= 0 && a - b <= a) || (b < 0 && a - b > a));
        return a - b;
    }

    function add(int256 a, int256 b)
    internal
    pure
    returns (int256)
    {
        int256 c = a + b;
        require((b >= 0 && c >= a) || (b < 0 && c < a));
        return c;
    }

    //
    //Functions below only accept positive integers and result must be greater or equal to zero too.
    //
    function div_nn(int256 a, int256 b)
    internal
    pure
    returns (int256)
    {
        require(a >= 0 && b > 0);
        return a / b;
    }

    function mul_nn(int256 a, int256 b)
    internal
    pure
    returns (int256)
    {
        require(a >= 0 && b >= 0);
        int256 c = a * b;
        require(a == 0 || c / a == b);
        require(c >= 0);
        return c;
    }

    function sub_nn(int256 a, int256 b)
    internal
    pure
    returns (int256)
    {
        require(a >= 0 && b >= 0 && b <= a);
        return a - b;
    }

    function add_nn(int256 a, int256 b)
    internal
    pure
    returns (int256)
    {
        require(a >= 0 && b >= 0);
        int256 c = a + b;
        require(c >= a);
        return c;
    }

    //
    //Conversion and validation functions.
    //
    function abs(int256 a)
    public
    pure
    returns (int256)
    {
        return a < 0 ? neg(a) : a;
    }

    function neg(int256 a)
    public
    pure
    returns (int256)
    {
        return mul(a, - 1);
    }

    function toNonZeroInt256(uint256 a)
    public
    pure
    returns (int256)
    {
        require(a > 0 && a < (uint256(1) << 255));
        return int256(a);
    }

    function toInt256(uint256 a)
    public
    pure
    returns (int256)
    {
        require(a >= 0 && a < (uint256(1) << 255));
        return int256(a);
    }

    function toUInt256(int256 a)
    public
    pure
    returns (uint256)
    {
        require(a >= 0);
        return uint256(a);
    }

    function isNonZeroPositiveInt256(int256 a)
    public
    pure
    returns (bool)
    {
        return (a > 0);
    }

    function isPositiveInt256(int256 a)
    public
    pure
    returns (bool)
    {
        return (a >= 0);
    }

    function isNonZeroNegativeInt256(int256 a)
    public
    pure
    returns (bool)
    {
        return (a < 0);
    }

    function isNegativeInt256(int256 a)
    public
    pure
    returns (bool)
    {
        return (a <= 0);
    }

    //
    //Clamping functions.
    //
    function clamp(int256 a, int256 min, int256 max)
    public
    pure
    returns (int256)
    {
        if (a < min)
            return min;
        return (a > max) ? max : a;
    }

    function clampMin(int256 a, int256 min)
    public
    pure
    returns (int256)
    {
        return (a < min) ? min : a;
    }

    function clampMax(int256 a, int256 max)
    public
    pure
    returns (int256)
    {
        return (a > max) ? max : a;
    }
}

/*
 * Hubii Nahmii
 *
 * Compliant with the Hubii Nahmii specification v0.12.
 *
 * Copyright (C) 2017-2018 Hubii AS
 */



library BlockNumbUintsLib {
    //
    // Structures
    // -----------------------------------------------------------------------------------------------------------------
    struct Entry {
        uint256 blockNumber;
        uint256 value;
    }

    struct BlockNumbUints {
        Entry[] entries;
    }

    //
    // Functions
    // -----------------------------------------------------------------------------------------------------------------
    function currentValue(BlockNumbUints storage self)
    internal
    view
    returns (uint256)
    {
        return valueAt(self, block.number);
    }

    function currentEntry(BlockNumbUints storage self)
    internal
    view
    returns (Entry)
    {
        return entryAt(self, block.number);
    }

    function valueAt(BlockNumbUints storage self, uint256 _blockNumber)
    internal
    view
    returns (uint256)
    {
        return entryAt(self, _blockNumber).value;
    }

    function entryAt(BlockNumbUints storage self, uint256 _blockNumber)
    internal
    view
    returns (Entry)
    {
        return self.entries[indexByBlockNumber(self, _blockNumber)];
    }

    function addEntry(BlockNumbUints storage self, uint256 blockNumber, uint256 value)
    internal
    {
        require(
            0 == self.entries.length ||
            blockNumber > self.entries[self.entries.length - 1].blockNumber
        );

        self.entries.push(Entry(blockNumber, value));
    }

    function count(BlockNumbUints storage self)
    internal
    view
    returns (uint256)
    {
        return self.entries.length;
    }

    function entries(BlockNumbUints storage self)
    internal
    view
    returns (Entry[])
    {
        return self.entries;
    }

    function indexByBlockNumber(BlockNumbUints storage self, uint256 blockNumber)
    internal
    view
    returns (uint256)
    {
        require(0 < self.entries.length);
        for (uint256 i = self.entries.length - 1; i >= 0; i--)
            if (blockNumber >= self.entries[i].blockNumber)
                return i;
        revert();
    }
}

/*
 * Hubii Nahmii
 *
 * Compliant with the Hubii Nahmii specification v0.12.
 *
 * Copyright (C) 2017-2018 Hubii AS
 */



library BlockNumbIntsLib {
    //
    // Structures
    // -----------------------------------------------------------------------------------------------------------------
    struct Entry {
        uint256 blockNumber;
        int256 value;
    }

    struct BlockNumbInts {
        Entry[] entries;
    }

    //
    // Functions
    // -----------------------------------------------------------------------------------------------------------------
    function currentValue(BlockNumbInts storage self)
    internal
    view
    returns (int256)
    {
        return valueAt(self, block.number);
    }

    function currentEntry(BlockNumbInts storage self)
    internal
    view
    returns (Entry)
    {
        return entryAt(self, block.number);
    }

    function valueAt(BlockNumbInts storage self, uint256 _blockNumber)
    internal
    view
    returns (int256)
    {
        return entryAt(self, _blockNumber).value;
    }

    function entryAt(BlockNumbInts storage self, uint256 _blockNumber)
    internal
    view
    returns (Entry)
    {
        return self.entries[indexByBlockNumber(self, _blockNumber)];
    }

    function addEntry(BlockNumbInts storage self, uint256 blockNumber, int256 value)
    internal
    {
        require(
            0 == self.entries.length ||
            blockNumber > self.entries[self.entries.length - 1].blockNumber
        );

        self.entries.push(Entry(blockNumber, value));
    }

    function count(BlockNumbInts storage self)
    internal
    view
    returns (uint256)
    {
        return self.entries.length;
    }

    function entries(BlockNumbInts storage self)
    internal
    view
    returns (Entry[])
    {
        return self.entries;
    }

    function indexByBlockNumber(BlockNumbInts storage self, uint256 blockNumber)
    internal
    view
    returns (uint256)
    {
        require(0 < self.entries.length);
        for (uint256 i = self.entries.length - 1; i >= 0; i--)
            if (blockNumber >= self.entries[i].blockNumber)
                return i;
        revert();
    }
}

/*
 * Hubii Nahmii
 *
 * Compliant with the Hubii Nahmii specification v0.12.
 *
 * Copyright (C) 2017-2018 Hubii AS
 */



library ConstantsLib {
    // Get the fraction that represents the entirety, equivalent of 100%
    function PARTS_PER()
    public
    pure
    returns (int256)
    {
        return 1e18;
    }
}

/*
 * Hubii Nahmii
 *
 * Compliant with the Hubii Nahmii specification v0.12.
 *
 * Copyright (C) 2017-2018 Hubii AS
 */






library BlockNumbDisdIntsLib {
    using SafeMathIntLib for int256;

    //
    // Structures
    // -----------------------------------------------------------------------------------------------------------------
    struct Discount {
        int256 tier;
        int256 value;
    }

    struct Entry {
        uint256 blockNumber;
        int256 nominal;
        Discount[] discounts;
    }

    struct BlockNumbDisdInts {
        Entry[] entries;
    }

    //
    // Functions
    // -----------------------------------------------------------------------------------------------------------------
    function currentNominalValue(BlockNumbDisdInts storage self)
    internal
    view
    returns (int256)
    {
        return nominalValueAt(self, block.number);
    }

    function currentDiscountedValue(BlockNumbDisdInts storage self, int256 tier)
    internal
    view
    returns (int256)
    {
        return discountedValueAt(self, block.number, tier);
    }

    function currentEntry(BlockNumbDisdInts storage self)
    internal
    view
    returns (Entry)
    {
        return entryAt(self, block.number);
    }

    function nominalValueAt(BlockNumbDisdInts storage self, uint256 _blockNumber)
    internal
    view
    returns (int256)
    {
        return entryAt(self, _blockNumber).nominal;
    }

    function discountedValueAt(BlockNumbDisdInts storage self, uint256 _blockNumber, int256 tier)
    internal
    view
    returns (int256)
    {
        Entry memory entry = entryAt(self, _blockNumber);
        if (0 < entry.discounts.length) {
            uint256 index = indexByTier(entry.discounts, tier);
            if (0 < index)
                return entry.nominal.mul(
                    ConstantsLib.PARTS_PER().sub(entry.discounts[index - 1].value)
                ).div(
                    ConstantsLib.PARTS_PER()
                );
            else
                return entry.nominal;
        } else
            return entry.nominal;
    }

    function entryAt(BlockNumbDisdInts storage self, uint256 _blockNumber)
    internal
    view
    returns (Entry)
    {
        return self.entries[indexByBlockNumber(self, _blockNumber)];
    }

    function addNominalEntry(BlockNumbDisdInts storage self, uint256 blockNumber, int256 nominal)
    internal
    {
        require(
            0 == self.entries.length ||
            blockNumber > self.entries[self.entries.length - 1].blockNumber
        );

        self.entries.length++;
        Entry storage entry = self.entries[self.entries.length - 1];

        entry.blockNumber = blockNumber;
        entry.nominal = nominal;
    }

    function addDiscountedEntry(BlockNumbDisdInts storage self, uint256 blockNumber, int256 nominal,
        int256[] discountTiers, int256[] discountValues)
    internal
    {
        require(discountTiers.length == discountValues.length);

        addNominalEntry(self, blockNumber, nominal);

        Entry storage entry = self.entries[self.entries.length - 1];
        for (uint256 i = 0; i < discountTiers.length; i++)
            entry.discounts.push(Discount(discountTiers[i], discountValues[i]));
    }

    function count(BlockNumbDisdInts storage self)
    internal
    view
    returns (uint256)
    {
        return self.entries.length;
    }

    function entries(BlockNumbDisdInts storage self)
    internal
    view
    returns (Entry[])
    {
        return self.entries;
    }

    function indexByBlockNumber(BlockNumbDisdInts storage self, uint256 blockNumber)
    internal
    view
    returns (uint256)
    {
        require(0 < self.entries.length);
        for (uint256 i = self.entries.length - 1; i >= 0; i--)
            if (blockNumber >= self.entries[i].blockNumber)
                return i;
        revert();
    }

    /// @dev The index returned here is 1-based
    function indexByTier(Discount[] discounts, int256 tier)
    internal
    pure
    returns (uint256)
    {
        require(0 < discounts.length);
        for (uint256 i = discounts.length; i > 0; i--)
            if (tier >= discounts[i - 1].tier)
                return i;
        return 0;
    }
}

/*
 * Hubii Nahmii
 *
 * Compliant with the Hubii Nahmii specification v0.12.
 *
 * Copyright (C) 2017-2018 Hubii AS
 */




/**
 * @title     MonetaryTypesLib
 * @dev       Monetary data types
 */
library MonetaryTypesLib {
    //
    // Structures
    // -----------------------------------------------------------------------------------------------------------------
    struct Currency {
        address ct;
        uint256 id;
    }

    struct Figure {
        int256 amount;
        Currency currency;
    }

    struct NoncedAmount {
        uint256 nonce;
        int256 amount;
    }
}

/*
 * Hubii Nahmii
 *
 * Compliant with the Hubii Nahmii specification v0.12.
 *
 * Copyright (C) 2017-2018 Hubii AS
 */





library BlockNumbReferenceCurrenciesLib {
    //
    // Structures
    // -----------------------------------------------------------------------------------------------------------------
    struct Entry {
        uint256 blockNumber;
        MonetaryTypesLib.Currency currency;
    }

    struct BlockNumbReferenceCurrencies {
        mapping(address => mapping(uint256 => Entry[])) entriesByCurrency;
    }

    //
    // Functions
    // -----------------------------------------------------------------------------------------------------------------
    function currentCurrency(BlockNumbReferenceCurrencies storage self, MonetaryTypesLib.Currency referenceCurrency)
    internal
    view
    returns (MonetaryTypesLib.Currency storage)
    {
        return currencyAt(self, referenceCurrency, block.number);
    }

    function currentEntry(BlockNumbReferenceCurrencies storage self, MonetaryTypesLib.Currency referenceCurrency)
    internal
    view
    returns (Entry storage)
    {
        return entryAt(self, referenceCurrency, block.number);
    }

    function currencyAt(BlockNumbReferenceCurrencies storage self, MonetaryTypesLib.Currency referenceCurrency,
        uint256 _blockNumber)
    internal
    view
    returns (MonetaryTypesLib.Currency storage)
    {
        return entryAt(self, referenceCurrency, _blockNumber).currency;
    }

    function entryAt(BlockNumbReferenceCurrencies storage self, MonetaryTypesLib.Currency referenceCurrency,
        uint256 _blockNumber)
    internal
    view
    returns (Entry storage)
    {
        return self.entriesByCurrency[referenceCurrency.ct][referenceCurrency.id][indexByBlockNumber(self, referenceCurrency, _blockNumber)];
    }

    function addEntry(BlockNumbReferenceCurrencies storage self, uint256 blockNumber,
        MonetaryTypesLib.Currency referenceCurrency, MonetaryTypesLib.Currency currency)
    internal
    {
        require(
            0 == self.entriesByCurrency[referenceCurrency.ct][referenceCurrency.id].length ||
            blockNumber > self.entriesByCurrency[referenceCurrency.ct][referenceCurrency.id][self.entriesByCurrency[referenceCurrency.ct][referenceCurrency.id].length - 1].blockNumber
        );

        self.entriesByCurrency[referenceCurrency.ct][referenceCurrency.id].push(Entry(blockNumber, currency));
    }

    function count(BlockNumbReferenceCurrencies storage self, MonetaryTypesLib.Currency referenceCurrency)
    internal
    view
    returns (uint256)
    {
        return self.entriesByCurrency[referenceCurrency.ct][referenceCurrency.id].length;
    }

    function entriesByCurrency(BlockNumbReferenceCurrencies storage self, MonetaryTypesLib.Currency referenceCurrency)
    internal
    view
    returns (Entry[] storage)
    {
        return self.entriesByCurrency[referenceCurrency.ct][referenceCurrency.id];
    }

    function indexByBlockNumber(BlockNumbReferenceCurrencies storage self, MonetaryTypesLib.Currency referenceCurrency, uint256 blockNumber)
    internal
    view
    returns (uint256)
    {
        require(0 < self.entriesByCurrency[referenceCurrency.ct][referenceCurrency.id].length);
        for (uint256 i = self.entriesByCurrency[referenceCurrency.ct][referenceCurrency.id].length - 1; i >= 0; i--)
            if (blockNumber >= self.entriesByCurrency[referenceCurrency.ct][referenceCurrency.id][i].blockNumber)
                return i;
        revert();
    }
}

/*
 * Hubii Nahmii
 *
 * Compliant with the Hubii Nahmii specification v0.12.
 *
 * Copyright (C) 2017-2018 Hubii AS
 */






library BlockNumbFiguresLib {
    //
    // Structures
    // -----------------------------------------------------------------------------------------------------------------
    struct Entry {
        uint256 blockNumber;
        MonetaryTypesLib.Figure value;
    }

    struct BlockNumbFigures {
        Entry[] entries;
    }

    //
    // Functions
    // -----------------------------------------------------------------------------------------------------------------
    function currentValue(BlockNumbFigures storage self)
    internal
    view
    returns (MonetaryTypesLib.Figure storage)
    {
        return valueAt(self, block.number);
    }

    function currentEntry(BlockNumbFigures storage self)
    internal
    view
    returns (Entry storage)
    {
        return entryAt(self, block.number);
    }

    function valueAt(BlockNumbFigures storage self, uint256 _blockNumber)
    internal
    view
    returns (MonetaryTypesLib.Figure storage)
    {
        return entryAt(self, _blockNumber).value;
    }

    function entryAt(BlockNumbFigures storage self, uint256 _blockNumber)
    internal
    view
    returns (Entry storage)
    {
        return self.entries[indexByBlockNumber(self, _blockNumber)];
    }

    function addEntry(BlockNumbFigures storage self, uint256 blockNumber, MonetaryTypesLib.Figure value)
    internal
    {
        require(
            0 == self.entries.length ||
            blockNumber > self.entries[self.entries.length - 1].blockNumber
        );

        self.entries.push(Entry(blockNumber, value));
    }

    function count(BlockNumbFigures storage self)
    internal
    view
    returns (uint256)
    {
        return self.entries.length;
    }

    function entries(BlockNumbFigures storage self)
    internal
    view
    returns (Entry[] storage)
    {
        return self.entries;
    }

    function indexByBlockNumber(BlockNumbFigures storage self, uint256 blockNumber)
    internal
    view
    returns (uint256)
    {
        require(0 < self.entries.length);
        for (uint256 i = self.entries.length - 1; i >= 0; i--)
            if (blockNumber >= self.entries[i].blockNumber)
                return i;
        revert();
    }
}

/*
 * Hubii Nahmii
 *
 * Compliant with the Hubii Nahmii specification v0.12.
 *
 * Copyright (C) 2017-2018 Hubii AS
 */
















/**
 * @title Configuration
 * @notice An oracle for configurations values
 */
contract Configuration is Modifiable, Ownable, Servable {
    using SafeMathIntLib for int256;
    using BlockNumbUintsLib for BlockNumbUintsLib.BlockNumbUints;
    using BlockNumbIntsLib for BlockNumbIntsLib.BlockNumbInts;
    using BlockNumbDisdIntsLib for BlockNumbDisdIntsLib.BlockNumbDisdInts;
    using BlockNumbReferenceCurrenciesLib for BlockNumbReferenceCurrenciesLib.BlockNumbReferenceCurrencies;
    using BlockNumbFiguresLib for BlockNumbFiguresLib.BlockNumbFigures;

    //
    // Constants
    // -----------------------------------------------------------------------------------------------------------------
    string constant public OPERATIONAL_MODE_ACTION = "operational_mode";

    //
    // Enums
    // -----------------------------------------------------------------------------------------------------------------
    enum OperationalMode {Normal, Exit}

    //
    // Variables
    // -----------------------------------------------------------------------------------------------------------------
    OperationalMode public operationalMode = OperationalMode.Normal;

    BlockNumbUintsLib.BlockNumbUints private updateDelayBlocksByBlockNumber;
    BlockNumbUintsLib.BlockNumbUints private confirmationBlocksByBlockNumber;

    BlockNumbDisdIntsLib.BlockNumbDisdInts private tradeMakerFeeByBlockNumber;
    BlockNumbDisdIntsLib.BlockNumbDisdInts private tradeTakerFeeByBlockNumber;
    BlockNumbDisdIntsLib.BlockNumbDisdInts private paymentFeeByBlockNumber;
    mapping(address => mapping(uint256 => BlockNumbDisdIntsLib.BlockNumbDisdInts)) private currencyPaymentFeeByBlockNumber;

    BlockNumbIntsLib.BlockNumbInts private tradeMakerMinimumFeeByBlockNumber;
    BlockNumbIntsLib.BlockNumbInts private tradeTakerMinimumFeeByBlockNumber;
    BlockNumbIntsLib.BlockNumbInts private paymentMinimumFeeByBlockNumber;
    mapping(address => mapping(uint256 => BlockNumbIntsLib.BlockNumbInts)) private currencyPaymentMinimumFeeByBlockNumber;

    BlockNumbReferenceCurrenciesLib.BlockNumbReferenceCurrencies private feeCurrencyByCurrencyBlockNumber;

    BlockNumbUintsLib.BlockNumbUints private walletLockTimeoutByBlockNumber;
    BlockNumbUintsLib.BlockNumbUints private cancelOrderChallengeTimeoutByBlockNumber;
    BlockNumbUintsLib.BlockNumbUints private settlementChallengeTimeoutByBlockNumber;

    BlockNumbUintsLib.BlockNumbUints private fraudStakeFractionByBlockNumber;
    BlockNumbUintsLib.BlockNumbUints private walletSettlementStakeFractionByBlockNumber;
    BlockNumbUintsLib.BlockNumbUints private operatorSettlementStakeFractionByBlockNumber;

    BlockNumbFiguresLib.BlockNumbFigures private operatorSettlementStakeByBlockNumber;

    uint256 public earliestSettlementBlockNumber;
    bool public earliestSettlementBlockNumberUpdateDisabled;

    //
    // Events
    // -----------------------------------------------------------------------------------------------------------------
    event SetOperationalModeExitEvent();
    event SetUpdateDelayBlocksEvent(uint256 fromBlockNumber, uint256 newBlocks);
    event SetConfirmationBlocksEvent(uint256 fromBlockNumber, uint256 newBlocks);
    event SetTradeMakerFeeEvent(uint256 fromBlockNumber, int256 nominal, int256[] discountTiers, int256[] discountValues);
    event SetTradeTakerFeeEvent(uint256 fromBlockNumber, int256 nominal, int256[] discountTiers, int256[] discountValues);
    event SetPaymentFeeEvent(uint256 fromBlockNumber, int256 nominal, int256[] discountTiers, int256[] discountValues);
    event SetCurrencyPaymentFeeEvent(uint256 fromBlockNumber, address currencyCt, uint256 currencyId, int256 nominal,
        int256[] discountTiers, int256[] discountValues);
    event SetTradeMakerMinimumFeeEvent(uint256 fromBlockNumber, int256 nominal);
    event SetTradeTakerMinimumFeeEvent(uint256 fromBlockNumber, int256 nominal);
    event SetPaymentMinimumFeeEvent(uint256 fromBlockNumber, int256 nominal);
    event SetCurrencyPaymentMinimumFeeEvent(uint256 fromBlockNumber, address currencyCt, uint256 currencyId, int256 nominal);
    event SetFeeCurrencyEvent(uint256 fromBlockNumber, address referenceCurrencyCt, uint256 referenceCurrencyId,
        address feeCurrencyCt, uint256 feeCurrencyId);
    event SetWalletLockTimeoutEvent(uint256 fromBlockNumber, uint256 timeoutInSeconds);
    event SetCancelOrderChallengeTimeoutEvent(uint256 fromBlockNumber, uint256 timeoutInSeconds);
    event SetSettlementChallengeTimeoutEvent(uint256 fromBlockNumber, uint256 timeoutInSeconds);
    event SetWalletSettlementStakeFractionEvent(uint256 fromBlockNumber, uint256 stakeFraction);
    event SetOperatorSettlementStakeFractionEvent(uint256 fromBlockNumber, uint256 stakeFraction);
    event SetOperatorSettlementStakeEvent(uint256 fromBlockNumber, int256 stakeAmount, address stakeCurrencyCt,
        uint256 stakeCurrencyId);
    event SetFraudStakeFractionEvent(uint256 fromBlockNumber, uint256 stakeFraction);
    event SetEarliestSettlementBlockNumberEvent(uint256 earliestSettlementBlockNumber);
    event DisableEarliestSettlementBlockNumberUpdateEvent();

    //
    // Constructor
    // -----------------------------------------------------------------------------------------------------------------
    constructor(address deployer) Ownable(deployer) public {
        updateDelayBlocksByBlockNumber.addEntry(block.number, 0);
    }

    //

    // Public functions
    // -----------------------------------------------------------------------------------------------------------------
    /// @notice Set operational mode to Exit
    /// @dev Once operational mode is set to Exit it may not be set back to Normal
    function setOperationalModeExit()
    public
    onlyEnabledServiceAction(OPERATIONAL_MODE_ACTION)
    {
        operationalMode = OperationalMode.Exit;
        emit SetOperationalModeExitEvent();
    }

    /// @notice Return true if operational mode is Normal
    function isOperationalModeNormal()
    public
    view
    returns (bool)
    {
        return OperationalMode.Normal == operationalMode;
    }

    /// @notice Return true if operational mode is Exit
    function isOperationalModeExit()
    public
    view
    returns (bool)
    {
        return OperationalMode.Exit == operationalMode;
    }

    /// @notice Get the current value of update delay blocks
    /// @return The value of update delay blocks
    function updateDelayBlocks()
    public
    view
    returns (uint256)
    {
        return updateDelayBlocksByBlockNumber.currentValue();
    }

    /// @notice Get the count of update delay blocks values
    /// @return The count of update delay blocks values
    function updateDelayBlocksCount()
    public
    view
    returns (uint256)
    {
        return updateDelayBlocksByBlockNumber.count();
    }

    /// @notice Set the number of update delay blocks
    /// @param fromBlockNumber Block number from which the update applies
    /// @param newUpdateDelayBlocks The new update delay blocks value
    function setUpdateDelayBlocks(uint256 fromBlockNumber, uint256 newUpdateDelayBlocks)
    public
    onlyOperator
    onlyDelayedBlockNumber(fromBlockNumber)
    {
        updateDelayBlocksByBlockNumber.addEntry(fromBlockNumber, newUpdateDelayBlocks);
        emit SetUpdateDelayBlocksEvent(fromBlockNumber, newUpdateDelayBlocks);
    }

    /// @notice Get the current value of confirmation blocks
    /// @return The value of confirmation blocks
    function confirmationBlocks()
    public
    view
    returns (uint256)
    {
        return confirmationBlocksByBlockNumber.currentValue();
    }

    /// @notice Get the count of confirmation blocks values
    /// @return The count of confirmation blocks values
    function confirmationBlocksCount()
    public
    view
    returns (uint256)
    {
        return confirmationBlocksByBlockNumber.count();
    }

    /// @notice Set the number of confirmation blocks
    /// @param fromBlockNumber Block number from which the update applies
    /// @param newConfirmationBlocks The new confirmation blocks value
    function setConfirmationBlocks(uint256 fromBlockNumber, uint256 newConfirmationBlocks)
    public
    onlyOperator
    onlyDelayedBlockNumber(fromBlockNumber)
    {
        confirmationBlocksByBlockNumber.addEntry(fromBlockNumber, newConfirmationBlocks);
        emit SetConfirmationBlocksEvent(fromBlockNumber, newConfirmationBlocks);
    }

    /// @notice Get number of trade maker fee block number tiers
    function tradeMakerFeesCount()
    public
    view
    returns (uint256)
    {
        return tradeMakerFeeByBlockNumber.count();
    }

    /// @notice Get trade maker relative fee at given block number, possibly discounted by discount tier value
    /// @param blockNumber The concerned block number
    /// @param discountTier The concerned discount tier
    function tradeMakerFee(uint256 blockNumber, int256 discountTier)
    public
    view
    returns (int256)
    {
        return tradeMakerFeeByBlockNumber.discountedValueAt(blockNumber, discountTier);
    }

    /// @notice Set trade maker nominal relative fee and discount tiers and values at given block number tier
    /// @param fromBlockNumber Block number from which the update applies
    /// @param nominal Nominal relative fee
    /// @param nominal Discount tier levels
    /// @param nominal Discount values
    function setTradeMakerFee(uint256 fromBlockNumber, int256 nominal, int256[] discountTiers, int256[] discountValues)
    public
    onlyOperator
    onlyDelayedBlockNumber(fromBlockNumber)
    {
        tradeMakerFeeByBlockNumber.addDiscountedEntry(fromBlockNumber, nominal, discountTiers, discountValues);
        emit SetTradeMakerFeeEvent(fromBlockNumber, nominal, discountTiers, discountValues);
    }

    /// @notice Get number of trade taker fee block number tiers
    function tradeTakerFeesCount()
    public
    view
    returns (uint256)
    {
        return tradeTakerFeeByBlockNumber.count();
    }

    /// @notice Get trade taker relative fee at given block number, possibly discounted by discount tier value
    /// @param blockNumber The concerned block number
    /// @param discountTier The concerned discount tier
    function tradeTakerFee(uint256 blockNumber, int256 discountTier)
    public
    view
    returns (int256)
    {
        return tradeTakerFeeByBlockNumber.discountedValueAt(blockNumber, discountTier);
    }

    /// @notice Set trade taker nominal relative fee and discount tiers and values at given block number tier
    /// @param fromBlockNumber Block number from which the update applies
    /// @param nominal Nominal relative fee
    /// @param nominal Discount tier levels
    /// @param nominal Discount values
    function setTradeTakerFee(uint256 fromBlockNumber, int256 nominal, int256[] discountTiers, int256[] discountValues)
    public
    onlyOperator
    onlyDelayedBlockNumber(fromBlockNumber)
    {
        tradeTakerFeeByBlockNumber.addDiscountedEntry(fromBlockNumber, nominal, discountTiers, discountValues);
        emit SetTradeTakerFeeEvent(fromBlockNumber, nominal, discountTiers, discountValues);
    }

    /// @notice Get number of payment fee block number tiers
    function paymentFeesCount()
    public
    view
    returns (uint256)
    {
        return paymentFeeByBlockNumber.count();
    }

    /// @notice Get payment relative fee at given block number, possibly discounted by discount tier value
    /// @param blockNumber The concerned block number
    /// @param discountTier The concerned discount tier
    function paymentFee(uint256 blockNumber, int256 discountTier)
    public
    view
    returns (int256)
    {
        return paymentFeeByBlockNumber.discountedValueAt(blockNumber, discountTier);
    }

    /// @notice Set payment nominal relative fee and discount tiers and values at given block number tier
    /// @param fromBlockNumber Block number from which the update applies
    /// @param nominal Nominal relative fee
    /// @param nominal Discount tier levels
    /// @param nominal Discount values
    function setPaymentFee(uint256 fromBlockNumber, int256 nominal, int256[] discountTiers, int256[] discountValues)
    public
    onlyOperator
    onlyDelayedBlockNumber(fromBlockNumber)
    {
        paymentFeeByBlockNumber.addDiscountedEntry(fromBlockNumber, nominal, discountTiers, discountValues);
        emit SetPaymentFeeEvent(fromBlockNumber, nominal, discountTiers, discountValues);
    }

    /// @notice Get number of payment fee block number tiers of given currency
    /// @param currencyCt The address of the concerned currency contract (address(0) == ETH)
    /// @param currencyId The ID of the concerned currency (0 for ETH and ERC20)
    function currencyPaymentFeesCount(address currencyCt, uint256 currencyId)
    public
    view
    returns (uint256)
    {
        return currencyPaymentFeeByBlockNumber[currencyCt][currencyId].count();
    }

    /// @notice Get payment relative fee for given currency at given block number, possibly discounted by
    /// discount tier value
    /// @param blockNumber The concerned block number
    /// @param currencyCt The address of the concerned currency contract (address(0) == ETH)
    /// @param currencyId The ID of the concerned currency (0 for ETH and ERC20)
    /// @param discountTier The concerned discount tier
    function currencyPaymentFee(uint256 blockNumber, address currencyCt, uint256 currencyId, int256 discountTier)
    public
    view
    returns (int256)
    {
        if (0 < currencyPaymentFeeByBlockNumber[currencyCt][currencyId].count())
            return currencyPaymentFeeByBlockNumber[currencyCt][currencyId].discountedValueAt(
                blockNumber, discountTier
            );
        else
            return paymentFee(blockNumber, discountTier);
    }

    /// @notice Set payment nominal relative fee and discount tiers and values for given currency at given
    /// block number tier
    /// @param fromBlockNumber Block number from which the update applies
    /// @param currencyCt The address of the concerned currency contract (address(0) == ETH)
    /// @param currencyId The ID of the concerned currency (0 for ETH and ERC20)
    /// @param nominal Nominal relative fee
    /// @param nominal Discount tier levels
    /// @param nominal Discount values
    function setCurrencyPaymentFee(uint256 fromBlockNumber, address currencyCt, uint256 currencyId, int256 nominal,
        int256[] discountTiers, int256[] discountValues)
    public
    onlyOperator
    onlyDelayedBlockNumber(fromBlockNumber)
    {
        currencyPaymentFeeByBlockNumber[currencyCt][currencyId].addDiscountedEntry(
            fromBlockNumber, nominal, discountTiers, discountValues
        );
        emit SetCurrencyPaymentFeeEvent(
            fromBlockNumber, currencyCt, currencyId, nominal, discountTiers, discountValues
        );
    }

    /// @notice Get number of minimum trade maker fee block number tiers
    function tradeMakerMinimumFeesCount()
    public
    view
    returns (uint256)
    {
        return tradeMakerMinimumFeeByBlockNumber.count();
    }

    /// @notice Get trade maker minimum relative fee at given block number
    /// @param blockNumber The concerned block number
    function tradeMakerMinimumFee(uint256 blockNumber)
    public
    view
    returns (int256)
    {
        return tradeMakerMinimumFeeByBlockNumber.valueAt(blockNumber);
    }

    /// @notice Set trade maker minimum relative fee at given block number tier
    /// @param fromBlockNumber Block number from which the update applies
    /// @param nominal Minimum relative fee
    function setTradeMakerMinimumFee(uint256 fromBlockNumber, int256 nominal)
    public
    onlyOperator
    onlyDelayedBlockNumber(fromBlockNumber)
    {
        tradeMakerMinimumFeeByBlockNumber.addEntry(fromBlockNumber, nominal);
        emit SetTradeMakerMinimumFeeEvent(fromBlockNumber, nominal);
    }

    /// @notice Get number of minimum trade taker fee block number tiers
    function tradeTakerMinimumFeesCount()
    public
    view
    returns (uint256)
    {
        return tradeTakerMinimumFeeByBlockNumber.count();
    }

    /// @notice Get trade taker minimum relative fee at given block number
    /// @param blockNumber The concerned block number
    function tradeTakerMinimumFee(uint256 blockNumber)
    public
    view
    returns (int256)
    {
        return tradeTakerMinimumFeeByBlockNumber.valueAt(blockNumber);
    }

    /// @notice Set trade taker minimum relative fee at given block number tier
    /// @param fromBlockNumber Block number from which the update applies
    /// @param nominal Minimum relative fee
    function setTradeTakerMinimumFee(uint256 fromBlockNumber, int256 nominal)
    public
    onlyOperator
    onlyDelayedBlockNumber(fromBlockNumber)
    {
        tradeTakerMinimumFeeByBlockNumber.addEntry(fromBlockNumber, nominal);
        emit SetTradeTakerMinimumFeeEvent(fromBlockNumber, nominal);
    }

    /// @notice Get number of minimum payment fee block number tiers
    function paymentMinimumFeesCount()
    public
    view
    returns (uint256)
    {
        return paymentMinimumFeeByBlockNumber.count();
    }

    /// @notice Get payment minimum relative fee at given block number
    /// @param blockNumber The concerned block number
    function paymentMinimumFee(uint256 blockNumber)
    public
    view
    returns (int256)
    {
        return paymentMinimumFeeByBlockNumber.valueAt(blockNumber);
    }

    /// @notice Set payment minimum relative fee at given block number tier
    /// @param fromBlockNumber Block number from which the update applies
    /// @param nominal Minimum relative fee
    function setPaymentMinimumFee(uint256 fromBlockNumber, int256 nominal)
    public
    onlyOperator
    onlyDelayedBlockNumber(fromBlockNumber)
    {
        paymentMinimumFeeByBlockNumber.addEntry(fromBlockNumber, nominal);
        emit SetPaymentMinimumFeeEvent(fromBlockNumber, nominal);
    }

    /// @notice Get number of minimum payment fee block number tiers for given currency
    /// @param currencyCt The address of the concerned currency contract (address(0) == ETH)
    /// @param currencyId The ID of the concerned currency (0 for ETH and ERC20)
    function currencyPaymentMinimumFeesCount(address currencyCt, uint256 currencyId)
    public
    view
    returns (uint256)
    {
        return currencyPaymentMinimumFeeByBlockNumber[currencyCt][currencyId].count();
    }

    /// @notice Get payment minimum relative fee for given currency at given block number
    /// @param blockNumber The concerned block number
    /// @param currencyCt The address of the concerned currency contract (address(0) == ETH)
    /// @param currencyId The ID of the concerned currency (0 for ETH and ERC20)
    function currencyPaymentMinimumFee(uint256 blockNumber, address currencyCt, uint256 currencyId)
    public
    view
    returns (int256)
    {
        if (0 < currencyPaymentMinimumFeeByBlockNumber[currencyCt][currencyId].count())
            return currencyPaymentMinimumFeeByBlockNumber[currencyCt][currencyId].valueAt(blockNumber);
        else
            return paymentMinimumFee(blockNumber);
    }

    /// @notice Set payment minimum relative fee for given currency at given block number tier
    /// @param fromBlockNumber Block number from which the update applies
    /// @param currencyCt The address of the concerned currency contract (address(0) == ETH)
    /// @param currencyId The ID of the concerned currency (0 for ETH and ERC20)
    /// @param nominal Minimum relative fee
    function setCurrencyPaymentMinimumFee(uint256 fromBlockNumber, address currencyCt, uint256 currencyId, int256 nominal)
    public
    onlyOperator
    onlyDelayedBlockNumber(fromBlockNumber)
    {
        currencyPaymentMinimumFeeByBlockNumber[currencyCt][currencyId].addEntry(fromBlockNumber, nominal);
        emit SetCurrencyPaymentMinimumFeeEvent(fromBlockNumber, currencyCt, currencyId, nominal);
    }

    /// @notice Get number of fee currencies for the given reference currency
    /// @param currencyCt The address of the concerned reference currency contract (address(0) == ETH)
    /// @param currencyId The ID of the concerned reference currency (0 for ETH and ERC20)
    function feeCurrenciesCount(address currencyCt, uint256 currencyId)
    public
    view
    returns (uint256)
    {
        return feeCurrencyByCurrencyBlockNumber.count(MonetaryTypesLib.Currency(currencyCt, currencyId));
    }

    /// @notice Get the fee currency for the given reference currency at given block number
    /// @param blockNumber The concerned block number
    /// @param currencyCt The address of the concerned reference currency contract (address(0) == ETH)
    /// @param currencyId The ID of the concerned reference currency (0 for ETH and ERC20)
    function feeCurrency(uint256 blockNumber, address currencyCt, uint256 currencyId)
    public
    view
    returns (address ct, uint256 id)
    {
        MonetaryTypesLib.Currency storage _feeCurrency = feeCurrencyByCurrencyBlockNumber.currencyAt(
            MonetaryTypesLib.Currency(currencyCt, currencyId), blockNumber
        );
        ct = _feeCurrency.ct;
        id = _feeCurrency.id;
    }

    /// @notice Set the fee currency for the given reference currency at given block number
    /// @param fromBlockNumber Block number from which the update applies
    /// @param referenceCurrencyCt The address of the concerned reference currency contract (address(0) == ETH)
    /// @param referenceCurrencyId The ID of the concerned reference currency (0 for ETH and ERC20)
    /// @param feeCurrencyCt The address of the concerned fee currency contract (address(0) == ETH)
    /// @param feeCurrencyId The ID of the concerned fee currency (0 for ETH and ERC20)
    function setFeeCurrency(uint256 fromBlockNumber, address referenceCurrencyCt, uint256 referenceCurrencyId,
        address feeCurrencyCt, uint256 feeCurrencyId)
    public
    onlyOperator
    onlyDelayedBlockNumber(fromBlockNumber)
    {
        feeCurrencyByCurrencyBlockNumber.addEntry(
            fromBlockNumber,
            MonetaryTypesLib.Currency(referenceCurrencyCt, referenceCurrencyId),
            MonetaryTypesLib.Currency(feeCurrencyCt, feeCurrencyId)
        );
        emit SetFeeCurrencyEvent(fromBlockNumber, referenceCurrencyCt, referenceCurrencyId,
            feeCurrencyCt, feeCurrencyId);
    }

    /// @notice Get the current value of wallet lock timeout
    /// @return The value of wallet lock timeout
    function walletLockTimeout()
    public
    view
    returns (uint256)
    {
        return walletLockTimeoutByBlockNumber.currentValue();
    }

    /// @notice Set timeout of wallet lock
    /// @param fromBlockNumber Block number from which the update applies
    /// @param timeoutInSeconds Timeout duration in seconds
    function setWalletLockTimeout(uint256 fromBlockNumber, uint256 timeoutInSeconds)
    public
    onlyOperator
    onlyDelayedBlockNumber(fromBlockNumber)
    {
        walletLockTimeoutByBlockNumber.addEntry(fromBlockNumber, timeoutInSeconds);
        emit SetWalletLockTimeoutEvent(fromBlockNumber, timeoutInSeconds);
    }

    /// @notice Get the current value of cancel order challenge timeout
    /// @return The value of cancel order challenge timeout
    function cancelOrderChallengeTimeout()
    public
    view
    returns (uint256)
    {
        return cancelOrderChallengeTimeoutByBlockNumber.currentValue();
    }

    /// @notice Set timeout of cancel order challenge
    /// @param fromBlockNumber Block number from which the update applies
    /// @param timeoutInSeconds Timeout duration in seconds
    function setCancelOrderChallengeTimeout(uint256 fromBlockNumber, uint256 timeoutInSeconds)
    public
    onlyOperator
    onlyDelayedBlockNumber(fromBlockNumber)
    {
        cancelOrderChallengeTimeoutByBlockNumber.addEntry(fromBlockNumber, timeoutInSeconds);
        emit SetCancelOrderChallengeTimeoutEvent(fromBlockNumber, timeoutInSeconds);
    }

    /// @notice Get the current value of settlement challenge timeout
    /// @return The value of settlement challenge timeout
    function settlementChallengeTimeout()
    public
    view
    returns (uint256)
    {
        return settlementChallengeTimeoutByBlockNumber.currentValue();
    }

    /// @notice Set timeout of settlement challenges
    /// @param fromBlockNumber Block number from which the update applies
    /// @param timeoutInSeconds Timeout duration in seconds
    function setSettlementChallengeTimeout(uint256 fromBlockNumber, uint256 timeoutInSeconds)
    public
    onlyOperator
    onlyDelayedBlockNumber(fromBlockNumber)
    {
        settlementChallengeTimeoutByBlockNumber.addEntry(fromBlockNumber, timeoutInSeconds);
        emit SetSettlementChallengeTimeoutEvent(fromBlockNumber, timeoutInSeconds);
    }

    /// @notice Get the current value of fraud stake fraction
    /// @return The value of fraud stake fraction
    function fraudStakeFraction()
    public
    view
    returns (uint256)
    {
        return fraudStakeFractionByBlockNumber.currentValue();
    }

    /// @notice Set fraction of security bond that will be gained from successfully challenging
    /// in fraud challenge
    /// @param fromBlockNumber Block number from which the update applies
    /// @param stakeFraction The fraction gained
    function setFraudStakeFraction(uint256 fromBlockNumber, uint256 stakeFraction)
    public
    onlyOperator
    onlyDelayedBlockNumber(fromBlockNumber)
    {
        fraudStakeFractionByBlockNumber.addEntry(fromBlockNumber, stakeFraction);
        emit SetFraudStakeFractionEvent(fromBlockNumber, stakeFraction);
    }

    /// @notice Get the current value of wallet settlement stake fraction
    /// @return The value of wallet settlement stake fraction
    function walletSettlementStakeFraction()
    public
    view
    returns (uint256)
    {
        return walletSettlementStakeFractionByBlockNumber.currentValue();
    }

    /// @notice Set fraction of security bond that will be gained from successfully challenging
    /// in settlement challenge triggered by wallet
    /// @param fromBlockNumber Block number from which the update applies
    /// @param stakeFraction The fraction gained
    function setWalletSettlementStakeFraction(uint256 fromBlockNumber, uint256 stakeFraction)
    public
    onlyOperator
    onlyDelayedBlockNumber(fromBlockNumber)
    {
        walletSettlementStakeFractionByBlockNumber.addEntry(fromBlockNumber, stakeFraction);
        emit SetWalletSettlementStakeFractionEvent(fromBlockNumber, stakeFraction);
    }

    /// @notice Get the current value of operator settlement stake fraction
    /// @return The value of operator settlement stake fraction
    function operatorSettlementStakeFraction()
    public
    view
    returns (uint256)
    {
        return operatorSettlementStakeFractionByBlockNumber.currentValue();
    }

    /// @notice Set fraction of security bond that will be gained from successfully challenging
    /// in settlement challenge triggered by operator
    /// @param fromBlockNumber Block number from which the update applies
    /// @param stakeFraction The fraction gained
    function setOperatorSettlementStakeFraction(uint256 fromBlockNumber, uint256 stakeFraction)
    public
    onlyOperator
    onlyDelayedBlockNumber(fromBlockNumber)
    {
        operatorSettlementStakeFractionByBlockNumber.addEntry(fromBlockNumber, stakeFraction);
        emit SetOperatorSettlementStakeFractionEvent(fromBlockNumber, stakeFraction);
    }

    /// @notice Get the current value of operator settlement stake
    /// @return The value of operator settlement stake
    function operatorSettlementStake()
    public
    view
    returns (int256 amount, address currencyCt, uint256 currencyId)
    {
        MonetaryTypesLib.Figure storage stake = operatorSettlementStakeByBlockNumber.currentValue();
        amount = stake.amount;
        currencyCt = stake.currency.ct;
        currencyId = stake.currency.id;
    }

    /// @notice Set figure of security bond that will be gained from successfully challenging
    /// in settlement challenge triggered by operator
    /// @param fromBlockNumber Block number from which the update applies
    /// @param stakeAmount The amount gained
    /// @param stakeCurrencyCt The address of currency gained
    /// @param stakeCurrencyId The ID of currency gained
    function setOperatorSettlementStake(uint256 fromBlockNumber, int256 stakeAmount,
        address stakeCurrencyCt, uint256 stakeCurrencyId)
    public
    onlyOperator
    onlyDelayedBlockNumber(fromBlockNumber)
    {
        MonetaryTypesLib.Figure memory stake = MonetaryTypesLib.Figure(stakeAmount, MonetaryTypesLib.Currency(stakeCurrencyCt, stakeCurrencyId));
        operatorSettlementStakeByBlockNumber.addEntry(fromBlockNumber, stake);
        emit SetOperatorSettlementStakeEvent(fromBlockNumber, stakeAmount, stakeCurrencyCt, stakeCurrencyId);
    }

    /// @notice Set the block number of the earliest settlement initiation
    /// @param _earliestSettlementBlockNumber The block number of the earliest settlement
    function setEarliestSettlementBlockNumber(uint256 _earliestSettlementBlockNumber)
    public
    onlyOperator
    {
        earliestSettlementBlockNumber = _earliestSettlementBlockNumber;
        emit SetEarliestSettlementBlockNumberEvent(earliestSettlementBlockNumber);
    }

    /// @notice Disable further updates to the earliest settlement block number
    /// @dev This operation can not be undone
    function disableEarliestSettlementBlockNumberUpdate()
    public
    onlyOperator
    {
        earliestSettlementBlockNumberUpdateDisabled = true;
        emit DisableEarliestSettlementBlockNumberUpdateEvent();
    }

    //
    // Modifiers
    // -----------------------------------------------------------------------------------------------------------------
    modifier onlyDelayedBlockNumber(uint256 blockNumber) {
        require(
            0 == updateDelayBlocksByBlockNumber.count() ||
        blockNumber >= block.number + updateDelayBlocksByBlockNumber.currentValue()
        );
        _;
    }
}

Contract Security Audit

Contract ABI

API
[{"constant":false,"inputs":[{"name":"fromBlockNumber","type":"uint256"},{"name":"nominal","type":"int256"},{"name":"discountTiers","type":"int256[]"},{"name":"discountValues","type":"int256[]"}],"name":"setTradeMakerFee","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"operationalMode","outputs":[{"name":"","type":"uint8"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"currencyCt","type":"address"},{"name":"currencyId","type":"uint256"}],"name":"feeCurrenciesCount","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"blockNumber","type":"uint256"},{"name":"currencyCt","type":"address"},{"name":"currencyId","type":"uint256"}],"name":"currencyPaymentMinimumFee","outputs":[{"name":"","type":"int256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"service","type":"address"}],"name":"isRegisteredActiveService","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"fromBlockNumber","type":"uint256"},{"name":"referenceCurrencyCt","type":"address"},{"name":"referenceCurrencyId","type":"uint256"},{"name":"feeCurrencyCt","type":"address"},{"name":"feeCurrencyId","type":"uint256"}],"name":"setFeeCurrency","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"name":"blockNumber","type":"uint256"},{"name":"currencyCt","type":"address"},{"name":"currencyId","type":"uint256"},{"name":"discountTier","type":"int256"}],"name":"currencyPaymentFee","outputs":[{"name":"","type":"int256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"fromBlockNumber","type":"uint256"},{"name":"nominal","type":"int256"}],"name":"setPaymentMinimumFee","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"name":"blockNumber","type":"uint256"},{"name":"discountTier","type":"int256"}],"name":"tradeMakerFee","outputs":[{"name":"","type":"int256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[],"name":"triggerSelfDestruction","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"name":"blockNumber","type":"uint256"}],"name":"paymentMinimumFee","outputs":[{"name":"","type":"int256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"walletSettlementStakeFraction","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"paymentMinimumFeesCount","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"walletLockTimeout","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"service","type":"address"},{"name":"action","type":"string"}],"name":"enableServiceAction","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"name":"service","type":"address"}],"name":"isRegisteredService","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"selfDestructionDisabled","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"service","type":"address"},{"name":"action","type":"string"}],"name":"disableServiceAction","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"serviceActivationTimeout","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"fromBlockNumber","type":"uint256"},{"name":"timeoutInSeconds","type":"uint256"}],"name":"setWalletLockTimeout","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"fromBlockNumber","type":"uint256"},{"name":"stakeFraction","type":"uint256"}],"name":"setWalletSettlementStakeFraction","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"destructor","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"confirmationBlocks","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"fromBlockNumber","type":"uint256"},{"name":"nominal","type":"int256"},{"name":"discountTiers","type":"int256[]"},{"name":"discountValues","type":"int256[]"}],"name":"setPaymentFee","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"name":"currencyCt","type":"address"},{"name":"currencyId","type":"uint256"}],"name":"currencyPaymentMinimumFeesCount","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"service","type":"address"}],"name":"deregisterService","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"tradeMakerMinimumFeesCount","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"fromBlockNumber","type":"uint256"},{"name":"stakeAmount","type":"int256"},{"name":"stakeCurrencyCt","type":"address"},{"name":"stakeCurrencyId","type":"uint256"}],"name":"setOperatorSettlementStake","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"operator","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"service","type":"address"},{"name":"action","type":"string"}],"name":"isEnabledServiceAction","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"fromBlockNumber","type":"uint256"},{"name":"nominal","type":"int256"},{"name":"discountTiers","type":"int256[]"},{"name":"discountValues","type":"int256[]"}],"name":"setTradeTakerFee","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"fromBlockNumber","type":"uint256"},{"name":"nominal","type":"int256"}],"name":"setTradeTakerMinimumFee","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"name":"blockNumber","type":"uint256"},{"name":"discountTier","type":"int256"}],"name":"tradeTakerFee","outputs":[{"name":"","type":"int256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[],"name":"disableSelfDestruction","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"fromBlockNumber","type":"uint256"},{"name":"stakeFraction","type":"uint256"}],"name":"setOperatorSettlementStakeFraction","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"fromBlockNumber","type":"uint256"},{"name":"timeoutInSeconds","type":"uint256"}],"name":"setSettlementChallengeTimeout","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"fromBlockNumber","type":"uint256"},{"name":"newUpdateDelayBlocks","type":"uint256"}],"name":"setUpdateDelayBlocks","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"fromBlockNumber","type":"uint256"},{"name":"stakeFraction","type":"uint256"}],"name":"setFraudStakeFraction","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"timeoutInSeconds","type":"uint256"}],"name":"setServiceActivationTimeout","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"name":"currencyCt","type":"address"},{"name":"currencyId","type":"uint256"}],"name":"currencyPaymentFeesCount","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"tradeTakerFeesCount","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"updateDelayBlocksCount","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"paymentFeesCount","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"tradeTakerMinimumFeesCount","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"service","type":"address"}],"name":"registerServiceDeferred","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"fromBlockNumber","type":"uint256"},{"name":"timeoutInSeconds","type":"uint256"}],"name":"setCancelOrderChallengeTimeout","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"cancelOrderChallengeTimeout","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"newDeployer","type":"address"}],"name":"setDeployer","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"fraudStakeFraction","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[],"name":"disableEarliestSettlementBlockNumberUpdate","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"name":"blockNumber","type":"uint256"},{"name":"currencyCt","type":"address"},{"name":"currencyId","type":"uint256"}],"name":"feeCurrency","outputs":[{"name":"ct","type":"address"},{"name":"id","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"operatorSettlementStakeFraction","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"blockNumber","type":"uint256"},{"name":"discountTier","type":"int256"}],"name":"paymentFee","outputs":[{"name":"","type":"int256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"tradeMakerFeesCount","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"newOperator","type":"address"}],"name":"setOperator","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"earliestSettlementBlockNumber","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"OPERATIONAL_MODE_ACTION","outputs":[{"name":"","type":"string"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"isOperationalModeExit","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"confirmationBlocksCount","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"fromBlockNumber","type":"uint256"},{"name":"currencyCt","type":"address"},{"name":"currencyId","type":"uint256"},{"name":"nominal","type":"int256"}],"name":"setCurrencyPaymentMinimumFee","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"updateDelayBlocks","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"operatorSettlementStake","outputs":[{"name":"amount","type":"int256"},{"name":"currencyCt","type":"address"},{"name":"currencyId","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"deployer","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"earliestSettlementBlockNumberUpdateDisabled","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"blockNumber","type":"uint256"}],"name":"tradeMakerMinimumFee","outputs":[{"name":"","type":"int256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"blockNumber","type":"uint256"}],"name":"tradeTakerMinimumFee","outputs":[{"name":"","type":"int256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"fromBlockNumber","type":"uint256"},{"name":"nominal","type":"int256"}],"name":"setTradeMakerMinimumFee","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"_earliestSettlementBlockNumber","type":"uint256"}],"name":"setEarliestSettlementBlockNumber","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"isOperationalModeNormal","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"fromBlockNumber","type":"uint256"},{"name":"currencyCt","type":"address"},{"name":"currencyId","type":"uint256"},{"name":"nominal","type":"int256"},{"name":"discountTiers","type":"int256[]"},{"name":"discountValues","type":"int256[]"}],"name":"setCurrencyPaymentFee","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[],"name":"setOperationalModeExit","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"settlementChallengeTimeout","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"service","type":"address"}],"name":"registerService","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"fromBlockNumber","type":"uint256"},{"name":"newConfirmationBlocks","type":"uint256"}],"name":"setConfirmationBlocks","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"inputs":[{"name":"deployer","type":"address"}],"payable":false,"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[],"name":"SetOperationalModeExitEvent","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"name":"fromBlockNumber","type":"uint256"},{"indexed":false,"name":"newBlocks","type":"uint256"}],"name":"SetUpdateDelayBlocksEvent","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"name":"fromBlockNumber","type":"uint256"},{"indexed":false,"name":"newBlocks","type":"uint256"}],"name":"SetConfirmationBlocksEvent","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"name":"fromBlockNumber","type":"uint256"},{"indexed":false,"name":"nominal","type":"int256"},{"indexed":false,"name":"discountTiers","type":"int256[]"},{"indexed":false,"name":"discountValues","type":"int256[]"}],"name":"SetTradeMakerFeeEvent","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"name":"fromBlockNumber","type":"uint256"},{"indexed":false,"name":"nominal","type":"int256"},{"indexed":false,"name":"discountTiers","type":"int256[]"},{"indexed":false,"name":"discountValues","type":"int256[]"}],"name":"SetTradeTakerFeeEvent","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"name":"fromBlockNumber","type":"uint256"},{"indexed":false,"name":"nominal","type":"int256"},{"indexed":false,"name":"discountTiers","type":"int256[]"},{"indexed":false,"name":"discountValues","type":"int256[]"}],"name":"SetPaymentFeeEvent","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"name":"fromBlockNumber","type":"uint256"},{"indexed":false,"name":"currencyCt","type":"address"},{"indexed":false,"name":"currencyId","type":"uint256"},{"indexed":false,"name":"nominal","type":"int256"},{"indexed":false,"name":"discountTiers","type":"int256[]"},{"indexed":false,"name":"discountValues","type":"int256[]"}],"name":"SetCurrencyPaymentFeeEvent","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"name":"fromBlockNumber","type":"uint256"},{"indexed":false,"name":"nominal","type":"int256"}],"name":"SetTradeMakerMinimumFeeEvent","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"name":"fromBlockNumber","type":"uint256"},{"indexed":false,"name":"nominal","type":"int256"}],"name":"SetTradeTakerMinimumFeeEvent","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"name":"fromBlockNumber","type":"uint256"},{"indexed":false,"name":"nominal","type":"int256"}],"name":"SetPaymentMinimumFeeEvent","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"name":"fromBlockNumber","type":"uint256"},{"indexed":false,"name":"currencyCt","type":"address"},{"indexed":false,"name":"currencyId","type":"uint256"},{"indexed":false,"name":"nominal","type":"int256"}],"name":"SetCurrencyPaymentMinimumFeeEvent","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"name":"fromBlockNumber","type":"uint256"},{"indexed":false,"name":"referenceCurrencyCt","type":"address"},{"indexed":false,"name":"referenceCurrencyId","type":"uint256"},{"indexed":false,"name":"feeCurrencyCt","type":"address"},{"indexed":false,"name":"feeCurrencyId","type":"uint256"}],"name":"SetFeeCurrencyEvent","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"name":"fromBlockNumber","type":"uint256"},{"indexed":false,"name":"timeoutInSeconds","type":"uint256"}],"name":"SetWalletLockTimeoutEvent","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"name":"fromBlockNumber","type":"uint256"},{"indexed":false,"name":"timeoutInSeconds","type":"uint256"}],"name":"SetCancelOrderChallengeTimeoutEvent","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"name":"fromBlockNumber","type":"uint256"},{"indexed":false,"name":"timeoutInSeconds","type":"uint256"}],"name":"SetSettlementChallengeTimeoutEvent","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"name":"fromBlockNumber","type":"uint256"},{"indexed":false,"name":"stakeFraction","type":"uint256"}],"name":"SetWalletSettlementStakeFractionEvent","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"name":"fromBlockNumber","type":"uint256"},{"indexed":false,"name":"stakeFraction","type":"uint256"}],"name":"SetOperatorSettlementStakeFractionEvent","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"name":"fromBlockNumber","type":"uint256"},{"indexed":false,"name":"stakeAmount","type":"int256"},{"indexed":false,"name":"stakeCurrencyCt","type":"address"},{"indexed":false,"name":"stakeCurrencyId","type":"uint256"}],"name":"SetOperatorSettlementStakeEvent","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"name":"fromBlockNumber","type":"uint256"},{"indexed":false,"name":"stakeFraction","type":"uint256"}],"name":"SetFraudStakeFractionEvent","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"name":"earliestSettlementBlockNumber","type":"uint256"}],"name":"SetEarliestSettlementBlockNumberEvent","type":"event"},{"anonymous":false,"inputs":[],"name":"DisableEarliestSettlementBlockNumberUpdateEvent","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"name":"timeoutInSeconds","type":"uint256"}],"name":"ServiceActivationTimeoutEvent","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"name":"service","type":"address"}],"name":"RegisterServiceEvent","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"name":"service","type":"address"},{"indexed":false,"name":"timeout","type":"uint256"}],"name":"RegisterServiceDeferredEvent","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"name":"service","type":"address"}],"name":"DeregisterServiceEvent","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"name":"service","type":"address"},{"indexed":false,"name":"action","type":"string"}],"name":"EnableServiceActionEvent","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"name":"service","type":"address"},{"indexed":false,"name":"action","type":"string"}],"name":"DisableServiceActionEvent","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"name":"oldDeployer","type":"address"},{"indexed":false,"name":"newDeployer","type":"address"}],"name":"SetDeployerEvent","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"name":"oldOperator","type":"address"},{"indexed":false,"name":"newOperator","type":"address"}],"name":"SetOperatorEvent","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"name":"wallet","type":"address"}],"name":"SelfDestructionDisabledEvent","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"name":"wallet","type":"address"}],"name":"TriggerSelfDestructionEvent","type":"event"}]

60806040526004805460ff191690553480156200001b57600080fd5b506040516020806200394083398101806040526200003d919081019062000157565b8080600160a060020a03811615156200005557600080fd5b600160a060020a0381163014156200006c57600080fd5b506000805461010060a860020a031916610100600160a060020a039390931692830217815560018054600160a060020a031916909217909155620000c3906005904390640100000000620000ca8102620025e61704565b506200018c565b82541580620000fc5750825483906000198101908110620000e757fe5b90600052602060002090600202016000015482115b15156200010857600080fd5b6040805180820190915291825260208083019182528354600181810186556000958652919094209251600290940290920192835551910155565b600062000150825162000180565b9392505050565b6000602082840312156200016a57600080fd5b600062000178848462000142565b949350505050565b600160a060020a031690565b6137a4806200019c6000396000f30060806040526004361061034a5763ffffffff60e060020a6000350416630783e3db811461034f5780630f4e74691461037157806312e5c6541461039c578063158c1848146103c957806317ba3f90146103e95780631af78f09146104165780631b6eb59f146104365780632585f2781461045657806326c3acc3146104765780632738a11214610496578063273cc25f146104ab57806328b5f95c146104cb57806328eb2edd146104e057806329ea3faa146104f55780632b5672e31461050a5780632b91e0a91461052a5780632f013a001461054a5780633b58c5011461055f5780633b7bea6c1461057f5780633b8bba6c1461059457806342399aea146105b45780634476d23b146105d4578063460a58aa146105f65780634a6cf8451461060b5780634fd9b0e51461062b57806350b08c021461064b578063543877301461066b57806354f4338014610680578063570ca735146106a05780635df1b0a3146106b557806363f6e017146106d55780636c671a52146106f55780636c98600c1461071557806370327ea11461073557806374bcea6b1461074a578063768f594c1461076a578063778228401461078a57806377bad2cf146107aa5780637e15dd5c146107ca5780637e864666146107ea578063847bb1821461080a578063854e7fbf1461081f578063868a674f1461083457806389eec486146108495780638e8cef121461085e57806393d1243f1461087e578063940b81001461089e57806396214735146108b35780639699f337146108d35780639bbb0ff2146108e8578063a329fad5146108fd578063ac00d3b21461092b578063ad08605414610940578063b12aa34314610960578063b3ab15fb14610975578063b6bf417614610995578063b78272e0146109aa578063be189480146109cc578063c136df85146109e1578063c1959cc5146109f6578063c946b6e914610a16578063ccd03d2e14610a2b578063d5f3948814610a4f578063d7f0f97114610a64578063dc7dc62c14610a79578063ecb41ad814610a99578063efda7ffc14610ab9578063f69c70a014610ad9578063f71e860f14610af9578063f8b37af014610b0e578063f8e6e88814610b2e578063fbdfd8e714610b43578063fdd9ec7d14610b58578063fe98a9dc14610b78575b600080fd5b34801561035b57600080fd5b5061036f61036a36600461331d565b610b98565b005b34801561037d57600080fd5b50610386610c30565b60405161039391906134c8565b60405180910390f35b3480156103a857600080fd5b506103bc6103b7366004613076565b610c39565b60405161039391906134d6565b3480156103d557600080fd5b506103bc6103e43660046130e2565b610c75565b3480156103f557600080fd5b50610409610404366004613007565b610cf3565b60405161039391906134ba565b34801561042257600080fd5b5061036f61043136600461312f565b610d27565b34801561044257600080fd5b506103bc6104513660046131a4565b610df2565b34801561046257600080fd5b5061036f6104713660046132ba565b610e73565b34801561048257600080fd5b506103bc6104913660046132ba565b610f03565b3480156104a257600080fd5b5061036f610f17565b3480156104b757600080fd5b506103bc6104c63660046130c4565b610f7d565b3480156104d757600080fd5b506103bc610f90565b3480156104ec57600080fd5b506103bc610fa2565b34801561050157600080fd5b506103bc610fae565b34801561051657600080fd5b5061036f610525366004613025565b610fba565b34801561053657600080fd5b50610409610545366004613007565b6110e8565b34801561055657600080fd5b50610409611106565b34801561056b57600080fd5b5061036f61057a366004613025565b61110f565b34801561058b57600080fd5b506103bc6111ef565b3480156105a057600080fd5b5061036f6105af3660046132ba565b6111f5565b3480156105c057600080fd5b5061036f6105cf3660046132ba565b611278565b3480156105e057600080fd5b506105e96112fb565b6040516103939190613456565b34801561060257600080fd5b506103bc61130f565b34801561061757600080fd5b5061036f61062636600461331d565b61131b565b34801561063757600080fd5b506103bc610646366004613076565b6113a4565b34801561065757600080fd5b5061036f610666366004613007565b6113d0565b34801561067757600080fd5b506103bc611492565b34801561068c57600080fd5b5061036f61069b3660046132d9565b61149e565b3480156106ac57600080fd5b506105e961155d565b3480156106c157600080fd5b506104096106d0366004613025565b61156c565b3480156106e157600080fd5b5061036f6106f036600461331d565b6115be565b34801561070157600080fd5b5061036f6107103660046132ba565b611647565b34801561072157600080fd5b506103bc6107303660046132ba565b6116ca565b34801561074157600080fd5b5061036f6116de565b34801561075657600080fd5b5061036f6107653660046132ba565b611741565b34801561077657600080fd5b5061036f6107853660046132ba565b6117c4565b34801561079657600080fd5b5061036f6107a53660046132ba565b611847565b3480156107b657600080fd5b5061036f6107c53660046132ba565b6118ca565b3480156107d657600080fd5b5061036f6107e53660046130c4565b61194d565b3480156107f657600080fd5b506103bc610805366004613076565b6119a0565b34801561081657600080fd5b506103bc6119cc565b34801561082b57600080fd5b506103bc6119d8565b34801561084057600080fd5b506103bc6119e4565b34801561085557600080fd5b506103bc6119f0565b34801561086a57600080fd5b5061036f610879366004613007565b6119fc565b34801561088a57600080fd5b5061036f6108993660046132ba565b611a7a565b3480156108aa57600080fd5b506103bc611afd565b3480156108bf57600080fd5b5061036f6108ce366004613007565b611b09565b3480156108df57600080fd5b506103bc611bc7565b3480156108f457600080fd5b5061036f611bd3565b34801561090957600080fd5b5061091d6109183660046130e2565b611c1e565b60405161039392919061349f565b34801561093757600080fd5b506103bc611c75565b34801561094c57600080fd5b506103bc61095b3660046132ba565b611c81565b34801561096c57600080fd5b506103bc611c95565b34801561098157600080fd5b5061036f610990366004613007565b611ca1565b3480156109a157600080fd5b506103bc611d4b565b3480156109b657600080fd5b506109bf611d51565b604051610393919061350c565b3480156109d857600080fd5b50610409611d7e565b3480156109ed57600080fd5b506103bc611d9b565b348015610a0257600080fd5b5061036f610a113660046131a4565b611da7565b348015610a2257600080fd5b506103bc611e50565b348015610a3757600080fd5b50610a40611e5c565b604051610393939291906134e4565b348015610a5b57600080fd5b506105e9611e8f565b348015610a7057600080fd5b50610409611ea3565b348015610a8557600080fd5b506103bc610a943660046130c4565b611eac565b348015610aa557600080fd5b506103bc610ab43660046130c4565b611ebf565b348015610ac557600080fd5b5061036f610ad43660046132ba565b611ed2565b348015610ae557600080fd5b5061036f610af43660046130c4565b611f55565b348015610b0557600080fd5b50610409611f9d565b348015610b1a57600080fd5b5061036f610b29366004613205565b611fb8565b348015610b3a57600080fd5b5061036f612078565b348015610b4f57600080fd5b506103bc6120ef565b348015610b6457600080fd5b5061036f610b73366004613007565b6120fb565b348015610b8457600080fd5b5061036f610b933660046132ba565b612174565b610ba06121f7565b1515610bab57600080fd5b83610bb66005612208565b1580610bcd5750610bc7600561220c565b43018110155b1515610bd857600080fd5b610bec60078686868663ffffffff61221816565b7f8ec36e523af9a3433562968ade78ee302be3c4306c6815d30bc17fbc6f658f4485858585604051610c219493929190613644565b60405180910390a15050505050565b60045460ff1681565b6000610c6c604080519081016040528085600160a060020a0316815260200184815250600f6122e190919063ffffffff16565b90505b92915050565b600160a060020a0382166000908152600e602090815260408083208484529091528120610ca190612208565b60001015610ce357600160a060020a0383166000908152600e602090815260408083208584529091529020610cdc908563ffffffff61230b16565b9050610cec565b610cdc84610f7d565b9392505050565b6000610cfe826110e8565b8015610c6f575050600160a060020a031660009081526002602052604090206001015442101590565b610d2f6121f7565b1515610d3a57600080fd5b84610d456005612208565b1580610d5c5750610d56600561220c565b43018110155b1515610d6757600080fd5b604080518082018252600160a060020a0380881682526020808301889052835180850190945290861683528201849052610dab91600f91899163ffffffff61232216565b7fd6db40c81246b0bc2d29bb51b5d58d3e36502ac9898ab35237d4136a5172c2b28686868686604051610de295949392919061351d565b60405180910390a1505050505050565b600160a060020a0383166000908152600a602090815260408083208584529091528120610e1e90612208565b60001015610e6157600160a060020a0384166000908152600a602090815260408083208684529091529020610e5a90868463ffffffff61243e16565b9050610e6b565b610e5a8583611c81565b949350505050565b610e7b6121f7565b1515610e8657600080fd5b81610e916005612208565b1580610ea85750610ea2600561220c565b43018110155b1515610eb357600080fd5b610ec5600d848463ffffffff6125e616565b7f8db08e27454fa2b4fb1a49c88f48d25b6561af54f240ad2f3beb4887830f1e9d8383604051610ef692919061360e565b60405180910390a1505050565b6000610c6c6007848463ffffffff61243e16565b33610f206112fb565b600160a060020a031614610f3357600080fd5b60005460ff1615610f4357600080fd5b7f787a5d936e74f4b564b9153575886059829c78cd9927b1be5e0d976b317ef73633604051610f729190613456565b60405180910390a133ff5b6000610c6f600d8363ffffffff61230b16565b6000610f9c601461220c565b90505b90565b6000610f9c600d612208565b6000610f9c601061220c565b6000610fc461265b565b1515610fcf57600080fd5b82600160a060020a0381161515610fe557600080fd5b600160a060020a038116301415610ffb57600080fd5b600160a060020a03841660009081526002602052604090205460ff16151561102257600080fd5b61102b83612671565b600160a060020a0385166000908152600260208181526040808420858552909201905290205490925060ff161561106157600080fd5b600160a060020a03841660009081526002602081815260408084208685528084018352818520805460ff19166001908117909155938352600301805493840181558452922001839055517fec1b982d69bfc1a6fd8becf191d9a633486c822d3bdedd52303ca81fa6357501906110da908690869061347f565b60405180910390a150505050565b600160a060020a031660009081526002602052604090205460ff1690565b60005460ff1681565b600061111961265b565b151561112457600080fd5b82600160a060020a038116151561113a57600080fd5b600160a060020a03811630141561115057600080fd5b61115983612671565b600160a060020a0385166000908152600260208181526040808420858552909201905290205490925060ff16151561119057600080fd5b600160a060020a0384166000908152600260208181526040808420868552909201905290819020805460ff19169055517f92f4af6130f47c92f3899e06611c8c6ef191fb81207ad2675d134af619d2fe7d906110da908690869061347f565b60035481565b6111fd6121f7565b151561120857600080fd5b816112136005612208565b158061122a5750611224600561220c565b43018110155b151561123557600080fd5b6112476010848463ffffffff6125e616565b7f599f1c845a3e9ff375e1e3c7e61a6ff2faac7ed7e9cc45db40fd2b73f53845048383604051610ef692919061360e565b6112806121f7565b151561128b57600080fd5b816112966005612208565b15806112ad57506112a7600561220c565b43018110155b15156112b857600080fd5b6112ca6014848463ffffffff6125e616565b7f46627504a56b77179118cc2fc2139516c5abaa99efc1d64afa509f91be130c458383604051610ef692919061360e565b6000546101009004600160a060020a031690565b6000610f9c600661220c565b6113236121f7565b151561132e57600080fd5b836113396005612208565b1580611350575061134a600561220c565b43018110155b151561135b57600080fd5b61136f60098686868663ffffffff61221816565b7f8dcd79c2f73c725f825147941deccba2addafb9f7f2e775777710f5debba966885858585604051610c219493929190613644565b600160a060020a0382166000908152600e602090815260408083208484529091528120610c6c90612208565b6113d861265b565b15156113e357600080fd5b80600160a060020a03811615156113f957600080fd5b600160a060020a03811630141561140f57600080fd5b600160a060020a03821660009081526002602052604090205460ff16151561143657600080fd5b600160a060020a03821660009081526002602052604090819020805460ff19169055517f777645c5437dfbf962f57a281ead25f3d513f2f8e938685bbfc1738e81c9880e90611486908490613456565b60405180910390a15050565b6000610f9c600b612208565b6114a6612e18565b6114ae6121f7565b15156114b957600080fd5b846114c46005612208565b15806114db57506114d5600561220c565b43018110155b15156114e657600080fd5b6040805180820182528681528151808301909252600160a060020a0386168252602082810186905281019190915291506115286016878463ffffffff61275616565b7f0446e894f61064d2b9ac2f66e25bc440e0bcb2c00de07a5f1b076b8ed83efa9186868686604051610de2949392919061361c565b600154600160a060020a031681565b60008061157883612671565b905061158384610cf3565b80156115b45750600160a060020a0384166000908152600260208181526040808420858552909201905290205460ff165b91505b5092915050565b6115c66121f7565b15156115d157600080fd5b836115dc6005612208565b15806115f357506115ed600561220c565b43018110155b15156115fe57600080fd5b61161260088686868663ffffffff61221816565b7fd3143532264a48ed8985128261dac4f97460a18e532266606874e734e5f9511985858585604051610c219493929190613644565b61164f6121f7565b151561165a57600080fd5b816116656005612208565b158061167c5750611676600561220c565b43018110155b151561168757600080fd5b611699600c848463ffffffff6125e616565b7f4c67330f24d50310990ba512d41f5016c43176108456cdf8b3afa5f2c56c72e18383604051610ef692919061360e565b6000610c6c6008848463ffffffff61243e16565b336116e76112fb565b600160a060020a0316146116fa57600080fd5b6000805460ff191660011790556040517fd5a2a04a775c741c2ca0dc46ea7ce4835190e1aaf1ca018def0e82568ec3361690611737903390613456565b60405180910390a1565b6117496121f7565b151561175457600080fd5b8161175f6005612208565b15806117765750611770600561220c565b43018110155b151561178157600080fd5b6117936015848463ffffffff6125e616565b7f89d1e4eeae3e50e6d57909b1ff05821c208283d43c3c6eede3463fce9801bcbf8383604051610ef692919061360e565b6117cc6121f7565b15156117d757600080fd5b816117e26005612208565b15806117f957506117f3600561220c565b43018110155b151561180457600080fd5b6118166012848463ffffffff6125e616565b7ffaae0268144aeab0eb789ad33da1cc7f926da22cdc4cfb89e4c2dcc87cf719248383604051610ef692919061360e565b61184f6121f7565b151561185a57600080fd5b816118656005612208565b158061187c5750611876600561220c565b43018110155b151561188757600080fd5b6118996005848463ffffffff6125e616565b7fb18e0b90fd56f3d1f73c768d7f107937813899fe6676f8348f996ad670b990048383604051610ef692919061360e565b6118d26121f7565b15156118dd57600080fd5b816118e86005612208565b15806118ff57506118f9600561220c565b43018110155b151561190a57600080fd5b61191c6013848463ffffffff6125e616565b7fb04162ce72310207d5c9ceced2e6df3ddd15272642b0e53af3c7e83f0d0dc4918383604051610ef692919061360e565b61195561265b565b151561196057600080fd5b60038190556040517f4f1d324a1cbffc352fb64f1d73d95e4b200d92f99ef39bf2d7f5b41f946909d6906119959083906134d6565b60405180910390a150565b600160a060020a0382166000908152600a602090815260408083208484529091528120610c6c90612208565b6000610f9c6008612208565b6000610f9c6005612208565b6000610f9c6009612208565b6000610f9c600c612208565b611a0461265b565b1515611a0f57600080fd5b80600160a060020a0381161515611a2557600080fd5b600160a060020a038116301415611a3b57600080fd5b611a4782600354612803565b7f7f3a8349917003ed377f6e9ae1608b92edd893903f8983bd274b1f8373dd3b118260035460405161148692919061349f565b611a826121f7565b1515611a8d57600080fd5b81611a986005612208565b1580611aaf5750611aa9600561220c565b43018110155b1515611aba57600080fd5b611acc6011848463ffffffff6125e616565b7f081f0b4c81d1de8d02805cc089a2d5a665837d8c19b438f4558128149df8fcfc8383604051610ef692919061360e565b6000610f9c601161220c565b6000611b1361265b565b1515611b1e57600080fd5b81600160a060020a0381161515611b3457600080fd5b600160a060020a038116301415611b4a57600080fd5b600054600160a060020a038481166101009092041614611bc25760008054600160a060020a0385811661010090810261010060a860020a0319841617909355604051929091041692507f977e5fa58e458501775e0008d275006294c5249e3c08d1d0e3a9f3acad14f6e490610ef69084908690613464565b505050565b6000610f9c601361220c565b611bdb6121f7565b1515611be657600080fd5b6018805460ff191660011790556040517f99d6c8c83d6b3086e44ac9a4cff201904eb96dc84e20289516e1d6d5f387d30c90600090a1565b6000806000611c56604080519081016040528087600160a060020a031681526020018681525087600f6128559092919063ffffffff16565b8054600190910154600160a060020a0390911697909650945050505050565b6000610f9c601561220c565b6000610c6c6009848463ffffffff61243e16565b6000610f9c6007612208565b6000611cab6121f7565b1515611cb657600080fd5b81600160a060020a0381161515611ccc57600080fd5b600160a060020a038116301415611ce257600080fd5b600154600160a060020a03848116911614611bc25760018054600160a060020a03858116600160a060020a0319831617909255604051911692507f9f611b789425d0d5b90b920f1b2852907dd865c80074a30b1629aaa041d1812c90610ef69084908690613464565b60175481565b6040805180820190915260108152608060020a6f6f7065726174696f6e616c5f6d6f646502602082015281565b60045460009060ff166001811115611d9257fe5b60015b14905090565b6000610f9c6006612208565b611daf6121f7565b1515611dba57600080fd5b83611dc56005612208565b1580611ddc5750611dd6600561220c565b43018110155b1515611de757600080fd5b600160a060020a0384166000908152600e602090815260408083208684529091529020611e1b90868463ffffffff6125e616565b7ffed51dfd288a74f4e3f4fd59cad1bb9151c6f8e27c781c703ce6ea532e3deac285858585604051610c219493929190613569565b6000610f9c600561220c565b600080600080611e6c601661286d565b805460018201546002909201549096600160a060020a0390921695509350915050565b6000546101009004600160a060020a031681565b60185460ff1681565b6000610c6f600b8363ffffffff61230b16565b6000610c6f600c8363ffffffff61230b16565b611eda6121f7565b1515611ee557600080fd5b81611ef06005612208565b1580611f075750611f01600561220c565b43018110155b1515611f1257600080fd5b611f24600b848463ffffffff6125e616565b7f3fb8054aedc542a59b81ca6dd84e6ed5a0f62964ea31cb27f2d61d7f36f2a3428383604051610ef692919061360e565b611f5d6121f7565b1515611f6857600080fd5b60178190556040517fece7c57702b5ad94b9848802d1e225954b064cd5538fd55082e3e29c29474e45906119959083906134d6565b60045460009060ff166001811115611fb157fe5b6000611d95565b611fc06121f7565b1515611fcb57600080fd5b85611fd66005612208565b1580611fed5750611fe7600561220c565b43018110155b1515611ff857600080fd5b600160a060020a0386166000908152600a60209081526040808320888452909152902061202e908886868663ffffffff61221816565b7ff3fafbde2ad0fcd494a4d98dbde01b8571066edaa67de40a48d794b0583efd0a878787878787604051612067969594939291906135a7565b60405180910390a150505050505050565b6040805180820190915260108152608060020a6f6f7065726174696f6e616c5f6d6f64650260208201526120ac338261156c565b15156120b757600080fd5b6004805460ff191660011790556040517e4feb6c9c7b4bc8e858a1e16b46315cd121d46eb476f1d2a0b79c1508b89e3290600090a150565b6000610f9c601261220c565b61210361265b565b151561210e57600080fd5b80600160a060020a038116151561212457600080fd5b600160a060020a03811630141561213a57600080fd5b612145826000612803565b7fb619d545cb511bd5f02907a1eac4f4cb8dace7b1846852fb0bf5e553937481c1826040516114869190613456565b61217c6121f7565b151561218757600080fd5b816121926005612208565b15806121a957506121a3600561220c565b43018110155b15156121b457600080fd5b6121c66006848463ffffffff6125e616565b7febf63d40c9708ad4550ba5278373615a245fcf66e7b70faf9e6b8b90396fa2c88383604051610ef692919061360e565b600154600160a060020a0316331490565b5490565b6000610c6f8243612879565b6000808251845114151561222b57600080fd5b612236878787612885565b86548790600019810190811061224857fe5b90600052602060002090600302019150600090505b83518110156122d857816002016040805190810160405280868481518110151561228357fe5b90602001906020020151815260200185848151811015156122a057fe5b60209081029091018101519091528254600181810185556000948552938290208351600290920201908155910151908201550161225d565b50505050505050565b8051600160a060020a03166000908152602092835260408082209284015182529190925290205490565b60006123178383612902565b602001519392505050565b8151600160a060020a031660009081526020858152604080832082860151845290915290205415806123b557508151600160a060020a0390811660009081526020868152604080832082870180518552908352818420875190951684528883528184209051845290915290205481546000199091019081106123a057fe5b90600052602060002090600302016000015483115b15156123c057600080fd5b8151600160a060020a0390811660009081526020958652604080822094870151825293865283812084518086019095529484528386019283528454600180820187559582529086902093516003909102909301928355905180519383018054600160a060020a03191694909216939093179055910151600290910155565b6000612448612e38565b60006124548686612954565b9150816040015151600010156125d557612472826040015185612a12565b905080600010156125d5576125ce735fcf3704016b90ded3c81d75613ceab0a6a2602562a123336040518163ffffffff1660e060020a02815260040160206040518083038186803b1580156124c657600080fd5b505af41580156124da573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052506124fe91908101906130a6565b6125c26125b185604001516001860381518110151561251957fe5b9060200190602002015160200151735fcf3704016b90ded3c81d75613ceab0a6a2602562a123336040518163ffffffff1660e060020a02815260040160206040518083038186803b15801561256d57600080fd5b505af4158015612581573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052506125a591908101906130a6565b9063ffffffff612a6f16565b60208601519063ffffffff612aab16565b9063ffffffff612b1416565b92506125dd565b816020015192505b50509392505050565b82541580612616575082548390600019810190811061260157fe5b90600052602060002090600202016000015482115b151561262157600080fd5b6040805180820190915291825260208083019182528354600181810186556000958652919094209251600290940290920192835551910155565b6000546101009004600160a060020a0316331490565b6000816040516020018082805190602001908083835b602083106126a65780518252601f199092019160209182019101612687565b6001836020036101000a0380198251168184511680821785525050505050509050019150506040516020818303038152906040526040518082805190602001908083835b602083106127095780518252601f1990920191602091820191016126ea565b5181516020939093036101000a6000190180199091169216919091179052604051920182900390912095945050505050565b82541580612616575082548390600019810190811061260157fe5b82541580612786575082548390600019810190811061277157fe5b90600052602060002090600402016000015482115b151561279157600080fd5b604080518082019091529182526020808301918252835460018082018655600095865294829020935160049091029093019283559051805193830193909355918201518051600283018054600160a060020a031916600160a060020a0390921691909117905590910151600390910155565b600160a060020a03821660009081526002602052604090205460ff16151561285157600160a060020a0382166000908152600260205260409020805460ff1916600190811782554283019101555b5050565b6000612862848484612b49565b600101949350505050565b6000610c6f8243612b9a565b60006123178383612bb0565b825460009015806128b857508354849060001981019081106128a357fe5b90600052602060002090600302016000015483115b15156128c357600080fd5b83546128d28560018301612e5a565b508354849060001981019081106128e557fe5b600091825260209091206003909102019283555060019091015550565b61290a612e86565b826129158184612bc3565b8154811061291f57fe5b906000526020600020906002020160408051908101604052908160008201548152602001600182015481525050905092915050565b61295c612e38565b826129678184612c1b565b8154811061297157fe5b906000526020600020906003020160606040519081016040529081600082015481526020016001820154815260200160028201805480602002602001604051908101604052809291908181526020016000905b82821015612a035760008481526020908190206040805180820190915260028502909101805482526001908101548284015290835290920191016129c4565b50505091525090949350505050565b60008083516000101515612a2557600080fd5b5082515b6000811115612a65578360018203815181101515612a4357fe5b60209081029091010151518312612a5c578091506115b7565b60001901612a29565b5060009392505050565b6000808212158015612a8357508282840313155b80612a9a5750600082128015612a9a575082828403135b1515612aa557600080fd5b50900390565b60008083600019141580612ac3575060ff60020a8314155b1515612ace57600080fd5b82600019141580612ae3575060ff60020a8414155b1515612aee57600080fd5b50828202821580612b095750838382811515612b0657fe5b05145b1515610cec57600080fd5b600060ff60020a83141580612b2b57508160001914155b1515612b3657600080fd5b8183811515612b4157fe5b059392505050565b8151600160a060020a03166000908152602084815260408083208286015184529091528120612b79858585612c73565b81548110612b8357fe5b906000526020600020906003020190509392505050565b6000612ba68383612d3b565b6001019392505050565b612bb8612e86565b826129158184612d68565b815460009081908110612bd557600080fd5b508254600019015b6000811061034a578354849082908110612bf357fe5b60009182526020909120600290910201548310612c12578091506115b7565b60001901612bdd565b815460009081908110612c2d57600080fd5b508254600019015b6000811061034a578354849082908110612c4b57fe5b60009182526020909120600390910201548310612c6a578091506115b7565b60001901612c35565b8151600160a060020a031660009081526020848152604080832082860151845290915281205481908110612ca657600080fd5b508251600160a060020a0316600090815260208581526040808320828701518452909152902054600019015b6000811061034a578351600160a060020a03166000908152602086815260408083208288015184529091529020805482908110612d0b57fe5b60009182526020909120600390910201548310612d2a57809150612d33565b60001901612cd2565b509392505050565b600082612d488184612dc0565b81548110612d5257fe5b9060005260206000209060040201905092915050565b815460009081908110612d7a57600080fd5b508254600019015b6000811061034a578354849082908110612d9857fe5b60009182526020909120600290910201548310612db7578091506115b7565b60001901612d82565b815460009081908110612dd257600080fd5b508254600019015b6000811061034a578354849082908110612df057fe5b60009182526020909120600490910201548310612e0f578091506115b7565b60001901612dda565b60606040519081016040528060008152602001612e33612e86565b905290565b6060604051908101604052806000815260200160008152602001606081525090565b815481835581811115611bc257600302816003028360005260206000209182019101611bc29190612e9d565b604080518082019091526000808252602082015290565b610f9f91905b80821115612ecd57600080825560018201819055612ec46002830182612ed1565b50600301612ea3565b5090565b5080546000825560020290600052602060002090810190612ef29190612ef5565b50565b610f9f91905b80821115612ecd5760008082556001820155600201612efb565b6000610c6c82356136fc565b6000601f82018313612f3257600080fd5b8135612f45612f40826136ab565b613685565b91508181835260208401935060208101905083856020840282011115612f6a57600080fd5b60005b83811015612f965781612f808882612fa0565b8452506020928301929190910190600101612f6d565b5050505092915050565b6000610c6c8235610f9f565b6000610c6c8251610f9f565b6000601f82018313612fc957600080fd5b8135612fd7612f40826136cb565b91508082526020830160208301858383011115612ff357600080fd5b612ffe838284613724565b50505092915050565b60006020828403121561301957600080fd5b60006115b48484612f15565b6000806040838503121561303857600080fd5b60006130448585612f15565b92505060208301356001604060020a0381111561306057600080fd5b61306c85828601612fb8565b9150509250929050565b6000806040838503121561308957600080fd5b60006130958585612f15565b925050602061306c85828601612fa0565b6000602082840312156130b857600080fd5b60006115b48484612fac565b6000602082840312156130d657600080fd5b60006115b48484612fa0565b6000806000606084860312156130f757600080fd5b60006131038686612fa0565b935050602061311486828701612f15565b925050604061312586828701612fa0565b9150509250925092565b600080600080600060a0868803121561314757600080fd5b60006131538888612fa0565b955050602061316488828901612f15565b945050604061317588828901612fa0565b935050606061318688828901612f15565b925050608061319788828901612fa0565b9150509295509295909350565b600080600080608085870312156131ba57600080fd5b60006131c68787612fa0565b94505060206131d787828801612f15565b93505060406131e887828801612fa0565b92505060606131f987828801612fa0565b91505092959194509250565b60008060008060008060c0878903121561321e57600080fd5b600061322a8989612fa0565b965050602061323b89828a01612f15565b955050604061324c89828a01612fa0565b945050606061325d89828a01612fa0565b93505060808701356001604060020a0381111561327957600080fd5b61328589828a01612f21565b92505060a08701356001604060020a038111156132a157600080fd5b6132ad89828a01612f21565b9150509295509295509295565b600080604083850312156132cd57600080fd5b60006130958585612fa0565b600080600080608085870312156132ef57600080fd5b60006132fb8787612fa0565b945050602061330c87828801612fa0565b93505060406131e887828801612f15565b6000806000806080858703121561333357600080fd5b600061333f8787612fa0565b945050602061335087828801612fa0565b93505060408501356001604060020a0381111561336c57600080fd5b61337887828801612f21565b92505060608501356001604060020a0381111561339457600080fd5b6131f987828801612f21565b6133a9816136fc565b82525050565b60006133ba826136f8565b8084526020840193506133cc836136f2565b60005b828110156133fc576133e2868351613418565b6133eb826136f2565b6020969096019591506001016133cf565b5093949350505050565b6133a981613708565b6133a981613719565b6133a981610f9f565b600061342c826136f8565b808452613440816020860160208601613730565b61344981613760565b9093016020019392505050565b60208101610c6f82846133a0565b6040810161347282856133a0565b610cec60208301846133a0565b6040810161348d82856133a0565b8181036020830152610e6b8184613421565b604081016134ad82856133a0565b610cec6020830184613418565b60208101610c6f8284613406565b60208101610c6f828461340f565b60208101610c6f8284613418565b606081016134f28286613418565b6134ff60208301856133a0565b610e6b6040830184613418565b60208082528101610c6c8184613421565b60a0810161352b8288613418565b61353860208301876133a0565b6135456040830186613418565b61355260608301856133a0565b61355f6080830184613418565b9695505050505050565b608081016135778287613418565b61358460208301866133a0565b6135916040830185613418565b61359e6060830184613418565b95945050505050565b60c081016135b58289613418565b6135c260208301886133a0565b6135cf6040830187613418565b6135dc6060830186613418565b81810360808301526135ee81856133af565b905081810360a083015261360281846133af565b98975050505050505050565b604081016134ad8285613418565b6080810161362a8287613418565b6136376020830186613418565b61359160408301856133a0565b608081016136528287613418565b61365f6020830186613418565b818103604083015261367181856133af565b9050818103606083015261355f81846133af565b6040518181016001604060020a03811182821017156136a357600080fd5b604052919050565b60006001604060020a038211156136c157600080fd5b5060209081020190565b60006001604060020a038211156136e157600080fd5b506020601f91909101601f19160190565b60200190565b5190565b600160a060020a031690565b151590565b600060028210612ecd57fe5b6000610c6f8261370d565b82818337506000910152565b60005b8381101561374b578181015183820152602001613733565b8381111561375a576000848401525b50505050565b601f01601f1916905600a265627a7a723058206855dd833d2aa3295799c84f9d3dc43cbda2177ea158acd7bb4816f8b9bd00906c6578706572696d656e74616cf50037000000000000000000000000f05179bac3d1fbef58a2fcd7ad0f769840027cc6

Deployed Bytecode

0x60806040526004361061034a5763ffffffff60e060020a6000350416630783e3db811461034f5780630f4e74691461037157806312e5c6541461039c578063158c1848146103c957806317ba3f90146103e95780631af78f09146104165780631b6eb59f146104365780632585f2781461045657806326c3acc3146104765780632738a11214610496578063273cc25f146104ab57806328b5f95c146104cb57806328eb2edd146104e057806329ea3faa146104f55780632b5672e31461050a5780632b91e0a91461052a5780632f013a001461054a5780633b58c5011461055f5780633b7bea6c1461057f5780633b8bba6c1461059457806342399aea146105b45780634476d23b146105d4578063460a58aa146105f65780634a6cf8451461060b5780634fd9b0e51461062b57806350b08c021461064b578063543877301461066b57806354f4338014610680578063570ca735146106a05780635df1b0a3146106b557806363f6e017146106d55780636c671a52146106f55780636c98600c1461071557806370327ea11461073557806374bcea6b1461074a578063768f594c1461076a578063778228401461078a57806377bad2cf146107aa5780637e15dd5c146107ca5780637e864666146107ea578063847bb1821461080a578063854e7fbf1461081f578063868a674f1461083457806389eec486146108495780638e8cef121461085e57806393d1243f1461087e578063940b81001461089e57806396214735146108b35780639699f337146108d35780639bbb0ff2146108e8578063a329fad5146108fd578063ac00d3b21461092b578063ad08605414610940578063b12aa34314610960578063b3ab15fb14610975578063b6bf417614610995578063b78272e0146109aa578063be189480146109cc578063c136df85146109e1578063c1959cc5146109f6578063c946b6e914610a16578063ccd03d2e14610a2b578063d5f3948814610a4f578063d7f0f97114610a64578063dc7dc62c14610a79578063ecb41ad814610a99578063efda7ffc14610ab9578063f69c70a014610ad9578063f71e860f14610af9578063f8b37af014610b0e578063f8e6e88814610b2e578063fbdfd8e714610b43578063fdd9ec7d14610b58578063fe98a9dc14610b78575b600080fd5b34801561035b57600080fd5b5061036f61036a36600461331d565b610b98565b005b34801561037d57600080fd5b50610386610c30565b60405161039391906134c8565b60405180910390f35b3480156103a857600080fd5b506103bc6103b7366004613076565b610c39565b60405161039391906134d6565b3480156103d557600080fd5b506103bc6103e43660046130e2565b610c75565b3480156103f557600080fd5b50610409610404366004613007565b610cf3565b60405161039391906134ba565b34801561042257600080fd5b5061036f61043136600461312f565b610d27565b34801561044257600080fd5b506103bc6104513660046131a4565b610df2565b34801561046257600080fd5b5061036f6104713660046132ba565b610e73565b34801561048257600080fd5b506103bc6104913660046132ba565b610f03565b3480156104a257600080fd5b5061036f610f17565b3480156104b757600080fd5b506103bc6104c63660046130c4565b610f7d565b3480156104d757600080fd5b506103bc610f90565b3480156104ec57600080fd5b506103bc610fa2565b34801561050157600080fd5b506103bc610fae565b34801561051657600080fd5b5061036f610525366004613025565b610fba565b34801561053657600080fd5b50610409610545366004613007565b6110e8565b34801561055657600080fd5b50610409611106565b34801561056b57600080fd5b5061036f61057a366004613025565b61110f565b34801561058b57600080fd5b506103bc6111ef565b3480156105a057600080fd5b5061036f6105af3660046132ba565b6111f5565b3480156105c057600080fd5b5061036f6105cf3660046132ba565b611278565b3480156105e057600080fd5b506105e96112fb565b6040516103939190613456565b34801561060257600080fd5b506103bc61130f565b34801561061757600080fd5b5061036f61062636600461331d565b61131b565b34801561063757600080fd5b506103bc610646366004613076565b6113a4565b34801561065757600080fd5b5061036f610666366004613007565b6113d0565b34801561067757600080fd5b506103bc611492565b34801561068c57600080fd5b5061036f61069b3660046132d9565b61149e565b3480156106ac57600080fd5b506105e961155d565b3480156106c157600080fd5b506104096106d0366004613025565b61156c565b3480156106e157600080fd5b5061036f6106f036600461331d565b6115be565b34801561070157600080fd5b5061036f6107103660046132ba565b611647565b34801561072157600080fd5b506103bc6107303660046132ba565b6116ca565b34801561074157600080fd5b5061036f6116de565b34801561075657600080fd5b5061036f6107653660046132ba565b611741565b34801561077657600080fd5b5061036f6107853660046132ba565b6117c4565b34801561079657600080fd5b5061036f6107a53660046132ba565b611847565b3480156107b657600080fd5b5061036f6107c53660046132ba565b6118ca565b3480156107d657600080fd5b5061036f6107e53660046130c4565b61194d565b3480156107f657600080fd5b506103bc610805366004613076565b6119a0565b34801561081657600080fd5b506103bc6119cc565b34801561082b57600080fd5b506103bc6119d8565b34801561084057600080fd5b506103bc6119e4565b34801561085557600080fd5b506103bc6119f0565b34801561086a57600080fd5b5061036f610879366004613007565b6119fc565b34801561088a57600080fd5b5061036f6108993660046132ba565b611a7a565b3480156108aa57600080fd5b506103bc611afd565b3480156108bf57600080fd5b5061036f6108ce366004613007565b611b09565b3480156108df57600080fd5b506103bc611bc7565b3480156108f457600080fd5b5061036f611bd3565b34801561090957600080fd5b5061091d6109183660046130e2565b611c1e565b60405161039392919061349f565b34801561093757600080fd5b506103bc611c75565b34801561094c57600080fd5b506103bc61095b3660046132ba565b611c81565b34801561096c57600080fd5b506103bc611c95565b34801561098157600080fd5b5061036f610990366004613007565b611ca1565b3480156109a157600080fd5b506103bc611d4b565b3480156109b657600080fd5b506109bf611d51565b604051610393919061350c565b3480156109d857600080fd5b50610409611d7e565b3480156109ed57600080fd5b506103bc611d9b565b348015610a0257600080fd5b5061036f610a113660046131a4565b611da7565b348015610a2257600080fd5b506103bc611e50565b348015610a3757600080fd5b50610a40611e5c565b604051610393939291906134e4565b348015610a5b57600080fd5b506105e9611e8f565b348015610a7057600080fd5b50610409611ea3565b348015610a8557600080fd5b506103bc610a943660046130c4565b611eac565b348015610aa557600080fd5b506103bc610ab43660046130c4565b611ebf565b348015610ac557600080fd5b5061036f610ad43660046132ba565b611ed2565b348015610ae557600080fd5b5061036f610af43660046130c4565b611f55565b348015610b0557600080fd5b50610409611f9d565b348015610b1a57600080fd5b5061036f610b29366004613205565b611fb8565b348015610b3a57600080fd5b5061036f612078565b348015610b4f57600080fd5b506103bc6120ef565b348015610b6457600080fd5b5061036f610b73366004613007565b6120fb565b348015610b8457600080fd5b5061036f610b933660046132ba565b612174565b610ba06121f7565b1515610bab57600080fd5b83610bb66005612208565b1580610bcd5750610bc7600561220c565b43018110155b1515610bd857600080fd5b610bec60078686868663ffffffff61221816565b7f8ec36e523af9a3433562968ade78ee302be3c4306c6815d30bc17fbc6f658f4485858585604051610c219493929190613644565b60405180910390a15050505050565b60045460ff1681565b6000610c6c604080519081016040528085600160a060020a0316815260200184815250600f6122e190919063ffffffff16565b90505b92915050565b600160a060020a0382166000908152600e602090815260408083208484529091528120610ca190612208565b60001015610ce357600160a060020a0383166000908152600e602090815260408083208584529091529020610cdc908563ffffffff61230b16565b9050610cec565b610cdc84610f7d565b9392505050565b6000610cfe826110e8565b8015610c6f575050600160a060020a031660009081526002602052604090206001015442101590565b610d2f6121f7565b1515610d3a57600080fd5b84610d456005612208565b1580610d5c5750610d56600561220c565b43018110155b1515610d6757600080fd5b604080518082018252600160a060020a0380881682526020808301889052835180850190945290861683528201849052610dab91600f91899163ffffffff61232216565b7fd6db40c81246b0bc2d29bb51b5d58d3e36502ac9898ab35237d4136a5172c2b28686868686604051610de295949392919061351d565b60405180910390a1505050505050565b600160a060020a0383166000908152600a602090815260408083208584529091528120610e1e90612208565b60001015610e6157600160a060020a0384166000908152600a602090815260408083208684529091529020610e5a90868463ffffffff61243e16565b9050610e6b565b610e5a8583611c81565b949350505050565b610e7b6121f7565b1515610e8657600080fd5b81610e916005612208565b1580610ea85750610ea2600561220c565b43018110155b1515610eb357600080fd5b610ec5600d848463ffffffff6125e616565b7f8db08e27454fa2b4fb1a49c88f48d25b6561af54f240ad2f3beb4887830f1e9d8383604051610ef692919061360e565b60405180910390a1505050565b6000610c6c6007848463ffffffff61243e16565b33610f206112fb565b600160a060020a031614610f3357600080fd5b60005460ff1615610f4357600080fd5b7f787a5d936e74f4b564b9153575886059829c78cd9927b1be5e0d976b317ef73633604051610f729190613456565b60405180910390a133ff5b6000610c6f600d8363ffffffff61230b16565b6000610f9c601461220c565b90505b90565b6000610f9c600d612208565b6000610f9c601061220c565b6000610fc461265b565b1515610fcf57600080fd5b82600160a060020a0381161515610fe557600080fd5b600160a060020a038116301415610ffb57600080fd5b600160a060020a03841660009081526002602052604090205460ff16151561102257600080fd5b61102b83612671565b600160a060020a0385166000908152600260208181526040808420858552909201905290205490925060ff161561106157600080fd5b600160a060020a03841660009081526002602081815260408084208685528084018352818520805460ff19166001908117909155938352600301805493840181558452922001839055517fec1b982d69bfc1a6fd8becf191d9a633486c822d3bdedd52303ca81fa6357501906110da908690869061347f565b60405180910390a150505050565b600160a060020a031660009081526002602052604090205460ff1690565b60005460ff1681565b600061111961265b565b151561112457600080fd5b82600160a060020a038116151561113a57600080fd5b600160a060020a03811630141561115057600080fd5b61115983612671565b600160a060020a0385166000908152600260208181526040808420858552909201905290205490925060ff16151561119057600080fd5b600160a060020a0384166000908152600260208181526040808420868552909201905290819020805460ff19169055517f92f4af6130f47c92f3899e06611c8c6ef191fb81207ad2675d134af619d2fe7d906110da908690869061347f565b60035481565b6111fd6121f7565b151561120857600080fd5b816112136005612208565b158061122a5750611224600561220c565b43018110155b151561123557600080fd5b6112476010848463ffffffff6125e616565b7f599f1c845a3e9ff375e1e3c7e61a6ff2faac7ed7e9cc45db40fd2b73f53845048383604051610ef692919061360e565b6112806121f7565b151561128b57600080fd5b816112966005612208565b15806112ad57506112a7600561220c565b43018110155b15156112b857600080fd5b6112ca6014848463ffffffff6125e616565b7f46627504a56b77179118cc2fc2139516c5abaa99efc1d64afa509f91be130c458383604051610ef692919061360e565b6000546101009004600160a060020a031690565b6000610f9c600661220c565b6113236121f7565b151561132e57600080fd5b836113396005612208565b1580611350575061134a600561220c565b43018110155b151561135b57600080fd5b61136f60098686868663ffffffff61221816565b7f8dcd79c2f73c725f825147941deccba2addafb9f7f2e775777710f5debba966885858585604051610c219493929190613644565b600160a060020a0382166000908152600e602090815260408083208484529091528120610c6c90612208565b6113d861265b565b15156113e357600080fd5b80600160a060020a03811615156113f957600080fd5b600160a060020a03811630141561140f57600080fd5b600160a060020a03821660009081526002602052604090205460ff16151561143657600080fd5b600160a060020a03821660009081526002602052604090819020805460ff19169055517f777645c5437dfbf962f57a281ead25f3d513f2f8e938685bbfc1738e81c9880e90611486908490613456565b60405180910390a15050565b6000610f9c600b612208565b6114a6612e18565b6114ae6121f7565b15156114b957600080fd5b846114c46005612208565b15806114db57506114d5600561220c565b43018110155b15156114e657600080fd5b6040805180820182528681528151808301909252600160a060020a0386168252602082810186905281019190915291506115286016878463ffffffff61275616565b7f0446e894f61064d2b9ac2f66e25bc440e0bcb2c00de07a5f1b076b8ed83efa9186868686604051610de2949392919061361c565b600154600160a060020a031681565b60008061157883612671565b905061158384610cf3565b80156115b45750600160a060020a0384166000908152600260208181526040808420858552909201905290205460ff165b91505b5092915050565b6115c66121f7565b15156115d157600080fd5b836115dc6005612208565b15806115f357506115ed600561220c565b43018110155b15156115fe57600080fd5b61161260088686868663ffffffff61221816565b7fd3143532264a48ed8985128261dac4f97460a18e532266606874e734e5f9511985858585604051610c219493929190613644565b61164f6121f7565b151561165a57600080fd5b816116656005612208565b158061167c5750611676600561220c565b43018110155b151561168757600080fd5b611699600c848463ffffffff6125e616565b7f4c67330f24d50310990ba512d41f5016c43176108456cdf8b3afa5f2c56c72e18383604051610ef692919061360e565b6000610c6c6008848463ffffffff61243e16565b336116e76112fb565b600160a060020a0316146116fa57600080fd5b6000805460ff191660011790556040517fd5a2a04a775c741c2ca0dc46ea7ce4835190e1aaf1ca018def0e82568ec3361690611737903390613456565b60405180910390a1565b6117496121f7565b151561175457600080fd5b8161175f6005612208565b15806117765750611770600561220c565b43018110155b151561178157600080fd5b6117936015848463ffffffff6125e616565b7f89d1e4eeae3e50e6d57909b1ff05821c208283d43c3c6eede3463fce9801bcbf8383604051610ef692919061360e565b6117cc6121f7565b15156117d757600080fd5b816117e26005612208565b15806117f957506117f3600561220c565b43018110155b151561180457600080fd5b6118166012848463ffffffff6125e616565b7ffaae0268144aeab0eb789ad33da1cc7f926da22cdc4cfb89e4c2dcc87cf719248383604051610ef692919061360e565b61184f6121f7565b151561185a57600080fd5b816118656005612208565b158061187c5750611876600561220c565b43018110155b151561188757600080fd5b6118996005848463ffffffff6125e616565b7fb18e0b90fd56f3d1f73c768d7f107937813899fe6676f8348f996ad670b990048383604051610ef692919061360e565b6118d26121f7565b15156118dd57600080fd5b816118e86005612208565b15806118ff57506118f9600561220c565b43018110155b151561190a57600080fd5b61191c6013848463ffffffff6125e616565b7fb04162ce72310207d5c9ceced2e6df3ddd15272642b0e53af3c7e83f0d0dc4918383604051610ef692919061360e565b61195561265b565b151561196057600080fd5b60038190556040517f4f1d324a1cbffc352fb64f1d73d95e4b200d92f99ef39bf2d7f5b41f946909d6906119959083906134d6565b60405180910390a150565b600160a060020a0382166000908152600a602090815260408083208484529091528120610c6c90612208565b6000610f9c6008612208565b6000610f9c6005612208565b6000610f9c6009612208565b6000610f9c600c612208565b611a0461265b565b1515611a0f57600080fd5b80600160a060020a0381161515611a2557600080fd5b600160a060020a038116301415611a3b57600080fd5b611a4782600354612803565b7f7f3a8349917003ed377f6e9ae1608b92edd893903f8983bd274b1f8373dd3b118260035460405161148692919061349f565b611a826121f7565b1515611a8d57600080fd5b81611a986005612208565b1580611aaf5750611aa9600561220c565b43018110155b1515611aba57600080fd5b611acc6011848463ffffffff6125e616565b7f081f0b4c81d1de8d02805cc089a2d5a665837d8c19b438f4558128149df8fcfc8383604051610ef692919061360e565b6000610f9c601161220c565b6000611b1361265b565b1515611b1e57600080fd5b81600160a060020a0381161515611b3457600080fd5b600160a060020a038116301415611b4a57600080fd5b600054600160a060020a038481166101009092041614611bc25760008054600160a060020a0385811661010090810261010060a860020a0319841617909355604051929091041692507f977e5fa58e458501775e0008d275006294c5249e3c08d1d0e3a9f3acad14f6e490610ef69084908690613464565b505050565b6000610f9c601361220c565b611bdb6121f7565b1515611be657600080fd5b6018805460ff191660011790556040517f99d6c8c83d6b3086e44ac9a4cff201904eb96dc84e20289516e1d6d5f387d30c90600090a1565b6000806000611c56604080519081016040528087600160a060020a031681526020018681525087600f6128559092919063ffffffff16565b8054600190910154600160a060020a0390911697909650945050505050565b6000610f9c601561220c565b6000610c6c6009848463ffffffff61243e16565b6000610f9c6007612208565b6000611cab6121f7565b1515611cb657600080fd5b81600160a060020a0381161515611ccc57600080fd5b600160a060020a038116301415611ce257600080fd5b600154600160a060020a03848116911614611bc25760018054600160a060020a03858116600160a060020a0319831617909255604051911692507f9f611b789425d0d5b90b920f1b2852907dd865c80074a30b1629aaa041d1812c90610ef69084908690613464565b60175481565b6040805180820190915260108152608060020a6f6f7065726174696f6e616c5f6d6f646502602082015281565b60045460009060ff166001811115611d9257fe5b60015b14905090565b6000610f9c6006612208565b611daf6121f7565b1515611dba57600080fd5b83611dc56005612208565b1580611ddc5750611dd6600561220c565b43018110155b1515611de757600080fd5b600160a060020a0384166000908152600e602090815260408083208684529091529020611e1b90868463ffffffff6125e616565b7ffed51dfd288a74f4e3f4fd59cad1bb9151c6f8e27c781c703ce6ea532e3deac285858585604051610c219493929190613569565b6000610f9c600561220c565b600080600080611e6c601661286d565b805460018201546002909201549096600160a060020a0390921695509350915050565b6000546101009004600160a060020a031681565b60185460ff1681565b6000610c6f600b8363ffffffff61230b16565b6000610c6f600c8363ffffffff61230b16565b611eda6121f7565b1515611ee557600080fd5b81611ef06005612208565b1580611f075750611f01600561220c565b43018110155b1515611f1257600080fd5b611f24600b848463ffffffff6125e616565b7f3fb8054aedc542a59b81ca6dd84e6ed5a0f62964ea31cb27f2d61d7f36f2a3428383604051610ef692919061360e565b611f5d6121f7565b1515611f6857600080fd5b60178190556040517fece7c57702b5ad94b9848802d1e225954b064cd5538fd55082e3e29c29474e45906119959083906134d6565b60045460009060ff166001811115611fb157fe5b6000611d95565b611fc06121f7565b1515611fcb57600080fd5b85611fd66005612208565b1580611fed5750611fe7600561220c565b43018110155b1515611ff857600080fd5b600160a060020a0386166000908152600a60209081526040808320888452909152902061202e908886868663ffffffff61221816565b7ff3fafbde2ad0fcd494a4d98dbde01b8571066edaa67de40a48d794b0583efd0a878787878787604051612067969594939291906135a7565b60405180910390a150505050505050565b6040805180820190915260108152608060020a6f6f7065726174696f6e616c5f6d6f64650260208201526120ac338261156c565b15156120b757600080fd5b6004805460ff191660011790556040517e4feb6c9c7b4bc8e858a1e16b46315cd121d46eb476f1d2a0b79c1508b89e3290600090a150565b6000610f9c601261220c565b61210361265b565b151561210e57600080fd5b80600160a060020a038116151561212457600080fd5b600160a060020a03811630141561213a57600080fd5b612145826000612803565b7fb619d545cb511bd5f02907a1eac4f4cb8dace7b1846852fb0bf5e553937481c1826040516114869190613456565b61217c6121f7565b151561218757600080fd5b816121926005612208565b15806121a957506121a3600561220c565b43018110155b15156121b457600080fd5b6121c66006848463ffffffff6125e616565b7febf63d40c9708ad4550ba5278373615a245fcf66e7b70faf9e6b8b90396fa2c88383604051610ef692919061360e565b600154600160a060020a0316331490565b5490565b6000610c6f8243612879565b6000808251845114151561222b57600080fd5b612236878787612885565b86548790600019810190811061224857fe5b90600052602060002090600302019150600090505b83518110156122d857816002016040805190810160405280868481518110151561228357fe5b90602001906020020151815260200185848151811015156122a057fe5b60209081029091018101519091528254600181810185556000948552938290208351600290920201908155910151908201550161225d565b50505050505050565b8051600160a060020a03166000908152602092835260408082209284015182529190925290205490565b60006123178383612902565b602001519392505050565b8151600160a060020a031660009081526020858152604080832082860151845290915290205415806123b557508151600160a060020a0390811660009081526020868152604080832082870180518552908352818420875190951684528883528184209051845290915290205481546000199091019081106123a057fe5b90600052602060002090600302016000015483115b15156123c057600080fd5b8151600160a060020a0390811660009081526020958652604080822094870151825293865283812084518086019095529484528386019283528454600180820187559582529086902093516003909102909301928355905180519383018054600160a060020a03191694909216939093179055910151600290910155565b6000612448612e38565b60006124548686612954565b9150816040015151600010156125d557612472826040015185612a12565b905080600010156125d5576125ce735fcf3704016b90ded3c81d75613ceab0a6a2602562a123336040518163ffffffff1660e060020a02815260040160206040518083038186803b1580156124c657600080fd5b505af41580156124da573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052506124fe91908101906130a6565b6125c26125b185604001516001860381518110151561251957fe5b9060200190602002015160200151735fcf3704016b90ded3c81d75613ceab0a6a2602562a123336040518163ffffffff1660e060020a02815260040160206040518083038186803b15801561256d57600080fd5b505af4158015612581573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052506125a591908101906130a6565b9063ffffffff612a6f16565b60208601519063ffffffff612aab16565b9063ffffffff612b1416565b92506125dd565b816020015192505b50509392505050565b82541580612616575082548390600019810190811061260157fe5b90600052602060002090600202016000015482115b151561262157600080fd5b6040805180820190915291825260208083019182528354600181810186556000958652919094209251600290940290920192835551910155565b6000546101009004600160a060020a0316331490565b6000816040516020018082805190602001908083835b602083106126a65780518252601f199092019160209182019101612687565b6001836020036101000a0380198251168184511680821785525050505050509050019150506040516020818303038152906040526040518082805190602001908083835b602083106127095780518252601f1990920191602091820191016126ea565b5181516020939093036101000a6000190180199091169216919091179052604051920182900390912095945050505050565b82541580612616575082548390600019810190811061260157fe5b82541580612786575082548390600019810190811061277157fe5b90600052602060002090600402016000015482115b151561279157600080fd5b604080518082019091529182526020808301918252835460018082018655600095865294829020935160049091029093019283559051805193830193909355918201518051600283018054600160a060020a031916600160a060020a0390921691909117905590910151600390910155565b600160a060020a03821660009081526002602052604090205460ff16151561285157600160a060020a0382166000908152600260205260409020805460ff1916600190811782554283019101555b5050565b6000612862848484612b49565b600101949350505050565b6000610c6f8243612b9a565b60006123178383612bb0565b825460009015806128b857508354849060001981019081106128a357fe5b90600052602060002090600302016000015483115b15156128c357600080fd5b83546128d28560018301612e5a565b508354849060001981019081106128e557fe5b600091825260209091206003909102019283555060019091015550565b61290a612e86565b826129158184612bc3565b8154811061291f57fe5b906000526020600020906002020160408051908101604052908160008201548152602001600182015481525050905092915050565b61295c612e38565b826129678184612c1b565b8154811061297157fe5b906000526020600020906003020160606040519081016040529081600082015481526020016001820154815260200160028201805480602002602001604051908101604052809291908181526020016000905b82821015612a035760008481526020908190206040805180820190915260028502909101805482526001908101548284015290835290920191016129c4565b50505091525090949350505050565b60008083516000101515612a2557600080fd5b5082515b6000811115612a65578360018203815181101515612a4357fe5b60209081029091010151518312612a5c578091506115b7565b60001901612a29565b5060009392505050565b6000808212158015612a8357508282840313155b80612a9a5750600082128015612a9a575082828403135b1515612aa557600080fd5b50900390565b60008083600019141580612ac3575060ff60020a8314155b1515612ace57600080fd5b82600019141580612ae3575060ff60020a8414155b1515612aee57600080fd5b50828202821580612b095750838382811515612b0657fe5b05145b1515610cec57600080fd5b600060ff60020a83141580612b2b57508160001914155b1515612b3657600080fd5b8183811515612b4157fe5b059392505050565b8151600160a060020a03166000908152602084815260408083208286015184529091528120612b79858585612c73565b81548110612b8357fe5b906000526020600020906003020190509392505050565b6000612ba68383612d3b565b6001019392505050565b612bb8612e86565b826129158184612d68565b815460009081908110612bd557600080fd5b508254600019015b6000811061034a578354849082908110612bf357fe5b60009182526020909120600290910201548310612c12578091506115b7565b60001901612bdd565b815460009081908110612c2d57600080fd5b508254600019015b6000811061034a578354849082908110612c4b57fe5b60009182526020909120600390910201548310612c6a578091506115b7565b60001901612c35565b8151600160a060020a031660009081526020848152604080832082860151845290915281205481908110612ca657600080fd5b508251600160a060020a0316600090815260208581526040808320828701518452909152902054600019015b6000811061034a578351600160a060020a03166000908152602086815260408083208288015184529091529020805482908110612d0b57fe5b60009182526020909120600390910201548310612d2a57809150612d33565b60001901612cd2565b509392505050565b600082612d488184612dc0565b81548110612d5257fe5b9060005260206000209060040201905092915050565b815460009081908110612d7a57600080fd5b508254600019015b6000811061034a578354849082908110612d9857fe5b60009182526020909120600290910201548310612db7578091506115b7565b60001901612d82565b815460009081908110612dd257600080fd5b508254600019015b6000811061034a578354849082908110612df057fe5b60009182526020909120600490910201548310612e0f578091506115b7565b60001901612dda565b60606040519081016040528060008152602001612e33612e86565b905290565b6060604051908101604052806000815260200160008152602001606081525090565b815481835581811115611bc257600302816003028360005260206000209182019101611bc29190612e9d565b604080518082019091526000808252602082015290565b610f9f91905b80821115612ecd57600080825560018201819055612ec46002830182612ed1565b50600301612ea3565b5090565b5080546000825560020290600052602060002090810190612ef29190612ef5565b50565b610f9f91905b80821115612ecd5760008082556001820155600201612efb565b6000610c6c82356136fc565b6000601f82018313612f3257600080fd5b8135612f45612f40826136ab565b613685565b91508181835260208401935060208101905083856020840282011115612f6a57600080fd5b60005b83811015612f965781612f808882612fa0565b8452506020928301929190910190600101612f6d565b5050505092915050565b6000610c6c8235610f9f565b6000610c6c8251610f9f565b6000601f82018313612fc957600080fd5b8135612fd7612f40826136cb565b91508082526020830160208301858383011115612ff357600080fd5b612ffe838284613724565b50505092915050565b60006020828403121561301957600080fd5b60006115b48484612f15565b6000806040838503121561303857600080fd5b60006130448585612f15565b92505060208301356001604060020a0381111561306057600080fd5b61306c85828601612fb8565b9150509250929050565b6000806040838503121561308957600080fd5b60006130958585612f15565b925050602061306c85828601612fa0565b6000602082840312156130b857600080fd5b60006115b48484612fac565b6000602082840312156130d657600080fd5b60006115b48484612fa0565b6000806000606084860312156130f757600080fd5b60006131038686612fa0565b935050602061311486828701612f15565b925050604061312586828701612fa0565b9150509250925092565b600080600080600060a0868803121561314757600080fd5b60006131538888612fa0565b955050602061316488828901612f15565b945050604061317588828901612fa0565b935050606061318688828901612f15565b925050608061319788828901612fa0565b9150509295509295909350565b600080600080608085870312156131ba57600080fd5b60006131c68787612fa0565b94505060206131d787828801612f15565b93505060406131e887828801612fa0565b92505060606131f987828801612fa0565b91505092959194509250565b60008060008060008060c0878903121561321e57600080fd5b600061322a8989612fa0565b965050602061323b89828a01612f15565b955050604061324c89828a01612fa0565b945050606061325d89828a01612fa0565b93505060808701356001604060020a0381111561327957600080fd5b61328589828a01612f21565b92505060a08701356001604060020a038111156132a157600080fd5b6132ad89828a01612f21565b9150509295509295509295565b600080604083850312156132cd57600080fd5b60006130958585612fa0565b600080600080608085870312156132ef57600080fd5b60006132fb8787612fa0565b945050602061330c87828801612fa0565b93505060406131e887828801612f15565b6000806000806080858703121561333357600080fd5b600061333f8787612fa0565b945050602061335087828801612fa0565b93505060408501356001604060020a0381111561336c57600080fd5b61337887828801612f21565b92505060608501356001604060020a0381111561339457600080fd5b6131f987828801612f21565b6133a9816136fc565b82525050565b60006133ba826136f8565b8084526020840193506133cc836136f2565b60005b828110156133fc576133e2868351613418565b6133eb826136f2565b6020969096019591506001016133cf565b5093949350505050565b6133a981613708565b6133a981613719565b6133a981610f9f565b600061342c826136f8565b808452613440816020860160208601613730565b61344981613760565b9093016020019392505050565b60208101610c6f82846133a0565b6040810161347282856133a0565b610cec60208301846133a0565b6040810161348d82856133a0565b8181036020830152610e6b8184613421565b604081016134ad82856133a0565b610cec6020830184613418565b60208101610c6f8284613406565b60208101610c6f828461340f565b60208101610c6f8284613418565b606081016134f28286613418565b6134ff60208301856133a0565b610e6b6040830184613418565b60208082528101610c6c8184613421565b60a0810161352b8288613418565b61353860208301876133a0565b6135456040830186613418565b61355260608301856133a0565b61355f6080830184613418565b9695505050505050565b608081016135778287613418565b61358460208301866133a0565b6135916040830185613418565b61359e6060830184613418565b95945050505050565b60c081016135b58289613418565b6135c260208301886133a0565b6135cf6040830187613418565b6135dc6060830186613418565b81810360808301526135ee81856133af565b905081810360a083015261360281846133af565b98975050505050505050565b604081016134ad8285613418565b6080810161362a8287613418565b6136376020830186613418565b61359160408301856133a0565b608081016136528287613418565b61365f6020830186613418565b818103604083015261367181856133af565b9050818103606083015261355f81846133af565b6040518181016001604060020a03811182821017156136a357600080fd5b604052919050565b60006001604060020a038211156136c157600080fd5b5060209081020190565b60006001604060020a038211156136e157600080fd5b506020601f91909101601f19160190565b60200190565b5190565b600160a060020a031690565b151590565b600060028210612ecd57fe5b6000610c6f8261370d565b82818337506000910152565b60005b8381101561374b578181015183820152602001613733565b8381111561375a576000848401525b50505050565b601f01601f1916905600a265627a7a723058206855dd833d2aa3295799c84f9d3dc43cbda2177ea158acd7bb4816f8b9bd00906c6578706572696d656e74616cf50037

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

000000000000000000000000f05179bac3d1fbef58a2fcd7ad0f769840027cc6

-----Decoded View---------------
Arg [0] : deployer (address): 0xf05179bAc3D1fbEF58A2fcD7AD0F769840027cc6

-----Encoded View---------------
1 Constructor Arguments found :
Arg [0] : 000000000000000000000000f05179bac3d1fbef58a2fcd7ad0f769840027cc6


Libraries Used


Swarm Source

bzzr://6855dd833d2aa3295799c84f9d3dc43cbda2177ea158acd7bb4816f8b9bd0090

Block Uncle Number Difficulty Gas Used Reward
View All Uncles
Loading...
Loading
Loading...
Loading
Loading...
Loading
[ Download: CSV Export  ]

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