ETH Price: $2,661.32 (-5.17%)

Contract

0xd5E84E9427BF9427B0c3F8b381051deC6fBD0194
 

Overview

ETH Balance

0 ETH

Eth Value

$0.00

Multichain Info

No addresses found
Transaction Hash
Method
Block
From
To
Add Customer To ...68476392018-12-08 8:34:552270 days ago1544258095IN
0xd5E84E94...C6fBD0194
0 ETH0.0168432816.46875
Add Customer To ...68003462018-11-30 12:28:042278 days ago1543580884IN
0xd5E84E94...C6fBD0194
0 ETH0.0173866117
Add Customer To ...68001522018-11-30 11:41:342278 days ago1543578094IN
0xd5E84E94...C6fBD0194
0 ETH0.0264314825.84375
Add Customer To ...68001492018-11-30 11:41:132278 days ago1543578073IN
0xd5E84E94...C6fBD0194
0 ETH0.0264314825.84375
Add Customer To ...68001442018-11-30 11:39:562278 days ago1543577996IN
0xd5E84E94...C6fBD0194
0 ETH0.0264314825.84375
Add Customer To ...68000882018-11-30 11:24:592278 days ago1543577099IN
0xd5E84E94...C6fBD0194
0 ETH0.0216373821.15625
Add Customer To ...68000612018-11-30 11:17:362278 days ago1543576656IN
0xd5E84E94...C6fBD0194
0 ETH0.022596222.09375
Add Customer To ...68000522018-11-30 11:16:182278 days ago1543576578IN
0xd5E84E94...C6fBD0194
0 ETH0.0235215923
Add Customer To ...68000352018-11-30 11:12:462278 days ago1543576366IN
0xd5E84E94...C6fBD0194
0 ETH0.022596222.09375
Add Customer To ...68000092018-11-30 11:05:452278 days ago1543575945IN
0xd5E84E94...C6fBD0194
0 ETH0.0235230623
Add Customer To ...68000012018-11-30 11:04:262278 days ago1543575866IN
0xd5E84E94...C6fBD0194
0 ETH0.0246669924.12
Add Customer To ...67999972018-11-30 11:03:502278 days ago1543575830IN
0xd5E84E94...C6fBD0194
0 ETH0.0254726624.90625
Add Customer To ...67999922018-11-30 11:02:522278 days ago1543575772IN
0xd5E84E94...C6fBD0194
0 ETH0.0255685525
Add Customer To ...67999892018-11-30 11:02:272278 days ago1543575747IN
0xd5E84E94...C6fBD0194
0 ETH0.0255685525
Add Customer To ...67999782018-11-30 11:00:442278 days ago1543575644IN
0xd5E84E94...C6fBD0194
0 ETH0.0255685525
Add Customer To ...67999732018-11-30 10:59:172278 days ago1543575557IN
0xd5E84E94...C6fBD0194
0 ETH0.0257730925.2
Add Customer To ...67999682018-11-30 10:58:302278 days ago1543575510IN
0xd5E84E94...C6fBD0194
0 ETH0.0258753725.3
Add Customer To ...67999612018-11-30 10:57:052278 days ago1543575425IN
0xd5E84E94...C6fBD0194
0 ETH0.0265912926
Add Customer To ...67999592018-11-30 10:56:522278 days ago1543575412IN
0xd5E84E94...C6fBD0194
0 ETH0.0265912926
Add Customer To ...67999542018-11-30 10:56:032278 days ago1543575363IN
0xd5E84E94...C6fBD0194
0 ETH0.0265912926
Add Customer To ...67999462018-11-30 10:54:012278 days ago1543575241IN
0xd5E84E94...C6fBD0194
0 ETH0.0265896226
Add Customer To ...67999302018-11-30 10:51:212278 days ago1543575081IN
0xd5E84E94...C6fBD0194
0 ETH0.0276140327
Add Customer To ...67998862018-11-30 10:41:052278 days ago1543574465IN
0xd5E84E94...C6fBD0194
0 ETH0.0305799829.9
Add Customer To ...67998812018-11-30 10:40:222278 days ago1543574422IN
0xd5E84E94...C6fBD0194
0 ETH0.0306822630
Add Customer To ...67998782018-11-30 10:39:572278 days ago1543574397IN
0xd5E84E94...C6fBD0194
0 ETH0.0306822630
View all transactions

Latest 25 internal transactions (View All)

Advanced mode:
Parent Transaction Hash Block
From
To
68476392018-12-08 8:34:552270 days ago1544258095
0xd5E84E94...C6fBD0194
 Contract Creation0 ETH
68003462018-11-30 12:28:042278 days ago1543580884
0xd5E84E94...C6fBD0194
 Contract Creation0 ETH
68001522018-11-30 11:41:342278 days ago1543578094
0xd5E84E94...C6fBD0194
 Contract Creation0 ETH
68001492018-11-30 11:41:132278 days ago1543578073
0xd5E84E94...C6fBD0194
 Contract Creation0 ETH
68001442018-11-30 11:39:562278 days ago1543577996
0xd5E84E94...C6fBD0194
 Contract Creation0 ETH
68000882018-11-30 11:24:592278 days ago1543577099
0xd5E84E94...C6fBD0194
 Contract Creation0 ETH
68000612018-11-30 11:17:362278 days ago1543576656
0xd5E84E94...C6fBD0194
 Contract Creation0 ETH
68000522018-11-30 11:16:182278 days ago1543576578
0xd5E84E94...C6fBD0194
 Contract Creation0 ETH
68000352018-11-30 11:12:462278 days ago1543576366
0xd5E84E94...C6fBD0194
 Contract Creation0 ETH
68000092018-11-30 11:05:452278 days ago1543575945
0xd5E84E94...C6fBD0194
 Contract Creation0 ETH
68000012018-11-30 11:04:262278 days ago1543575866
0xd5E84E94...C6fBD0194
 Contract Creation0 ETH
67999972018-11-30 11:03:502278 days ago1543575830
0xd5E84E94...C6fBD0194
 Contract Creation0 ETH
67999922018-11-30 11:02:522278 days ago1543575772
0xd5E84E94...C6fBD0194
 Contract Creation0 ETH
67999892018-11-30 11:02:272278 days ago1543575747
0xd5E84E94...C6fBD0194
 Contract Creation0 ETH
67999782018-11-30 11:00:442278 days ago1543575644
0xd5E84E94...C6fBD0194
 Contract Creation0 ETH
67999732018-11-30 10:59:172278 days ago1543575557
0xd5E84E94...C6fBD0194
 Contract Creation0 ETH
67999682018-11-30 10:58:302278 days ago1543575510
0xd5E84E94...C6fBD0194
 Contract Creation0 ETH
67999612018-11-30 10:57:052278 days ago1543575425
0xd5E84E94...C6fBD0194
 Contract Creation0 ETH
67999592018-11-30 10:56:522278 days ago1543575412
0xd5E84E94...C6fBD0194
 Contract Creation0 ETH
67999542018-11-30 10:56:032278 days ago1543575363
0xd5E84E94...C6fBD0194
 Contract Creation0 ETH
67999462018-11-30 10:54:012278 days ago1543575241
0xd5E84E94...C6fBD0194
 Contract Creation0 ETH
67999302018-11-30 10:51:212278 days ago1543575081
0xd5E84E94...C6fBD0194
 Contract Creation0 ETH
67998862018-11-30 10:41:052278 days ago1543574465
0xd5E84E94...C6fBD0194
 Contract Creation0 ETH
67998812018-11-30 10:40:222278 days ago1543574422
0xd5E84E94...C6fBD0194
 Contract Creation0 ETH
67998782018-11-30 10:39:572278 days ago1543574397
0xd5E84E94...C6fBD0194
 Contract Creation0 ETH
View All Internal Transactions
Loading...
Loading

Contract Source Code Verified (Exact Match)

Contract Name:
McwCustomerRegistry

Compiler Version
v0.4.24+commit.e67f0147

Optimization Enabled:
No with 200 runs

Other Settings:
default evmVersion

Contract Source Code (Solidity)

/**
 *Submitted for verification at Etherscan.io on 2018-08-13
*/

pragma solidity ^0.4.24;

// File: zeppelin-solidity/contracts/ownership/Ownable.sol

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


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


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

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

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

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

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

// File: contracts/TxRegistry.sol

