kepler.gl
Version:
kepler.gl is a webgl based application to visualize large scale location data in the browser
209 lines (208 loc) • 34.7 kB
JavaScript
"use strict";
var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
var _typeof = require("@babel/runtime/helpers/typeof");
Object.defineProperty(exports, "__esModule", {
value: true
});
exports["default"] = void 0;
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 _getPrototypeOf2 = _interopRequireDefault(require("@babel/runtime/helpers/getPrototypeOf"));
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 _classnames = _interopRequireDefault(require("classnames"));
var _styledComponents = _interopRequireDefault(require("styled-components"));
var _sliderHandle = _interopRequireDefault(require("./slider-handle"));
var _sliderBarHandle = _interopRequireDefault(require("./slider-bar-handle"));
var _utils = require("@kepler.gl/utils");
var _templateObject, _templateObject2; // SPDX-License-Identifier: MIT
// Copyright contributors to the kepler.gl project
function _getRequireWildcardCache(e) { if ("function" != typeof WeakMap) return null; var r = new WeakMap(), t = new WeakMap(); return (_getRequireWildcardCache = function _getRequireWildcardCache(e) { return e ? t : r; })(e); }
function _interopRequireWildcard(e, r) { if (!r && e && e.__esModule) return e; if (null === e || "object" != _typeof(e) && "function" != typeof e) return { "default": e }; var t = _getRequireWildcardCache(r); if (t && t.has(e)) return t.get(e); var n = { __proto__: null }, a = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var u in e) if ("default" !== u && {}.hasOwnProperty.call(e, u)) { var i = a ? Object.getOwnPropertyDescriptor(e, u) : null; i && (i.get || i.set) ? Object.defineProperty(n, u, i) : n[u] = e[u]; } return n["default"] = e, t && t.set(e, n), n; }
function ownKeys(e, r) { var t = Object.keys(e); if (Object.getOwnPropertySymbols) { var o = Object.getOwnPropertySymbols(e); r && (o = o.filter(function (r) { return Object.getOwnPropertyDescriptor(e, r).enumerable; })), t.push.apply(t, o); } return t; }
function _objectSpread(e) { for (var r = 1; r < arguments.length; r++) { var t = null != arguments[r] ? arguments[r] : {}; r % 2 ? ownKeys(Object(t), !0).forEach(function (r) { (0, _defineProperty2["default"])(e, r, t[r]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(e, Object.getOwnPropertyDescriptors(t)) : ownKeys(Object(t)).forEach(function (r) { Object.defineProperty(e, r, Object.getOwnPropertyDescriptor(t, r)); }); } return e; }
function _callSuper(t, o, e) { return o = (0, _getPrototypeOf2["default"])(o), (0, _possibleConstructorReturn2["default"])(t, _isNativeReflectConstruct() ? Reflect.construct(o, e || [], (0, _getPrototypeOf2["default"])(t).constructor) : o.apply(t, e)); }
function _isNativeReflectConstruct() { try { var t = !Boolean.prototype.valueOf.call(Reflect.construct(Boolean, [], function () {})); } catch (t) {} return (_isNativeReflectConstruct = function _isNativeReflectConstruct() { return !!t; })(); }
function noop() {
return;
}
var StyledRangeSlider = _styledComponents["default"].div(_templateObject || (_templateObject = (0, _taggedTemplateLiteral2["default"])(["\n position: relative;\n background-color: ", ";\n ", ";\n ", ";\n"])), function (props) {
return props.theme.sliderBarBgd;
}, function (props) {
return "".concat(props.vertical ? 'width' : 'height', ": ").concat(props.theme.sliderBarHeight, "px");
}, function (props) {
return "".concat(props.vertical ? 'height' : 'width', ": 100%");
});
var SliderWrapper = _styledComponents["default"].div(_templateObject2 || (_templateObject2 = (0, _taggedTemplateLiteral2["default"])(["\n flex-grow: 1;\n"])));
var Slider = exports["default"] = /*#__PURE__*/function (_Component) {
function Slider(props) {
var _this;
(0, _classCallCheck2["default"])(this, Slider);
_this = _callSuper(this, Slider, [props]);
(0, _defineProperty2["default"])(_this, "anchor", 0);
(0, _defineProperty2["default"])(_this, "ref", /*#__PURE__*/(0, _react.createRef)());
(0, _defineProperty2["default"])(_this, "track", /*#__PURE__*/(0, _react.createRef)());
(0, _defineProperty2["default"])(_this, "setAnchor", function (x) {
// used to calculate delta
_this.anchor = x;
});
(0, _defineProperty2["default"])(_this, "slide0Listener", function (x) {
var _this$props = _this.props,
value1 = _this$props.value1,
minValue = _this$props.minValue;
var val = _this.getValue(minValue, x);
_this.props.onSlider0Change((0, _utils.clamp)([minValue, value1], val));
});
(0, _defineProperty2["default"])(_this, "slide1Listener", function (x) {
var _this$props2 = _this.props,
minValue = _this$props2.minValue,
maxValue = _this$props2.maxValue,
value0 = _this$props2.value0;
var val = _this.getValue(minValue, x);
_this.props.onSlider1Change((0, _utils.clamp)([value0, maxValue], val));
});
(0, _defineProperty2["default"])(_this, "sliderBarListener", function (x) {
var _this$props3 = _this.props,
value0 = _this$props3.value0,
value1 = _this$props3.value1,
minValue = _this$props3.minValue,
maxValue = _this$props3.maxValue;
// for slider bar, we use distance delta
var anchor = _this.anchor;
var length = value1 - value0; // the length of the selected range shouldn't change when clamping
var val0 = (0, _utils.clamp)([minValue, maxValue - length], _this.getValue(value0, x - anchor));
var val1 = (0, _utils.clamp)([val0 + length, maxValue], _this.getValue(value1, x - anchor));
var deltaX = _this.getDeltaX(val0 - _this.props.value0);
_this.props.onSliderBarChange(val0, val1);
// update anchor
_this.anchor = _this.anchor + deltaX;
});
(0, _defineProperty2["default"])(_this, "calcHandleLeft0", function (w, l) {
return w === 0 ? "calc(".concat(l, "% - ").concat(_this.props.sliderHandleWidth / 2, "px)") : "calc(".concat(l, "% - ").concat(_this.props.sliderHandleWidth / 2, "px)");
});
(0, _defineProperty2["default"])(_this, "calcHandleLeft1", function (w, l) {
return _this.props.isRanged && w === 0 ? "".concat(l, "%") : "calc(".concat(l + w, "% - ").concat(_this.props.sliderHandleWidth / 2, "px)");
});
_this.props = props;
return _this;
}
(0, _inherits2["default"])(Slider, _Component);
return (0, _createClass2["default"])(Slider, [{
key: "getBaseDistance",
value: function getBaseDistance() {
if (!this.ref.current) {
return 0;
}
return this.props.vertical ? this.ref.current.offsetHeight : this.ref.current.offsetWidth;
}
}, {
key: "getDeltaVal",
value: function getDeltaVal(x) {
var percent = x / this.getBaseDistance();
var maxDelta = this.props.maxValue - this.props.minValue;
return percent * maxDelta;
}
}, {
key: "getDeltaX",
value: function getDeltaX(v) {
var percent = v / (this.props.maxValue - this.props.minValue);
var maxDelta = this.getBaseDistance();
return percent * maxDelta;
}
}, {
key: "getValue",
value: function getValue(baseV, offset) {
// offset is the distance between slider handle and track left
var rawValue = baseV + this.getDeltaVal(offset);
return this.normalizeValue(rawValue);
}
}, {
key: "normalizeValue",
value: function normalizeValue(val) {
var _this$props4 = this.props,
minValue = _this$props4.minValue,
step = _this$props4.step,
marks = _this$props4.marks;
return (0, _utils.normalizeSliderValue)(val, minValue, step, marks);
}
}, {
key: "render",
value: function render() {
var _this$props5 = this.props,
className = _this$props5.className,
classSet = _this$props5.classSet,
disabled = _this$props5.disabled,
isRanged = _this$props5.isRanged,
maxValue = _this$props5.maxValue,
minValue = _this$props5.minValue,
value1 = _this$props5.value1,
vertical = _this$props5.vertical,
sliderHandleWidth = _this$props5.sliderHandleWidth,
showTooltip = _this$props5.showTooltip,
style = _this$props5.style;
var value0 = !isRanged && minValue > 0 ? minValue : this.props.value0;
var currValDelta = value1 - value0;
var maxDelta = maxValue - minValue;
var width = currValDelta / maxDelta * 100;
var v0Left = (value0 - minValue) / maxDelta * 100;
return /*#__PURE__*/_react["default"].createElement(SliderWrapper, {
className: (0, _classnames["default"])('kg-slider', _objectSpread(_objectSpread({}, classSet), {}, {
disabled: disabled
}), className),
ref: this.ref,
isRanged: isRanged,
vertical: vertical,
style: style
}, /*#__PURE__*/_react["default"].createElement(StyledRangeSlider, {
className: "kg-range-slider",
vertical: vertical,
ref: this.track
}, /*#__PURE__*/_react["default"].createElement(_sliderHandle["default"], {
left: this.calcHandleLeft0(width, v0Left),
valueListener: this.slide0Listener,
sliderHandleWidth: sliderHandleWidth,
display: isRanged,
vertical: vertical,
showTooltip: showTooltip,
track: this.track
}), /*#__PURE__*/_react["default"].createElement(_sliderHandle["default"], {
left: this.calcHandleLeft1(width, v0Left),
valueListener: this.slide1Listener,
sliderHandleWidth: sliderHandleWidth,
vertical: vertical,
value: value1,
showTooltip: showTooltip,
track: this.track
}), /*#__PURE__*/_react["default"].createElement(_sliderBarHandle["default"], {
width: width,
v0Left: v0Left,
enableBarDrag: this.props.enableBarDrag,
sliderBarListener: this.sliderBarListener,
vertical: vertical,
track: this.track,
setAnchor: this.setAnchor
})));
}
}]);
}(_react.Component);
(0, _defineProperty2["default"])(Slider, "defaultProps", {
title: '',
isRanged: true,
value0: 0,
value1: 100,
minValue: 0,
maxValue: 100,
step: 1,
sliderHandleWidth: 12,
enableBarDrag: false,
onSlider0Change: noop,
onSlider1Change: noop,
onSliderBarChange: noop,
disabled: false,
vertical: false,
showTooltip: false
});
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJfcmVhY3QiLCJfaW50ZXJvcFJlcXVpcmVXaWxkY2FyZCIsInJlcXVpcmUiLCJfY2xhc3NuYW1lcyIsIl9pbnRlcm9wUmVxdWlyZURlZmF1bHQiLCJfc3R5bGVkQ29tcG9uZW50cyIsIl9zbGlkZXJIYW5kbGUiLCJfc2xpZGVyQmFySGFuZGxlIiwiX3V0aWxzIiwiX3RlbXBsYXRlT2JqZWN0IiwiX3RlbXBsYXRlT2JqZWN0MiIsIl9nZXRSZXF1aXJlV2lsZGNhcmRDYWNoZSIsImUiLCJXZWFrTWFwIiwiciIsInQiLCJfX2VzTW9kdWxlIiwiX3R5cGVvZiIsImhhcyIsImdldCIsIm4iLCJfX3Byb3RvX18iLCJhIiwiT2JqZWN0IiwiZGVmaW5lUHJvcGVydHkiLCJnZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IiLCJ1IiwiaGFzT3duUHJvcGVydHkiLCJjYWxsIiwiaSIsInNldCIsIm93bktleXMiLCJrZXlzIiwiZ2V0T3duUHJvcGVydHlTeW1ib2xzIiwibyIsImZpbHRlciIsImVudW1lcmFibGUiLCJwdXNoIiwiYXBwbHkiLCJfb2JqZWN0U3ByZWFkIiwiYXJndW1lbnRzIiwibGVuZ3RoIiwiZm9yRWFjaCIsIl9kZWZpbmVQcm9wZXJ0eTIiLCJnZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3JzIiwiZGVmaW5lUHJvcGVydGllcyIsIl9jYWxsU3VwZXIiLCJfZ2V0UHJvdG90eXBlT2YyIiwiX3Bvc3NpYmxlQ29uc3RydWN0b3JSZXR1cm4yIiwiX2lzTmF0aXZlUmVmbGVjdENvbnN0cnVjdCIsIlJlZmxlY3QiLCJjb25zdHJ1Y3QiLCJjb25zdHJ1Y3RvciIsIkJvb2xlYW4iLCJwcm90b3R5cGUiLCJ2YWx1ZU9mIiwibm9vcCIsIlN0eWxlZFJhbmdlU2xpZGVyIiwic3R5bGVkIiwiZGl2IiwiX3RhZ2dlZFRlbXBsYXRlTGl0ZXJhbDIiLCJwcm9wcyIsInRoZW1lIiwic2xpZGVyQmFyQmdkIiwiY29uY2F0IiwidmVydGljYWwiLCJzbGlkZXJCYXJIZWlnaHQiLCJTbGlkZXJXcmFwcGVyIiwiU2xpZGVyIiwiZXhwb3J0cyIsIl9Db21wb25lbnQiLCJfdGhpcyIsIl9jbGFzc0NhbGxDaGVjazIiLCJjcmVhdGVSZWYiLCJ4IiwiYW5jaG9yIiwiX3RoaXMkcHJvcHMiLCJ2YWx1ZTEiLCJtaW5WYWx1ZSIsInZhbCIsImdldFZhbHVlIiwib25TbGlkZXIwQ2hhbmdlIiwiY2xhbXAiLCJfdGhpcyRwcm9wczIiLCJtYXhWYWx1ZSIsInZhbHVlMCIsIm9uU2xpZGVyMUNoYW5nZSIsIl90aGlzJHByb3BzMyIsInZhbDAiLCJ2YWwxIiwiZGVsdGFYIiwiZ2V0RGVsdGFYIiwib25TbGlkZXJCYXJDaGFuZ2UiLCJ3IiwibCIsInNsaWRlckhhbmRsZVdpZHRoIiwiaXNSYW5nZWQiLCJfaW5oZXJpdHMyIiwiX2NyZWF0ZUNsYXNzMiIsImtleSIsInZhbHVlIiwiZ2V0QmFzZURpc3RhbmNlIiwicmVmIiwiY3VycmVudCIsIm9mZnNldEhlaWdodCIsIm9mZnNldFdpZHRoIiwiZ2V0RGVsdGFWYWwiLCJwZXJjZW50IiwibWF4RGVsdGEiLCJ2IiwiYmFzZVYiLCJvZmZzZXQiLCJyYXdWYWx1ZSIsIm5vcm1hbGl6ZVZhbHVlIiwiX3RoaXMkcHJvcHM0Iiwic3RlcCIsIm1hcmtzIiwibm9ybWFsaXplU2xpZGVyVmFsdWUiLCJyZW5kZXIiLCJfdGhpcyRwcm9wczUiLCJjbGFzc05hbWUiLCJjbGFzc1NldCIsImRpc2FibGVkIiwic2hvd1Rvb2x0aXAiLCJzdHlsZSIsImN1cnJWYWxEZWx0YSIsIndpZHRoIiwidjBMZWZ0IiwiY3JlYXRlRWxlbWVudCIsImNsYXNzbmFtZXMiLCJ0cmFjayIsImxlZnQiLCJjYWxjSGFuZGxlTGVmdDAiLCJ2YWx1ZUxpc3RlbmVyIiwic2xpZGUwTGlzdGVuZXIiLCJkaXNwbGF5IiwiY2FsY0hhbmRsZUxlZnQxIiwic2xpZGUxTGlzdGVuZXIiLCJlbmFibGVCYXJEcmFnIiwic2xpZGVyQmFyTGlzdGVuZXIiLCJzZXRBbmNob3IiLCJDb21wb25lbnQiLCJ0aXRsZSJdLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9jb21tb24vc2xpZGVyL3NsaWRlci50c3giXSwic291cmNlc0NvbnRlbnQiOlsiLy8gU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IE1JVFxuLy8gQ29weXJpZ2h0IGNvbnRyaWJ1dG9ycyB0byB0aGUga2VwbGVyLmdsIHByb2plY3RcblxuaW1wb3J0IFJlYWN0LCB7Q29tcG9uZW50LCBjcmVhdGVSZWYsIFJlZk9iamVjdH0gZnJvbSAncmVhY3QnO1xuaW1wb3J0IGNsYXNzbmFtZXMgZnJvbSAnY2xhc3NuYW1lcyc7XG5pbXBvcnQgc3R5bGVkIGZyb20gJ3N0eWxlZC1jb21wb25lbnRzJztcblxuaW1wb3J0IFNsaWRlckhhbmRsZSBmcm9tICcuL3NsaWRlci1oYW5kbGUnO1xuaW1wb3J0IFNsaWRlckJhckhhbmRsZSBmcm9tICcuL3NsaWRlci1iYXItaGFuZGxlJztcbmltcG9ydCB7bm9ybWFsaXplU2xpZGVyVmFsdWUsIGNsYW1wfSBmcm9tICdAa2VwbGVyLmdsL3V0aWxzJztcblxuZnVuY3Rpb24gbm9vcCgpIHtcbiAgcmV0dXJuO1xufVxuXG5pbnRlcmZhY2UgU3R5bGVkUmFuZ2VTbGlkZXJQcm9wcyB7XG4gIHZlcnRpY2FsPzogYm9vbGVhbjtcbn1cblxuY29uc3QgU3R5bGVkUmFuZ2VTbGlkZXIgPSBzdHlsZWQuZGl2PFN0eWxlZFJhbmdlU2xpZGVyUHJvcHM+YFxuICBwb3NpdGlvbjogcmVsYXRpdmU7XG4gIGJhY2tncm91bmQtY29sb3I6ICR7cHJvcHMgPT4gcHJvcHMudGhlbWUuc2xpZGVyQmFyQmdkfTtcbiAgJHtwcm9wcyA9PiBgJHtwcm9wcy52ZXJ0aWNhbCA/ICd3aWR0aCcgOiAnaGVpZ2h0J306ICR7cHJvcHMudGhlbWUuc2xpZGVyQmFySGVpZ2h0fXB4YH07XG4gICR7cHJvcHMgPT4gYCR7cHJvcHMudmVydGljYWwgPyAnaGVpZ2h0JyA6ICd3aWR0aCd9OiAxMDAlYH07XG5gO1xuXG5leHBvcnQgdHlwZSBTdHlsZVJhbmdlU2xpZGVyVHlwZSA9IHR5cGVvZiBTdHlsZWRSYW5nZVNsaWRlciAmIEhUTUxEaXZFbGVtZW50O1xuXG5pbnRlcmZhY2UgU2xpZGVyV3JhcHBlclByb3BzIHtcbiAgaXNSYW5nZWQ/OiBib29sZWFuO1xuICB2ZXJ0aWNhbD86IGJvb2xlYW47XG59XG5cbmNvbnN0IFNsaWRlcldyYXBwZXIgPSBzdHlsZWQuZGl2PFNsaWRlcldyYXBwZXJQcm9wcz5gXG4gIGZsZXgtZ3JvdzogMTtcbmA7XG5cbnR5cGUgU2xpZGVyUHJvcHMgPSB7XG4gIHRpdGxlOiBzdHJpbmc7XG4gIGlzUmFuZ2VkOiBib29sZWFuO1xuICB2YWx1ZTA6IG51bWJlcjtcbiAgdmFsdWUxOiBudW1iZXI7XG4gIG1pblZhbHVlOiBudW1iZXI7XG4gIG1heFZhbHVlOiBudW1iZXI7XG4gIHNsaWRlckhhbmRsZVdpZHRoOiBudW1iZXI7XG4gIG9uU2xpZGVyMENoYW5nZTogKHZhbDogbnVtYmVyKSA9PiBhbnk7XG4gIG9uU2xpZGVyMUNoYW5nZTogKHZhbDogbnVtYmVyKSA9PiBhbnk7XG4gIG9uU2xpZGVyQmFyQ2hhbmdlOiAodmFsMDogbnVtYmVyLCB2YWwxOiBudW1iZXIpID0+IHZvaWQ7XG4gIHN0ZXA6IG51bWJlcjtcbiAgZW5hYmxlQmFyRHJhZzogYm9vbGVhbjtcbiAgc2hvd1Rvb2x0aXA6IGJvb2xlYW47XG4gIHZlcnRpY2FsOiBib29sZWFuO1xuICBtYXJrcz86IG51bWJlcltdIHwgbnVsbDtcbiAgY2xhc3NTZXQ/OiB7W2tleTogc3RyaW5nXTogYm9vbGVhbn07XG4gIGRpc2FibGVkOiBib29sZWFuO1xuICBjbGFzc05hbWU/OiBzdHJpbmc7XG4gIHN0eWxlPzogb2JqZWN0O1xufTtcblxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgU2xpZGVyIGV4dGVuZHMgQ29tcG9uZW50PFNsaWRlclByb3BzPiB7XG4gIHN0YXRpYyBkZWZhdWx0UHJvcHMgPSB7XG4gICAgdGl0bGU6ICcnLFxuICAgIGlzUmFuZ2VkOiB0cnVlLFxuICAgIHZhbHVlMDogMCxcbiAgICB2YWx1ZTE6IDEwMCxcbiAgICBtaW5WYWx1ZTogMCxcbiAgICBtYXhWYWx1ZTogMTAwLFxuICAgIHN0ZXA6IDEsXG4gICAgc2xpZGVySGFuZGxlV2lkdGg6IDEyLFxuICAgIGVuYWJsZUJhckRyYWc6IGZhbHNlLFxuICAgIG9uU2xpZGVyMENoYW5nZTogbm9vcCxcbiAgICBvblNsaWRlcjFDaGFuZ2U6IG5vb3AsXG4gICAgb25TbGlkZXJCYXJDaGFuZ2U6IG5vb3AsXG4gICAgZGlzYWJsZWQ6IGZhbHNlLFxuICAgIHZlcnRpY2FsOiBmYWxzZSxcbiAgICBzaG93VG9vbHRpcDogZmFsc2VcbiAgfTtcblxuICBwcml2YXRlIGFuY2hvciA9IDA7XG5cbiAgcHVibGljIHJlZjogUmVmT2JqZWN0PHR5cGVvZiBTbGlkZXJXcmFwcGVyICYgSFRNTERpdkVsZW1lbnQ+ID0gY3JlYXRlUmVmPFxuICAgIHR5cGVvZiBTbGlkZXJXcmFwcGVyICYgSFRNTERpdkVsZW1lbnRcbiAgPigpO1xuICBwdWJsaWMgdHJhY2s6IFJlZk9iamVjdDxTdHlsZVJhbmdlU2xpZGVyVHlwZT4gPSBjcmVhdGVSZWY8U3R5bGVSYW5nZVNsaWRlclR5cGU+KCk7XG5cbiAgY29uc3RydWN0b3IocHVibGljIHByb3BzOiBTbGlkZXJQcm9wcykge1xuICAgIHN1cGVyKHByb3BzKTtcbiAgfVxuXG4gIHByaXZhdGUgc2V0QW5jaG9yID0gKHg6IG51bWJlcikgPT4ge1xuICAgIC8vIHVzZWQgdG8gY2FsY3VsYXRlIGRlbHRhXG4gICAgdGhpcy5hbmNob3IgPSB4O1xuICB9O1xuXG4gIHByaXZhdGUgZ2V0QmFzZURpc3RhbmNlKCkge1xuICAgIGlmICghdGhpcy5yZWYuY3VycmVudCkge1xuICAgICAgcmV0dXJuIDA7XG4gICAgfVxuICAgIHJldHVybiB0aGlzLnByb3BzLnZlcnRpY2FsID8gdGhpcy5yZWYuY3VycmVudC5vZmZzZXRIZWlnaHQgOiB0aGlzLnJlZi5jdXJyZW50Lm9mZnNldFdpZHRoO1xuICB9XG5cbiAgcHJpdmF0ZSBnZXREZWx0YVZhbCh4OiBudW1iZXIpIHtcbiAgICBjb25zdCBwZXJjZW50ID0geCAvIHRoaXMuZ2V0QmFzZURpc3RhbmNlKCk7XG4gICAgY29uc3QgbWF4RGVsdGEgPSB0aGlzLnByb3BzLm1heFZhbHVlIC0gdGhpcy5wcm9wcy5taW5WYWx1ZTtcbiAgICByZXR1cm4gcGVyY2VudCAqIG1heERlbHRhO1xuICB9XG4gIHByaXZhdGUgZ2V0RGVsdGFYKHY6IG51bWJlcikge1xuICAgIGNvbnN0IHBlcmNlbnQgPSB2IC8gKHRoaXMucHJvcHMubWF4VmFsdWUgLSB0aGlzLnByb3BzLm1pblZhbHVlKTtcbiAgICBjb25zdCBtYXhEZWx0YSA9IHRoaXMuZ2V0QmFzZURpc3RhbmNlKCk7XG4gICAgcmV0dXJuIHBlcmNlbnQgKiBtYXhEZWx0YTtcbiAgfVxuXG4gIHByaXZhdGUgZ2V0VmFsdWUoYmFzZVY6IG51bWJlciwgb2Zmc2V0OiBudW1iZXIpIHtcbiAgICAvLyBvZmZzZXQgaXMgdGhlIGRpc3RhbmNlIGJldHdlZW4gc2xpZGVyIGhhbmRsZSBhbmQgdHJhY2sgbGVmdFxuICAgIGNvbnN0IHJhd1ZhbHVlID0gYmFzZVYgKyB0aGlzLmdldERlbHRhVmFsKG9mZnNldCk7XG5cbiAgICByZXR1cm4gdGhpcy5ub3JtYWxpemVWYWx1ZShyYXdWYWx1ZSk7XG4gIH1cblxuICBwcml2YXRlIG5vcm1hbGl6ZVZhbHVlKHZhbDogbnVtYmVyKSB7XG4gICAgY29uc3Qge21pblZhbHVlLCBzdGVwLCBtYXJrc30gPSB0aGlzLnByb3BzO1xuICAgIHJldHVybiBub3JtYWxpemVTbGlkZXJWYWx1ZSh2YWwsIG1pblZhbHVlLCBzdGVwLCBtYXJrcyk7XG4gIH1cblxuICBzbGlkZTBMaXN0ZW5lciA9ICh4OiBudW1iZXIpID0+IHtcbiAgICBjb25zdCB7dmFsdWUxLCBtaW5WYWx1ZX0gPSB0aGlzLnByb3BzO1xuICAgIGNvbnN0IHZhbCA9IHRoaXMuZ2V0VmFsdWUobWluVmFsdWUsIHgpO1xuICAgIHRoaXMucHJvcHMub25TbGlkZXIwQ2hhbmdlKGNsYW1wKFttaW5WYWx1ZSwgdmFsdWUxXSwgdmFsKSk7XG4gIH07XG5cbiAgc2xpZGUxTGlzdGVuZXIgPSAoeDogbnVtYmVyKSA9PiB7XG4gICAgY29uc3Qge21pblZhbHVlLCBtYXhWYWx1ZSwgdmFsdWUwfSA9IHRoaXMucHJvcHM7XG4gICAgY29uc3QgdmFsID0gdGhpcy5nZXRWYWx1ZShtaW5WYWx1ZSwgeCk7XG4gICAgdGhpcy5wcm9wcy5vblNsaWRlcjFDaGFuZ2UoY2xhbXAoW3ZhbHVlMCwgbWF4VmFsdWVdLCB2YWwpKTtcbiAgfTtcblxuICBzbGlkZXJCYXJMaXN0ZW5lciA9ICh4OiBudW1iZXIpID0+IHtcbiAgICBjb25zdCB7dmFsdWUwLCB2YWx1ZTEsIG1pblZhbHVlLCBtYXhWYWx1ZX0gPSB0aGlzLnByb3BzO1xuICAgIC8vIGZvciBzbGlkZXIgYmFyLCB3ZSB1c2UgZGlzdGFuY2UgZGVsdGFcbiAgICBjb25zdCBhbmNob3IgPSB0aGlzLmFuY2hvcjtcbiAgICBjb25zdCBsZW5ndGggPSB2YWx1ZTEgLSB2YWx1ZTA7IC8vIHRoZSBsZW5ndGggb2YgdGhlIHNlbGVjdGVkIHJhbmdlIHNob3VsZG4ndCBjaGFuZ2Ugd2hlbiBjbGFtcGluZ1xuICAgIGNvbnN0IHZhbDAgPSBjbGFtcChbbWluVmFsdWUsIG1heFZhbHVlIC0gbGVuZ3RoXSwgdGhpcy5nZXRWYWx1ZSh2YWx1ZTAsIHggLSBhbmNob3IpKTtcbiAgICBjb25zdCB2YWwxID0gY2xhbXAoW3ZhbDAgKyBsZW5ndGgsIG1heFZhbHVlXSwgdGhpcy5nZXRWYWx1ZSh2YWx1ZTEsIHggLSBhbmNob3IpKTtcblxuICAgIGNvbnN0IGRlbHRhWCA9IHRoaXMuZ2V0RGVsdGFYKHZhbDAgLSB0aGlzLnByb3BzLnZhbHVlMCk7XG4gICAgdGhpcy5wcm9wcy5vblNsaWRlckJhckNoYW5nZSh2YWwwLCB2YWwxKTtcbiAgICAvLyB1cGRhdGUgYW5jaG9yXG4gICAgdGhpcy5hbmNob3IgPSB0aGlzLmFuY2hvciArIGRlbHRhWDtcbiAgfTtcblxuICBjYWxjSGFuZGxlTGVmdDAgPSAodzogbnVtYmVyLCBsOiBudW1iZXIpID0+IHtcbiAgICByZXR1cm4gdyA9PT0gMFxuICAgICAgPyBgY2FsYygke2x9JSAtICR7dGhpcy5wcm9wcy5zbGlkZXJIYW5kbGVXaWR0aCAvIDJ9cHgpYFxuICAgICAgOiBgY2FsYygke2x9JSAtICR7dGhpcy5wcm9wcy5zbGlkZXJIYW5kbGVXaWR0aCAvIDJ9cHgpYDtcbiAgfTtcblxuICBjYWxjSGFuZGxlTGVmdDEgPSAodzogbnVtYmVyLCBsOiBudW1iZXIpID0+IHtcbiAgICByZXR1cm4gdGhpcy5wcm9wcy5pc1JhbmdlZCAmJiB3ID09PSAwXG4gICAgICA/IGAke2x9JWBcbiAgICAgIDogYGNhbGMoJHtsICsgd30lIC0gJHt0aGlzLnByb3BzLnNsaWRlckhhbmRsZVdpZHRoIC8gMn1weClgO1xuICB9O1xuXG4gIHJlbmRlcigpIHtcbiAgICBjb25zdCB7XG4gICAgICBjbGFzc05hbWUsXG4gICAgICBjbGFzc1NldCxcbiAgICAgIGRpc2FibGVkLFxuICAgICAgaXNSYW5nZWQsXG4gICAgICBtYXhWYWx1ZSxcbiAgICAgIG1pblZhbHVlLFxuICAgICAgdmFsdWUxLFxuICAgICAgdmVydGljYWwsXG4gICAgICBzbGlkZXJIYW5kbGVXaWR0aCxcbiAgICAgIHNob3dUb29sdGlwLFxuICAgICAgc3R5bGVcbiAgICB9ID0gdGhpcy5wcm9wcztcbiAgICBjb25zdCB2YWx1ZTAgPSAhaXNSYW5nZWQgJiYgbWluVmFsdWUgPiAwID8gbWluVmFsdWUgOiB0aGlzLnByb3BzLnZhbHVlMDtcbiAgICBjb25zdCBjdXJyVmFsRGVsdGEgPSB2YWx1ZTEgLSB2YWx1ZTA7XG4gICAgY29uc3QgbWF4RGVsdGEgPSBtYXhWYWx1ZSAtIG1pblZhbHVlO1xuICAgIGNvbnN0IHdpZHRoID0gKGN1cnJWYWxEZWx0YSAvIG1heERlbHRhKSAqIDEwMDtcblxuICAgIGNvbnN0IHYwTGVmdCA9ICgodmFsdWUwIC0gbWluVmFsdWUpIC8gbWF4RGVsdGEpICogMTAwO1xuXG4gICAgcmV0dXJuIChcbiAgICAgIDxTbGlkZXJXcmFwcGVyXG4gICAgICAgIGNsYXNzTmFtZT17Y2xhc3NuYW1lcygna2ctc2xpZGVyJywgey4uLmNsYXNzU2V0LCBkaXNhYmxlZH0sIGNsYXNzTmFtZSl9XG4gICAgICAgIHJlZj17dGhpcy5yZWZ9XG4gICAgICAgIGlzUmFuZ2VkPXtpc1JhbmdlZH1cbiAgICAgICAgdmVydGljYWw9e3ZlcnRpY2FsfVxuICAgICAgICBzdHlsZT17c3R5bGV9XG4gICAgICA+XG4gICAgICAgIDxTdHlsZWRSYW5nZVNsaWRlciBjbGFzc05hbWU9XCJrZy1yYW5nZS1zbGlkZXJcIiB2ZXJ0aWNhbD17dmVydGljYWx9IHJlZj17dGhpcy50cmFja30+XG4gICAgICAgICAgPFNsaWRlckhhbmRsZVxuICAgICAgICAgICAgbGVmdD17dGhpcy5jYWxjSGFuZGxlTGVmdDAod2lkdGgsIHYwTGVmdCl9XG4gICAgICAgICAgICB2YWx1ZUxpc3RlbmVyPXt0aGlzLnNsaWRlMExpc3RlbmVyfVxuICAgICAgICAgICAgc2xpZGVySGFuZGxlV2lkdGg9e3NsaWRlckhhbmRsZVdpZHRofVxuICAgICAgICAgICAgZGlzcGxheT17aXNSYW5nZWR9XG4gICAgICAgICAgICB2ZXJ0aWNhbD17dmVydGljYWx9XG4gICAgICAgICAgICBzaG93VG9vbHRpcD17c2hvd1Rvb2x0aXB9XG4gICAgICAgICAgICB0cmFjaz17dGhpcy50cmFja31cbiAgICAgICAgICAvPlxuICAgICAgICAgIDxTbGlkZXJIYW5kbGVcbiAgICAgICAgICAgIGxlZnQ9e3RoaXMuY2FsY0hhbmRsZUxlZnQxKHdpZHRoLCB2MExlZnQpfVxuICAgICAgICAgICAgdmFsdWVMaXN0ZW5lcj17dGhpcy5zbGlkZTFMaXN0ZW5lcn1cbiAgICAgICAgICAgIHNsaWRlckhhbmRsZVdpZHRoPXtzbGlkZXJIYW5kbGVXaWR0aH1cbiAgICAgICAgICAgIHZlcnRpY2FsPXt2ZXJ0aWNhbH1cbiAgICAgICAgICAgIHZhbHVlPXt2YWx1ZTF9XG4gICAgICAgICAgICBzaG93VG9vbHRpcD17c2hvd1Rvb2x0aXB9XG4gICAgICAgICAgICB0cmFjaz17dGhpcy50cmFja31cbiAgICAgICAgICAvPlxuICAgICAgICAgIDxTbGlkZXJCYXJIYW5kbGVcbiAgICAgICAgICAgIHdpZHRoPXt3aWR0aH1cbiAgICAgICAgICAgIHYwTGVmdD17djBMZWZ0fVxuICAgICAgICAgICAgZW5hYmxlQmFyRHJhZz17dGhpcy5wcm9wcy5lbmFibGVCYXJEcmFnfVxuICAgICAgICAgICAgc2xpZGVyQmFyTGlzdGVuZXI9e3RoaXMuc2xpZGVyQmFyTGlzdGVuZXJ9XG4gICAgICAgICAgICB2ZXJ0aWNhbD17dmVydGljYWx9XG4gICAgICAgICAgICB0cmFjaz17dGhpcy50cmFja31cbiAgICAgICAgICAgIHNldEFuY2hvcj17dGhpcy5zZXRBbmNob3J9XG4gICAgICAgICAgLz5cbiAgICAgICAgPC9TdHlsZWRSYW5nZVNsaWRlcj5cbiAgICAgIDwvU2xpZGVyV3JhcHBlcj5cbiAgICApO1xuICB9XG59XG4iXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7OztBQUdBLElBQUFBLE1BQUEsR0FBQUMsdUJBQUEsQ0FBQUMsT0FBQTtBQUNBLElBQUFDLFdBQUEsR0FBQUMsc0JBQUEsQ0FBQUYsT0FBQTtBQUNBLElBQUFHLGlCQUFBLEdBQUFELHNCQUFBLENBQUFGLE9BQUE7QUFFQSxJQUFBSSxhQUFBLEdBQUFGLHNCQUFBLENBQUFGLE9BQUE7QUFDQSxJQUFBSyxnQkFBQSxHQUFBSCxzQkFBQSxDQUFBRixPQUFBO0FBQ0EsSUFBQU0sTUFBQSxHQUFBTixPQUFBO0FBQTZELElBQUFPLGVBQUEsRUFBQUMsZ0JBQUEsRUFUN0Q7QUFDQTtBQUFBLFNBQUFDLHlCQUFBQyxDQUFBLDZCQUFBQyxPQUFBLG1CQUFBQyxDQUFBLE9BQUFELE9BQUEsSUFBQUUsQ0FBQSxPQUFBRixPQUFBLFlBQUFGLHdCQUFBLFlBQUFBLHlCQUFBQyxDQUFBLFdBQUFBLENBQUEsR0FBQUcsQ0FB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