Code coverage report for imgly-sdk-html5/src/js/lib/image-exporter.js

Statements: 82.67% (62 / 75)      Branches: 73.33% (44 / 60)      Functions: 81.82% (9 / 11)      Lines: 77.59% (45 / 58)      Ignored: 4 statements, 1 function, 7 branches     

All files » imgly-sdk-html5/src/js/lib/ » image-exporter.js
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153                        1         2       3       1   1   1   1   1   1   1   1               1 1       1     48           48 1 47 41       47 1 46 45       46       46                               46   46 46 46 46   46             46                 46 4     4   4 4   1     4 4 42 42                           1     1 1  
/* global Image */
/*
 * Photo Editor SDK - photoeditorsdk.com
 * Copyright (c) 2013-2015 9elements GmbH
 *
 * Released under Attribution-NonCommercial 3.0 Unported
 * http://creativecommons.org/licenses/by-nc/3.0/
 *
 * For commercial use, please contact us at contact@9elements.com
 */
'use strict';
 
Object.defineProperty(exports, '__esModule', {
  value: true
});
// istanbul ignore next
 
var _createClass = (function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; Eif ('value' in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { Iif (protoProps) defineProperties(Constructor.prototype, protoProps); Eif (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; })();
 
// istanbul ignore next
 
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { 'default': obj }; }
 
// istanbul ignore next
 
function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError('Cannot call a class as a function'); } }
 
var _constants = require('../constants');
 
var _utils = require('./utils');
 
var _utils2 = _interopRequireDefault(_utils);
 
var _vendorPromise = require('../vendor/promise');
 
var _vendorPromise2 = _interopRequireDefault(_vendorPromise);
 
var _exif = require('./exif');
 
var _exif2 = _interopRequireDefault(_exif);
 
/**
 * @class
 * @alias ImglyKit.ImageExporter
 * @private
 */
 
var ImageExporter = (function () {
  function ImageExporter() {
    _classCallCheck(this, ImageExporter);
  }
 
  _createClass(ImageExporter, null, [{
    key: 'validateSettings',
    value: function validateSettings(renderType, imageFormat) {
      var settings = {
        renderType: renderType,
        imageFormat: imageFormat
      };
 
      // Validate RenderType
      if (typeof settings.renderType !== 'undefined' && settings.renderType !== null && _utils2['default'].values(_constants.RenderType).indexOf(settings.renderType) === -1) {
        throw new Error('Invalid render type: ' + settings.renderType);
      } else if (typeof renderType === 'undefined') {
        settings.renderType = _constants.RenderType.DATAURL;
      }
 
      // Validate ImageFormat
      if (typeof settings.imageFormat !== 'undefined' && settings.imageFormat !== null && _utils2['default'].values(_constants.ImageFormat).indexOf(settings.imageFormat) === -1) {
        throw new Error('Invalid image format: ' + settings.imageFormat);
      } else if (typeof imageFormat === 'undefined') {
        settings.imageFormat = _constants.ImageFormat.PNG;
      }
 
      // Render type 'buffer' only available in node
      Iif (settings.renderType === _constants.RenderType.BUFFER && typeof process === 'undefined') {
        throw new Error('Render type \'buffer\' is only available when using node.js');
      }
 
      return settings;
    }
 
    /**
     * Exports the image from the given canvas with the given options
     * @param  {ImglyKit} kit
     * @param  {Image} image
     * @param  {Canvas} canvas
     * @param  {ImglyKit.RenderType} renderType
     * @param  {ImglyKit.ImageFormat} imageFormat
     * @param  {Number} quality = 0.8
     * @return {Promise}
     */
  }, {
    key: 'export',
    value: function _export(kit, image, canvas, renderType, imageFormat) {
      var quality = arguments.length <= 5 || arguments[5] === undefined ? 0.8 : arguments[5];
 
      return new _vendorPromise2['default'](function (resolve, reject) {
        var result = undefined;
        Eif (renderType === _constants.RenderType.IMAGE || renderType === _constants.RenderType.DATAURL) {
          Eif (typeof window === 'undefined') {
            // Quality not supported in node environment / node-canvas
            result = canvas.toDataURL(imageFormat);
          } else {
            result = canvas.toDataURL(imageFormat, quality);
          }
 
          // When image's `src` attribute is a jpeg data url, we can restore
          // the exif information
          Iif (_exif2['default'].isJPEG(image.src) && _exif2['default'].isJPEG(result)) {
            var exif = kit.exif;
 
            if (exif) {
              result = exif.restoreExifTags(result);
            }
          }
        }
 
        if (renderType === _constants.RenderType.IMAGE) {
          var outputImage = undefined;
 
          /* istanbul ignore else  */
          Eif (typeof window === 'undefined') {
            // Not a browser environment
            var CanvasImage = require('canvas').Image;
            outputImage = new CanvasImage();
          } else {
            outputImage = new Image();
          }
 
          outputImage.src = result;
          resolve(outputImage);
        } else Eif (renderType === _constants.RenderType.DATAURL) {
          resolve(result);
        } else if (renderType === _constants.RenderType.BUFFER) {
          resolve(canvas.toBuffer());
        } else if (renderType === _constants.RenderType.MSBLOB) {
          resolve(canvas.msToBlob());
        } else if (renderType === _constants.RenderType.BLOB) {
          canvas.toBlob(function (blob) {
            resolve(blob);
          }, imageFormat, quality);
        }
      });
    }
  }]);
 
  return ImageExporter;
})();
 