/**
* @title Transaction Registry for Customer
* @dev Registry of customer's payments for MCW and payments for KWh.
*/
contract TxRegistry is Ownable {
    address public customer;

    // @dev Structure for TX data
    struct TxData {
        bytes32 txOrigMcwTransfer;
        uint256 amountMCW;
        uint256 amountKWh;
        uint256 timestampPaymentMCW;
        bytes32 txPaymentKWh;
        uint256 timestampPaymentKWh;
    }

    // @dev Customer's Tx of payment for MCW registry    
    mapping (bytes32 => TxData) private txRegistry;

    // @dev Customer's list of Tx   
    bytes32[] private txIndex;

    /**
    * @dev Constructor
    * @param _customer the address of a customer for whom the TxRegistry contract is creating
    */    
    constructor(address _customer) public {
        customer = _customer;
    }

    /**
    * @dev Owner can add a new Tx of payment for MCW to the customer's TxRegistry
    * @param _txPaymentForMCW the Tx of payment for MCW which will be added
    * @param _txOrigMcwTransfer the Tx of original MCW transfer in Ethereum network which acts as source for this Tx of payment for MCW
    * @param _amountMCW the amount of MCW tokens which will be recorded to the new Tx
    * @param _amountKWh the amount of KWh which will be recorded to the new Tx
    * @param _timestamp the timestamp of payment for MCW which will be recorded to the new Tx
    */
    function addTxToRegistry(
        bytes32 _txPaymentForMCW,
        bytes32 _txOrigMcwTransfer,
        uint256 _amountMCW,
        uint256 _amountKWh,
        uint256 _timestamp
        ) public onlyOwner returns(bool)
    {
        require(
            _txPaymentForMCW != 0 && _txOrigMcwTransfer != 0 && _amountMCW != 0 && _amountKWh != 0 && _timestamp != 0,
            "All parameters must be not empty."
        );
        require(
            txRegistry[_txPaymentForMCW].timestampPaymentMCW == 0,
            "Tx with such hash is already exist."
        );

        txRegistry[_txPaymentForMCW].txOrigMcwTransfer = _txOrigMcwTransfer;
        txRegistry[_txPaymentForMCW].amountMCW = _amountMCW;
        txRegistry[_txPaymentForMCW].amountKWh = _amountKWh;
        txRegistry[_txPaymentForMCW].timestampPaymentMCW = _timestamp;
        txIndex.push(_txPaymentForMCW);
        return true;
    }

    /**
    * @dev Owner can mark a customer's Tx of payment for MCW as spent
    * @param _txPaymentForMCW the Tx of payment for MCW which will be marked as spent
    * @param _txPaymentForKWh the additional Tx of payment for KWh which will be recorded to the original Tx as proof of spend
    * @param _timestamp the timestamp of payment for KWh which will be recorded to the Tx
    */
    function setTxAsSpent(bytes32 _txPaymentForMCW, bytes32 _txPaymentForKWh, uint256 _timestamp) public onlyOwner returns(bool) {
        require(
            _txPaymentForMCW != 0 && _txPaymentForKWh != 0 && _timestamp != 0,
            "All parameters must be not empty."
        );
        require(
            txRegistry[_txPaymentForMCW].timestampPaymentMCW != 0,
            "Tx with such hash doesn't exist."
        );
        require(
            txRegistry[_txPaymentForMCW].timestampPaymentKWh == 0,
            "Tx with such hash is already spent."
        );

        txRegistry[_txPaymentForMCW].txPaymentKWh = _txPaymentForKWh;
        txRegistry[_txPaymentForMCW].timestampPaymentKWh = _timestamp;
        return true;
    }

    /**
    * @dev Get the customer's Tx of payment for MCW amount
    */   
    function getTxCount() public view returns(uint256) {
        return txIndex.length;
    }

    /**
    * @dev Get the customer's Tx of payment for MCW from customer's Tx list by index
    * @param _index the index of a customer's Tx of payment for MCW in the customer's Tx list
    */  
    function getTxAtIndex(uint256 _index) public view returns(bytes32) {
        return txIndex[_index];
    }

    /**
    * @dev Get the customer's Tx of payment for MCW data - Tx of original MCW transfer in Ethereum network which is recorded in the Tx
    * @param _txPaymentForMCW the Tx of payment for MCW for which to get data
    */  
    function getTxOrigMcwTransfer(bytes32 _txPaymentForMCW) public view returns(bytes32) {
        return txRegistry[_txPaymentForMCW].txOrigMcwTransfer;
    }

    /**
    * @dev Get the customer's Tx of payment for MCW data - amount of MCW tokens which is recorded in the Tx
    * @param _txPaymentForMCW the Tx of payment for MCW for which to get data
    */  
    function getTxAmountMCW(bytes32 _txPaymentForMCW) public view returns(uint256) {
        return txRegistry[_txPaymentForMCW].amountMCW;
    }

    /**
    * @dev Get the customer's Tx of payment for MCW data - amount of KWh which is recorded in the Tx
    * @param _txPaymentForMCW the Tx of payment for MCW for which to get data
    */  
    function getTxAmountKWh(bytes32 _txPaymentForMCW) public view returns(uint256) {
        return txRegistry[_txPaymentForMCW].amountKWh;
    }

    /**
    * @dev Get the customer's Tx of payment for MCW data - timestamp of payment for MCW which is recorded in the Tx
    * @param _txPaymentForMCW the Tx of payment for MCW for which to get data
    */  
    function getTxTimestampPaymentMCW(bytes32 _txPaymentForMCW) public view returns(uint256) {
        return txRegistry[_txPaymentForMCW].timestampPaymentMCW;
    }

    /**
    * @dev Get the customer's Tx of payment for MCW data - Tx of payment for KWh which is recorded in the Tx
    * @param _txPaymentForMCW the Tx of payment for MCW for which to get data
    */  
    function getTxPaymentKWh(bytes32 _txPaymentForMCW) public view returns(bytes32) {
        return txRegistry[_txPaymentForMCW].txPaymentKWh;
    }

    /**
    * @dev Get the customer's Tx of payment for MCW data - timestamp of payment for KWh which is recorded in the Tx
    * @param _txPaymentForMCW the Tx of payment for MCW for which to get data
    */  
    function getTxTimestampPaymentKWh(bytes32 _txPaymentForMCW) public view returns(uint256) {
        return txRegistry[_txPaymentForMCW].timestampPaymentKWh;
    }

    /**
    * @dev Check the customer's Tx of payment for MCW
    * @param _txPaymentForMCW the Tx of payment for MCW which need to be checked
    */  
    function isValidTxPaymentForMCW(bytes32 _txPaymentForMCW) public view returns(bool) {
        bool isValid = false;
        if (txRegistry[_txPaymentForMCW].timestampPaymentMCW != 0) {
            isValid = true;
        }
        return isValid;
    }

    /**
    * @dev Check if the customer's Tx of payment for MCW is spent
    * @param _txPaymentForMCW the Tx of payment for MCW which need to be checked
    */
    function isSpentTxPaymentForMCW(bytes32 _txPaymentForMCW) public view returns(bool) {
        bool isSpent = false;
        if (txRegistry[_txPaymentForMCW].timestampPaymentKWh != 0) {
            isSpent = true;
        }
        return isSpent;
    }

    /**
    * @dev Check the customer's Tx of payment for KWh
    * @param _txPaymentForKWh the Tx of payment for KWh which need to be checked
    */
    function isValidTxPaymentForKWh(bytes32 _txPaymentForKWh) public view returns(bool) {
        bool isValid = false;
        for (uint256 i = 0; i < getTxCount(); i++) {
            if (txRegistry[getTxAtIndex(i)].txPaymentKWh == _txPaymentForKWh) {
                isValid = true;
                break;
            }
        }
        return isValid;
    }

    /**
    * @dev Get the customer's Tx of payment for MCW by Tx payment for KWh 
    * @param _txPaymentForKWh the Tx of payment for KWh
    */
    function getTxPaymentMCW(bytes32 _txPaymentForKWh) public view returns(bytes32) {
        bytes32 txMCW = 0;
        for (uint256 i = 0; i < getTxCount(); i++) {
            if (txRegistry[getTxAtIndex(i)].txPaymentKWh == _txPaymentForKWh) {
                txMCW = getTxAtIndex(i);
                break;
            }
        }
        return txMCW;
    }
}

// File: contracts/McwCustomerRegistry.sol

