kepler.gl.geoiq
Version:
kepler.gl is a webgl based application to visualize large scale location data in the browser
505 lines (421 loc) • 54.6 kB
JavaScript
"use strict";
var _interopRequireWildcard = require("@babel/runtime/helpers/interopRequireWildcard");
var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
Object.defineProperty(exports, "__esModule", {
value: true
});
exports.AggregationTypeSelector = exports.WidgetAggregationSelectors = exports.AggrColorScaleSelector = exports.ChannelByValueSelector = exports.ColorRangeConfig = exports.ArcLayerColorSelector = exports.LayerColorSelector = exports.HowToButton = exports["default"] = void 0;
var _extends2 = _interopRequireDefault(require("@babel/runtime/helpers/extends"));
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 _getPrototypeOf3 = _interopRequireDefault(require("@babel/runtime/helpers/getPrototypeOf"));
var _assertThisInitialized2 = _interopRequireDefault(require("@babel/runtime/helpers/assertThisInitialized"));
var _inherits2 = _interopRequireDefault(require("@babel/runtime/helpers/inherits"));
var _defineProperty2 = _interopRequireDefault(require("@babel/runtime/helpers/defineProperty"));
var _taggedTemplateLiteral2 = _interopRequireDefault(require("@babel/runtime/helpers/taggedTemplateLiteral"));
var _react = _interopRequireWildcard(require("react"));
var _propTypes = _interopRequireDefault(require("prop-types"));
var _styledComponents = _interopRequireDefault(require("styled-components"));
var _styledComponents2 = require("../../common/styled-components");
var _itemSelector = _interopRequireDefault(require("../../common/item-selector/item-selector"));
var _visConfigByFieldSelector = _interopRequireDefault(require("./vis-config-by-field-selector"));
var _layerTypeSelector = _interopRequireDefault(require("./layer-type-selector"));
var _dimensionScaleSelector = _interopRequireDefault(require("./dimension-scale-selector"));
var _colorSelector = _interopRequireDefault(require("./color-selector"));
var _sourceDataSelector = _interopRequireDefault(require("../source-data-selector"));
var _layerConfigGroup = _interopRequireWildcard(require("./layer-config-group"));
var _widgetLayerSelector = _interopRequireDefault(require("./widget-layer-selector"));
var _widgetAggregationSelector = _interopRequireDefault(require("./widget-aggregation-selector"));
var _widgetFieldSelector = _interopRequireDefault(require("./widget-field-selector"));
var _widgetConfigGroup = _interopRequireDefault(require("./widget-config-group"));
var _utils = require("../../../utils/utils");
var _defaultSettings = require("../../../constants/default-settings");
function _templateObject3() {
var data = (0, _taggedTemplateLiteral2["default"])(["\n position: absolute;\n right: 12px;\n top: -4px;\n"]);
_templateObject3 = function _templateObject3() {
return data;
};
return data;
}
function ownKeys(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); if (enumerableOnly) symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; }); keys.push.apply(keys, symbols); } return keys; }
function _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i] != null ? arguments[i] : {}; if (i % 2) { ownKeys(Object(source), true).forEach(function (key) { (0, _defineProperty2["default"])(target, key, source[key]); }); } else if (Object.getOwnPropertyDescriptors) { Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)); } else { ownKeys(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } } return target; }
function _templateObject2() {
var data = (0, _taggedTemplateLiteral2["default"])(["\n margin-top: 12px;\n"]);
_templateObject2 = function _templateObject2() {
return data;
};
return data;
}
function _templateObject() {
var data = (0, _taggedTemplateLiteral2["default"])(["\n position: relative;\n margin-top: 12px;\n"]);
_templateObject = function _templateObject() {
return data;
};
return data;
}
// import files from '../../../../dist/components/common/icons/files';
// import layerPanel from '../../../../dist/components/side-panel/layer-panel/layer-panel';
var StyledLayerConfigurator = _styledComponents["default"].div.attrs({
className: 'layer-panel__config'
})(_templateObject());
var StyledWidgetVisualConfigurator = _styledComponents["default"].div.attrs({
className: 'layer-panel__config__visualC-config'
})(_templateObject2());
var WidgetConfigurator =
/*#__PURE__*/
function (_Component) {
(0, _inherits2["default"])(WidgetConfigurator, _Component);
function WidgetConfigurator() {
var _getPrototypeOf2;
var _this;
(0, _classCallCheck2["default"])(this, WidgetConfigurator);
for (var _len = arguments.length, args = new Array(_len), _key = 0; _key < _len; _key++) {
args[_key] = arguments[_key];
}
_this = (0, _possibleConstructorReturn2["default"])(this, (_getPrototypeOf2 = (0, _getPrototypeOf3["default"])(WidgetConfigurator)).call.apply(_getPrototypeOf2, [this].concat(args)));
(0, _defineProperty2["default"])((0, _assertThisInitialized2["default"])(_this), "_findLayerIdx", function (layers, id) {
// console.log('inside_findLayerIdx', layers, id);
layers.map(function (key, lidget) {
if (lidget.id === id) {// console.log(key);
}
});
});
return _this;
}
(0, _createClass2["default"])(WidgetConfigurator, [{
key: "_renderFunctionWidgetConfig",
value: function _renderFunctionWidgetConfig(props) {
return this._renderAggregationWidgetConfig(props);
}
}, {
key: "_renderAggregationWidgetConfig",
value: function _renderAggregationWidgetConfig(_ref) {
var _this2 = this;
var layers = _ref.layers,
widget = _ref.widget,
datasets = _ref.datasets,
dataId = _ref.dataId,
widgetConfiguratorProps = _ref.widgetConfiguratorProps;
var _ref2 = widget.config.dataId ? datasets[widget.config.dataId] : {},
fields = _ref2.fields;
return _react["default"].createElement(StyledWidgetVisualConfigurator, null, _react["default"].createElement(_layerConfigGroup["default"], {
label: 'layer'
}, _react["default"].createElement(_widgetLayerSelector["default"], {
widget: widget,
layers: layers,
dataId: dataId,
onSelect: function onSelect(value) {
return _this2.props.updateLayerConfig({
selectedLayer: value
});
}
})), _react["default"].createElement(_layerConfigGroup["default"], {
label: 'Aggregation'
}, _react["default"].createElement(_widgetAggregationSelector["default"], (0, _extends2["default"])({
widget: widget
}, widgetConfiguratorProps)), widget.config.aggregationType ? widget.config.aggregationType === 'count' ? null : _react["default"].createElement(_widgetFieldSelector["default"], {
fields: fields,
widget: widget,
placeholder: 'empty',
onChange: this.props.updateLayerConfig
}) : null), _react["default"].createElement(_widgetConfigGroup["default"], (0, _extends2["default"])({
label: 'Dynamic',
property: 'bounds',
description: 'Calculation on the basis of bounds of map on screen'
}, widgetConfiguratorProps)));
}
}, {
key: "_renderCategoryWidgetConfig",
value: function _renderCategoryWidgetConfig(props) {
return this._renderCategoryConfig(props);
}
}, {
key: "_renderCategoryConfig",
value: function _renderCategoryConfig(_ref3) {
var _this3 = this;
var layers = _ref3.layers,
widget = _ref3.widget,
datasets = _ref3.datasets,
dataId = _ref3.dataId,
widgetConfiguratorProps = _ref3.widgetConfiguratorProps;
var _ref4 = widget.config.dataId ? datasets[widget.config.dataId] : {},
fields = _ref4.fields;
return _react["default"].createElement(StyledWidgetVisualConfigurator, null, _react["default"].createElement(_layerConfigGroup["default"], {
label: 'layer'
}, _react["default"].createElement(_widgetLayerSelector["default"], {
widget: widget,
layers: layers,
dataId: dataId,
onSelect: function onSelect(value) {
return _this3.props.updateLayerConfig({
selectedLayer: value
});
}
})), _react["default"].createElement(_layerConfigGroup["default"], {
label: 'Categorize by'
}, _react["default"].createElement(_widgetFieldSelector["default"], {
fields: fields,
widget: widget,
placeholder: 'empty',
type: 'category',
onChange: this.props.updateLayerConfig
})), _react["default"].createElement(_layerConfigGroup["default"], {
label: 'Aggregation'
}, _react["default"].createElement(_widgetAggregationSelector["default"], (0, _extends2["default"])({
widget: widget
}, widgetConfiguratorProps)), widget.config.aggregationType ? widget.config.aggregationType === 'count' ? null : _react["default"].createElement(_widgetFieldSelector["default"], {
fields: fields,
widget: widget,
placeholder: 'empty',
onChange: this.props.updateLayerConfig
}) : null), _react["default"].createElement(_widgetConfigGroup["default"], (0, _extends2["default"])({
label: 'Dynamic',
property: 'bounds',
description: 'Calculation on the basis of bounds of map on screen'
}, widgetConfiguratorProps)));
}
}, {
key: "render",
value: function render() {
var _this4 = this;
var _this$props = this.props,
widget = _this$props.widget,
layers = _this$props.layers,
datasets = _this$props.datasets,
updateLayerConfig = _this$props.updateLayerConfig,
widgetTypeOptions = _this$props.widgetTypeOptions,
updateLayerType = _this$props.updateLayerType;
var _ref5 = widget.config.dataId ? datasets[widget.config.dataId] : {},
_ref5$fields = _ref5.fields,
fields = _ref5$fields === void 0 ? [] : _ref5$fields;
var config = widget.config;
var dataId = config.dataId;
var commonConfigProp = {
widget: widget,
fields: fields
};
var visConfiguratorProps = _objectSpread({}, commonConfigProp, {
onChange: this.props.updateLayerVisConfig
});
var widgetConfiguratorProps = _objectSpread({}, commonConfigProp, {
onChange: updateLayerConfig
});
var layerChannelConfigProps = _objectSpread({}, commonConfigProp, {
onChange: this.props.updateLayerVisualChannelConfig
});
var renderTemplate = widget.type && "_render".concat((0, _utils.capitalizeFirstLetter)(widget.type), "WidgetConfig"); // console.log('layer inside widget-configurator', layer);
return _react["default"].createElement(StyledLayerConfigurator, null, widget.layerInfoModal ? _react["default"].createElement(HowToButton, {
onClick: function onClick() {
return _this4.props.openModal(widget.layerInfoModal);
}
}) : null, _react["default"].createElement(_layerConfigGroup["default"], {
label: 'basic',
collapsible: true,
expanded: Object.keys(datasets).length > 1 && widget.type
}, _react["default"].createElement(_layerTypeSelector["default"], {
layer: widget,
widgetTypeOptions: widgetTypeOptions,
onSelect: updateLayerType
}), _react["default"].createElement(_layerConfigGroup.ConfigGroupCollapsibleContent, null, Object.keys(datasets).length > 1 && _react["default"].createElement(_sourceDataSelector["default"], {
datasets: datasets,
id: widget.id,
disabled: widget.tyep && config.selectedField,
dataId: config.dataId,
onSelect: function onSelect(value) {
return updateLayerConfig({
dataId: value,
aggregationType: null,
selectedLayer: null,
aggregatedData: null
});
}
}))), this[renderTemplate] && this[renderTemplate]({
widget: widget,
layers: layers,
datasets: datasets,
dataId: dataId,
visConfiguratorProps: visConfiguratorProps,
layerChannelConfigProps: layerChannelConfigProps,
widgetConfiguratorProps: widgetConfiguratorProps
}));
}
}]);
return WidgetConfigurator;
}(_react.Component);
/*
* Componentize config component into pure functional components
*/
exports["default"] = WidgetConfigurator;
(0, _defineProperty2["default"])(WidgetConfigurator, "propTypes", {
widget: _propTypes["default"].object.isRequired,
datasets: _propTypes["default"].object.isRequired,
widgetTypeOptions: _propTypes["default"].arrayOf(_propTypes["default"].any).isRequired,
openModal: _propTypes["default"].func.isRequired,
updateLayerConfig: _propTypes["default"].func.isRequired,
updateLayerType: _propTypes["default"].func.isRequired,
updateLayerVisConfig: _propTypes["default"].func.isRequired,
updateLayerVisualChannelConfig: _propTypes["default"].func.isRequired
});
var StyledHowToButton = _styledComponents["default"].div(_templateObject3());
var HowToButton = function HowToButton(_ref6) {
var onClick = _ref6.onClick;
return _react["default"].createElement(StyledHowToButton, null, _react["default"].createElement(_styledComponents2.Button, {
link: true,
small: true,
onClick: onClick
}, "How to"));
};
exports.HowToButton = HowToButton;
var LayerColorSelector = function LayerColorSelector(_ref7) {
var layer = _ref7.layer,
onChange = _ref7.onChange;
return _react["default"].createElement(_styledComponents2.SidePanelSection, {
disabled: layer.config.colorField
}, _react["default"].createElement(_colorSelector["default"], {
colorSets: [{
selectedColor: layer.config.color,
setColor: function setColor(rgbValue) {
return onChange({
color: rgbValue
});
}
}]
}));
};
exports.LayerColorSelector = LayerColorSelector;
var ArcLayerColorSelector = function ArcLayerColorSelector(_ref8) {
var layer = _ref8.layer,
onChangeConfig = _ref8.onChangeConfig,
onChangeVisConfig = _ref8.onChangeVisConfig;
return _react["default"].createElement(_styledComponents2.SidePanelSection, null, _react["default"].createElement(_colorSelector["default"], {
colorSets: [{
selectedColor: layer.config.color,
setColor: function setColor(rgbValue) {
return onChangeConfig({
color: rgbValue
});
},
label: 'Source'
}, {
selectedColor: layer.config.visConfig.targetColor || layer.config.color,
setColor: function setColor(rgbValue) {
return onChangeVisConfig({
targetColor: rgbValue
});
},
label: 'Target'
}]
}));
};
exports.ArcLayerColorSelector = ArcLayerColorSelector;
var ColorRangeConfig = function ColorRangeConfig(_ref9) {
var layer = _ref9.layer,
onChange = _ref9.onChange;
return _react["default"].createElement(_styledComponents2.SidePanelSection, null, _react["default"].createElement(_colorSelector["default"], {
colorSets: [{
selectedColor: layer.config.visConfig.colorRange,
isRange: true,
setColor: function setColor(colorRange) {
return onChange({
colorRange: colorRange
});
}
}]
}));
};
exports.ColorRangeConfig = ColorRangeConfig;
var ChannelByValueSelector = function ChannelByValueSelector(_ref10) {
var widget = _ref10.widget,
channel = _ref10.channel,
onChange = _ref10.onChange,
fields = _ref10.fields,
description = _ref10.description;
var channelScaleType = channel.channelScaleType,
domain = channel.domain,
field = channel.field,
key = channel.key,
property = channel.property,
range = channel.range,
scale = channel.scale,
defaultMeasure = channel.defaultMeasure,
supportedFieldTypes = channel.supportedFieldTypes;
var channelSupportedFieldTypes = supportedFieldTypes || _defaultSettings.CHANNEL_SCALE_SUPPORTED_FIELDS[channelScaleType];
var supportedFields = fields.filter(function (_ref11) {
var type = _ref11.type;
return channelSupportedFieldTypes.includes(type);
});
var scaleOptions = widget.getScaleOptions(channel.key);
var showScale = !widget.isAggregated && widget.config[scale] && scaleOptions.length > 1;
var defaultDescription = "Calculate ".concat(property, " based on selected field");
return _react["default"].createElement(_visConfigByFieldSelector["default"], {
channel: channel.key,
description: description || defaultDescription,
domain: widget.config[domain],
fields: supportedFields,
id: widget.id,
key: "".concat(key, "-channel-selector"),
property: property,
placeholder: defaultMeasure || 'Select a field',
range: widget.config.visConfig[range],
scaleOptions: scaleOptions,
scaleType: scale ? widget.config[scale] : null,
selectedField: widget.config[field],
showScale: showScale,
updateField: function updateField(val) {
return onChange((0, _defineProperty2["default"])({}, field, val), key);
},
updateScale: function updateScale(val) {
return onChange((0, _defineProperty2["default"])({}, scale, val), key);
}
});
};
exports.ChannelByValueSelector = ChannelByValueSelector;
var AggrColorScaleSelector = function AggrColorScaleSelector(_ref12) {
var layer = _ref12.layer,
onChange = _ref12.onChange;
var scaleOptions = layer.getScaleOptions('color');
return Array.isArray(scaleOptions) && scaleOptions.length > 1 ? _react["default"].createElement(_dimensionScaleSelector["default"], {
label: "Color Scale",
options: scaleOptions,
scaleType: layer.config.colorScale,
onSelect: function onSelect(val) {
return onChange({
colorScale: val
}, 'color');
}
}) : null;
};
exports.AggrColorScaleSelector = AggrColorScaleSelector;
var WidgetAggregationSelectors = function WidgetAggregationSelectors() {
return _react["default"].createElement(_layerConfigGroup["default"], {
label: 'Aggregation',
collapsible: true
});
};
exports.WidgetAggregationSelectors = WidgetAggregationSelectors;
var AggregationTypeSelector = function AggregationTypeSelector(_ref13) {
var widget = _ref13.widget,
channel = _ref13.channel,
_onChange3 = _ref13.onChange;
var field = channel.field,
aggregation = channel.aggregation,
key = channel.key;
var selectedField = widget.config[field];
var visConfig = widget.config.visConfig; // aggregation should only be selectable when field is selected
var aggregationOptions = widget.getAggregationOptions(key);
return _react["default"].createElement(_styledComponents2.SidePanelSection, null, _react["default"].createElement(_styledComponents2.PanelLabel, null, "Aggregate ".concat(selectedField.name, " by")), _react["default"].createElement(_itemSelector["default"], {
selectedItems: visConfig[aggregation],
options: aggregationOptions,
multiSelect: false,
searchable: false,
onChange: function onChange(value) {
return _onChange3({
visConfig: _objectSpread({}, widget.config.visConfig, (0, _defineProperty2["default"])({}, aggregation, value))
}, channel.key);
}
}));
};
/* eslint-enable max-params */
exports.AggregationTypeSelector = AggregationTypeSelector;
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3NyYy9jb21wb25lbnRzL3NpZGUtcGFuZWwvd2lkZ2V0LXBhbmVsL3dpZGdldC1jb25maWd1cmF0b3IuanMiXSwibmFtZXMiOlsiU3R5bGVkTGF5ZXJDb25maWd1cmF0b3IiLCJzdHlsZWQiLCJkaXYiLCJhdHRycyIsImNsYXNzTmFtZSIsIlN0eWxlZFdpZGdldFZpc3VhbENvbmZpZ3VyYXRvciIsIldpZGdldENvbmZpZ3VyYXRvciIsImxheWVycyIsImlkIiwibWFwIiwia2V5IiwibGlkZ2V0IiwicHJvcHMiLCJfcmVuZGVyQWdncmVnYXRpb25XaWRnZXRDb25maWciLCJ3aWRnZXQiLCJkYXRhc2V0cyIsImRhdGFJZCIsIndpZGdldENvbmZpZ3VyYXRvclByb3BzIiwiY29uZmlnIiwiZmllbGRzIiwidmFsdWUiLCJ1cGRhdGVMYXllckNvbmZpZyIsInNlbGVjdGVkTGF5ZXIiLCJhZ2dyZWdhdGlvblR5cGUiLCJfcmVuZGVyQ2F0ZWdvcnlDb25maWciLCJ3aWRnZXRUeXBlT3B0aW9ucyIsInVwZGF0ZUxheWVyVHlwZSIsImNvbW1vbkNvbmZpZ1Byb3AiLCJ2aXNDb25maWd1cmF0b3JQcm9wcyIsIm9uQ2hhbmdlIiwidXBkYXRlTGF5ZXJWaXNDb25maWciLCJsYXllckNoYW5uZWxDb25maWdQcm9wcyIsInVwZGF0ZUxheWVyVmlzdWFsQ2hhbm5lbENvbmZpZyIsInJlbmRlclRlbXBsYXRlIiwidHlwZSIsImxheWVySW5mb01vZGFsIiwib3Blbk1vZGFsIiwiT2JqZWN0Iiwia2V5cyIsImxlbmd0aCIsInR5ZXAiLCJzZWxlY3RlZEZpZWxkIiwiYWdncmVnYXRlZERhdGEiLCJDb21wb25lbnQiLCJQcm9wVHlwZXMiLCJvYmplY3QiLCJpc1JlcXVpcmVkIiwiYXJyYXlPZiIsImFueSIsImZ1bmMiLCJTdHlsZWRIb3dUb0J1dHRvbiIsIkhvd1RvQnV0dG9uIiwib25DbGljayIsIkxheWVyQ29sb3JTZWxlY3RvciIsImxheWVyIiwiY29sb3JGaWVsZCIsInNlbGVjdGVkQ29sb3IiLCJjb2xvciIsInNldENvbG9yIiwicmdiVmFsdWUiLCJBcmNMYXllckNvbG9yU2VsZWN0b3IiLCJvbkNoYW5nZUNvbmZpZyIsIm9uQ2hhbmdlVmlzQ29uZmlnIiwibGFiZWwiLCJ2aXNDb25maWciLCJ0YXJnZXRDb2xvciIsIkNvbG9yUmFuZ2VDb25maWciLCJjb2xvclJhbmdlIiwiaXNSYW5nZSIsIkNoYW5uZWxCeVZhbHVlU2VsZWN0b3IiLCJjaGFubmVsIiwiZGVzY3JpcHRpb24iLCJjaGFubmVsU2NhbGVUeXBlIiwiZG9tYWluIiwiZmllbGQiLCJwcm9wZXJ0eSIsInJhbmdlIiwic2NhbGUiLCJkZWZhdWx0TWVhc3VyZSIsInN1cHBvcnRlZEZpZWxkVHlwZXMiLCJjaGFubmVsU3VwcG9ydGVkRmllbGRUeXBlcyIsIkNIQU5ORUxfU0NBTEVfU1VQUE9SVEVEX0ZJRUxEUyIsInN1cHBvcnRlZEZpZWxkcyIsImZpbHRlciIsImluY2x1ZGVzIiwic2NhbGVPcHRpb25zIiwiZ2V0U2NhbGVPcHRpb25zIiwic2hvd1NjYWxlIiwiaXNBZ2dyZWdhdGVkIiwiZGVmYXVsdERlc2NyaXB0aW9uIiwidmFsIiwiQWdnckNvbG9yU2NhbGVTZWxlY3RvciIsIkFycmF5IiwiaXNBcnJheSIsImNvbG9yU2NhbGUiLCJXaWRnZXRBZ2dyZWdhdGlvblNlbGVjdG9ycyIsIkFnZ3JlZ2F0aW9uVHlwZVNlbGVjdG9yIiwiYWdncmVnYXRpb24iLCJhZ2dyZWdhdGlvbk9wdGlvbnMiLCJnZXRBZ2dyZWdhdGlvbk9wdGlvbnMiLCJuYW1lIl0sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQW9CQTs7QUFDQTs7QUFDQTs7QUFFQTs7QUFLQTs7QUFFQTs7QUFDQTs7QUFDQTs7QUFDQTs7QUFDQTs7QUFDQTs7QUFHQTs7QUFDQTs7QUFDQTs7QUFDQTs7QUFFQTs7QUFFQTs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBQ0E7QUFDQTtBQUVBLElB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R0FBR3BGLE1BQU0sQ0FBQ3FGLHFCQUFQLENBQTZCekYsR0FBN0IsQ0FBM0I7QUFFQSxTQUNFLGdDQUFDLG1DQUFELFFBQ0UsZ0NBQUMsNkJBQUQsNEJBQTBCK0IsYUFBYSxDQUFDMkQsSUFBeEMsU0FERixFQUVFLGdDQUFDLHdCQUFEO0FBQ0UsSUFBQSxhQUFhLEVBQUVwQyxTQUFTLENBQUNpQyxXQUFELENBRDFCO0FBRUUsSUFBQSxPQUFPLEVBQUVDLGtCQUZYO0FBR0UsSUFBQSxXQUFXLEVBQUUsS0FIZjtBQUlFLElBQUEsVUFBVSxFQUFFLEtBSmQ7QUFLRSxJQUFBLFFBQVEsRUFBRSxrQkFBQTlFLEtBQUs7QUFBQSxhQUNiUyxVQUFRLENBQ047QUFDRW1DLFFBQUFBLFNBQVMsb0JBQ0psRCxNQUFNLENBQUNJLE1BQVAsQ0FBYzhDLFNBRFYsdUNBRU5pQyxXQUZNLEVBRVE3RSxLQUZSO0FBRFgsT0FETSxFQU9Oa0QsT0FBTyxDQUFDNUQsR0FQRixDQURLO0FBQUE7QUFMakIsSUFGRixDQURGO0FBc0JELENBOUJNO0FBK0JQIiwic291cmNlc0NvbnRlbnQiOlsiLy8gQ29weXJpZ2h0IChjKSAyMDE5IFViZXIgVGVjaG5vbG9naWVzLCBJbmMuXG4vL1xuLy8gUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nIGEgY29weVxuLy8gb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGUgXCJTb2Z0d2FyZVwiKSwgdG8gZGVhbFxuLy8gaW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24gdGhlIHJpZ2h0c1xuLy8gdG8gdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLCBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLCBhbmQvb3Igc2VsbFxuLy8gY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvIHBlcm1pdCBwZXJzb25zIHRvIHdob20gdGhlIFNvZnR3YXJlIGlzXG4vLyBmdXJuaXNoZWQgdG8gZG8gc28sIHN1YmplY3QgdG8gdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOlxuLy9cbi8vIFRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIHNoYWxsIGJlIGluY2x1ZGVkIGluXG4vLyBhbGwgY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZSBTb2Z0d2FyZS5cbi8vXG4vLyBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgXCJBUyBJU1wiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBFWFBSRVNTIE9SXG4vLyBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSxcbi8vIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT05JTkZSSU5HRU1FTlQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRVxuLy8gQVVUSE9SUyBPUiBDT1BZUklHSFQgSE9MREVSUyBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSwgREFNQUdFUyBPUiBPVEhFUlxuLy8gTElBQklMSVRZLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUiBPVEhFUldJU0UsIEFSSVNJTkcgRlJPTSxcbi8vIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IgT1RIRVIgREVBTElOR1MgSU5cbi8vIFRIRSBTT0ZUV0FSRS5cblxuaW1wb3J0IFJlYWN0LCB7Q29tcG9uZW50fSBmcm9tICdyZWFjdCc7XG5pbXBvcnQgUHJvcFR5cGVzIGZyb20gJ3Byb3AtdHlwZXMnO1xuaW1wb3J0IHN0eWxlZCBmcm9tICdzdHlsZWQtY29tcG9uZW50cyc7XG5cbmltcG9ydCB7XG4gIEJ1dHRvbixcbiAgUGFuZWxMYWJlbCxcbiAgU2lkZVBhbmVsU2VjdGlvblxufSBmcm9tICdjb21wb25lbnRzL2NvbW1vbi9zdHlsZWQtY29tcG9uZW50cyc7XG5pbXBvcnQgSXRlbVNlbGVjdG9yIGZyb20gJ2NvbXBvbmVudHMvY29tbW9uL2l0ZW0tc2VsZWN0b3IvaXRlbS1zZWxlY3Rvcic7XG5cbmltcG9ydCBWaXNDb25maWdCeUZpZWxkU2VsZWN0b3IgZnJvbSAnLi92aXMtY29uZmlnLWJ5LWZpZWxkLXNlbGVjdG9yJztcbmltcG9ydCBMYXllclR5cGVTZWxlY3RvciBmcm9tICcuL2xheWVyLXR5cGUtc2VsZWN0b3InO1xuaW1wb3J0IERpbWVuc2lvblNjYWxlU2VsZWN0b3IgZnJvbSAnLi9kaW1lbnNpb24tc2NhbGUtc2VsZWN0b3InO1xuaW1wb3J0IENvbG9yU2VsZWN0b3IgZnJvbSAnLi9jb2xvci1zZWxlY3Rvcic7XG5pbXBvcnQgU291cmNlRGF0YVNlbGVjdG9yIGZyb20gJ2NvbXBvbmVudHMvc2lkZS1wYW5lbC9zb3VyY2UtZGF0YS1zZWxlY3Rvcic7XG5pbXBvcnQgTGF5ZXJDb25maWdHcm91cCwge1xuICBDb25maWdHcm91cENvbGxhcHNpYmxlQ29udGVudFxufSBmcm9tICcuL2xheWVyLWNvbmZpZy1ncm91cCc7XG5pbXBvcnQgV2lkZ2V0TGF5ZXJTZWxlY3RvciBmcm9tICcuL3dpZGdldC1sYXllci1zZWxlY3Rvcic7XG5pbXBvcnQgV2lkZ2V0QWdncmVnYXRpb25TZWxlY3RvciBmcm9tICcuL3dpZGdldC1hZ2dyZWdhdGlvbi1zZWxlY3Rvcic7XG5pbXBvcnQgV2lkZ2V0RmllbGRTZWxlY3RvciBmcm9tICcuL3dpZGdldC1maWVsZC1zZWxlY3Rvcic7XG5pbXBvcnQgV2lkZ2V0Q29uZmlnR3JvdXAgZnJvbSAnLi93aWRnZXQtY29uZmlnLWdyb3VwJztcblxuaW1wb3J0IHtjYXBpdGFsaXplRmlyc3RMZXR0ZXJ9IGZyb20gJ3V0aWxzL3V0aWxzJztcblxuaW1wb3J0IHtDSEFOTkVMX1NDQUxFX1NVUFBPUlRFRF9GSUVMRFN9IGZyb20gJ2NvbnN0YW50cy9kZWZhdWx0LXNldHRpbmdzJztcbi8vIGltcG9ydCBmaWxlcyBmcm9tICcuLi8uLi8uLi8uLi9kaXN0L2NvbXBvbmVudHMvY29tbW9uL2ljb25zL2ZpbGVzJztcbi8vIGltcG9ydCBsYXllclBhbmVsIGZyb20gJy4uLy4uLy4uLy4uL2Rpc3QvY29tcG9uZW50cy9zaWRlLXBhbmVsL2xheWVyLXBhbmVsL2xheWVyLXBhbmVsJztcblxuY29uc3QgU3R5bGVkTGF5ZXJDb25maWd1cmF0b3IgPSBzdHlsZWQuZGl2LmF0dHJzKHtcbiAgY2xhc3NOYW1lOiAnbGF5ZXItcGFuZWxfX2NvbmZpZydcbn0pYFxuICBwb3NpdGlvbjogcmVsYXRpdmU7XG4gIG1hcmdpbi10b3A6IDEycHg7XG5gO1xuXG5jb25zdCBTdHlsZWRXaWRnZXRWaXN1YWxDb25maWd1cmF0b3IgPSBzdHlsZWQuZGl2LmF0dHJzKHtcbiAgY2xhc3NOYW1lOiAnbGF5ZXItcGFuZWxfX2NvbmZpZ19fdmlzdWFsQy1jb25maWcnXG59KWBcbiAgbWFyZ2luLXRvcDogMTJweDtcbmA7XG5cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIFdpZGdldENvbmZpZ3VyYXRvciBleHRlbmRzIENvbXBvbmVudCB7XG4gIHN0YXRpYyBwcm9wVHlwZXMgPSB7XG4gICAgd2lkZ2V0OiBQcm9wVHlwZXMub2JqZWN0LmlzUmVxdWlyZWQsXG4gICAgZGF0YXNldHM6IFByb3BUeXBlcy5vYmplY3QuaXNSZXF1aXJlZCxcbiAgICB3aWRnZXRUeXBlT3B0aW9uczogUHJvcFR5cGVzLmFycmF5T2YoUHJvcFR5cGVzLmFueSkuaXNSZXF1aXJlZCxcbiAgICBvcGVuTW9kYWw6IFByb3BUeXBlcy5mdW5jLmlzUmVxdWlyZWQsXG4gICAgdXBkYXRlTGF5ZXJDb25maWc6IFByb3BUeXBlcy5mdW5jLmlzUmVxdWlyZWQsXG4gICAgdXBkYXRlTGF5ZXJUeXBlOiBQcm9wVHlwZXMuZnVuYy5pc1JlcXVpcmVkLFxuICAgIHVwZGF0ZUxheWVyVmlzQ29uZmlnOiBQcm9wVHlwZXMuZnVuYy5pc1JlcXVpcmVkLFxuICAgIHVwZGF0ZUxheWVyVmlzdWFsQ2hhbm5lbENvbmZpZzogUHJvcFR5cGVzLmZ1bmMuaXNSZXF1aXJlZFxuICB9O1xuXG4gIF9yZW5kZXJGdW5jdGlvbldpZGdldENvbmZpZyhwcm9wcykge1xuICAgIHJldHVybiB0aGlzLl9yZW5kZXJBZ2dyZWdhdGlvbldpZGdldENvbmZpZyhwcm9wcyk7XG4gIH1cblxuICBfcmVuZGVyQWdncmVnYXRpb25XaWRnZXRDb25maWcoe1xuICAgIGxheWVycyxcbiAgICB3aWRnZXQsXG4gICAgZGF0YXNldHMsXG4gICAgZGF0YUlkLFxuICAgIHdpZGdldENvbmZpZ3VyYXRvclByb3BzXG4gIH0pIHtcbiAgICBjb25zdCB7ZmllbGRzfSA9IHdpZGdldC5jb25maWcuZGF0YUlkID8gZGF0YXNldHNbd2lkZ2V0LmNvbmZpZy5kYXRhSWRdIDoge307XG4gICAgcmV0dXJuIChcbiAgICAgIDxTdHlsZWRXaWRnZXRWaXN1YWxDb25maWd1cmF0b3I+XG4gICAgICAgIDxMYXllckNvbmZpZ0dyb3VwIGxhYmVsPXsnbGF5ZXInfT5cbiAgICAgICAgICA8V2lkZ2V0TGF5ZXJTZWxlY3RvclxuICAgICAgICAgICAgd2lkZ2V0PXt3aWRnZXR9XG4gICAgICAgICAgICBsYXllcnM9e2xheWVyc31cbiAgICAgICAgICAgIGRhdGFJZD17ZGF0YUlkfVxuICAgICAgICAgICAgb25TZWxlY3Q9e3ZhbHVlID0+XG4gICAgICAgICAgICAgIHRoaXMucHJvcHMudXBkYXRlTGF5ZXJDb25maWcoe3NlbGVjdGVkTGF5ZXI6IHZhbHVlfSlcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAvPlxuICAgICAgICA8L0xheWVyQ29uZmlnR3JvdXA+XG4gICAgICAgIDxMYXllckNvbmZpZ0dyb3VwIGxhYmVsPXsnQWdncmVnYXRpb24nfT5cbiAgICAgICAgICA8V2lkZ2V0QWdncmVnYXRpb25TZWxlY3RvclxuICAgICAgICAgICAgd2lkZ2V0PXt3aWRnZXR9XG4gICAgICAgICAgICB7Li4ud2lkZ2V0Q29uZmlndXJhdG9yUHJvcHN9XG4gICAgICAgICAgLz5cbiAgICAgICAgICB7d2lkZ2V0LmNvbmZpZy5hZ2dyZWdhdGlvblR5cGUgPyAoXG4gICAgICAgICAgICB3aWRnZXQuY29uZmlnLmFnZ3JlZ2F0aW9uVHlwZSA9PT0gJ2NvdW50JyA/IG51bGwgOiAoXG4gICAgICAgICAgICAgIDxXaWRnZXRGaWVsZFNlbGVjdG9yXG4gICAgICAgICAgICAgICAgZmllbGRzPXtmaWVsZHN9XG4gICAgICAgICAgICAgICAgd2lkZ2V0PXt3aWRnZXR9XG4gICAgICAgICAgICAgICAgcGxhY2Vob2xkZXI9eydlbXB0eSd9XG4gICAgICAgICAgICAgICAgb25DaGFuZ2U9e3RoaXMucHJvcHMudXBkYXRlTGF5ZXJDb25maWd9XG4gICAgICAgICAgICAgIC8+XG4gICAgICAgICAgICApXG4gICAgICAgICAgKSA6IG51bGx9XG4gICAgICAgIDwvTGF5ZXJDb25maWdHcm91cD5cbiAgICAgICAgPFdpZGdldENvbmZpZ0dyb3VwXG4gICAgICAgICAgbGFiZWw9eydEeW5hbWljJ31cbiAgICAgICAgICBwcm9wZXJ0eT17J2JvdW5kcyd9XG4gICAgICAgICAgZGVzY3JpcHRpb249eydDYWxjdWxhdGlvbiBvbiB0aGUgYmFzaXMgb2YgYm91bmRzIG9mIG1hcCBvbiBzY3JlZW4nfVxuICAgICAgICAgIHsuLi53aWRnZXRDb25maWd1cmF0b3JQcm9wc31cbiAgICAgICAgLz5cbiAgICAgIDwvU3R5bGVkV2lkZ2V0VmlzdWFsQ29uZmlndXJhdG9yPlxuICAgICk7XG4gIH1cblxuICBfcmVuZGVyQ2F0ZWdvcnlXaWRnZXRDb25maWcocHJvcHMpIHtcbiAgICByZXR1cm4gdGhpcy5fcmVuZGVyQ2F0ZWdvcnlDb25maWcocHJvcHMpO1xuICB9XG5cbiAgX3JlbmRlckNhdGVnb3J5Q29uZmlnKHtcbiAgICBsYXllcnMsXG4gICAgd2lkZ2V0LFxuICAgIGRhdGFzZXRzLFxuICAgIGRhdGFJZCxcbiAgICB3aWRnZXRDb25maWd1cmF0b3JQcm9wc1xuICB9KSB7XG4gICAgY29uc3Qge2ZpZWxkc30gPSB3aWRnZXQuY29uZmlnLmRhdGFJZCA/IGRhdGFzZXRzW3dpZGdldC5jb25maWcuZGF0YUlkXSA6IHt9O1xuICAgIHJldHVybiAoXG4gICAgICA8U3R5bGVkV2lkZ2V0VmlzdWFsQ29uZmlndXJhdG9yPlxuICAgICAgICA8TGF5ZXJDb25maWdHcm91cCBsYWJlbD17J2xheWVyJ30+XG4gICAgICAgICAgPFdpZGdldExheWVyU2VsZWN0b3JcbiAgICAgICAgICAgIHdpZGdldD17d2lkZ2V0fVxuICAgICAgICAgICAgbGF5ZXJzPXtsYXllcnN9XG4gICAgICAgICAgICBkYXRhSWQ9e2RhdGFJZH1cbiAgICAgICAgICAgIG9uU2VsZWN0PXt2YWx1ZSA9PlxuICAgICAgICAgICAgICB0aGlzLnByb3BzLnVwZGF0ZUxheWVyQ29uZmlnKHtzZWxlY3RlZExheWVyOiB2YWx1ZX0pXG4gICAgICAgICAgICB9XG4gICAgICAgICAgLz5cbiAgICAgICAgPC9MYXllckNvbmZpZ0dyb3VwPlxuICAgICAgICA8TGF5ZXJDb25maWdHcm91cCBsYWJlbD17J0NhdGVnb3JpemUgYnknfT5cbiAgICAgICAgICA8V2lkZ2V0RmllbGRTZWxlY3RvclxuICAgICAgICAgICAgZmllbGRzPXtmaWVsZHN9XG4gICAgICAgICAgICB3aWRnZXQ9e3dpZGdldH1cbiAgICAgICAgICAgIHBsYWNlaG9sZGVyPXsnZW1wdHknfVxuICAgICAgICAgICAgdHlwZT17J2NhdGVnb3J5J31cbiAgICAgICAgICAgIG9uQ2hhbmdlPXt0aGlzLnByb3BzLnVwZGF0ZUxheWVyQ29uZmlnfVxuICAgICAgICAgIC8+XG4gICAgICAgIDwvTGF5ZXJDb25maWdHcm91cD5cbiAgICAgICAgPExheWVyQ29uZmlnR3JvdXAgbGFiZWw9eydBZ2dyZWdhdGlvbid9PlxuICAgICAgICAgIDxXaWRnZXRBZ2dyZWdhdGlvblNlbGVjdG9yXG4gICAgICAgICAgICB3aWRnZXQ9e3dpZGdldH1cbiAgICAgICAgICAgIHsuLi53aWRnZXRDb25maWd1cmF0b3JQcm9wc31cbiAgICAgICAgICAvPlxuICAgICAgICAgIHt3aWRnZXQuY29uZmlnLmFnZ3JlZ2F0aW9uVHlwZSA/IChcbiAgICAgICAgICAgIHdpZGdldC5jb25maWcuYWdncmVnYXRpb25UeXBlID09PSAnY291bnQnID8gbnVsbCA6IChcbiAgICAgICAgICAgICAgPFdpZGdldEZpZWxkU2VsZWN0b3JcbiAgICAgICAgICAgICAgICBmaWVsZHM9e2ZpZWxkc31cbiAgICAgICAgICAgICAgICB3aWRnZXQ9e3dpZGdldH1cbiAgICAgICAgICAgICAgICBwbGFjZWhvbGRlcj17J2VtcHR5J31cbiAgICAgICAgICAgICAgICBvbkNoYW5nZT17dGhpcy5wcm9wcy51cGRhdGVMYXllckNvbmZpZ31cbiAgICAgICAgICAgICAgLz5cbiAgICAgICAgICAgIClcbiAgICAgICAgICApIDogbnVsbH1cbiAgICAgICAgPC9MYXllckNvbmZpZ0dyb3VwPlxuICAgICAgICA8V2lkZ2V0Q29uZmlnR3JvdXBcbiAgICAgICAgICBsYWJlbD17J0R5bmFtaWMnfVxuICAgICAgICAgIHByb3BlcnR5PXsnYm91bmRzJ31cbiAgICAgICAgICBkZXNjcmlwdGlvbj17J0NhbGN1bGF0aW9uIG9uIHRoZSBiYXNpcyBvZiBib3VuZHMgb2YgbWFwIG9uIHNjcmVlbid9XG4gICAgICAgICAgey4uLndpZGdldENvbmZpZ3VyYXRvclByb3BzfVxuICAgICAgICAvPlxuICAgICAgPC9TdHlsZWRXaWRnZXRWaXN1YWxDb25maWd1cmF0b3I+XG4gICAgKTtcbiAgfVxuXG4gIF9maW5kTGF5ZXJJZHggPSAobGF5ZXJzLCBpZCkgPT4ge1xuICAgIC8vIGNvbnNvbGUubG9nKCdpbnNpZGVfZmluZExheWVySWR4JywgbGF5ZXJzLCBpZCk7XG4gICAgbGF5ZXJzLm1hcCgoa2V5LCBsaWRnZXQpID0+IHtcbiAgICAgIGlmIChsaWRnZXQuaWQgPT09IGlkKSB7XG4gICAgICAgIC8vIGNvbnNvbGUubG9nKGtleSk7XG4gICAgICB9XG4gICAgfSk7XG4gIH07XG5cbiAgcmVuZGVyKCkge1xuICAgIGNvbnN0IHtcbiAgICAgIHdpZGdldCxcbiAgICAgIGxheWVycyxcbiAgICAgIGRhdGFzZXRzLFxuICAgICAgdXBkYXRlTGF5ZXJDb25maWcsXG4gICAgICB3aWRnZXRUeXBlT3B0aW9ucyxcbiAgICAgIHVwZGF0ZUxheWVyVHlwZVxuICAgIH0gPSB0aGlzLnByb3BzO1xuICAgIGNvbnN0IHtmaWVsZHMgPSBbXX0gPSB3aWRnZXQuY29uZmlnLmRhdGFJZFxuICAgICAgPyBkYXRhc2V0c1t3aWRnZXQuY29uZmlnLmRhdGFJZF1cbiAgICAgIDoge307XG4gICAgY29uc3Qge2NvbmZpZ30gPSB3aWRnZXQ7XG5cbiAgICBjb25zdCBkYXRhSWQgPSBjb25maWcuZGF0YUlkO1xuXG4gICAgY29uc3QgY29tbW9uQ29uZmlnUHJvcCA9IHtcbiAgICAgIHdpZGdldCxcbiAgICAgIGZpZWxkc1xuICAgIH07XG5cbiAgICBjb25zdCB2aXNDb25maWd1cmF0b3JQcm9wcyA9IHtcbiAgICAgIC4uLmNvbW1vbkNvbmZpZ1Byb3AsXG4gICAgICBvbkNoYW5nZTogdGhpcy5wcm9wcy51cGRhdGVMYXllclZpc0NvbmZpZ1xuICAgIH07XG5cbiAgICBjb25zdCB3aWRnZXRDb25maWd1cmF0b3JQcm9wcyA9IHtcbiAgICAgIC4uLmNvbW1vbkNvbmZpZ1Byb3AsXG4gICAgICBvbkNoYW5nZTogdXBkYXRlTGF5ZXJDb25maWdcbiAgICB9O1xuXG4gICAgY29uc3QgbGF5ZXJDaGFubmVsQ29uZmlnUHJvcHMgPSB7XG4gICAgICAuLi5jb21tb25Db25maWdQcm9wLFxuICAgICAgb25DaGFuZ2U6IHRoaXMucHJvcHMudXBkYXRlTGF5ZXJWaXN1YWxDaGFubmVsQ29uZmlnXG4gICAgfTtcblxuICAgIGNvbnN0IHJlbmRlclRlbXBsYXRlID1cbiAgICAgIHdpZGdldC50eXBlICYmIGBfcmVuZGVyJHtjYXBpdGFsaXplRmlyc3RMZXR0ZXIod2lkZ2V0LnR5cGUpfVdpZGdldENvbmZpZ2A7XG5cbiAgICAvLyBjb25zb2xlLmxvZygnbGF5ZXIgaW5zaWRlIHdpZGdldC1jb25maWd1cmF0b3InLCBsYXllcik7XG4gICAgcmV0dXJuIChcbiAgICAgIDxTdHlsZWRMYXllckNvbmZpZ3VyYXRvcj5cbiAgICAgICAge3dpZGdldC5sYXllckluZm9Nb2RhbCA/IChcbiAgICAgICAgICA8SG93VG9CdXR0b25cbiAgICAgICAgICAgIG9uQ2xpY2s9eygpID0+IHRoaXMucHJvcHMub3Blbk1vZGFsKHdpZGdldC5sYXllckluZm9Nb2RhbCl9XG4gICAgICAgICAgLz5cbiAgICAgICAgKSA6IG51bGx9XG4gICAgICAgIDxMYXllckNvbmZpZ0dyb3VwXG4gICAgICAgICAgbGFiZWw9eydiYXNpYyd9XG4gICAgICAgICAgY29sbGFwc2libGVcbiAgICAgICAgICBleHBhbmRlZD17T2JqZWN0LmtleXMoZGF0YXNldHMpLmxlbmd0aCA+IDEgJiYgd2lkZ2V0LnR5cGV9XG4gICAgICAgID5cbiAgICAgICAgICA8TGF5ZXJUeXBlU2VsZWN0b3JcbiAgICAgICAgICAgIGxheWVyPXt3aWRnZXR9XG4gICAgICAgICAgICB3aWRnZXRUeXBlT3B0aW9ucz17d2lkZ2V0VHlwZU9wdGlvbnN9XG4gICAgICAgICAgICBvblNlbGVjdD17dXBkYXRlTGF5ZXJUeXBlfVxuICAgICAgICAgIC8+XG4gICAgICAgICAgPENvbmZpZ0dyb3VwQ29sbGFwc2libGVDb250ZW50PlxuICAgICAgICAgICAge09iamVjdC5rZXlzKGRhdGFzZXRzKS5sZW5ndGggPiAxICYmIChcbiAgICAgICAgICAgICAgPFNvdXJjZURhdGFTZWxlY3RvclxuICAgICAgICAgICAgICAgIGRhdGFzZXRzPXtkYXRhc2V0c31cbiAgICAgICAgICAgICAgICBpZD17d2lkZ2V0LmlkfVxuICAgICAgICAgICAgICAgIGRpc2FibGVkPXt3aWRnZXQudHllcCAmJiBjb25maWcuc2VsZWN0ZWRGaWVsZH1cbiAgICAgICAgICAgICAgICBkYXRhSWQ9e2NvbmZpZy5kYXRhSWR9XG4gICAgICAgICAgICAgICAgb25TZWxlY3Q9e3ZhbHVlID0+XG4gICAgICAgICAgICAgICAgICB1cGRhdGVMYXllckNvbmZpZyh7XG4gICAgICAgICAgICAgICAgICAgIGRhdGFJZDogdmFsdWUsXG4gICAgICAgICAgICAgICAgICAgIGFnZ3JlZ2F0aW9uVHlwZTogbnVsbCxcbiAgICAgICAgICAgICAgICAgICAgc2VsZWN0ZWRMYXllcjogbnVsbCxcbiAgICAgICAgICAgICAgICAgICAgYWdncmVnYXRlZERhdGE6IG51bGxcbiAgICAgICAgICAgICAgICAgIH0pXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAvPlxuICAgICAgICAgICAgKX1cbiAgICAgICAgICA8L0NvbmZpZ0dyb3VwQ29sbGFwc2libGVDb250ZW50PlxuICAgICAgICA8L0xheWVyQ29uZmlnR3JvdXA+XG4gICAgICAgIHt0aGlzW3JlbmRlclRlbXBsYXRlXSAmJlxuICAgICAgICAgIHRoaXNbcmVuZGVyVGVtcGxhdGVdKHtcbiAgICAgICAgICAgIHdpZGdldCxcbiAgICAgICAgICAgIGxheWVycyxcbiAgICAgICAgICAgIGRhdGFzZXRzLFxuICAgICAgICAgICAgZGF0YUlkLFxuICAgICAgICAgICAgdmlzQ29uZmlndXJhdG9yUHJvcHMsXG4gICAgICAgICAgICBsYXllckNoYW5uZWxDb25maWdQcm9wcyxcbiAgICAgICAgICAgIHdpZGdldENvbmZpZ3VyYXRvclByb3BzXG4gICAgICAgICAgfSl9XG4gICAgICA8L1N0eWxlZExheWVyQ29uZmlndXJhdG9yPlxuICAgICk7XG4gIH1cbn1cblxuLypcbiAqIENvbXBvbmVudGl6ZSBjb25maWcgY29tcG9uZW50IGludG8gcHVyZSBmdW5jdGlvbmFsIGNvbXBvbmVudHNcbiAqL1xuXG5jb25zdCBTdHlsZWRIb3dUb0J1dHRvbiA9IHN0eWxlZC5kaXZgXG4gIHBvc2l0aW9uOiBhYnNvbHV0ZTtcbiAgcmlnaHQ6IDEycHg7XG4gIHRvcDogLTRweDtcbmA7XG5cbmV4cG9ydCBjb25zdCBIb3dUb0J1dHRvbiA9ICh7b25DbGlja30pID0+IChcbiAgPFN0eWxlZEhvd1RvQnV0dG9uPlxuICAgIDxCdXR0b24gbGluayBzbWFsbCBvbkNsaWNrPXtvbkNsaWNrfT5cbiAgICAgIEhvdyB0b1xuICAgIDwvQnV0dG9uPlxuICA8L1N0eWxlZEhvd1RvQnV0dG9uPlxuKTtcblxuZXhwb3J0IGNvbnN0IExheWVyQ29sb3JTZWxlY3RvciA9ICh7bGF5ZXIsIG9uQ2hhbmdlfSkgPT4gKFxuICA8U2lkZVBhbmVsU2VjdGlvbiBkaXNhYmxlZD17bGF5ZXIuY29uZmlnLmNvbG9yRmllbGR9PlxuICAgIDxDb2xvclNlbGVjdG9yXG4gICAgICBjb2xvclNldHM9e1tcbiAgICAgICAge1xuICAgICAgICAgIHNlbGVjdGVkQ29sb3I6IGxheWVyLmNvbmZpZy5jb2xvcixcbiAgICAgICAgICBzZXRDb2xvcjogcmdiVmFsdWUgPT4gb25DaGFuZ2Uoe2NvbG9yOiByZ2JWYWx1ZX0pXG4gICAgICAgIH1cbiAgICAgIF19XG4gICAgLz5cbiAgPC9TaWRlUGFuZWxTZWN0aW9uPlxuKTtcblxuZXhwb3J0IGNvbnN0IEFyY0xheWVyQ29sb3JTZWxlY3RvciA9ICh7XG4gIGxheWVyLFxuICBvbkNoYW5nZUNvbmZpZyxcbiAgb25DaGFuZ2VWaXNDb25maWdcbn0pID0+IChcbiAgPFNpZGVQYW5lbFNlY3Rpb24+XG4gICAgPENvbG9yU2VsZWN0b3JcbiAgICAgIGNvbG9yU2V0cz17W1xuICAgICAgICB7XG4gICAgICAgICAgc2VsZWN0ZWRDb2xvcjogbGF5ZXIuY29uZmlnLmNvbG9yLFxuICAgICAgICAgIHNldENvbG9yOiByZ2JWYWx1ZSA9PiBvbkNoYW5nZUNvbmZpZyh7Y29sb3I6IHJnYlZhbHVlfSksXG4gICAgICAgICAgbGFiZWw6ICdTb3VyY2UnXG4gICAgICAgIH0sXG4gICAgICAgIHtcbiAgICAgICAgICBzZWxlY3RlZENvbG9yOlxuICAgICAgICAgICAgbG