UNPKG

kepler.gl.geoiq

Version:

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

231 lines (183 loc) 25.2 kB
"use strict"; var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault"); var _typeof = require("@babel/runtime/helpers/typeof"); Object.defineProperty(exports, "__esModule", { value: true }); exports["default"] = 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 _styledComponents = _interopRequireDefault(require("styled-components")); var _reselect = require("reselect"); var _d3Format = require("d3-format"); var _moment = _interopRequireDefault(require("moment")); var _defaultSettings = require("../../constants/default-settings"); var _filterUtils = require("../../utils/filter-utils"); var _templateObject; 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 ROW_H = 10; var GAP = 4; var RECT_W = 20; var StyledLegend = _styledComponents["default"].div(_templateObject || (_templateObject = (0, _taggedTemplateLiteral2["default"])(["\n ", ";\n\n max-height: 150px;\n overflow-y: auto;\n\n svg {\n text {\n font-size: 9px;\n fill: ", ";\n }\n }\n"])), function (props) { return props.theme.sidePanelScrollBar; }, function (props) { return props.theme.textColor; }); var defaultFormat = function defaultFormat(d) { return d; }; var getTimeLabelFormat = function getTimeLabelFormat(domain) { var formatter = (0, _filterUtils.getTimeWidgetHintFormatter)(domain); return function (val) { return _moment["default"].utc(val).format(formatter); }; }; var getNumericLabelFormat = function getNumericLabelFormat(domain) { var diff = domain[1] - domain[0]; if (diff < 10) { return (0, _d3Format.format)('.2f'); } return (0, _d3Format.format)('.1f'); }; var getQuantLabelFormat = function getQuantLabelFormat(domain, fieldType) { // quant scale can only be assigned to linear Fields: real, timestamp, integer return fieldType === _defaultSettings.ALL_FIELD_TYPES.timestamp ? getTimeLabelFormat(domain) : !fieldType ? defaultFormat : getNumericLabelFormat(domain); }; var getOrdinalLegends = function getOrdinalLegends(scale) { var domain = scale.domain(); return { data: domain.map(scale), labels: domain }; }; var getQuantLegends = function getQuantLegends(scale, labelFormat) { var labels = scale.range().map(function (d) { var invert = scale.invertExtent(d); return "".concat(labelFormat(invert[0]), " to ").concat(labelFormat(invert[1])); }); return { data: scale.range(), labels: labels }; }; var ColorLegend = exports["default"] = /*#__PURE__*/function (_Component) { (0, _inherits2["default"])(ColorLegend, _Component); var _super = _createSuper(ColorLegend); function ColorLegend() { var _this; (0, _classCallCheck2["default"])(this, ColorLegend); 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), "domainSelector", function (props) { return props.domain; }); (0, _defineProperty2["default"])((0, _assertThisInitialized2["default"])(_this), "rangeSelector", function (props) { return props.range; }); (0, _defineProperty2["default"])((0, _assertThisInitialized2["default"])(_this), "labelFormatSelector", function (props) { return props.labelFormat; }); (0, _defineProperty2["default"])((0, _assertThisInitialized2["default"])(_this), "scaleTypeSelector", function (props) { return props.scaleType; }); (0, _defineProperty2["default"])((0, _assertThisInitialized2["default"])(_this), "fieldTypeSelector", function (props) { return props.fieldType; }); (0, _defineProperty2["default"])((0, _assertThisInitialized2["default"])(_this), "legendsSelector", (0, _reselect.createSelector)(_this.domainSelector, _this.rangeSelector, _this.scaleTypeSelector, _this.labelFormatSelector, _this.fieldTypeSelector, function (domain, range, scaleType, labelFormat, fieldType) { var scaleFunction = _defaultSettings.SCALE_FUNC[scaleType]; // color scale can only be quantize, quantile or ordinal var scale = scaleFunction().domain(domain).range(range); if (scaleType === _defaultSettings.SCALE_TYPES.ordinal) { return getOrdinalLegends(scale); } var formatLabel = labelFormat || getQuantLabelFormat(scale.domain(), fieldType); return getQuantLegends(scale, formatLabel); })); (0, _defineProperty2["default"])((0, _assertThisInitialized2["default"])(_this), "apilegend", function (props) { return props.legend; }); (0, _defineProperty2["default"])((0, _assertThisInitialized2["default"])(_this), "APILegendSelector", (0, _reselect.createSelector)(_this.apilegend, _this.rangeSelector, function (legend, range) { return { data: range, labels: legend.map(function (l) { return "".concat(l.x1.toFixed(2), " to ").concat(l.x2.toFixed(2)); }) }; })); return _this; } (0, _createClass2["default"])(ColorLegend, [{ key: "render", value: function render() { var _this$props = this.props, width = _this$props.width, scaleType = _this$props.scaleType, domain = _this$props.domain, range = _this$props.range, legend = _this$props.legend, _this$props$displayLa = _this$props.displayLabel, displayLabel = _this$props$displayLa === void 0 ? true : _this$props$displayLa; if (!domain || !range || !scaleType) { return null; } var legends = legend ? this.APILegendSelector(this.props) : this.legendsSelector(this.props); var height = legends.data.length * (ROW_H + GAP); return (/*#__PURE__*/_react["default"].createElement(StyledLegend, null, /*#__PURE__*/_react["default"].createElement("svg", { width: width - 24, height: height }, legends.data.map(function (color, idx) { return (/*#__PURE__*/_react["default"].createElement(LegendRow, { key: idx, label: legends.labels[idx], displayLabel: displayLabel, color: color, idx: idx }) ); }))) ); } }]); return ColorLegend; }(_react.Component); (0, _defineProperty2["default"])(ColorLegend, "propTypes", { width: _propTypes["default"].number.isRequired, scaleType: _propTypes["default"].string, domain: _propTypes["default"].oneOfType([_propTypes["default"].array, _propTypes["default"].object]), fieldType: _propTypes["default"].string, range: _propTypes["default"].arrayOf(_propTypes["default"].string), labelFormat: _propTypes["default"].func }); var LegendRow = function LegendRow(_ref) { var _ref$label = _ref.label, label = _ref$label === void 0 ? '' : _ref$label, displayLabel = _ref.displayLabel, color = _ref.color, idx = _ref.idx; return (/*#__PURE__*/_react["default"].createElement("g", { transform: "translate(0, ".concat(idx * (ROW_H + GAP), ")") }, /*#__PURE__*/_react["default"].createElement("rect", { width: RECT_W, height: ROW_H, style: { fill: color } }), /*#__PURE__*/_react["default"].createElement("text", { x: RECT_W + 8, y: ROW_H - 1 }, displayLabel ? label.toString() : '')) ); }; //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9jb21wb25lbnRzL2NvbW1vbi9jb2xvci1sZWdlbmQuanMiXSwibmFtZXMiOlsiUk9XX0giLCJHQVAiLCJSRUNUX1ciLCJTdHlsZWRMZWdlbmQiLCJzdHlsZWQiLCJkaXYiLCJwcm9wcyIsInRoZW1lIiwic2lkZVBhbmVsU2Nyb2xsQmFyIiwidGV4dENvbG9yIiwiZGVmYXVsdEZvcm1hdCIsImQiLCJnZXRUaW1lTGFiZWxGb3JtYXQiLCJkb21haW4iLCJmb3JtYXR0ZXIiLCJ2YWwiLCJtb21lbnQiLCJ1dGMiLCJmb3JtYXQiLCJnZXROdW1lcmljTGFiZWxGb3JtYXQiLCJkaWZmIiwiZ2V0UXVhbnRMYWJlbEZvcm1hdCIsImZpZWxkVHlwZSIsIkFMTF9GSUVMRF9UWVBFUyIsInRpbWVzdGFtcCIsImdldE9yZGluYWxMZWdlbmRzIiwic2NhbGUiLCJkYXRhIiwibWFwIiwibGFiZWxzIiwiZ2V0UXVhbnRMZWdlbmRzIiwibGFiZWxGb3JtYXQiLCJyYW5nZSIsImludmVydCIsImludmVydEV4dGVudCIsIkNvbG9yTGVnZW5kIiwic2NhbGVUeXBlIiwiZG9tYWluU2VsZWN0b3IiLCJyYW5nZVNlbGVjdG9yIiwic2NhbGVUeXBlU2VsZWN0b3IiLCJsYWJlbEZvcm1hdFNlbGVjdG9yIiwiZmllbGRUeXBlU2VsZWN0b3IiLCJzY2FsZUZ1bmN0aW9uIiwiU0NBTEVfRlVOQyIsIlNDQUxFX1RZUEVTIiwib3JkaW5hbCIsImZvcm1hdExhYmVsIiwibGVnZW5kIiwiYXBpbGVnZW5kIiwibCIsIngxIiwidG9GaXhlZCIsIngyIiwid2lkdGgiLCJkaXNwbGF5TGFiZWwiLCJsZWdlbmRzIiwiQVBJTGVnZW5kU2VsZWN0b3IiLCJsZWdlbmRzU2VsZWN0b3IiLCJoZWlnaHQiLCJsZW5ndGgiLCJjb2xvciIsImlkeCIsIkNvbXBvbmVudCIsIlByb3BUeXBlcyIsIm51bWJlciIsImlzUmVxdWlyZWQiLCJzdHJpbmciLCJvbmVPZlR5cGUiLCJhcnJheSIsIm9i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M0MsTUFERixlQUVFO0FBQU0sTUFBQSxDQUFDLEVBQUUxRCxNQUFNLEdBQUcsQ0FBbEI7QUFBcUIsTUFBQSxDQUFDLEVBQUVGLEtBQUssR0FBRztBQUFoQyxPQUNHc0QsWUFBWSxHQUFHbUIsS0FBSyxDQUFDRSxRQUFOLEVBQUgsR0FBc0IsRUFEckMsQ0FGRjtBQURnQjtBQUFBLENBQWxCIiwic291cmNlc0NvbnRlbnQiOlsiLy8gQ29weXJpZ2h0IChjKSAyMDIzIFViZXIgVGVjaG5vbG9naWVzLCBJbmMuXG4vL1xuLy8gUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nIGEgY29weVxuLy8gb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGUgXCJTb2Z0d2FyZVwiKSwgdG8gZGVhbFxuLy8gaW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24gdGhlIHJpZ2h0c1xuLy8gdG8gdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLCBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLCBhbmQvb3Igc2VsbFxuLy8gY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvIHBlcm1pdCBwZXJzb25zIHRvIHdob20gdGhlIFNvZnR3YXJlIGlzXG4vLyBmdXJuaXNoZWQgdG8gZG8gc28sIHN1YmplY3QgdG8gdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOlxuLy9cbi8vIFRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIHNoYWxsIGJlIGluY2x1ZGVkIGluXG4vLyBhbGwgY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZSBTb2Z0d2FyZS5cbi8vXG4vLyBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgXCJBUyBJU1wiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBFWFBSRVNTIE9SXG4vLyBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSxcbi8vIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT05JTkZSSU5HRU1FTlQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRVxuLy8gQVVUSE9SUyBPUiBDT1BZUklHSFQgSE9MREVSUyBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSwgREFNQUdFUyBPUiBPVEhFUlxuLy8gTElBQklMSVRZLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUiBPVEhFUldJU0UsIEFSSVNJTkcgRlJPTSxcbi8vIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IgT1RIRVIgREVBTElOR1MgSU5cbi8vIFRIRSBTT0ZUV0FSRS5cblxuaW1wb3J0IFJlYWN0LCB7Q29tcG9uZW50fSBmcm9tICdyZWFjdCc7XG5pbXBvcnQgUHJvcFR5cGVzIGZyb20gJ3Byb3AtdHlwZXMnO1xuaW1wb3J0IHN0eWxlZCBmcm9tICdzdHlsZWQtY29tcG9uZW50cyc7XG5pbXBvcnQge2NyZWF0ZVNlbGVjdG9yfSBmcm9tICdyZXNlbGVjdCc7XG5pbXBvcnQge2Zvcm1hdH0gZnJvbSAnZDMtZm9ybWF0JztcbmltcG9ydCBtb21lbnQgZnJvbSAnbW9tZW50JztcbmltcG9ydCB7XG4gIFNDQUxFX1RZUEVTLFxuICBTQ0FMRV9GVU5DLFxuICBBTExfRklFTERfVFlQRVNcbn0gZnJvbSAnY29uc3RhbnRzL2RlZmF1bHQtc2V0dGluZ3MnO1xuaW1wb3J0IHtnZXRUaW1lV2lkZ2V0SGludEZvcm1hdHRlcn0gZnJvbSAndXRpbHMvZmlsdGVyLXV0aWxzJztcblxuY29uc3QgUk9XX0ggPSAxMDtcbmNvbnN0IEdBUCA9IDQ7XG5jb25zdCBSRUNUX1cgPSAyMDtcblxuY29uc3QgU3R5bGVkTGVnZW5kID0gc3R5bGVkLmRpdmBcbiAgJHtwcm9wcyA9PiBwcm9wcy50aGVtZS5zaWRlUGFuZWxTY3JvbGxCYXJ9O1xuXG4gIG1heC1oZWlnaHQ6IDE1MHB4O1xuICBvdmVyZmxvdy15OiBhdXRvO1xuXG4gIHN2ZyB7XG4gICAgdGV4dCB7XG4gICAgICBmb250LXNpemU6IDlweDtcbiAgICAgIGZpbGw6ICR7cHJvcHMgPT4gcHJvcHMudGhlbWUudGV4dENvbG9yfTtcbiAgICB9XG4gIH1cbmA7XG5cbmNvbnN0IGRlZmF1bHRGb3JtYXQgPSBkID0+IGQ7XG5cbmNvbnN0IGdldFRpbWVMYWJlbEZvcm1hdCA9IGRvbWFpbiA9PiB7XG4gIGNvbnN0IGZvcm1hdHRlciA9IGdldFRpbWVXaWRnZXRIaW50Rm9ybWF0dGVyKGRvbWFpbik7XG4gIHJldHVybiB2YWwgPT4gbW9tZW50LnV0Yyh2YWwpLmZvcm1hdChmb3JtYXR0ZXIpO1xufTtcblxuY29uc3QgZ2V0TnVtZXJpY0xhYmVsRm9ybWF0ID0gZG9tYWluID0+IHtcbiAgY29uc3QgZGlmZiA9IGRvbWFpblsxXSAtIGRvbWFpblswXTtcblxuICBpZiAoZGlmZiA8IDEwKSB7XG4gICAgcmV0dXJuIGZvcm1hdCgnLjJmJyk7XG4gIH1cblxuICByZXR1cm4gZm9ybWF0KCcuMWYnKTtcbn07XG5cbmNvbnN0IGdldFF1YW50TGFiZWxGb3JtYXQgPSAoZG9tYWluLCBmaWVsZFR5cGUpID0+IHtcbiAgLy8gcXVhbnQgc2NhbGUgY2FuIG9ubHkgYmUgYXNzaWduZWQgdG8gbGluZWFyIEZpZWxkczogcmVhbCwgdGltZXN0YW1wLCBpbnRlZ2VyXG4gIHJldHVybiBmaWVsZFR5cGUgPT09IEFMTF9GSUVMRF9UWVBFUy50aW1lc3RhbXBcbiAgICA/IGdldFRpbWVMYWJlbEZvcm1hdChkb21haW4pXG4gICAgOiAhZmllbGRUeXBlXG4gICAgPyBkZWZhdWx0Rm9ybWF0XG4gICAgOiBnZXROdW1lcmljTGFiZWxGb3JtYXQoZG9tYWluKTtcbn07XG5cbmNvbnN0IGdldE9yZGluYWxMZWdlbmRzID0gc2NhbGUgPT4ge1xuICBjb25zdCBkb21haW4gPSBzY2FsZS5kb21haW4oKTtcbiAgcmV0dXJuIHtcbiAgICBkYXRhOiBkb21haW4ubWFwKHNjYWxlKSxcbiAgICBsYWJlbHM6IGRvbWFpblxuICB9O1xufTtcblxuY29uc3QgZ2V0UXVhbnRMZWdlbmRzID0gKHNjYWxlLCBsYWJlbEZvcm1hdCkgPT4ge1xuICBjb25zdCBsYWJlbHMgPSBzY2FsZS5yYW5nZSgpLm1hcChkID0+IHtcbiAgICBjb25zdCBpbnZlcnQgPSBzY2FsZS5pbnZlcnRFeHRlbnQoZCk7XG4gICAgcmV0dXJuIGAke2xhYmVsRm9ybWF0KGludmVydFswXSl9IHRvICR7bGFiZWxGb3JtYXQoaW52ZXJ0WzFdKX1gO1xuICB9KTtcblxuICByZXR1cm4ge1xuICAgIGRhdGE6IHNjYWxlLnJhbmdlKCksXG4gICAgbGFiZWxzXG4gIH07XG59O1xuXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBDb2xvckxlZ2VuZCBleHRlbmRzIENvbXBvbmVudCB7XG4gIHN0YXRpYyBwcm9wVHlwZXMgPSB7XG4gICAgd2lkdGg6IFByb3BUeXBlcy5udW1iZXIuaXNSZXF1aXJlZCxcbiAgICBzY2FsZVR5cGU6IFByb3BUeXBlcy5zdHJpbmcsXG4gICAgZG9tYWluOiBQcm9wVHlwZXMub25lT2ZUeXBlKFtQcm9wVHlwZXMuYXJyYXksIFByb3BUeXBlcy5vYmplY3RdKSxcbiAgICBmaWVsZFR5cGU6IFByb3BUeXBlcy5zdHJpbmcsXG4gICAgcmFuZ2U6IFByb3BUeXBlcy5hcnJheU9mKFByb3BUeXBlcy5zdHJpbmcpLFxuICAgIGxhYmVsRm9ybWF0OiBQcm9wVHlwZXMuZnVuY1xuICB9O1xuXG4gIGRvbWFpblNlbGVjdG9yID0gcHJvcHMgPT4gcHJvcHMuZG9tYWluO1xuICByYW5nZVNlbGVjdG9yID0gcHJvcHMgPT4gcHJvcHMucmFuZ2U7XG4gIGxhYmVsRm9ybWF0U2VsZWN0b3IgPSBwcm9wcyA9PiBwcm9wcy5sYWJlbEZvcm1hdDtcbiAgc2NhbGVUeXBlU2VsZWN0b3IgPSBwcm9wcyA9PiBwcm9wcy5zY2FsZVR5cGU7XG4gIGZpZWxkVHlwZVNlbGVjdG9yID0gcHJvcHMgPT4gcHJvcHMuZmllbGRUeXBlO1xuXG4gIGxlZ2VuZHNTZWxlY3RvciA9IGNyZWF0ZVNlbGVjdG9yKFxuICAgIHRoaXMuZG9tYWluU2VsZWN0b3IsXG4gICAgdGhpcy5yYW5nZVNlbGVjdG9yLFxuICAgIHRoaXMuc2NhbGVUeXBlU2VsZWN0b3IsXG4gICAgdGhpcy5sYWJlbEZvcm1hdFNlbGVjdG9yLFxuICAgIHRoaXMuZmllbGRUeXBlU2VsZWN0b3IsXG4gICAgKGRvbWFpbiwgcmFuZ2UsIHNjYWxlVHlwZSwgbGFiZWxGb3JtYXQsIGZpZWxkVHlwZSkgPT4ge1xuICAgICAgY29uc3Qgc2NhbGVGdW5jdGlvbiA9IFNDQUxFX0ZVTkNbc2NhbGVUeXBlXTtcbiAgICAgIC8vIGNvbG9yIHNjYWxlIGNhbiBvbmx5IGJlIHF1YW50aXplLCBxdWFudGlsZSBvciBvcmRpbmFsXG4gICAgICBjb25zdCBzY2FsZSA9IHNjYWxlRnVuY3Rpb24oKVxuICAgICAgICAuZG9tYWluKGRvbWFpbilcbiAgICAgICAgLnJhbmdlKHJhbmdlKTtcblxuICAgICAgaWYgKHNjYWxlVHlwZSA9PT0gU0NBTEVfVFlQRVMub3JkaW5hbCkge1xuICAgICAgICByZXR1cm4gZ2V0T3JkaW5hbExlZ2VuZHMoc2NhbGUpO1xuICAgICAgfVxuXG4gICAgICBjb25zdCBmb3JtYXRMYWJlbCA9XG4gICAgICAgIGxhYmVsRm9ybWF0IHx8IGdldFF1YW50TGFiZWxGb3JtYXQoc2NhbGUuZG9tYWluKCksIGZpZWxkVHlwZSk7XG5cbiAgICAgIHJldHVybiBnZXRRdWFudExlZ2VuZHMoc2NhbGUsIGZvcm1hdExhYmVsKTtcbiAgICB9XG4gICk7XG5cbiAgYXBpbGVnZW5kID0gcHJvcHMgPT4gcHJvcHMubGVnZW5kO1xuICBBUElMZWdlbmRTZWxlY3RvciA9IGNyZWF0ZVNlbGVjdG9yKFxuICAgIHRoaXMuYXBpbGVnZW5kLFxuICAgIHRoaXMucmFuZ2VTZWxlY3RvcixcbiAgICAobGVnZW5kLCByYW5nZSkgPT4ge1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgZGF0YTogcmFuZ2UsXG4gICAgICAgIGxhYmVsczogbGVnZW5kLm1hcChsID0+IGAke2wueDEudG9GaXhlZCgyKSAgfSB0byAkeyAgbC54Mi50b0ZpeGVkKDIpfWApXG4gICAgICB9O1xuICAgIH1cbiAgKTtcblxuICByZW5kZXIoKSB7XG4gICAgY29uc3Qge1xuICAgICAgd2lkdGgsXG4gICAgICBzY2FsZVR5cGUsXG4gICAgICBkb21haW4sXG4gICAgICByYW5nZSxcbiAgICAgIGxlZ2VuZCxcbiAgICAgIGRpc3BsYXlMYWJlbCA9IHRydWVcbiAgICB9ID0gdGhpcy5wcm9wcztcblxuICAgIGlmICghZG9tYWluIHx8ICFyYW5nZSB8fCAhc2NhbGVUeXBlKSB7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG5cbiAgICBjb25zdCBsZWdlbmRzID0gbGVnZW5kXG4gICAgICA/IHRoaXMuQVBJTGVnZW5kU2VsZWN0b3IodGhpcy5wcm9wcylcbiAgICAgIDogdGhpcy5sZWdlbmRzU2VsZWN0b3IodGhpcy5wcm9wcyk7XG4gICAgY29uc3QgaGVpZ2h0ID0gbGVnZW5kcy5kYXRhLmxlbmd0aCAqIChST1dfSCArIEdBUCk7XG5cbiAgICByZXR1cm4gKFxuICAgICAgPFN0eWxlZExlZ2VuZD5cbiAgICAgICAgPHN2ZyB3aWR0aD17d2lkdGggLSAyNH0gaGVpZ2h0PXtoZWlnaHR9PlxuICAgICAgICAgIHtsZWdlbmRzLmRhdGEubWFwKChjb2xvciwgaWR4KSA9PiAoXG4gICAgICAgICAgICA8TGVnZW5kUm93XG4gICAgICAgICAgICAgIGtleT17aWR4fVxuICAgICAgICAgICAgICBsYWJlbD17bGVnZW5kcy5sYWJlbHNbaWR4XX1cbiAgICAgICAgICAgICAgZGlzcGxheUxhYmVsPXtkaXNwbGF5TGFiZWx9XG4gICAgICAgICAgICAgIGNvbG9yPXtjb2xvcn1cbiAgICAgICAgICAgICAgaWR4PXtpZHh9XG4gICAgICAgICAgICAvPlxuICAgICAgICAgICkpfVxuICAgICAgICA8L3N2Zz5cbiAgICAgIDwvU3R5bGVkTGVnZW5kPlxuICAgICk7XG4gIH1cbn1cblxuY29uc3QgTGVnZW5kUm93ID0gKHtsYWJlbCA9ICcnLCBkaXNwbGF5TGFiZWwsIGNvbG9yLCBpZHh9KSA9PiAoXG4gIDxnIHRyYW5zZm9ybT17YHRyYW5zbGF0ZSgwLCAke2lkeCAqIChST1dfSCArIEdBUCl9KWB9PlxuICAgIDxyZWN0IHdpZHRoPXtSRUNUX1d9IGhlaWdodD17Uk9XX0h9IHN0eWxlPXt7ZmlsbDogY29sb3J9fSAvPlxuICAgIDx0ZXh0IHg9e1JFQ1RfVyArIDh9IHk9e1JPV19IIC0gMX0+XG4gICAgICB7ZGlzcGxheUxhYmVsID8gbGFiZWwudG9TdHJpbmcoKSA6ICcnfVxuICAgIDwvdGV4dD5cbiAgPC9nPlxuKTtcbiJdfQ==