kepler.gl
Version:
kepler.gl is a webgl based application to visualize large scale location data in the browser
291 lines (235 loc) • 31.7 kB
JavaScript
'use strict';
Object.defineProperty(exports, "__esModule", {
value: true
});
var _extends2 = require('babel-runtime/helpers/extends');
var _extends3 = _interopRequireDefault(_extends2);
var _classCallCheck2 = require('babel-runtime/helpers/classCallCheck');
var _classCallCheck3 = _interopRequireDefault(_classCallCheck2);
var _createClass2 = require('babel-runtime/helpers/createClass');
var _createClass3 = _interopRequireDefault(_createClass2);
var _possibleConstructorReturn2 = require('babel-runtime/helpers/possibleConstructorReturn');
var _possibleConstructorReturn3 = _interopRequireDefault(_possibleConstructorReturn2);
var _inherits2 = require('babel-runtime/helpers/inherits');
var _inherits3 = _interopRequireDefault(_inherits2);
var _taggedTemplateLiteral2 = require('babel-runtime/helpers/taggedTemplateLiteral');
var _taggedTemplateLiteral3 = _interopRequireDefault(_taggedTemplateLiteral2);
var _templateObject = (0, _taggedTemplateLiteral3.default)(['\n ', ';\n flex-grow: 1;\n padding: 16px;\n overflow-y: scroll;\n overflow-x: hidden;\n'], ['\n ', ';\n flex-grow: 1;\n padding: 16px;\n overflow-y: scroll;\n overflow-x: hidden;\n']),
_templateObject2 = (0, _taggedTemplateLiteral3.default)(['\n color: ', ';\n font-size: 20px;\n font-weight: 400;\n letter-spacing: 1.25px;\n margin-bottom: 14px;\n'], ['\n color: ', ';\n font-size: 20px;\n font-weight: 400;\n letter-spacing: 1.25px;\n margin-bottom: 14px;\n']); // Copyright (c) 2018 Uber Technologies, Inc.
//
// Permission is hereby granted, free of charge, to any person obtaining a copy
// of this software and associated documentation files (the "Software"), to deal
// in the Software without restriction, including without limitation the rights
// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
// copies of the Software, and to permit persons to whom the Software is
// furnished to do so, subject to the following conditions:
//
// The above copyright notice and this permission notice shall be included in
// all copies or substantial portions of the Software.
//
// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
// THE SOFTWARE.
exports.default = SidePanelFactory;
var _react = require('react');
var _react2 = _interopRequireDefault(_react);
var _propTypes = require('prop-types');
var _propTypes2 = _interopRequireDefault(_propTypes);
var _styledComponents = require('styled-components');
var _styledComponents2 = _interopRequireDefault(_styledComponents);
var _sideBar = require('./side-panel/side-bar');
var _sideBar2 = _interopRequireDefault(_sideBar);
var _panelHeader = require('./side-panel/panel-header');
var _panelHeader2 = _interopRequireDefault(_panelHeader);
var _layerManager = require('./side-panel/layer-manager');
var _layerManager2 = _interopRequireDefault(_layerManager);
var _filterManager = require('./side-panel/filter-manager');
var _filterManager2 = _interopRequireDefault(_filterManager);
var _interactionManager = require('./side-panel/interaction-manager');
var _interactionManager2 = _interopRequireDefault(_interactionManager);
var _mapManager = require('./side-panel/map-manager');
var _mapManager2 = _interopRequireDefault(_mapManager);
var _panelToggle = require('./side-panel/panel-toggle');
var _panelToggle2 = _interopRequireDefault(_panelToggle);
var _defaultSettings = require('../constants/default-settings');
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
var SidePanelContent = _styledComponents2.default.div(_templateObject, function (props) {
return props.theme.sidePanelScrollBar;
});
var PanelTitle = _styledComponents2.default.div(_templateObject2, function (props) {
return props.theme.titleTextColor;
});
SidePanelFactory.deps = [_panelHeader2.default];
/**
*
* Vertical sidebar containing input components for the rendering layers
*/
function SidePanelFactory(PanelHeader) {
var _class, _temp2;
return _temp2 = _class = function (_Component) {
(0, _inherits3.default)(SidePanel, _Component);
function SidePanel() {
var _ref;
var _temp, _this, _ret;
(0, _classCallCheck3.default)(this, SidePanel);
for (var _len = arguments.length, args = Array(_len), _key = 0; _key < _len; _key++) {
args[_key] = arguments[_key];
}
return _ret = (_temp = (_this = (0, _possibleConstructorReturn3.default)(this, (_ref = SidePanel.__proto__ || Object.getPrototypeOf(SidePanel)).call.apply(_ref, [this].concat(args))), _this), _this._onOpenOrClose = function () {
_this.props.uiStateActions.toggleSidePanel(_this.props.uiState.activeSidePanel ? null : 'layer');
}, _this._showDatasetTable = function (dataId) {
// this will open data table modal
_this.props.visStateActions.showDatasetTable(dataId);
_this.props.uiStateActions.toggleModal(_defaultSettings.DATA_TABLE_ID);
}, _this._showAddDataModal = function () {
_this.props.uiStateActions.toggleModal(_defaultSettings.ADD_DATA_ID);
}, _this._showAddMapStyleModal = function () {
_this.props.uiStateActions.toggleModal(_defaultSettings.ADD_MAP_STYLE_ID);
}, _this._removeDataset = function (key) {
// this will show the modal dialog to confirm deletion
_this.props.uiStateActions.openDeleteModal(key);
}, _this._onExportImage = function () {
return _this.props.uiStateActions.toggleModal(_defaultSettings.EXPORT_IMAGE_ID);
}, _this._onExportData = function () {
return _this.props.uiStateActions.toggleModal(_defaultSettings.EXPORT_DATA_ID);
}, _this._onExportConfig = function () {
return _this.props.uiStateActions.toggleModal(_defaultSettings.EXPORT_CONFIG_ID);
}, _temp), (0, _possibleConstructorReturn3.default)(_this, _ret);
}
/* component private functions */
(0, _createClass3.default)(SidePanel, [{
key: 'render',
value: function render() {
var _props = this.props,
appName = _props.appName,
version = _props.version,
datasets = _props.datasets,
filters = _props.filters,
layers = _props.layers,
layerBlending = _props.layerBlending,
layerClasses = _props.layerClasses,
uiState = _props.uiState,
layerOrder = _props.layerOrder,
interactionConfig = _props.interactionConfig,
visStateActions = _props.visStateActions,
mapStyleActions = _props.mapStyleActions,
uiStateActions = _props.uiStateActions;
var activeSidePanel = uiState.activeSidePanel;
var isOpen = Boolean(activeSidePanel);
var layerManagerActions = {
addLayer: visStateActions.addLayer,
layerConfigChange: visStateActions.layerConfigChange,
layerVisualChannelConfigChange: visStateActions.layerVisualChannelConfigChange,
layerTypeChange: visStateActions.layerTypeChange,
layerVisConfigChange: visStateActions.layerVisConfigChange,
updateLayerBlending: visStateActions.updateLayerBlending,
updateLayerOrder: visStateActions.reorderLayer,
showDatasetTable: this._showDatasetTable,
showAddDataModal: this._showAddDataModal,
removeLayer: visStateActions.removeLayer,
removeDataset: this._removeDataset
};
var filterManagerActions = {
addFilter: visStateActions.addFilter,
removeFilter: visStateActions.removeFilter,
setFilter: visStateActions.setFilter,
showDatasetTable: this._showDatasetTable,
showAddDataModal: this._showAddDataModal,
toggleAnimation: visStateActions.toggleAnimation,
enlargeFilter: visStateActions.enlargeFilter
};
var interactionManagerActions = {
onConfigChange: visStateActions.interactionConfigChange
};
var mapManagerActions = {
addMapStyleUrl: mapStyleActions.addMapStyleUrl,
onConfigChange: mapStyleActions.mapConfigChange,
onStyleChange: mapStyleActions.mapStyleChange,
onBuildingChange: mapStyleActions.mapBuildingChange,
showAddMapStyleModal: this._showAddMapStyleModal
};
return _react2.default.createElement(
'div',
null,
_react2.default.createElement(
_sideBar2.default,
{
width: this.props.width,
isOpen: isOpen,
minifiedWidth: 0,
onOpenOrClose: this._onOpenOrClose
},
_react2.default.createElement(PanelHeader, {
appName: appName,
version: version,
onExportImage: this._onExportImage,
onExportData: this._onExportData,
visibleDropdown: uiState.visibleDropdown,
showExportDropdown: uiStateActions.showExportDropdown,
hideExportDropdown: uiStateActions.hideExportDropdown,
onExportConfig: this._onExportConfig,
onSaveMap: this.props.onSaveMap
}),
_react2.default.createElement(_panelToggle2.default, {
panels: _defaultSettings.PANELS,
activePanel: activeSidePanel,
togglePanel: uiStateActions.toggleSidePanel
}),
_react2.default.createElement(
SidePanelContent,
{ className: 'side-panel__content' },
_react2.default.createElement(
'div',
null,
_react2.default.createElement(
PanelTitle,
{ className: 'side-panel__content__title' },
(_defaultSettings.PANELS.find(function (_ref2) {
var id = _ref2.id;
return id === activeSidePanel;
}) || {}).label
),
activeSidePanel === 'layer' && _react2.default.createElement(_layerManager2.default, (0, _extends3.default)({}, layerManagerActions, {
datasets: datasets,
layers: layers,
layerClasses: layerClasses,
layerOrder: layerOrder,
layerBlending: layerBlending,
openModal: uiStateActions.toggleModal
})),
activeSidePanel === 'filter' && _react2.default.createElement(_filterManager2.default, (0, _extends3.default)({}, filterManagerActions, {
datasets: datasets,
filters: filters
})),
activeSidePanel === 'interaction' && _react2.default.createElement(_interactionManager2.default, (0, _extends3.default)({}, interactionManagerActions, {
datasets: datasets,
interactionConfig: interactionConfig
})),
activeSidePanel === 'map' && _react2.default.createElement(_mapManager2.default, (0, _extends3.default)({}, mapManagerActions, {
mapStyle: this.props.mapStyle
}))
)
)
)
);
}
}]);
return SidePanel;
}(_react.Component), _class.propTypes = {
filters: _propTypes2.default.arrayOf(_propTypes2.default.any).isRequired,
interactionConfig: _propTypes2.default.object.isRequired,
layerBlending: _propTypes2.default.string.isRequired,
layers: _propTypes2.default.arrayOf(_propTypes2.default.any).isRequired,
layerClasses: _propTypes2.default.object.isRequired,
mapStyle: _propTypes2.default.object.isRequired,
width: _propTypes2.default.number.isRequired,
datasets: _propTypes2.default.object.isRequired,
visStateActions: _propTypes2.default.object.isRequired,
mapStyleActions: _propTypes2.default.object.isRequired
}, _temp2;
}
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9jb21wb25lbnRzL3NpZGUtcGFuZWwuanMiXSwibmFtZXMiOlsiU2lkZVBhbmVsRmFjdG9yeSIsIlNpZGVQYW5lbENvbnRlbnQiLCJzdHlsZWQiLCJkaXYiLCJwcm9wcyIsInRoZW1lIiwic2lkZVBhbmVsU2Nyb2xsQmFyIiwiUGFuZWxUaXRsZSIsInRpdGxlVGV4dENvbG9yIiwiZGVwcyIsIlBhbmVsSGVhZGVyRmFjdG9yeSIsIlBhbmVsSGVhZGVyIiwiX29uT3Blbk9yQ2xvc2UiLCJ1aVN0YXRlQWN0aW9ucyIsInRvZ2dsZVNpZGVQYW5lbCIsInVpU3RhdGUiLCJhY3RpdmVTaWRlUGFuZWwiLCJfc2hvd0RhdGFzZXRUYWJsZSIsInZpc1N0YXRlQWN0aW9ucyIsInNob3dEYXRhc2V0VGFibGUiLCJkYXRhSWQiLCJ0b2dnbGVNb2RhbCIsIkRBVEFfVEFCTEVfSUQiLCJfc2hvd0FkZERhdGFNb2RhbCIsIkFERF9EQVRBX0lEIiwiX3Nob3dBZGRNYXBTdHlsZU1vZGFsIiwiQUREX01BUF9TVFlMRV9JRCIsIl9yZW1vdmVEYXRhc2V0Iiwib3BlbkRlbGV0ZU1vZGFsIiwia2V5IiwiX29uRXhwb3J0SW1hZ2UiLCJFWFBPUlRfSU1BR0VfSUQiLCJfb25FeHBvcnREYXRhIiwiRVhQT1JUX0RBVEFfSUQiLCJfb25FeHBvcnRDb25maWciLCJFWFBPUlRfQ09ORklHX0lEIiwiYXBwTmFtZSIsInZlcnNpb24iLCJkYXRhc2V0cyIsImZpbHRlcnMiLCJsYXllcnMiLCJsYXllckJsZW5kaW5nIiwibGF5ZXJDbGFzc2VzIiwibGF5ZXJPcmRlciIsImludGVyYWN0aW9uQ29uZmlnIiwibWFwU3R5bGVBY3Rpb25zIiwiaXNPcGVuIiwiQm9vbGVhbiIsImxheWVyTWFuYWdlckFjdGlvbnMiLCJhZGRMYXllciIsImxheWVyQ29uZmlnQ2hhbmdlIiwibGF5ZXJWaXN1YWxDaGFubmVsQ29uZmlnQ2hhbmdlIiwibGF5ZXJUeXBlQ2hhbmdlIiwibGF5ZXJWaXNDb25maWdDaGFuZ2UiLCJ1cGRhdGVMYXllckJsZW5kaW5nIiwidXBkYXRlTGF5ZXJPcmRlciIsInJlb3JkZXJMYXllciIsInNob3dBZGREYXRhTW9kYWwiLCJyZW1vdmVMYXllciIsInJlbW92ZURhdGFzZXQiLCJmaWx0ZXJNYW5hZ2VyQWN0aW9ucyIsImFkZEZpbHRlciIsInJlbW92ZUZpbHRlciIsInNldEZpbHRlciIsInRvZ2dsZUFuaW1hdGlvbiIsImVubGFyZ2VGaWx0ZXIiLCJpbnRlcmFjdGlvbk1hbmFnZXJBY3Rpb25zIiwib25Db25maWdDaGFuZ2UiLCJpbnRlcmFjdGlvbkNvbmZpZ0NoYW5nZSIsIm1hcE1hbmFnZXJBY3Rpb25zIiwiYWRkTWFwU3R5bGVVcmwiLCJtYXBDb25maWdDaGFuZ2UiLCJvblN0eWxlQ2hhbmdlIiwibWFwU3R5bGVDaGFuZ2UiLCJvbkJ1aWxkaW5nQ2hhbmdlIiwibWFwQnVpbGRpbmdDaGFuZ2UiLCJzaG93QWRkTWFwU3R5bGVNb2RhbCIsIndpZHRoIiwidmlzaWJsZURyb3Bkb3duIiwic2hvd0V4cG9ydERyb3Bkb3duIiwiaGlkZUV4cG9ydERyb3Bkb3duIiwib25TYXZlTWFwIiwiUEFORUxTIiwiZmluZCIsImlkIiwibGFiZWwiLCJtYXBTdHlsZSIsIkNvbXBvbmVudCIsInByb3BUeXBlcyIsIlByb3BUeXBlcyIsImFycmF5T2YiLCJhbnkiLCJpc1JlcXVpcmVkIiwib2JqZWN0Iiwic3RyaW5nIiwibnVtYmVyIl0sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O3FTQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztrQkE4Q3dCQSxnQjs7QUE1Q3hCOzs7O0FBQ0E7Ozs7QUFDQTs7OztBQUVBOzs7O0FBQ0E7Ozs7QUFDQTs7OztBQUNBOzs7O0FBQ0E7Ozs7QUFDQTs7OztBQUNBOzs7O0FBRUE7Ozs7QUFVQSxJQUFNQyxt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LENBQVdrRjtBQUZ2QjtBQTlCSjtBQURGO0FBdEJGO0FBREYsU0FERjtBQWlFRDtBQXZLSDtBQUFBO0FBQUEsSUFBK0JDLGdCQUEvQixVQUNTQyxTQURULEdBQ3FCO0FBQ2pCakQsYUFBU2tELG9CQUFVQyxPQUFWLENBQWtCRCxvQkFBVUUsR0FBNUIsRUFBaUNDLFVBRHpCO0FBRWpCaEQsdUJBQW1CNkMsb0JBQVVJLE1BQVYsQ0FBaUJELFVBRm5CO0FBR2pCbkQsbUJBQWVnRCxvQkFBVUssTUFBVixDQUFpQkYsVUFIZjtBQUlqQnBELFlBQVFpRCxvQkFBVUMsT0FBVixDQUFrQkQsb0JBQVVFLEdBQTVCLEVBQWlDQyxVQUp4QjtBQUtqQmxELGtCQUFjK0Msb0JBQVVJLE1BQVYsQ0FBaUJELFVBTGQ7QUFNakJOLGNBQVVHLG9CQUFVSSxNQUFWLENBQWlCRCxVQU5WO0FBT2pCZixXQUFPWSxvQkFBVU0sTUFBVixDQUFpQkgsVUFQUDtBQVFqQnRELGNBQVVtRCxvQkFBVUksTUFBVixDQUFpQkQsVUFSVjtBQVNqQjFFLHFCQUFpQnVFLG9CQUFVSSxNQUFWLENBQWlCRCxVQVRqQjtBQVVqQi9DLHFCQUFpQjRDLG9CQUFVSSxNQUFWLENBQWlCRDtBQVZqQixHQURyQjtBQXlLRCIsImZpbGUiOiJzaWRlLXBhbmVsLmpzIiwic291cmNlc0NvbnRlbnQiOlsiLy8gQ29weXJpZ2h0IChjKSAyMDE4IFViZXIgVGVjaG5vbG9naWVzLCBJbmMuXG4vL1xuLy8gUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nIGEgY29weVxuLy8gb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGUgXCJTb2Z0d2FyZVwiKSwgdG8gZGVhbFxuLy8gaW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24gdGhlIHJpZ2h0c1xuLy8gdG8gdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLCBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLCBhbmQvb3Igc2VsbFxuLy8gY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvIHBlcm1pdCBwZXJzb25zIHRvIHdob20gdGhlIFNvZnR3YXJlIGlzXG4vLyBmdXJuaXNoZWQgdG8gZG8gc28sIHN1YmplY3QgdG8gdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOlxuLy9cbi8vIFRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIHNoYWxsIGJlIGluY2x1ZGVkIGluXG4vLyBhbGwgY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZSBTb2Z0d2FyZS5cbi8vXG4vLyBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgXCJBUyBJU1wiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBFWFBSRVNTIE9SXG4vLyBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSxcbi8vIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT05JTkZSSU5HRU1FTlQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRVxuLy8gQVVUSE9SUyBPUiBDT1BZUklHSFQgSE9MREVSUyBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSwgREFNQUdFUyBPUiBPVEhFUlxuLy8gTElBQklMSVRZLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUiBPVEhFUldJU0UsIEFSSVNJTkcgRlJPTSxcbi8vIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IgT1RIRVIgREVBTElOR1MgSU5cbi8vIFRIRSBTT0ZUV0FSRS5cblxuaW1wb3J0IFJlYWN0LCB7Q29tcG9uZW50fSBmcm9tICdyZWFjdCc7XG5pbXBvcnQgUHJvcFR5cGVzIGZyb20gJ3Byb3AtdHlwZXMnO1xuaW1wb3J0IHN0eWxlZCBmcm9tICdzdHlsZWQtY29tcG9uZW50cyc7XG5cbmltcG9ydCBTaWRlYmFyIGZyb20gJy4vc2lkZS1wYW5lbC9zaWRlLWJhcic7XG5pbXBvcnQgUGFuZWxIZWFkZXJGYWN0b3J5IGZyb20gJy4vc2lkZS1wYW5lbC9wYW5lbC1oZWFkZXInO1xuaW1wb3J0IExheWVyTWFuYWdlciBmcm9tICcuL3NpZGUtcGFuZWwvbGF5ZXItbWFuYWdlcic7XG5pbXBvcnQgRmlsdGVyTWFuYWdlciBmcm9tICcuL3NpZGUtcGFuZWwvZmlsdGVyLW1hbmFnZXInO1xuaW1wb3J0IEludGVyYWN0aW9uTWFuYWdlciBmcm9tICcuL3NpZGUtcGFuZWwvaW50ZXJhY3Rpb24tbWFuYWdlcic7XG5pbXBvcnQgTWFwTWFuYWdlciBmcm9tICcuL3NpZGUtcGFuZWwvbWFwLW1hbmFnZXInO1xuaW1wb3J0IFBhbmVsVG9nZ2xlIGZyb20gJy4vc2lkZS1wYW5lbC9wYW5lbC10b2dnbGUnO1xuXG5pbXBvcnQge1xuICBBRERfREFUQV9JRCxcbiAgQUREX01BUF9TVFlMRV9JRCxcbiAgREFUQV9UQUJMRV9JRCxcbiAgRVhQT1JUX0lNQUdFX0lELFxuICBFWFBPUlRfREFUQV9JRCxcbiAgRVhQT1JUX0NPTkZJR19JRCxcbiAgUEFORUxTXG59IGZyb20gJ2NvbnN0YW50cy9kZWZhdWx0LXNldHRpbmdzJztcblxuY29uc3QgU2lkZVBhbmVsQ29udGVudCA9IHN0eWxlZC5kaXZgXG4gICR7cHJvcHMgPT4gcHJvcHMudGhlbWUuc2lkZVBhbmVsU2Nyb2xsQmFyfTtcbiAgZmxleC1ncm93OiAxO1xuICBwYWRkaW5nOiAxNnB4O1xuICBvdmVyZmxvdy15OiBzY3JvbGw7XG4gIG92ZXJmbG93LXg6IGhpZGRlbjtcbmA7XG5cbmNvbnN0IFBhbmVsVGl0bGUgPSBzdHlsZWQuZGl2YFxuICBjb2xvcjogJHtwcm9wcyA9PiBwcm9wcy50aGVtZS50aXRsZVRleHRDb2xvcn07XG4gIGZvbnQtc2l6ZTogMjBweDtcbiAgZm9udC13ZWlnaHQ6IDQwMDtcbiAgbGV0dGVyLXNwYWNpbmc6IDEuMjVweDtcbiAgbWFyZ2luLWJvdHRvbTogMTRweDtcbmA7XG5cblNpZGVQYW5lbEZhY3RvcnkuZGVwcyA9IFtQYW5lbEhlYWRlckZhY3RvcnldO1xuXG4vKipcbiAqXG4gKiBWZXJ0aWNhbCBzaWRlYmFyIGNvbnRhaW5pbmcgaW5wdXQgY29tcG9uZW50cyBmb3IgdGhlIHJlbmRlcmluZyBsYXllcnNcbiAqL1xuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gU2lkZVBhbmVsRmFjdG9yeShQYW5lbEhlYWRlcikge1xuXG4gIHJldHVybiBjbGFzcyBTaWRlUGFuZWwgZXh0ZW5kcyBDb21wb25lbnQge1xuICAgIHN0YXRpYyBwcm9wVHlwZXMgPSB7XG4gICAgICBmaWx0ZXJzOiBQcm9wVHlwZXMuYXJyYXlPZihQcm9wVHlwZXMuYW55KS5pc1JlcXVpcmVkLFxuICAgICAgaW50ZXJhY3Rpb25Db25maWc6IFByb3BUeXBlcy5vYmplY3QuaXNSZXF1aXJlZCxcbiAgICAgIGxheWVyQmxlbmRpbmc6IFByb3BUeXBlcy5zdHJpbmcuaXNSZXF1aXJlZCxcbiAgICAgIGxheWVyczogUHJvcFR5cGVzLmFycmF5T2YoUHJvcFR5cGVzLmFueSkuaXNSZXF1aXJlZCxcbiAgICAgIGxheWVyQ2xhc3NlczogUHJvcFR5cGVzLm9iamVjdC5pc1JlcXVpcmVkLFxuICAgICAgbWFwU3R5bGU6IFByb3BUeXBlcy5vYmplY3QuaXNSZXF1aXJlZCxcbiAgICAgIHdpZHRoOiBQcm9wVHlwZXMubnVtYmVyLmlzUmVxdWlyZWQsXG4gICAgICBkYXRhc2V0czogUHJvcFR5cGVzLm9iamVjdC5pc1JlcXVpcmVkLFxuICAgICAgdmlzU3RhdGVBY3Rpb25zOiBQcm9wVHlwZXMub2JqZWN0LmlzUmVxdWlyZWQsXG4gICAgICBtYXBTdHlsZUFjdGlvbnM6IFByb3BUeXBlcy5vYmplY3QuaXNSZXF1aXJlZFxuICAgIH07XG5cbiAgICAvKiBjb21wb25lbnQgcHJpdmF0ZSBmdW5jdGlvbnMgKi9cbiAgICBfb25PcGVuT3JDbG9zZSA9ICgpID0+IHtcbiAgICAgIHRoaXMucHJvcHMudWlTdGF0ZUFjdGlvbnMudG9nZ2xlU2lkZVBhbmVsKFxuICAgICAgICB0aGlzLnByb3BzLnVpU3RhdGUuYWN0aXZlU2lkZVBhbmVsID8gbnVsbCA6ICdsYXllcidcbiAgICAgICk7XG4gICAgfTtcblxuICAgIF9zaG93RGF0YXNldFRhYmxlID0gZGF0YUlkID0+IHtcbiAgICAgIC8vIHRoaXMgd2lsbCBvcGVuIGRhdGEgdGFibGUgbW9kYWxcbiAgICAgIHRoaXMucHJvcHMudmlzU3RhdGVBY3Rpb25zLnNob3dEYXRhc2V0VGFibGUoZGF0YUlkKTtcbiAgICAgIHRoaXMucHJvcHMudWlTdGF0ZUFjdGlvbnMudG9nZ2xlTW9kYWwoREFUQV9UQUJMRV9JRCk7XG4gICAgfTtcblxuICAgIF9zaG93QWRkRGF0YU1vZGFsID0gKCkgPT4ge1xuICAgICAgdGhpcy5wcm9wcy51aVN0YXRlQWN0aW9ucy50b2dnbGVNb2RhbChBRERfREFUQV9JRCk7XG4gICAgfTtcblxuICAgIF9zaG93QWRkTWFwU3R5bGVNb2RhbCA9ICgpID0+IHtcbiAgICAgIHRoaXMucHJvcHMudWlTdGF0ZUFjdGlvbnMudG9nZ2xlTW9kYWwoQUREX01BUF9TVFlMRV9JRCk7XG4gICAgfTtcblxuICAgIF9yZW1vdmVEYXRhc2V0ID0ga2V5ID0+IHtcbiAgICAgIC8vIHRoaXMgd2lsbCBzaG93IHRoZSBtb2RhbCBkaWFsb2cgdG8gY29uZmlybSBkZWxldGlvblxuICAgICAgdGhpcy5wcm9wcy51aVN0YXRlQWN0aW9ucy5vcGVuRGVsZXRlTW9kYWwoa2V5KTtcbiAgICB9O1xuXG4gICAgX29uRXhwb3J0SW1hZ2UgPSAoKSA9PiB0aGlzLnByb3BzLnVpU3RhdGVBY3Rpb25zLnRvZ2dsZU1vZGFsKEVYUE9SVF9JTUFHRV9JRCk7XG5cbiAgICBfb25FeHBvcnREYXRhID0gKCkgPT4gdGhpcy5wcm9wcy51aVN0YXRlQWN0aW9ucy50b2dnbGVNb2RhbChFWFBPUlRfREFUQV9JRCk7XG5cbiAgICBfb25FeHBvcnRDb25maWcgPSAoKSA9PiB0aGlzLnByb3BzLnVpU3RhdGVBY3Rpb25zLnRvZ2dsZU1vZGFsKEVYUE9SVF9DT05GSUdfSUQpO1xuXG4gICAgcmVuZGVyKCkge1xuICAgICAgY29uc3Qge1xuICAgICAgICBhcHBOYW1lLFxuICAgICAgICB2ZXJzaW9uLFxuICAgICAgICBkYXRhc2V0cyxcbiAgICAgICAgZmlsdGVycyxcbiAgICAgICAgbGF5ZXJzLFxuICAgICAgICBsYXllckJsZW5kaW5nLFxuICAgICAgICBsYXllckNsYXNzZXMsXG4gICAgICAgIHVpU3RhdGUsXG4gICAgICAgIGxheWVyT3JkZXIsXG4gICAgICAgIGludGVyYWN0aW9uQ29uZmlnLFxuICAgICAgICB2aXNTdGF0ZUFjdGlvbnMsXG4gICAgICAgIG1hcFN0eWxlQWN0aW9ucyxcbiAgICAgICAgdWlTdGF0ZUFjdGlvbnNcbiAgICAgIH0gPSB0aGlzLnByb3BzO1xuICAgICAgY29uc3Qge2FjdGl2ZVNpZGVQYW5lbH0gPSB1aVN0YXRlO1xuICAgICAgY29uc3QgaXNPcGVuID0gQm9vbGVhbihhY3RpdmVTaWRlUGFuZWwpO1xuXG4gICAgICBjb25zdCBsYXllck1hbmFnZXJBY3Rpb25zID0ge1xuICAgICAgICBhZGRMYXllcjogdmlzU3RhdGVBY3Rpb25zLmFkZExheWVyLFxuICAgICAgICBsYXllckNvbmZpZ0NoYW5nZTogdmlzU3RhdGVBY3Rpb25zLmxheWVyQ29uZmlnQ2hhbmdlLFxuICAgICAgICBsYXllclZpc3VhbENoYW5uZWxDb25maWdDaGFuZ2U6XG4gICAgICAgIHZpc1N0YXRlQWN0aW9ucy5sYXllclZpc3VhbENoYW5uZWxDb25maWdDaGFuZ2UsXG4gICAgICAgIGxheWVyVHlwZUNoYW5nZTogdmlzU3RhdGVBY3Rpb25zLmxheWVyVHlwZUNoYW5nZSxcbiAgICAgICAgbGF5ZXJWaXNDb25maWdDaGFuZ2U6IHZpc1N0YXRlQWN0aW9ucy5sYXllclZpc0NvbmZpZ0NoYW5nZSxcbiAgICAgICAgdXBkYXRlTGF5ZXJCbGVuZGluZzogdmlzU3RhdGVBY3Rpb25zLnVwZGF0ZUxheWVyQmxlbmRpbmcsXG4gICAgICAgIHVwZGF0ZUxheWVyT3JkZXI6IHZpc1N0YXRlQWN0aW9ucy5yZW9yZGVyTGF5ZXIsXG4gICAgICAgIHNob3dEYXRhc2V0VGFibGU6IHRoaXMuX3Nob3dEYXRhc2V0VGFibGUsXG4gICAgICAgIHNob3dBZGREYXRhTW9kYWw6IHRoaXMuX3Nob3dBZGREYXRhTW9kYWwsXG4gICAgICAgIHJlbW92ZUxheWVyOiB2aXNTdGF0ZUFjdGlvbnMucmVtb3ZlTGF5ZXIsXG4gICAgICAgIHJlbW92ZURhdGFzZXQ6IHRoaXMuX3JlbW92ZURhdGFzZXRcbiAgICAgIH07XG5cbiAgICAgIGNvbnN0IGZpbHRlck1hbmFnZXJBY3Rpb25zID0ge1xuICAgICAgICBhZGRGaWx0ZXI6IHZpc1N0YXRlQWN0aW9ucy5hZGRGaWx0ZXIsXG4gICAgICAgIHJlbW92ZUZpbHRlcjogdmlzU3RhdGVBY3Rpb25zLnJlbW92ZUZpbHRlcixcbiAgICAgICAgc2V0RmlsdGVyOiB2aXNTdGF0ZUFjdGlvbnMuc2V0RmlsdGVyLFxuICAgICAgICBzaG93RGF0YXNldFRhYmxlOiB0aGlzLl9zaG93RGF0YXNldFRhYmxlLFxuICAgICAgICBzaG93QWRkRGF0YU1vZGFsOiB0aGlzLl9zaG93QWRkRGF0YU1vZGFsLFxuICAgICAgICB0b2dnbGVBbmltYXRpb246IHZpc1N0YXRlQWN0aW9ucy50b2dnbGVBbmltYXRpb24sXG4gICAgICAgIGVubGFyZ2VGaWx0ZXI6IHZpc1N0YXRlQWN0aW9ucy5lbmxhcmdlRmlsdGVyXG4gICAgICB9O1xuXG4gICAgICBjb25zdCBpbnRlcmFjdGlvbk1hbmFnZXJBY3Rpb25zID0ge1xuICAgICAgICBvbkNvbmZpZ0NoYW5nZTogdmlzU3RhdGVBY3Rpb25zLmludGVyYWN0aW9uQ29uZmlnQ2hhbmdlXG4gICAgICB9O1xuXG4gICAgICBjb25zdCBtYXBNYW5hZ2VyQWN0aW9ucyA9IHtcbiAgICAgICAgYWRkTWFwU3R5bGVVcmw6IG1hcFN0eWxlQWN0aW9ucy5hZGRNYXBTdHlsZVVybCxcbiAgICAgICAgb25Db25maWdDaGFuZ2U6IG1hcFN0eWxlQWN0aW9ucy5tYXBDb25maWdDaGFuZ2UsXG4gICAgICAgIG9uU3R5bGVDaGFuZ2U6IG1hcFN0eWxlQWN0aW9ucy5tYXBTdHlsZUNoYW5nZSxcbiAgICAgICAgb25CdWlsZGluZ0NoYW5nZTogbWFwU3R5bGVBY3Rpb25zLm1hcEJ1aWxkaW5nQ2hhbmdlLFxuICAgICAgICBzaG93QWRkTWFwU3R5bGVNb2RhbDogdGhpcy5fc2hvd0FkZE1hcFN0eWxlTW9kYWxcbiAgICAgIH07XG5cbiAgICAgIHJldHVybiAoXG4gICAgICAgIDxkaXY+XG4gICAgICAgICAgPFNpZGViYXJcbiAgICAgICAgICAgIHdpZHRoPXt0aGlzLnByb3BzLndpZHRofVxuICAgICAgICAgICAgaXNPcGVuPXtpc09wZW59XG4gICAgICAgICAgICBtaW5pZmllZFdpZHRoPXswfVxuICAgICAgICAgICAgb25PcGVuT3JDbG9zZT17dGhpcy5fb25PcGVuT3JDbG9zZX1cbiAgICAgICAgICA+XG4gICAgICAgICAgICA8UGFuZWxIZWFkZXJcbiAgICAgICAgICAgICAgYXBwTmFtZT17YXBwTmFtZX1cbiAgICAgICAgICAgICAgdmVyc2lvbj17dmVyc2lvbn1cbiAgICAgICAgICAgICAgb25FeHBvcnRJbWFnZT17dGhpcy5fb25FeHBvcnRJbWFnZX1cbiAgICAgICAgICAgICAgb25FeHBvcnREYXRhPXt0aGlzLl9vbkV4cG9ydERhdGF9XG4gICAgICAgICAgICAgIHZpc2libGVEcm9wZG93bj17dWlTdGF0ZS52aXNpYmxlRHJvcGRvd259XG4gICAgICAgICAgICAgIHNob3dFeHBvcnREcm9wZG93bj17dWlTdGF0ZUFjdGlvbnMuc2hvd0V4cG9ydERyb3Bkb3dufVxuICAgICAgICAgICAgICBoaWRlRXhwb3J0RHJvcGRvd249e3VpU3RhdGVBY3Rpb25zLmhpZGVFeHBvcnREcm9wZG93bn1cbiAgICAgICAgICAgICAgb25FeHBvcnRDb25maWc9e3RoaXMuX29uRXhwb3J0Q29uZmlnfVxuICAgICAgICAgICAgICBvblNhdmVNYXA9e3RoaXMucHJvcHMub25TYXZlTWFwfVxuICAgICAgICAgICAgLz5cbiAgICAgICAgICAgIDxQYW5lbFRvZ2dsZVxuICAgICAgICAgICAgICBwYW5lbHM9e1BBTkVMU31cbiAgICAgICAgICAgICAgYWN0aXZlUGFuZWw9e2FjdGl2ZVNpZGVQYW5lbH1cbiAgICAgICAgICAgICAgdG9nZ2xlUGFuZWw9e3VpU3RhdGVBY3Rpb25zLnRvZ2dsZVNpZGVQYW5lbH1cbiAgICAgICAgICAgIC8+XG4gICAgICAgICAgICA8U2lkZVBhbmVsQ29udGVudCBjbGFzc05hbWU9XCJzaWRlLXBhbmVsX19jb250ZW50XCI+XG4gICAgICAgICAgICAgIDxkaXY+XG4gICAgICAgICAgICAgICAgPFBhbmVsVGl0bGUgY2xhc3NOYW1lPVwic2lkZS1wYW5lbF9fY29udGVudF9fdGl0bGVcIj5cbiAgICAgICAgICAgICAgICAgIHsoUEFORUxTLmZpbmQoKHtpZH0pID0+IGlkID09PSBhY3RpdmVTaWRlUGFuZWwpIHx8IHt9KS5sYWJlbH1cbiAgICAgICAgICAgICAgICA8L1BhbmVsVGl0bGU+XG4gICAgICAgICAgICAgICAge2FjdGl2ZVNpZGVQYW5lbCA9PT0gJ2xheWVyJyAmJiAoXG4gICAgICAgICAgICAgICAgICA8TGF5ZXJNYW5hZ2VyXG4gICAgICAgICAgICAgICAgICAgIHsuLi5sYXllck1hbmFnZXJBY3Rpb25zfVxuICAgICAgICAgICAgICAgICAgICBkYXRhc2V0cz17ZGF0YXNldHN9XG4gICAgICAgICAgICAgICAgICAgIGxheWVycz17bGF5ZXJzfVxuICAgICAgICAgICAgICAgICAgICBsYXllckNsYXNzZXM9e2xheWVyQ2xhc3Nlc31cbiAgICAgICAgICAgICAgICAgICAgbGF5ZXJPcmRlcj17bGF5ZXJPcmRlcn1cbiAgICAgICAgICAgICAgICAgICAgbGF5ZXJCbGVuZGluZz17bGF5ZXJCbGVuZGluZ31cbiAgICAgICAgICAgICAgICAgICAgb3Blbk1vZGFsPXt1aVN0YXRlQWN0aW9ucy50b2dnbGVNb2RhbH1cbiAgICAgICAgICAgICAgICAgIC8+XG4gICAgICAgICAgICAgICAgKX1cbiAgICAgICAgICAgICAgICB7YWN0aXZlU2lkZVBhbmVsID09PSAnZmlsdGVyJyAmJiAoXG4gICAgICAgICAgICAgICAgICA8RmlsdGVyTWFuYWdlclxuICAgICAgICAgICAgICAgICAgICB7Li4uZmlsdGVyTWFuYWdlckFjdGlvbnN9XG4gICAgICAgICAgICAgICAgICAgIGRhdGFzZXRzPXtkYXRhc2V0c31cbiAgICAgICAgICAgICAgICAgICAgZmlsdGVycz17ZmlsdGVyc31cbiAgICAgICAgICAgICAgICAgIC8+XG4gICAgICAgICAgICAgICAgKX1cbiAgICAgICAgICAgICAgICB7YWN0aXZlU2lkZVBhbmVsID09PSAnaW50ZXJhY3Rpb24nICYmIChcbiAgICAgICAgICAgICAgICAgIDxJbnRlcmFjdGlvbk1hbmFnZXJcbiAgICAgICAgICAgICAgICAgICAgey4uLmludGVyYWN0aW9uTWFuYWdlckFjdGlvbnN9XG4gICAgICAgICAgICAgICAgICAgIGRhdGFzZXRzPXtkYXRhc2V0c31cbiAgICAgICAgICAgICAgICAgICAgaW50ZXJhY3Rpb25Db25maWc9e2ludGVyYWN0aW9uQ29uZmlnfVxuICAgICAgICAgICAgICAgICAgLz5cbiAgICAgICAgICAgICAgICApfVxuICAgICAgICAgICAgICAgIHthY3RpdmVTaWRlUGFuZWwgPT09ICdtYXAnICYmIChcbiAgICAgICAgICAgICAgICAgIDxNYXBNYW5hZ2VyXG4gICAgICAgICAgICAgICAgICAgIHsuLi5tYXBNYW5hZ2VyQWN0aW9uc31cbiAgICAgICAgICAgICAgICAgICAgbWFwU3R5bGU9e3RoaXMucHJvcHMubWFwU3R5bGV9XG4gICAgICAgICAgICAgICAgICAvPlxuICAgICAgICAgICAgICAgICl9XG4gICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPC9TaWRlUGFuZWxDb250ZW50PlxuICAgICAgICAgIDwvU2lkZWJhcj5cbiAgICAgICAgPC9kaXY+XG4gICAgICApO1xuICAgIH1cbiAgfTtcbn1cbiJdfQ==