text: 'use strict';
  
  var Message = require('../message');
  var inherits = require('util').inherits;
  var multicore = require('multicore-lib');
  var utils = require('../utils');
  var $ = multicore.util.preconditions;
  var _ = multicore.deps._;
  var BufferReader = multicore.encoding.BufferReader;
  var BufferWriter = multicore.encoding.BufferWriter;
  
  /**
   * @param {Array=} arg - An array of addrs
   * @param {Object=} options
   * @extends Message
   * @constructor
   */
  function AddrMessage(arg, options) {
    Message.call(this, options);
    this.command = 'addr';
    $.checkArgument(
      _.isUndefined(arg) ||
        (Array.isArray(arg) &&
         !_.isUndefined(arg[0].services) &&
         !_.isUndefined(arg[0].ip) &&
         !_.isUndefined(arg[0].port)),
      'First argument is expected to be an array of addrs'
    );
    this.addresses = arg;
  }
  inherits(AddrMessage, Message);
  
  AddrMessage.prototype.setPayload = function(payload) {
    var parser = new BufferReader(payload);
  
    var addrCount = parser.readVarintNum();
  
    this.addresses = [];
    for (var i = 0; i < addrCount; i++) {
      // todo: time only available on versions >=31402
      var time = new Date(parser.readUInt32LE() * 1000);
  
      var addr = utils.parseAddr(parser);
      addr.time = time;
      this.addresses.push(addr);
    }
  
    utils.checkFinished(parser);
  };
  
  AddrMessage.prototype.getPayload = function() {
    var bw = new BufferWriter();
    bw.writeVarintNum(this.addresses.length);
  
    for (var i = 0; i < this.addresses.length; i++) {
      var addr = this.addresses[i];
      bw.writeUInt32LE(addr.time.getTime() / 1000);
      utils.writeAddr(addr, bw);
    }
  
    return bw.concat();
  };
  
  module.exports = AddrMessage;
  