lphaTarget(0)
    event.subject.fx = null
    event.subject.fy = null
    chronologyConstraint(event.subject)
  }

  return d3.drag()
    .on('start', dragstarted)
    .on('drag', dragged)
    .on('end', dragended)
}

function zoomSetup (svg) {
  svg.call(zoom = d3.zoom()
    .scaleExtent([1 / 8, 8])
    .on('start', event => {
      if (event.sourceEvent !== null) {
        zoomID = null // programmatic zoom cancelled by user initiated zoom
      }
    })
    .on('zoom', event => {
      g.attr('transform'