/**
* @title Customers Registry
* @dev Registry of all customers
*/
contract McwCustomerRegistry is Ownable {
    // @dev Key: address of customer wallet, Value: address of customer TxRegistry contract
    mapping (address => address) private registry;

    // @dev Customers list
    address[] private customerIndex;

    // @dev Events for dashboard
    event NewCustomer(address indexed customer, address indexed txRegistry);
    event NewCustomerTx(
        address indexed customer,
        bytes32 txPaymentForMCW,
        bytes32 txOrigMcwTransfer,
        uint256 amountMCW,
        uint256 amountKWh,
        uint256 timestamp
    );
    event SpendCustomerTx(address indexed customer, bytes32 txPaymentForMCW, bytes32 txPaymentForKWh, uint256 timestamp);

    // @dev Constructor
    constructor() public {}

    /**
    * @dev Owner can add a new customer to registry
    * @dev Creates a related TxRegistry contract for the new customer
    * @dev Related event will be generated
    * @param _customer the address of a new customer to add
    */
    function addCustomerToRegistry(address _customer) public onlyOwner returns(bool) {
        require(
            _customer != address(0),
            "Parameter must be not empty."
        );
        require(
            registry[_customer] == address(0),
            "Customer is already in the registry."
        );

        address txRegistry = new TxRegistry(_customer);
        registry[_customer] = txRegistry;
        customerIndex.push(_customer);
        emit NewCustomer(_customer, txRegistry);
        return true;
    }

    /**
    * @dev Owner can add a new Tx of payment for MCW to the customer's TxRegistry
    * @dev Generates the Tx of payment for MCW (hash as proof of payment) and writes the Tx data to the customer's TxRegistry
    * @dev Related event will be generated
    * @param _customer the address of a customer to whom to add a new Tx
    * @param _txOrigMcwTransfer the Tx of original MCW transfer in Ethereum network which acts as source for a new Tx of payment for MCW
    * @param _amountMCW the amount of MCW tokens which will be recorded to the new Tx
    * @param _amountKWh the amount of KWh which will be recorded to the new Tx
    */
    function addTxToCustomerRegistry(
        address _customer,
        bytes32 _txOrigMcwTransfer,
        uint256 _amountMCW,
        uint256 _amountKWh
        ) public onlyOwner returns(bool)
    {
        require(
            isValidCustomer(_customer),
            "Customer is not in the registry."
        );
        require(
            _txOrigMcwTransfer != 0 && _amountMCW != 0 && _amountKWh != 0,
            "All parameters must be not empty."
        );

        uint256 timestamp = now;
        bytes32 txPaymentForMCW = keccak256(
            abi.encodePacked(
                _customer,
                _amountMCW,
                _amountKWh,
                timestamp)
            );

        TxRegistry txRegistry = TxRegistry(registry[_customer]);
        require(
            txRegistry.getTxTimestampPaymentMCW(txPaymentForMCW) == 0,
            "Tx with such hash is already exist."
        );

        if (!txRegistry.addTxToRegistry(
            txPaymentForMCW,
            _txOrigMcwTransfer,
            _amountMCW,
            _amountKWh,
            timestamp))
            revert ("Something went wrong.");
        emit NewCustomerTx(
            _customer,
            txPaymentForMCW,
            _txOrigMcwTransfer,
            _amountMCW,
            _amountKWh,
            timestamp);
        return true;
    }

    /**
    * @dev Owner can mark a customer's Tx of payment for MCW as spent
    * @dev Generates an additional Tx of paymant for KWh (hash as proof of spend), which connected to the original Tx.
    * @dev Related event will be generated
    * @param _customer the address of a customer to whom to spend a Tx
    * @param _txPaymentForMCW the Tx of payment for MCW which will be marked as spent
    */
    function setCustomerTxAsSpent(address _customer, bytes32 _txPaymentForMCW) public onlyOwner returns(bool) {
        require(
            isValidCustomer(_customer),
            "Customer is not in the registry."
        );

        TxRegistry txRegistry = TxRegistry(registry[_customer]);
        require(
            txRegistry.getTxTimestampPaymentMCW(_txPaymentForMCW) != 0,
            "Tx with such hash doesn't exist."
        );
        require(
            txRegistry.getTxTimestampPaymentKWh(_txPaymentForMCW) == 0,
            "Tx with such hash is already spent."
        );

        uint256 timestamp = now;
        bytes32 txPaymentForKWh = keccak256(
            abi.encodePacked(
                _txPaymentForMCW,
                timestamp)
            );

        if (!txRegistry.setTxAsSpent(_txPaymentForMCW, txPaymentForKWh, timestamp))
            revert ("Something went wrong.");
        emit SpendCustomerTx(
            _customer,
            _txPaymentForMCW,
            txPaymentForKWh,
            timestamp);
        return true;
    }

    /**
    * @dev Get the current amount of customers
    */
    function getCustomerCount() public view returns(uint256) {
        return customerIndex.length;
    }

    /**
    * @dev Get the customer's address from customers list by index
    * @param _index the index of a customer in the customers list
    */    
    function getCustomerAtIndex(uint256 _index) public view returns(address) {
        return customerIndex[_index];
    }

    /**
    * @dev Get the customer's TxRegistry contract
    * @param _customer the address of a customer for whom to get TxRegistry contract 
    */   
    function getCustomerTxRegistry(address _customer) public view returns(address) {
        return registry[_customer];
    }

    /**
    * @dev Check the customer's address
    * @param _customer the address of a customer which need to be checked
    */   
    function isValidCustomer(address _customer) public view returns(bool) {
        require(
            _customer != address(0),
            "Parameter must be not empty."
        );

        bool isValid = false;
        address txRegistry = registry[_customer];
        if (txRegistry != address(0)) {
            isValid = true;
        }
        return isValid;
    }

    // wrappers on TxRegistry contract

    /**
    * @dev Get the customer's Tx of payment for MCW amount
    * @param _customer the address of a customer for whom to get
    */   
    function getCustomerTxCount(address _customer) public view returns(uint256) {
        require(
            isValidCustomer(_customer),
            "Customer is not in the registry."
        );

        TxRegistry txRegistry = TxRegistry(registry[_customer]);
        uint256 txCount = txRegistry.getTxCount();
        return txCount;
    }

    /**
    * @dev Get the customer's Tx of payment for MCW from customer's Tx list by index
    * @param _customer the address of a customer for whom to get
    * @param _index the index of a customer's Tx of payment for MCW in the customer's Tx list
    */       
    function getCustomerTxAtIndex(address _customer, uint256 _index) public view returns(bytes32) {
        require(
            isValidCustomer(_customer),
            "Customer is not in the registry."
        );

        TxRegistry txRegistry = TxRegistry(registry[_customer]);
        bytes32 txIndex = txRegistry.getTxAtIndex(_index);
        return txIndex;
    }

    /**
    * @dev Get the customer's Tx of payment for MCW data - Tx of original MCW transfer in Ethereum network which is recorded in the Tx
    * @param _customer the address of a customer for whom to get
    * @param _txPaymentForMCW the Tx of payment for MCW for which to get data
    */  
    function getCustomerTxOrigMcwTransfer(address _customer, bytes32 _txPaymentForMCW) public view returns(bytes32) {
        require(
            isValidCustomer(_customer),
            "Customer is not in the registry."
        );
        require(
            _txPaymentForMCW != bytes32(0),
            "Parameter must be not empty."
        );

        TxRegistry txRegistry = TxRegistry(registry[_customer]);
        bytes32 txOrigMcwTransfer = txRegistry.getTxOrigMcwTransfer(_txPaymentForMCW);
        return txOrigMcwTransfer;
    }

    /**
    * @dev Get the customer's Tx of payment for MCW data - amount of MCW tokens which is recorded in the Tx
    * @param _customer the address of a customer for whom to get
    * @param _txPaymentForMCW the Tx of payment for MCW for which to get data
    */  
    function getCustomerTxAmountMCW(address _customer, bytes32 _txPaymentForMCW) public view returns(uint256) {
        require(
            isValidCustomer(_customer),
            "Customer is not in the registry."
        );
        require(
            _txPaymentForMCW != bytes32(0),
            "Parameter must be not empty."
        );

        TxRegistry txRegistry = TxRegistry(registry[_customer]);
        uint256 amountMCW = txRegistry.getTxAmountMCW(_txPaymentForMCW);
        return amountMCW;
    }

    /**
    * @dev Get the customer's Tx of payment for MCW data - amount of KWh which is recorded in the Tx
    * @param _customer the address of a customer for whom to get
    * @param _txPaymentForMCW the Tx of payment for MCW for which to get data
    */  
    function getCustomerTxAmountKWh(address _customer, bytes32 _txPaymentForMCW) public view returns(uint256) {
        require(
            isValidCustomer(_customer),
            "Customer is not in the registry."
        );
        require(
            _txPaymentForMCW != bytes32(0),
            "Parameter must be not empty."
        );

        TxRegistry txRegistry = TxRegistry(registry[_customer]);
        uint256 amountKWh = txRegistry.getTxAmountKWh(_txPaymentForMCW);
        return amountKWh;
    }

    /**
    * @dev Get the customer's Tx of payment for MCW data - timestamp of payment for MCW which is recorded in the Tx
    * @param _customer the address of a customer for whom to get
    * @param _txPaymentForMCW the Tx of payment for MCW for which to get data
    */  
    function getCustomerTxTimestampPaymentMCW(address _customer, bytes32 _txPaymentForMCW) public view returns(uint256) {
        require(
            isValidCustomer(_customer),
            "Customer is not in the registry."
        );
        require(
            _txPaymentForMCW != bytes32(0),
            "Parameter must be not empty."
        );

        TxRegistry txRegistry = TxRegistry(registry[_customer]);
        uint256 timestampPaymentMCW = txRegistry.getTxTimestampPaymentMCW(_txPaymentForMCW);
        return timestampPaymentMCW;
    }

    /**
    * @dev Get the customer's Tx of payment for MCW data - Tx of payment for KWh which is recorded in the Tx
    * @param _customer the address of a customer for whom to get
    * @param _txPaymentForMCW the Tx of payment for MCW for which to get data
    */  
    function getCustomerTxPaymentKWh(address _customer, bytes32 _txPaymentForMCW) public view returns(bytes32) {
        require(
            isValidCustomer(_customer),
            "Customer is not in the registry."
        );
        require(
            _txPaymentForMCW != bytes32(0),
            "Parameter must be not empty."
        );

        TxRegistry txRegistry = TxRegistry(registry[_customer]);
        bytes32 txPaymentKWh = txRegistry.getTxPaymentKWh(_txPaymentForMCW);
        return txPaymentKWh;
    }

    /**
    * @dev Get the customer's Tx of payment for MCW data - timestamp of payment for KWh which is recorded in the Tx
    * @param _customer the address of a customer for whom to get
    * @param _txPaymentForMCW the Tx of payment for MCW for which to get data
    */  
    function getCustomerTxTimestampPaymentKWh(address _customer, bytes32 _txPaymentForMCW) public view returns(uint256) {
        require(
            isValidCustomer(_customer),
            "Customer is not in the registry."
        );
        require(
            _txPaymentForMCW != bytes32(0),
            "Parameter must be not empty."
        );

        TxRegistry txRegistry = TxRegistry(registry[_customer]);
        uint256 timestampPaymentKWh = txRegistry.getTxTimestampPaymentKWh(_txPaymentForMCW);
        return timestampPaymentKWh;
    }

    /**
    * @dev Check the customer's Tx of payment for MCW
    * @param _customer the address of a customer for whom to check
    * @param _txPaymentForMCW the Tx of payment for MCW which need to be checked
    */  
    function isValidCustomerTxPaymentForMCW(address _customer, bytes32 _txPaymentForMCW) public view returns(bool) {
        require(
            isValidCustomer(_customer),
            "Customer is not in the registry."
        );
        require(
            _txPaymentForMCW != bytes32(0),
            "Parameter must be not empty."
        );

        TxRegistry txRegistry = TxRegistry(registry[_customer]);
        bool isValid = txRegistry.isValidTxPaymentForMCW(_txPaymentForMCW);
        return isValid;
    }

    /**
    * @dev Check if the customer's Tx of payment for MCW is spent
    * @param _customer the address of a customer for whom to check
    * @param _txPaymentForMCW the Tx of payment for MCW which need to be checked
    */
    function isSpentCustomerTxPaymentForMCW(address _customer, bytes32 _txPaymentForMCW) public view returns(bool) {
        require(
            isValidCustomer(_customer),
            "Customer is not in the registry."
        );
        require(
            _txPaymentForMCW != bytes32(0),
            "Parameter must be not empty."
        );

        TxRegistry txRegistry = TxRegistry(registry[_customer]);
        bool isSpent = txRegistry.isSpentTxPaymentForMCW(_txPaymentForMCW);
        return isSpent;
    }

    /**
    * @dev Check the customer's Tx of payment for KWh
    * @param _customer the address of a customer for whom to check
    * @param _txPaymentForKWh the Tx of payment for KWh which need to be checked
    */
    function isValidCustomerTxPaymentForKWh(address _customer, bytes32 _txPaymentForKWh) public view returns(bool) {
        require(
            isValidCustomer(_customer),
            "Customer is not in the registry."
        );
        require(
            _txPaymentForKWh != bytes32(0),
            "Parameter must be not empty."
        );

        TxRegistry txRegistry = TxRegistry(registry[_customer]);
        bool isValid = txRegistry.isValidTxPaymentForKWh(_txPaymentForKWh);
        return isValid;
    }

    /**
    * @dev Get the customer's Tx of payment for MCW by Tx payment for KWh 
    * @param _customer the address of a customer for whom to get
    * @param _txPaymentForKWh the Tx of payment for KWh
    */
    function getCustomerTxPaymentMCW(address _customer, bytes32 _txPaymentForKWh) public view returns(bytes32) {
        require(
            isValidCustomer(_customer),
            "Customer is not in the registry."
        );
        require(
            _txPaymentForKWh != bytes32(0),
            "Parameter must be not empty."
        );

        TxRegistry txRegistry = TxRegistry(registry[_customer]);
        bytes32 txMCW = txRegistry.getTxPaymentMCW(_txPaymentForKWh);
        return txMCW;
    }
}

Contract Security Audit

Contract ABI

