don't rely on external d3.js