kepler.gl
Version:
kepler.gl is a webgl based application to visualize large scale location data in the browser
222 lines (217 loc) • 33.9 kB
JavaScript
var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
var _typeof = require("@babel/runtime/helpers/typeof");
Object.defineProperty(exports, "__esModule", {
value: true
});
exports.propertiesV1 = exports.propertiesV0 = exports.fieldPropertiesV1 = exports.fieldPropertiesV0 = exports["default"] = exports.datasetSchema = exports.FieldSchema = exports.DatasetSchema = 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 _possibleConstructorReturn2 = _interopRequireDefault(require("@babel/runtime/helpers/possibleConstructorReturn"));
var _getPrototypeOf2 = _interopRequireDefault(require("@babel/runtime/helpers/getPrototypeOf"));
var _inherits2 = _interopRequireDefault(require("@babel/runtime/helpers/inherits"));
var _pick = _interopRequireDefault(require("lodash/pick"));
var _window = require("global/window");
var arrow = _interopRequireWildcard(require("apache-arrow"));
var _constants = require("@kepler.gl/constants");
var _versions = require("./versions");
var _schema = _interopRequireDefault(require("./schema"));
var _commonUtils = require("@kepler.gl/common-utils");
var _utils = require("@kepler.gl/utils");
function _getRequireWildcardCache(e) { if ("function" != typeof WeakMap) return null; var r = new WeakMap(), t = new WeakMap(); return (_getRequireWildcardCache = function _getRequireWildcardCache(e) { return e ? t : r; })(e); }
function _interopRequireWildcard(e, r) { if (!r && e && e.__esModule) return e; if (null === e || "object" != _typeof(e) && "function" != typeof e) return { "default": e }; var t = _getRequireWildcardCache(r); if (t && t.has(e)) return t.get(e); var n = { __proto__: null }, a = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var u in e) if ("default" !== u && {}.hasOwnProperty.call(e, u)) { var i = a ? Object.getOwnPropertyDescriptor(e, u) : null; i && (i.get || i.set) ? Object.defineProperty(n, u, i) : n[u] = e[u]; } return n["default"] = e, t && t.set(e, n), n; }
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 _callSuper(t, o, e) { return o = (0, _getPrototypeOf2["default"])(o), (0, _possibleConstructorReturn2["default"])(t, _isNativeReflectConstruct() ? Reflect.construct(o, e || [], (0, _getPrototypeOf2["default"])(t).constructor) : o.apply(t, e)); }
function _isNativeReflectConstruct() { try { var t = !Boolean.prototype.valueOf.call(Reflect.construct(Boolean, [], function () {})); } catch (t) {} return (_isNativeReflectConstruct = function _isNativeReflectConstruct() { return !!t; })(); } // SPDX-License-Identifier: MIT
// Copyright contributors to the kepler.gl project
// version v0
var fieldPropertiesV0 = exports.fieldPropertiesV0 = {
name: null,
type: null
};
var fieldPropertiesV1 = exports.fieldPropertiesV1 = {
name: null,
type: null,
format: null,
analyzerType: null,
metadata: null
};
var FieldSchema = exports.FieldSchema = /*#__PURE__*/function (_Schema) {
function FieldSchema() {
(0, _classCallCheck2["default"])(this, FieldSchema);
return _callSuper(this, FieldSchema, arguments);
}
(0, _inherits2["default"])(FieldSchema, _Schema);
return (0, _createClass2["default"])(FieldSchema, [{
key: "save",
value: function save(fields) {
var _this = this;
return (0, _defineProperty2["default"])({}, this.key, fields.map(function (f) {
return _this.savePropertiesOrApplySchema(f)[_this.key];
}));
}
}, {
key: "load",
value: function load(fields) {
return (0, _defineProperty2["default"])({}, this.key, fields);
}
}]);
}(_schema["default"]);
var propertiesV0 = exports.propertiesV0 = {
id: null,
label: null,
color: null,
allData: null,
fields: new FieldSchema({
key: 'fields',
version: _versions.VERSIONS.v0,
properties: fieldPropertiesV0
})
};
var propertiesV1 = exports.propertiesV1 = _objectSpread(_objectSpread({}, propertiesV0), {}, {
fields: new FieldSchema({
key: 'fields',
version: _versions.VERSIONS.v1,
properties: fieldPropertiesV1
}),
type: null,
metadata: null,
disableDataOperation: null
});
/**
* TODO Consider moving this cast to ArrowDataContainer?
* Prepare a data container for export as part of json / html files.
* 1) Arrow tables can store Timestamps as BigInts, so convert numbers to ISOStrings compatible with Kepler.gl's TIMESTAMP.
* 2) Geoarrow binary buffers converted to hex wkb
* @param dataContainer A data container to flatten.
* @returns Row based data.
*/
var getAllDataForSaving = function getAllDataForSaving(dataContainer) {
var allData = dataContainer.flattenData();
if (dataContainer instanceof _utils.ArrowDataContainer) {
var numColumns = dataContainer.numColumns();
var _loop = function _loop(columnIndex) {
var column = dataContainer.getColumn(columnIndex);
var field = dataContainer.getField(columnIndex);
if (arrow.DataType.isTimestamp(column.type) || arrow.DataType.isDate(column.type) || arrow.DataType.isTime(column.type)) {
allData.forEach(function (row) {
row[columnIndex] = new Date(row[columnIndex]).toISOString();
});
} else if ((field === null || field === void 0 ? void 0 : field.type) === _constants.ALL_FIELD_TYPES.geoarrow) {
var formatter = _utils.FIELD_DISPLAY_FORMAT[_constants.ALL_FIELD_TYPES.geoarrow];
allData.forEach(function (row) {
row[columnIndex] = formatter(row[columnIndex], field);
});
}
};
for (var columnIndex = 0; columnIndex < numColumns; ++columnIndex) {
_loop(columnIndex);
}
}
return allData;
};
/**
* Transforms fields for saving as part of json / html files.
* @param fields The array of fields from a Kepler table.
* @returns The transformed fields array with GeoArrow types updated to GeoJSON.
*/
var getFieldsForSaving = function getFieldsForSaving(fields) {
return fields.map(function (field) {
if (field.type === _constants.ALL_FIELD_TYPES.geoarrow) {
// geoarrow binary data is transformed to hex wkb in getAllDataForSaving, so update the field accordingly
return {
name: field.name,
type: _constants.ALL_FIELD_TYPES.geojson,
format: '',
analyzerType: 'GEOMETRY'
};
}
return field;
});
};
var DatasetSchema = exports.DatasetSchema = /*#__PURE__*/function (_Schema2) {
function DatasetSchema() {
var _this2;
(0, _classCallCheck2["default"])(this, DatasetSchema);
for (var _len = arguments.length, args = new Array(_len), _key = 0; _key < _len; _key++) {
args[_key] = arguments[_key];
}
_this2 = _callSuper(this, DatasetSchema, [].concat(args));
(0, _defineProperty2["default"])(_this2, "key", 'dataset');
return _this2;
}
(0, _inherits2["default"])(DatasetSchema, _Schema2);
return (0, _createClass2["default"])(DatasetSchema, [{
key: "save",
value: function save(dataset) {
var datasetFlattened = dataset.dataContainer ? _objectSpread(_objectSpread({}, dataset), {}, {
allData: getAllDataForSaving(dataset.dataContainer),
fields: getFieldsForSaving(dataset.fields),
// we use flattenData to save arrow tables,
// but once flattened it's not an arrow file anymore.
metadata: _objectSpread(_objectSpread({}, dataset.metadata), dataset.metadata.format === _constants.DATASET_FORMATS.arrow ? {
format: _constants.DATASET_FORMATS.row
} : {})
}) : dataset;
return this.savePropertiesOrApplySchema(datasetFlattened)[this.key];
}
}, {
key: "load",
value: function load(dataset) {
var fields = dataset.fields,
allData = dataset.allData;
var updatedFields = fields;
// recalculate field type
// because we have updated type-analyzer
// we need to add format to each field
var needCalculateMeta = fields[0] && (!Object.prototype.hasOwnProperty.call(fields[0], 'format') || !Object.prototype.hasOwnProperty.call(fields[0], 'analyzerType'));
if (needCalculateMeta) {
var fieldOrder = fields.map(function (f) {
return f.name;
});
var sampleData = (0, _commonUtils.getSampleForTypeAnalyze)({
fields: fieldOrder,
rows: allData
});
var meta = (0, _commonUtils.getFieldsFromData)(sampleData, fieldOrder);
updatedFields = meta.map(function (f, i) {
return _objectSpread(_objectSpread({}, (0, _pick["default"])(meta[i], ['name', 'type', 'format'])), {}, {
analyzerType: meta[i].analyzerType
});
});
updatedFields.forEach(function (f, i) {
if (fields[i].type !== f.type) {
// if newly detected field type is different from saved type
// we log it but won't update it, cause we don't want to break people's map
_window.console.warn("detect ".concat(f.name, " type is now ").concat(f.type, " instead of ").concat(fields[i].type));
}
});
}
// get format of all fields
return _objectSpread(_objectSpread({
data: {
fields: updatedFields,
rows: dataset.allData
},
info: (0, _pick["default"])(dataset, ['id', 'label', 'color', 'type'])
}, dataset.metadata ? {
metadata: dataset.metadata
} : {}), dataset.disableDataOperation ? {
disableDataOperation: dataset.disableDataOperation
} : {});
}
}]);
}(_schema["default"]);
var datasetSchema = exports.datasetSchema = (0, _defineProperty2["default"])((0, _defineProperty2["default"])({}, _versions.VERSIONS.v0, new DatasetSchema({
key: 'dataset',
version: _versions.VERSIONS.v0,
properties: propertiesV0
})), _versions.VERSIONS.v1, new DatasetSchema({
key: 'dataset',
version: _versions.VERSIONS.v1,
properties: propertiesV1
}));
var _default = exports["default"] = datasetSchema;
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJfcGljayIsIl9pbnRlcm9wUmVxdWlyZURlZmF1bHQiLCJyZXF1aXJlIiwiX3dpbmRvdyIsImFycm93IiwiX2ludGVyb3BSZXF1aXJlV2lsZGNhcmQiLCJfY29uc3RhbnRzIiwiX3ZlcnNpb25zIiwiX3NjaGVtYSIsIl9jb21tb25VdGlscyIsIl91dGlscyIsIl9nZXRSZXF1aXJlV2lsZGNhcmRDYWNoZSIsImUiLCJXZWFrTWFwIiwiciIsInQiLCJfX2VzTW9kdWxlIiwiX3R5cGVvZiIsImhhcyIsImdldCIsIm4iLCJfX3Byb3RvX18iLCJhIiwiT2JqZWN0IiwiZGVmaW5lUHJvcGVydHkiLCJnZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IiLCJ1IiwiaGFzT3duUHJvcGVydHkiLCJjYWxsIiwiaSIsInNldCIsIm93bktleXMiLCJrZXlzIiwiZ2V0T3duUHJvcGVydHlTeW1ib2xzIiwibyIsImZpbHRlciIsImVudW1lcmFibGUiLCJwdXNoIiwiYXBwbHkiLCJfb2JqZWN0U3ByZWFkIiwiYXJndW1lbnRzIiwibGVuZ3RoIiwiZm9yRWFjaCIsIl9kZWZpbmVQcm9wZXJ0eTIiLCJnZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3JzIiwiZGVmaW5lUHJvcGVydGllcyIsIl9jYWxsU3VwZXIiLCJfZ2V0UHJvdG90eXBlT2YyIiwiX3Bvc3NpYmxlQ29uc3RydWN0b3JSZXR1cm4yIiwiX2lzTmF0aXZlUmVmbGVjdENvbnN0cnVjdCIsIlJlZmxlY3QiLCJjb25zdHJ1Y3QiLCJjb25zdHJ1Y3RvciIsIkJvb2xlYW4iLCJwcm90b3R5cGUiLCJ2YWx1ZU9mIiwiZmllbGRQcm9wZXJ0aWVzVjAiLCJleHBvcnRzIiwibmFtZSIsInR5cGUiLCJmaWVsZFByb3BlcnRpZXNWMSIsImZvcm1hdCIsImFuYWx5emVyVHlwZSIsIm1ldGFkYXRhIiwiRmllbGRTY2hlbWEiLCJfU2NoZW1hIiwiX2NsYXNzQ2FsbENoZWNrMiIsIl9pbmhlcml0czIiLCJfY3JlYXRlQ2xhc3MyIiwia2V5IiwidmFsdWUiLCJzYXZlIiwiZmllbGRzIiwiX3RoaXMiLCJtYXAiLCJmIiwic2F2ZVByb3BlcnRpZXNPckFwcGx5U2NoZW1hIiwibG9hZCIsIlNjaGVtYSIsInByb3BlcnRpZXNWMCIsImlkIiwibGFiZWwiLCJjb2xvciIsImFsbERhdGEiLCJ2ZXJzaW9uIiwiVkVSU0lPTlMiLCJ2MCIsInByb3BlcnRpZXMiLCJwcm9wZXJ0aWVzVjEiLCJ2MSIsImRpc2FibGVEYXRhT3BlcmF0aW9uIiwiZ2V0QWxsRGF0YUZvclNhdmluZyIsImRhdGFDb250YWluZXIiLCJmbGF0dGVuRGF0YSIsIkFycm93RGF0YUNvbnRhaW5lciIsIm51bUNvbHVtbnMiLCJfbG9vcCIsImNvbHVtbkluZGV4IiwiY29sdW1uIiwiZ2V0Q29sdW1uIiwiZmllbGQiLCJnZXRGaWVsZCIsIkRhdGFUeXBlIiwiaXNUaW1lc3RhbXAiLCJpc0RhdGUiLCJpc1RpbWUiLCJyb3ciLCJEYXRlIiwidG9JU09TdHJpbmciLCJBTExfRklFTERfVFlQRVMiLCJnZW9hcnJvdyIsImZvcm1hdHRlciIsIkZJRUxEX0RJU1BMQVlfRk9STUFUIiwiZ2V0RmllbGRzRm9yU2F2aW5nIiwiZ2VvanNvbiIsIkRhdGFzZXRTY2hlbWEiLCJfU2NoZW1hMiIsIl90aGlzMiIsIl9sZW4iLCJhcmdzIiwiQXJyYXkiLCJfa2V5IiwiY29uY2F0IiwiZGF0YXNldCIsImRhdGFzZXRGbGF0dGVuZWQiLCJEQVRBU0VUX0ZPUk1BVFMiLCJ1cGRhdGVkRmllbGRzIiwibmVlZENhbGN1bGF0ZU1ldGEiLCJmaWVsZE9yZGVyIiwic2FtcGxlRGF0YSIsImdldFNhbXBsZUZvclR5cGVBbmFseXplIiwicm93cyIsIm1ldGEiLCJnZXRGaWVsZHNGcm9tRGF0YSIsInBpY2siLCJnbG9iYWxDb25zb2xlIiwid2FybiIsImRhdGEiLCJpbmZvIiwiZGF0YXNldFNjaGVtYSIsIl9kZWZhdWx0Il0sInNvdXJjZXMiOlsiLi4vc3JjL2RhdGFzZXQtc2NoZW1hLnRzIl0sInNvdXJjZXNDb250ZW50IjpbIi8vIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBNSVRcbi8vIENvcHlyaWdodCBjb250cmlidXRvcnMgdG8gdGhlIGtlcGxlci5nbCBwcm9qZWN0XG5cbmltcG9ydCBwaWNrIGZyb20gJ2xvZGFzaC9waWNrJztcbmltcG9ydCB7Y29uc29sZSBhcyBnbG9iYWxDb25zb2xlfSBmcm9tICdnbG9iYWwvd2luZG93JztcbmltcG9ydCAqIGFzIGFycm93IGZyb20gJ2FwYWNoZS1hcnJvdyc7XG5cbmltcG9ydCB7QUxMX0ZJRUxEX1RZUEVTLCBEQVRBU0VUX0ZPUk1BVFN9IGZyb20gJ0BrZXBsZXIuZ2wvY29uc3RhbnRzJztcbmltcG9ydCB7UHJvdG9EYXRhc2V0LCBSR0JDb2xvciwgSnNvbk9iamVjdH0gZnJvbSAnQGtlcGxlci5nbC90eXBlcyc7XG5pbXBvcnQge0tlcGxlclRhYmxlfSBmcm9tICdAa2VwbGVyLmdsL3RhYmxlJztcbmltcG9ydCB7VkVSU0lPTlN9IGZyb20gJy4vdmVyc2lvbnMnO1xuaW1wb3J0IFNjaGVtYSBmcm9tICcuL3NjaGVtYSc7XG5pbXBvcnQge2dldEZpZWxkc0Zyb21EYXRhLCBnZXRTYW1wbGVGb3JUeXBlQW5hbHl6ZX0gZnJvbSAnQGtlcGxlci5nbC9jb21tb24tdXRpbHMnO1xuaW1wb3J0IHtBcnJvd0RhdGFDb250YWluZXIsIERhdGFDb250YWluZXJJbnRlcmZhY2UsIEZJRUxEX0RJU1BMQVlfRk9STUFUfSBmcm9tICdAa2VwbGVyLmdsL3V0aWxzJztcblxuZXhwb3J0IHR5cGUgU2F2ZWRGaWVsZCA9IHtcbiAgbmFtZTogc3RyaW5nO1xuICB0eXBlOiBzdHJpbmc7XG4gIGZvcm1hdD86IHN0cmluZztcbiAgYW5hbHl6ZXJUeXBlPzogc3RyaW5nO1xufTtcblxuZXhwb3J0IHR5cGUgUGFyc2VkRmllbGQgPSB7XG4gIG5hbWU6IHN0cmluZztcbiAgdHlwZTogc3RyaW5nO1xuICBmb3JtYXQ6IHN0cmluZztcbiAgYW5hbHl6ZXJUeXBlOiBzdHJpbmc7XG59O1xuXG5leHBvcnQgdHlwZSBTYXZlZERhdGFzZXRWMSA9IHtcbiAgdmVyc2lvbjogJ3YxJztcbiAgZGF0YToge1xuICAgIGlkOiBzdHJpbmc7XG4gICAgbGFiZWw6IHN0cmluZztcbiAgICBjb2xvcjogUkdCQ29sb3I7XG4gICAgYWxsRGF0YTogYW55W11bXTtcbiAgICBmaWVsZHM6IFNhdmVkRmllbGRbXTtcbiAgICB0eXBlPzogc3RyaW5nO1xuICAgIG1ldGFkYXRhPzogSnNvbk9iamVjdDtcbiAgICBkaXNhYmxlRGF0YU9wZXJhdGlvbj86IGJvb2xlYW47XG4gIH07XG59O1xuXG5leHBvcnQgdHlwZSBQYXJzZWREYXRhc2V0ID0ge1xuICBkYXRhOiB7XG4gICAgZmllbGRzOiBQYXJzZWRGaWVsZFtdO1xuICAgIHJvd3M6IGFueVtdW107XG4gIH07XG4gIGluZm86IHtcbiAgICBpZD86IHN0cmluZztcbiAgICBsYWJlbD86IHN0cmluZztcbiAgICBjb2xvcj86IFJHQkNvbG9yO1xuICB9O1xufTtcblxuLy8gdmVyc2lvbiB2MFxuZXhwb3J0IGNvbnN0IGZpZWxkUHJvcGVydGllc1YwID0ge1xuICBuYW1lOiBudWxsLFxuICB0eXBlOiBudWxsXG59O1xuXG5leHBvcnQgY29uc3QgZmllbGRQcm9wZXJ0aWVzVjEgPSB7XG4gIG5hbWU6IG51bGwsXG4gIHR5cGU6IG51bGwsXG4gIGZvcm1hdDogbnVsbCxcbiAgYW5hbHl6ZXJUeXBlOiBudWxsLFxuICBtZXRhZGF0YTogbnVsbFxufTtcblxuZXhwb3J0IGNsYXNzIEZpZWxkU2NoZW1hIGV4dGVuZHMgU2NoZW1hIHtcbiAgc2F2ZShmaWVsZHMpIHtcbiAgICByZXR1cm4ge1xuICAgICAgW3RoaXMua2V5XTogZmllbGRzLm1hcChmID0+IHRoaXMuc2F2ZVByb3BlcnRpZXNPckFwcGx5U2NoZW1hKGYpW3RoaXMua2V5XSlcbiAgICB9O1xuICB9XG4gIGxvYWQoZmllbGRzKSB7XG4gICAgcmV0dXJuIHtbdGhpcy5rZXldOiBmaWVsZHN9O1xuICB9XG59XG5cbmV4cG9ydCBjb25zdCBwcm9wZXJ0aWVzVjAgPSB7XG4gIGlkOiBudWxsLFxuICBsYWJlbDogbnVsbCxcbiAgY29sb3I6IG51bGwsXG4gIGFsbERhdGE6IG51bGwsXG4gIGZpZWxkczogbmV3IEZpZWxkU2NoZW1hKHtcbiAgICBrZXk6ICdmaWVsZHMnLFxuICAgIHZlcnNpb246IFZFUlNJT05TLnYwLFxuICAgIHByb3BlcnRpZXM6IGZpZWxkUHJvcGVydGllc1YwXG4gIH0pXG59O1xuXG5leHBvcnQgY29uc3QgcHJvcGVydGllc1YxID0ge1xuICAuLi5wcm9wZXJ0aWVzVjAsXG4gIGZpZWxkczogbmV3IEZpZWxkU2NoZW1hKHtcbiAgICBrZXk6ICdmaWVsZHMnLFxuICAgIHZlcnNpb246IFZFUlNJT05TLnYxLFxuICAgIHByb3BlcnRpZXM6IGZpZWxkUHJvcGVydGllc1YxXG4gIH0pLFxuICB0eXBlOiBudWxsLFxuICBtZXRhZGF0YTogbnVsbCxcbiAgZGlzYWJsZURhdGFPcGVyYXRpb246IG51bGxcbn07XG5cbi8qKlxuICogVE9ETyBDb25zaWRlciBtb3ZpbmcgdGhpcyBjYXN0IHRvIEFycm93RGF0YUNvbnRhaW5lcj9cbiAqIFByZXBhcmUgYSBkYXRhIGNvbnRhaW5lciBmb3IgZXhwb3J0IGFzIHBhcnQgb2YganNvbiAvIGh0bWwgZmlsZXMuXG4gKiAxKSBBcnJvdyB0YWJsZXMgY2FuIHN0b3JlIFRpbWVzdGFtcHMgYXMgQmlnSW50cywgc28gY29udmVydCBudW1iZXJzIHRvIElTT1N0cmluZ3MgY29tcGF0aWJsZSB3aXRoIEtlcGxlci5nbCdzIFRJTUVTVEFNUC5cbiAqIDIpIEdlb2Fycm93IGJpbmFyeSBidWZmZXJzIGNvbnZlcnRlZCB0byBoZXggd2tiXG4gKiBAcGFyYW0gZGF0YUNvbnRhaW5lciBBIGRhdGEgY29udGFpbmVyIHRvIGZsYXR0ZW4uXG4gKiBAcmV0dXJucyBSb3cgYmFzZWQgZGF0YS5cbiAqL1xuY29uc3QgZ2V0QWxsRGF0YUZvclNhdmluZyA9IChkYXRhQ29udGFpbmVyOiBEYXRhQ29udGFpbmVySW50ZXJmYWNlKTogYW55W11bXSA9PiB7XG4gIGNvbnN0IGFsbERhdGEgPSBkYXRhQ29udGFpbmVyLmZsYXR0ZW5EYXRhKCk7XG5cbiAgaWYgKGRhdGFDb250YWluZXIgaW5zdGFuY2VvZiBBcnJvd0RhdGFDb250YWluZXIpIHtcbiAgICBjb25zdCBudW1Db2x1bW5zID0gZGF0YUNvbnRhaW5lci5udW1Db2x1bW5zKCk7XG5cbiAgICBmb3IgKGxldCBjb2x1bW5JbmRleCA9IDA7IGNvbHVtbkluZGV4IDwgbnVtQ29sdW1uczsgKytjb2x1bW5JbmRleCkge1xuICAgICAgY29uc3QgY29sdW1uID0gZGF0YUNvbnRhaW5lci5nZXRDb2x1bW4oY29sdW1uSW5kZXgpO1xuICAgICAgY29uc3QgZmllbGQgPSBkYXRhQ29udGFpbmVyLmdldEZpZWxkKGNvbHVtbkluZGV4KTtcblxuICAgICAgaWYgKFxuICAgICAgICBhcnJvdy5EYXRhVHlwZS5pc1RpbWVzdGFtcChjb2x1bW4udHlwZSkgfHxcbiAgICAgICAgYXJyb3cuRGF0YVR5cGUuaXNEYXRlKGNvbHVtbi50eXBlKSB8fFxuICAgICAgICBhcnJvdy5EYXRhVHlwZS5pc1RpbWUoY29sdW1uLnR5cGUpXG4gICAgICApIHtcbiAgICAgICAgYWxsRGF0YS5mb3JFYWNoKHJvdyA9PiB7XG4gICAgICAgICAgcm93W2NvbHVtbkluZGV4XSA9IG5ldyBEYXRlKHJvd1tjb2x1bW5JbmRleF0pLnRvSVNPU3RyaW5nKCk7XG4gICAgICAgIH0pO1xuICAgICAgfSBlbHNlIGlmIChmaWVsZD8udHlwZSA9PT0gQUxMX0ZJRUxEX1RZUEVTLmdlb2Fycm93KSB7XG4gICAgICAgIGNvbnN0IGZvcm1hdHRlciA9IEZJRUxEX0RJU1BMQVlfRk9STUFUW0FMTF9GSUVMRF9UWVBFUy5nZW9hcnJvd107XG4gICAgICAgIGFsbERhdGEuZm9yRWFjaChyb3cgPT4ge1xuICAgICAgICAgIHJvd1tjb2x1bW5JbmRleF0gPSBmb3JtYXR0ZXIocm93W2NvbHVtbkluZGV4XSwgZmllbGQpO1xuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICByZXR1cm4gYWxsRGF0YTtcbn07XG5cbi8qKlxuICogVHJhbnNmb3JtcyBmaWVsZHMgZm9yIHNhdmluZyBhcyBwYXJ0IG9mIGpzb24gLyBodG1sIGZpbGVzLlxuICogQHBhcmFtIGZpZWxkcyBUaGUgYXJyYXkgb2YgZmllbGRzIGZyb20gYSBLZXBsZXIgdGFibGUuXG4gKiBAcmV0dXJucyBUaGUgdHJhbnNmb3JtZWQgZmllbGRzIGFycmF5IHdpdGggR2VvQXJyb3cgdHlwZXMgdXBkYXRlZCB0byBHZW9KU09OLlxuICovXG5jb25zdCBnZXRGaWVsZHNGb3JTYXZpbmcgPSAoZmllbGRzOiBLZXBsZXJUYWJsZVsnZmllbGRzJ10pID0+IHtcbiAgcmV0dXJuIGZpZWxkcy5tYXAoZmllbGQgPT4ge1xuICAgIGlmIChmaWVsZC50eXBlID09PSBBTExfRklFTERfVFlQRVMuZ2VvYXJyb3cpIHtcbiAgICAgIC8vIGdlb2Fycm93IGJpbmFyeSBkYXRhIGlzIHRyYW5zZm9ybWVkIHRvIGhleCB3a2IgaW4gZ2V0QWxsRGF0YUZvclNhdmluZywgc28gdXBkYXRlIHRoZSBmaWVsZCBhY2NvcmRpbmdseVxuICAgICAgcmV0dXJuIHtcbiAgICAgICAgbmFtZTogZmllbGQubmFtZSxcbiAgICAgICAgdHlwZTogQUxMX0ZJRUxEX1RZUEVTLmdlb2pzb24sXG4gICAgICAgIGZvcm1hdDogJycsXG4gICAgICAgIGFuYWx5emVyVHlwZTogJ0dFT01FVFJZJ1xuICAgICAgfTtcbiAgICB9XG4gICAgcmV0dXJuIGZpZWxkO1xuICB9KTtcbn07XG5cbmV4cG9ydCBjbGFzcyBEYXRhc2V0U2NoZW1hIGV4dGVuZHMgU2NoZW1hIHtcbiAga2V5ID0gJ2RhdGFzZXQnO1xuXG4gIHNhdmUoZGF0YXNldDogS2VwbGVyVGFibGUpOiBTYXZlZERhdGFzZXRWMVsnZGF0YSddIHtcbiAgICBjb25zdCBkYXRhc2V0RmxhdHRlbmVkID0gZGF0YXNldC5kYXRhQ29udGFpbmVyXG4gICAgICA/IHtcbiAgICAgICAgICAuLi5kYXRhc2V0LFxuICAgICAgICAgIGFsbERhdGE6IGdldEFsbERhdGFGb3JTYXZpbmcoZGF0YXNldC5kYXRhQ29udGFpbmVyKSxcbiAgICAgICAgICBmaWVsZHM6IGdldEZpZWxkc0ZvclNhdmluZyhkYXRhc2V0LmZpZWxkcyksXG4gICAgICAgICAgLy8gd2UgdXNlIGZsYXR0ZW5EYXRhIHRvIHNhdmUgYXJyb3cgdGFibGVzLFxuICAgICAgICAgIC8vIGJ1dCBvbmNlIGZsYXR0ZW5lZCBpdCdzIG5vdCBhbiBhcnJvdyBmaWxlIGFueW1vcmUuXG4gICAgICAgICAgbWV0YWRhdGE6IHtcbiAgICAgICAgICAgIC4uLmRhdGFzZXQubWV0YWRhdGEsXG4gICAgICAgICAgICAuLi4oZGF0YXNldC5tZXRhZGF0YS5mb3JtYXQgPT09IERBVEFTRVRfRk9STUFUUy5hcnJvd1xuICAgICAgICAgICAgICA/IHtmb3JtYXQ6IERBVEFTRVRfRk9STUFUUy5yb3d9XG4gICAgICAgICAgICAgIDoge30pXG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICA6IGRhdGFzZXQ7XG5cbiAgICByZXR1cm4gdGhpcy5zYXZlUHJvcGVydGllc09yQXBwbHlTY2hlbWEoZGF0YXNldEZsYXR0ZW5lZClbdGhpcy5rZXldO1xuICB9XG4gIGxvYWQoZGF0YXNldDogU2F2ZWREYXRhc2V0VjFbJ2RhdGEnXSk6IFByb3RvRGF0YXNldCB7XG4gICAgY29uc3Qge2ZpZWxkcywgYWxsRGF0YX0gPSBkYXRhc2V0O1xuICAgIGxldCB1cGRhdGVkRmllbGRzID0gZmllbGRzO1xuXG4gICAgLy8gcmVjYWxjdWxhdGUgZmllbGQgdHlwZVxuICAgIC8vIGJlY2F1c2Ugd2UgaGF2ZSB1cGRhdGVkIHR5cGUtYW5hbHl6ZXJcbiAgICAvLyB3ZSBuZWVkIHRvIGFkZCBmb3JtYXQgdG8gZWFjaCBmaWVsZFxuICAgIGNvbnN0IG5lZWRDYWxjdWxhdGVNZXRhID1cbiAgICAgIGZpZWxkc1swXSAmJlxuICAgICAgKCFPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwoZmllbGRzWzBdLCAnZm9ybWF0JykgfHxcbiAgICAgICAgIU9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChmaWVsZHNbMF0sICdhbmFseXplclR5cGUnKSk7XG5cbiAgICBpZiAobmVlZENhbGN1bGF0ZU1ldGEpIHtcbiAgICAgIGNvbnN0IGZpZWxkT3JkZXIgPSBmaWVsZHMubWFwKGYgPT4gZi5uYW1lKTtcblxuICAgICAgY29uc3Qgc2FtcGxlRGF0YSA9IGdldFNhbXBsZUZvclR5cGVBbmFseXplKHtcbiAgICAgICAgZmllbGRzOiBmaWVsZE9yZGVyLFxuICAgICAgICByb3dzOiBhbGxEYXRhXG4gICAgICB9KTtcbiAgICAgIGNvbnN0IG1ldGEgPSBnZXRGaWVsZHNGcm9tRGF0YShzYW1wbGVEYXRhLCBmaWVsZE9yZGVyKTtcblxuICAgICAgdXBkYXRlZEZpZWxkcyA9IG1ldGEubWFwKChmLCBpKSA9PiAoe1xuICAgICAgICAuLi5waWNrKG1ldGFbaV0sIFsnbmFtZScsICd0eXBlJywgJ2Zvcm1hdCddKSxcbiAgICAgICAgYW5hbHl6ZXJUeXBlOiBtZXRhW2ldLmFuYWx5emVyVHlwZVxuICAgICAgfSkpO1xuXG4gICAgICB1cGRhdGVkRmllbGRzLmZvckVhY2goKGYsIGkpID0+IHtcbiAgICAgICAgaWYgKGZpZWxkc1tpXS50eXBlICE9PSBmLnR5cGUpIHtcbiAgICAgICAgICAvLyBpZiBuZXdseSBkZXRlY3RlZCBmaWVsZCB0eXBlIGlzIGRpZmZlcmVudCBmcm9tIHNhdmVkIHR5cGVcbiAgICAgICAgICAvLyB3ZSBsb2cgaXQgYnV0IHdvbid0IHVwZGF0ZSBpdCwgY2F1c2Ugd2UgZG9uJ3Qgd2FudCB0byBicmVhayBwZW9wbGUncyBtYXBcbiAgICAgICAgICBnbG9iYWxDb25zb2xlLndhcm4oYGRldGVjdCAke2YubmFtZX0gdHlwZSBpcyBub3cgJHtmLnR5cGV9IGluc3RlYWQgb2YgJHtmaWVsZHNbaV0udHlwZX1gKTtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgfVxuXG4gICAgLy8gZ2V0IGZvcm1hdCBvZiBhbGwgZmllbGRzXG4gICAgcmV0dXJuIHtcbiAgICAgIGRhdGE6IHtmaWVsZHM6IHVwZGF0ZWRGaWVsZHMsIHJvd3M6IGRhdGFzZXQuYWxsRGF0YX0sXG4gICAgICBpbmZvOiBwaWNrKGRhdGFzZXQsIFsnaWQnLCAnbGFiZWwnLCAnY29sb3InLCAndHlwZSddKSxcbiAgICAgIC4uLihkYXRhc2V0Lm1ldGFkYXRhID8ge21ldGFkYXRhOiBkYXRhc2V0Lm1ldGFkYXRhfSA6IHt9KSxcbiAgICAgIC4uLihkYXRhc2V0LmRpc2FibGVEYXRhT3BlcmF0aW9uID8ge2Rpc2FibGVEYXRhT3BlcmF0aW9uOiBkYXRhc2V0LmRpc2FibGVEYXRhT3BlcmF0aW9ufSA6IHt9KVxuICAgIH07XG4gIH1cbn1cblxuZXhwb3J0IGNvbnN0IGRhdGFzZXRTY2hlbWEgPSB7XG4gIFtWRVJTSU9OUy52MF06IG5ldyBEYXRhc2V0U2NoZW1hKHtcbiAgICBrZXk6ICdkYXRhc2V0JyxcbiAgICB2ZXJzaW9uOiBWRVJTSU9OUy52MCxcbiAgICBwcm9wZXJ0aWVzOiBwcm9wZXJ0aWVzVjBcbiAgfSksXG4gIFtWRVJTSU9OUy52MV06IG5ldyBEYXRhc2V0U2NoZW1hKHtcbiAgICBrZXk6ICdkYXRhc2V0JyxcbiAgICB2ZXJzaW9uOiBWRVJTSU9OUy52MSxcbiAgICBwcm9wZXJ0aWVzOiBwcm9wZXJ0aWVzVjFcbiAgfSlcbn07XG5cbmV4cG9ydCBkZWZhdWx0IGRhdGFzZXRTY2hlbWE7XG4iXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7O0FBR0EsSUFBQUEsS0FBQSxHQUFBQyxzQkFBQSxDQUFBQyxPQUFBO0FBQ0EsSUFBQUMsT0FBQSxHQUFBRCxPQUFBO0FBQ0EsSUFBQUUsS0FBQSxHQUFBQyx1QkFBQSxDQUFBSCxPQUFBO0FBRUEsSUFBQUksVUFBQSxHQUFBSixPQUFBO0FBR0EsSUFBQUssU0FBQSxHQUFBTCxPQUFBO0FBQ0EsSUFBQU0sT0FB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QUM5QixJQUFJMkMsTUFBTSxDQUFDM0MsQ0FBQyxDQUFDLENBQUM4QixJQUFJLEtBQUtnQixDQUFDLENBQUNoQixJQUFJLEVBQUU7WUFDN0I7WUFDQTtZQUNBNEUsZUFBYSxDQUFDQyxJQUFJLFdBQUFkLE1BQUEsQ0FBVy9DLENBQUMsQ0FBQ2pCLElBQUksbUJBQUFnRSxNQUFBLENBQWdCL0MsQ0FBQyxDQUFDaEIsSUFBSSxrQkFBQStELE1BQUEsQ0FBZWxELE1BQU0sQ0FBQzNDLENBQUMsQ0FBQyxDQUFDOEIsSUFBSSxDQUFFLENBQUM7VUFDM0Y7UUFDRixDQUFDLENBQUM7TUFDSjs7TUFFQTtNQUNBLE9BQUFwQixhQUFBLENBQUFBLGFBQUE7UUFDRWtHLElBQUksRUFBRTtVQUFDakUsTUFBTSxFQUFFc0QsYUFBYTtVQUFFSyxJQUFJLEVBQUVSLE9BQU8sQ0FBQ3hDO1FBQU8sQ0FBQztRQUNwRHVELElBQUksRUFBRSxJQUFBSixnQkFBSSxFQUFDWCxPQUFPLEVBQUUsQ0FBQyxJQUFJLEVBQUUsT0FBTyxFQUFFLE9BQU8sRUFBRSxNQUFNLENBQUM7TUFBQyxHQUNqREEsT0FBTyxDQUFDNUQsUUFBUSxHQUFHO1FBQUNBLFFBQVEsRUFBRTRELE9BQU8sQ0FBQzVEO01BQVEsQ0FBQyxHQUFHLENBQUMsQ0FBQyxHQUNwRDRELE9BQU8sQ0FBQ2pDLG9CQUFvQixHQUFHO1FBQUNBLG9CQUFvQixFQUFFaUMsT0FBTyxDQUFDakM7TUFBb0IsQ0FBQyxHQUFHLENBQUMsQ0FBQztJQUVoRztFQUFDO0FBQUEsRUFoRWdDWixrQkFBTTtBQW1FbEMsSUFBTTZELGFBQWEsR0FBQWxGLE9BQUEsQ0FBQWtGLGFBQUEsT0FBQWhHLGdCQUFBLGlCQUFBQSxnQkFBQSxpQkFDdkIwQyxrQkFBUSxDQUFDQyxFQUFFLEVBQUcsSUFBSTZCLGFBQWEsQ0FBQztFQUMvQjlDLEdBQUcsRUFBRSxTQUFTO0VBQ2RlLE9BQU8sRUFBRUMsa0JBQVEsQ0FBQ0MsRUFBRTtFQUNwQkMsVUFBVSxFQUFFUjtBQUNkLENBQUMsQ0FBQyxHQUNETSxrQkFBUSxDQUFDSSxFQUFFLEVBQUcsSUFBSTBCLGFBQWEsQ0FBQztFQUMvQjlDLEdBQUcsRUFBRSxTQUFTO0VBQ2RlLE9BQU8sRUFBRUMsa0JBQVEsQ0FBQ0ksRUFBRTtFQUNwQkYsVUFBVSxFQUFFQztBQUNkLENBQUMsQ0FBQyxDQUNIO0FBQUMsSUFBQW9ELFFBQUEsR0FBQW5GLE9BQUEsY0FFYWtGLGFBQWEiLCJpZ25vcmVMaXN0IjpbXX0=
;