hunk.code_window:     progressEvent.percentage = progressEvent.position / sourceMetadata.size * 100
       // NOTE: We need to guard against this becoming Infinity,
       // because that value isn't transmitted properly over IPC and becomes `null`
       progressEvent.eta = progressEvent.speed ? (sourceMetadata.size - progressEvent.position) / progressEvent.speed : 0
       progressEvent.totalSpeed = progressEvent.speed * state.active
       Object.assign(progressEvent, state)
       onProgress(progressEvent)
     }
  
hunk.labels: keep keep keep replace keep keep keep keep
hunk.after_edit:     progressEvent.eta = progressEvent.speed ? (sourceMetadata.size - progressEvent.position) / progressEvent.speed : null
  
hunk.file_path: lib/gui/modules/child-writer.js
hunk.type: replace
file: /*
   * Copyright 2016 resin.io
   *
   * Licensed under the Apache License, Version 2.0 (the "License");
   * you may not use this file except in compliance with the License.
   * You may obtain a copy of the License at
   *
   *    http://www.apache.org/licenses/LICENSE-2.0
   *
   * Unless required by applicable law or agreed to in writing, software
   * distributed under the License is distributed on an "AS IS" BASIS,
   * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
   * See the License for the specific language governing permissions and
   * limitations under the License.
   */
  
  'use strict'
  
  /**
   * @summary The byte length of ISIZE
   * @type {Number}
   * @constant
   * @description
   * See https://tools.ietf.org/html/rfc1952
   */
  const ISIZE_LENGTH = 4
  
  /**
   * @summary Get the estimated uncompressed size of a gzip file
   * @function
   * @public
   *
   * @description
   * This function determines the uncompressed size of the gzip file
   * by reading its `ISIZE` field at the end of the file. The specification
   * clarifies that this value is just an estimation.
   *
   * @param {Object} options - options
   * @param {Number} options.size - file size
   * @param {Function} options.read - read function (position, count)
   * @fulfil {Number} - uncompressed size
   * @returns {Promise}
   *
   * @example
   * const fd = fs.openSync('path/to/image', 'r');
   *
   * gzip.getUncompressedSize({
   *   size: fs.statSync('path/to/image.gz').size,
   *   read: (position, count) => {
   *     const buffer = Buffer.alloc(count);
   *     return new Promise((resolve, reject) => {
   *       fs.read(fd, buffer, 0, count, position, (error) => {
   *         if (error) {
   *           return reject(error);
   *         }
   *
   *         resolve(buffer);
   *       });
   *     });
   *   }
   * }).then((uncompressedSize) => {
   *   console.log(`The uncompressed size is: ${uncompressedSize}`);
   *   fs.closeSync(fd);
   * });
   */
  exports.getUncompressedSize = (options) => {
    const ISIZE_BUFFER_START = 0
    const ISIZE_POSITION = options.size - ISIZE_LENGTH
    return options.read(ISIZE_POSITION, ISIZE_LENGTH).then((buffer) => {
      return buffer.readUInt32LE(ISIZE_BUFFER_START)
    })
  }
  