kepler.gl.geoiq
Version:
kepler.gl is a webgl based application to visualize large scale location data in the browser
455 lines (386 loc) • 55.7 kB
JavaScript
"use strict";
var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
var _typeof = require("@babel/runtime/helpers/typeof");
Object.defineProperty(exports, "__esModule", {
value: true
});
exports["default"] = exports.WidgetAggregationSelectors = exports.LayerColorSelector = exports.HowToButton = exports.ColorRangeConfig = exports.ChannelByValueSelector = exports.ArcLayerColorSelector = exports.AggregationTypeSelector = exports.AggrColorScaleSelector = 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 _assertThisInitialized2 = _interopRequireDefault(require("@babel/runtime/helpers/assertThisInitialized"));
var _inherits2 = _interopRequireDefault(require("@babel/runtime/helpers/inherits"));
var _possibleConstructorReturn2 = _interopRequireDefault(require("@babel/runtime/helpers/possibleConstructorReturn"));
var _getPrototypeOf2 = _interopRequireDefault(require("@babel/runtime/helpers/getPrototypeOf"));
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");
var _templateObject, _templateObject2, _templateObject3;
function _getRequireWildcardCache(nodeInterop) { if (typeof WeakMap !== "function") return null; var cacheBabelInterop = new WeakMap(); var cacheNodeInterop = new WeakMap(); return (_getRequireWildcardCache = function _getRequireWildcardCache(nodeInterop) { return nodeInterop ? cacheNodeInterop : cacheBabelInterop; })(nodeInterop); }
function _interopRequireWildcard(obj, nodeInterop) { if (!nodeInterop && obj && obj.__esModule) { return obj; } if (obj === null || _typeof(obj) !== "object" && typeof obj !== "function") { return { "default": obj }; } var cache = _getRequireWildcardCache(nodeInterop); if (cache && cache.has(obj)) { return cache.get(obj); } var newObj = {}; var hasPropertyDescriptor = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var key in obj) { if (key !== "default" && Object.prototype.hasOwnProperty.call(obj, key)) { var desc = hasPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : null; if (desc && (desc.get || desc.set)) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } newObj["default"] = obj; if (cache) { cache.set(obj, newObj); } return newObj; }
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 _createSuper(Derived) { var hasNativeReflectConstruct = _isNativeReflectConstruct(); return function _createSuperInternal() { var Super = (0, _getPrototypeOf2["default"])(Derived), result; if (hasNativeReflectConstruct) { var NewTarget = (0, _getPrototypeOf2["default"])(this).constructor; result = Reflect.construct(Super, arguments, NewTarget); } else { result = Super.apply(this, arguments); } return (0, _possibleConstructorReturn2["default"])(this, result); }; }
function _isNativeReflectConstruct() { if (typeof Reflect === "undefined" || !Reflect.construct) return false; if (Reflect.construct.sham) return false; if (typeof Proxy === "function") return true; try { Boolean.prototype.valueOf.call(Reflect.construct(Boolean, [], function () {})); return true; } catch (e) { return false; } }
// 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 || (_templateObject = (0, _taggedTemplateLiteral2["default"])(["\n position: relative;\n margin-top: 12px;\n"])));
var StyledWidgetVisualConfigurator = _styledComponents["default"].div.attrs({
className: 'layer-panel__config__visualC-config'
})(_templateObject2 || (_templateObject2 = (0, _taggedTemplateLiteral2["default"])(["\n margin-top: 12px;\n"])));
var WidgetConfigurator = exports["default"] = /*#__PURE__*/function (_Component) {
(0, _inherits2["default"])(WidgetConfigurator, _Component);
var _super = _createSuper(WidgetConfigurator);
function WidgetConfigurator() {
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 = _super.call.apply(_super, [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 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;
fields.filter(function (field) {
return field.type !== 'geojson';
});
return (/*#__PURE__*/_react["default"].createElement(StyledWidgetVisualConfigurator, null, /*#__PURE__*/_react["default"].createElement(_layerConfigGroup["default"], {
label: 'Aggregation'
}, /*#__PURE__*/_react["default"].createElement(_widgetAggregationSelector["default"], (0, _extends2["default"])({
widget: widget
}, widgetConfiguratorProps)), widget.config.aggregationType ? widget.config.aggregationType === 'count' ? null : /*#__PURE__*/_react["default"].createElement(_widgetFieldSelector["default"], {
fields: fields,
widget: widget,
placeholder: 'empty',
onChange: this.props.updateLayerConfig
}) : null), /*#__PURE__*/_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 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;
fields.filter(function (field) {
return field.type !== 'geojson';
});
return (/*#__PURE__*/_react["default"].createElement(StyledWidgetVisualConfigurator, null, /*#__PURE__*/_react["default"].createElement(_layerConfigGroup["default"], {
label: 'Categorize by'
}, /*#__PURE__*/_react["default"].createElement(_widgetFieldSelector["default"], {
fields: fields,
widget: widget,
placeholder: 'empty',
type: 'category',
onChange: this.props.updateLayerConfig
})), /*#__PURE__*/_react["default"].createElement(_layerConfigGroup["default"], {
label: 'Aggregation'
}, /*#__PURE__*/_react["default"].createElement(_widgetAggregationSelector["default"], (0, _extends2["default"])({
widget: widget
}, widgetConfiguratorProps)), widget.config.aggregationType ? widget.config.aggregationType === 'count' ? null : /*#__PURE__*/_react["default"].createElement(_widgetFieldSelector["default"], {
fields: fields,
widget: widget,
placeholder: 'empty',
onChange: this.props.updateLayerConfig
}) : null), /*#__PURE__*/_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 _this2 = 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(_objectSpread({}, commonConfigProp), {}, {
onChange: this.props.updateLayerVisConfig
});
var widgetConfiguratorProps = _objectSpread(_objectSpread({}, commonConfigProp), {}, {
onChange: updateLayerConfig
});
var layerChannelConfigProps = _objectSpread(_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 (/*#__PURE__*/_react["default"].createElement(StyledLayerConfigurator, null, widget.layerInfoModal ? /*#__PURE__*/_react["default"].createElement(HowToButton, {
onClick: function onClick() {
return _this2.props.openModal(widget.layerInfoModal);
}
}) : null, /*#__PURE__*/_react["default"].createElement(_layerConfigGroup["default"], {
label: 'basic',
collapsible: true,
expanded: Object.keys(datasets).length > 1 && widget.type
}, /*#__PURE__*/_react["default"].createElement(_layerTypeSelector["default"], {
layer: widget,
widgetTypeOptions: widgetTypeOptions,
onSelect: updateLayerType
}), /*#__PURE__*/_react["default"].createElement(_layerConfigGroup.ConfigGroupCollapsibleContent, null, Object.keys(datasets).length > 1 && /*#__PURE__*/_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
*/
(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 || (_templateObject3 = (0, _taggedTemplateLiteral2["default"])(["\n position: absolute;\n right: 12px;\n top: -4px;\n"])));
var HowToButton = exports.HowToButton = function HowToButton(_ref6) {
var onClick = _ref6.onClick;
return (/*#__PURE__*/_react["default"].createElement(StyledHowToButton, null, /*#__PURE__*/_react["default"].createElement(_styledComponents2.Button, {
link: true,
small: true,
onClick: onClick
}, "How to"))
);
};
var LayerColorSelector = exports.LayerColorSelector = function LayerColorSelector(_ref7) {
var layer = _ref7.layer,
onChange = _ref7.onChange;
return (/*#__PURE__*/_react["default"].createElement(_styledComponents2.SidePanelSection, {
disabled: layer.config.colorField
}, /*#__PURE__*/_react["default"].createElement(_colorSelector["default"], {
colorSets: [{
selectedColor: layer.config.color,
setColor: function setColor(rgbValue) {
return onChange({
color: rgbValue
});
}
}]
}))
);
};
var ArcLayerColorSelector = exports.ArcLayerColorSelector = function ArcLayerColorSelector(_ref8) {
var layer = _ref8.layer,
onChangeConfig = _ref8.onChangeConfig,
onChangeVisConfig = _ref8.onChangeVisConfig;
return (/*#__PURE__*/_react["default"].createElement(_styledComponents2.SidePanelSection, null, /*#__PURE__*/_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'
}]
}))
);
};
var ColorRangeConfig = exports.ColorRangeConfig = function ColorRangeConfig(_ref9) {
var layer = _ref9.layer,
onChange = _ref9.onChange;
return (/*#__PURE__*/_react["default"].createElement(_styledComponents2.SidePanelSection, null, /*#__PURE__*/_react["default"].createElement(_colorSelector["default"], {
colorSets: [{
selectedColor: layer.config.visConfig.colorRange,
isRange: true,
setColor: function setColor(colorRange) {
return onChange({
colorRange: colorRange
});
}
}]
}))
);
};
var ChannelByValueSelector = exports.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 (/*#__PURE__*/_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);
}
})
);
};
var AggrColorScaleSelector = exports.AggrColorScaleSelector = function AggrColorScaleSelector(_ref12) {
var layer = _ref12.layer,
onChange = _ref12.onChange;
var scaleOptions = layer.getScaleOptions('color');
return Array.isArray(scaleOptions) && scaleOptions.length > 1 ? /*#__PURE__*/_react["default"].createElement(_dimensionScaleSelector["default"], {
label: "Color Scale",
options: scaleOptions,
scaleType: layer.config.colorScale,
onSelect: function onSelect(val) {
return onChange({
colorScale: val
}, 'color');
}
}) : null;
};
var WidgetAggregationSelectors = exports.WidgetAggregationSelectors = function WidgetAggregationSelectors() {
return (/*#__PURE__*/_react["default"].createElement(_layerConfigGroup["default"], {
label: 'Aggregation',
collapsible: true
})
);
};
var AggregationTypeSelector = exports.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 (/*#__PURE__*/_react["default"].createElement(_styledComponents2.SidePanelSection, null, /*#__PURE__*/_react["default"].createElement(_styledComponents2.PanelLabel, null, "Aggregate ".concat(selectedField.name, " by")), /*#__PURE__*/_react["default"].createElement(_itemSelector["default"], {
selectedItems: visConfig[aggregation],
options: aggregationOptions,
multiSelect: false,
searchable: false,
onChange: function onChange(value) {
return _onChange3({
visConfig: _objectSpread(_objectSpread({}, widget.config.visConfig), {}, (0, _defineProperty2["default"])({}, aggregation, value))
}, channel.key);
}
}))
);
};
/* eslint-enable max-params */
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3NyYy9jb21wb25lbnRzL3NpZGUtcGFuZWwvd2lkZ2V0LXBhbmVsL3dpZGdldC1jb25maWd1cmF0b3IuanMiXSwibmFtZXMiOlsiU3R5bGVkTGF5ZXJDb25maWd1cmF0b3IiLCJzdHlsZWQiLCJkaXYiLCJhdHRycyIsImNsYXNzTmFtZSIsIlN0eWxlZFdpZGdldFZpc3VhbENvbmZpZ3VyYXRvciIsIldpZGdldENvbmZpZ3VyYXRvciIsImxheWVycyIsImlkIiwibWFwIiwia2V5IiwibGlkZ2V0IiwicHJvcHMiLCJfcmVuZGVyQWdncmVnYXRpb25XaWRnZXRDb25maWciLCJ3aWRnZXQiLCJkYXRhc2V0cyIsImRhdGFJZCIsIndpZGdldENvbmZpZ3VyYXRvclByb3BzIiwiY29uZmlnIiwiZmllbGRzIiwiZmlsdGVyIiwiZmllbGQiLCJ0eXBlIiwiYWdncmVnYXRpb25UeXBlIiwidXBkYXRlTGF5ZXJDb25maWciLCJfcmVuZGVyQ2F0ZWdvcnlDb25maWciLCJ3aWRnZXRUeXBlT3B0aW9ucyIsInVwZGF0ZUxheWVyVHlwZSIsImNvbW1vbkNvbmZpZ1Byb3AiLCJ2aXNDb25maWd1cmF0b3JQcm9wcyIsIm9uQ2hhbmdlIiwidXBkYXRlTGF5ZXJWaXNDb25maWciLCJsYXllckNoYW5uZWxDb25maWdQcm9wcyIsInVwZGF0ZUxheWVyVmlzdWFsQ2hhbm5lbENvbmZpZyIsInJlbmRlclRlbXBsYXRlIiwibGF5ZXJJbmZvTW9kYWwiLCJvcGVuTW9kYWwiLCJPYmplY3QiLCJrZXlzIiwibGVuZ3RoIiwidHllcCIsInNlbGVjdGVkRmllbGQiLCJ2YWx1ZSIsInNlbGVjdGVkTGF5ZXIiLCJhZ2dyZWdhdGVkRGF0YSIsIkNvbXBvbmVudCIsIlByb3BUeXBlcyIsIm9iamVjdCIsImlzUmVxdWlyZWQiLCJhcnJheU9mIiwiYW55IiwiZnVuYyIsIlN0eWxlZEhvd1RvQnV0dG9uIiwiSG93VG9CdXR0b24iLCJvbkNsaWNrIiwiTGF5ZXJDb2xvclNlbGVjdG9yIiwibGF5ZXIiLCJjb2xvckZpZWxkIiwic2VsZWN0ZWRDb2xvciIsImNvbG9yIiwic2V0Q29sb3IiLCJyZ2JWYWx1ZSIsIkFyY0xheWVyQ29sb3JTZWxlY3RvciIsIm9uQ2hhbmdlQ29uZmlnIiwib25DaGFuZ2VWaXNDb25maWciLCJsYWJlbCIsInZpc0NvbmZpZyIsInRhcmdldENvbG9yIiwiQ29sb3JSYW5nZUNvbmZpZyIsImNvbG9yUmFuZ2UiLCJpc1JhbmdlIiwiQ2hhbm5lbEJ5VmFsdWVTZWxlY3RvciIsImNoYW5uZWwiLCJkZXNjcmlwdGlvbiIsImNoYW5uZWxTY2FsZVR5cGUiLCJkb21haW4iLCJwcm9wZXJ0eSIsInJhbmdlIiwic2NhbGUiLCJkZWZhdWx0TWVhc3VyZSIsInN1cHBvcnRlZEZpZWxkVHlwZXMiLCJjaGFubmVsU3VwcG9ydGVkRmllbGRUeXBlcyIsIkNIQU5ORUxfU0NBTEVfU1VQUE9SVEVEX0ZJRUxEUyIsInN1cHBvcnRlZEZpZWxkcyIsImluY2x1ZGVzIiwic2NhbGVPcHRpb25zIiwiZ2V0U2NhbGVPcHRpb25zIiwic2hvd1NjYWxlIiwiaXNBZ2dyZWdhdGVkIiwiZGVmYXVsdERlc2NyaXB0aW9uIiwidmFsIiwiQWdnckNvbG9yU2NhbGVTZWxlY3RvciIsIkFycmF5IiwiaXNBcnJheSIsImNvbG9yU2NhbGUiLCJXaWRnZXRBZ2dyZWdhdGlvblNlbGVjdG9ycyIsIkFnZ3JlZ2F0aW9uVHlwZVNlbGVjdG9yIiwiYWdncmVnYXRpb24iLCJhZ2dyZWdhdGlvbk9wdGlvbnMiLCJnZXRBZ2dyZWdhdGlvbk9wdGlvbnMiLCJuYW1lIl0sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQW9CQTs7QUFDQTs7QUFDQTs7QUFFQTs7QUFLQTs7QUFFQTs7QUFDQTs7QUFDQTs7QUFDQTs7QUFDQTs7QUFDQTs7QUFHQTs7QUFDQTs7QUFDQTs7QUFDQTs7QUFFQTs7QUFFQTs7Ozs7Ozs7Ozs7Ozs7OztBQUNBO0FBQ0E7QUFFQSxJQUFNQSx1QkFBdUIsR0FBR0MsNkJB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QVAsQ0FBY2dELFNBRFYsNENBRU4rQixXQUZNLEVBRVF2RCxLQUZSO0FBRFgsU0FETSxFQU9OOEIsT0FBTyxDQUFDOUQsR0FQRixDQURLO0FBQUE7QUFMakIsTUFGRjtBQURGO0FBc0JELENBOUJNO0FBK0JQIiwic291cmNlc0NvbnRlbnQiOlsiLy8gQ29weXJpZ2h0IChjKSAyMDIzIFViZXIgVGVjaG5vbG9naWVzLCBJbmMuXG4vL1xuLy8gUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nIGEgY29weVxuLy8gb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGUgXCJTb2Z0d2FyZVwiKSwgdG8gZGVhbFxuLy8gaW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24gdGhlIHJpZ2h0c1xuLy8gdG8gdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLCBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLCBhbmQvb3Igc2VsbFxuLy8gY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvIHBlcm1pdCBwZXJzb25zIHRvIHdob20gdGhlIFNvZnR3YXJlIGlzXG4vLyBmdXJuaXNoZWQgdG8gZG8gc28sIHN1YmplY3QgdG8gdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOlxuLy9cbi8vIFRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIHNoYWxsIGJlIGluY2x1ZGVkIGluXG4vLyBhbGwgY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZSBTb2Z0d2FyZS5cbi8vXG4vLyBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgXCJBUyBJU1wiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBFWFBSRVNTIE9SXG4vLyBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSxcbi8vIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT05JTkZSSU5HRU1FTlQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRVxuLy8gQVVUSE9SUyBPUiBDT1BZUklHSFQgSE9MREVSUyBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSwgREFNQUdFUyBPUiBPVEhFUlxuLy8gTElBQklMSVRZLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUiBPVEhFUldJU0UsIEFSSVNJTkcgRlJPTSxcbi8vIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IgT1RIRVIgREVBTElOR1MgSU5cbi8vIFRIRSBTT0ZUV0FSRS5cblxuaW1wb3J0IFJlYWN0LCB7Q29tcG9uZW50fSBmcm9tICdyZWFjdCc7XG5pbXBvcnQgUHJvcFR5cGVzIGZyb20gJ3Byb3AtdHlwZXMnO1xuaW1wb3J0IHN0eWxlZCBmcm9tICdzdHlsZWQtY29tcG9uZW50cyc7XG5cbmltcG9ydCB7XG4gIEJ1dHRvbixcbiAgUGFuZWxMYWJlbCxcbiAgU2lkZVBhbmVsU2VjdGlvblxufSBmcm9tICdjb21wb25lbnRzL2NvbW1vbi9zdHlsZWQtY29tcG9uZW50cyc7XG5pbXBvcnQgSXRlbVNlbGVjdG9yIGZyb20gJ2NvbXBvbmVudHMvY29tbW9uL2l0ZW0tc2VsZWN0b3IvaXRlbS1zZWxlY3Rvcic7XG5cbmltcG9ydCBWaXNDb25maWdCeUZpZWxkU2VsZWN0b3IgZnJvbSAnLi92aXMtY29uZmlnLWJ5LWZpZWxkLXNlbGVjdG9yJztcbmltcG9ydCBMYXllclR5cGVTZWxlY3RvciBmcm9tICcuL2xheWVyLXR5cGUtc2VsZWN0b3InO1xuaW1wb3J0IERpbWVuc2lvblNjYWxlU2VsZWN0b3IgZnJvbSAnLi9kaW1lbnNpb24tc2NhbGUtc2VsZWN0b3InO1xuaW1wb3J0IENvbG9yU2VsZWN0b3IgZnJvbSAnLi9jb2xvci1zZWxlY3Rvcic7XG5pbXBvcnQgU291cmNlRGF0YVNlbGVjdG9yIGZyb20gJ2NvbXBvbmVudHMvc2lkZS1wYW5lbC9zb3VyY2UtZGF0YS1zZWxlY3Rvcic7XG5pbXBvcnQgTGF5ZXJDb25maWdHcm91cCwge1xuICBDb25maWdHcm91cENvbGxhcHNpYmxlQ29udGVudFxufSBmcm9tICcuL2xheWVyLWNvbmZpZy1ncm91cCc7XG5pbXBvcnQgV2lkZ2V0TGF5ZXJTZWxlY3RvciBmcm9tICcuL3dpZGdldC1sYXllci1zZWxlY3Rvcic7XG5pbXBvcnQgV2lkZ2V0QWdncmVnYXRpb25TZWxlY3RvciBmcm9tICcuL3dpZGdldC1hZ2dyZWdhdGlvbi1zZWxlY3Rvcic7XG5pbXBvcnQgV2lkZ2V0RmllbGRTZWxlY3RvciBmcm9tICcuL3dpZGdldC1maWVsZC1zZWxlY3Rvcic7XG5pbXBvcnQgV2lkZ2V0Q29uZmlnR3JvdXAgZnJvbSAnLi93aWRnZXQtY29uZmlnLWdyb3VwJztcblxuaW1wb3J0IHtjYXBpdGFsaXplRmlyc3RMZXR0ZXJ9IGZyb20gJ3V0aWxzL3V0aWxzJztcblxuaW1wb3J0IHtDSEFOTkVMX1NDQUxFX1NVUFBPUlRFRF9GSUVMRFN9IGZyb20gJ2NvbnN0YW50cy9kZWZhdWx0LXNldHRpbmdzJztcbi8vIGltcG9ydCBmaWxlcyBmcm9tICcuLi8uLi8uLi8uLi9kaXN0L2NvbXBvbmVudHMvY29tbW9uL2ljb25zL2ZpbGVzJztcbi8vIGltcG9ydCBsYXllclBhbmVsIGZyb20gJy4uLy4uLy4uLy4uL2Rpc3QvY29tcG9uZW50cy9zaWRlLXBhbmVsL2xheWVyLXBhbmVsL2xheWVyLXBhbmVsJztcblxuY29uc3QgU3R5bGVkTGF5ZXJDb25maWd1cmF0b3IgPSBzdHlsZWQuZGl2LmF0dHJzKHtcbiAgY2xhc3NOYW1lOiAnbGF5ZXItcGFuZWxfX2NvbmZpZydcbn0pYFxuICBwb3NpdGlvbjogcmVsYXRpdmU7XG4gIG1hcmdpbi10b3A6IDEycHg7XG5gO1xuXG5jb25zdCBTdHlsZWRXaWRnZXRWaXN1YWxDb25maWd1cmF0b3IgPSBzdHlsZWQuZGl2LmF0dHJzKHtcbiAgY2xhc3NOYW1lOiAnbGF5ZXItcGFuZWxfX2NvbmZpZ19fdmlzdWFsQy1jb25maWcnXG59KWBcbiAgbWFyZ2luLXRvcDogMTJweDtcbmA7XG5cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIFdpZGdldENvbmZpZ3VyYXRvciBleHRlbmRzIENvbXBvbmVudCB7XG4gIHN0YXRpYyBwcm9wVHlwZXMgPSB7XG4gICAgd2lkZ2V0OiBQcm9wVHlwZXMub2JqZWN0LmlzUmVxdWlyZWQsXG4gICAgZGF0YXNldHM6IFByb3BUeXBlcy5vYmplY3QuaXNSZXF1aXJlZCxcbiAgICB3aWRnZXRUeXBlT3B0aW9uczogUHJvcFR5cGVzLmFycmF5T2YoUHJvcFR5cGVzLmFueSkuaXNSZXF1aXJlZCxcbiAgICBvcGVuTW9kYWw6IFByb3BUeXBlcy5mdW5jLmlzUmVxdWlyZWQsXG4gICAgdXBkYXRlTGF5ZXJDb25maWc6IFByb3BUeXBlcy5mdW5jLmlzUmVxdWlyZWQsXG4gICAgdXBkYXRlTGF5ZXJUeXBlOiBQcm9wVHlwZXMuZnVuYy5pc1JlcXVpcmVkLFxuICAgIHVwZGF0ZUxheWVyVmlzQ29uZmlnOiBQcm9wVHlwZXMuZnVuYy5pc1JlcXVpcmVkLFxuICAgIHVwZGF0ZUxheWVyVmlzdWFsQ2hhbm5lbENvbmZpZzogUHJvcFR5cGVzLmZ1bmMuaXNSZXF1aXJlZFxuICB9O1xuXG4gIF9yZW5kZXJGdW5jdGlvbldpZGdldENvbmZpZyhwcm9wcykge1xuICAgIHJldHVybiB0aGlzLl9yZW5kZXJBZ2dyZWdhdGlvbldpZGdldENvbmZpZyhwcm9wcyk7XG4gIH1cblxuICBfcmVuZGVyQWdncmVnYXRpb25XaWRnZXRDb25maWcoe1xuICAgIGxheWVycyxcbiAgICB3aWRnZXQsXG4gICAgZGF0YXNldHMsXG4gICAgZGF0YUlkLFxuICAgIHdpZGdldENvbmZpZ3VyYXRvclByb3BzXG4gIH0pIHtcbiAgICBjb25zdCB7ZmllbGRzfSA9IHdpZGdldC5jb25maWcuZGF0YUlkID8gZGF0YXNldHNbd2lkZ2V0LmNvbmZpZy5kYXRhSWRdIDoge307XG4gICAgZmllbGRzLmZpbHRlcihmaWVsZCA9PiBmaWVsZC50eXBlICE9PSAnZ2VvanNvbicpO1xuICAgIHJldHVybiAoXG4gICAgICA8U3R5bGVkV2lkZ2V0VmlzdWFsQ29uZmlndXJhdG9yPlxuICAgICAgICB7LyogPExheWVyQ29uZmlnR3JvdXAgbGFiZWw9eydsYXllcid9PlxuICAgICAgICAgIDxXaWRnZXRMYXllclNlbGVjdG9yXG4gICAgICAgICAgICB3aWRnZXQ9e3dpZGdldH1cbiAgICAgICAgICAgIGxheWVycz17bGF5ZXJzfVxuICAgICAgICAgICAgZGF0YUlkPXtkYXRhSWR9XG4gICAgICAgICAgICBvblNlbGVjdD17dmFsdWUgPT5cbiAgICAgICAgICAgICAgdGhpcy5wcm9wcy51cGRhdGVMYXllckNvbmZpZyh7c2VsZWN0ZWRMYXllcjogdmFsdWV9KVxuICAgICAgICAgICAgfVxuICAgICAgICAgIC8+XG4gICAgICAgIDwvTGF5ZXJDb25maWdHcm91cD4gKi99XG4gICAgICAgIDxMYXllckNvbmZpZ0dyb3VwIGxhYmVsPXsnQWdncmVnYXRpb24nfT5cbiAgICAgICAgICA8V2lkZ2V0QWdncmVnYXRpb25TZWxlY3RvclxuICAgICAgICAgICAgd2lkZ2V0PXt3aWRnZXR9XG4gICAgICAgICAgICB7Li4ud2lkZ2V0Q29uZmlndXJhdG9yUHJvcHN9XG4gICAgICAgICAgLz5cbiAgICAgICAgICB7d2lkZ2V0LmNvbmZpZy5hZ2dyZWdhdGlvblR5cGUgPyAoXG4gICAgICAgICAgICB3aWRnZXQuY29uZmlnLmFnZ3JlZ2F0aW9uVHlwZSA9PT0gJ2NvdW50JyA/IG51bGwgOiAoXG4gICAgICAgICAgICAgIDxXaWRnZXRGaWVsZFNlbGVjdG9yXG4gICAgICAgICAgICAgICAgZmllbGRzPXtmaWVsZHN9XG4gICAgICAgICAgICAgICAgd2lkZ2V0PXt3aWRnZXR9XG4gICAgICAgICAgICAgICAgcGxhY2Vob2xkZXI9eydlbXB0eSd9XG4gICAgICAgICAgICAgICAgb25DaGFuZ2U9e3RoaXMucHJvcHMudXBkYXRlTGF5ZXJDb25maWd9XG4gICAgICAgICAgICAgIC8+XG4gICAgICAgICAgICApXG4gICAgICAgICAgKSA6IG51bGx9XG4gICAgICAgIDwvTGF5ZXJDb25maWdHcm91cD5cbiAgICAgICAgPFdpZGdldENvbmZpZ0dyb3VwXG4gICAgICAgICAgbGFiZWw9eydEeW5hbWljJ31cbiAgICAgICAgICBwcm9wZXJ0eT17J2JvdW5kcyd9XG4gICAgICAgICAgZGVzY3JpcHRpb249eydDYWxjdWxhdGlvbiBvbiB0aGUgYmFzaXMgb2YgYm91bmRzIG9mIG1hcCBvbiBzY3JlZW4nfVxuICAgICAgICAgIHsuLi53aWRnZXRDb25maWd1cmF0b3JQcm9wc31cbiAgICAgICAgLz5cbiAgICAgIDwvU3R5bGVkV2lkZ2V0VmlzdWFsQ29uZmlndXJhdG9yPlxuICAgICk7XG4gIH1cblxuICBfcmVuZGVyQ2F0ZWdvcnlXaWRnZXRDb25maWcocHJvcHMpIHtcbiAgICByZXR1cm4gdGhpcy5fcmVuZGVyQ2F0ZWdvcnlDb25maWcocHJvcHMpO1xuICB9XG5cbiAgX3JlbmRlckNhdGVnb3J5Q29uZmlnKHtcbiAgICBsYXllcnMsXG4gICAgd2lkZ2V0LFxuICAgIGRhdGFzZXRzLFxuICAgIGRhdGFJZCxcbiAgICB3aWRnZXRDb25maWd1cmF0b3JQcm9wc1xuICB9KSB7XG4gICAgY29uc3Qge2ZpZWxkc30gPSB3aWRnZXQuY29uZmlnLmRhdGFJZCA/IGRhdGFzZXRzW3dpZGdldC5jb25maWcuZGF0YUlkXSA6IFtdO1xuICAgIGZpZWxkcy5maWx0ZXIoZmllbGQgPT4gZmllbGQudHlwZSAhPT0gJ2dlb2pzb24nKTtcblxuICAgIHJldHVybiAoXG4gICAgICA8U3R5bGVkV2lkZ2V0VmlzdWFsQ29uZmlndXJhdG9yPlxuICAgICAgICB7LyogPExheWVyQ29uZmlnR3JvdXAgbGFiZWw9eydsYXllcid9PlxuICAgICAgICAgIDxXaWRnZXRMYXllclNlbGVjdG9yXG4gICAgICAgICAgICB3aWRnZXQ9e3dpZGdldH1cbiAgICAgICAgICAgIGxheWVycz17bGF5ZXJzfVxuICAgICAgICAgICAgZGF0YUlkPXtkYXRhSWR9XG4gICAgICAgICAgICBvblNlbGVjdD17dmFsdWUgPT5cbiAgICAgICAgICAgICAgdGhpcy5wcm9wcy51cGRhdGVMYXllckNvbmZpZyh7c2VsZWN0ZWRMYXllcjogdmFsdWV9KVxuICAgICAgICAgICAgfVxuICAgICAgICAgIC8+XG4gICAgICAgIDwvTGF5ZXJDb25maWdHcm91cD4gKi99XG4gICAgICAgIDxMYXllckNvbmZpZ0dyb3VwIGxhYmVsPXsnQ2F0ZWdvcml6ZSBieSd9PlxuICAgICAgICAgIDxXaWRnZXRGaWVsZFNlbGVjdG9yXG4gICAgICAgICAgICBmaWVsZHM9e2ZpZWxkc31cbiAgICAgICAgICAgIHdpZGdldD17d2lkZ2V0fVxuICAgICAgICAgICAgcGxhY2Vob2xkZXI9eydlbXB0eSd9XG4gICAgICAgICAgICB0eXBlPXsnY2F0ZWdvcnknfVxuICAgICAgICAgICAgb25DaGFuZ2U9e3RoaXMucHJvcHMudXBkYXRlTGF5ZXJDb25maWd9XG4gICAgICAgICAgLz5cbiAgICAgICAgPC9MYXllckNvbmZpZ0dyb3VwPlxuICAgICAgICA8TGF5ZXJDb25maWdHcm91cCBsYWJlbD17J0FnZ3JlZ2F0aW9uJ30+XG4gICAgICAgICAgPFdpZGdldEFnZ3JlZ2F0aW9uU2VsZWN0b3JcbiAgICAgICAgICAgIHdpZGdldD17d2lkZ2V0fVxuICAgICAgICAgICAgey4uLndpZGdldENvbmZpZ3VyYXRvclByb3BzfVxuICAgICAgICAgIC8+XG4gICAgICAgICAge3dpZGdldC5jb25maWcuYWdncmVnYXRpb25UeXBlID8gKFxuICAgICAgICAgICAgd2lkZ2V0LmNvbmZpZy5hZ2dyZWdhdGlvblR5cGUgPT09ICdjb3VudCcgPyBudWxsIDogKFxuICAgICAgICAgICAgICA8V2lkZ2V0RmllbGRTZWxlY3RvclxuICAgICAgICAgICAgICAgIGZpZWxkcz17ZmllbGRzfVxuICAgICAgICAgICAgICAgIHdpZGdldD17d2lkZ2V0fVxuICAgICAgICAgICAgICAgIHBsYWNlaG9sZGVyPXsnZW1wdHknfVxuICAgICAgICAgICAgICAgIG9uQ2hhbmdlPXt0aGlzLnByb3BzLnVwZGF0ZUxheWVyQ29uZmlnfVxuICAgICAgICAgICAgICAvPlxuICAgICAgICAgICAgKVxuICAgICAgICAgICkgOiBudWxsfVxuICAgICAgICA8L0xheWVyQ29uZmlnR3JvdXA+XG4gICAgICAgIDxXaWRnZXRDb25maWdHcm91cFxuICAgICAgICAgIGxhYmVsPXsnRHluYW1pYyd9XG4gICAgICAgICAgcHJvcGVydHk9eydib3VuZHMnfVxuICAgICAgICAgIGRlc2NyaXB0aW9uPXsnQ2FsY3VsYXRpb24gb24gdGhlIGJhc2lzIG9mIGJvdW5kcyBvZiBtYXAgb24gc2NyZWVuJ31cbiAgICAgICAgICB7Li4ud2lkZ2V0Q29uZmlndXJhdG9yUHJvcHN9XG4gICAgICAgIC8+XG4gICAgICA8L1N0eWxlZFdpZGdldFZpc3VhbENvbmZpZ3VyYXRvcj5cbiAgICApO1xuICB9XG5cbiAgX2ZpbmRMYXllcklkeCA9IChsYXllcnMsIGlkKSA9PiB7XG4gICAgLy8gY29uc29sZS5sb2coJ2luc2lkZV9maW5kTGF5ZXJJZHgnLCBsYXllcnMsIGlkKTtcbiAgICBsYXllcnMubWFwKChrZXksIGxpZGdldCkgPT4ge1xuICAgICAgaWYgKGxpZGdldC5pZCA9PT0gaWQpIHtcbiAgICAgICAgLy8gY29uc29sZS5sb2coa2V5KTtcbiAgICAgIH1cbiAgICB9KTtcbiAgfTtcblxuICByZW5kZXIoKSB7XG4gICAgY29uc3Qge1xuICAgICAgd2lkZ2V0LFxuICAgICAgbGF5ZXJzLFxuICAgICAgZGF0YXNldHMsXG4gICAgICB1cGRhdGVMYXllckNvbmZpZyxcbiAgICAgIHdpZGdldFR5cGVPcHRpb25zLFxuICAgICAgdXBkYXRlTGF5ZXJUeXBlXG4gICAgfSA9IHRoaXMucHJvcHM7XG4gICAgY29uc3Qge2ZpZWxkcyA9IFtdfSA9IHdpZGdldC5jb25maWcuZGF0YUlkXG4gICAgICA/IGRhdGFzZXRzW3dpZGdldC5jb25maWcuZGF0YUlkXVxuICAgICAgOiB7fTtcbiAgICBjb25zdCB7Y29uZmlnfSA9IHdpZGdldDtcblxuICAgIGNvbnN0IGRhdGFJZCA9IGNvbmZpZy5kYXRhSWQ7XG5cbiAgICBjb25zdCBjb21tb25Db25maWdQcm9wID0ge1xuICAgICAgd2lkZ2V0LFxuICAgICAgZmllbGRzXG4gICAgfTtcblxuICAgIGNvbnN0IHZpc0NvbmZpZ3VyYXRvclByb3BzID0ge1xuICAgICAgLi4uY29tbW9uQ29uZmlnUHJvcCxcbiAgICAgIG9uQ2hhbmdlOiB0aGlzLnByb3BzLnVwZGF0ZUxheWVyVmlzQ29uZmlnXG4gICAgfTtcblxuICAgIGNvbnN0IHdpZGdldENvbmZpZ3VyYXRvclByb3BzID0ge1xuICAgICAgLi4uY29tbW9uQ29uZmlnUHJvcCxcbiAgICAgIG9uQ2hhbmdlOiB1cGRhdGVMYXllckNvbmZpZ1xuICAgIH07XG5cbiAgICBjb25zdCBsYXllckNoYW5uZWxDb25maWdQcm9wcyA9IHtcbiAgICAgIC4uLmNvbW1vbkNvbmZpZ1Byb3AsXG4gICAgICBvbkNoYW5nZTogdGhpcy5wcm9wcy51cGRhdGVMYXllclZpc3VhbENoYW5uZWxDb25maWdcbiAgICB9O1xuXG4gICAgY29uc3QgcmVuZGVyVGVtcGxhdGUgPVxuICAgICAgd2lkZ2V0LnR5cGUgJiYgYF9yZW5kZXIke2NhcGl0YWxpemVGaXJzdExldHRlcih3aWRnZXQudHlwZSl9V2lkZ2V0Q29uZmlnYDtcblxuICAgIC8vIGNvbnNvbGUubG9nKCdsYXllciBpbnNpZGUgd2lkZ2V0LWNvbmZpZ3VyYXRvcicsIGxheWVyKTtcbiAgICByZXR1cm4gKFxuICAgICAgPFN0eWxlZExheWVyQ29uZmlndXJhdG9yPlxuICAgICAgICB7d2lkZ2V0LmxheWVySW5mb01vZGFsID8gKFxuICAgICAgICAgIDxIb3dUb0J1dHRvblxuICAgICAgICAgICAgb25DbGljaz17KCkgPT4gdGhpcy5wcm9wcy5vcGVuTW9kYWwod2lkZ2V0LmxheWVySW5mb01vZGFsKX1cbiAgICAgICAgICAvPlxuICAgICAgICApIDogbnVsbH1cbiAgICAgICAgPExheWVyQ29uZmlnR3JvdXBcbiAgICAgICAgICBsYWJlbD17J2Jhc2ljJ31cbiAgICAgICAgICBjb2xsYXBzaWJsZVxuICAgICAgICAgIGV4cGFuZGVkPXtPYmplY3Qua2V5cyhkYXRhc2V0cykubGVuZ3RoID4gMSAmJiB3aWRnZXQudHlwZX1cbiAgICAgICAgPlxuICAgICAgICAgIDxMYXllclR5cGVTZWxlY3RvclxuICAgICAgICAgICAgbGF5ZXI9e3dpZGdldH1cbiAgICAgICAgICAgIHdpZGdldFR5cGVPcHRpb25zPXt3aWRnZXRUeXBlT3B0aW9uc31cbiAgICAgICAgICAgIG9uU2VsZWN0PXt1cGRhdGVMYXllclR5cGV9XG4gICAgICAgICAgLz5cbiAgICAgICAgICA8Q29uZmlnR3JvdXBDb2xsYXBzaWJsZUNvbnRlbnQ+XG4gICAgICAgICAgICB7T2JqZWN0LmtleXMoZGF0YXNldHMpLmxlbmd0aCA+IDEgJiYgKFxuICAgICAgICAgICAgICA8U291cmNlRGF0YVNlbGVjdG9yXG4gICAgICAgICAgICAgICAgZGF0YXNldHM9e2RhdGFzZXRzfVxuICAgICAgICAgICAgICAgIGlkPXt3aWRnZXQuaWR9XG4gICAgICAgICAgICAgICAgZGlzYWJsZWQ9e3dpZGdldC50eWVwICYmIGNvbmZpZy5zZWxlY3RlZEZpZWxkfVxuICAgICAgICAgICAgICAgIGRhdGFJZD17Y29uZmlnLmRhdGFJZH1cbiAgICAgICAgICAgICAgICBvblNlbGVjdD17dmFsdWUgPT5cbiAgICAgICAgICAgICAgICAgIHVwZGF0ZUxheWVyQ29uZmlnKHtcbiAgICAgICAgICAgICAgICAgICAgZGF0YUlkOiB2YWx1ZSxcbiAgICAgICAgICAgICAgICAgICAgYWdncmVnYXRpb25UeXBlOiBudWxsLFxuICAgICAgICAgICAgICAgICAgICBzZWxlY3RlZExheWVyOiBudWxsLFxuICAgICAgICAgICAgICAgICAgICBhZ2dyZWdhdGVkRGF0YTogbnVsbFxuICAgICAgICAgICAgICAgICAgfSlcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIC8+XG4gICAgICAgICAgICApfVxuICAgICAgICAgIDwvQ29uZmlnR3JvdXBDb2xsYXBzaWJsZUNvbnRlbnQ+XG4gICAgICAgIDwvTGF5ZXJDb25maWdHcm91cD5cbiAgICAgICAge3RoaXNbcmVuZGVyVGVtcGxhdGVdICYmXG4gICAgICAgICAgdGhpc1tyZW5kZXJUZW1wbGF0ZV0oe1xuICAgICAgICAgICAgd2lkZ2V0LFxuICAgICAgICAgICAgbGF5ZXJzLFxuICAgICAgICAgICAgZGF0YXNldHMsXG4gICAgICAgICAgICBkYXRhSWQsXG4gICAgICAgICAgICB2aXNDb25maWd1cmF0b3JQcm9wcyxcbiAgICAgICAgICAgIGxheWVyQ2hhbm5lbENvbmZpZ1Byb3BzLFxuICAgICAgICAgICAgd2lkZ2V0Q29uZmlndXJhdG9yUHJvcHNcbiAgICAgICAgICB9KX1cbiAgICAgIDwvU3R5bGVkTGF5ZXJDb25maWd1cmF0b3I+XG4gICAgKTtcbiAgfVxufVxuXG4vKlxuICogQ29tcG9uZW50aXplIGNvbmZpZyBjb21wb25lbnQgaW50byBwdXJlIGZ1bmN0aW9uYWwgY29tcG9uZW50c1xuICovXG5cbmNvbnN0IFN0eWxlZEhvd1RvQnV0dG9uID0gc3R5bGVkLmRpdmBcbiAgcG9zaXRpb246IGFic29sdXRlO1xuICByaWdodDogMTJweDtcbiAgdG9wOiAtNHB4O1xuYDtcblxuZXhwb3J0IGNvbnN0IEhvd1RvQnV0dG9uID0gKHtvbkNsaWNrfSkgPT4gKFxuICA8U3R5bGVkSG93VG9CdXR0b24+XG4gICAgPEJ1dHRvbiBsaW5rIHNtYWxsIG9uQ2xpY2s9e29uQ2xpY2t