kepler.gl.geoiq
Version:
kepler.gl is a webgl based application to visualize large scale location data in the browser
285 lines (238 loc) • 33.4 kB
JavaScript
;
var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
var _typeof = require("@babel/runtime/helpers/typeof");
Object.defineProperty(exports, "__esModule", {
value: true
});
exports["default"] = exports.PaletteConfig = exports.ColorPaletteGroup = exports.ALL_TYPES = exports.ALL_STEPS = void 0;
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 _lodash = _interopRequireDefault(require("lodash.uniq"));
var _styledComponents = _interopRequireDefault(require("styled-components"));
var _reselect = require("reselect");
var _itemSelector = _interopRequireDefault(require("../../common/item-selector/item-selector"));
var _styledComponents2 = require("../../common/styled-components");
var _switch = _interopRequireDefault(require("../../common/switch"));
var _colorPalette = _interopRequireDefault(require("./color-palette"));
var _customPalette = _interopRequireDefault(require("./custom-palette"));
var _colorRanges = require("../../../constants/color-ranges");
var _dataUtils = require("../../../utils/data-utils");
var _colorUtils = require("../../../utils/color-utils");
var _templateObject, _templateObject2, _templateObject3, _templateObject4;
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 _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; } }
var ALL_TYPES = exports.ALL_TYPES = (0, _lodash["default"])(_colorRanges.COLOR_RANGES.map(function (c) {
return c.type;
}).filter(function (ctype) {
return ctype;
}).concat(['all', 'custom']));
var ALL_STEPS = exports.ALL_STEPS = (0, _lodash["default"])(_colorRanges.COLOR_RANGES.map(function (d) {
return d.colors.length;
})).sort(_dataUtils.numberSort);
var StyledColorConfig = _styledComponents["default"].div(_templateObject || (_templateObject = (0, _taggedTemplateLiteral2["default"])(["\n padding: 12px 12px 0 12px;\n"])));
var StyledColorRangeSelector = _styledComponents["default"].div.attrs({
className: 'color-range-selector'
})(_templateObject2 || (_templateObject2 = (0, _taggedTemplateLiteral2["default"])(["\n padding-bottom: 12px;\n"])));
var StyledPaletteConfig = _styledComponents["default"].div(_templateObject3 || (_templateObject3 = (0, _taggedTemplateLiteral2["default"])(["\n margin-bottom: 8px;\n display: flex;\n justify-content: space-between;\n align-items: center;\n .color-palette__config__label {\n flex-grow: 1;\n }\n .color-palette__config__select {\n flex-grow: 1;\n }\n .item-selector .item-selector__dropdown {\n ", ";\n }\n"])), function (props) {
return props.theme.secondaryInput;
});
var CONFIG_SETTINGS = {
type: {
type: 'select',
options: ALL_TYPES
},
steps: {
type: 'select',
options: ALL_STEPS
},
reversed: {
type: 'switch',
options: [true, false]
},
custom: {
label: 'Custom Palette',
type: 'switch',
options: [true, false]
}
};
var ColorRangeSelect = exports["default"] = /*#__PURE__*/function (_Component) {
(0, _inherits2["default"])(ColorRangeSelect, _Component);
var _super = _createSuper(ColorRangeSelect);
function ColorRangeSelect() {
var _this;
(0, _classCallCheck2["default"])(this, ColorRangeSelect);
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), "colorRangesSelector", function (props) {
return props.colorRanges;
});
(0, _defineProperty2["default"])((0, _assertThisInitialized2["default"])(_this), "configTypeSelector", function (props) {
return props.colorPaletteUI.colorRangeConfig.type;
});
(0, _defineProperty2["default"])((0, _assertThisInitialized2["default"])(_this), "configStepSelector", function (props) {
return props.colorPaletteUI.colorRangeConfig.steps;
});
(0, _defineProperty2["default"])((0, _assertThisInitialized2["default"])(_this), "filteredColorRange", (0, _reselect.createSelector)(_this.colorRangesSelector, _this.configTypeSelector, _this.configStepSelector, function (colorRanges, type, steps) {
return colorRanges.filter(function (colorRange) {
var isType = type === 'all' || type === colorRange.type;
var isStep = Number(steps) === colorRange.colors.length;
return isType && isStep;
});
}));
(0, _defineProperty2["default"])((0, _assertThisInitialized2["default"])(_this), "_updateConfig", function (_ref) {
var key = _ref.key,
value = _ref.value;
_this._setColorRangeConfig((0, _defineProperty2["default"])({}, key, value));
});
(0, _defineProperty2["default"])((0, _assertThisInitialized2["default"])(_this), "_onSetCustomPalette", function (config) {
_this.props.setColorPaletteUI({
customPalette: config
});
});
(0, _defineProperty2["default"])((0, _assertThisInitialized2["default"])(_this), "_setColorRangeConfig", function (newConfig) {
_this.props.setColorPaletteUI({
colorRangeConfig: newConfig
});
});
(0, _defineProperty2["default"])((0, _assertThisInitialized2["default"])(_this), "_onCustomPaletteCancel", function (newConfig) {
_this.props.setColorPaletteUI({
showSketcher: false,
colorRangeConfig: {
custom: false
}
});
});
(0, _defineProperty2["default"])((0, _assertThisInitialized2["default"])(_this), "_onToggleSketcher", function (val) {
_this.props.setColorPaletteUI({
showSketcher: val
});
});
return _this;
}
(0, _createClass2["default"])(ColorRangeSelect, [{
key: "render",
value: function render() {
var _this2 = this;
var _this$props$colorPale = this.props.colorPaletteUI,
customPalette = _this$props$colorPale.customPalette,
showSketcher = _this$props$colorPale.showSketcher,
colorRangeConfig = _this$props$colorPale.colorRangeConfig;
var filteredColorRanges = this.filteredColorRange(this.props);
return (/*#__PURE__*/_react["default"].createElement(StyledColorRangeSelector, null, /*#__PURE__*/_react["default"].createElement(StyledColorConfig, null, (colorRangeConfig.custom ? ['custom'] : Object.keys(colorRangeConfig)).map(function (key) {
return (/*#__PURE__*/_react["default"].createElement(PaletteConfig, {
key: key,
label: CONFIG_SETTINGS[key].label || key,
config: CONFIG_SETTINGS[key],
value: colorRangeConfig[key],
onChange: function onChange(value) {
return _this2._updateConfig({
key: key,
value: value
});
}
})
);
})), colorRangeConfig.custom ? /*#__PURE__*/_react["default"].createElement(_customPalette["default"], {
customPalette: customPalette,
showSketcher: showSketcher,
selected: this.props.selectedColorRange,
onApply: this.props.onSelectColorRange,
onToggleSketcher: this._onToggleSketcher,
setCustomPalette: this._onSetCustomPalette,
onCancel: this._onCustomPaletteCancel
}) : /*#__PURE__*/_react["default"].createElement(ColorPaletteGroup, {
colorRanges: filteredColorRanges,
onSelect: this.props.onSelectColorRange,
selected: this.props.selectedColorRange,
reversed: colorRangeConfig.reversed
}))
);
}
}]);
return ColorRangeSelect;
}(_react.Component);
(0, _defineProperty2["default"])(ColorRangeSelect, "propTypes", {
colorPaletteUI: _propTypes["default"].object.isRequired,
selectedColorRange: _propTypes["default"].object.isRequired,
onSelectColorRange: _propTypes["default"].func.isRequired,
setColorPaletteUI: _propTypes["default"].func.isRequired,
// optional
colorRanges: _propTypes["default"].arrayOf(_propTypes["default"].any)
});
(0, _defineProperty2["default"])(ColorRangeSelect, "defaultProps", {
colorRanges: _colorRanges.COLOR_RANGES,
onSelectColorRange: function onSelectColorRange() {},
setColorPaletteUI: function setColorPaletteUI() {}
});
var PaletteConfig = exports.PaletteConfig = function PaletteConfig(_ref2) {
var label = _ref2.label,
value = _ref2.value,
_ref2$config = _ref2.config,
type = _ref2$config.type,
options = _ref2$config.options,
_onChange = _ref2.onChange;
return (/*#__PURE__*/_react["default"].createElement(StyledPaletteConfig, {
className: "color-palette__config",
onClick: function onClick(e) {
return e.stopPropagation();
}
}, /*#__PURE__*/_react["default"].createElement("div", {
className: "color-palette__config__label"
}, /*#__PURE__*/_react["default"].createElement(_styledComponents2.PanelLabel, null, label)), type === 'select' && /*#__PURE__*/_react["default"].createElement("div", {
className: "color-palette__config__select"
}, /*#__PURE__*/_react["default"].createElement(_itemSelector["default"], {
selectedItems: value,
options: options,
multiSelect: false,
searchable: false,
onChange: _onChange
})), type === 'switch' && /*#__PURE__*/_react["default"].createElement(_switch["default"], {
checked: value,
id: "".concat(label, "-toggle"),
onChange: function onChange() {
return _onChange(!value);
},
secondary: true
}))
);
};
var StyledColorRange = _styledComponents["default"].div.attrs({
className: 'color-palette-outer'
})(_templateObject4 || (_templateObject4 = (0, _taggedTemplateLiteral2["default"])(["\n padding: 0 8px;\n :hover {\n background-color: ", ";\n cursor: pointer;\n }\n"])), function (props) {
return props.theme.panelBackgroundHover;
});
var ColorPaletteGroup = exports.ColorPaletteGroup = function ColorPaletteGroup(_ref3) {
var reversed = _ref3.reversed,
onSelect = _ref3.onSelect,
selected = _ref3.selected,
colorRanges = _ref3.colorRanges;
return (/*#__PURE__*/_react["default"].createElement("div", {
className: "color-palette__group"
}, colorRanges.map(function (colorRange, i) {
return (/*#__PURE__*/_react["default"].createElement(StyledColorRange, {
key: "".concat(colorRange.name, "-").concat(i),
onClick: function onClick(e) {
return onSelect(reversed ? (0, _colorUtils.reverseColorRange)(true, colorRange) : colorRange, e);
}
}, /*#__PURE__*/_react["default"].createElement(_colorPalette["default"], {
colors: colorRange.colors,
isReversed: reversed,
isSelected: colorRange.name === selected.name && reversed === Boolean(selected.reversed)
}))
);
}))
);
};
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3NyYy9jb21wb25lbnRzL3NpZGUtcGFuZWwvbGF5ZXItcGFuZWwvY29sb3ItcmFuZ2Utc2VsZWN0b3IuanMiXSwibmFtZXMiOlsiQUxMX1RZUEVTIiwiQ09MT1JfUkFOR0VTIiwibWFwIiwiYyIsInR5cGUiLCJmaWx0ZXIiLCJjdHlwZSIsImNvbmNhdCIsIkFMTF9TVEVQUyIsImQiLCJjb2xvcnMiLCJsZW5ndGgiLCJzb3J0IiwibnVtYmVyU29ydCIsIlN0eWxlZENvbG9yQ29uZmlnIiwic3R5bGVkIiwiZGl2IiwiU3R5bGVkQ29sb3JSYW5nZVNlbGVjdG9yIiwiYXR0cnMiLCJjbGFzc05hbWUiLCJTdHlsZWRQYWxldHRlQ29uZmlnIiwicHJvcHMiLCJ0aGVtZSIsInNlY29uZGFyeUlucHV0IiwiQ09ORklHX1NFVFRJTkdTIiwib3B0aW9ucyIsInN0ZXBzIiwicmV2ZXJzZWQiLCJjdXN0b20iLCJsYWJlbCIsIkNvbG9yUmFuZ2VTZWxlY3QiLCJjb2xvclJhbmdlcyIsImNvbG9yUGFsZXR0ZVVJIiwiY29sb3JSYW5nZUNvbmZpZyIsImNvbG9yUmFuZ2VzU2VsZWN0b3IiLCJjb25maWdUeXBlU2VsZWN0b3IiLCJjb25maWdTdGVwU2VsZWN0b3IiLCJjb2xvclJhbmdlIiwiaXNUeXBlIiwiaXNTdGVwIiwiTnVtYmVyIiwia2V5IiwidmFsdWUiLCJfc2V0Q29sb3JSYW5nZUNvbmZpZyIsImNvbmZpZyIsInNldENvbG9yUGFsZXR0ZVVJIiwiY3VzdG9tUGFsZXR0ZSIsIm5ld0NvbmZpZyIsInNob3dTa2V0Y2hlciIsInZhbCIsImZpbHRlcmVkQ29sb3JSYW5nZXMiLCJmaWx0ZXJlZENvbG9yUmFuZ2UiLCJPYmplY3QiLCJrZXlzIiwiX3VwZGF0ZUNvbmZpZyIsInNlbGVjdGVkQ29sb3JSYW5nZSIsIm9uU2VsZWN0Q29sb3JSYW5nZSIsIl9vblRvZ2dsZVNrZXRjaGVyIiwiX29uU2V0Q3VzdG9tUGFsZXR0ZSIsIl9vbkN1c3RvbVBhbGV0dGVDYW5jZWwiLCJDb21wb25lbnQiLCJQcm9wVHlwZXMiLCJvYmplY3QiLCJpc1JlcXVpcmVkIiwiZnVuYyIsImFycmF5T2YiLCJhbnkiLCJQYWxldHRlQ29uZmlnIiwib25DaGFuZ2UiLCJlIiwic3RvcFByb3BhZ2F0aW9uIiwiU3R5bGVkQ29sb3JSYW5nZSIsInBhbmVsQmFja2dyb3VuZEhvdmVyIiwiQ29sb3JQYWxldHRlR3JvdXAiLCJvblNlbGVjdCIsInNlbGVjdGVkIiwiaSIsIm5hbWUiLCJCb29sZWFuIl0sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFvQkE7O0FBQ0E7O0FBQ0E7O0FBQ0E7O0FBQ0E7O0FBRUE7O0FBQ0E7O0FBQ0E7O0FBQ0E7O0FBQ0E7O0FBQ0E7O0FBQ0E7O0FBQ0E7Ozs7Ozs7Ozs7OztBQUVPLElBQU1BLFNBQVMsdUJBQUcsd0JBQ3ZCQywwQkFBYUMsR0FBYixDQUFpQixVQUFBQyxDQUFDO0FBQUEsU0FBSUEsQ0FBQyxDQUFDQyxJQUFOO0FBQUEsQ0FBbEIsRUFDR0MsTUFESCxDQUNVLFVBQUFDLEtBQUs7QUFBQSxTQUFJQSxLQUFKO0FBQUEsQ0FEZixFQUVHQyxNQUZILENBRVUsQ0FBQyxLQUFELEVBQVEsUUFBUixDQUZWLENBRHVCLENBQWxCO0FBTUEsSUFBTUMsU0FBUyx1QkFBRyx3QkFBS1AsMEJBQWFDLEdBQWIsQ0FBaUIsVUFBQU8sQ0FBQztBQUFBLFNBQUlBLENBQUMsQ0FBQ0MsTUFBRixDQUFTQyxNQUFiO0FBQUEsQ0FBbEIsQ0FBTCxFQUE2Q0MsSUFBN0MsQ0FBa0RDLHFCQUFsRCxDQUFsQjs7QUFFUCxJQUFNQyxpQkFBaUIsR0FBR0MsNkJBQU9DLEdBQVYsc0hBQXZCOztBQUlBLElBQU1DLHdCQUF3QixHQUFHRiw2QkFBT0MsR0FBUCxDQUFXRSxLQUFYLENBQWlCO0FBQ2hEQyxFQUFBQSxTQUFTLEVBQUU7QUFEcUMsQ0FBakIsQ0FBSCxtSEFBOUI7O0FBTUEsSUFBTUMsbUJBQW1CLEdBQUdMLDZCQUFPQyxHQUFWLG1YQVluQixVQUFB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c0JBLFFBQXRCO0FBQUEsTUFBZ0M1QyxXQUFoQyxTQUFnQ0EsV0FBaEM7QUFBQSx1QkFDL0I7QUFBSyxNQUFBLFNBQVMsRUFBQztBQUFmLE9BQ0dBLFdBQVcsQ0FBQzdCLEdBQVosQ0FBZ0IsVUFBQ21DLFVBQUQsRUFBYXVDLENBQWI7QUFBQSwyQkFDZixnQ0FBQyxnQkFBRDtBQUVFLFVBQUEsR0FBRyxZQUFLdkMsVUFBVSxDQUFDd0MsSUFBaEIsY0FBd0JELENBQXhCLENBRkw7QUFHRSxVQUFBLE9BQU8sRUFBRSxpQkFBQVAsQ0FBQztBQUFBLG1CQUNSSyxRQUFRLENBQ04vQyxRQUFRLEdBQUcsbUNBQWtCLElBQWxCLEVBQXdCVSxVQUF4QixDQUFILEdBQXlDQSxVQUQzQyxFQUVOZ0MsQ0FGTSxDQURBO0FBQUE7QUFIWix3QkFVRSxnQ0FBQyx3QkFBRDtBQUNFLFVBQUEsTUFBTSxFQUFFaEMsVUFBVSxDQUFDM0IsTUFEckI7QUFFRSxVQUFBLFVBQVUsRUFBRWlCLFFBRmQ7QUFHRSxVQUFBLFVBQVUsRUFDUlUsVUFBVSxDQUFDd0MsSUFBWCxLQUFvQkYsUUFBUSxDQUFDRSxJQUE3QixJQUNBbEQsUUFBUSxLQUFLbUQsT0FBTyxDQUFDSCxRQUFRLENBQUNoRCxRQUFWO0FBTHhCLFVBVkY7QUFEZTtBQUFBLEtBQWhCLENBREg7QUFEK0I7QUFBQSxDQUExQiIsInNvdXJjZXNDb250ZW50IjpbIi8vIENvcHlyaWdodCAoYykgMjAyMyBVYmVyIFRlY2hub2xvZ2llcywgSW5jLlxuLy9cbi8vIFBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZyBhIGNvcHlcbi8vIG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlIFwiU29mdHdhcmVcIiksIHRvIGRlYWxcbi8vIGluIHRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uIHRoZSByaWdodHNcbi8vIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCwgZGlzdHJpYnV0ZSwgc3VibGljZW5zZSwgYW5kL29yIHNlbGxcbi8vIGNvcGllcyBvZiB0aGUgU29mdHdhcmUsIGFuZCB0byBwZXJtaXQgcGVyc29ucyB0byB3aG9tIHRoZSBTb2Z0d2FyZSBpc1xuLy8gZnVybmlzaGVkIHRvIGRvIHNvLCBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczpcbi8vXG4vLyBUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBzaGFsbCBiZSBpbmNsdWRlZCBpblxuLy8gYWxsIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUgU29mdHdhcmUuXG4vL1xuLy8gVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEIFwiQVMgSVNcIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgRVhQUkVTUyBPUlxuLy8gSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFksXG4vLyBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OSU5GUklOR0VNRU5ULiBJTiBOTyBFVkVOVCBTSEFMTCBUSEVcbi8vIEFVVEhPUlMgT1IgQ09QWVJJR0hUIEhPTERFUlMgQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sIERBTUFHRVMgT1IgT1RIRVJcbi8vIExJQUJJTElUWSwgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1IgT1RIRVJXSVNFLCBBUklTSU5HIEZST00sXG4vLyBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SIE9USEVSIERFQUxJTkdTIElOXG4vLyBUSEUgU09GVFdBUkUuXG5cbmltcG9ydCBSZWFjdCwge0NvbXBvbmVudH0gZnJvbSAncmVhY3QnO1xuaW1wb3J0IFByb3BUeXBlcyBmcm9tICdwcm9wLXR5cGVzJztcbmltcG9ydCB1bmlxIGZyb20gJ2xvZGFzaC51bmlxJztcbmltcG9ydCBzdHlsZWQgZnJvbSAnc3R5bGVkLWNvbXBvbmVudHMnO1xuaW1wb3J0IHtjcmVhdGVTZWxlY3Rvcn0gZnJvbSAncmVzZWxlY3QnO1xuXG5pbXBvcnQgSXRlbVNlbGVjdG9yIGZyb20gJ2NvbXBvbmVudHMvY29tbW9uL2l0ZW0tc2VsZWN0b3IvaXRlbS1zZWxlY3Rvcic7XG5pbXBvcnQge1BhbmVsTGFiZWx9IGZyb20gJ2NvbXBvbmVudHMvY29tbW9uL3N0eWxlZC1jb21wb25lbnRzJztcbmltcG9ydCBTd2l0Y2ggZnJvbSAnY29tcG9uZW50cy9jb21tb24vc3dpdGNoJztcbmltcG9ydCBDb2xvclBhbGV0dGUgZnJvbSAnLi9jb2xvci1wYWxldHRlJztcbmltcG9ydCBDdXN0b21QYWxldHRlIGZyb20gJy4vY3VzdG9tLXBhbGV0dGUnO1xuaW1wb3J0IHtDT0xPUl9SQU5HRVN9IGZyb20gJ2NvbnN0YW50cy9jb2xvci1yYW5nZXMnO1xuaW1wb3J0IHtudW1iZXJTb3J0fSBmcm9tICd1dGlscy9kYXRhLXV0aWxzJztcbmltcG9ydCB7cmV2ZXJzZUNvbG9yUmFuZ2V9IGZyb20gJ3V0aWxzL2NvbG9yLXV0aWxzJztcblxuZXhwb3J0IGNvbnN0IEFMTF9UWVBFUyA9IHVuaXEoXG4gIENPTE9SX1JBTkdFUy5tYXAoYyA9PiBjLnR5cGUpXG4gICAgLmZpbHRlcihjdHlwZSA9PiBjdHlwZSlcbiAgICAuY29uY2F0KFsnYWxsJywgJ2N1c3RvbSddKVxuKTtcblxuZXhwb3J0IGNvbnN0IEFMTF9TVEVQUyA9IHVuaXEoQ09MT1JfUkFOR0VTLm1hcChkID0+IGQuY29sb3JzLmxlbmd0aCkpLnNvcnQobnVtYmVyU29ydCk7XG5cbmNvbnN0IFN0eWxlZENvbG9yQ29uZmlnID0gc3R5bGVkLmRpdmBcbiAgcGFkZGluZzogMTJweCAxMnB4IDAgMTJweDtcbmA7XG5cbmNvbnN0IFN0eWxlZENvbG9yUmFuZ2VTZWxlY3RvciA9IHN0eWxlZC5kaXYuYXR0cnMoe1xuICBjbGFzc05hbWU6ICdjb2xvci1yYW5nZS1zZWxlY3Rvcidcbn0pYFxuICBwYWRkaW5nLWJvdHRvbTogMTJweDtcbmA7XG5cbmNvbnN0IFN0eWxlZFBhbGV0dGVDb25maWcgPSBzdHlsZWQuZGl2YFxuICBtYXJnaW4tYm90dG9tOiA4cHg7XG4gIGRpc3BsYXk6IGZsZXg7XG4gIGp1c3RpZnktY29udGVudDogc3BhY2UtYmV0d2VlbjtcbiAgYWxpZ24taXRlbXM6IGNlbnRlcjtcbiAgLmNvbG9yLXBhbGV0dGVfX2NvbmZpZ19fbGFiZWwge1xuICAgIGZsZXgtZ3JvdzogMTtcbiAgfVxuICAuY29sb3ItcGFsZXR0ZV9fY29uZmlnX19zZWxlY3Qge1xuICAgIGZsZXgtZ3JvdzogMTtcbiAgfVxuICAuaXRlbS1zZWxlY3RvciAuaXRlbS1zZWxlY3Rvcl9fZHJvcGRvd24ge1xuICAgICR7cHJvcHMgPT4gcHJvcHMudGhlbWUuc2Vjb25kYXJ5SW5wdXR9O1xuICB9XG5gO1xuXG5jb25zdCBDT05GSUdfU0VUVElOR1MgPSB7XG4gIHR5cGU6IHtcbiAgICB0eXBlOiAnc2VsZWN0JyxcbiAgICBvcHRpb25zOiBBTExfVFlQRVNcbiAgfSxcbiAgc3RlcHM6IHtcbiAgICB0eXBlOiAnc2VsZWN0JyxcbiAgICBvcHRpb25zOiBBTExfU1RFUFNcbiAgfSxcbiAgcmV2ZXJzZWQ6IHtcbiAgICB0eXBlOiAnc3dpdGNoJyxcbiAgICBvcHRpb25zOiBbdHJ1ZSwgZmFsc2VdXG4gIH0sXG4gIGN1c3RvbToge1xuICAgIGxhYmVsOiAnQ3VzdG9tIFBhbGV0dGUnLFxuICAgIHR5cGU6ICdzd2l0Y2gnLFxuICAgIG9wdGlvbnM6IFt0cnVlLCBmYWxzZV1cbiAgfVxufTtcblxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgQ29sb3JSYW5nZVNlbGVjdCBleHRlbmRzIENvbXBvbmVudCB7XG4gIHN0YXRpYyBwcm9wVHlwZXMgPSB7XG4gICAgY29sb3JQYWxldHRlVUk6IFByb3BUeXBlcy5vYmplY3QuaXNSZXF1aXJlZCxcbiAgICBzZWxlY3RlZENvbG9yUmFuZ2U6IFByb3BUeXBlcy5vYmplY3QuaXNSZXF1aXJlZCxcbiAgICBvblNlbGVjdENvbG9yUmFuZ2U6IFByb3BUeXBlcy5mdW5jLmlzUmVxdWlyZWQsXG4gICAgc2V0Q29sb3JQYWxldHRlVUk6IFByb3BUeXBlcy5mdW5jLmlzUmVxdWlyZWQsXG4gICAgLy8gb3B0aW9uYWxcbiAgICBjb2xvclJhbmdlczogUHJvcFR5cGVzLmFycmF5T2YoUHJvcFR5cGVzLmFueSlcbiAgfTtcblxuICBzdGF0aWMgZGVmYXVsdFByb3BzID0ge1xuICAgIGNvbG9yUmFuZ2VzOiBDT0xPUl9SQU5HRVMsXG4gICAgb25TZWxlY3RDb2xvclJhbmdlOiAoKSA9PiB7fSxcbiAgICBzZXRDb2xvclBhbGV0dGVVSTogKCkgPT4ge31cbiAgfTtcblxuICBjb2xvclJhbmdlc1NlbGVjdG9yID0gcHJvcHMgPT4gcHJvcHMuY29sb3JSYW5nZXM7XG4gIGNvbmZpZ1R5cGVTZWxlY3RvciA9IHByb3BzID0+IHByb3BzLmNvbG9yUGFsZXR0ZVVJLmNvbG9yUmFuZ2VDb25maWcudHlwZTtcbiAgY29uZmlnU3RlcFNlbGVjdG9yID0gcHJvcHMgPT4gcHJvcHMuY29sb3JQYWxldHRlVUkuY29sb3JSYW5nZUNvbmZpZy5zdGVwcztcbiAgZmlsdGVyZWRDb2xvclJhbmdlID0gY3JlYXRlU2VsZWN0b3IoXG4gICAgdGhpcy5jb2xvclJhbmdlc1NlbGVjdG9yLFxuICAgIHRoaXMuY29uZmlnVHlwZVNlbGVjdG9yLFxuICAgIHRoaXMuY29uZmlnU3RlcFNlbGVjdG9yLFxuICAgIChjb2xvclJhbmdlcywgdHlwZSwgc3RlcHMpID0+IHtcbiAgICAgIHJldHVybiBjb2xvclJhbmdlcy5maWx0ZXIoY29sb3JSYW5nZSA9PiB7XG4gICAgICAgIGNvbnN0IGlzVHlwZSA9IHR5cGUgPT09ICdhbGwnIHx8IHR5cGUgPT09IGNvbG9yUmFuZ2UudHlwZTtcbiAgICAgICAgY29uc3QgaXNTdGVwID0gTnVtYmVyKHN0ZXBzKSA9PT0gY29sb3JSYW5nZS5jb2xvcnMubGVuZ3RoO1xuXG4gICAgICAgIHJldHVybiBpc1R5cGUgJiYgaXNTdGVwO1xuICAgICAgfSk7XG4gICAgfVxuICApO1xuXG4gIF91cGRhdGVDb25maWcgPSAoe2tleSwgdmFsdWV9KSA9PiB7XG4gICAgdGhpcy5fc2V0Q29sb3JSYW5nZUNvbmZpZyh7W2tleV06IHZhbHVlfSk7XG4gIH07XG5cbiAgX29uU2V0Q3VzdG9tUGFsZXR0ZSA9IGNvbmZpZyA9PiB7XG4gICAgdGhpcy5wcm9wcy5zZXRDb2xvclBhbGV0dGVVSSh7XG4gICAgICBjdXN0b21QYWxldHRlOiBjb25maWdcbiAgICB9KTtcbiAgfTtcblxuICBfc2V0Q29sb3JSYW5nZUNvbmZpZyA9IG5ld0NvbmZpZyA9PiB7XG4gICAgdGhpcy5wcm9wcy5zZXRDb2xvclBhbGV0dGVVSSh7XG4gICAgICBjb2xvclJhbmdlQ29uZmlnOiBuZXdDb25maWdcbiAgICB9KTtcbiAgfTtcblxuICBfb25DdXN0b21QYWxldHRlQ2FuY2VsID0gbmV3Q29uZmlnID0+IHtcbiAgICB0aGlzLnByb3BzLnNldENvbG9yUGFsZXR0ZVVJKHtcbiAgICAgIHNob3dTa2V0Y2hlcjogZmFsc2UsXG4gICAgICBjb2xvclJhbmdlQ29uZmlnOiB7Y3VzdG9tOiBmYWxzZX1cbiAgICB9KTtcbiAgfTtcblxuICBfb25Ub2dnbGVTa2V0Y2hlciA9IHZhbCA9PiB7XG4gICAgdGhpcy5wcm9wcy5zZXRDb2xvclBhbGV0dGVVSSh7XG4gICAgICBzaG93U2tldGNoZXI6IHZhbFxuICAgIH0pO1xuICB9O1xuXG4gIHJlbmRlcigpIHtcbiAgICBjb25zdCB7XG4gICAgICBjdXN0b21QYWxldHRlLFxuICAgICAgc2hvd1NrZXRjaGVyLFxuICAgICAgY29sb3JSYW5nZUNvbmZpZ1xuICAgIH0gPSB0aGlzLnByb3BzLmNvbG9yUGFsZXR0ZVVJO1xuXG4gICAgY29uc3QgZmlsdGVyZWRDb2xvclJhbmdlcyA9IHRoaXMuZmlsdGVyZWRDb2xvclJhbmdlKHRoaXMucHJvcHMpO1xuXG4gICAgcmV0dXJuIChcbiAgICAgIDxTdHlsZWRDb2xvclJhbmdlU2VsZWN0b3I+XG4gICAgICAgIDxTdHlsZWRDb2xvckNvbmZpZz5cbiAgICAgICAgICB7KGNvbG9yUmFuZ2VDb25maWcuY3VzdG9tXG4gICAgICAgICAgICA/IFsnY3VzdG9tJ11cbiAgICAgICAgICAgIDogT2JqZWN0LmtleXMoY29sb3JSYW5nZUNvbmZpZylcbiAgICAgICAgICApLm1hcChrZXkgPT4gKFxuICAgICAgICAgICAgPFBhbGV0dGVDb25maWdcbiAgICAgICAgICAgICAga2V5PXtrZXl9XG4gICAgICAgICAgICAgIGxhYmVsPXtDT05GSUdfU0VUVElOR1Nba2V5XS5sYWJlbCB8fCBrZXl9XG4gICAgICAgICAgICAgIGNvbmZpZz17Q09ORklHX1NFVFRJTkdTW2tleV19XG4gICAgICAgICAgICAgIHZhbHVlPXtjb2xvclJhbmdlQ29uZmlnW2tleV19XG4gICAgICAgICAgICAgIG9uQ2hhbmdlPXt2YWx1ZSA9PiB0aGlzLl91cGRhdGVDb25maWcoe2tleSwgdmFsdWV9KX1cbiAgICAgICAgICAgIC8+XG4gICAgICAgICAgKSl9XG4gICAgICAgIDwvU3R5bGVkQ29sb3JDb25maWc+XG5cbiAgICAgICAge2NvbG9yUmFuZ2VDb25maWcuY3VzdG9tID8gKFxuICAgICAgICAgIDxDdXN0b21QYWxldHRlXG4gICAgICAgICAgICBjdXN0b21QYWxldHRlPXtjdXN0b21QYWxldHRlfVxuICAgICAgICAgICAgc2hvd1NrZXRjaGVyPXtzaG93U2tldGNoZXJ9XG4gICAgICAgICAgICBzZWxlY3RlZD17dGhpcy5wcm9wcy5zZWxlY3RlZENvbG9yUmFuZ2V9XG4gICAgICAgICAgICBvbkFwcGx5PXt0aGlzLnByb3BzLm9uU2VsZWN0Q29sb3JSYW5nZX1cbiAgICAgICAgICAgIG9uVG9nZ2xlU2tldGNoZXI9e3RoaXMuX29uVG9nZ2xlU2tldGNoZXJ9XG4gICAgICAgICAgICBzZXRDdXN0b21QYWxldHRlPXt0aGlzLl9vblNldEN1c3RvbVBhbGV0dGV9XG4gICAgICAgICAgICBvbkNhbmNlbD17dGhpcy5fb25DdXN0b21QYWxldHRlQ2FuY2VsfVxuICAgICAgICAgIC8+XG4gICAgICAgICkgOiAoXG4gICAgICAgICAgPENvbG9yUGFsZXR0ZUdyb3VwXG4gICAgICAgICAgICBjb2xvclJhbmdlcz17ZmlsdGVyZWRDb2xvclJhbmdlc31cbiAgICAgICAgICAgIG9uU2VsZWN0PXt0aGlzLnByb3BzLm9uU2VsZWN0Q29sb3JSYW5nZX1cbiAgICAgICAgICAgIHNlbGVjdGVkPXt0aGlzLnByb3BzLnNlbGVjdGVkQ29sb3JSYW5nZX1cbiAgICAgICAgICAgIHJldmVyc2VkPXtjb2xvclJhbmdlQ29uZmlnLnJldmVyc2VkfVxuICAgICAgICAgIC8+XG4gICAgICAgICl9XG4gICAgICA8L1N0eWxlZENvbG9yUmFuZ2VTZWxlY3Rvcj5cbiAgICApO1xuICB9XG59XG5cbmV4cG9ydCBjb25zdCBQYWxldHRlQ29uZmlnID0gKHtcbiAgbGFiZWwsXG4gIHZhbHVlLFxuICBjb25maWc6IHt0eXBlLCBvcHRpb25zfSxcbiAgb25DaGFuZ2Vcbn0pID0+IChcbiAgPFN0eWxlZFBhbGV0dGVDb25maWdcbiAgICBjbGFzc05hbWU9XCJjb2xvci1wYWxldHRlX19jb25maWdcIlxuICAgIG9uQ2xpY2s9e2UgPT4gZS5zdG9wUHJvcGFnYXRpb24oKX1cbiAgPlxuICAgIDxkaXYgY2xhc3NOYW1lPVwiY29sb3ItcGFsZXR0ZV9fY29uZmlnX19sYWJlbFwiPlxuICAgICAgPFBhbmVsTGFiZWw+e2xhYmVsfTwvUGFuZWxMYWJlbD5cbiAgICA8L2Rpdj5cbiAgICB7dHlwZSA9PT0gJ3NlbGVjdCcgJiYgKFxuICAgICAgPGRpdiBjbGFzc05hbWU9XCJjb2xvci1wYWxldHRlX19jb25maWdfX3NlbGVjdFwiPlxuICAgICAgICA8SXRlbVNlbGVjdG9yXG4gICAgICAgICAgc2VsZWN0ZWRJdGVtcz17dmFsdWV9XG4gICAgICAgICAgb3B0aW9ucz17b3B0aW9uc31cbiAgICAgICAgICBtdWx0aVNlbGVjdD17ZmFsc2V9XG4gICAgICAgICAgc2VhcmNoYWJsZT17ZmFsc2V9XG4gICAgICAgICAgb25DaGFuZ2U9e29uQ2hhbmdlfVxuICAgICAgICAvPlxuICAgICAgPC9kaXY+XG4gICAgKX1cbiAgICB7dHlwZSA9PT0gJ3N3aXRjaCcgJiYgKFxuICAgICAgPFN3aXRjaFxuICAgICAgICBjaGVja2VkPXt2YWx1ZX1cbiAgICAgICAgaWQ9e2Ake2xhYmVsfS10b2dnbGVgfVxuICAgICAgICBvbkNoYW5nZT17KCkgPT4gb25DaGFuZ2UoIXZhbHVlKX1cbiAgICAgICAgc2Vjb25kYXJ5XG4gICAgICAvPlxuICAgICl9XG4gIDwvU3R5bGVkUGFsZXR0ZUNvbmZpZz5cbik7XG5cbmNvbnN0IFN0eWxlZENvbG9yUmFuZ2UgPSBzdHlsZWQuZGl2LmF0dHJzKHtcbiAgY2xhc3NOYW1lOiAnY29sb3ItcGFsZXR0ZS1vdXRlcidcbn0pYFxuICBwYWRkaW5nOiAwIDhweDtcbiAgOmhvdmVyIHtcbiAgICBiYWNrZ3JvdW5kLWNvbG9yOiAke3Byb3BzID0+IHByb3BzLnRoZW1lLnBhbmVsQmFja2dyb3VuZEhvdmVyfTtcbiAgICBjdXJzb3I6IHBvaW50ZXI7XG4gIH1cbmA7XG5cbmV4cG9ydCBjb25zdCBDb2xvclBhbGV0dGVHcm91cCA9ICh7cmV2ZXJzZWQsIG9uU2VsZWN0LCBzZWxlY3RlZCwgY29sb3JSYW5nZXN9KSA9PiAoXG4gIDxkaXYgY2xhc3NOYW1lPVwiY29sb3ItcGFsZXR0ZV9fZ3JvdXBcIj5cbiAgICB7Y29sb3JSYW5nZXMubWFwKChjb2xvclJhbmdlLCBpKSA9PiAoXG4gICAgICA8U3R5bGVkQ29sb3JSYW5nZVxuXG4gICAgICAgIGtleT17YCR7Y29sb3JSYW5nZS5uYW1lfS0ke2l9YH1cbiAgICAgICAgb25DbGljaz17ZSA9PlxuICAgICAgICAgIG9uU2VsZWN0KFxuICAgICAgICAgICAgcmV2ZXJzZWQgPyByZXZlcnNlQ29sb3JSYW5nZSh0cnVlLCBjb2xvclJhbmdlKSA6IGNvbG9yUmFuZ2UsXG4gICAgICAgICAgICBlXG4gICAgICAgICAgKVxuICAgICAgICB9XG4gICAgICA+XG4gICAgICAgIDxDb2xvclBhbGV0dGVcbiAgICAgICAgICBjb2xvcnM9e2NvbG9yUmFuZ2UuY29sb3JzfVxuICAgICAgICAgIGlzUmV2ZXJzZWQ9e3JldmVyc2VkfVxuICAgICAgICAgIGlzU2VsZWN0ZWQ9e1xuICAgICAgICAgICAgY29sb3JSYW5nZS5uYW1lID09PSBzZWxlY3RlZC5uYW1lICYmXG4gICAgICAgICAgICByZXZlcnNlZCA9PT0gQm9vbGVhbihzZWxlY3RlZC5yZXZlcnNlZClcbiAgICAgICAgICB9XG4gICAgICAgIC8+XG4gICAgICA8L1N0eWxlZENvbG9yUmFuZ2U+XG4gICAgKSl9XG4gIDwvZGl2PlxuKTtcbiJdfQ==