UNPKG

kepler.gl.geoiq

Version:

kepler.gl is a webgl based application to visualize large scale location data in the browser

384 lines (320 loc) 43.8 kB
"use strict"; var _interopRequireWildcard = require("@babel/runtime/helpers/interopRequireWildcard"); var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault"); Object.defineProperty(exports, "__esModule", { value: true }); exports["default"] = void 0; var _slicedToArray2 = _interopRequireDefault(require("@babel/runtime/helpers/slicedToArray")); var _extends2 = _interopRequireDefault(require("@babel/runtime/helpers/extends")); var _toConsumableArray2 = _interopRequireDefault(require("@babel/runtime/helpers/toConsumableArray")); 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 _window = require("global/window"); var _redux = require("redux"); var _d3Request = require("d3-request"); var _styledComponents = _interopRequireWildcard(require("styled-components")); var _keplerglConnect = require("../connect/keplergl-connect"); var _mapboxGlStyleEditor = require("../utils/map-style-utils/mapbox-gl-style-editor"); var VisStateActions = _interopRequireWildcard(require("../actions/vis-state-actions")); var MapStateActions = _interopRequireWildcard(require("../actions/map-state-actions")); var MapStyleActions = _interopRequireWildcard(require("../actions/map-style-actions")); var UIStateActions = _interopRequireWildcard(require("../actions/ui-state-actions")); var _defaultSettings = require("../constants/default-settings"); var _sidePanel = _interopRequireDefault(require("./side-panel")); var _mapContainer = _interopRequireDefault(require("./map-container")); var _bottomWidget = _interopRequireDefault(require("./bottom-widget")); var _modalContainer = _interopRequireDefault(require("./modal-container")); var _plotContainer = _interopRequireDefault(require("./plot-container")); var _notificationPanel = _interopRequireDefault(require("./notification-panel")); var _utils = require("../utils/utils"); var _base = require("../styles/base"); 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 _templateObject() { var data = (0, _taggedTemplateLiteral2["default"])(["\n font-family: ff-clan-web-pro, 'Helvetica Neue', Helvetica, sans-serif;\n font-weight: 400;\n font-size: 0.875em;\n line-height: 1.71429;\n\n *,\n *:before,\n *:after {\n -webkit-box-sizing: border-box;\n -moz-box-sizing: border-box;\n box-sizing: border-box;\n }\n\n ul {\n margin: 0;\n padding: 0;\n }\n\n li {\n margin: 0;\n }\n\n a {\n text-decoration: none;\n color: ", ";\n }\n"]); _templateObject = function _templateObject() { return data; }; return data; } // Maybe we should think about exporting this or creating a variable // as part of the base.js theme var GlobalStyle = _styledComponents["default"].div(_templateObject(), function (props) { return props.theme.labelColor; }); KeplerGlFactory.deps = [_bottomWidget["default"], _mapContainer["default"], _modalContainer["default"], _sidePanel["default"], _plotContainer["default"], _notificationPanel["default"]]; function KeplerGlFactory(BottomWidget, MapContainer, ModalWrapper, SidePanel, PlotContainer, NotificationPanel) { var KeplerGL = /*#__PURE__*/ function (_Component) { (0, _inherits2["default"])(KeplerGL, _Component); function KeplerGL() { var _getPrototypeOf2; var _this; (0, _classCallCheck2["default"])(this, KeplerGL); 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"])(KeplerGL)).call.apply(_getPrototypeOf2, [this].concat(args))); (0, _defineProperty2["default"])((0, _assertThisInitialized2["default"])(_this), "_loadMapStyle", function () { var defaultStyles = Object.values(_this.props.mapStyle.mapStyles); // add id to custom map styles if not given var customeStyles = (_this.props.mapStyles || []).map(function (ms) { return _objectSpread({}, ms, { id: ms.id || (0, _utils.generateHashId)() }); }); [].concat((0, _toConsumableArray2["default"])(customeStyles), (0, _toConsumableArray2["default"])(defaultStyles)).forEach(function (style) { if (style.style) { _this.props.mapStyleActions.loadMapStyles((0, _defineProperty2["default"])({}, style.id, style)); } else { _this._requestMapStyle(style); } }); }); (0, _defineProperty2["default"])((0, _assertThisInitialized2["default"])(_this), "_requestMapStyle", function (mapStyle) { var url = mapStyle.url, id = mapStyle.id; var downloadUrl = (0, _mapboxGlStyleEditor.isValidStyleUrl)(url) ? (0, _mapboxGlStyleEditor.getStyleDownloadUrl)(url, _this.props.mapboxApiAccessToken) : url; (0, _d3Request.json)(downloadUrl, function (error, result) { if (error) { _window.console.warn("Error loading map style ".concat(url)); } else { _this.props.mapStyleActions.loadMapStyles((0, _defineProperty2["default"])({}, id, _objectSpread({}, mapStyle, { style: result }))); } }); }); return _this; } (0, _createClass2["default"])(KeplerGL, [{ key: "componentWillMount", value: function componentWillMount() { this._loadMapStyle(this.props.mapStyles); this._handleResize(this.props); } }, { key: "componentWillReceiveProps", value: function componentWillReceiveProps(nextProps) { if ( // if dimension props has changed this.props.height !== nextProps.height || this.props.width !== nextProps.width || // react-map-gl will dispatch updateViewport after this._handleResize is called // here we check if this.props.mapState.height is sync with props.height nextProps.height !== this.props.mapState.height) { this._handleResize(nextProps); } } }, { key: "_handleResize", value: function _handleResize(_ref) { var width = _ref.width, height = _ref.height; if (!Number.isFinite(width) || !Number.isFinite(height)) { _window.console.warn('width and height is required'); return; } this.props.mapStateActions.updateMap({ width: width / (1 + Number(this.props.mapState.isSplit)), height: height }); } }, { key: "render", value: function render() { var _this2 = this; var _this$props = this.props, id = _this$props.id, appName = _this$props.appName, version = _this$props.version, onSaveMap = _this$props.onSaveMap, width = _this$props.width, height = _this$props.height, mapboxApiAccessToken = _this$props.mapboxApiAccessToken, mapStyle = _this$props.mapStyle, mapState = _this$props.mapState, uiState = _this$props.uiState, visState = _this$props.visState, visStateActions = _this$props.visStateActions, mapStateActions = _this$props.mapStateActions, mapStyleActions = _this$props.mapStyleActions, uiStateActions = _this$props.uiStateActions; var filters = visState.filters, layers = visState.layers, widgets = visState.widgets, splitMaps = visState.splitMaps, layerOrder = visState.layerOrder, layerBlending = visState.layerBlending, layerClasses = visState.layerClasses, widgetOrder = visState.widgetOrder, widgetClasses = visState.widgetClasses, interactionConfig = visState.interactionConfig, datasets = visState.datasets, layerData = visState.layerData, hoverInfo = visState.hoverInfo, clicked = visState.clicked; var notificationPanelFields = { removeNotification: uiStateActions.removeNotification, notifications: uiState.notifications }; var sideFields = { appName: appName, version: version, datasets: datasets, filters: filters, layers: layers, layerOrder: layerOrder, layerClasses: layerClasses, widgets: widgets, widgetOrder: widgetOrder, widgetClasses: widgetClasses, interactionConfig: interactionConfig, mapStyle: mapStyle, layerBlending: layerBlending, onSaveMap: onSaveMap, uiState: uiState, mapState: mapState, mapStyleActions: mapStyleActions, visStateActions: visStateActions, uiStateActions: uiStateActions, width: _defaultSettings.DIMENSIONS.sidePanel.width }; var mapFields = { datasets: datasets, mapboxApiAccessToken: mapboxApiAccessToken, mapState: mapState, mapStyle: mapStyle, mapControls: uiState.mapControls, layers: layers, layerOrder: layerOrder, layerData: layerData, layerBlending: layerBlending, interactionConfig: interactionConfig, hoverInfo: hoverInfo, clicked: clicked, toggleMapControl: uiStateActions.toggleMapControl, uiStateActions: uiStateActions, visStateActions: visStateActions, mapStateActions: mapStateActions }; var isSplit = splitMaps && splitMaps.length > 1; var containerW = mapState.width * (Number(isSplit) + 1); var mapContainers = !isSplit ? [_react["default"].createElement(MapContainer, (0, _extends2["default"])({ key: 0, index: 0 }, mapFields, { mapLayers: isSplit ? splitMaps[0].layers : null }))] : splitMaps.map(function (settings, index) { return _react["default"].createElement(MapContainer, (0, _extends2["default"])({ key: index, index: index }, mapFields, { mapLayers: splitMaps[index].layers })); }); var isExporting = uiState.currentModal === _defaultSettings.EXPORT_IMAGE_ID; return _react["default"].createElement(_styledComponents.ThemeProvider, { theme: _base.theme }, _react["default"].createElement(GlobalStyle, { style: { position: 'relative', width: "".concat(width, "px"), height: "".concat(height, "px") }, className: "kepler-gl", id: "kepler-gl__".concat(id), innerRef: function innerRef(node) { _this2.root = node; } }, !uiState.readOnly && _react["default"].createElement(SidePanel, sideFields), _react["default"].createElement("div", { className: "maps", style: { display: 'flex' } }, mapContainers), isExporting && _react["default"].createElement(PlotContainer, { width: width, height: height, exportImageSetting: uiState.exportImage, mapFields: mapFields, startExportingImage: uiStateActions.startExportingImage, setExportImageDataUri: uiStateActions.setExportImageDataUri }), _react["default"].createElement(BottomWidget, { filters: filters, datasets: datasets, uiState: uiState, visStateActions: visStateActions, sidePanelWidth: _defaultSettings.DIMENSIONS.sidePanel.width + _defaultSettings.DIMENSIONS.sidePanel.margin.left, containerW: containerW }), _react["default"].createElement(ModalWrapper, { mapStyle: mapStyle, visState: visState, mapState: mapState, uiState: uiState, mapboxApiAccessToken: mapboxApiAccessToken, visStateActions: visStateActions, uiStateActions: uiStateActions, mapStyleActions: mapStyleActions, rootNode: this.root, containerW: containerW, containerH: mapState.height }))); } }]); return KeplerGL; }(_react.Component); (0, _defineProperty2["default"])(KeplerGL, "defaultProps", { mapStyles: [], width: 800, height: 800, appName: _defaultSettings.KEPLER_GL_NAME, version: _defaultSettings.KEPLER_GL_VERSION }); return (0, _keplerglConnect.connect)(mapStateToProps, mapDispatchToProps)(KeplerGL); } function mapStateToProps(state, props) { return _objectSpread({}, props, { visState: state.visState, mapStyle: state.mapStyle, mapState: state.mapState, uiState: state.uiState }); } function mapDispatchToProps(dispatch, ownProps) { var userActions = ownProps.actions || {}; var _map = [VisStateActions, MapStateActions, MapStyleActions, UIStateActions].map(function (actions) { return (0, _redux.bindActionCreators)(mergeActions(actions, userActions), dispatch); }), _map2 = (0, _slicedToArray2["default"])(_map, 4), visStateActions = _map2[0], mapStateActions = _map2[1], mapStyleActions = _map2[2], uiStateActions = _map2[3]; return { visStateActions: visStateActions, mapStateActions: mapStateActions, mapStyleActions: mapStyleActions, uiStateActions: uiStateActions, dispatch: dispatch }; } /** * Override default maps-gl actions with user defined actions using the same key */ function mergeActions(actions, userActions) { var overrides = {}; for (var key in userActions) { if (userActions.hasOwnProperty(key) && actions.hasOwnProperty(key)) { overrides[key] = userActions[key]; } } return _objectSpread({}, actions, {}, overrides); } var _default = KeplerGlFactory; exports["default"] = _default; //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9jb21wb25lbnRzL2tlcGxlci1nbC5qcyJdLCJuYW1lcyI6WyJHbG9iYWxTdHlsZSIsInN0eWxlZCIsImRpdiIsInByb3BzIiwidGhlbWUiLCJsYWJlbENvbG9yIiwiS2VwbGVyR2xGYWN0b3J5IiwiZGVwcyIsIkJvdHRvbVdpZGdldEZhY3RvcnkiLCJNYXBDb250YWluZXJGYWN0b3J5IiwiTW9kYWxDb250YWluZXJGYWN0b3J5IiwiU2lkZVBhbmVsRmFjdG9yeSIsIlBsb3RDb250YWluZXJGYWN0b3J5IiwiTm90aWZpY2F0aW9uUGFuZWxGYWN0b3J5IiwiQm90dG9tV2lkZ2V0IiwiTWFwQ29udGFpbmVyIiwiTW9kYWxXcmFwcGVyIiwiU2lkZVBhbmVsIiwiUGxvdENvbnRhaW5lciIsIk5vdGlmaWNhdGlvblBhbmVsIiwiS2VwbGVyR0wiLCJkZWZhdWx0U3R5bGVzIiwiT2JqZWN0IiwidmFsdWVzIiwibWFwU3R5bGUiLCJtYXBTdHlsZXMiLCJjdXN0b21lU3R5bGVzIiwibWFwIiwibXMiLCJpZCIsImZvckVhY2giLCJzdHlsZSIsIm1hcFN0eWxlQWN0aW9ucyIsImxvYWRNYXBTdHlsZXMiLCJfcmVxdWVzdE1hcFN0eWxlIiwidXJsIiwiZG93bmxvYWRVcmwiLCJtYXBib3hBcGlBY2Nlc3NUb2tlbiIsImVycm9yIiwicmVzdWx0IiwiQ29uc29sZSIsIndhcm4iLCJfbG9hZE1hcFN0eWxlIiwiX2hhbmRsZVJlc2l6ZSIsIm5leHRQcm9wcyIsImhlaWdodCIsIndpZHRoIiwibWFwU3RhdGUiLCJOdW1iZXIiLCJpc0Zpbml0ZSIsIm1hcFN0YXRlQWN0aW9ucyIsInVwZGF0ZU1hcCIsImlzU3BsaXQiLCJhcHBOYW1lIiwidmVyc2lvbiIsIm9uU2F2ZU1hcCIsInVpU3RhdGUiLCJ2aXNTdGF0ZSIsInZpc1N0YXRlQWN0aW9ucyIsInVpU3RhdGVBY3Rpb25zIiwiZmlsdGVycyIsImxheWVycyIsIndpZGdldHMiLCJzcGxpdE1hcHMiLCJsYXllck9yZGVyIiwibGF5ZXJCbGVuZGluZyIsImxheWVyQ2xhc3NlcyIsIndpZGdldE9yZGVyIiwid2lkZ2V0Q2xhc3NlcyIsImludGVyYWN0aW9uQ29uZmlnIiwiZGF0YXNldHMiLCJsYXllckRhdGEiLCJob3ZlckluZm8iLCJjbGlja2VkIiwibm90aWZpY2F0aW9uUGFuZWxGaWVsZHMiLCJyZW1vdmVOb3RpZmljYXRpb24iLCJub3RpZmljYXRpb25zIiwic2lkZUZpZWxkcyIsIkRJTUVOU0lPTlMiLCJzaWRlUGFuZWwiLCJtYXBGaWVsZHMiLCJtYXBDb250cm9scyIsInRvZ2dsZU1hcENvbnRyb2wiLCJsZW5ndGgiLCJjb250YWluZXJXIiwibWFwQ29udGFpbmVycyIsInNldHRpbmdzIiwiaW5kZXgiLCJpc0V4cG9ydGluZyIsImN1cnJlbnRNb2RhbCIsIkVYUE9SVF9JTUFHRV9JRCIsInBvc2l0aW9uIiwibm9kZSIsInJvb3QiLCJyZWFkT25seSIsImRpc3BsYXkiLCJleHBvcnRJbWFnZSIsInN0YXJ0RXhwb3J0aW5nSW1hZ2UiLCJzZXRFeHBvcnRJbWFnZURhdGFVcmkiLCJtYXJnaW4iLCJsZWZ0IiwiQ29tcG9uZW50IiwiS0VQTEVSX0dMX05BTUUiLCJLRVBMRVJfR0xfVkVSU0lPTiIsIm1hcFN0YXRlVG9Qcm9wcyIsIm1hcERpc3BhdGNoVG9Qcm9wcyIsInN0YXRlIiwiZGlzcGF0Y2giLCJvd25Qcm9wcyIsInVzZXJBY3Rpb25zIiwiYWN0aW9ucyIsIlZpc1N0YXRlQWN0aW9ucyIsIk1hcFN0YXRlQWN0aW9ucyIsIk1hcFN0eWxlQWN0aW9ucyIsIlVJU3RhdGVBY3Rpb25zIiwibWVyZ2VBY3Rpb25zIiwib3ZlcnJpZGVzIiwia2V5IiwiaGFzT3duUHJvcGVydHkiXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQW9CQTs7QUFDQTs7QUFDQTs7QUFDQTs7QUFDQTs7QUFDQTs7QUFDQTs7QUFLQTs7QUFDQTs7QUFDQTs7QUFDQTs7QUFFQTs7QUFPQTs7QUFDQTs7QUFD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MTkgVWJlciBUZWNobm9sb2dpZXMsIEluYy5cbi8vXG4vLyBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcgYSBjb3B5XG4vLyBvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZSBcIlNvZnR3YXJlXCIpLCB0byBkZWFsXG4vLyBpbiB0aGUgU29mdHdhcmUgd2l0aG91dCByZXN0cmljdGlvbiwgaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvbiB0aGUgcmlnaHRzXG4vLyB0byB1c2UsIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsIGRpc3RyaWJ1dGUsIHN1YmxpY2Vuc2UsIGFuZC9vciBzZWxsXG4vLyBjb3BpZXMgb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8gcGVybWl0IHBlcnNvbnMgdG8gd2hvbSB0aGUgU29mdHdhcmUgaXNcbi8vIGZ1cm5pc2hlZCB0byBkbyBzbywgc3ViamVjdCB0byB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6XG4vL1xuLy8gVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2Ugc2hhbGwgYmUgaW5jbHVkZWQgaW5cbi8vIGFsbCBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlIFNvZnR3YXJlLlxuLy9cbi8vIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCBcIkFTIElTXCIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEVYUFJFU1MgT1Jcbi8vIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZLFxuLy8gRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTklORlJJTkdFTUVOVC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFXG4vLyBBVVRIT1JTIE9SIENPUFlSSUdIVCBIT0xERVJTIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLCBEQU1BR0VTIE9SIE9USEVSXG4vLyBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SIE9USEVSV0lTRSwgQVJJU0lORyBGUk9NLFxuLy8gT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFIFVTRSBPUiBPVEhFUiBERUFMSU5HUyBJTlxuLy8gVEhFIFNPRlRXQVJFLlxuXG5pbXBvcnQgUmVhY3QsIHtDb21wb25lbnR9IGZyb20gJ3JlYWN0JztcbmltcG9ydCB7Y29uc29sZSBhcyBDb25zb2xlfSBmcm9tICdnbG9iYWwvd2luZG93JztcbmltcG9ydCB7YmluZEFjdGlvbkNyZWF0b3JzfSBmcm9tICdyZWR1eCc7XG5pbXBvcnQge2pzb24gYXMgcmVxdWVzdEpzb259IGZyb20gJ2QzLXJlcXVlc3QnO1xuaW1wb3J0IHN0eWxlZCwge1RoZW1lUHJvdmlkZXJ9IGZyb20gJ3N0eWxlZC1jb21wb25lbnRzJztcbmltcG9ydCB7Y29ubmVjdCBhcyBrZXBsZXJHbENvbm5lY3R9IGZyb20gJ2Nvbm5lY3Qva2VwbGVyZ2wtY29ubmVjdCc7XG5pbXBvcnQge1xuICBpc1ZhbGlkU3R5bGVVcmwsXG4gIGdldFN0eWxlRG93bmxvYWRVcmxcbn0gZnJvbSAndXRpbHMvbWFwLXN0eWxlLXV0aWxzL21hcGJveC1nbC1zdHlsZS1lZGl0b3InO1xuXG5pbXBvcnQgKiBhcyBWaXNTdGF0ZUFjdGlvbnMgZnJvbSAnYWN0aW9ucy92aXMtc3RhdGUtYWN0aW9ucyc7XG5pbXBvcnQgKiBhcyBNYXBTdGF0ZUFjdGlvbnMgZnJvbSAnYWN0aW9ucy9tYXAtc3RhdGUtYWN0aW9ucyc7XG5pbXBvcnQgKiBhcyBNYXBTdHlsZUFjdGlvbnMgZnJvbSAnYWN0aW9ucy9tYXAtc3R5bGUtYWN0aW9ucyc7XG5pbXBvcnQgKiBhcyBVSVN0YXRlQWN0aW9ucyBmcm9tICdhY3Rpb25zL3VpLXN0YXRlLWFjdGlvbnMnO1xuXG5pbXBvcnQge1xuICBFWFBPUlRfSU1BR0VfSUQsXG4gIERJTUVOU0lPTlMsXG4gIEtFUExFUl9HTF9OQU1FLFxuICBLRVBMRVJfR0xfVkVSU0lPTlxufSBmcm9tICdjb25zdGFudHMvZGVmYXVsdC1zZXR0aW5ncyc7XG5cbmltcG9ydCBTaWRlUGFuZWxGYWN0b3J5IGZyb20gJy4vc2lkZS1wYW5lbCc7XG5pbXBvcnQgTWFwQ29udGFpbmVyRmFjdG9yeSBmcm9tICcuL21hcC1jb250YWluZXInO1xuaW1wb3J0IEJvdHRvbVdpZGdldEZhY3RvcnkgZnJvbSAnLi9ib3R0b20td2lkZ2V0JztcbmltcG9ydCBNb2RhbENvbnRhaW5lckZhY3RvcnkgZnJvbSAnLi9tb2RhbC1jb250YWluZXInO1xuaW1wb3J0IFBsb3RDb250YWluZXJGYWN0b3J5IGZyb20gJy4vcGxvdC1jb250YWluZXInO1xuaW1wb3J0IE5vdGlmaWNhdGlvblBhbmVsRmFjdG9yeSBmcm9tICcuL25vdGlmaWNhdGlvbi1wYW5lbCc7XG5cbmltcG9ydCB7Z2VuZXJhdGVIYXNoSWR9IGZyb20gJ3V0aWxzL3V0aWxzJztcblxuaW1wb3J0IHt0aGVtZX0gZnJvbSAnc3R5bGVzL2Jhc2UnO1xuXG4vLyBNYXliZSB3ZSBzaG91bGQgdGhpbmsgYWJvdXQgZXhwb3J0aW5nIHRoaXMgb3IgY3JlYXRpbmcgYSB2YXJpYWJsZVxuLy8gYXMgcGFydCBvZiB0aGUgYmFzZS5qcyB0aGVtZVxuY29uc3QgR2xvYmFsU3R5bGUgPSBzdHlsZWQuZGl2YFxuICBmb250LWZhbWlseTogZmYtY2xhbi13ZWItcHJvLCAnSGVsdmV0aWNhIE5ldWUnLCBIZWx2ZXRpY2EsIHNhbnMtc2VyaWY7XG4gIGZvbnQtd2VpZ2h0OiA0MDA7XG4gIGZvbnQtc2l6ZTogMC44NzVlbTtcbiAgbGluZS1oZWlnaHQ6IDEuNzE0Mjk7XG5cbiAgKixcbiAgKjpiZWZvcmUsXG4gICo6YWZ0ZXIge1xuICAgIC13ZWJraXQtYm94LXNpemluZzogYm9yZGVyLWJveDtcbiAgICAtbW96LWJveC1zaXppbmc6IGJvcmRlci1ib3g7XG4gICAgYm94LXNpemluZzogYm9yZGVyLWJveDtcbiAgfVxuXG4gIHVsIHtcbiAgICBtYXJnaW46IDA7XG4gICAgcGFkZGluZzogMDtcbiAgfVxuXG4gIGxpIHtcbiAgICBtYXJnaW46IDA7XG4gIH1cblxuICBhIHtcbiAgICB0ZXh0LWRlY29yYXRpb246IG5vbmU7XG4gICAgY29sb3I6ICR7cHJvcHMgPT4gcHJvcHMudGhlbWUubGFiZWxDb2xvcn07XG4gIH1cbmA7XG5cbktlcGxlckdsRmFjdG9yeS5kZXBzID0gW1xuICBCb3R0b21XaWRnZXRGYWN0b3J5LFxuICBNYXBDb250YWluZXJGYWN0b3J5LFxuICBNb2RhbENvbnRhaW5lckZhY3RvcnksXG4gIFNpZGVQYW5lbEZhY3RvcnksXG4gIFBsb3RDb250YWluZXJGYWN0b3J5LFxuICBOb3RpZmljYXRpb25QYW5lbEZhY3Rvcnlcbl07XG5cbmZ1bmN0aW9uIEtlcGxlckdsRmFjdG9yeShcbiAgQm90dG9tV2lkZ2V0LFxuICBNYXBDb250YWluZXIsXG4gIE1vZGFsV3JhcHBlcixcbiAgU2lkZVBhbmVsLFxuICBQbG90Q29udGFpbmVyLFxuICBOb3RpZmljYXRpb25QYW5lbFxuKSB7XG4gIGNsYXNzIEtlcGxlckdMIGV4dGVuZHMgQ29tcG9uZW50IHtcbiAgICBzdGF0aWMgZGVmYXVsdFByb3BzID0ge1xuICAgICAgbWFwU3R5bGVzOiBbXSxcbiAgICAgIHdpZHRoOiA4MDAsXG4gICAgICBoZWlnaHQ6IDgwMCxcbiAgICAgIGFwcE5hbWU6IEtFUExFUl9HTF9OQU1FLFxuICAgICAgdmVyc2lvbjogS0VQTEVSX0dMX1ZFUlNJT05cbiAgICB9O1xuXG4gICAgY29tcG9uZW50V2lsbE1vdW50KCkge1xuICAgICAgdGhpcy5fbG9hZE1hcFN0eWxlKHRoaXMucHJvcHMubWFwU3R5bGVzKTtcbiAgICAgIHRoaXMuX2hhbmRsZVJlc2l6ZSh0aGlzLnByb3BzKTtcbiAgICB9XG5cbiAgICBjb21wb25lbnRXaWxsUmVjZWl2ZVByb3BzKG5leHRQcm9wcykge1xuICAgICAgaWYgKFxuICAgICAgICAvLyBpZiBkaW1lbnNpb24gcHJvcHMgaGFzIGNoYW5nZWRcbiAgICAgICAgdGhpcy5wcm9wcy5oZWlnaHQgIT09IG5leHRQcm9wcy5oZWlnaHQgfHxcbiAgICAgICAgdGhpcy5wcm9wcy53aWR0aCAhPT0gbmV4dFByb3BzLndpZHRoIHx8XG4gICAgICAgIC8vIHJlYWN0LW1hcC1nbCB3aWxsIGRpc3BhdGNoIHVwZGF0ZVZpZXdwb3J0IGFmdGVyIHRoaXMuX2hhbmRsZVJlc2l6ZSBpcyBjYWxsZWRcbiAgICAgICAgLy8gaGVyZSB3ZSBjaGVjayBpZiB0aGlzLnByb3BzLm1hcFN0YXRlLmhlaWdodCBpcyBzeW5jIHdpdGggcHJvcHMuaGVpZ2h0XG4gICAgICAgIG5leHRQcm9wcy5oZWlnaHQgIT09IHRoaXMucHJvcHMubWFwU3RhdGUuaGVpZ2h0XG4gICAgICApIHtcbiAgICAgICAgdGhpcy5faGFuZGxlUmVzaXplKG5leHRQcm9wcyk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgX2hhbmRsZVJlc2l6ZSh7d2lkdGgsIGhlaWdodH0pIHtcbiAgICAgIGlmICghTnVtYmVyLmlzRmluaXRlKHdpZHRoKSB8fCAhTnVtYmVyLmlzRmluaXRlKGhlaWdodCkpIHtcbiAgICAgICAgQ29uc29sZS53YXJuKCd3aWR0aCBhbmQgaGVpZ2h0IGlzIHJlcXVpcmVkJyk7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIHRoaXMucHJvcHMubWFwU3RhdGVBY3Rpb25zLnVwZGF0ZU1hcCh7XG4gICAgICAgIHdpZHRoOiB3aWR0aCAvICgxICsgTnVtYmVyKHRoaXMucHJvcHMubWFwU3RhdGUuaXNTcGxpdCkpLFxuICAgICAgICBoZWlnaHRcbiAgICAgIH0pO1xuICAgIH1cblxuICAgIF9sb2FkTWFwU3R5bGUgPSAoKSA9PiB7XG4gICAgICBjb25zdCBkZWZhdWx0U3R5bGVzID0gT2JqZWN0LnZhbHVlcyh0aGlzLnByb3BzLm1hcFN0eWxlLm1hcFN0eWxlcyk7XG4gICAgICAvLyBhZGQgaWQgdG8gY3VzdG9tIG1hcCBzdHlsZXMgaWYgbm90IGdpdmVuXG4gICAgICBjb25zdCBjdXN0b21lU3R5bGVzID0gKHRoaXMucHJvcHMubWFwU3R5bGVzIHx8IFtdKS5tYXAobXMgPT4gKHtcbiAgICAgICAgLi4ubXMsXG4gICAgICAgIGlkOiBtcy5pZCB8fCBnZW5lcmF0ZUhhc2hJZCgpXG4gICAgICB9KSk7XG5cbiAgICAgIFsuLi5jdXN0b21lU3R5bGVzLCAuLi5kZWZhdWx0U3R5bGVzXS5mb3JFYWNoKHN0eWxlID0+IHtcbiAgICAgICAgaWYgKHN0eWxlLnN0eWxlKSB7XG4gICAgICAgICAgdGhpcy5wcm9wcy5tYXBTdHlsZUFjdGlvbnMubG9hZE1hcFN0eWxlcyh7XG4gICAgICAgICAgICBbc3R5bGUuaWRdOiBzdHlsZVxuICAgICAgICAgIH0pO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHRoaXMuX3JlcXVlc3RNYXBTdHlsZShzdHlsZSk7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgIH07XG5cbiAgICBfcmVxdWVzdE1hcFN0eWxlID0gbWFwU3R5bGUgPT4ge1xuICAgICAgY29uc3Qge3VybCwgaWR9ID0gbWFwU3R5bGU7XG5cbiAgICAgIGNvbnN0IGRvd25sb2FkVXJsID0gaXNWYWxpZFN0eWxlVXJsKHVybClcbiAgICAgICAgPyBnZXRTdHlsZURvd25sb2FkVXJsKHVybCwgdGhpcy5wcm9wcy5tYXBib3hBcGlBY2Nlc3NUb2tlbilcbiAgICAgICAgOiB1cmw7XG5cbiAgICAgIHJlcXVlc3RKc29uKGRvd25sb2FkVXJsLCAoZXJyb3IsIHJlc3VsdCkgPT4ge1xuICAgICAgICBpZiAoZXJyb3IpIHtcbiAgICAgICAgICBDb25zb2xlLndhcm4oYEVycm9yIGxvYWRpbmcgbWFwIHN0eWxlICR7dXJsfWApO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHRoaXMucHJvcHMubWFwU3R5bGVBY3Rpb25zLmxvYWRNYXBTdHlsZXMoe1xuICAgICAgICAgICAgW2lkXTogey4uLm1hcFN0eWxlLCBzdHlsZTogcmVzdWx0fVxuICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICB9O1xuXG4gICAgcmVuZGVyKCkge1xuICAgICAgY29uc3Qge1xuICAgICAgICAvLyBwcm9wc1xuICAgICAgICBpZCxcbiAgICAgICAgYXBwTmFtZSxcbiAgICAgICAgdmVyc2lvbixcbiAgICAgICAgb25TYXZlTWFwLFxuICAgICAgICB3aWR0aCxcbiAgICAgICAgaGVpZ2h0LFxuICAgICAgICBtYXBib3hBcGlBY2Nlc3NUb2tlbixcblxuICAgICAgICAvLyByZWR1eCBzdGF0ZVxuICAgICAgICBtYXBTdHlsZSxcbiAgICAgICAgbWFwU3RhdGUsXG4gICAgICAgIHVpU3RhdGUsXG4gICAgICAgIHZpc1N0YXRlLFxuXG4gICAgICAgIC8vIGFjdGlvbnMsXG4gICAgICAgIHZpc1N0YXRlQWN0aW9ucyxcbiAgICAgICAgbWFwU3RhdGVBY3Rpb25zLFxuICAgICAgICBtYXBTdHlsZUFjdGlvbnMsXG4gICAgICAgIHVpU3RhdGVBY3Rpb25zXG4gICAgICB9ID0gdGhpcy5wcm9wcztcblxuICAgICAgY29uc3Qge1xuICAgICAgICBmaWx0ZXJzLFxuICAgICAgICBsYXllcnMsXG4gICAgICAgIHdpZGdldHMsXG4gICAgICAgIHNwbGl0TWFwcywgLy8gdGhpcyB3aWxsIHN0b3JlIHN1cHBvcnQgZm9yIHNwbGl0IG1hcCB2aWV3IGlzIG5lY2Vzc2FyeVxuICAgICAgICBsYXllck9yZGVyLFxuICAgICAgICBsYXllckJsZW5kaW5nLFxuICAgICAgICBsYXllckNsYXNzZXMsXG4gICAgICAgIHdpZGdldE9yZGVyLFxuICAgICAgICB3aWRnZXRDbGFzc2VzLFxuICAgICAgICBpbnRlcmFjdGlvbkNvbmZpZyxcbiAgICAgICAgZGF0YXNldHMsXG4gICAgICAgIGxheWVyRGF0YSxcbiAgICAgICAgaG92ZXJJbmZvLFxuICAgICAgICBjbGlja2VkXG4gICAgICB9ID0gdmlzU3RhdGU7XG5cbiAgICAgIGNvbnN0IG5vdGlmaWNhdGlvblBhbmVsRmllbGRzID0ge1xuICAgICAgICByZW1vdmVOb3RpZmljYXRpb246IHVpU3RhdGVBY3Rpb25zLnJlbW92ZU5vdGlmaWNhdGlvbixcbiAgICAgICAgbm90aWZpY2F0aW9uczogdWlTdGF0ZS5ub3RpZmljYXRpb25zXG4gICAgICB9O1xuXG4gICAgICBjb25zdCBzaWRlRmllbGRzID0ge1xuICAgICAgICBhcHBOYW1lLFxuICAgICAgICB2ZXJzaW9uLFxuICAgICAgICBkYXRhc2V0cyxcbiAgICAgICAgZmlsdGVycyxcbiAgICAgICAgbGF5ZXJzLFxuICAgICAgICBsYXllck9yZGVyLFxuICAgICAgICBsYXllckNsYXNzZXMsXG4gICAgICAgIHdpZGdldHMsXG4gICAgICAgIHdpZGdldE9yZGVyLFxuICAgICAgICB3aWRnZXRDbGFzc2VzLFxuICAgICAgICBpbnRlcmFjdGlvbkNvbmZpZyxcbiAgICAgICAgbWFwU3R5bGUsXG4gICAgICAgIGxheWVyQmxlbmRpbmcsXG4gICAgICAgIG9uU2F2ZU1hcCxcbiAgICAgICAgdWlTdGF0ZSxcbiAgICAgICAgbWFwU3RhdGUsXG4gICAgICAgIG1hcFN0eWxlQWN0aW9ucyxcbiAgICAgICAgdmlzU3RhdGVBY3Rpb25zLFxuICAgICAgICB1aVN0YXRlQWN0aW9ucyxcbiAgICAgICAgd2lkdGg6IERJTUVOU0lPTlMuc2lkZVBhbmVsLndpZHRoXG4gICAgICB9O1xuXG4gICAgICBjb25zdCBtYXBGaWVsZHMgPSB7XG4gICAgICAgIGRhdGFzZXRzLFxuICAgICAgICBtYXBib3hBcGlBY2Nlc3NUb2tlbixcbiAgICAgICAgbWFwU3RhdGUsXG4gICAgICAgIG1hcFN0eWxlLFxuICAgICAgICBtYXBDb250cm9sczogdWlTdGF0ZS5tYXBDb250cm9scyxcbiAgICAgICAgbGF5ZXJzLFxuICAgICAgICBsYXllck9yZGVyLFxuICAgICAgICBsYXllckRhdGEsXG4gICAgICAgIGxheWVyQmxlbmRpbmcsXG4gICAgICAgIGludGVyYWN0aW9uQ29uZmlnLFxuICAgICAgICBob3ZlckluZm8sXG4gICAgICAgIGNsaWNrZWQsXG4gICAgICAgIHRvZ2dsZU1hcENvbnRyb2w6IHVpU3RhdGVBY3Rpb25zLnRvZ2dsZU1hcENvbnRyb2wsXG4gICAgICAgIHVpU3RhdGVBY3Rpb25zLFxuICAgICAgICB2aXNTdGF0ZUFjdGlvbnMsXG4gICAgICAgIG1hcFN0YXRlQWN0aW9uc1xuICAgICAgfTtcblxuICAgICAgY29uc3QgaXNTcGxpdCA9IHNwbGl0TWFwcyAmJiBzcGxpdE1hcHMubGVuZ3RoID4gMTtcbiAgICAgIGNvbnN0IGNvbnRhaW5lclcgPSBtYXBTdGF0ZS53aWR0aCAqIChOdW1iZXIoaXNTcGxpdCkgKyAxKTtcblxuICAgICAgY29uc3QgbWFwQ29udGFpbmVycyA9ICFpc1NwbGl0XG4gICAgICAgID8gW1xuICAgICAgICAgICAgPE1hcENvbnRhaW5lclxuICAgICAgICAgICAgICBrZXk9ezB9XG4gICAgICAgICAgICAgIGluZGV4PXswfVxuICAgICAgICAgICAgICB7Li4ubWFwRmllbGRzfVxuICAgICAgICAgICAgICBtYXBMYXllcnM9e2lzU3BsaXQgPyBzcGxpdE1hcHNbMF0ubGF5ZXJzIDogbnVsbH1cbiAgICAgICAgICAgIC8+XG4gICAgICAgICAgXVxuICAgICAgICA6IHNwbGl0TWFwcy5tYXAoKHNldHRpbmdzLCBpbmRleCkgPT4gKFxuICAgICAgICAgICAgPE1hcENvbnRhaW5lclxuICAgICAgICAgICAgICBrZXk9e2luZGV4fVxuICAgICAgICAgICAgICBpbmRleD17aW5kZXh9XG4gICAgICAgICAgICAgIHsuLi5tYXBGaWVsZHN9XG4gICAgICAgICAgICAgIG1hcExheWVycz17c3BsaXRNYXBzW2luZGV4XS5sYXllcnN9XG4gICAgICAgICAgICAvPlxuICAgICAgICAgICkpO1xuXG4gICAgICBjb25zdCBpc0V4cG9ydGluZyA9IHVpU3RhdGUuY3VycmVudE1vZGFsID09PSBFWFBPUlRfSU1BR0VfSUQ7XG5cbiAgICAgIHJldHVybiAoXG4gICAgICAgIDxUaGVtZVByb3ZpZGVyIHRoZW1lPXt0aGVtZX0+XG4gICAgICAgICAgPEdsb2JhbFN0eWxlXG4gICAgICAgICAgICBzdHlsZT17e1xuICAgICAgICAgICAgICBwb3NpdGlvbjogJ3JlbGF0aXZlJyxcbiAgICAgICAgICAgICAgd2lkdGg6IGAke3dpZHRofXB4YCxcbiAgICAgICAgICAgICAgaGVpZ2h0OiBgJHtoZWlnaHR9cHhgXG4gICAgICAgICAgICB9fVxuICAgICAgICAgICAgY2xhc3NOYW1lPVwia2VwbGVyLWdsXCJcbiAgICAgICAgICAgIGlkPXtga2VwbGVyLWdsX18ke2lkfWB9XG4gICAgICAgICAgICBpbm5lclJlZj17bm9kZSA9PiB7XG4gICAgICAgICAgICAgIHRoaXMucm9vdCA9IG5vZGU7XG4gICAgICAgICAgICB9fVxuICAgICAgICAgID5cbiAgICAgICAgICAgIHsvKiA8Tm90aWZpY2F0aW9uUGFuZWwgey4uLm5vdGlmaWNhdGlvblBhbmVsRmllbGRzfSAvPiAqL31cbiAgICAgICAgICAgIHshdWlTdGF0ZS5yZWFkT25seSAmJiA8U2lkZVBhbmVsIHsuLi5zaWRlRmllbGRzfSAvPn1cbiAgICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPVwibWFwc1wiIHN0eWxlPXt7ZGlzcGxheTogJ2ZsZXgnfX0+XG4gICAgICAgICAgICAgIHttYXBDb250YWluZXJzfVxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICB7aXNFeHBvcnRpbmcgJiYgKFxuICAgICAgICAgICAgICA8UGxvdENvbnRhaW5lclxuICAgICAgICAgICAgICAgIHdpZHRoPXt3aWR0aH1cbiAgICAgICAgICAgICAgICBoZWlnaHQ9e2hlaWdodH1cbiAgICAgICAgICAgICAgICBleHBvcnRJbWFnZVNldHRpbmc9e3VpU3RhdGUuZXhwb3J0SW1hZ2V9XG4gICAgICAgICAgICAgICAgbWFwRmllbGRzPXttYXBGaWVsZHN9XG4gICAgICAgICAgICAgICAgc3RhcnRFeHBvcnRpbmdJbWFnZT17dWlTdGF0ZUFjdGlvbnMuc3RhcnRFeHBvcnRpbmdJbWFnZX1cbiAgICAgICAgICAgICAgICBzZXRFeHBvcnRJbWFnZURhdGFVcmk9e3VpU3RhdGVBY3Rpb25zLnNldEV4cG9ydEltYWdlRGF0YVVyaX1cbiAgICAgICAgICAgICAgLz5cbiAgICAgICAgICAgICl9XG4gICAgICAgICAgICA8Qm90dG9tV2lkZ2V0XG4gICAgICAgICAgICAgIGZpbHRlcnM9e2ZpbHRlcnN9XG4gICAgICAgICAgICAgIGRhdGFzZXRzPXtkYXRhc2V0c31cbiAgICAgICAgICAgICAgdWlTdGF0ZT17dWlTdGF0ZX1cbiAgICAgICAgICAgICAgdmlzU3RhdGVBY3Rpb25zPXt2aXNTdGF0ZUFjdGlvbnN9XG4gICAgICAgICAgICAgIHNpZGVQYW5lbFdpZHRoPXtcbiAgICAgICAgICAgICAgICBESU1FTlNJT05TLnNpZGVQYW5lbC53aWR0aCArIERJTUVOU0lPTlMuc2lkZVBhbmVsLm1hcmdpbi5sZWZ0XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgY29udGFpbmVyVz17Y29udGFpbmVyV31cbiAgICAgICAgICAgIC8+XG4gICAgICAgICAgICA8TW9kYWxXcmFwcGVyXG4gICAgICAgICAgICAgIG1hcFN0eWxlPXttYXBTdHlsZX1cbiAgICAgICAgICAgICAgdmlzU3RhdGU9e3Zpc1N0YXRlfVxuICAgICAgICAgICAgICBtYXBTdGF0ZT17bWFwU3RhdGV9XG4gICAgICAgICAgICAgIHVpU3RhdGU9e3VpU3RhdGV9XG4gICAgICAgICAgICAgIG1hcGJveEFwaUFjY2Vzc1Rva2VuPXttYXBib3hBcGlBY2Nlc3NUb2tlbn1cbiAgICAgICAgICAgICAgdmlzU3RhdGVBY3Rpb25zPXt2aXNTdGF0ZUFjdGlvbnN9XG4gICAgICAgICAgICAgIHVpU3RhdGVBY3Rpb25zPXt1aVN0YXRlQWN0aW9uc31cbiAgICAgICAgICAgICAgbWFwU3R5bGVBY3Rpb25zPXttYXBTdHlsZUFjdGlvbnN9XG4gICAgICAgICAgICAgIHJvb3ROb2RlPXt0aGlzLnJvb3R9XG4gICAgICAgICAgICAgIGNvbnRhaW5lclc9e2NvbnRhaW5lcld9XG4gICAgICAgICAgICAgIGNvbnRhaW5lckg9e21hcFN0YXRlLmhlaWdodH1cbiAgICAgICAgICAgIC8+XG4gICAgICAgICAgPC9HbG9iYWxTdHlsZT5cbiAgICAgICAgPC9UaGVtZVByb3ZpZGVyPlxuICAgICAgKTtcbiAgICB9XG4gIH1cblxuICByZXR1cm4ga2VwbGVyR2xDb25uZWN0KG1hcFN0YXRlVG9Qcm9wcywgbWFwRGlzcGF0Y2hUb1Byb3BzKShLZXBsZXJHTCk7XG59XG5cbmZ1bmN0aW9uIG1hcFN0YXRlVG9Qcm9wcyhzdGF0ZSwgcHJvcHMpIHtcbiAgcmV0dXJuIHtcbiAgICAuLi5wcm9wcyxcbiAgICB2aXNTdGF0ZTogc3RhdGUudmlzU3RhdGUsXG4gICAgbWFwU3R5bGU6IHN0YXRlLm1hcFN0eWxlLFxuICAgIG1hcFN0YXRlOiBzdGF0ZS5tYXBTdGF0ZSxcbiAgICB1aVN0YXRlOiBzdGF0ZS51aVN0YXRlXG4gIH07XG59XG5cbmZ1bmN0aW9uIG1hcERpc3BhdGNoVG9Qcm9wcyhkaXNwYXRjaCwgb3duUHJvcHMpIHtcbiAgY29uc3QgdXNlckFjdGlvbnMgPSBvd25Qcm9wcy5hY3Rpb25zIHx8IHt9O1xuXG4gIGNvbnN0IFt2aXNTdGF0ZUFjdGlvbnMsIG1hcFN0YXRlQWN0aW9ucywgbWFwU3R5bGVBY3Rpb25zLCB1aVN0YXRlQWN0aW9uc10gPSBbXG4gICAgVmlzU3RhdGVBY3Rpb25zLFxuICAgIE1hcFN0YXRlQWN0aW9ucyxcbiAgICBNYXBTdHlsZUFjdGlvbnMsXG4gICAgVUlTdGF0ZUFjdGlvbnNcbiAgXS5tYXAoYWN0aW9ucyA9PlxuICAgIGJpbmRBY3Rpb25DcmVhdG9ycyhtZXJnZUFjdGlvbnMoYWN0aW9ucywgdXNlckFjdGlvbnMpLCBkaXNwYXRjaClcbiAgKTtcblxuICByZXR1cm4ge1xuICAgIHZpc1N0YXRlQWN0aW9ucyxcbiAgICBtYXBTdGF0ZUFjdGlvbnMsXG4gICAgbWFwU3R5bGVBY3Rpb25zLFxuICAgIHVpU3RhdGVBY3Rpb25zLFxuICAgIGRpc3BhdGNoXG4gIH07XG59XG5cbi8qKlxuICogT3ZlcnJpZGUgZGVmYXVsdCBtYXBzLWdsIGFjdGlvbnMgd2l0aCB1c2VyIGRlZmluZWQgYWN0aW9ucyB1c2luZyB0aGUgc2FtZSBrZXlcbiAqL1xuZnVuY3Rpb24gbWVyZ2VBY3Rpb25zKGFjdGlvbnMsIHVzZXJBY3Rpb25zKSB7XG4gIGNvbnN0IG92ZXJyaWRlcyA9IHt9O1xuICBmb3IgKGNvbnN0IGtleSBpbiB1c2VyQWN0aW9ucykge1xuICAgIGlmICh1c2VyQWN0aW9ucy5oYXNPd25Qcm9wZXJ0eShrZXkpICYmIGFjdGlvbnMuaGFzT3duUHJvcGVydHkoa2V5KSkge1xuICAgICAgb3ZlcnJpZGVzW2tleV0gPSB1c2VyQWN0aW9uc1trZXldO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiB7Li4uYWN0aW9ucywgLi4ub3ZlcnJpZGVzfTtcbn1cblxuZXhwb3J0IGRlZmF1bHQgS2VwbGVyR2xGYWN0b3J5O1xuIl19