kepler.gl.geoiq
Version:
kepler.gl is a webgl based application to visualize large scale location data in the browser
199 lines (181 loc) • 18.4 kB
JavaScript
;
var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
Object.defineProperty(exports, "__esModule", {
value: true
});
exports["default"] = void 0;
var _defineProperty2 = _interopRequireDefault(require("@babel/runtime/helpers/defineProperty"));
var _classCallCheck2 = _interopRequireDefault(require("@babel/runtime/helpers/classCallCheck"));
var _createClass2 = _interopRequireDefault(require("@babel/runtime/helpers/createClass"));
var _utils = require("../utils/utils");
var _defaultLayerIcon = _interopRequireDefault(require("./default-layer-icon"));
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; }
var Widget = exports["default"] = /*#__PURE__*/function () {
function Widget() {
var props = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};
(0, _classCallCheck2["default"])(this, Widget);
this.id = props.id || (0, _utils.generateHashId)(6); // meta
this.meta = {}; // visConfigSettings
// this.visConfigSettings = {};
this.config = this.getDefaultWidgetConfig(_objectSpread({}, props));
}
(0, _createClass2["default"])(Widget, [{
key: "type",
get: function get() {
return null;
}
}, {
key: "name",
get: function get() {
return this.type;
}
}, {
key: "widgetIcon",
get: function get() {
return _defaultLayerIcon["default"];
}
}, {
key: "isWidgetAggregated",
get: function get() {
return false;
}
}, {
key: "requiredLayer",
get: function get() {
return [];
}
}, {
key: "widgetInfoModal",
get: function get() {
return null;
}
}, {
key: "widgetAggregatedData",
get: function get() {
return null;
}
}, {
key: "calculateAggregationData",
value: function calculateAggregationData() {
return null;
}
}, {
key: "getDefaultWidgetConfig",
value: function getDefaultWidgetConfig() {
var props = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};
return {
categoryField: props.categoryField || null,
dataId: props.dataId || null,
label: props.label || 'new widget',
isVisible: props.isVisible || false,
isConfigActive: props.isConfigActive || false,
fieldName: null,
selectedLayer: props.selectedLayer || null,
isCalculating: props.isCalculating || false,
bounds: props.bounds || true,
aggregatedData: props.aggregatedData || null,
aggregationType: props.aggregationType || null
};
}
}, {
key: "updateWidgetConfig",
value: function updateWidgetConfig(newConfig) {
this.config = _objectSpread(_objectSpread({}, this.config), newConfig);
return this;
}
}, {
key: "updateMeta",
value: function updateMeta(meta) {
this.meta = _objectSpread(_objectSpread({}, this.meta), meta);
}
}, {
key: "assignConfigToWidget",
value: function assignConfigToWidget(configToCopy) {
var currentConfig = this.config;
var copied = this.copyWidgetConfig(currentConfig, configToCopy);
this.updateWidgetConfig(copied);
}
}, {
key: "aggregatedDataAffectingProps",
get: function get() {
// console.log('inside aggregatedDataAffectingProps');
return ['aggregationType', 'fieldName', 'mapState', 'bounds'];
}
/**
* Check whether layer has all columns
*
* @param {object} widget
* @returns {boolean} yes or no
*/
}, {
key: "hasAllValues",
value: function hasAllValues() {
var aggregationType = this.config.aggregationType;
return aggregationType;
}
}, {
key: "isValidToSave",
value: function isValidToSave() {
return this.type && this.hasAllValues();
}
}, {
key: "shouldCalculateAggregatedData",
value: function shouldCalculateAggregatedData(props) {
var _this = this;
return props.some(function (p) {
return _this.aggregatedDataAffectingProps.includes(p);
});
}
/*
* Recursively copy config over to an empty layer
* when received saved config, or copy config over from a different layer type
* make sure to only copy over value to existing keys
* @param {object} currentConfig - existing config to be override
* @param {object} configToCopy - new Config to copy over
* @param {string[]} notToDeepMerge - array of properties to not to be deep copied
* @param {string[]} notToCopy - array of properties not to copy
* @returns {object} - copied config
*/
}, {
key: "copyWidgetConfig",
value: function copyWidgetConfig(currentConfig, configToCopy) {
var _this2 = this;
var copied = {};
Object.keys(currentConfig).forEach(function (key) {
if ((0, _utils.isPlainObject)(currentConfig[key]) && (0, _utils.isPlainObject)(configToCopy[key])) {
// recursively assign object value
copied[key] = _this2.copyWidgetConfig(currentConfig[key], configToCopy[key]);
} else if ((0, _utils.notNullorUndefined)(configToCopy[key])) {
// copy
copied[key] = configToCopy[key];
} else {
// keep existing
copied[key] = currentConfig[key];
}
});
return copied;
}
/**
* Assign a field to layer column, return column config
* @param key - Column Key
* @param field - Selected field
* @returns {{}} - Column config
*/
}, {
key: "assignColumn",
value: function assignColumn(key, field) {
// field value could be null for optional columns
var update = field ? {
value: field.name,
fieldIdx: field.tableFieldIndex - 1
} : {
value: null,
fieldIdx: -1
};
return _objectSpread(_objectSpread({}, this.config.columns), {}, (0, _defineProperty2["default"])({}, key, _objectSpread(_objectSpread({}, this.config.columns[key]), update)));
}
}]);
return Widget;
}();
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy93aWRnZXRzL2Jhc2Utd2lkZ2V0LmpzIl0sIm5hbWVzIjpbIldpZGdldCIsInByb3BzIiwiaWQiLCJtZXRhIiwiY29uZmlnIiwiZ2V0RGVmYXVsdFdpZGdldENvbmZpZyIsInR5cGUiLCJEZWZhdWx0V2lkZ2V0SWNvbiIsImNhdGVnb3J5RmllbGQiLCJkYXRhSWQiLCJsYWJlbCIsImlzVmlzaWJsZSIsImlzQ29uZmlnQWN0aXZlIiwiZmllbGROYW1lIiwic2VsZWN0ZWRMYXllciIsImlzQ2FsY3VsYXRpbmciLCJib3VuZHMiLCJhZ2dyZWdhdGVkRGF0YSIsImFnZ3JlZ2F0aW9uVHlwZSIsIm5ld0NvbmZpZyIsImNvbmZpZ1RvQ29weSIsImN1cnJlbnRDb25maWciLCJjb3BpZWQiLCJjb3B5V2lkZ2V0Q29uZmlnIiwidXBkYXRlV2lkZ2V0Q29uZmlnIiwiaGFzQWxsVmFsdWVzIiwic29tZSIsInAiLCJhZ2dyZWdhdGVkRGF0YUFmZmVjdGluZ1Byb3BzIiwiaW5jbHVkZXMiLCJPYmplY3QiLCJrZXlzIiwiZm9yRWFjaCIsImtleSIsImZpZWxkIiwidXBkYXRlIiwidmFsdWUiLCJuYW1lIiwiZmllbGRJZHgiLCJ0YWJsZUZpZWxkSW5kZXgiLCJjb2x1bW5zIl0sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7QUFvQkE7O0FBS0E7Ozs7OztJQUVxQkEsTTtBQUNuQixvQkFBd0I7QUFBQSxRQUFaQyxLQUFZLHVFQUFKLEVBQUk7QUFBQTtBQUN0QixTQUFLQyxFQUFMLEdBQVVELEtBQUssQ0FBQ0MsRUFBTixJQUFZLDJCQUFlLENBQWYsQ0FBdEIsQ0FEc0IsQ0FHdEI7O0FBQ0EsU0FBS0MsSUFBTCxHQUFZLEVBQVosQ0FKc0IsQ0FNdEI7QUFDQTs7QUFFQSxTQUFLQyxNQUFMLEdBQWMsS0FBS0Msc0JBQUwsbUJBQ1RKLEtBRFMsRUFBZDtBQUdEOzs7O1NBQ0QsZUFBVztBQUNULGFBQU8sSUFBUDtBQUNEOzs7U0FDRCxlQUFXO0FBQ1QsYUFBTyxL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R0U7QUFDQTtBQUNBWCxVQUFBQSxNQUFNLENBQUNXLEdBQUQsQ0FBTixHQUFjLE1BQUksQ0FBQ1YsZ0JBQUwsQ0FDWkYsYUFBYSxDQUFDWSxHQUFELENBREQsRUFFWmIsWUFBWSxDQUFDYSxHQUFELENBRkEsQ0FBZDtBQUlELFNBVEQsTUFTTyxJQUFJLCtCQUFtQmIsWUFBWSxDQUFDYSxHQUFELENBQS9CLENBQUosRUFBMkM7QUFDaEQ7QUFDQVgsVUFBQUEsTUFBTSxDQUFDVyxHQUFELENBQU4sR0FBY2IsWUFBWSxDQUFDYSxHQUFELENBQTFCO0FBQ0QsU0FITSxNQUdBO0FBQ0w7QUFDQVgsVUFBQUEsTUFBTSxDQUFDVyxHQUFELENBQU4sR0FBY1osYUFBYSxDQUFDWSxHQUFELENBQTNCO0FBQ0Q7QUFDRixPQWpCRDtBQW1CQSxhQUFPWCxNQUFQO0FBQ0Q7QUFFRDs7Ozs7Ozs7O1dBTUEsc0JBQWFXLEdBQWIsRUFBa0JDLEtBQWxCLEVBQXlCO0FBQ3ZCO0FBQ0EsVUFBTUMsTUFBTSxHQUFHRCxLQUFLLEdBQ2hCO0FBQ0VFLFFBQUFBLEtBQUssRUFBRUYsS0FBSyxDQUFDRyxJQURmO0FBRUVDLFFBQUFBLFFBQVEsRUFBRUosS0FBSyxDQUFDSyxlQUFOLEdBQXdCO0FBRnBDLE9BRGdCLEdBS2hCO0FBQUNILFFBQUFBLEtBQUssRUFBRSxJQUFSO0FBQWNFLFFBQUFBLFFBQVEsRUFBRSxDQUFDO0FBQXpCLE9BTEo7QUFPQSw2Q0FDSyxLQUFLbEMsTUFBTCxDQUFZb0MsT0FEakIsNENBRUdQLEdBRkgsa0NBR08sS0FBSzdCLE1BQUwsQ0FBWW9DLE9BQVosQ0FBb0JQLEdBQXBCLENBSFAsR0FJT0UsTUFKUDtBQU9EIiwic291cmNlc0NvbnRlbnQiOlsiLy8gQ29weXJpZ2h0IChjKSAyMDIzIFViZXIgVGVjaG5vbG9naWVzLCBJbmMuXG4vL1xuLy8gUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nIGEgY29weVxuLy8gb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGUgXCJTb2Z0d2FyZVwiKSwgdG8gZGVhbFxuLy8gaW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24gdGhlIHJpZ2h0c1xuLy8gdG8gdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLCBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLCBhbmQvb3Igc2VsbFxuLy8gY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvIHBlcm1pdCBwZXJzb25zIHRvIHdob20gdGhlIFNvZnR3YXJlIGlzXG4vLyBmdXJuaXNoZWQgdG8gZG8gc28sIHN1YmplY3QgdG8gdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOlxuLy9cbi8vIFRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIHNoYWxsIGJlIGluY2x1ZGVkIGluXG4vLyBhbGwgY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZSBTb2Z0d2FyZS5cbi8vXG4vLyBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgXCJBUyBJU1wiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBFWFBSRVNTIE9SXG4vLyBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSxcbi8vIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT05JTkZSSU5HRU1FTlQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRVxuLy8gQVVUSE9SUyBPUiBDT1BZUklHSFQgSE9MREVSUyBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSwgREFNQUdFUyBPUiBPVEhFUlxuLy8gTElBQklMSVRZLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUiBPVEhFUldJU0UsIEFSSVNJTkcgRlJPTSxcbi8vIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IgT1RIRVIgREVBTElOR1MgSU5cbi8vIFRIRSBTT0ZUV0FSRS5cblxuaW1wb3J0IHtcbiAgZ2VuZXJhdGVIYXNoSWQsXG4gIG5vdE51bGxvclVuZGVmaW5lZCxcbiAgaXNQbGFpbk9iamVjdFxufSBmcm9tICcuLi91dGlscy91dGlscyc7XG5pbXBvcnQgRGVmYXVsdFdpZGdldEljb24gZnJvbSAnLi9kZWZhdWx0LWxheWVyLWljb24nO1xuXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBXaWRnZXQge1xuICBjb25zdHJ1Y3Rvcihwcm9wcyA9IHt9KSB7XG4gICAgdGhpcy5pZCA9IHByb3BzLmlkIHx8IGdlbmVyYXRlSGFzaElkKDYpO1xuXG4gICAgLy8gbWV0YVxuICAgIHRoaXMubWV0YSA9IHt9O1xuXG4gICAgLy8gdmlzQ29uZmlnU2V0dGluZ3NcbiAgICAvLyB0aGlzLnZpc0NvbmZpZ1NldHRpbmdzID0ge307XG5cbiAgICB0aGlzLmNvbmZpZyA9IHRoaXMuZ2V0RGVmYXVsdFdpZGdldENvbmZpZyh7XG4gICAgICAuLi5wcm9wc1xuICAgIH0pO1xuICB9XG4gIGdldCB0eXBlKCkge1xuICAgIHJldHVybiBudWxsO1xuICB9XG4gIGdldCBuYW1lKCkge1xuICAgIHJldHVybiB0aGlzLnR5cGU7XG4gIH1cbiAgZ2V0IHdpZGdldEljb24oKSB7XG4gICAgcmV0dXJuIERlZmF1bHRXaWRnZXRJY29uO1xuICB9XG4gIGdldCBpc1dpZGdldEFnZ3JlZ2F0ZWQoKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG4gIGdldCByZXF1aXJlZExheWVyKCkge1xuICAgIHJldHVybiBbXTtcbiAgfVxuICBnZXQgd2lkZ2V0SW5mb01vZGFsKCkge1xuICAgIHJldHVybiBudWxsO1xuICB9XG4gIGdldCB3aWRnZXRBZ2dyZWdhdGVkRGF0YSgpIHtcbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuICBjYWxjdWxhdGVBZ2dyZWdhdGlvbkRhdGEoKSB7XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cblxuICBnZXREZWZhdWx0V2lkZ2V0Q29uZmlnKHByb3BzID0ge30pIHtcbiAgICByZXR1cm4ge1xuICAgICAgY2F0ZWdvcnlGaWVsZDogcHJvcHMuY2F0ZWdvcnlGaWVsZCB8fCBudWxsLFxuICAgICAgZGF0YUlkOiBwcm9wcy5kYXRhSWQgfHwgbnVsbCxcbiAgICAgIGxhYmVsOiBwcm9wcy5sYWJlbCB8fCAnbmV3IHdpZGdldCcsXG4gICAgICBpc1Zpc2libGU6IHByb3BzLmlzVmlzaWJsZSB8fCBmYWxzZSxcbiAgICAgIGlzQ29uZmlnQWN0aXZlOiBwcm9wcy5pc0NvbmZpZ0FjdGl2ZSB8fCBmYWxzZSxcbiAgICAgIGZpZWxkTmFtZTogbnVsbCxcbiAgICAgIHNlbGVjdGVkTGF5ZXI6IHByb3BzLnNlbGVjdGVkTGF5ZXIgfHwgbnVsbCxcbiAgICAgIGlzQ2FsY3VsYXRpbmc6IHByb3BzLmlzQ2FsY3VsYXRpbmcgfHwgZmFsc2UsXG4gICAgICBib3VuZHM6IHByb3BzLmJvdW5kcyB8fCB0cnVlLFxuICAgICAgYWdncmVnYXRlZERhdGE6IHByb3BzLmFnZ3JlZ2F0ZWREYXRhIHx8IG51bGwsXG4gICAgICBhZ2dyZWdhdGlvblR5cGU6IHByb3BzLmFnZ3JlZ2F0aW9uVHlwZSB8fCBudWxsXG4gICAgfTtcbiAgfVxuICB1cGRhdGVXaWRnZXRDb25maWcobmV3Q29uZmlnKSB7XG4gICAgdGhpcy5jb25maWcgPSB7Li4udGhpcy5jb25maWcsIC4uLm5ld0NvbmZpZ307XG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuICB1cGRhdGVNZXRhKG1ldGEpIHtcbiAgICB0aGlzLm1ldGEgPSB7Li4udGhpcy5tZXRhLCAuLi5tZXRhfTtcbiAgfVxuXG4gIGFzc2lnbkNvbmZpZ1RvV2lkZ2V0KGNvbmZpZ1RvQ29weSkge1xuICAgIGNvbnN0IGN1cnJlbnRDb25maWcgPSB0aGlzLmNvbmZpZztcbiAgICBjb25zdCBjb3BpZWQgPSB0aGlzLmNvcHlXaWRnZXRDb25maWcoY3VycmVudENvbmZpZywgY29uZmlnVG9Db3B5KTtcblxuICAgIHRoaXMudXBkYXRlV2lkZ2V0Q29uZmlnKGNvcGllZCk7XG4gIH1cblxuICBnZXQgYWdncmVnYXRlZERhdGFBZmZlY3RpbmdQcm9wcygpIHtcbiAgICAvLyBjb25zb2xlLmxvZygnaW5zaWRlIGFnZ3JlZ2F0ZWREYXRhQWZmZWN0aW5nUHJvcHMnKTtcbiAgICByZXR1cm4gWydhZ2dyZWdhdGlvblR5cGUnLCAnZmllbGROYW1lJywgJ21hcFN0YXRlJywgJ2JvdW5kcyddO1xuICB9XG5cbiAgLyoqXG4gICAqIENoZWNrIHdoZXRoZXIgbGF5ZXIgaGFzIGFsbCBjb2x1bW5zXG4gICAqXG4gICAqIEBwYXJhbSB7b2JqZWN0fSB3aWRnZXRcbiAgICogQHJldHVybnMge2Jvb2xlYW59IHllcyBvciBub1xuICAgKi9cbiAgaGFzQWxsVmFsdWVzKCkge1xuICAgIGNvbnN0IHthZ2dyZWdhdGlvblR5cGV9ID0gdGhpcy5jb25maWc7XG4gICAgcmV0dXJuIGFnZ3JlZ2F0aW9uVHlwZTtcbiAgfVxuXG4gIGlzVmFsaWRUb1NhdmUoKSB7XG4gICAgcmV0dXJuIHRoaXMudHlwZSAmJiB0aGlzLmhhc0FsbFZhbHVlcygpO1xuICB9XG5cbiAgc2hvdWxkQ2FsY3VsYXRlQWdncmVnYXRlZERhdGEocHJvcHMpIHtcbiAgICByZXR1cm4gcHJvcHMuc29tZShwID0+IHRoaXMuYWdncmVnYXRlZERhdGFBZmZlY3RpbmdQcm9wcy5pbmNsdWRlcyhwKSk7XG4gIH1cblxuICAvKlxuICAgKiBSZWN1cnNpdmVseSBjb3B5IGNvbmZpZyBvdmVyIHRvIGFuIGVtcHR5IGxheWVyXG4gICAqIHdoZW4gcmVjZWl2ZWQgc2F2ZWQgY29uZmlnLCBvciBjb3B5IGNvbmZpZyBvdmVyIGZyb20gYSBkaWZmZXJlbnQgbGF5ZXIgdHlwZVxuICAgKiBtYWtlIHN1cmUgdG8gb25seSBjb3B5IG92ZXIgdmFsdWUgdG8gZXhpc3Rpbmcga2V5c1xuICAgKiBAcGFyYW0ge29iamVjdH0gY3VycmVudENvbmZpZyAtIGV4aXN0aW5nIGNvbmZpZyB0byBiZSBvdmVycmlkZVxuICAgKiBAcGFyYW0ge29iamVjdH0gY29uZmlnVG9Db3B5IC0gbmV3IENvbmZpZyB0byBjb3B5IG92ZXJcbiAgICogQHBhcmFtIHtzdHJpbmdbXX0gbm90VG9EZWVwTWVyZ2UgLSBhcnJheSBvZiBwcm9wZXJ0aWVzIHRvIG5vdCB0byBiZSBkZWVwIGNvcGllZFxuICAgKiBAcGFyYW0ge3N0cmluZ1tdfSBub3RUb0NvcHkgLSBhcnJheSBvZiBwcm9wZXJ0aWVzIG5vdCB0byBjb3B5XG4gICAqIEByZXR1cm5zIHtvYmplY3R9IC0gY29waWVkIGNvbmZpZ1xuICAgKi9cblxuICBjb3B5V2lkZ2V0Q29uZmlnKGN1cnJlbnRDb25maWcsIGNvbmZpZ1RvQ29weSkge1xuICAgIGNvbnN0IGNvcGllZCA9IHt9O1xuICAgIE9iamVjdC5rZXlzKGN1cnJlbnRDb25maWcpLmZvckVhY2goa2V5ID0+IHtcbiAgICAgIGlmIChcbiAgICAgICAgaXNQbGFpbk9iamVjdChjdXJyZW50Q29uZmlnW2tleV0pICYmXG4gICAgICAgIGlzUGxhaW5PYmplY3QoY29uZmlnVG9Db3B5W2tleV0pXG4gICAgICApIHtcbiAgICAgICAgLy8gcmVjdXJzaXZlbHkgYXNzaWduIG9iamVjdCB2YWx1ZVxuICAgICAgICBjb3BpZWRba2V5XSA9IHRoaXMuY29weVdpZGdldENvbmZpZyhcbiAgICAgICAgICBjdXJyZW50Q29uZmlnW2tleV0sXG4gICAgICAgICAgY29uZmlnVG9Db3B5W2tleV1cbiAgICAgICAgKTtcbiAgICAgIH0gZWxzZSBpZiAobm90TnVsbG9yVW5kZWZpbmVkKGNvbmZpZ1RvQ29weVtrZXldKSkge1xuICAgICAgICAvLyBjb3B5XG4gICAgICAgIGNvcGllZFtrZXldID0gY29uZmlnVG9Db3B5W2tleV07XG4gICAgICB9IGVsc2Uge1xuICAgICAgICAvLyBrZWVwIGV4aXN0aW5nXG4gICAgICAgIGNvcGllZFtrZXldID0gY3VycmVudENvbmZpZ1trZXldO1xuICAgICAgfVxuICAgIH0pO1xuXG4gICAgcmV0dXJuIGNvcGllZDtcbiAgfVxuXG4gIC8qKlxuICAgKiBBc3NpZ24gYSBmaWVsZCB0byBsYXllciBjb2x1bW4sIHJldHVybiBjb2x1bW4gY29uZmlnXG4gICAqIEBwYXJhbSBrZXkgLSBDb2x1bW4gS2V5XG4gICAqIEBwYXJhbSBmaWVsZCAtIFNlbGVjdGVkIGZpZWxkXG4gICAqIEByZXR1cm5zIHt7fX0gLSBDb2x1bW4gY29uZmlnXG4gICAqL1xuICBhc3NpZ25Db2x1bW4oa2V5LCBmaWVsZCkge1xuICAgIC8vIGZpZWxkIHZhbHVlIGNvdWxkIGJlIG51bGwgZm9yIG9wdGlvbmFsIGNvbHVtbnNcbiAgICBjb25zdCB1cGRhdGUgPSBmaWVsZFxuICAgICAgPyB7XG4gICAgICAgICAgdmFsdWU6IGZpZWxkLm5hbWUsXG4gICAgICAgICAgZmllbGRJZHg6IGZpZWxkLnRhYmxlRmllbGRJbmRleCAtIDFcbiAgICAgICAgfVxuICAgICAgOiB7dmFsdWU6IG51bGwsIGZpZWxkSWR4OiAtMX07XG5cbiAgICByZXR1cm4ge1xuICAgICAgLi4udGhpcy5jb25maWcuY29sdW1ucyxcbiAgICAgIFtrZXldOiB7XG4gICAgICAgIC4uLnRoaXMuY29uZmlnLmNvbHVtbnNba2V5XSxcbiAgICAgICAgLi4udXBkYXRlXG4gICAgICB9XG4gICAgfTtcbiAgfVxufVxuIl19