UNPKG

kepler.gl

Version:

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

165 lines (153 loc) 24.6 kB
"use strict"; var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault"); Object.defineProperty(exports, "__esModule", { value: true }); exports.loadImages = loadImages; var _defineProperty2 = _interopRequireDefault(require("@babel/runtime/helpers/defineProperty")); var _constants = _interopRequireDefault(require("@luma.gl/constants")); var _core = require("@luma.gl/core"); var _isEqual = _interopRequireDefault(require("lodash/isEqual")); function ownKeys(e, r) { var t = Object.keys(e); if (Object.getOwnPropertySymbols) { var o = Object.getOwnPropertySymbols(e); r && (o = o.filter(function (r) { return Object.getOwnPropertyDescriptor(e, r).enumerable; })), t.push.apply(t, o); } return t; } function _objectSpread(e) { for (var r = 1; r < arguments.length; r++) { var t = null != arguments[r] ? arguments[r] : {}; r % 2 ? ownKeys(Object(t), !0).forEach(function (r) { (0, _defineProperty2["default"])(e, r, t[r]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(e, Object.getOwnPropertyDescriptors(t)) : ownKeys(Object(t)).forEach(function (r) { Object.defineProperty(e, r, Object.getOwnPropertyDescriptor(t, r)); }); } return e; } function _createForOfIteratorHelper(r, e) { var t = "undefined" != typeof Symbol && r[Symbol.iterator] || r["@@iterator"]; if (!t) { if (Array.isArray(r) || (t = _unsupportedIterableToArray(r)) || e && r && "number" == typeof r.length) { t && (r = t); var _n = 0, F = function F() {}; return { s: F, n: function n() { return _n >= r.length ? { done: !0 } : { done: !1, value: r[_n++] }; }, e: function e(r) { throw r; }, f: F }; } throw new TypeError("Invalid attempt to iterate non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); } var o, a = !0, u = !1; return { s: function s() { t = t.call(r); }, n: function n() { var r = t.next(); return a = r.done, r; }, e: function e(r) { u = !0, o = r; }, f: function f() { try { a || null == t["return"] || t["return"](); } finally { if (u) throw o; } } }; } function _unsupportedIterableToArray(r, a) { if (r) { if ("string" == typeof r) return _arrayLikeToArray(r, a); var t = {}.toString.call(r).slice(8, -1); return "Object" === t && r.constructor && (t = r.constructor.name), "Map" === t || "Set" === t ? Array.from(r) : "Arguments" === t || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(t) ? _arrayLikeToArray(r, a) : void 0; } } function _arrayLikeToArray(r, a) { (null == a || a > r.length) && (a = r.length); for (var e = 0, n = Array(a); e < a; e++) n[e] = r[e]; return n; } // SPDX-License-Identifier: MIT // Copyright contributors to the kepler.gl project /** * Texture parameters that should work for every texture on both WebGL1 and WebGL2 */ var DEFAULT_UNIVERSAL_TEXTURE_PARAMETERS = (0, _defineProperty2["default"])((0, _defineProperty2["default"])((0, _defineProperty2["default"])((0, _defineProperty2["default"])({}, _constants["default"].TEXTURE_MIN_FILTER, _constants["default"].NEAREST), _constants["default"].TEXTURE_MAG_FILTER, _constants["default"].NEAREST), _constants["default"].TEXTURE_WRAP_S, _constants["default"].CLAMP_TO_EDGE), _constants["default"].TEXTURE_WRAP_T, _constants["default"].CLAMP_TO_EDGE); /** * Load image items to webgl context * @param gl webgl rendering context * @param imageItem image item, might be single texture or array of textures * @returns loaded single webgl texture or array of webgl texture or null */ function loadImageItem(gl, imageItem) { var result; if (Array.isArray(imageItem)) { var dirtyResult = imageItem.map(function (x) { return loadTexture(gl, x); }); result = []; var _iterator = _createForOfIteratorHelper(dirtyResult), _step; try { for (_iterator.s(); !(_step = _iterator.n()).done;) { var texture = _step.value; if (texture) { result.push(texture); } } } catch (err) { _iterator.e(err); } finally { _iterator.f(); } if (!result.length) { result = null; } } else { result = loadTexture(gl, imageItem); } return result; } // eslint-disable-next-line complexity function loadImages(_ref) { var gl = _ref.gl, images = _ref.images, imagesData = _ref.imagesData, oldImagesData = _ref.oldImagesData; // Change to `true` if we need to setState with a new `images` object var imagesDirty = false; // If there are any removed keys, which previously existed in oldProps and // this.state.images but no longer exist in props, remove from the images // object if (oldImagesData) { for (var key in oldImagesData) { if (imagesData && !(key in imagesData) && key in images) { delete images[key]; imagesDirty = true; } } } // Check if any keys of props.images have changed var changedKeys = []; for (var _key in imagesData) { // If oldProps.images didn't exist or it existed and this key didn't exist if (!oldImagesData || oldImagesData && !(_key in oldImagesData)) { changedKeys.push(_key); continue; } // Deep compare when the key previously existed to see if it changed if (!(0, _isEqual["default"])(imagesData[_key], oldImagesData[_key])) { changedKeys.push(_key); } } for (var _i = 0, _changedKeys = changedKeys; _i < _changedKeys.length; _i++) { var _key2 = _changedKeys[_i]; var imageData = imagesData[_key2]; if (!imageData) { continue; } var loadedItem = loadImageItem(gl, imageData); if (loadedItem) { images[_key2] = loadedItem; } imagesDirty = true; } if (imagesDirty) { return images; } return null; } /** * Create Texture2D object from image data */ function loadTexture(gl, imageData) { if (!imageData) { return null; } if (imageData instanceof _core.Texture2D) { return imageData; } var textureParams = _objectSpread({ parameters: DEFAULT_UNIVERSAL_TEXTURE_PARAMETERS }, imageData); if (!(0, _core.isWebGL2)(gl)) { textureParams = webgl1TextureFallbacks(textureParams); } return new _core.Texture2D(gl, textureParams); } /** * Texture fallbacks for WebGL1 * Fallback ideas derived from viv * https://github.com/hms-dbmi/viv/blob/5bcec429eeba55914ef3d7155a610d82048520a0/src/layers/XRLayer/XRLayer.js#L280-L302 */ function webgl1TextureFallbacks(textureParams) { // Set mipmaps to false // Not sure if this is necessary? // Might actually only be necessary for uint textures textureParams.mipmaps = false; // Change format to Luminance if (textureParams.format && [_constants["default"].R8UI, _constants["default"].R16UI, _constants["default"].R32UI].includes(textureParams.format)) { textureParams.format = _constants["default"].LUMINANCE; } // Change dataFormat to Luminance if (textureParams.dataFormat === _constants["default"].RED_INTEGER) { textureParams.dataFormat = _constants["default"].LUMINANCE; } // Set data type to float if (textureParams.type && [_constants["default"].UNSIGNED_BYTE, _constants["default"].UNSIGNED_SHORT, _constants["default"].UNSIGNED_INT].includes(textureParams.type)) { textureParams.type = _constants["default"].FLOAT; } // Cast data to float 32 if one of the uint types if (textureParams.data instanceof Uint8Array || textureParams.data instanceof Uint16Array || textureParams.data instanceof Uint32Array) { textureParams.data = new Float32Array(textureParams.data); } // Override texture parameters to make sure they're valid on WebGL1 textureParams.parameters = _objectSpread(_objectSpread({}, textureParams.parameters), DEFAULT_UNIVERSAL_TEXTURE_PARAMETERS); return textureParams; } //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJfY29uc3RhbnRzIiwiX2ludGVyb3BSZXF1aXJlRGVmYXVsdCIsInJlcXVpcmUiLCJfY29yZSIsIl9pc0VxdWFsIiwib3duS2V5cyIsImUiLCJyIiwidCIsIk9iamVjdCIsImtleXMiLCJnZXRPd25Qcm9wZXJ0eVN5bWJvbHMiLCJvIiwiZmlsdGVyIiwiZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yIiwiZW51bWVyYWJsZSIsInB1c2giLCJhcHBseSIsIl9vYmplY3RTcHJlYWQiLCJhcmd1bWVudHMiLCJsZW5ndGgiLCJmb3JFYWNoIiwiX2RlZmluZVByb3BlcnR5MiIsImdldE93blByb3BlcnR5RGVzY3JpcHRvcnMiLCJkZWZpbmVQcm9wZXJ0aWVzIiwiZGVmaW5lUHJvcGVydHkiLCJfY3JlYXRlRm9yT2ZJdGVyYXRvckhlbHBlciIsIlN5bWJvbCIsIml0ZXJhdG9yIiwiQXJyYXkiLCJpc0FycmF5IiwiX3Vuc3VwcG9ydGVkSXRlcmFibGVUb0FycmF5IiwiX24iLCJGIiwicyIsIm4iLCJkb25lIiwidmFsdWUiLCJmIiwiVHlwZUVycm9yIiwiYSIsInUiLCJjYWxsIiwibmV4dCIsIl9hcnJheUxpa2VUb0FycmF5IiwidG9TdHJpbmciLCJzbGljZSIsImNvbnN0cnVjdG9yIiwibmFtZSIsImZyb20iLCJ0ZXN0IiwiREVGQVVMVF9VTklWRVJTQUxfVEVYVFVSRV9QQVJBTUVURVJTIiwiR0wiLCJURVhUVVJFX01JTl9GSUxURVIiLCJORUFSRVNUIiwiVEVYVFVSRV9NQUdfRklMVEVSIiwiVEVYVFVSRV9XUkFQX1MiLCJDTEFNUF9UT19FREdFIiwiVEVYVFVSRV9XUkFQX1QiLCJsb2FkSW1hZ2VJdGVtIiwiZ2wiLCJpbWFnZUl0ZW0iLCJyZXN1bHQiLCJkaXJ0eVJlc3VsdCIsIm1hcCIsIngiLCJsb2FkVGV4dHVyZSIsIl9pdGVyYXRvciIsIl9zdGVwIiwidGV4dHVyZSIsImVyciIsImxvYWRJbWFnZXMiLCJfcmVmIiwiaW1hZ2VzIiwiaW1hZ2VzRGF0YSIsIm9sZEltYWdlc0RhdGEiLCJpbWFnZXNEaXJ0eSIsImtleSIsImNoYW5nZWRLZXlzIiwiaXNFcXVhbCIsIl9pIiwiX2NoYW5nZWRLZXlzIiwiaW1hZ2VEYXRhIiwibG9hZGVkSXRlbSIsIlRleHR1cmUyRCIsInRleHR1cmVQYXJhbXMiLCJwYXJhbWV0ZXJzIiwiaXNXZWJHTDIiLCJ3ZWJnbDFUZXh0dXJlRmFsbGJhY2tzIiwibWlwbWFwcyIsImZvcm1hdCIsIlI4VUkiLCJSMTZVSSIsIlIzMlVJIiwiaW5jbHVkZXMiLCJMVU1JTkFOQ0UiLCJkYXRhRm9ybWF0IiwiUkVEX0lOVEVHRVIiLCJ0eXBlIiwiVU5TSUdORURfQllURSIsIlVOU0lHTkVEX1NIT1JUIiwiVU5TSUdORURfSU5UIiwiRkxPQVQiLCJkYXRhIiwiVWludDhBcnJheSIsIlVpbnQxNkFycmF5IiwiVWludDMyQXJyYXkiLCJGbG9hdDMyQXJyYXkiXSwic291cmNlcyI6WyIuLi8uLi9zcmMvcmFzdGVyL2ltYWdlcy50cyJdLCJzb3VyY2VzQ29udGVudCI6WyIvLyBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogTUlUXG4vLyBDb3B5cmlnaHQgY29udHJpYnV0b3JzIHRvIHRoZSBrZXBsZXIuZ2wgcHJvamVjdFxuXG5pbXBvcnQgR0wgZnJvbSAnQGx1bWEuZ2wvY29uc3RhbnRzJztcbmltcG9ydCB7aXNXZWJHTDIsIFRleHR1cmUyRH0gZnJvbSAnQGx1bWEuZ2wvY29yZSc7XG5pbXBvcnQgdHlwZSB7VGV4dHVyZTJEUHJvcHN9IGZyb20gJ0BsdW1hLmdsL3dlYmdsJztcbmltcG9ydCBpc0VxdWFsIGZyb20gJ2xvZGFzaC9pc0VxdWFsJztcblxuaW1wb3J0IHR5cGUge0ltYWdlSW5wdXQsIEltYWdlU3RhdGV9IGZyb20gJy4vdHlwZXMnO1xuXG4vKipcbiAqIFRleHR1cmUgcGFyYW1ldGVycyB0aGF0IHNob3VsZCB3b3JrIGZvciBldmVyeSB0ZXh0dXJlIG9uIGJvdGggV2ViR0wxIGFuZCBXZWJHTDJcbiAqL1xuY29uc3QgREVGQVVMVF9VTklWRVJTQUxfVEVYVFVSRV9QQVJBTUVURVJTID0ge1xuICBbR0wuVEVYVFVSRV9NSU5fRklMVEVSXTogR0wuTkVBUkVTVCxcbiAgW0dMLlRFWFRVUkVfTUFHX0ZJTFRFUl06IEdMLk5FQVJFU1QsXG4gIFtHTC5URVhUVVJFX1dSQVBfU106IEdMLkNMQU1QX1RPX0VER0UsXG4gIFtHTC5URVhUVVJFX1dSQVBfVF06IEdMLkNMQU1QX1RPX0VER0Vcbn07XG5cbnR5cGUgTG9hZEltYWdlc09wdGlvbnMgPSB7XG4gIGdsOiBXZWJHTFJlbmRlcmluZ0NvbnRleHQgfCBXZWJHTDJSZW5kZXJpbmdDb250ZXh0O1xuICBpbWFnZXM6IEltYWdlU3RhdGU7XG4gIGltYWdlc0RhdGE6IEltYWdlSW5wdXQ7XG4gIG9sZEltYWdlc0RhdGE6IEltYWdlSW5wdXQ7XG59O1xuXG4vKipcbiAqIExvYWQgaW1hZ2UgaXRlbXMgdG8gd2ViZ2wgY29udGV4dFxuICogQHBhcmFtIGdsIHdlYmdsIHJlbmRlcmluZyBjb250ZXh0XG4gKiBAcGFyYW0gaW1hZ2VJdGVtIGltYWdlIGl0ZW0sIG1pZ2h0IGJlIHNpbmdsZSB0ZXh0dXJlIG9yIGFycmF5IG9mIHRleHR1cmVzXG4gKiBAcmV0dXJucyBsb2FkZWQgc2luZ2xlIHdlYmdsIHRleHR1cmUgb3IgYXJyYXkgb2Ygd2ViZ2wgdGV4dHVyZSBvciBudWxsXG4gKi9cbmZ1bmN0aW9uIGxvYWRJbWFnZUl0ZW0oXG4gIGdsOiBXZWJHTFJlbmRlcmluZ0NvbnRleHQgfCBXZWJHTDJSZW5kZXJpbmdDb250ZXh0LFxuICBpbWFnZUl0ZW06IFRleHR1cmUyRFByb3BzIHwgVGV4dHVyZTJEIHwgKFRleHR1cmUyRFByb3BzIHwgVGV4dHVyZTJEKVtdXG4pOiBudWxsIHwgVGV4dHVyZTJEIHwgVGV4dHVyZTJEW10ge1xuICBsZXQgcmVzdWx0OiBudWxsIHwgVGV4dHVyZTJEIHwgVGV4dHVyZTJEW107XG4gIGlmIChBcnJheS5pc0FycmF5KGltYWdlSXRlbSkpIHtcbiAgICBjb25zdCBkaXJ0eVJlc3VsdCA9IGltYWdlSXRlbS5tYXAoeCA9PiBsb2FkVGV4dHVyZShnbCwgeCkpO1xuICAgIHJlc3VsdCA9IFtdO1xuICAgIGZvciAoY29uc3QgdGV4dHVyZSBvZiBkaXJ0eVJlc3VsdCkge1xuICAgICAgaWYgKHRleHR1cmUpIHtcbiAgICAgICAgcmVzdWx0LnB1c2godGV4dHVyZSk7XG4gICAgICB9XG4gICAgfVxuICAgIGlmICghcmVzdWx0Lmxlbmd0aCkge1xuICAgICAgcmVzdWx0ID0gbnVsbDtcbiAgICB9XG4gIH0gZWxzZSB7XG4gICAgcmVzdWx0ID0gbG9hZFRleHR1cmUoZ2wsIGltYWdlSXRlbSk7XG4gIH1cbiAgcmV0dXJuIHJlc3VsdDtcbn1cblxuLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIGNvbXBsZXhpdHlcbmV4cG9ydCBmdW5jdGlvbiBsb2FkSW1hZ2VzKHtcbiAgZ2wsXG4gIGltYWdlcyxcbiAgaW1hZ2VzRGF0YSxcbiAgb2xkSW1hZ2VzRGF0YVxufTogTG9hZEltYWdlc09wdGlvbnMpOiBJbWFnZVN0YXRlIHwgbnVsbCB7XG4gIC8vIENoYW5nZSB0byBgdHJ1ZWAgaWYgd2UgbmVlZCB0byBzZXRTdGF0ZSB3aXRoIGEgbmV3IGBpbWFnZXNgIG9iamVjdFxuICBsZXQgaW1hZ2VzRGlydHkgPSBmYWxzZTtcblxuICAvLyBJZiB0aGVyZSBhcmUgYW55IHJlbW92ZWQga2V5cywgd2hpY2ggcHJldmlvdXNseSBleGlzdGVkIGluIG9sZFByb3BzIGFuZFxuICAvLyB0aGlzLnN0YXRlLmltYWdlcyBidXQgbm8gbG9uZ2VyIGV4aXN0IGluIHByb3BzLCByZW1vdmUgZnJvbSB0aGUgaW1hZ2VzXG4gIC8vIG9iamVjdFxuICBpZiAob2xkSW1hZ2VzRGF0YSkge1xuICAgIGZvciAoY29uc3Qga2V5IGluIG9sZEltYWdlc0RhdGEpIHtcbiAgICAgIGlmIChpbWFnZXNEYXRhICYmICEoa2V5IGluIGltYWdlc0RhdGEpICYmIGtleSBpbiBpbWFnZXMpIHtcbiAgICAgICAgZGVsZXRlIGltYWdlc1trZXldO1xuICAgICAgICBpbWFnZXNEaXJ0eSA9IHRydWU7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgLy8gQ2hlY2sgaWYgYW55IGtleXMgb2YgcHJvcHMuaW1hZ2VzIGhhdmUgY2hhbmdlZFxuICBjb25zdCBjaGFuZ2VkS2V5czogc3RyaW5nW10gPSBbXTtcbiAgZm9yIChjb25zdCBrZXkgaW4gaW1hZ2VzRGF0YSkge1xuICAgIC8vIElmIG9sZFByb3BzLmltYWdlcyBkaWRuJ3QgZXhpc3Qgb3IgaXQgZXhpc3RlZCBhbmQgdGhpcyBrZXkgZGlkbid0IGV4aXN0XG4gICAgaWYgKCFvbGRJbWFnZXNEYXRhIHx8IChvbGRJbWFnZXNEYXRhICYmICEoa2V5IGluIG9sZEltYWdlc0RhdGEpKSkge1xuICAgICAgY2hhbmdlZEtleXMucHVzaChrZXkpO1xuICAgICAgY29udGludWU7XG4gICAgfVxuXG4gICAgLy8gRGVlcCBjb21wYXJlIHdoZW4gdGhlIGtleSBwcmV2aW91c2x5IGV4aXN0ZWQgdG8gc2VlIGlmIGl0IGNoYW5nZWRcbiAgICBpZiAoIWlzRXF1YWwoaW1hZ2VzRGF0YVtrZXldLCBvbGRJbWFnZXNEYXRhW2tleV0pKSB7XG4gICAgICBjaGFuZ2VkS2V5cy5wdXNoKGtleSk7XG4gICAgfVxuICB9XG5cbiAgZm9yIChjb25zdCBrZXkgb2YgY2hhbmdlZEtleXMpIHtcbiAgICBjb25zdCBpbWFnZURhdGEgPSBpbWFnZXNEYXRhW2tleV07XG4gICAgaWYgKCFpbWFnZURhdGEpIHtcbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cblxuICAgIGNvbnN0IGxvYWRlZEl0ZW0gPSBsb2FkSW1hZ2VJdGVtKGdsLCBpbWFnZURhdGEpO1xuICAgIGlmIChsb2FkZWRJdGVtKSB7XG4gICAgICBpbWFnZXNba2V5XSA9IGxvYWRlZEl0ZW07XG4gICAgfVxuICAgIGltYWdlc0RpcnR5ID0gdHJ1ZTtcbiAgfVxuXG4gIGlmIChpbWFnZXNEaXJ0eSkge1xuICAgIHJldHVybiBpbWFnZXM7XG4gIH1cblxuICByZXR1cm4gbnVsbDtcbn1cblxuLyoqXG4gKiBDcmVhdGUgVGV4dHVyZTJEIG9iamVjdCBmcm9tIGltYWdlIGRhdGFcbiAqL1xuZnVuY3Rpb24gbG9hZFRleHR1cmUoXG4gIGdsOiBXZWJHTFJlbmRlcmluZ0NvbnRleHQgfCBXZWJHTDJSZW5kZXJpbmdDb250ZXh0LFxuICBpbWFnZURhdGE6IFRleHR1cmUyRCB8IFRleHR1cmUyRFByb3BzXG4pOiBUZXh0dXJlMkQgfCBudWxsIHtcbiAgaWYgKCFpbWFnZURhdGEpIHtcbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuXG4gIGlmIChpbWFnZURhdGEgaW5zdGFuY2VvZiBUZXh0dXJlMkQpIHtcbiAgICByZXR1cm4gaW1hZ2VEYXRhO1xuICB9XG5cbiAgbGV0IHRleHR1cmVQYXJhbXM6IFRleHR1cmUyRFByb3BzID0ge1xuICAgIHBhcmFtZXRlcnM6IERFRkFVTFRfVU5JVkVSU0FMX1RFWFRVUkVfUEFSQU1FVEVSUyxcbiAgICAuLi5pbWFnZURhdGFcbiAgfTtcblxuICBpZiAoIWlzV2ViR0wyKGdsKSkge1xuICAgIHRleHR1cmVQYXJhbXMgPSB3ZWJnbDFUZXh0dXJlRmFsbGJhY2tzKHRleHR1cmVQYXJhbXMpO1xuICB9XG5cbiAgcmV0dXJuIG5ldyBUZXh0dXJlMkQoZ2wsIHRleHR1cmVQYXJhbXMpO1xufVxuXG4vKipcbiAqIFRleHR1cmUgZmFsbGJhY2tzIGZvciBXZWJHTDFcbiAqIEZhbGxiYWNrIGlkZWFzIGRlcml2ZWQgZnJvbSB2aXZcbiAqIGh0dHBzOi8vZ2l0aHViLmNvbS9obXMtZGJtaS92aXYvYmxvYi81YmNlYzQyOWVlYmE1NTkxNGVmM2Q3MTU1YTYxMGQ4MjA0ODUyMGEwL3NyYy9sYXllcnMvWFJMYXllci9YUkxheWVyLmpzI0wyODAtTDMwMlxuICovXG5mdW5jdGlvbiB3ZWJnbDFUZXh0dXJlRmFsbGJhY2tzKHRleHR1cmVQYXJhbXM6IFRleHR1cmUyRFByb3BzKTogVGV4dHVyZTJEUHJvcHMge1xuICAvLyBTZXQgbWlwbWFwcyB0byBmYWxzZVxuICAvLyBOb3Qgc3VyZSBpZiB0aGlzIGlzIG5lY2Vzc2FyeT9cbiAgLy8gTWlnaHQgYWN0dWFsbHkgb25seSBiZSBuZWNlc3NhcnkgZm9yIHVpbnQgdGV4dHVyZXNcbiAgdGV4dHVyZVBhcmFtcy5taXBtYXBzID0gZmFsc2U7XG5cbiAgLy8gQ2hhbmdlIGZvcm1hdCB0byBMdW1pbmFuY2VcbiAgaWYgKHRleHR1cmVQYXJhbXMuZm9ybWF0ICYmIFtHTC5SOFVJLCBHTC5SMTZVSSwgR0wuUjMyVUldLmluY2x1ZGVzKHRleHR1cmVQYXJhbXMuZm9ybWF0KSkge1xuICAgIHRleHR1cmVQYXJhbXMuZm9ybWF0ID0gR0wuTFVNSU5BTkNFO1xuICB9XG5cbiAgLy8gQ2hhbmdlIGRhdGFGb3JtYXQgdG8gTHVtaW5hbmNlXG4gIGlmICh0ZXh0dXJlUGFyYW1zLmRhdGFGb3JtYXQgPT09IEdMLlJFRF9JTlRFR0VSKSB7XG4gICAgdGV4dHVyZVBhcmFtcy5kYXRhRm9ybWF0ID0gR0wuTFVNSU5BTkNFO1xuICB9XG5cbiAgLy8gU2V0IGRhdGEgdHlwZSB0byBmbG9hdFxuICBpZiAoXG4gICAgdGV4dHVyZVBhcmFtcy50eXBlICYmXG4gICAgW0dMLlVOU0lHTkVEX0JZVEUsIEdMLlVOU0lHTkVEX1NIT1JULCBHTC5VTlNJR05FRF9JTlRdLmluY2x1ZGVzKHRleHR1cmVQYXJhbXMudHlwZSlcbiAgKSB7XG4gICAgdGV4dHVyZVBhcmFtcy50eXBlID0gR0wuRkxPQVQ7XG4gIH1cblxuICAvLyBDYXN0IGRhdGEgdG8gZmxvYXQgMzIgaWYgb25lIG9mIHRoZSB1aW50IHR5cGVzXG4gIGlmIChcbiAgICB0ZXh0dXJlUGFyYW1zLmRhdGEgaW5zdGFuY2VvZiBVaW50OEFycmF5IHx8XG4gICAgdGV4dHVyZVBhcmFtcy5kYXRhIGluc3RhbmNlb2YgVWludDE2QXJyYXkgfHxcbiAgICB0ZXh0dXJlUGFyYW1zLmRhdGEgaW5zdGFuY2VvZiBVaW50MzJBcnJheVxuICApIHtcbiAgICB0ZXh0dXJlUGFyYW1zLmRhdGEgPSBuZXcgRmxvYXQzMkFycmF5KHRleHR1cmVQYXJhbXMuZGF0YSk7XG4gIH1cblxuICAvLyBPdmVycmlkZSB0ZXh0dXJlIHBhcmFtZXRlcnMgdG8gbWFrZSBzdXJlIHRoZXkncmUgdmFsaWQgb24gV2ViR0wxXG4gIHRleHR1cmVQYXJhbXMucGFyYW1ldGVycyA9IHsuLi50ZXh0dXJlUGFyYW1zLnBhcmFtZXRlcnMsIC4uLkRFRkFVTFRfVU5JVkVSU0FMX1RFWFRVUkVfUEFSQU1FVEVSU307XG5cbiAgcmV0dXJuIHRleHR1cmVQYXJhbXM7XG59XG4iXSwibWFwcGluZ3MiOiI7Ozs7Ozs7O0FBR0EsSUFBQUEsVUFBQSxHQUFBQyxzQkFBQSxDQUFBQyxPQUFBO0FBQ0EsSUFBQUMsS0FBQSxHQUFBRCxPQUFBO0FBRUEsSUFBQUUsUUFBQSxHQUFBSCxzQkFBQSxDQUFBQyxPQUFBO0FBQXFDLFNBQUFHLFFBQUFDLENBQUEsRUFBQUMsQ0FBQSxRQUFBQyxDQUFBLEdBQUFDLE1BQUEsQ0FBQUMsSUFBQSxDQUFBSixDQUFBLE9BQUFHLE1BQUEsQ0FBQUUscUJBQUEsUUFBQUMsQ0FBQSxHQUFBSCxNQUFBLENBQUFFLHFCQUFBLENBQUFMLENBQUEsR0FBQUMsQ0FBQSxLQUFBSyxDQUFBLEdBQUFBLENBQUEsQ0FBQUMsTUFBQSxXQUFBTixDQUFBLFdBQUFFLE1BQUEsQ0FBQUssd0JBQUEsQ0FBQVIsQ0FBQSxFQUFBQyxDQUFBLEVBQUFRLFVBQUEsT0FBQVAsQ0FBQSxDQUFBUSxJQUFBLENBQUFDLEtBQUEsQ0FBQVQsQ0FBQSxFQUFBSSxDQUFBLFlBQUFKLENBQUE7QUFBQSxTQUFBVSxjQUFBWixDQUFBLGFBQUFDLENBQUEsTUFBQUEsQ0FBQSxHQUFBWSxTQUFBLENBQUFDLE1BQUEsRUFBQWIsQ0FBQSxVQUFBQyxDQUFBLFdBQUFXLFNBQUEsQ0FBQVosQ0FBQSxJQUFBWSxTQUFBLENBQUFaLENBQUEsUUFBQUEsQ0FBQSxPQUFBRixPQUFBLENBQUFJLE1BQUEsQ0FBQUQsQ0FBQSxPQUFBYSxPQUFBLFdBQUFkLENBQUEsUUFBQWUsZ0JBQUEsYUFBQWhC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