Improve progress reporting in various areas
diff --git a/index.js b/index.js
index 830f75c..c9e13dd 100644
--- a/index.js
+++ b/index.js
@@ -357,7 +357,7 @@
 )
 
 var makeTimezoneBoundary = function (tzid, callback) {
-  buildingProgress.beginTask('makeTimezoneBoundary for', tzid)
+  buildingProgress.beginTask(`makeTimezoneBoundary for ${tzid}`, true)
 
   var ops = zoneCfg[tzid]
   var geom
@@ -431,6 +431,7 @@
   console.log('do validation... this may take a few minutes')
   var allZonesOk = true
   var zones = Object.keys(zoneCfg)
+  var lastPct = 0
   var compareTzid, tzid, zoneGeom
 
   for (var i = 0; i < zones.length; i++) {
@@ -438,8 +439,10 @@
     zoneGeom = getDistZoneGeom(tzid)
 
     for (var j = i + 1; j < zones.length; j++) {
-      if (Math.round(validationProgress.getPercentage()) % 10 === 0) {
+      const curPct = Math.floor(validationProgress.getPercentage())
+      if (curPct % 10 === 0 && curPct !== lastPct) {
         validationProgress.printStats('Validating zones', true)
+        lastPct = curPct
       }
       compareTzid = zones[j]
 
@@ -574,8 +577,13 @@
 
   const zones = Object.keys(zoneCfg)
 
+  const oceanProgress = new ProgressStats(
+    'Oceans',
+    oceanZones.length
+  )
+
   oceanZoneBoundaries = oceanZones.map(zone => {
-    console.log(zone.tzid)
+    oceanProgress.beginTask(zone.tzid, true)
     const geoJson = polygon([[
       [zone.left, 90],
       [zone.left, -90],
diff --git a/progressStats.js b/progressStats.js
index a55853f..f125abf 100644
--- a/progressStats.js
+++ b/progressStats.js
@@ -4,16 +4,13 @@
         this.trackerName = trackerName
         this.totalTasks = totalTasks
         this.taskCounter = 0
-        this.referenceLength = 5
-        this.timestamps = []
     }
 
     logNext() {
         this.taskCounter++
-        this.timestamps.push({
-            "index": this.taskCounter,
-            "timestamp": Date.now()
-        })
+        if (!this.beginTime) {
+          this.beginTime = new Date()
+        }
     }
 
     /**
@@ -50,28 +47,15 @@
 
     /**
      * calculates the time left and outputs it in human readable format
-     * calculation is based on a reference length, that can be defined.
+     * calculation is based on the average time per task so far
      *
      * @returns {string}
      */
     getTimeLeft () {
-        if(this.taskCounter <= this.referenceLength) {
-            //number of reference downloads must exist before left time can be predicted
-            return "? minutes"
-        }
-        var processDurationInSeconds = (Date.now() - this.timestamps[0].timestamp) / 1000
-        if(processDurationInSeconds < 60){
-            //process must run longer than 60seconds before left time can be predicted
-            return "? minutes"
-        }
-
-        var indexOfStepsBefore = this.timestamps.findIndex((t) => {
-            return t.index === (this.taskCounter - this.referenceLength)
-        })
-        var lastSteps = this.timestamps[indexOfStepsBefore];
-        var millisOflastSteps = Date.now() - lastSteps.timestamp
-        var downloadsLeft = this.totalTasks - this.taskCounter
-        var millisecondsLeft = (millisOflastSteps / this.referenceLength) * downloadsLeft
+        if (this.taskCounter === 0) return '?'
+        const averageTimePerTask = (Date.now() - this.beginTime.getTime()) / this.taskCounter
+        var tasksLeft = this.totalTasks - this.taskCounter
+        var millisecondsLeft = averageTimePerTask * tasksLeft
         return this.formatMilliseconds(millisecondsLeft)
     }