UNPKG

kepler.gl.geoiq

Version:

kepler.gl is a webgl based application to visualize large scale location data in the browser

423 lines (339 loc) 41.8 kB
"use strict"; var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault"); Object.defineProperty(exports, "__esModule", { value: true }); exports.asArray = asArray; exports.canvasToBlob = canvasToBlob; exports.dataAsUrl = dataAsUrl; exports.delay = delay; exports.escape = escape; exports.escapeXhtml = escapeXhtml; exports.fourRandomChars = fourRandomChars; exports.getAndEncode = getAndEncode; exports.getHeight = getHeight; exports.getWidth = getWidth; exports.isDataUrl = isDataUrl; exports.isSrcAsDataUrl = isSrcAsDataUrl; exports.makeImage = makeImage; exports.mimeType = mimeType; exports.processClone = processClone; exports.resolveUrl = resolveUrl; exports.uid = uid; var _slicedToArray2 = _interopRequireDefault(require("@babel/runtime/helpers/slicedToArray")); var _console = _interopRequireDefault(require("global/console")); var _window = _interopRequireDefault(require("global/window")); var _document = _interopRequireDefault(require("global/document")); var _userFeedbacks = require("../constants/user-feedbacks"); // Copyright (c) 2023 Uber Technologies, Inc. // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal // in the Software without restriction, including without limitation the rights // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell // copies of the Software, and to permit persons to whom the Software is // furnished to do so, subject to the following conditions: // // The above copyright notice and this permission notice shall be included in // all copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN // THE SOFTWARE. function processClone(original, clone) { if (!(clone instanceof _window["default"].Element)) { return clone; } ; function copyProperties(sourceStyle, targetStyle) { var propertyKeys = asArray(sourceStyle); propertyKeys.forEach(function (name) { targetStyle.setProperty(name, sourceStyle.getPropertyValue(name), sourceStyle.getPropertyPriority(name)); }); } function copyStyle(source, target) { if (source.cssText) { target.cssText = source.cssText; // add additional copy of composite styles if (source.font) { target.font = source.font; } } else { copyProperties(source, target); } } function cloneStyle(og, cln) { var originalStyle = _window["default"].getComputedStyle(og); copyStyle(originalStyle, cln.style); } function formatPseudoElementStyle(cln, elm, stl) { var formatCssText = function formatCssText(stl1) { var cnt = stl1.getPropertyValue('content'); return "".concat(stl.cssText, " content: ").concat(cnt, ";"); }; var formatProperty = function formatProperty(name) { return "".concat(name, ":").concat(stl.getPropertyValue(name)).concat(stl.getPropertyPriority(name) ? ' !important' : ''); }; var formatCssProperties = function formatCssProperties(stl2) { return "".concat(asArray(stl2).map(formatProperty).join('; '), ";"); }; var selector = ".".concat(cln, ":").concat(elm); var cssText = stl.cssText ? formatCssText(stl) : formatCssProperties(stl); return _document["default"].createTextNode("".concat(selector, "{").concat(cssText, "}")); } function clonePseudoElement(org, cln, element) { var style = _window["default"].getComputedStyle(org, element); var content = style.getPropertyValue('content'); if (content === '' || content === 'none') { return; } var className = uid(); cln.className = "".concat(cln.className, " ").concat(className); var styleElement = _document["default"].createElement('style'); styleElement.appendChild(formatPseudoElementStyle(className, element, style)); cln.appendChild(styleElement); } function clonePseudoElements(_ref) { var _ref2 = (0, _slicedToArray2["default"])(_ref, 2), og = _ref2[0], cln = _ref2[1]; [':before', ':after'].forEach(function (element) { return clonePseudoElement(og, cln, element); }); } function copyUserInput(_ref3) { var _ref4 = (0, _slicedToArray2["default"])(_ref3, 2), og = _ref4[0], cln = _ref4[1]; if (og instanceof _window["default"].HTMLTextAreaElement) cln.innerHTML = og.value; if (og instanceof _window["default"].HTMLInputElement) cln.setAttribute('value', og.value); } function fixSvg(cln) { if (!(cln instanceof _window["default"].SVGElement)) return; cln.setAttribute('xmlns', 'http://www.w3.org/2000/svg'); if (!(cln instanceof _window["default"].SVGRectElement)) return; ['width', 'height'].forEach(function (attribute) { var value = cln.getAttribute(attribute); if (!value) return; cln.style.setProperty(attribute, value); }); } return Promise.resolve([original, clone]).then(function (_ref5) { var _ref6 = (0, _slicedToArray2["default"])(_ref5, 2), og = _ref6[0], cln = _ref6[1]; cloneStyle(og, cln); return [og, cln]; }).then(function (_ref7) { var _ref8 = (0, _slicedToArray2["default"])(_ref7, 2), og = _ref8[0], cln = _ref8[1]; clonePseudoElements([og, cln]); return [og, cln]; }).then(function (_ref9) { var _ref10 = (0, _slicedToArray2["default"])(_ref9, 2), og = _ref10[0], cln = _ref10[1]; copyUserInput([og, cln]); return [og, cln]; }).then(function (_ref11) { var _ref12 = (0, _slicedToArray2["default"])(_ref11, 2), og = _ref12[0], cln = _ref12[1]; fixSvg(cln); return [og, cln]; }).then(function (_ref13) { var _ref14 = (0, _slicedToArray2["default"])(_ref13, 2), og = _ref14[0], cln = _ref14[1]; return cln; }); } /**** * UTILS ****/ function asArray(arrayLike) { var array = []; var length = arrayLike.length; for (var i = 0; i < length; i++) array.push(arrayLike[i]); return array; } function fourRandomChars() { /* see http://stackoverflow.com/a/6248722/2519373 */ return "0000".concat((Math.random() * Math.pow(36, 4) << 0).toString(36)).slice(-4); } function uid() { var index = 0; return "u".concat(fourRandomChars()).concat(index++); } function makeImage(uri) { return new Promise(function (resolve, reject) { var image = new _window["default"].Image(); image.onload = function () { resolve(image); }; image.onerror = function (err) { var message = _userFeedbacks.IMAGE_EXPORT_ERRORS.dataUri; _console["default"].log(uri); // error is an Event Object // https://www.w3schools.com/jsref/obj_event.asp reject({ event: err, message: message }); }; image.src = uri; }); } function isDataUrl(url) { return url.search(/^(data:)/) !== -1; } function parseExtension(url) { var match = /\.([^\.\/]*?)$/g.exec(url); if (match) { return match[1]; } return ''; } function mimes() { /* * Only WOFF and EOT mime types for fonts are 'real' * see http://www.iana.org/assignments/media-types/media-types.xhtml */ var WOFF = 'application/font-woff'; var JPEG = 'image/jpeg'; return { woff: WOFF, woff2: WOFF, ttf: 'application/font-truetype', eot: 'application/vnd.ms-fontobject', png: 'image/png', jpg: JPEG, jpeg: JPEG, gif: 'image/gif', tiff: 'image/tiff', svg: 'image/svg+xml' }; } function mimeType(url) { var extension = parseExtension(url).toLowerCase(); return mimes()[extension] || ''; } function dataAsUrl(content, type) { return "data:".concat(type, ";base64,").concat(content); } function escape(string) { return string.replace(/([.*+?^${}()|\[\]\/\\])/g, '\\$1'); } function delay(ms) { return function (arg) { return new Promise(function (resolve) { _window["default"].setTimeout(function () { resolve(arg); }, ms); }); }; } function isSrcAsDataUrl(text) { var DATA_URL_REGEX = /url\(['"]?(data:)([^'"]+?)['"]?\)/; return text.search(DATA_URL_REGEX) !== -1; } function cvToBlob(canvas) { return new Promise(function (resolve) { var binaryString = _window["default"].atob(canvas.toDataURL().split(',')[1]); var length = binaryString.length; var binaryArray = new Uint8Array(length); for (var i = 0; i < length; i++) binaryArray[i] = binaryString.charCodeAt(i); resolve(new _window["default"].Blob([binaryArray], { type: 'image/png' })); }); } function canvasToBlob(canvas) { if (canvas.toBlob) return new Promise(function (resolve) { canvas.toBlob(resolve); }); return cvToBlob(canvas); } function escapeXhtml(string) { return string.replace(/#/g, '%23').replace(/\n/g, '%0A'); } function getWidth(node) { var leftBorder = px(node, 'border-left-width'); var rightBorder = px(node, 'border-right-width'); return node.scrollWidth + leftBorder + rightBorder; } function getHeight(node) { var topBorder = px(node, 'border-top-width'); var bottomBorder = px(node, 'border-bottom-width'); return node.scrollHeight + topBorder + bottomBorder; } function px(node, styleProperty) { var value = _window["default"].getComputedStyle(node).getPropertyValue(styleProperty); return parseFloat(value.replace('px', '')); } function resolveUrl(url, baseUrl) { var doc = _document["default"].implementation.createHTMLDocument(); var base = doc.createElement('base'); doc.head.appendChild(base); var a = doc.createElement('a'); doc.body.appendChild(a); base.href = baseUrl; a.href = url; return a.href; } function getAndEncode(url, options) { var TIMEOUT = 30000; if (options.cacheBust) { // Cache bypass so we dont have CORS issues with cached images // Source: https://developer.mozilla.org/en/docs/Web/API/XMLHttpRequest/Using_XMLHttpRequest#Bypassing_the_cache url += (/\?/.test(url) ? '&' : '?') + new Date().getTime(); } return new Promise(function (resolve) { var request = new _window["default"].XMLHttpRequest(); request.onreadystatechange = done; request.ontimeout = timeout; request.responseType = 'blob'; request.timeout = TIMEOUT; request.open('GET', url, true); request.send(); var placeholder; if (options.imagePlaceholder) { var split = options.imagePlaceholder.split(/,/); if (split && split[1]) { placeholder = split[1]; } } function done() { if (request.readyState !== 4) return; if (request.status !== 200) { if (placeholder) { resolve(placeholder); } else { fail("cannot fetch resource: ".concat(url, ", status: ").concat(request.status)); } return; } var encoder = new _window["default"].FileReader(); encoder.onloadend = function () { var content = encoder.result.split(/,/)[1]; resolve(content); }; encoder.readAsDataURL(request.response); } function timeout() { if (placeholder) { resolve(placeholder); } else { fail("timeout of ".concat(TIMEOUT, "ms occurred while fetching resource: ").concat(url)); } } function fail(message) { _console["default"].error(message); resolve(''); } }); } //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy91dGlscy9kb20tdXRpbHMuanMiXSwibmFtZXMiOlsicHJvY2Vzc0Nsb25lIiwib3JpZ2luYWwiLCJjbG9uZSIsIndpbmRvdyIsIkVsZW1lbnQiLCJjb3B5UHJvcGVydGllcyIsInNvdXJjZVN0eWxlIiwidGFyZ2V0U3R5bGUiLCJwcm9wZXJ0eUtleXMiLCJhc0FycmF5IiwiZm9yRWFjaCIsIm5hbWUiLCJzZXRQcm9wZXJ0eSIsImdldFByb3BlcnR5VmFsdWUiLCJnZXRQcm9wZXJ0eVByaW9yaXR5IiwiY29weVN0eWxlIiwic291cmNlIiwidGFyZ2V0IiwiY3NzVGV4dCIsImZvbnQiLCJjbG9uZVN0eWxlIiwib2ciLCJjbG4iLCJvcmlnaW5hbFN0eWxlIiwiZ2V0Q29tcHV0ZWRTdHlsZSIsInN0eWxlIiwiZm9ybWF0UHNldWRvRWxlbWVudFN0eWxlIiwiZWxtIiwic3RsIiwiZm9ybWF0Q3NzVGV4dCIsInN0bDEiLCJjbnQiLCJmb3JtYXRQcm9wZXJ0eSIsImZvcm1hdENzc1Byb3BlcnRpZXMiLCJzdGwyIiwibWFwIiwiam9pbiIsInNlbGVjdG9yIiwiZG9jdW1lbnQiLCJjcmVhdGVUZXh0Tm9kZSIsImNsb25lUHNldWRvRWxlbWVudCIsIm9yZyIsImVsZW1lbnQiLCJjb250ZW50IiwiY2xhc3NOYW1lIiwidWlkIiwic3R5bGVFbGVtZW50IiwiY3JlYXRlRWxlbWVudCIsImFwcGVuZENoaWxkIiwiY2xvbmVQc2V1ZG9FbGVtZW50cyIsImNvcHlVc2VySW5wdXQiLCJIVE1MVGV4dEFyZWFFbGVtZW50IiwiaW5uZXJIVE1MIiwidmFsdWUiLCJIVE1MSW5wdXRFbGVtZW50Iiwic2V0QXR0cmlidXRlIiwiZml4U3ZnIiwiU1ZHRWxlbWVudCIsIlNWR1JlY3RFbGVtZW50IiwiYXR0cmlidXRlIiwiZ2V0QXR0cmlidXRlIiwiUHJvbWlzZSIsInJlc29sdmUiLCJ0aGVuIiwiYXJyYXlMaWtlIiwiYXJyYXkiLCJsZW5ndGgiLCJpIiwicHVzaCIsImZvdXJSYW5kb21DaGFycyIsIk1hdGgiLCJyYW5kb20iLCJwb3ciLCJ0b1N0cmluZyIsInNsaWNlIiwiaW5kZXgiLCJtYWtlSW1hZ2UiLCJ1cmkiLCJyZWplY3QiLCJpbWFnZSIsIkltYWdlIiwib25sb2FkIiwib25lcnJvciIsImVyciIsIm1lc3NhZ2UiLCJJTUFHRV9FWFBPUlRfRVJST1JTIiwiZGF0YVVyaSIsImNvbnNvbGUiLCJsb2ciLCJldmVudCIsInNyYyIsImlzRGF0YVVybCIsInVybCIsInNlYXJjaCIsInBhcnNlRXh0ZW5zaW9uIiwibWF0Y2giLCJleGVjIiwibWltZXMiLCJXT0ZGIiwiSlBFRyIsIndvZmYiLCJ3b2ZmMiIsInR0ZiIsImVvdCIsInBuZyIsImpwZyIsImpwZWciLCJnaWYiLCJ0aWZmIiwic3ZnIiwibWltZVR5cGUiLCJleHRlbnNpb24iLCJ0b0xvd2VyQ2FzZSIsImRhdGFBc1VybCIsInR5cGUiLCJlc2NhcGUiLCJzdHJpbmciLCJyZXBsYWNlIiwiZGVsYXkiLCJtcyIsImFyZyIsInNldFRpbWVvdXQiLCJpc1NyY0FzRGF0YVVybCIsInRleHQiLCJEQVRBX1VSTF9SRUdFWCIsImN2VG9CbG9iIiwiY2FudmFzIiwiYmluYXJ5U3RyaW5nIiwiYXRvYiIsInRvRGF0YVVSTCIsInNwbGl0IiwiYmluYXJ5QXJyYXkiLCJVaW50OEFycmF5IiwiY2hhckNvZGVBdCIsIkJsb2IiLCJjYW52YXNUb0Jsb2IiLCJ0b0Jsb2IiLCJlc2NhcGVYaHRtbCIsImdldFdpZHRoIiwibm9kZSIsImxlZnRCb3JkZXIiLCJweCIsInJpZ2h0Qm9yZGVyIiwic2Nyb2xsV2lkdGgiLCJnZXRIZWlnaHQiLCJ0b3BCb3JkZXIiLCJib3R0b21Cb3JkZXIiLCJzY3JvbGxIZWlnaHQiLCJzdHlsZVByb3BlcnR5IiwicGFyc2VGbG9hdCIsInJlc29sdmVVcmwiLCJiYXNlVXJsIiwiZG9jIiwiaW1wbGVtZW50YXRpb24iLCJjcmVhdGVIVE1MRG9jdW1lbnQiLCJiYXNlIiwiaGVhZCIsImEiLCJib2R5IiwiaHJlZiIsImdldEFuZEVuY29kZSIsIm9wdGlvbnMiLCJUSU1FT1VUIiwiY2FjaGVCdXN0IiwidGVzdCIsIkRhdGUiLCJnZXRUaW1lIiwicmVxdWVzdCIsIlhNTEh0dHBSZXF1ZXN0Iiwib25yZWFkeXN0YXRlY2hhbmdlIiwiZG9uZSIsIm9udGltZW91dCIsInRpbWVvdXQiLCJyZXNwb25zZVR5cGUiLCJvcGVuIiwic2VuZCIsInBsYWNlaG9sZGVyIiwiaW1hZ2VQbGFjZWhvbGRlciIsInJlYWR5U3RhdGUiLCJzdGF0dXMiLCJmYWlsIiwiZW5jb2RlciIsIkZpbGVSZWFkZXIiLCJvbmxvYWRlbmQiLCJyZXN1bHQiLCJyZWFkQXNEYXRhVVJMIiwicmVzcG9uc2UiLCJlcnJvciJdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBb0JBOztBQUNBOztBQUNBOztBQUNBOztBQXZCQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQU9PLFNBQVNBLFlBQVQsQ0FBc0JDLFFBQXRCLEVBQWdDQyxLQUFoQyxFQUF1QztBQUU1QyxNQUFJLEVBQUVBLEtBQUssWUFBWUMsbUJBQU9DLE9BQTFCLENBQUosRUFBd0M7QUFDdEMsV0FBT0YsS0FBUDtBQUNEOztBQUFBOztBQUVELFdBQVNHLGNBQVQsQ0FBd0JDLFdBQXhCLEVBQXFDQyxXQUFyQyxFQUFrRDtBQUNoRCxRQUFNQyxZQUFZLEdBQUdDLE9BQU8sQ0FBQ0gsV0FBRCxDQUE1QjtBQUNBRSxJQUFBQSxZQUFZLENBQUNFLE9BQWIsQ0FBcUIsVUFBQUMsSUFBSSxFQUFJO0FBQzNCSixNQUFBQSxXQUFXLENBQUNLLFdBQVosQ0FDRUQsSUFERixFQUVFTCxXQUFXLENBQUNPLGdCQUFaLENBQTZCRixJQUE3QixDQUZGLEVBR0VMLFdBQVcsQ0FBQ1EsbUJBQVosQ0FBZ0NILElBQWhDLENBSEY7QUFLRCxLQU5EO0FBT0Q7O0FBRUQsV0FBU0ks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LEdBQW9CLFlBQU07QUFDeEIsWUFBTTVJLE9BQU8sR0FBRzBJLE9BQU8sQ0FBQ0csTUFBUixDQUFldEQsS0FBZixDQUFxQixHQUFyQixFQUEwQixDQUExQixDQUFoQjtBQUNBcEUsUUFBQUEsT0FBTyxDQUFDbkIsT0FBRCxDQUFQO0FBQ0QsT0FIRDs7QUFJQTBJLE1BQUFBLE9BQU8sQ0FBQ0ksYUFBUixDQUFzQmxCLE9BQU8sQ0FBQ21CLFFBQTlCO0FBQ0Q7O0FBRUQsYUFBU2QsT0FBVCxHQUFtQjtBQUNqQixVQUFJSSxXQUFKLEVBQWlCO0FBQ2ZsSCxRQUFBQSxPQUFPLENBQUNrSCxXQUFELENBQVA7QUFDRCxPQUZELE1BRU87QUFDTEksUUFBQUEsSUFBSSxzQkFDWWxCLE9BRFosa0RBQzJEdEUsR0FEM0QsRUFBSjtBQUdEO0FBQ0Y7O0FBRUQsYUFBU3dGLElBQVQsQ0FBY2hHLE9BQWQsRUFBdUI7QUFDckJHLDBCQUFRb0csS0FBUixDQUFjdkcsT0FBZDs7QUFDQXRCLE1BQUFBLE9BQU8sQ0FBQyxFQUFELENBQVA7QUFDRDtBQUNGLEdBckRNLENBQVA7QUFzREQiLCJzb3VyY2VzQ29udGVudCI6WyIvLyBDb3B5cmlnaHQgKGMpIDIwMjMgVWJlciBUZWNobm9sb2dpZXMsIEluYy5cbi8vXG4vLyBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcgYSBjb3B5XG4vLyBvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZSBcIlNvZnR3YXJlXCIpLCB0byBkZWFsXG4vLyBpbiB0aGUgU29mdHdhcmUgd2l0aG91dCByZXN0cmljdGlvbiwgaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvbiB0aGUgcmlnaHRzXG4vLyB0byB1c2UsIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsIGRpc3RyaWJ1dGUsIHN1YmxpY2Vuc2UsIGFuZC9vciBzZWxsXG4vLyBjb3BpZXMgb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8gcGVybWl0IHBlcnNvbnMgdG8gd2hvbSB0aGUgU29mdHdhcmUgaXNcbi8vIGZ1cm5pc2hlZCB0byBkbyBzbywgc3ViamVjdCB0byB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6XG4vL1xuLy8gVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2Ugc2hhbGwgYmUgaW5jbHVkZWQgaW5cbi8vIGFsbCBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlIFNvZnR3YXJlLlxuLy9cbi8vIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCBcIkFTIElTXCIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEVYUFJFU1MgT1Jcbi8vIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZLFxuLy8gRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTklORlJJTkdFTUVOVC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFXG4vLyBBVVRIT1JTIE9SIENPUFlSSUdIVCBIT0xERVJTIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLCBEQU1BR0VTIE9SIE9USEVSXG4vLyBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SIE9USEVSV0lTRSwgQVJJU0lORyBGUk9NLFxuLy8gT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFIFVTRSBPUiBPVEhFUiBERUFMSU5HUyBJTlxuLy8gVEhFIFNPRlRXQVJFLlxuXG5pbXBvcnQgY29uc29sZSBmcm9tICdnbG9iYWwvY29uc29sZSc7XG5pbXBvcnQgd2luZG93IGZyb20gJ2dsb2JhbC93aW5kb3cnO1xuaW1wb3J0IGRvY3VtZW50IGZyb20gJ2dsb2JhbC9kb2N1bWVudCc7XG5pbXBvcnQge0lNQUdFX0VYUE9SVF9FUlJPUlN9IGZyb20gJ2NvbnN0YW50cy91c2VyLWZlZWRiYWNrcyc7XG5cbmV4cG9ydCBmdW5jdGlvbiBwcm9jZXNzQ2xvbmUob3JpZ2luYWwsIGNsb25lKSB7XG5cbiAgaWYgKCEoY2xvbmUgaW5zdGFuY2VvZiB3aW5kb3cuRWxlbWVudCkpIHtcbiAgICByZXR1cm4gY2xvbmVcbiAgfTtcblxuICBmdW5jdGlvbiBjb3B5UHJvcGVydGllcyhzb3VyY2VTdHlsZSwgdGFyZ2V0U3R5bGUpIHtcbiAgICBjb25zdCBwcm9wZXJ0eUtleXMgPSBhc0FycmF5KHNvdXJjZVN0eWxlKTtcbiAgICBwcm9wZXJ0eUtleXMuZm9yRWFjaChuYW1lID0+IHtcbiAgICAgIHRhcmdldFN0eWxlLnNldFByb3BlcnR5KFxuICAgICAgICBuYW1lLFxuICAgICAgICBzb3VyY2VTdHlsZS5nZXRQcm9wZXJ0eVZhbHVlKG5hbWUpLFxuICAgICAgICBzb3VyY2VTdHlsZS5nZXRQcm9wZXJ0eVByaW9yaXR5KG5hbWUpXG4gICAgICApO1xuICAgIH0pO1xuICB9XG5cbiAgZnVuY3Rpb24gY29weVN0eWxlKHNvdXJjZSwgdGFyZ2V0KSB7XG4gICAgaWYgKHNvdXJjZS5jc3NUZXh0KSB7XG4gICAgICB0YXJnZXQuY3NzVGV4dCA9IHNvdXJjZS5jc3NUZXh0O1xuICAgICAgLy8gYWRkIGFkZGl0aW9uYWwgY29weSBvZiBjb21wb3NpdGUgc3R5bGVzXG4gICAgICBpZiAoc291cmNlLmZvbnQpIHtcbiAgICAgICAgdGFyZ2V0LmZvbnQgPSBzb3VyY2UuZm9udDtcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgY29weVByb3BlcnRpZXMoc291cmNlLCB0YXJnZXQpO1xuICAgIH1cbiAgfVxuXG4gIGZ1bmN0aW9uIGNsb25lU3R5bGUob2csIGNsbikge1xuICAgIGNvbnN0IG9yaWdpbmFsU3R5bGUgPSB3aW5kb3cuZ2V0Q29tcHV0ZWRTdHlsZShvZyk7XG4gICAgY29weVN0eWxlKG9yaWdpbmFsU3R5bGUsIGNsbi5zdHlsZSk7XG4gIH1cblxuICBmdW5jdGlvbiBmb3JtYXRQc2V1ZG9FbGVtZW50U3R5bGUoY2xuLCBlbG0sIHN0bCkge1xuICAgIGNvbnN0IGZvcm1hdENzc1RleHQgPSAoc3RsMSkgPT4ge1xuICAgICAgY29uc3QgY250ID0gc3RsMS5nZXRQcm9wZXJ0eVZhbHVlKCdjb250ZW50Jyk7XG4gICAgICByZXR1cm4gYCR7c3RsLmNzc1RleHR9IGNvbnRlbnQ6ICR7Y250fTtgO1xuICAgIH1cblxuICAgIGNvbnN0IGZvcm1hdFByb3BlcnR5ID0gKG5hbWUpID0+IHtcbiAgICAgIHJldHVybiAoXG4gICAgICAgIGAke25hbWV9OiR7c3RsLmdldFByb3BlcnR5VmFsdWUobmFtZSl9JHtzdGwuZ2V0UHJvcGVydHlQcmlvcml0eShuYW1lKSA/ICcgIWltcG9ydGFudCcgOiAnJ31gXG4gICAgICApO1xuICAgIH1cblxuICAgIGNvbnN0IGZvcm1hdENzc1Byb3BlcnRpZXMgPSAoc3RsMikgPT4ge1xuICAgICAgcmV0dXJuIGAke2FzQXJyYXkoc3RsMikubWFwKGZvcm1hdFByb3BlcnR5KS5qb2luKCc7ICcpfTtgO1xuICAgIH1cblxuICAgIGNvbnN0IHNlbGVjdG9yID0gYC4ke2Nsbn06JHtlbG19YDtcbiAgICBjb25zdCBjc3NUZXh0ID0gc3RsLmNzc1RleHRcbiAgICAgID8gZm9ybWF0Q3NzVGV4dChzdGwpXG4gICAgICA6IGZvcm1hdENzc1Byb3BlcnRpZXMoc3RsKTtcblxuICAgIHJldHVybiBkb2N1bWVudC5jcmVhdGVUZXh0Tm9kZShgJHtzZWxlY3Rvcn17JHtjc3NUZXh0fX1gKTtcbiAgfVxuXG4gIGZ1bmN0aW9uIGNsb25lUHNldWRvRWxlbWVudChvcmcsIGNsbiwgZWxlbWVudCkge1xuICAgIGNvbnN0IHN0eWxlID0gd2luZG93LmdldENvbXB1dGVkU3R5bGUob3JnLCBlbGVtZW50KTtcbiAgICBjb25zdCBjb250ZW50ID0gc3R5bGUuZ2V0UHJvcGVydHlWYWx1ZSgnY29udGVudCcpO1xuXG4gICAgaWYgKGNvbnRlbnQgPT09ICcnIHx8IGNvbnRlbnQgPT09ICdub25lJykge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGNvbnN0IGNsYXNzTmFtZSA9IHVpZCgpO1xuICAgIGNsbi5jbGFzc05hbWUgPSBgJHtjbG4uY2xhc3NOYW1lfSAke2NsYXNzTmFtZX1gO1xuICAgIGNvbnN0IHN0eWxlRWxlbWVudCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ3N0eWxlJyk7XG4gICAgc3R5bGVFbGVtZW50LmFwcGVuZENoaWxkKFxuICAgICAgZm9ybWF0UHNldWRvRWxlbWVudFN0eWxlKGNsYXNzTmFtZSwgZWxlbWVudCwgc3R5bGUpXG4gICAgKTtcbiAgICBjbG4uYXBwZW5kQ2hpbGQoc3R5bGVFbGVtZW50KTtcbiAgfVxuXG4gIGZ1bmN0aW9uIGNsb25lUHNldWRvRWxlbWVudHMoW29nLCBjbG5dKSB7XG4gICAgWyc6YmVmb3JlJywgJzphZnRlciddLmZvckVhY2goZWxlbWVudCA9PiBjbG9uZVBzZXVkb0VsZW1lbnQob2csIGNsbiwgZWxlbWVudCkpO1xuICB9XG5cbiAgZnVuY3Rpb24gY29weVVzZXJJbnB1dChbb2csIGNsbl0pIHtcbiAgICBpZiAob2cgaW5zdGFuY2VvZiB3aW5kb3cuSFRNTFRleHRBcmVhRWxlbWVudClcbiAgICAgIGNsbi5pbm5lckhUTUwgPSBvZy52YWx1ZTtcbiAgICBpZiAob2cgaW5zdGFuY2VvZiB3aW5kb3cuSFRNTElucHV0RWxlbWVudClcbiAgICAgIGNsbi5zZXRBdHRyaWJ1dGUoJ3ZhbHVlJywgb2cudmFsdWUpO1xuICB9XG5cbiAgZnVuY3Rpb24gZml4U3ZnKGNsbikge1xuICAgIGlmICghKGNsbiBpbnN0YW5jZW9mIHdpbmRvdy5TVkdFbGVtZW50KSkgcmV0dXJuO1xuICAgIGNsbi5zZXRBdHRyaWJ1dGUoJ3htbG5zJywgJ2h0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnJyk7XG5cbiAgICBpZiAoIShjbG4gaW5zdGFuY2VvZiB3aW5kb3cuU1ZHUmVjdEVsZW1lbnQpKSByZXR1cm47XG4gICAgWyd3aWR0aCcsICdoZWlnaHQnXS5mb3JFYWNoKGF0dHJpYnV0ZSA9PiB7XG4gICAgICBjb25zdCB2YWx1ZSA9IGNsbi5nZXRBdHRyaWJ1dGUoYXR0cmlidXRlKTtcbiAgICAgIGlmICghdmFsdWUpIHJldHVybjtcblxuICAgICAgY2xuLnN0eWxlLnNldFByb3BlcnR5KGF0dHJpYnV0ZSwgdmFsdWUpO1xuICAgIH0pO1xuICB9XG5cbiAgcmV0dXJuIFByb21pc2UucmVzb2x2ZShbb3JpZ2luYWwsIGNsb25lXSlcbiAgICAudGhlbigoW29nLCBjbG5dKSA9PiB7XG4gICAgICBjbG9uZVN0eWxlKG9nLCBjbG4pXG4gICAgICByZXR1cm4gW29nLCBjbG5dO1xuICAgIH0pXG4gICAgLnRoZW4oKFtvZywgY2xuXSkgPT4ge1xuICAgICAgY2xvbmVQc2V1ZG9FbGVtZW50cyhbb2csIGNsbl0pXG4gICAgICByZXR1cm4gW29nLCBjbG5dO1xuICAgIH0pXG4gICAgLnRoZW4oKFtvZywgY2xuXSkgPT4ge1xuICAgICAgY29weVVzZXJJbnB1dChbb2csIGNsbl0pXG4gICAgICByZXR1cm4gW29nLCBjbG5dO1xuICAgIH0pXG4gICAgLnRoZW4oKFtvZywgY2xuXSkgPT4ge1xuICAgICAgZml4U3ZnKGNsbik7XG4gICAgICByZXR1cm4gW29nLCBjbG5dO1xuICAgIH0pXG4gICAgLnRoZW4oKFtvZywgY2xuXSkgPT4gY2xuKTtcbn1cblxuLyoqKipcbiAqIFVUSUxTXG4gKioqKi9cbmV4cG9ydCBmdW5jdGlvbiBhc0FycmF5KGFycmF5TGlrZSkge1xuICBjb25zdCBhcnJheSA9IFtdO1xuICBjb25zdCBsZW5ndGggPSBhcnJheUxpa2UubGVuZ3RoO1xuICBmb3IgKGxldCBpID0gMDsgaSA8IGxlbmd0aDsgaSsrKSBhcnJheS5wdXNoKGFycmF5TGlrZVtpXSk7XG4gIHJldHVybiBhcnJheTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGZvdXJSYW5kb21DaGFycygpIHtcbiAgLyogc2VlIGh0dHA6Ly9zdGFja292ZXJmbG93LmNvbS9hLzYyNDg3MjIvMjUxOTM3MyAqL1xuICByZXR1cm4gYDAwMDAkeygoTWF0aC5yYW5kb20oKSAqIE1hdGgucG93KDM2LCA0KSkgPDwgMCkudG9TdHJpbmcoMzYpfWAuc2xpY2UoLTQpO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gdWlkKCkge1xuICBsZXQgaW5kZXggPSAwO1xuXG4gIHJldHVybiBgdSR7Zm91clJhbmRvbUNoYXJzKCl9JHtpbmRleCsrfWA7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBtYWtlSW1hZ2UodXJpKSB7XG4gIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgY29uc3QgaW1hZ2UgPSBuZXcgd2luZG93LkltYWdlKCk7XG4gICAgaW1hZ2Uub25sb2FkID0gKCkgPT4ge1xuICAgICAgcmVzb2x2ZShpbWFnZSk7XG4gICAgfTtcbiAgICBpbWFnZS5vbmVycm9yID0gKGVycikgPT4ge1xuICAgICAgY29uc3QgbWVzc2FnZSA9IElNQUdFX0VYUE9SVF9FUlJPUlMuZGF0YVVyaTtcbiAgICAgIGNvbnNvbGUubG9nKHVyaSk7XG4gICAgICAvLyBlcnJvciBpcyBhbiBFdmVudCBPYmplY3RcbiAgICAgIC8vIGh0dHBzOi8vd3d3Lnczc2Nob29scy5jb20vanNyZWYvb2JqX2V2ZW50LmFzcFxuICAgICAgcmVqZWN0KHtldmVudDogZXJyLCBtZXNzYWdlfSk7XG4gICAgfTtcbiAgICBpbWFnZS5zcmMgPSB1cmk7XG4gIH0pO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gaXNEYXRhVXJsKHVybCkge1xuICByZXR1cm4gdXJsLnNlYXJjaCgvXihkYXRhOikvKSAhPT0gLTE7XG59XG5cbmZ1bmN0aW9uIHBhcnNlRXh0ZW5zaW9uKHVybCkge1xuICBjb25zdCBtYXRjaCA9IC9cXC4oW15cXC5cXC9dKj8pJC9nLmV4ZWModXJsKTtcbiAgaWYgKG1hdGNoKSB7XG4gICAgcmV0dXJuIG1hdGNoWzFdO1xuICB9XG4gIHJldHVybiAnJztcbn1cblxuZnVuY3Rpb24gbWltZXMoKSB7XG4gIC8qXG4gICogT25seSBXT0ZGIGFuZCBFT1QgbWltZSB0eXBlcyBmb3IgZm9udHMgYXJlICdyZWFsJ1xuICAqIHNlZSBodHRwOi8vd3d3LmlhbmEub3JnL2Fzc2lnbm1lbnRzL21lZGlhLXR5cGVzL21lZGlhLXR5cGVzLnhodG1sXG4gICovXG4gIGNvbnN0IFdPRkYgPSAnYXBwbGljYXRpb24vZm9udC13b2ZmJztcbiAgY29uc3QgSlBFRyA9ICdpbWFnZS9qcGVnJztcblxuICByZXR1cm4ge1xuICAgIHdvZmY6IFdPRkYsXG4gICAgd29mZjI6IFdPRkYsXG4gICAgdHRmOiAnYXBwbGljYXRpb24vZm9udC10cnVldHlwZScsXG4gICAgZW90OiAnYXBwbGljYXRpb24vdm5kLm1zLWZvbnRvYmplY3QnLFxuICAgIHBuZzogJ2ltYWdlL3BuZycsXG4gICAganBnOiBKUEVHLFxuICAgIGpwZWc6IEpQRUcsXG4gICAgZ2lmOiAnaW1hZ2UvZ2lmJyxcbiAgICB0aWZmOiAnaW1hZ2UvdGlmZicsXG4gICAgc3ZnOiAnaW1hZ2Uvc3ZnK3htbCdcbiAgfTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIG1pbWVUeXBlKHVybCkge1xuICBjb25zdCBleHRlbnNpb24gPSBwYXJzZUV4dGVuc2lvbih1cmwpLnRvTG93ZXJDYXNlKCk7XG4gIHJldHVybiBtaW1lcygpW2V4dGVuc2lvbl0gfHwgJyc7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBkYXRhQXNVcmwoY29udGVudCwgdHlwZSkge1xuICByZXR1cm4gYGRhdGE6JHt0eXBlfTtiYXNlNjQsJHtjb250ZW50fWA7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBlc2NhcGUoc3RyaW5nKSB7XG4gIHJldHVybiBzdHJpbmcucmVwbGFjZSgvKFsuKis/XiR7fSgpfFxcW1xcXVxcL1xcXFxdKS9nLCAnXFxcXCQxJyk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBkZWxheShtcykge1xuICByZXR1cm4gYXJnID0+IHtcbiAgICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUpID0+IHtcbiAgICAgIHdpbmRvdy5zZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgcmVzb2x2ZShhcmcpO1xuICAgICAgfSwgbXMpO1xuICAgIH0pO1xuICB9O1xufVxuXG5leHBvcnQgZnVuY3Rpb24gaXNTcmNBc0RhdGFVcmwodGV4dCkge1xuICBjb25zdCBEQVRBX1VSTF9SRUdFWCA9IC91cmxcXChbJ1wiXT8oZGF0YTopKFteJ1wiXSs/KVsnXCJdP1xcKS87XG5cbiAgcmV0dXJuIHRleHQuc2VhcmNoKERBVEFfVVJMX1JFR0VYKSAhPT0gLTE7XG59XG5cbmZ1bmN0aW9uIGN2VG9CbG9iKGNhbnZhcykge1xuICByZXR1cm4gbmV3IFByb21pc2UocmVzb2x2ZSA9PiB7XG4gICAgY29uc3QgYmluYXJ5U3RyaW5nID0gd2luZG93LmF0b2IoY2FudmFzLnRvRGF0YVVSTCgpLnNwbGl0KCcsJylbMV0pO1xuICAgIGNvbnN0IGxlbmd0aCA9IGJpbmFyeVN0cmluZy5sZW5ndGg7XG4gICAgY29uc3QgYmluYXJ5QXJyYXkgPSBuZXcgVWludDhBcnJheShsZW5ndGgpO1xuXG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBsZW5ndGg7IGkrKylcbiAgICAgIGJpbmFyeUFycmF5W2ldID0gYmluYXJ5U3RyaW5nLmNoYXJDb2RlQXQoaSk7XG5cbiAgICByZXNvbHZlKFxuICAgICAgbmV3IHdpbmRvdy5CbG9iKFtiaW5hcnlBcnJheV0sIHt0eXBlOiAnaW1hZ2UvcG5nJ30pXG4gICAgKTtcbiAgfSk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBjYW52YXNUb0Jsb2IoY2FudmFzKSB7XG4gIGlmIChjYW52YXMudG9CbG9iKVxuICAgIHJldHVybiBuZXcgUHJvbWlzZShyZXNvbHZlID0+IHtcbiAgICAgIGNhbnZhcy50b0Jsb2IocmVzb2x2ZSk7XG4gICAgfSk7XG5cbiAgcmV0dXJuIGN2VG9CbG9iKGNhbnZhcyk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBlc2NhcGVYaHRtbChzdHJpbmcpIHtcbiAgcmV0dXJuIHN0cmluZy5yZXBsYWNlKC8jL2csICclMjMnKS5yZXBsYWNlKC9cXG4vZywgJyUwQScpO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gZ2V0V2lkdGgobm9kZSkge1xuICBjb25zdCBsZWZ0Qm9yZGVyID0gcHgobm9kZSwgJ2JvcmRlci1sZWZ0LXdpZHRoJyk7XG4gIGNvbnN0IHJpZ2h0Qm9yZGVyID0gcHgobm9kZSwgJ2JvcmRlci1yaWdodC13aWR0aCcpO1xuICByZXR1cm4gbm9kZS5zY3JvbGxXaWR0aCArIGxlZnRCb3JkZXIgKyByaWdodEJvcmRlcjtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGdldEhlaWdodChub2RlKSB7XG4gIGNvbnN0IHRvcEJvcmRlciA9IHB4KG5vZGUsICdib3JkZXItdG9wLXdpZHRoJyk7XG4gIGNvbnN0IGJvdHRvbUJvcmRlciA9IHB4KG5vZGUsICdib3JkZXItYm90dG9tLXdpZHRoJyk7XG4gIHJldHVybiBub2RlLnNjcm9sbEhlaWdodCArIHRvcEJvcmRlciArIGJvdHRvbUJvcmRlcjtcbn1cblxuZnVuY3Rpb24gcHgobm9kZSwgc3R5bGVQcm9wZXJ0eSkge1xuICBjb25zdCB2YWx1ZSA9IHdpbmRvdy5nZXRDb21wdXRlZFN0eWxlKG5vZGUpLmdldFByb3BlcnR5VmFsdWUoc3R5bGVQcm9wZXJ0eSk7XG4gIHJldHVybiBwYXJzZUZsb2F0KHZhbHVlLnJlcGxhY2UoJ3B4JywgJycpKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHJlc29sdmVVcmwodXJsLCBiYXNlVXJsKSB7XG4gIGNvbnN0IGRvYyA9IGRvY3VtZW50LmltcGxlbWVudGF0aW9uLmNyZWF0ZUhUTUxEb2N1bWVudCgpO1xuICBjb25zdCBiYXNlID0gZG9jLmNyZWF0ZUVsZW1lbnQoJ2Jhc2UnKTtcbiAgZG9jLmhlYWQuYXBwZW5kQ2hpbGQoYmFzZSk7XG4gIGNvbnN0IGEgPSBkb2MuY3JlYXRlRWxlbWVudCgnYScpO1xuICBkb2MuYm9keS5hcHBlbmRDaGlsZChhKTtcbiAgYmFzZS5ocmVmID0gYmFzZVVybDtcbiAgYS5ocmVmID0gdXJsO1xuICByZXR1cm4gYS5ocmVmO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gZ2V0QW5kRW5jb2RlKHVybCwgb3B0aW9ucykge1xuICBjb25zdCBUSU1FT1VUID0gMzAwMDA7XG4gIGlmIChvcHRpb25zLmNhY2hlQnVzdCkge1xuICAgIC8vIENhY2hlIGJ5cGFzcyBzbyB3ZSBkb250IGhhdmUgQ09SUyBpc3N1ZXMgd2l0aCBjYWNoZWQgaW1hZ2VzXG4gICAgLy8gU291cmNlOiBodHRwczovL2RldmVsb3Blci5tb3ppbGxhLm9yZy9lbi9kb2NzL1dlYi9BUEkvWE1MSHR0cFJlcXVlc3QvVXNpbmdfWE1MSHR0cFJlcXVlc3QjQnlwYXNzaW5nX3RoZV9jYWNoZVxuICAgIHVybCArPSAoL1xcPy8udGVzdCh1cmwpID8gJyYnIDogJz8nKSArIG5ldyBEYXRlKCkuZ2V0VGltZSgpO1xuICB9XG5cbiAgcmV0dXJuIG5ldyBQcm9taXNlKHJlc29sdmUgPT4ge1xuICAgIGNvbnN0IHJlcXVlc3QgPSBuZXcgd2luZG93LlhNTEh0dHBSZXF1ZXN0KCk7XG5cbiAgICByZXF1ZXN0Lm9ucmVhZHlzdGF0ZWNoYW5nZSA9IGRvbmU7XG4gICAgcmVxdWVzdC5vbnRpbWVvdXQgPSB0aW1lb3V0O1xuICAgIHJlcXVlc3QucmVzcG9uc2VUeXBlID0gJ2Jsb2InO1xuICAgIHJlcXVlc3QudGltZW91dCA9IFRJTUVPVVQ7XG4gICAgcmVxdWVzdC5vcGVuKCdHRVQnLCB1cmwsIHRydWUpO1xuICAgIHJlcXVlc3Quc2VuZCgpO1xuXG4gICAgbGV0IHBsYWNlaG9sZGVyO1xuICAgIGlmIChvcHRpb25zLmltYWdlUGxhY2Vob2xkZXIpIHtcbiAgICAgIGNvbnN0IHNwbGl0ID0gb3B0aW9ucy5pbWFnZVBsYWNlaG9sZGVyLnNwbGl0KC8sLyk7XG4gICAgICBpZiAoc3BsaXQgJiYgc3BsaXRbMV0pIHtcbiAgICAgICAgcGxhY2Vob2xkZXIgPSBzcGxpdFsxXTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBmdW5jdGlvbiBkb25lKCkge1xuICAgICAgaWYgKHJlcXVlc3QucmVhZHlTdGF0ZSAhPT0gNCkgcmV0dXJuO1xuXG4gICAgICBpZiAocmVxdWVzdC5zdGF0dXMgIT09IDIwMCkge1xuICAgICAgICBpZiAocGxhY2Vob2xkZXIpIHtcbiAgICAgICAgICByZXNvbHZlKHBsYWNlaG9sZGVyKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBmYWlsKGBjYW5ub3QgZmV0Y2ggcmVzb3VyY2U6ICR7dXJsfSwgc3RhdHVzOiAke3JlcXVlc3Quc3RhdHVzfWApO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICBjb25zdCBlbmNvZGVyID0gbmV3IHdpbmRvdy5GaWxlUmVhZGVyKCk7XG4gICAgICBlbmNvZGVyLm9ubG9hZGVuZCA9ICgpID0+IHtcbiAgICAgICAgY29uc3QgY29udGVudCA9IGVuY29kZXIucmVzdWx0LnNwbGl0KC8sLylbMV07XG4gICAgICAgIHJlc29sdmUoY29udGVudCk7XG4gICAgICB9O1xuICAgICAgZW5jb2Rlci5yZWFkQXNEYXRhVVJMKHJlcXVlc3QucmVzcG9uc2UpO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIHRpbWVvdXQoKSB7XG4gICAgICBpZiAocGxhY2Vob2xkZXIpIHtcbiAgICAgICAgcmVzb2x2ZShwbGFjZWhvbGRlcik7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBmYWlsKFxuICAgICAgICAgIGB0aW1lb3V0IG9mICR7VElNRU9VVH1tcyBvY2N1cnJlZCB3aGlsZSBmZXRjaGluZyByZXNvdXJjZTogJHt1cmx9YFxuICAgICAgICApO1xuICAgICAgfVxuICAgIH1cblxuICAgIGZ1bmN0aW9uIGZhaWwobWVzc2FnZSkge1xuICAgICAgY29uc29sZS5lcnJvcihtZXNzYWdlKTtcbiAgICAgIHJlc29sdmUoJycpO1xuICAgIH1cbiAgfSk7XG59XG4iXX0=