[{"constant":true,"inputs":[],"name":"getCustomerCount","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"_customer","type":"address"},{"name":"_txPaymentForMCW","type":"bytes32"}],"name":"getCustomerTxTimestampPaymentMCW","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"_customer","type":"address"},{"name":"_txPaymentForMCW","type":"bytes32"}],"name":"getCustomerTxAmountMCW","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"_customer","type":"address"},{"name":"_txPaymentForMCW","type":"bytes32"}],"name":"isSpentCustomerTxPaymentForMCW","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_customer","type":"address"},{"name":"_txPaymentForMCW","type":"bytes32"}],"name":"setCustomerTxAsSpent","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"name":"_customer","type":"address"},{"name":"_txPaymentForMCW","type":"bytes32"}],"name":"getCustomerTxAmountKWh","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"_customer","type":"address"},{"name":"_txPaymentForMCW","type":"bytes32"}],"name":"getCustomerTxOrigMcwTransfer","outputs":[{"name":"","type":"bytes32"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"_customer","type":"address"},{"name":"_index","type":"uint256"}],"name":"getCustomerTxAtIndex","outputs":[{"name":"","type":"bytes32"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"_customer","type":"address"},{"name":"_txPaymentForKWh","type":"bytes32"}],"name":"isValidCustomerTxPaymentForKWh","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[],"name":"renounceOwnership","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"_customer","type":"address"}],"name":"addCustomerToRegistry","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"name":"_customer","type":"address"}],"name":"isValidCustomer","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"owner","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"_index","type":"uint256"}],"name":"getCustomerAtIndex","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"_customer","type":"address"}],"name":"getCustomerTxRegistry","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"_customer","type":"address"},{"name":"_txPaymentForKWh","type":"bytes32"}],"name":"getCustomerTxPaymentMCW","outputs":[{"name":"","type":"bytes32"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"_customer","type":"address"}],"name":"getCustomerTxCount","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"_customer","type":"address"},{"name":"_txPaymentForMCW","type":"bytes32"}],"name":"getCustomerTxTimestampPaymentKWh","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"_customer","type":"address"},{"name":"_txPaymentForMCW","type":"bytes32"}],"name":"isValidCustomerTxPaymentForMCW","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"_customer","type":"address"},{"name":"_txOrigMcwTransfer","type":"bytes32"},{"name":"_amountMCW","type":"uint256"},{"name":"_amountKWh","type":"uint256"}],"name":"addTxToCustomerRegistry","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"name":"_customer","type":"address"},{"name":"_txPaymentForMCW","type":"bytes32"}],"name":"getCustomerTxPaymentKWh","outputs":[{"name":"","type":"bytes32"}],"payable":false,"stateMutability":"view","type":"function"},{"inputs":[],"payable":false,"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"name":"customer","type":"address"},{"indexed":true,"name":"txRegistry","type":"address"}],"name":"NewCustomer","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"customer","type":"address"},{"indexed":false,"name":"txPaymentForMCW","type":"bytes32"},{"indexed":false,"name":"txOrigMcwTransfer","type":"bytes32"},{"indexed":false,"name":"amountMCW","type":"uint256"},{"indexed":false,"name":"amountKWh","type":"uint256"},{"indexed":false,"name":"timestamp","type":"uint256"}],"name":"NewCustomerTx","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"customer","type":"address"},{"indexed":false,"name":"txPaymentForMCW","type":"bytes32"},{"indexed":false,"name":"txPaymentForKWh","type":"bytes32"},{"indexed":false,"name":"timestamp","type":"uint256"}],"name":"SpendCustomerTx","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"previousOwner","type":"address"}],"name":"OwnershipRenounced","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"previousOwner","type":"address"},{"indexed":true,"name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"}]