exports['default'] = ImageExporter;
module.exports = exports['default'];
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi9yb290L1NFUlZFUi9pbWdseS1zZGstaHRtbDUvc3JjL2pzL2xpYi9pbWFnZS1leHBvcnRlci5qcyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7eUJBVXdDLGNBQWM7O3FCQUNwQyxTQUFTOzs7OzZCQUNQLG1CQUFtQjs7OztvQkFDdEIsUUFBUTs7Ozs7Ozs7OztJQU9uQixhQUFhO1dBQWIsYUFBYTswQkFBYixhQUFhOzs7ZUFBYixhQUFhOztXQUVPLDBCQUFDLFVBQVUsRUFBRSxXQUFXLEVBQUU7QUFDaEQsVUFBSSxRQUFRLEdBQUc7QUFDYixrQkFBVSxFQUFFLFVBQVU7QUFDdEIsbUJBQVcsRUFBRSxXQUFXO09BQ3pCLENBQUE7OztBQUdELFVBQUksQUFBQyxPQUFPLFFBQVEsQ0FBQyxVQUFVLEtBQUssV0FBVyxJQUFJLFFBQVEsQ0FBQyxVQUFVLEtBQUssSUFBSSxJQUMzRSxtQkFBTSxNQUFNLHVCQUFZLENBQUMsT0FBTyxDQUFDLFFBQVEsQ0FBQyxVQUFVLENBQUMsS0FBSyxDQUFDLENBQUMsRUFBRTtBQUNoRSxjQUFNLElBQUksS0FBSyxDQUFDLHVCQUF1QixHQUFHLFFBQVEsQ0FBQyxVQUFVLENBQUMsQ0FBQTtPQUMvRCxNQUFNLElBQUksT0FBTyxVQUFVLEtBQUssV0FBVyxFQUFFO0FBQzVDLGdCQUFRLENBQUMsVUFBVSxHQUFHLHNCQUFXLE9BQU8sQ0FBQTtPQUN6Qzs7O0FBR0QsVUFBSSxBQUFDLE9BQU8sUUFBUSxDQUFDLFdBQVcsS0FBSyxXQUFXLElBQUksUUFBUSxDQUFDLFdBQVcsS0FBSyxJQUFJLElBQzdFLG1CQUFNLE1BQU0sd0JBQWEsQ0FBQyxPQUFPLENBQUMsUUFBUSxDQUFDLFdBQVcsQ0FBQyxLQUFLLENBQUMsQ0FBQyxFQUFFO0FBQ2xFLGNBQU0sSUFBSSxLQUFLLENBQUMsd0JBQXdCLEdBQUcsUUFBUSxDQUFDLFdBQVcsQ0FBQyxDQUFBO09BQ2pFLE1BQU0sSUFBSSxPQUFPLFdBQVcsS0FBSyxXQUFXLEVBQUU7QUFDN0MsZ0JBQVEsQ0FBQyxXQUFXLEdBQUcsdUJBQVksR0FBRyxDQUFBO09BQ3ZDOzs7QUFHRCxVQUFJLFFBQVEsQ0FBQyxVQUFVLEtBQUssc0JBQVcsTUFBTSxJQUN6QyxPQUFPLE9BQU8sS0FBSyxXQUFXLEVBQUU7QUFDbEMsY0FBTSxJQUFJLEtBQUssQ0FBQyw2REFBNkQsQ0FBQyxDQUFBO09BQy9FOztBQUVELGFBQU8sUUFBUSxDQUFBO0tBQ2hCOzs7Ozs7Ozs7Ozs7OztXQVlhLGlCQUFDLEdBQUcsRUFBRSxLQUFLLEVBQUUsTUFBTSxFQUFFLFVBQVUsRUFBRSxXQUFXLEVBQWU7VUFBYixPQUFPLHlEQUFDLEdBQUc7O0FBQ3JFLGFBQU8sK0JBQVksVUFBQyxPQUFPLEVBQUUsTUFBTSxFQUFLO0FBQ3RDLFlBQUksTUFBTSxZQUFBLENBQUE7QUFDVixZQUFJLFVBQVUsS0FBSyxzQkFBVyxLQUFLLElBQy9CLFVBQVUsS0FBSyxzQkFBVyxPQUFPLEVBQUU7QUFDckMsY0FBSSxPQUFPLE1BQU0sS0FBSyxXQUFXLEVBQUU7O0FBRWpDLGtCQUFNLEdBQUcsTUFBTSxDQUFDLFNBQVMsQ0FBQyxXQUFXLENBQUMsQ0FBQTtXQUN2QyxNQUFNO0FBQ0wsa0JBQU0sR0FBRyxNQUFNLENBQUMsU0FBUyxDQUFDLFdBQVcsRUFBRSxPQUFPLENBQUMsQ0FBQTtXQUNoRDs7OztBQUlELGNBQUksa0JBQUssTUFBTSxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsSUFBSSxrQkFBSyxNQUFNLENBQUMsTUFBTSxDQUFDLEVBQUU7Z0JBQ3pDLElBQUksR0FBSyxHQUFHLENBQVosSUFBSTs7QUFDWixnQkFBSSxJQUFJLEVBQUU7QUFDUixvQkFBTSxHQUFHLElBQUksQ0FBQyxlQUFlLENBQUMsTUFBTSxDQUFDLENBQUE7YUFDdEM7V0FDRjtTQUNGOztBQUVELFlBQUksVUFBVSxLQUFLLHNCQUFXLEtBQUssRUFBRTtBQUNuQyxjQUFJLFdBQVcsWUFBQSxDQUFBOzs7QUFHZixjQUFJLE9BQU8sTUFBTSxLQUFLLFdBQVcsRUFBRTs7QUFFakMsZ0JBQUksV0FBVyxHQUFHLE9BQU8sQ0FBQyxRQUFRLENBQUMsQ0FBQyxLQUFLLENBQUE7QUFDekMsdUJBQVcsR0FBRyxJQUFJLFdBQVcsRUFBRSxDQUFBO1dBQ2hDLE1BQU07QUFDTCx1QkFBVyxHQUFHLElBQUksS0FBSyxFQUFFLENBQUE7V0FDMUI7O0FBRUQscUJBQVcsQ0FBQyxHQUFHLEdBQUcsTUFBTSxDQUFBO0FBQ3hCLGlCQUFPLENBQUMsV0FBVyxDQUFDLENBQUE7U0FDckIsTUFBTSxJQUFJLFVBQVUsS0FBSyxzQkFBVyxPQUFPLEVBQUU7QUFDNUMsaUJBQU8sQ0FBQyxNQUFNLENBQUMsQ0FBQTtTQUNoQixNQUFNLElBQUksVUFBVSxLQUFLLHNCQUFXLE1BQU0sRUFBRTtBQUMzQyxpQkFBTyxDQUFDLE1BQU0sQ0FBQyxRQUFRLEVBQUUsQ0FBQyxDQUFBO1NBQzNCLE1BQU0sSUFBSSxVQUFVLEtBQUssc0JBQVcsTUFBTSxFQUFFO0FBQzNDLGlCQUFPLENBQUMsTUFBTSxDQUFDLFFBQVEsRUFBRSxDQUFDLENBQUE7U0FDM0IsTUFBTSxJQUFJLFVBQVUsS0FBSyxzQkFBVyxJQUFJLEVBQUU7QUFDekMsZ0JBQU0sQ0FBQyxNQUFNLENBQUMsVUFBQyxJQUFJLEVBQUs7QUFDdEIsbUJBQU8sQ0FBQyxJQUFJLENBQUMsQ0FBQTtXQUNkLEVBQUUsV0FBVyxFQUFFLE9BQU8sQ0FBQyxDQUFBO1NBQ3pCO09BQ0YsQ0FBQyxDQUFBO0tBQ0g7OztTQTNGRyxhQUFhOzs7cUJBOEZKLGFBQWEiLCJmaWxlIjoiL3Jvb3QvU0VSVkVSL2ltZ2x5LXNkay1odG1sNS9zcmMvanMvbGliL2ltYWdlLWV4cG9ydGVyLmpzIiwic291cmNlc0NvbnRlbnQiOlsiLyogZ2xvYmFsIEltYWdlICovXG4vKlxuICogUGhvdG8gRWRpdG9yIFNESyAtIHBob3RvZWRpdG9yc2RrLmNvbVxuICogQ29weXJpZ2h0IChjKSAyMDEzLTIwMTUgOWVsZW1lbnRzIEdtYkhcbiAqXG4gKiBSZWxlYXNlZCB1bmRlciBBdHRyaWJ1dGlvbi1Ob25Db21tZXJjaWFsIDMuMCBVbnBvcnRlZFxuICogaHR0cDovL2NyZWF0aXZlY29tbW9ucy5vcmcvbGljZW5zZXMvYnktbmMvMy4wL1xuICpcbiAqIEZvciBjb21tZXJjaWFsIHVzZSwgcGxlYXNlIGNvbnRhY3QgdXMgYXQgY29udGFjdEA5ZWxlbWVudHMuY29tXG4gKi9cbmltcG9ydCB7IFJlbmRlclR5cGUsIEltYWdlRm9ybWF0IH0gZnJvbSAnLi4vY29uc3RhbnRzJ1xuaW1wb3J0IFV0aWxzIGZyb20gJy4vdXRpbHMnXG5pbXBvcnQgUHJvbWlzZSBmcm9tICcuLi92ZW5kb3IvcHJvbWlzZSdcbmltcG9ydCBFeGlmIGZyb20gJy4vZXhpZidcblxuLyoqXG4gKiBAY2xhc3NcbiAqIEBhbGlhcyBJbWdseUtpdC5JbWFnZUV4cG9ydGVyXG4gKiBAcHJpdmF0ZVxuICovXG5jbGFzcyBJbWFnZUV4cG9ydGVyIHtcblxuICBzdGF0aWMgdmFsaWRhdGVTZXR0aW5ncyAocmVuZGVyVHlwZSwgaW1hZ2VGb3JtYXQpIHtcbiAgICB2YXIgc2V0dGluZ3MgPSB7XG4gICAgICByZW5kZXJUeXBlOiByZW5kZXJUeXBlLFxuICAgICAgaW1hZ2VGb3JtYXQ6IGltYWdlRm9ybWF0XG4gICAgfVxuXG4gICAgLy8gVmFsaWRhdGUgUmVuZGVyVHlwZVxuICAgIGlmICgodHlwZW9mIHNldHRpbmdzLnJlbmRlclR5cGUgIT09ICd1bmRlZmluZWQnICYmIHNldHRpbmdzLnJlbmRlclR5cGUgIT09IG51bGwpICYmXG4gICAgICAgIFV0aWxzLnZhbHVlcyhSZW5kZXJUeXBlKS5pbmRleE9mKHNldHRpbmdzLnJlbmRlclR5cGUpID09PSAtMSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdJbnZhbGlkIHJlbmRlciB0eXBlOiAnICsgc2V0dGluZ3MucmVuZGVyVHlwZSlcbiAgICB9IGVsc2UgaWYgKHR5cGVvZiByZW5kZXJUeXBlID09PSAndW5kZWZpbmVkJykge1xuICAgICAgc2V0dGluZ3MucmVuZGVyVHlwZSA9IFJlbmRlclR5cGUuREFUQVVSTFxuICAgIH1cblxuICAgIC8vIFZhbGlkYXRlIEltYWdlRm9ybWF0XG4gICAgaWYgKCh0eXBlb2Ygc2V0dGluZ3MuaW1hZ2VGb3JtYXQgIT09ICd1bmRlZmluZWQnICYmIHNldHRpbmdzLmltYWdlRm9ybWF0ICE9PSBudWxsKSAmJlxuICAgICAgICBVdGlscy52YWx1ZXMoSW1hZ2VGb3JtYXQpLmluZGV4T2Yoc2V0dGluZ3MuaW1hZ2VGb3JtYXQpID09PSAtMSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdJbnZhbGlkIGltYWdlIGZvcm1hdDogJyArIHNldHRpbmdzLmltYWdlRm9ybWF0KVxuICAgIH0gZWxzZSBpZiAodHlwZW9mIGltYWdlRm9ybWF0ID09PSAndW5kZWZpbmVkJykge1xuICAgICAgc2V0dGluZ3MuaW1hZ2VGb3JtYXQgPSBJbWFnZUZvcm1hdC5QTkdcbiAgICB9XG5cbiAgICAvLyBSZW5kZXIgdHlwZSAnYnVmZmVyJyBvbmx5IGF2YWlsYWJsZSBpbiBub2RlXG4gICAgaWYgKHNldHRpbmdzLnJlbmRlclR5cGUgPT09IFJlbmRlclR5cGUuQlVGRkVSICYmXG4gICAgICAgIHR5cGVvZiBwcm9jZXNzID09PSAndW5kZWZpbmVkJykge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdSZW5kZXIgdHlwZSBcXCdidWZmZXJcXCcgaXMgb25seSBhdmFpbGFibGUgd2hlbiB1c2luZyBub2RlLmpzJylcbiAgICB9XG5cbiAgICByZXR1cm4gc2V0dGluZ3NcbiAgfVxuXG4gIC8qKlxuICAgKiBFeHBvcnRzIHRoZSBpbWFnZSBmcm9tIHRoZSBnaXZlbiBjYW52YXMgd2l0aCB0aGUgZ2l2ZW4gb3B0aW9uc1xuICAgKiBAcGFyYW0gIHtJbWdseUtpdH0ga2l0XG4gICAqIEBwYXJhbSAge0ltYWdlfSBpbWFnZVxuICAgKiBAcGFyYW0gIHtDYW52YXN9IGNhbnZhc1xuICAgKiBAcGFyYW0gIHtJbWdseUtpdC5SZW5kZXJUeXBlfSByZW5kZXJUeXBlXG4gICAqIEBwYXJhbSAge0ltZ2x5S2l0LkltYWdlRm9ybWF0fSBpbWFnZUZvcm1hdFxuICAgKiBAcGFyYW0gIHtOdW1iZXJ9IHF1YWxpdHkgPSAwLjhcbiAgICogQHJldHVybiB7UHJvbWlzZX1cbiAgICovXG4gIHN0YXRpYyBleHBvcnQgKGtpdCwgaW1hZ2UsIGNhbnZhcywgcmVuZGVyVHlwZSwgaW1hZ2VGb3JtYXQsIHF1YWxpdHk9MC44KSB7XG4gICAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAgIGxldCByZXN1bHRcbiAgICAgIGlmIChyZW5kZXJUeXBlID09PSBSZW5kZXJUeXBlLklNQUdFIHx8XG4gICAgICAgICAgcmVuZGVyVHlwZSA9PT0gUmVuZGVyVHlwZS5EQVRBVVJMKSB7XG4gICAgICAgIGlmICh0eXBlb2Ygd2luZG93ID09PSAndW5kZWZpbmVkJykge1xuICAgICAgICAgIC8vIFF1YWxpdHkgbm90IHN1cHBvcnRlZCBpbiBub2RlIGVudmlyb25tZW50IC8gbm9kZS1jYW52YXNcbiAgICAgICAgICByZXN1bHQgPSBjYW52YXMudG9EYXRhVVJMKGltYWdlRm9ybWF0KVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHJlc3VsdCA9IGNhbnZhcy50b0RhdGFVUkwoaW1hZ2VGb3JtYXQsIHF1YWxpdHkpXG4gICAgICAgIH1cblxuICAgICAgICAvLyBXaGVuIGltYWdlJ3MgYHNyY2AgYXR0cmlidXRlIGlzIGEganBlZyBkYXRhIHVybCwgd2UgY2FuIHJlc3RvcmVcbiAgICAgICAgLy8gdGhlIGV4aWYgaW5mb3JtYXRpb25cbiAgICAgICAgaWYgKEV4aWYuaXNKUEVHKGltYWdlLnNyYykgJiYgRXhpZi5pc0pQRUcocmVzdWx0KSkge1xuICAgICAgICAgIGNvbnN0IHsgZXhpZiB9ID0ga2l0XG4gICAgICAgICAgaWYgKGV4aWYpIHtcbiAgICAgICAgICAgIHJlc3VsdCA9IGV4aWYucmVzdG9yZUV4aWZUYWdzKHJlc3VsdClcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgaWYgKHJlbmRlclR5cGUgPT09IFJlbmRlclR5cGUuSU1BR0UpIHtcbiAgICAgICAgbGV0IG91dHB1dEltYWdlXG5cbiAgICAgICAgLyogaXN0YW5idWwgaWdub3JlIGVsc2UgICovXG4gICAgICAgIGlmICh0eXBlb2Ygd2luZG93ID09PSAndW5kZWZpbmVkJykge1xuICAgICAgICAgIC8vIE5vdCBhIGJyb3dzZXIgZW52aXJvbm1lbnRcbiAgICAgICAgICB2YXIgQ2FudmFzSW1hZ2UgPSByZXF1aXJlKCdjYW52YXMnKS5JbWFnZVxuICAgICAgICAgIG91dHB1dEltYWdlID0gbmV3IENhbnZhc0ltYWdlKClcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBvdXRwdXRJbWFnZSA9IG5ldyBJbWFnZSgpXG4gICAgICAgIH1cblxuICAgICAgICBvdXRwdXRJbWFnZS5zcmMgPSByZXN1bHRcbiAgICAgICAgcmVzb2x2ZShvdXRwdXRJbWFnZSlcbiAgICAgIH0gZWxzZSBpZiAocmVuZGVyVHlwZSA9PT0gUmVuZGVyVHlwZS5EQVRBVVJMKSB7XG4gICAgICAgIHJlc29sdmUocmVzdWx0KVxuICAgICAgfSBlbHNlIGlmIChyZW5kZXJUeXBlID09PSBSZW5kZXJUeXBlLkJVRkZFUikge1xuICAgICAgICByZXNvbHZlKGNhbnZhcy50b0J1ZmZlcigpKVxuICAgICAgfSBlbHNlIGlmIChyZW5kZXJUeXBlID09PSBSZW5kZXJUeXBlLk1TQkxPQikge1xuICAgICAgICByZXNvbHZlKGNhbnZhcy5tc1RvQmxvYigpKVxuICAgICAgfSBlbHNlIGlmIChyZW5kZXJUeXBlID09PSBSZW5kZXJUeXBlLkJMT0IpIHtcbiAgICAgICAgY2FudmFzLnRvQmxvYigoYmxvYikgPT4ge1xuICAgICAgICAgIHJlc29sdmUoYmxvYilcbiAgICAgICAgfSwgaW1hZ2VGb3JtYXQsIHF1YWxpdHkpXG4gICAgICB9XG4gICAgfSlcbiAgfVxufVxuXG5leHBvcnQgZGVmYXVsdCBJbWFnZUV4cG9ydGVyXG4iXX0=