608060405234801561001057600080fd5b50336000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506148af806100606000396000f300608060405260043610610128576000357c0100000000000000000000000000000000000000000000000000000000900463ffffffff1680632027d7461461012d57806323a90e5e1461015857806324453ed6146101bd57806326d3ed0a146102225780632e97f1bb1461028b5780634569db8a146102f45780635d385031146103595780636001b23e146103c6578063712aa1911461042f578063715018a6146104985780637666ee8f146104af578063781660971461050a5780638da5cb5b1461056557806397fb2cea146105bc5780639830a8fd14610629578063a0e6a44b146106ac578063a14977d514610719578063c3c6f0c914610770578063cac952ae146107d5578063f2fde38b1461083e578063f394275314610881578063faadb14a146108fe575b600080fd5b34801561013957600080fd5b5061014261096b565b6040518082815260200191505060405180910390f35b34801561016457600080fd5b506101a7600480360381019080803573ffffffffffffffffffffffffffffffffffffffff1690602001909291908035600019169060200190929190505050610978565b6040518082815260200191505060405180910390f35b3480156101c957600080fd5b5061020c600480360381019080803573ffffffffffffffffffffffffffffffffffffffff1690602001909291908035600019169060200190929190505050610b9f565b6040518082815260200191505060405180910390f35b34801561022e57600080fd5b50610271600480360381019080803573ffffffffffffffffffffffffffffffffffffffff1690602001909291908035600019169060200190929190505050610dc6565b604051808215151515815260200191505060405180910390f35b34801561029757600080fd5b506102da600480360381019080803573ffffffffffffffffffffffffffffffffffffffff1690602001909291908035600019169060200190929190505050610fed565b604051808215151515815260200191505060405180910390f35b34801561030057600080fd5b50610343600480360381019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080356000191690602001909291905050506115f6565b6040518082815260200191505060405180910390f35b34801561036557600080fd5b506103a8600480360381019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803560001916906020019092919050505061181d565b60405180826000191660001916815260200191505060405180910390f35b3480156103d257600080fd5b50610411600480360381019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190505050611a44565b60405180826000191660001916815260200191505060405180910390f35b34801561043b57600080fd5b5061047e600480360381019080803573ffffffffffffffffffffffffffffffffffffffff1690602001909291908035600019169060200190929190505050611bdf565b604051808215151515815260200191505060405180910390f35b3480156104a457600080fd5b506104ad611e06565b005b3480156104bb57600080fd5b506104f0600480360381019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050611f08565b604051808215151515815260200191505060405180910390f35b34801561051657600080fd5b5061054b600480360381019080803573ffffffffffffffffffffffffffffffffffffffff1690602001909291905050506122da565b604051808215151515815260200191505060405180910390f35b34801561057157600080fd5b5061057a61242e565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b3480156105c857600080fd5b506105e760048036038101908080359060200190929190505050612453565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b34801561063557600080fd5b5061066a600480360381019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050612496565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b3480156106b857600080fd5b506106fb600480360381019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080356000191690602001909291905050506124ff565b60405180826000191660001916815260200191505060405180910390f35b34801561072557600080fd5b5061075a600480360381019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050612726565b6040518082815260200191505060405180910390f35b34801561077c57600080fd5b506107bf600480360381019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080356000191690602001909291905050506128b5565b6040518082815260200191505060405180910390f35b3480156107e157600080fd5b50610824600480360381019080803573ffffffffffffffffffffffffffffffffffffffff1690602001909291908035600019169060200190929190505050612adc565b604051808215151515815260200191505060405180910390f35b34801561084a57600080fd5b5061087f600480360381019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050612d03565b005b34801561088d57600080fd5b506108e4600480360381019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080356000191690602001909291908035906020019092919080359060200190929190505050612d6a565b604051808215151515815260200191505060405180910390f35b34801561090a57600080fd5b5061094d600480360381019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803560001916906020019092919050505061336e565b60405180826000191660001916815260200191505060405180910390f35b6000600280549050905090565b6000806000610986856122da565b15156109fa576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f437573746f6d6572206973206e6f7420696e207468652072656769737472792e81525060200191505060405180910390fd5b600060010260001916846000191614151515610a7e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601c8152602001807f506172616d65746572206d757374206265206e6f7420656d7074792e0000000081525060200191505060405180910390fd5b600160008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1691508173ffffffffffffffffffffffffffffffffffffffff1663675c3048856040518263ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401808260001916600019168152602001915050602060405180830381600087803b158015610b5757600080fd5b505af1158015610b6b573d6000803e3d6000fd5b505050506040513d6020811015610b8157600080fd5b81019080805190602001909291905050509050809250505092915050565b6000806000610bad856122da565b1515610c21576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f437573746f6d6572206973206e6f7420696e207468652072656769737472792e81525060200191505060405180910390fd5b600060010260001916846000191614151515610ca5576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601c8152602001807f506172616d65746572206d757374206265206e6f7420656d7074792e0000000081525060200191505060405180910390fd5b600160008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1691508173ffffffffffffffffffffffffffffffffffffffff1663dc1bba17856040518263ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401808260001916600019168152602001915050602060405180830381600087803b158015610d7e57600080fd5b505af1158015610d92573d6000803e3d6000fd5b505050506040513d6020811015610da857600080fd5b81019080805190602001909291905050509050809250505092915050565b6000806000610dd4856122da565b1515610e48576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f437573746f6d6572206973206e6f7420696e207468652072656769737472792e81525060200191505060405180910390fd5b600060010260001916846000191614151515610ecc576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601c8152602001807f506172616d65746572206d757374206265206e6f7420656d7074792e0000000081525060200191505060405180910390fd5b600160008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1691508173ffffffffffffffffffffffffffffffffffffffff1663f79a97fc856040518263ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401808260001916600019168152602001915050602060405180830381600087803b158015610fa557600080fd5b505af1158015610fb9573d6000803e3d6000fd5b505050506040513d6020811015610fcf57600080fd5b81019080805190602001909291905050509050809250505092915050565b6000806000806000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614151561104e57600080fd5b611057866122da565b15156110cb576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f437573746f6d6572206973206e6f7420696e207468652072656769737472792e81525060200191505060405180910390fd5b600160008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16925060008373ffffffffffffffffffffffffffffffffffffffff1663675c3048876040518263ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401808260001916600019168152602001915050602060405180830381600087803b1580156111a657600080fd5b505af11580156111ba573d6000803e3d6000fd5b505050506040513d60208110156111d057600080fd5b810190808051906020019092919050505014151515611257576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f547820776974682073756368206861736820646f65736e27742065786973742e81525060200191505060405180910390fd5b60008373ffffffffffffffffffffffffffffffffffffffff1663517e62ab876040518263ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401808260001916600019168152602001915050602060405180830381600087803b1580156112d057600080fd5b505af11580156112e4573d6000803e3d6000fd5b505050506040513d60208110156112fa57600080fd5b81019080805190602001909291905050501415156113a6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260238152602001807f547820776974682073756368206861736820697320616c72656164792073706581526020017f6e742e000000000000000000000000000000000000000000000000000000000081525060400191505060405180910390fd5b4291508482604051602001808360001916600019168152602001828152602001925050506040516020818303038152906040526040518082805190602001908083835b60208310151561140e57805182526020820191506020810190506020830392506113e9565b6001836020036101000a038019825116818451168082178552505050505050905001915050604051809103902090508273ffffffffffffffffffffffffffffffffffffffff1663da79a9fc8683856040518463ffffffff167c010000000000000000000000000000000000000000000000000000000002815260040180846000191660001916815260200183600019166000191681526020018281526020019350505050602060405180830381600087803b1580156114cc57600080fd5b505af11580156114e0573d6000803e3d6000fd5b505050506040513d60208110156114f657600080fd5b8101908080519060200190929190505050151561157b576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260158152602001807f536f6d657468696e672077656e742077726f6e672e000000000000000000000081525060200191505060405180910390fd5b8573ffffffffffffffffffffffffffffffffffffffff167f896fb7bbb6019770fafd33405c94158d718a22bfaf47272c44dfa5fb0b2e02658683856040518084600019166000191681526020018360001916600019168152602001828152602001935050505060405180910390a26001935050505092915050565b6000806000611604856122da565b1515611678576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f437573746f6d6572206973206e6f7420696e207468652072656769737472792e81525060200191505060405180910390fd5b6000600102600019168460001916141515156116fc576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601c8152602001807f506172616d65746572206d757374206265206e6f7420656d7074792e0000000081525060200191505060405180910390fd5b600160008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1691508173ffffffffffffffffffffffffffffffffffffffff16639d11f09f856040518263ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401808260001916600019168152602001915050602060405180830381600087803b1580156117d557600080fd5b505af11580156117e9573d6000803e3d6000fd5b505050506040513d60208110156117ff57600080fd5b81019080805190602001909291905050509050809250505092915050565b600080600061182b856122da565b151561189f576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f437573746f6d6572206973206e6f7420696e207468652072656769737472792e81525060200191505060405180910390fd5b600060010260001916846000191614151515611923576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601c8152602001807f506172616d65746572206d757374206265206e6f7420656d7074792e0000000081525060200191505060405180910390fd5b600160008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1691508173ffffffffffffffffffffffffffffffffffffffff1663772b7a73856040518263ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401808260001916600019168152602001915050602060405180830381600087803b1580156119fc57600080fd5b505af1158015611a10573d6000803e3d6000fd5b505050506040513d6020811015611a2657600080fd5b81019080805190602001909291905050509050809250505092915050565b6000806000611a52856122da565b1515611ac6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f437573746f6d6572206973206e6f7420696e207468652072656769737472792e81525060200191505060405180910390fd5b600160008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1691508173ffffffffffffffffffffffffffffffffffffffff1663b167c34e856040518263ffffffff167c010000000000000000000000000000000000000000000000000000000002815260040180828152602001915050602060405180830381600087803b158015611b9757600080fd5b505af1158015611bab573d6000803e3d6000fd5b505050506040513d6020811015611bc157600080fd5b81019080805190602001909291905050509050809250505092915050565b6000806000611bed856122da565b1515611c61576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f437573746f6d6572206973206e6f7420696e207468652072656769737472792e81525060200191505060405180910390fd5b600060010260001916846000191614151515611ce5576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601c8152602001807f506172616d65746572206d757374206265206e6f7420656d7074792e0000000081525060200191505060405180910390fd5b600160008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1691508173ffffffffffffffffffffffffffffffffffffffff1663dd02e30d856040518263ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401808260001916600019168152602001915050602060405180830381600087803b158015611dbe57600080fd5b505af1158015611dd2573d6000803e3d6000fd5b505050506040513d6020811015611de857600080fd5b81019080805190602001909291905050509050809250505092915050565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16141515611e6157600080fd5b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167ff8df31144d9c2f0f6b59d69b8b98abd5459d07f2742c4df920b25aae33c6482060405160405180910390a260008060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550565b6000806000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16141515611f6657600080fd5b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415151561200b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601c8152602001807f506172616d65746572206d757374206265206e6f7420656d7074792e0000000081525060200191505060405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff16600160008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16141515612134576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260248152602001807f437573746f6d657220697320616c726561647920696e2074686520726567697381526020017f7472792e0000000000000000000000000000000000000000000000000000000081525060400191505060405180910390fd5b8261213d61368f565b808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001915050604051809103906000f08015801561218f573d6000803e3d6000fd5b50905080600160008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060028390806001815401808255809150509060018203906000526020600020016000909192909190916101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167fb9a729146003b2590bfdbb9eb4b38762acf6ff00de0202bb350d30a152fcce9860405160405180910390a36001915050919050565b60008060008073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1614151515612383576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601c8152602001807f506172616d65746572206d757374206265206e6f7420656d7074792e0000000081525060200191505060405180910390fd5b60009150600160008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614151561242457600191505b8192505050919050565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600060028281548110151561246457fe5b9060005260206000200160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b6000600160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b600080600061250d856122da565b1515612581576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f437573746f6d6572206973206e6f7420696e207468652072656769737472792e81525060200191505060405180910390fd5b600060010260001916846000191614151515612605576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601c8152602001807f506172616d65746572206d757374206265206e6f7420656d7074792e0000000081525060200191505060405180910390fd5b600160008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1691508173ffffffffffffffffffffffffffffffffffffffff16635af9f68f856040518263ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401808260001916600019168152602001915050602060405180830381600087803b1580156126de57600080fd5b505af11580156126f2573d6000803e3d6000fd5b505050506040513d602081101561270857600080fd5b81019080805190602001909291905050509050809250505092915050565b6000806000612734846122da565b15156127a8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f437573746f6d6572206973206e6f7420696e207468652072656769737472792e81525060200191505060405180910390fd5b600160008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1691508173ffffffffffffffffffffffffffffffffffffffff16631dd46c1e6040518163ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401602060405180830381600087803b15801561286e57600080fd5b505af1158015612882573d6000803e3d6000fd5b505050506040513d602081101561289857600080fd5b810190808051906020019092919050505090508092505050919050565b60008060006128c3856122da565b1515612937576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f437573746f6d6572206973206e6f7420696e207468652072656769737472792e81525060200191505060405180910390fd5b6000600102600019168460001916141515156129bb576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601c8152602001807f506172616d65746572206d757374206265206e6f7420656d7074792e0000000081525060200191505060405180910390fd5b600160008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1691508173ffffffffffffffffffffffffffffffffffffffff1663517e62ab856040518263ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401808260001916600019168152602001915050602060405180830381600087803b158015612a9457600080fd5b505af1158015612aa8573d6000803e3d6000fd5b505050506040513d6020811015612abe57600080fd5b81019080805190602001909291905050509050809250505092915050565b6000806000612aea856122da565b1515612b5e576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f437573746f6d6572206973206e6f7420696e207468652072656769737472792e81525060200191505060405180910390fd5b600060010260001916846000191614151515612be2576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601c8152602001807f506172616d65746572206d757374206265206e6f7420656d7074792e0000000081525060200191505060405180910390fd5b600160008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1691508173ffffffffffffffffffffffffffffffffffffffff1663f22c0f7d856040518263ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401808260001916600019168152602001915050602060405180830381600087803b158015612cbb57600080fd5b505af1158015612ccf573d6000803e3d6000fd5b505050506040513d6020811015612ce557600080fd5b81019080805190602001909291905050509050809250505092915050565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16141515612d5e57600080fd5b612d6781613595565b50565b6000806000806000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16141515612dcb57600080fd5b612dd4886122da565b1515612e48576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f437573746f6d6572206973206e6f7420696e207468652072656769737472792e81525060200191505060405180910390fd5b6000600102876000191614158015612e61575060008614155b8015612e6e575060008514155b1515612f08576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260218152602001807f416c6c20706172616d6574657273206d757374206265206e6f7420656d70747981526020017f2e0000000000000000000000000000000000000000000000000000000000000081525060400191505060405180910390fd5b42925087868685604051602001808573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166c010000000000000000000000000281526014018481526020018381526020018281526020019450505050506040516020818303038152906040526040518082805190602001908083835b602083101515612fb35780518252602082019150602081019050602083039250612f8e565b6001836020036101000a03801982511681845116808217855250505050505090500191505060405180910390209150600160008973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905060008173ffffffffffffffffffffffffffffffffffffffff1663675c3048846040518263ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401808260001916600019168152602001915050602060405180830381600087803b1580156130bd57600080fd5b505af11580156130d1573d6000803e3d6000fd5b505050506040513d60208110156130e757600080fd5b8101908080519060200190929190505050141515613193576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260238152602001807f547820776974682073756368206861736820697320616c72656164792065786981526020017f73742e000000000000000000000000000000000000000000000000000000000081525060400191505060405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16632729f44e83898989886040518663ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401808660001916600019168152602001856000191660001916815260200184815260200183815260200182815260200195505050505050602060405180830381600087803b15801561323257600080fd5b505af1158015613246573d6000803e3d6000fd5b505050506040513d602081101561325c57600080fd5b810190808051906020019092919050505015156132e1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260158152602001807f536f6d657468696e672077656e742077726f6e672e000000000000000000000081525060200191505060405180910390fd5b8773ffffffffffffffffffffffffffffffffffffffff167f8df8d17e46812b16c4b504454beba4429f4c097d49e2a7f34b5b1da2358c7d59838989898860405180866000191660001916815260200185600019166000191681526020018481526020018381526020018281526020019550505050505060405180910390a260019350505050949350505050565b600080600061337c856122da565b15156133f0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f437573746f6d6572206973206e6f7420696e207468652072656769737472792e81525060200191505060405180910390fd5b600060010260001916846000191614151515613474576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601c8152602001807f506172616d65746572206d757374206265206e6f7420656d7074792e0000000081525060200191505060405180910390fd5b600160008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1691508173ffffffffffffffffffffffffffffffffffffffff1663ff56b65a856040518263ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401808260001916600019168152602001915050602060405180830381600087803b15801561354d57600080fd5b505af1158015613561573d6000803e3d6000fd5b505050506040513d602081101561357757600080fd5b81019080805190602001909291905050509050809250505092915050565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16141515156135d157600080fd5b8073ffffffffffffffffffffffffffffffffffffffff166000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a3806000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b6040516111e4806136a0833901905600608060405234801561001057600080fd5b506040516020806111e483398101806040528101908080519060200190929190505050336000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555080600160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050611120806100c46000396000f3006080604052600436106100fc576000357c0100000000000000000000000000000000000000000000000000000000900463ffffffff1680631dd46c1e146101015780632729f44e1461012c5780632804b2c0146101a1578063517e62ab146101f85780635af9f68f1461023d578063675c30481461028a578063715018a6146102cf578063772b7a73146102e65780638da5cb5b146103335780639d11f09f1461038a578063b167c34e146103cf578063da79a9fc14610418578063dc1bba1714610479578063dd02e30d146104be578063f22c0f7d14610507578063f2fde38b14610550578063f79a97fc14610593578063ff56b65a146105dc575b600080fd5b34801561010d57600080fd5b50610116610629565b6040518082815260200191505060405180910390f35b34801561013857600080fd5b5061018760048036038101908080356000191690602001909291908035600019169060200190929190803590602001909291908035906020019092919080359060200190929190505050610636565b604051808215151515815260200191505060405180910390f35b3480156101ad57600080fd5b506101b66108ff565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b34801561020457600080fd5b506102276004803603810190808035600019169060200190929190505050610925565b6040518082815260200191505060405180910390f35b34801561024957600080fd5b5061026c600480360381019080803560001916906020019092919050505061094d565b60405180826000191660001916815260200191505060405180910390f35b34801561029657600080fd5b506102b960048036038101908080356000191690602001909291905050506109c9565b6040518082815260200191505060405180910390f35b3480156102db57600080fd5b506102e46109f1565b005b3480156102f257600080fd5b506103156004803603810190808035600019169060200190929190505050610af3565b60405180826000191660001916815260200191505060405180910390f35b34801561033f57600080fd5b50610348610b1b565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b34801561039657600080fd5b506103b96004803603810190808035600019169060200190929190505050610b40565b6040518082815260200191505060405180910390f35b3480156103db57600080fd5b506103fa60048036038101908080359060200190929190505050610b68565b60405180826000191660001916815260200191505060405180910390f35b34801561042457600080fd5b5061045f6004803603810190808035600019169060200190929190803560001916906020019092919080359060200190929190505050610b8b565b604051808215151515815260200191505060405180910390f35b34801561048557600080fd5b506104a86004803603810190808035600019169060200190929190505050610e57565b6040518082815260200191505060405180910390f35b3480156104ca57600080fd5b506104ed6004803603810190808035600019169060200190929190505050610e7f565b604051808215151515815260200191505060405180910390f35b34801561051357600080fd5b506105366004803603810190808035600019169060200190929190505050610ef1565b604051808215151515815260200191505060405180910390f35b34801561055c57600080fd5b50610591600480360381019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050610f2e565b005b34801561059f57600080fd5b506105c26004803603810190808035600019169060200190929190505050610f95565b604051808215151515815260200191505060405180910390f35b3480156105e857600080fd5b5061060b6004803603810190808035600019169060200190929190505050610fd2565b60405180826000191660001916815260200191505060405180910390f35b6000600380549050905090565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614151561069357600080fd5b60006001028660001916141580156106b357506000600102856000191614155b80156106c0575060008414155b80156106cd575060008314155b80156106da575060008214155b1515610774576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260218152602001807f416c6c20706172616d6574657273206d757374206265206e6f7420656d70747981526020017f2e0000000000000000000000000000000000000000000000000000000000000081525060400191505060405180910390fd5b600060026000886000191660001916815260200190815260200160002060030154141515610830576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260238152602001807f547820776974682073756368206861736820697320616c72656164792065786981526020017f73742e000000000000000000000000000000000000000000000000000000000081525060400191505060405180910390fd5b84600260008860001916600019168152602001908152602001600020600001816000191690555083600260008860001916600019168152602001908152602001600020600101819055508260026000886000191660001916815260200190815260200160002060020181905550816002600088600019166000191681526020019081526020016000206003018190555060038690806001815401808255809150509060018203906000526020600020016000909192909190915090600019169055506001905095945050505050565b600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6000600260008360001916600019168152602001908152602001600020600501549050919050565b6000806000806001029150600090505b610965610629565b8110156109bf5783600019166002600061097e84610b68565b60001916600019168152602001908152602001600020600401546000191614156109b2576109ab81610b68565b91506109bf565b808060010191505061095d565b8192505050919050565b6000600260008360001916600019168152602001908152602001600020600301549050919050565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16141515610a4c57600080fd5b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167ff8df31144d9c2f0f6b59d69b8b98abd5459d07f2742c4df920b25aae33c6482060405160405180910390a260008060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550565b6000600260008360001916600019168152602001908152602001600020600001549050919050565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6000600260008360001916600019168152602001908152602001600020600201549050919050565b6000600382815481101515610b7957fe5b90600052602060002001549050919050565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16141515610be857600080fd5b6000600102846000191614158015610c0857506000600102836000191614155b8015610c15575060008214155b1515610caf576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260218152602001807f416c6c20706172616d6574657273206d757374206265206e6f7420656d70747981526020017f2e0000000000000000000000000000000000000000000000000000000000000081525060400191505060405180910390fd5b60006002600086600019166000191681526020019081526020016000206003015414151515610d46576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f547820776974682073756368206861736820646f65736e27742065786973742e81525060200191505060405180910390fd5b600060026000866000191660001916815260200190815260200160002060050154141515610e02576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260238152602001807f547820776974682073756368206861736820697320616c72656164792073706581526020017f6e742e000000000000000000000000000000000000000000000000000000000081525060400191505060405180910390fd5b8260026000866000191660001916815260200190815260200160002060040181600019169055508160026000866000191660001916815260200190815260200160002060050181905550600190509392505050565b6000600260008360001916600019168152602001908152602001600020600101549050919050565b6000806000809150600090505b610e94610629565b811015610ee757836000191660026000610ead84610b68565b6000191660001916815260200190815260200160002060040154600019161415610eda5760019150610ee7565b8080600101915050610e8c565b8192505050919050565b60008060009050600060026000856000191660001916815260200190815260200160002060030154141515610f2557600190505b80915050919050565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16141515610f8957600080fd5b610f9281610ffa565b50565b60008060009050600060026000856000191660001916815260200190815260200160002060050154141515610fc957600190505b80915050919050565b6000600260008360001916600019168152602001908152602001600020600401549050919050565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415151561103657600080fd5b8073ffffffffffffffffffffffffffffffffffffffff166000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a3806000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550505600a165627a7a72305820cdbe33d24a2932853454ffefe3848b127f45247ec74e03077f16e8845776a5570029a165627a7a723058206da21458082fbe4e2d63f3ae0f67cea3faf3f5f7ae7c0434037c5543c6252ea50029

Deployed Bytecode

0x608060405260043610610128576000357c0100000000000000000000000000000000000000000000000000000000900463ffffffff1680632027d7461461012d57806323a90e5e1461015857806324453ed6146101bd57806326d3ed0a146102225780632e97f1bb1461028b5780634569db8a146102f45780635d385031146103595780636001b23e146103c6578063712aa1911461042f578063715018a6146104985780637666ee8f146104af578063781660971461050a5780638da5cb5b1461056557806397fb2cea146105bc5780639830a8fd14610629578063a0e6a44b146106ac578063a14977d514610719578063c3c6f0c914610770578063cac952ae146107d5578063f2fde38b1461083e578063f394275314610881578063faadb14a146108fe575b600080fd5b34801561013957600080fd5b5061014261096b565b6040518082815260200191505060405180910390f35b34801561016457600080fd5b506101a7600480360381019080803573ffffffffffffffffffffffffffffffffffffffff1690602001909291908035600019169060200190929190505050610978565b6040518082815260200191505060405180910390f35b3480156101c957600080fd5b5061020c600480360381019080803573ffffffffffffffffffffffffffffffffffffffff1690602001909291908035600019169060200190929190505050610b9f565b6040518082815260200191505060405180910390f35b34801561022e57600080fd5b50610271600480360381019080803573ffffffffffffffffffffffffffffffffffffffff1690602001909291908035600019169060200190929190505050610dc6565b604051808215151515815260200191505060405180910390f35b34801561029757600080fd5b506102da600480360381019080803573ffffffffffffffffffffffffffffffffffffffff1690602001909291908035600019169060200190929190505050610fed565b604051808215151515815260200191505060405180910390f35b34801561030057600080fd5b50610343600480360381019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080356000191690602001909291905050506115f6565b6040518082815260200191505060405180910390f35b34801561036557600080fd5b506103a8600480360381019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803560001916906020019092919050505061181d565b60405180826000191660001916815260200191505060405180910390f35b3480156103d257600080fd5b50610411600480360381019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190505050611a44565b60405180826000191660001916815260200191505060405180910390f35b34801561043b57600080fd5b5061047e600480360381019080803573ffffffffffffffffffffffffffffffffffffffff1690602001909291908035600019169060200190929190505050611bdf565b604051808215151515815260200191505060405180910390f35b3480156104a457600080fd5b506104ad611e06565b005b3480156104bb57600080fd5b506104f0600480360381019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050611f08565b604051808215151515815260200191505060405180910390f35b34801561051657600080fd5b5061054b600480360381019080803573ffffffffffffffffffffffffffffffffffffffff1690602001909291905050506122da565b604051808215151515815260200191505060405180910390f35b34801561057157600080fd5b5061057a61242e565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b3480156105c857600080fd5b506105e760048036038101908080359060200190929190505050612453565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b34801561063557600080fd5b5061066a600480360381019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050612496565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b3480156106b857600080fd5b506106fb600480360381019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080356000191690602001909291905050506124ff565b60405180826000191660001916815260200191505060405180910390f35b34801561072557600080fd5b5061075a600480360381019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050612726565b6040518082815260200191505060405180910390f35b34801561077c57600080fd5b506107bf600480360381019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080356000191690602001909291905050506128b5565b6040518082815260200191505060405180910390f35b3480156107e157600080fd5b50610824600480360381019080803573ffffffffffffffffffffffffffffffffffffffff1690602001909291908035600019169060200190929190505050612adc565b604051808215151515815260200191505060405180910390f35b34801561084a57600080fd5b5061087f600480360381019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050612d03565b005b34801561088d57600080fd5b506108e4600480360381019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080356000191690602001909291908035906020019092919080359060200190929190505050612d6a565b604051808215151515815260200191505060405180910390f35b34801561090a57600080fd5b5061094d600480360381019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803560001916906020019092919050505061336e565b60405180826000191660001916815260200191505060405180910390f35b6000600280549050905090565b6000806000610986856122da565b15156109fa576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f437573746f6d6572206973206e6f7420696e207468652072656769737472792e81525060200191505060405180910390fd5b600060010260001916846000191614151515610a7e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601c8152602001807f506172616d65746572206d757374206265206e6f7420656d7074792e0000000081525060200191505060405180910390fd5b600160008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1691508173ffffffffffffffffffffffffffffffffffffffff1663675c3048856040518263ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401808260001916600019168152602001915050602060405180830381600087803b158015610b5757600080fd5b505af1158015610b6b573d6000803e3d6000fd5b505050506040513d6020811015610b8157600080fd5b81019080805190602001909291905050509050809250505092915050565b6000806000610bad856122da565b1515610c21576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f437573746f6d6572206973206e6f7420696e207468652072656769737472792e81525060200191505060405180910390fd5b600060010260001916846000191614151515610ca5576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601c8152602001807f506172616d65746572206d757374206265206e6f7420656d7074792e0000000081525060200191505060405180910390fd5b600160008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1691508173ffffffffffffffffffffffffffffffffffffffff1663dc1bba17856040518263ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401808260001916600019168152602001915050602060405180830381600087803b158015610d7e57600080fd5b505af1158015610d92573d6000803e3d6000fd5b505050506040513d6020811015610da857600080fd5b81019080805190602001909291905050509050809250505092915050565b6000806000610dd4856122da565b1515610e48576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f437573746f6d6572206973206e6f7420696e207468652072656769737472792e81525060200191505060405180910390fd5b600060010260001916846000191614151515610ecc576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601c8152602001807f506172616d65746572206d757374206265206e6f7420656d7074792e0000000081525060200191505060405180910390fd5b600160008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1691508173ffffffffffffffffffffffffffffffffffffffff1663f79a97fc856040518263ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401808260001916600019168152602001915050602060405180830381600087803b158015610fa557600080fd5b505af1158015610fb9573d6000803e3d6000fd5b505050506040513d6020811015610fcf57600080fd5b81019080805190602001909291905050509050809250505092915050565b6000806000806000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614151561104e57600080fd5b611057866122da565b15156110cb576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f437573746f6d6572206973206e6f7420696e207468652072656769737472792e81525060200191505060405180910390fd5b600160008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16925060008373ffffffffffffffffffffffffffffffffffffffff1663675c3048876040518263ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401808260001916600019168152602001915050602060405180830381600087803b1580156111a657600080fd5b505af11580156111ba573d6000803e3d6000fd5b505050506040513d60208110156111d057600080fd5b810190808051906020019092919050505014151515611257576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f547820776974682073756368206861736820646f65736e27742065786973742e81525060200191505060405180910390fd5b60008373ffffffffffffffffffffffffffffffffffffffff1663517e62ab876040518263ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401808260001916600019168152602001915050602060405180830381600087803b1580156112d057600080fd5b505af11580156112e4573d6000803e3d6000fd5b505050506040513d60208110156112fa57600080fd5b81019080805190602001909291905050501415156113a6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260238152602001807f547820776974682073756368206861736820697320616c72656164792073706581526020017f6e742e000000000000000000000000000000000000000000000000000000000081525060400191505060405180910390fd5b4291508482604051602001808360001916600019168152602001828152602001925050506040516020818303038152906040526040518082805190602001908083835b60208310151561140e57805182526020820191506020810190506020830392506113e9565b6001836020036101000a038019825116818451168082178552505050505050905001915050604051809103902090508273ffffffffffffffffffffffffffffffffffffffff1663da79a9fc8683856040518463ffffffff167c010000000000000000000000000000000000000000000000000000000002815260040180846000191660001916815260200183600019166000191681526020018281526020019350505050602060405180830381600087803b1580156114cc57600080fd5b505af11580156114e0573d6000803e3d6000fd5b505050506040513d60208110156114f657600080fd5b8101908080519060200190929190505050151561157b576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260158152602001807f536f6d657468696e672077656e742077726f6e672e000000000000000000000081525060200191505060405180910390fd5b8573ffffffffffffffffffffffffffffffffffffffff167f896fb7bbb6019770fafd33405c94158d718a22bfaf47272c44dfa5fb0b2e02658683856040518084600019166000191681526020018360001916600019168152602001828152602001935050505060405180910390a26001935050505092915050565b6000806000611604856122da565b1515611678576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f437573746f6d6572206973206e6f7420696e207468652072656769737472792e81525060200191505060405180910390fd5b6000600102600019168460001916141515156116fc576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601c8152602001807f506172616d65746572206d757374206265206e6f7420656d7074792e0000000081525060200191505060405180910390fd5b600160008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1691508173ffffffffffffffffffffffffffffffffffffffff16639d11f09f856040518263ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401808260001916600019168152602001915050602060405180830381600087803b1580156117d557600080fd5b505af11580156117e9573d6000803e3d6000fd5b505050506040513d60208110156117ff57600080fd5b81019080805190602001909291905050509050809250505092915050565b600080600061182b856122da565b151561189f576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f437573746f6d6572206973206e6f7420696e207468652072656769737472792e81525060200191505060405180910390fd5b600060010260001916846000191614151515611923576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601c8152602001807f506172616d65746572206d757374206265206e6f7420656d7074792e0000000081525060200191505060405180910390fd5b600160008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1691508173ffffffffffffffffffffffffffffffffffffffff1663772b7a73856040518263ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401808260001916600019168152602001915050602060405180830381600087803b1580156119fc57600080fd5b505af1158015611a10573d6000803e3d6000fd5b505050506040513d6020811015611a2657600080fd5b81019080805190602001909291905050509050809250505092915050565b6000806000611a52856122da565b1515611ac6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f437573746f6d6572206973206e6f7420696e207468652072656769737472792e81525060200191505060405180910390fd5b600160008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1691508173ffffffffffffffffffffffffffffffffffffffff1663b167c34e856040518263ffffffff167c010000000000000000000000000000000000000000000000000000000002815260040180828152602001915050602060405180830381600087803b158015611b9757600080fd5b505af1158015611bab573d6000803e3d6000fd5b505050506040513d6020811015611bc157600080fd5b81019080805190602001909291905050509050809250505092915050565b6000806000611bed856122da565b1515611c61576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f437573746f6d6572206973206e6f7420696e207468652072656769737472792e81525060200191505060405180910390fd5b600060010260001916846000191614151515611ce5576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601c8152602001807f506172616d65746572206d757374206265206e6f7420656d7074792e0000000081525060200191505060405180910390fd5b600160008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1691508173ffffffffffffffffffffffffffffffffffffffff1663dd02e30d856040518263ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401808260001916600019168152602001915050602060405180830381600087803b158015611dbe57600080fd5b505af1158015611dd2573d6000803e3d6000fd5b505050506040513d6020811015611de857600080fd5b81019080805190602001909291905050509050809250505092915050565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16141515611e6157600080fd5b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167ff8df31144d9c2f0f6b59d69b8b98abd5459d07f2742c4df920b25aae33c6482060405160405180910390a260008060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550565b6000806000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16141515611f6657600080fd5b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415151561200b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601c8152602001807f506172616d65746572206d757374206265206e6f7420656d7074792e0000000081525060200191505060405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff16600160008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16141515612134576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260248152602001807f437573746f6d657220697320616c726561647920696e2074686520726567697381526020017f7472792e0000000000000000000000000000000000000000000000000000000081525060400191505060405180910390fd5b8261213d61368f565b808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001915050604051809103906000f08015801561218f573d6000803e3d6000fd5b50905080600160008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060028390806001815401808255809150509060018203906000526020600020016000909192909190916101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167fb9a729146003b2590bfdbb9eb4b38762acf6ff00de0202bb350d30a152fcce9860405160405180910390a36001915050919050565b60008060008073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1614151515612383576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601c8152602001807f506172616d65746572206d757374206265206e6f7420656d7074792e0000000081525060200191505060405180910390fd5b60009150600160008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614151561242457600191505b8192505050919050565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600060028281548110151561246457fe5b9060005260206000200160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b6000600160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b600080600061250d856122da565b1515612581576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f437573746f6d6572206973206e6f7420696e207468652072656769737472792e81525060200191505060405180910390fd5b600060010260001916846000191614151515612605576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601c8152602001807f506172616d65746572206d757374206265206e6f7420656d7074792e0000000081525060200191505060405180910390fd5b600160008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1691508173ffffffffffffffffffffffffffffffffffffffff16635af9f68f856040518263ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401808260001916600019168152602001915050602060405180830381600087803b1580156126de57600080fd5b505af11580156126f2573d6000803e3d6000fd5b505050506040513d602081101561270857600080fd5b81019080805190602001909291905050509050809250505092915050565b6000806000612734846122da565b15156127a8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f437573746f6d6572206973206e6f7420696e207468652072656769737472792e81525060200191505060405180910390fd5b600160008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1691508173ffffffffffffffffffffffffffffffffffffffff16631dd46c1e6040518163ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401602060405180830381600087803b15801561286e57600080fd5b505af1158015612882573d6000803e3d6000fd5b505050506040513d602081101561289857600080fd5b810190808051906020019092919050505090508092505050919050565b60008060006128c3856122da565b1515612937576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f437573746f6d6572206973206e6f7420696e207468652072656769737472792e81525060200191505060405180910390fd5b6000600102600019168460001916141515156129bb576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601c8152602001807f506172616d65746572206d757374206265206e6f7420656d7074792e0000000081525060200191505060405180910390fd5b600160008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1691508173ffffffffffffffffffffffffffffffffffffffff1663517e62ab856040518263ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401808260001916600019168152602001915050602060405180830381600087803b158015612a9457600080fd5b505af1158015612aa8573d6000803e3d6000fd5b505050506040513d6020811015612abe57600080fd5b81019080805190602001909291905050509050809250505092915050565b6000806000612aea856122da565b1515612b5e576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f437573746f6d6572206973206e6f7420696e207468652072656769737472792e81525060200191505060405180910390fd5b600060010260001916846000191614151515612be2576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601c8152602001807f506172616d65746572206d757374206265206e6f7420656d7074792e0000000081525060200191505060405180910390fd5b600160008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1691508173ffffffffffffffffffffffffffffffffffffffff1663f22c0f7d856040518263ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401808260001916600019168152602001915050602060405180830381600087803b158015612cbb57600080fd5b505af1158015612ccf573d6000803e3d6000fd5b505050506040513d6020811015612ce557600080fd5b81019080805190602001909291905050509050809250505092915050565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16141515612d5e57600080fd5b612d6781613595565b50565b6000806000806000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16141515612dcb57600080fd5b612dd4886122da565b1515612e48576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f437573746f6d6572206973206e6f7420696e207468652072656769737472792e81525060200191505060405180910390fd5b6000600102876000191614158015612e61575060008614155b8015612e6e575060008514155b1515612f08576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260218152602001807f416c6c20706172616d6574657273206d757374206265206e6f7420656d70747981526020017f2e0000000000000000000000000000000000000000000000000000000000000081525060400191505060405180910390fd5b42925087868685604051602001808573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166c010000000000000000000000000281526014018481526020018381526020018281526020019450505050506040516020818303038152906040526040518082805190602001908083835b602083101515612fb35780518252602082019150602081019050602083039250612f8e565b6001836020036101000a03801982511681845116808217855250505050505090500191505060405180910390209150600160008973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905060008173ffffffffffffffffffffffffffffffffffffffff1663675c3048846040518263ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401808260001916600019168152602001915050602060405180830381600087803b1580156130bd57600080fd5b505af11580156130d1573d6000803e3d6000fd5b505050506040513d60208110156130e757600080fd5b8101908080519060200190929190505050141515613193576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260238152602001807f547820776974682073756368206861736820697320616c72656164792065786981526020017f73742e000000000000000000000000000000000000000000000000000000000081525060400191505060405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16632729f44e83898989886040518663ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401808660001916600019168152602001856000191660001916815260200184815260200183815260200182815260200195505050505050602060405180830381600087803b15801561323257600080fd5b505af1158015613246573d6000803e3d6000fd5b505050506040513d602081101561325c57600080fd5b810190808051906020019092919050505015156132e1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260158152602001807f536f6d657468696e672077656e742077726f6e672e000000000000000000000081525060200191505060405180910390fd5b8773ffffffffffffffffffffffffffffffffffffffff167f8df8d17e46812b16c4b504454beba4429f4c097d49e2a7f34b5b1da2358c7d59838989898860405180866000191660001916815260200185600019166000191681526020018481526020018381526020018281526020019550505050505060405180910390a260019350505050949350505050565b600080600061337c856122da565b15156133f0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f437573746f6d6572206973206e6f7420696e207468652072656769737472792e81525060200191505060405180910390fd5b600060010260001916846000191614151515613474576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601c8152602001807f506172616d65746572206d757374206265206e6f7420656d7074792e0000000081525060200191505060405180910390fd5b600160008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1691508173ffffffffffffffffffffffffffffffffffffffff1663ff56b65a856040518263ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401808260001916600019168152602001915050602060405180830381600087803b15801561354d57600080fd5b505af1158015613561573d6000803e3d6000fd5b505050506040513d602081101561357757600080fd5b81019080805190602001909291905050509050809250505092915050565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16141515156135d157600080fd5b8073ffffffffffffffffffffffffffffffffffffffff166000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a3806000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b6040516111e4806136a0833901905600608060405234801561001057600080fd5b506040516020806111e483398101806040528101908080519060200190929190505050336000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555080600160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050611120806100c46000396000f3006080604052600436106100fc576000357c0100000000000000000000000000000000000000000000000000000000900463ffffffff1680631dd46c1e146101015780632729f44e1461012c5780632804b2c0146101a1578063517e62ab146101f85780635af9f68f1461023d578063675c30481461028a578063715018a6146102cf578063772b7a73146102e65780638da5cb5b146103335780639d11f09f1461038a578063b167c34e146103cf578063da79a9fc14610418578063dc1bba1714610479578063dd02e30d146104be578063f22c0f7d14610507578063f2fde38b14610550578063f79a97fc14610593578063ff56b65a146105dc575b600080fd5b34801561010d57600080fd5b50610116610629565b6040518082815260200191505060405180910390f35b34801561013857600080fd5b5061018760048036038101908080356000191690602001909291908035600019169060200190929190803590602001909291908035906020019092919080359060200190929190505050610636565b604051808215151515815260200191505060405180910390f35b3480156101ad57600080fd5b506101b66108ff565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b34801561020457600080fd5b506102276004803603810190808035600019169060200190929190505050610925565b6040518082815260200191505060405180910390f35b34801561024957600080fd5b5061026c600480360381019080803560001916906020019092919050505061094d565b60405180826000191660001916815260200191505060405180910390f35b34801561029657600080fd5b506102b960048036038101908080356000191690602001909291905050506109c9565b6040518082815260200191505060405180910390f35b3480156102db57600080fd5b506102e46109f1565b005b3480156102f257600080fd5b506103156004803603810190808035600019169060200190929190505050610af3565b60405180826000191660001916815260200191505060405180910390f35b34801561033f57600080fd5b50610348610b1b565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b34801561039657600080fd5b506103b96004803603810190808035600019169060200190929190505050610b40565b6040518082815260200191505060405180910390f35b3480156103db57600080fd5b506103fa60048036038101908080359060200190929190505050610b68565b60405180826000191660001916815260200191505060405180910390f35b34801561042457600080fd5b5061045f6004803603810190808035600019169060200190929190803560001916906020019092919080359060200190929190505050610b8b565b604051808215151515815260200191505060405180910390f35b34801561048557600080fd5b506104a86004803603810190808035600019169060200190929190505050610e57565b6040518082815260200191505060405180910390f35b3480156104ca57600080fd5b506104ed6004803603810190808035600019169060200190929190505050610e7f565b604051808215151515815260200191505060405180910390f35b34801561051357600080fd5b506105366004803603810190808035600019169060200190929190505050610ef1565b604051808215151515815260200191505060405180910390f35b34801561055c57600080fd5b50610591600480360381019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050610f2e565b005b34801561059f57600080fd5b506105c26004803603810190808035600019169060200190929190505050610f95565b604051808215151515815260200191505060405180910390f35b3480156105e857600080fd5b5061060b6004803603810190808035600019169060200190929190505050610fd2565b60405180826000191660001916815260200191505060405180910390f35b6000600380549050905090565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614151561069357600080fd5b60006001028660001916141580156106b357506000600102856000191614155b80156106c0575060008414155b80156106cd575060008314155b80156106da575060008214155b1515610774576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260218152602001807f416c6c20706172616d6574657273206d757374206265206e6f7420656d70747981526020017f2e0000000000000000000000000000000000000000000000000000000000000081525060400191505060405180910390fd5b600060026000886000191660001916815260200190815260200160002060030154141515610830576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260238152602001807f547820776974682073756368206861736820697320616c72656164792065786981526020017f73742e000000000000000000000000000000000000000000000000000000000081525060400191505060405180910390fd5b84600260008860001916600019168152602001908152602001600020600001816000191690555083600260008860001916600019168152602001908152602001600020600101819055508260026000886000191660001916815260200190815260200160002060020181905550816002600088600019166000191681526020019081526020016000206003018190555060038690806001815401808255809150509060018203906000526020600020016000909192909190915090600019169055506001905095945050505050565b600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6000600260008360001916600019168152602001908152602001600020600501549050919050565b6000806000806001029150600090505b610965610629565b8110156109bf5783600019166002600061097e84610b68565b60001916600019168152602001908152602001600020600401546000191614156109b2576109ab81610b68565b91506109bf565b808060010191505061095d565b8192505050919050565b6000600260008360001916600019168152602001908152602001600020600301549050919050565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16141515610a4c57600080fd5b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167ff8df31144d9c2f0f6b59d69b8b98abd5459d07f2742c4df920b25aae33c6482060405160405180910390a260008060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550565b6000600260008360001916600019168152602001908152602001600020600001549050919050565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6000600260008360001916600019168152602001908152602001600020600201549050919050565b6000600382815481101515610b7957fe5b90600052602060002001549050919050565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16141515610be857600080fd5b6000600102846000191614158015610c0857506000600102836000191614155b8015610c15575060008214155b1515610caf576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260218152602001807f416c6c20706172616d6574657273206d757374206265206e6f7420656d70747981526020017f2e0000000000000000000000000000000000000000000000000000000000000081525060400191505060405180910390fd5b60006002600086600019166000191681526020019081526020016000206003015414151515610d46576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f547820776974682073756368206861736820646f65736e27742065786973742e81525060200191505060405180910390fd5b600060026000866000191660001916815260200190815260200160002060050154141515610e02576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260238152602001807f547820776974682073756368206861736820697320616c72656164792073706581526020017f6e742e000000000000000000000000000000000000000000000000000000000081525060400191505060405180910390fd5b8260026000866000191660001916815260200190815260200160002060040181600019169055508160026000866000191660001916815260200190815260200160002060050181905550600190509392505050565b6000600260008360001916600019168152602001908152602001600020600101549050919050565b6000806000809150600090505b610e94610629565b811015610ee757836000191660026000610ead84610b68565b6000191660001916815260200190815260200160002060040154600019161415610eda5760019150610ee7565b8080600101915050610e8c565b8192505050919050565b60008060009050600060026000856000191660001916815260200190815260200160002060030154141515610f2557600190505b80915050919050565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16141515610f8957600080fd5b610f9281610ffa565b50565b60008060009050600060026000856000191660001916815260200190815260200160002060050154141515610fc957600190505b80915050919050565b6000600260008360001916600019168152602001908152602001600020600401549050919050565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415151561103657600080fd5b8073ffffffffffffffffffffffffffffffffffffffff166000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a3806000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550505600a165627a7a72305820cdbe33d24a2932853454ffefe3848b127f45247ec74e03077f16e8845776a5570029a165627a7a723058206da21458082fbe4e2d63f3ae0f67cea3faf3f5f7ae7c0434037c5543c6252ea50029

Swarm Source

bzzr://6da21458082fbe4e2d63f3ae0f67cea3faf3f5f7ae7c0434037c5543c6252ea5

Block Transaction Difficulty Gas Used Reward
View All Blocks Produced

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

Validator Index Block Amount
View All Withdrawals

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

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