kepler.gl
Version:
kepler.gl is a webgl based application to visualize large scale location data in the browser
162 lines (160 loc) • 27.4 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 _slicedToArray2 = _interopRequireDefault(require("@babel/runtime/helpers/slicedToArray"));
var _defineProperty2 = _interopRequireDefault(require("@babel/runtime/helpers/defineProperty"));
var _taggedTemplateLiteral2 = _interopRequireDefault(require("@babel/runtime/helpers/taggedTemplateLiteral"));
var _react = _interopRequireWildcard(require("react"));
var _styledComponents = _interopRequireDefault(require("styled-components"));
var _classnames = _interopRequireDefault(require("classnames"));
var _icons = require("../icons");
var _constants = require("@kepler.gl/constants");
var _animationSpeedSlider = _interopRequireDefault(require("./animation-speed-slider"));
var _windowActionControl = _interopRequireDefault(require("./window-action-control"));
var _animationWindowControl = _interopRequireDefault(require("./animation-window-control"));
var _resetControl = _interopRequireDefault(require("./reset-control"));
var _playControl = _interopRequireDefault(require("./play-control"));
var _speedControl = _interopRequireDefault(require("./speed-control"));
var _templateObject; // 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; }
var DEFAULT_BUTTON_HEIGHT = '20px';
var StyledAnimationControls = _styledComponents["default"].div(_templateObject || (_templateObject = (0, _taggedTemplateLiteral2["default"])(["\n display: flex;\n position: relative;\n width: ", "px;\n &.disabled {\n opacity: 0.4;\n pointer-events: none;\n }\n"])), function (props) {
return props.width;
});
var DEFAULT_ICONS = {
/* eslint-disable react/display-name */
reset: function reset() {
return /*#__PURE__*/_react["default"].createElement(_icons.Reset, {
height: "16px"
});
},
play: function play() {
return /*#__PURE__*/_react["default"].createElement(_icons.Play, {
height: "16px"
});
},
pause: function pause() {
return /*#__PURE__*/_react["default"].createElement(_icons.Pause, {
height: "16px"
});
},
"export": function _export() {
return /*#__PURE__*/_react["default"].createElement(_icons.Save, {
height: "16px"
});
},
/* eslint-enable react/display-name */
speed: function speed() {
return /*#__PURE__*/_react["default"].createElement(_icons.Speed, {
height: "16px"
});
},
animationFree: _icons.FreeWindow,
animationIncremental: _icons.AnchorWindow
};
function nop() {
return;
}
var DEFAULT_ANIMATE_ITEMS = (0, _defineProperty2["default"])((0, _defineProperty2["default"])({}, _constants.ANIMATION_WINDOW.free, {
id: _constants.ANIMATION_WINDOW.free,
icon: DEFAULT_ICONS.animationFree,
tooltip: 'tooltip.animationByWindow'
}), _constants.ANIMATION_WINDOW.incremental, {
id: _constants.ANIMATION_WINDOW.incremental,
icon: DEFAULT_ICONS.animationIncremental,
tooltip: 'tooltip.animationByIncremental'
});
PlaybackControlsFactory.deps = [
// keeping this for backwards compatibility but we can decide to drop it later
_animationSpeedSlider["default"], _windowActionControl["default"], _animationWindowControl["default"], _resetControl["default"], _playControl["default"]];
function PlaybackControlsFactory(AnimationSpeedSlider, WindowActionControl, AnimationWindowControl, ResetControl, PlayControl) {
var PLAYBACK_CONTROLS_DEFAULT_ACTION_COMPONENTS = [PlayControl, (0, _speedControl["default"])(AnimationSpeedSlider), ResetControl, WindowActionControl, AnimationWindowControl];
// eslint-disable-next-line complexity
var PlaybackControls = function PlaybackControls(_ref) {
var filter = _ref.filter,
_ref$isAnimatable = _ref.isAnimatable,
isAnimatable = _ref$isAnimatable === void 0 ? true : _ref$isAnimatable,
isAnimating = _ref.isAnimating,
width = _ref.width,
speed = _ref.speed,
_ref$animationWindow = _ref.animationWindow,
animationWindow = _ref$animationWindow === void 0 ? _constants.ANIMATION_WINDOW.free : _ref$animationWindow,
setFilterAnimationWindow = _ref.setFilterAnimationWindow,
updateAnimationSpeed = _ref.updateAnimationSpeed,
_ref$pauseAnimation = _ref.pauseAnimation,
pauseAnimation = _ref$pauseAnimation === void 0 ? nop : _ref$pauseAnimation,
_ref$resetAnimation = _ref.resetAnimation,
resetAnimation = _ref$resetAnimation === void 0 ? nop : _ref$resetAnimation,
_ref$startAnimation = _ref.startAnimation,
startAnimation = _ref$startAnimation === void 0 ? nop : _ref$startAnimation,
_ref$playbackIcons = _ref.playbackIcons,
playbackIcons = _ref$playbackIcons === void 0 ? DEFAULT_ICONS : _ref$playbackIcons,
_ref$animationItems = _ref.animationItems,
animationItems = _ref$animationItems === void 0 ? DEFAULT_ANIMATE_ITEMS : _ref$animationItems,
_ref$buttonStyle = _ref.buttonStyle,
buttonStyle = _ref$buttonStyle === void 0 ? 'secondary' : _ref$buttonStyle,
_ref$buttonHeight = _ref.buttonHeight,
buttonHeight = _ref$buttonHeight === void 0 ? DEFAULT_BUTTON_HEIGHT : _ref$buttonHeight,
_ref$playbackActionIt = _ref.playbackActionItems,
playbackActionItems = _ref$playbackActionIt === void 0 ? PLAYBACK_CONTROLS_DEFAULT_ACTION_COMPONENTS : _ref$playbackActionIt;
var _useState = (0, _react.useState)(false),
_useState2 = (0, _slicedToArray2["default"])(_useState, 2),
isSpeedControlVisible = _useState2[0],
toggleSpeedControl = _useState2[1];
var _useState3 = (0, _react.useState)(false),
_useState4 = (0, _slicedToArray2["default"])(_useState3, 2),
showAnimationWindowControl = _useState4[0],
setShowAnimationWindowControl = _useState4[1];
var toggleAnimationWindowControl = (0, _react.useCallback)(function () {
setShowAnimationWindowControl(!showAnimationWindowControl);
}, [showAnimationWindowControl, setShowAnimationWindowControl]);
var btnStyle = buttonStyle ? (0, _defineProperty2["default"])({}, buttonStyle, true) : {};
var hideAndShowSpeedControl = (0, _react.useCallback)(function () {
if (!isSpeedControlVisible) {
toggleSpeedControl(true);
} else {
// TODO: A HACK to allow input onblur get triggered before the input is unmounted
// A better solution should be invested, see https://github.com/facebook/react/issues/12363
window.setTimeout(function () {
return toggleSpeedControl(false);
}, 200);
}
}, [isSpeedControlVisible, toggleSpeedControl]);
return /*#__PURE__*/_react["default"].createElement(StyledAnimationControls, {
className: (0, _classnames["default"])('playback-controls', {
disabled: !isAnimatable
}),
width: width
}, playbackActionItems.map(function (ActionComponent, index) {
return /*#__PURE__*/_react["default"].createElement(ActionComponent, {
key: index,
toggleAnimationWindowControl: toggleAnimationWindowControl,
showAnimationWindowControl: showAnimationWindowControl,
btnStyle: btnStyle,
hideAndShowSpeedControl: hideAndShowSpeedControl,
animationItems: animationItems,
animationWindow: animationWindow,
buttonHeight: buttonHeight,
filter: filter,
setFilterAnimationWindow: setFilterAnimationWindow,
updateAnimationSpeed: updateAnimationSpeed,
isAnimating: isAnimating,
pauseAnimation: pauseAnimation,
resetAnimation: resetAnimation,
startAnimation: startAnimation,
playbackIcons: playbackIcons,
isSpeedControlVisible: isSpeedControlVisible,
speed: speed
});
}));
};
return PlaybackControls;
}
var _default = exports["default"] = PlaybackControlsFactory;
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJfcmVhY3QiLCJfaW50ZXJvcFJlcXVpcmVXaWxkY2FyZCIsInJlcXVpcmUiLCJfc3R5bGVkQ29tcG9uZW50cyIsIl9pbnRlcm9wUmVxdWlyZURlZmF1bHQiLCJfY2xhc3NuYW1lcyIsIl9pY29ucyIsIl9jb25zdGFudHMiLCJfYW5pbWF0aW9uU3BlZWRTbGlkZXIiLCJfd2luZG93QWN0aW9uQ29udHJvbCIsIl9hbmltYXRpb25XaW5kb3dDb250cm9sIiwiX3Jlc2V0Q29udHJvbCIsIl9wbGF5Q29udHJvbCIsIl9zcGVlZENvbnRyb2wiLCJfdGVtcGxhdGVPYmplY3QiLCJfZ2V0UmVxdWlyZVdpbGRjYXJkQ2FjaGUiLCJlIiwiV2Vha01hcCIsInIiLCJ0IiwiX19lc01vZHVsZSIsIl90eXBlb2YiLCJoYXMiLCJnZXQiLCJuIiwiX19wcm90b19fIiwiYSIsIk9iamVjdCIsImRlZmluZVByb3BlcnR5IiwiZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yIiwidSIsImhhc093blByb3BlcnR5IiwiY2FsbCIsImkiLCJzZXQiLCJERUZBVUxUX0JVVFRPTl9IRUlHSFQiLCJTdHlsZWRBbmltYXRpb25Db250cm9scyIsInN0eWxlZCIsImRpdiIsIl90YWdnZWRUZW1wbGF0ZUxpdGVyYWwyIiwicHJvcHMiLCJ3aWR0aCIsIkRFRkFVTFRfSUNPTlMiLCJyZXNldCIsImNyZWF0ZUVsZW1lbnQiLCJSZXNldCIsImhlaWdodCIsInBsYXkiLCJQbGF5IiwicGF1c2UiLCJQYXVzZSIsImV4cG9ydCIsIlNhdmUiLCJzcGVlZCIsIlNwZWVkIiwiYW5pbWF0aW9uRnJlZSIsIkZyZWVXaW5kb3ciLCJhbmltYXRpb25JbmNyZW1lbnRhbCIsIkFuY2hvcldpbmRvdyIsIm5vcCIsIkRFRkFVTFRfQU5JTUFURV9JVEVNUyIsIl9kZWZpbmVQcm9wZXJ0eTIiLCJBTklNQVRJT05fV0lORE9XIiwiZnJlZSIsImlkIiwiaWNvbiIsInRvb2x0aXAiLCJpbmNyZW1lbnRhbCIsIlBsYXliYWNrQ29udHJvbHNGYWN0b3J5IiwiZGVwcyIsIkFuaW1hdGlvblNwZWVkU2xpZGVyRmFjdG9yeSIsIldpbmRvd0FjdGlvbkNvbnRyb2xGYWN0b3J5IiwiQW5pbWF0aW9uV2luZG93Q29udHJvbEZhY3RvcnkiLCJSZXNldENvbnRyb2xGYWN0b3J5IiwiUGxheUNvbnRyb2xGYWN0b3J5IiwiQW5pbWF0aW9uU3BlZWRTbGlkZXIiLCJXaW5kb3dBY3Rpb25Db250cm9sIiwiQW5pbWF0aW9uV2luZG93Q29udHJvbCIsIlJlc2V0Q29udHJvbCIsIlBsYXlDb250cm9sIiwiUExBWUJBQ0tfQ09OVFJPTFNfREVGQVVMVF9BQ1RJT05fQ09NUE9ORU5UUyIsIlNwZWVkQ29udHJvbEZhY3RvcnkiLCJQbGF5YmFja0NvbnRyb2xzIiwiX3JlZiIsImZpbHRlciIsIl9yZWYkaXNBbmltYXRhYmxlIiwiaXNBbmltYXRhYmxlIiwiaXNBbmltYXRpbmciLCJfcmVmJGFuaW1hdGlvbldpbmRvdyIsImFuaW1hdGlvbldpbmRvdyIsInNldEZpbHRlckFuaW1hdGlvbldpbmRvdyIsInVwZGF0ZUFuaW1hdGlvblNwZWVkIiwiX3JlZiRwYXVzZUFuaW1hdGlvbiIsInBhdXNlQW5pbWF0aW9uIiwiX3JlZiRyZXNldEFuaW1hdGlvbiIsInJlc2V0QW5pbWF0aW9uIiwiX3JlZiRzdGFydEFuaW1hdGlvbiIsInN0YXJ0QW5pbWF0aW9uIiwiX3JlZiRwbGF5YmFja0ljb25zIiwicGxheWJhY2tJY29ucyIsIl9yZWYkYW5pbWF0aW9uSXRlbXMiLCJhbmltYXRpb25JdGVtcyIsIl9yZWYkYnV0dG9uU3R5bGUiLCJidXR0b25TdHlsZSIsIl9yZWYkYnV0dG9uSGVpZ2h0IiwiYnV0dG9uSGVpZ2h0IiwiX3JlZiRwbGF5YmFja0FjdGlvbkl0IiwicGxheWJhY2tBY3Rpb25JdGVtcyIsIl91c2VTdGF0ZSIsInVzZVN0YXRlIiwiX3VzZVN0YXRlMiIsIl9zbGljZWRUb0FycmF5MiIsImlzU3BlZWRDb250cm9sVmlzaWJsZSIsInRvZ2dsZVNwZWVkQ29udHJvbCIsIl91c2VTdGF0ZTMiLCJfdXNlU3RhdGU0Iiwic2hvd0FuaW1hdGlvbldpbmRvd0NvbnRyb2wiLCJzZXRTaG93QW5pbWF0aW9uV2luZG93Q29udHJvbCIsInRvZ2dsZUFuaW1hdGlvbldpbmRvd0NvbnRyb2wiLCJ1c2VDYWxsYmFjayIsImJ0blN0eWxlIiwiaGlkZUFuZFNob3dTcGVlZENvbnRyb2wiLCJ3aW5kb3ciLCJzZXRUaW1lb3V0IiwiY2xhc3NOYW1lIiwiY2xhc3NuYW1lcyIsImRpc2FibGVkIiwibWFwIiwiQWN0aW9uQ29tcG9uZW50IiwiaW5kZXgiLCJrZXkiLCJfZGVmYXVsdCIsImV4cG9ydHMiXSwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvY29tbW9uL2FuaW1hdGlvbi1jb250cm9sL3BsYXliYWNrLWNvbnRyb2xzLnRzeCJdLCJzb3VyY2VzQ29udGVudCI6WyIvLyBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogTUlUXG4vLyBDb3B5cmlnaHQgY29udHJpYnV0b3JzIHRvIHRoZSBrZXBsZXIuZ2wgcHJvamVjdFxuXG5pbXBvcnQgUmVhY3QsIHt1c2VTdGF0ZSwgdXNlQ2FsbGJhY2t9IGZyb20gJ3JlYWN0JztcbmltcG9ydCBzdHlsZWQsIHtJU3R5bGVkQ29tcG9uZW50fSBmcm9tICdzdHlsZWQtY29tcG9uZW50cyc7XG5pbXBvcnQgY2xhc3NuYW1lcyBmcm9tICdjbGFzc25hbWVzJztcbmltcG9ydCB7UmVzZXQsIFBsYXksIFBhdXNlLCBTYXZlLCBTcGVlZCwgQW5jaG9yV2luZG93LCBGcmVlV2luZG93fSBmcm9tICcuLi9pY29ucyc7XG5pbXBvcnQge0FOSU1BVElPTl9XSU5ET1d9IGZyb20gJ0BrZXBsZXIuZ2wvY29uc3RhbnRzJztcbmltcG9ydCB7RmlsdGVyLCBUaW1lUmFuZ2VGaWx0ZXJ9IGZyb20gJ0BrZXBsZXIuZ2wvdHlwZXMnO1xuaW1wb3J0IEFuaW1hdGlvblNwZWVkU2xpZGVyRmFjdG9yeSBmcm9tICcuL2FuaW1hdGlvbi1zcGVlZC1zbGlkZXInO1xuaW1wb3J0IFdpbmRvd0FjdGlvbkNvbnRyb2xGYWN0b3J5IGZyb20gJy4vd2luZG93LWFjdGlvbi1jb250cm9sJztcbmltcG9ydCBBbmltYXRpb25XaW5kb3dDb250cm9sRmFjdG9yeSwge0FuaW1hdGlvbkl0ZW19IGZyb20gJy4vYW5pbWF0aW9uLXdpbmRvdy1jb250cm9sJztcbmltcG9ydCBSZXNldENvbnRyb2xGYWN0b3J5IGZyb20gJy4vcmVzZXQtY29udHJvbCc7XG5pbXBvcnQgUGxheUNvbnRyb2xGYWN0b3J5IGZyb20gJy4vcGxheS1jb250cm9sJztcbmltcG9ydCBTcGVlZENvbnRyb2xGYWN0b3J5IGZyb20gJy4vc3BlZWQtY29udHJvbCc7XG5pbXBvcnQge0Jhc2VDb21wb25lbnRQcm9wc30gZnJvbSAnLi4vLi4vdHlwZXMnO1xuXG5jb25zdCBERUZBVUxUX0JVVFRPTl9IRUlHSFQgPSAnMjBweCc7XG5cbmV4cG9ydCB0eXBlIFN0eWxlZEFuaW1hdGlvbkNvbnRyb2xzUHJvcHMgPSBCYXNlQ29tcG9uZW50UHJvcHMgJiB7XG4gIHdpZHRoPzogbnVtYmVyO1xufTtcblxuY29uc3QgU3R5bGVkQW5pbWF0aW9uQ29udHJvbHM6IElTdHlsZWRDb21wb25lbnQ8XG4gICd3ZWInLFxuICBTdHlsZWRBbmltYXRpb25Db250cm9sc1Byb3BzXG4+ID0gc3R5bGVkLmRpdjxTdHlsZWRBbmltYXRpb25Db250cm9sc1Byb3BzPmBcbiAgZGlzcGxheTogZmxleDtcbiAgcG9zaXRpb246IHJlbGF0aXZlO1xuICB3aWR0aDogJHtwcm9wcyA9PiBwcm9wcy53aWR0aH1weDtcbiAgJi5kaXNhYmxlZCB7XG4gICAgb3BhY2l0eTogMC40O1xuICAgIHBvaW50ZXItZXZlbnRzOiBub25lO1xuICB9XG5gO1xuXG5jb25zdCBERUZBVUxUX0lDT05TID0ge1xuICAvKiBlc2xpbnQtZGlzYWJsZSByZWFjdC9kaXNwbGF5LW5hbWUgKi9cbiAgcmVzZXQ6ICgpID0+IDxSZXNldCBoZWlnaHQ9XCIxNnB4XCIgLz4sXG4gIHBsYXk6ICgpID0+IDxQbGF5IGhlaWdodD1cIjE2cHhcIiAvPixcbiAgcGF1c2U6ICgpID0+IDxQYXVzZSBoZWlnaHQ9XCIxNnB4XCIgLz4sXG4gIGV4cG9ydDogKCkgPT4gPFNhdmUgaGVpZ2h0PVwiMTZweFwiIC8+LFxuICAvKiBlc2xpbnQtZW5hYmxlIHJlYWN0L2Rpc3BsYXktbmFtZSAqL1xuICBzcGVlZDogKCkgPT4gPFNwZWVkIGhlaWdodD1cIjE2cHhcIiAvPixcbiAgYW5pbWF0aW9uRnJlZTogRnJlZVdpbmRvdyxcbiAgYW5pbWF0aW9uSW5jcmVtZW50YWw6IEFuY2hvcldpbmRvd1xufTtcblxuZnVuY3Rpb24gbm9wKCkge1xuICByZXR1cm47XG59XG5cbmNvbnN0IERFRkFVTFRfQU5JTUFURV9JVEVNUyA9IHtcbiAgW0FOSU1BVElPTl9XSU5ET1cuZnJlZV06IHtcbiAgICBpZDogQU5JTUFUSU9OX1dJTkRPVy5mcmVlLFxuICAgIGljb246IERFRkFVTFRfSUNPTlMuYW5pbWF0aW9uRnJlZSxcbiAgICB0b29sdGlwOiAndG9vbHRpcC5hbmltYXRpb25CeVdpbmRvdydcbiAgfSxcbiAgW0FOSU1BVElPTl9XSU5ET1cuaW5jcmVtZW50YWxdOiB7XG4gICAgaWQ6IEFOSU1BVElPTl9XSU5ET1cuaW5jcmVtZW50YWwsXG4gICAgaWNvbjogREVGQVVMVF9JQ09OUy5hbmltYXRpb25JbmNyZW1lbnRhbCxcbiAgICB0b29sdGlwOiAndG9vbHRpcC5hbmltYXRpb25CeUluY3JlbWVudGFsJ1xuICB9XG59O1xuZXhwb3J0IGludGVyZmFjZSBQbGF5YmFja0NvbnRyb2xzUHJvcHMge1xuICBmaWx0ZXI/OiBGaWx0ZXI7XG4gIGlzQW5pbWF0YWJsZT86IGJvb2xlYW47XG4gIGlzQW5pbWF0aW5nPzogYm9vbGVhbjtcbiAgd2lkdGg/OiBudW1iZXI7XG4gIHNwZWVkOiBudW1iZXI7XG4gIGFuaW1hdGlvbldpbmRvdz86IG51bGwgfCBUaW1lUmFuZ2VGaWx0ZXJbJ2FuaW1hdGlvbldpbmRvdyddO1xuICBzZXRGaWx0ZXJBbmltYXRpb25XaW5kb3c/OiAoaWQ6IHN0cmluZykgPT4gdm9pZDtcbiAgdXBkYXRlQW5pbWF0aW9uU3BlZWQ/OiAoaWR4OiBudW1iZXIsIHNwZWVkOiBudW1iZXIpID0+IHZvaWQ7XG4gIHBhdXNlQW5pbWF0aW9uPzogKCkgPT4gdm9pZDtcbiAgcmVzZXRBbmltYXRpb24/OiAoKSA9PiB2b2lkO1xuICBzdGFydEFuaW1hdGlvbjogKCkgPT4gdm9pZDtcbiAgcGxheWJhY2tJY29ucz86IFJlY29yZDxzdHJpbmcsIFJlYWN0LkZDPHtoZWlnaHQ6IG51bWJlcn0+PjtcbiAgYW5pbWF0aW9uSXRlbXM/OiB7W2tleTogc3RyaW5nXTogQW5pbWF0aW9uSXRlbX07XG4gIGJ1dHRvblN0eWxlPzogc3RyaW5nO1xuICBidXR0b25IZWlnaHQ/OiBzdHJpbmc7XG4gIHBsYXliYWNrQWN0aW9uSXRlbXM/OiBSZWFjdC5GQ1tdO1xuICBjbGFzc05hbWU/OiBzdHJpbmc7XG59XG5cblBsYXliYWNrQ29udHJvbHNGYWN0b3J5LmRlcHMgPSBbXG4gIC8vIGtlZXBpbmcgdGhpcyBmb3IgYmFja3dhcmRzIGNvbXBhdGliaWxpdHkgYnV0IHdlIGNhbiBkZWNpZGUgdG8gZHJvcCBpdCBsYXRlclxuICBBbmltYXRpb25TcGVlZFNsaWRlckZhY3RvcnksXG4gIFdpbmRvd0FjdGlvbkNvbnRyb2xGYWN0b3J5LFxuICBBbmltYXRpb25XaW5kb3dDb250cm9sRmFjdG9yeSxcbiAgUmVzZXRDb250cm9sRmFjdG9yeSxcbiAgUGxheUNvbnRyb2xGYWN0b3J5XG5dO1xuXG5mdW5jdGlvbiBQbGF5YmFja0NvbnRyb2xzRmFjdG9yeShcbiAgQW5pbWF0aW9uU3BlZWRTbGlkZXI6IFJldHVyblR5cGU8dHlwZW9mIEFuaW1hdGlvblNwZWVkU2xpZGVyRmFjdG9yeT4sXG4gIFdpbmRvd0FjdGlvbkNvbnRyb2wsXG4gIEFuaW1hdGlvbldpbmRvd0NvbnRyb2wsXG4gIFJlc2V0Q29udHJvbCxcbiAgUGxheUNvbnRyb2xcbikge1xuICBjb25zdCBQTEFZQkFDS19DT05UUk9MU19ERUZBVUxUX0FDVElPTl9DT01QT05FTlRTID0gW1xuICAgIFBsYXlDb250cm9sLFxuICAgIFNwZWVkQ29udHJvbEZhY3RvcnkoQW5pbWF0aW9uU3BlZWRTbGlkZXIpLFxuICAgIFJlc2V0Q29udHJvbCxcbiAgICBXaW5kb3dBY3Rpb25Db250cm9sLFxuICAgIEFuaW1hdGlvbldpbmRvd0NvbnRyb2xcbiAgXTtcblxuICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgY29tcGxleGl0eVxuICBjb25zdCBQbGF5YmFja0NvbnRyb2xzOiBSZWFjdC5GQzxQbGF5YmFja0NvbnRyb2xzUHJvcHM+ID0gKHtcbiAgICBmaWx0ZXIsXG4gICAgaXNBbmltYXRhYmxlID0gdHJ1ZSxcbiAgICBpc0FuaW1hdGluZyxcbiAgICB3aWR0aCxcbiAgICBzcGVlZCxcbiAgICBhbmltYXRpb25XaW5kb3cgPSBBTklNQVRJT05fV0lORE9XLmZyZWUsXG4gICAgc2V0RmlsdGVyQW5pbWF0aW9uV2luZG93LFxuICAgIHVwZGF0ZUFuaW1hdGlvblNwZWVkLFxuICAgIHBhdXNlQW5pbWF0aW9uID0gbm9wLFxuICAgIHJlc2V0QW5pbWF0aW9uID0gbm9wLFxuICAgIHN0YXJ0QW5pbWF0aW9uID0gbm9wLFxuICAgIHBsYXliYWNrSWNvbnMgPSBERUZBVUxUX0lDT05TLFxuICAgIGFuaW1hdGlvbkl0ZW1zID0gREVGQVVMVF9BTklNQVRFX0lURU1TLFxuICAgIGJ1dHRvblN0eWxlID0gJ3NlY29uZGFyeScsXG4gICAgYnV0dG9uSGVpZ2h0ID0gREVGQVVMVF9CVVRUT05fSEVJR0hULFxuICAgIHBsYXliYWNrQWN0aW9uSXRlbXMgPSBQTEFZQkFDS19DT05UUk9MU19ERUZBVUxUX0FDVElPTl9DT01QT05FTlRTXG4gIH0pID0+IHtcbiAgICBjb25zdCBbaXNTcGVlZENvbnRyb2xWaXNpYmxlLCB0b2dnbGVTcGVlZENvbnRyb2xdID0gdXNlU3RhdGUoZmFsc2UpO1xuICAgIGNvbnN0IFtzaG93QW5pbWF0aW9uV2luZG93Q29udHJvbCwgc2V0U2hvd0FuaW1hdGlvbldpbmRvd0NvbnRyb2xdID0gdXNlU3RhdGUoZmFsc2UpO1xuXG4gICAgY29uc3QgdG9nZ2xlQW5pbWF0aW9uV2luZG93Q29udHJvbCA9IHVzZUNhbGxiYWNrKCgpID0+IHtcbiAgICAgIHNldFNob3dBbmltYXRpb25XaW5kb3dDb250cm9sKCFzaG93QW5pbWF0aW9uV2luZG93Q29udHJvbCk7XG4gICAgfSwgW3Nob3dBbmltYXRpb25XaW5kb3dDb250cm9sLCBzZXRTaG93QW5pbWF0aW9uV2luZG93Q29udHJvbF0pO1xuICAgIGNvbnN0IGJ0blN0eWxlID0gYnV0dG9uU3R5bGUgPyB7W2J1dHRvblN0eWxlXTogdHJ1ZX0gOiB7fTtcblxuICAgIGNvbnN0IGhpZGVBbmRTaG93U3BlZWRDb250cm9sID0gdXNlQ2FsbGJhY2soKCkgPT4ge1xuICAgICAgaWYgKCFpc1NwZWVkQ29udHJvbFZpc2libGUpIHtcbiAgICAgICAgdG9nZ2xlU3BlZWRDb250cm9sKHRydWUpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgLy8gVE9ETzogQSBIQUNLIHRvIGFsbG93IGlucHV0IG9uYmx1ciBnZXQgdHJpZ2dlcmVkIGJlZm9yZSB0aGUgaW5wdXQgaXMgdW5tb3VudGVkXG4gICAgICAgIC8vIEEgYmV0dGVyIHNvbHV0aW9uIHNob3VsZCBiZSBpbnZlc3RlZCwgc2VlIGh0dHBzOi8vZ2l0aHViLmNvbS9mYWNlYm9vay9yZWFjdC9pc3N1ZXMvMTIzNjNcbiAgICAgICAgd2luZG93LnNldFRpbWVvdXQoKCkgPT4gdG9nZ2xlU3BlZWRDb250cm9sKGZhbHNlKSwgMjAwKTtcbiAgICAgIH1cbiAgICB9LCBbaXNTcGVlZENvbnRyb2xWaXNpYmxlLCB0b2dnbGVTcGVlZENvbnRyb2xdKTtcblxuICAgIHJldHVybiAoXG4gICAgICA8U3R5bGVkQW5pbWF0aW9uQ29udHJvbHNcbiAgICAgICAgY2xhc3NOYW1lPXtjbGFzc25hbWVzKCdwbGF5YmFjay1jb250cm9scycsIHtcbiAgICAgICAgICBkaXNhYmxlZDogIWlzQW5pbWF0YWJsZVxuICAgICAgICB9KX1cbiAgICAgICAgd2lkdGg9e3dpZHRofVxuICAgICAgPlxuICAgICAgICB7LyoqIFdpbmRvdyAqL31cbiAgICAgICAge3BsYXliYWNrQWN0aW9uSXRlbXMubWFwKChBY3Rpb25Db21wb25lbnQsIGluZGV4KSA9PiAoXG4gICAgICAgICAgPEFjdGlvbkNvbXBvbmVudFxuICAgICAgICAgICAga2V5PXtpbmRleH1cbiAgICAgICAgICAgIHRvZ2dsZUFuaW1hdGlvbldpbmRvd0NvbnRyb2w9e3RvZ2dsZUFuaW1hdGlvbldpbmRvd0NvbnRyb2x9XG4gICAgICAgICAgICBzaG93QW5pbWF0aW9uV2luZG93Q29udHJvbD17c2hvd0FuaW1hdGlvbldpbmRvd0NvbnRyb2x9XG4gICAgICAgICAgICBidG5TdHlsZT17YnRuU3R5bGV9XG4gICAgICAgICAgICBoaWRlQW5kU2hvd1NwZWVkQ29udHJvbD17aGlkZUFuZFNob3dTcGVlZENvbnRyb2x9XG4gICAgICAgICAgICBhbmltYXRpb25JdGVtcz17YW5pbWF0aW9uSXRlbXN9XG4gICAgICAgICAgICBhbmltYXRpb25XaW5kb3c9e2FuaW1hdGlvbldpbmRvd31cbiAgICAgICAgICAgIGJ1dHRvbkhlaWdodD17YnV0dG9uSGVpZ2h0fVxuICAgICAgICAgICAgZmlsdGVyPXtmaWx0ZXJ9XG4gICAgICAgICAgICBzZXRGaWx0ZXJBbmltYXRpb25XaW5kb3c9e3NldEZpbHRlckFuaW1hdGlvbldpbmRvd31cbiAgICAgICAgICAgIHVwZGF0ZUFuaW1hdGlvblNwZWVkPXt1cGRhdGVBbmltYXRpb25TcGVlZH1cbiAgICAgICAgICAgIGlzQW5pbWF0aW5nPXtpc0FuaW1hdGluZ31cbiAgICAgICAgICAgIHBhdXNlQW5pbWF0aW9uPXtwYXVzZUFuaW1hdGlvbn1cbiAgICAgICAgICAgIHJlc2V0QW5pbWF0aW9uPXtyZXNldEFuaW1hdGlvbn1cbiAgICAgICAgICAgIHN0YXJ0QW5pbWF0aW9uPXtzdGFydEFuaW1hdGlvbn1cbiAgICAgICAgICAgIHBsYXliYWNrSWNvbnM9e3BsYXliYWNrSWNvbnN9XG4gICAgICAgICAgICBpc1NwZWVkQ29udHJvbFZpc2libGU9e2lzU3BlZWRDb250cm9sVmlzaWJsZX1cbiAgICAgICAgICAgIHNwZWVkPXtzcGVlZH1cbiAgICAgICAgICAvPlxuICAgICAgICApKX1cbiAgICAgIDwvU3R5bGVkQW5pbWF0aW9uQ29udHJvbHM+XG4gICAgKTtcbiAgfTtcblxuICByZXR1cm4gUGxheWJhY2tDb250cm9scztcbn1cblxuZXhwb3J0IGRlZmF1bHQgUGxheWJhY2tDb250cm9sc0ZhY3Rvcnk7XG4iXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7O0FBR0EsSUFBQUEsTUFBQSxHQUFBQyx1QkFBQSxDQUFBQyxPQUFBO0FBQ0EsSUFBQUMsaUJBQUEsR0FBQUMsc0JBQUEsQ0FBQUYsT0FBQTtBQUNBLElBQUFHLFdBQUEsR0FBQUQsc0JBQUEsQ0FBQUYsT0FBQTtBQUNBLElBQUFJLE1BQUEsR0FBQUosT0FBQTtBQUNBLElBQUFLLFVBQUEsR0FBQUwsT0FBQTtBQUVBLElBQUFNLHFCQUFBLEdBQUFKLHNCQUFBLENBQUFGLE9BQUE7QUFDQSxJQUFBTyxvQkFBQSxHQUFBTCxzQkFBQSxDQUFBRixPQUFBO0FBQ0EsSUFBQVEsdUJBQUEsR0FBQU4sc0JBQUEsQ0FBQUYsT0FBQTtBQUNBLElBQUFTLGFBQUEsR0FBQVAsc0JBQUEsQ0FBQUYsT0FBQTtBQUNBLElBQUFVLFlBQUEsR0FBQVIsc0JBQUEsQ0FBQUYsT0FBQTtBQUNBLElBQUFXLGFBQUEsR0FBQVQsc0JBQUEsQ0FBQUYsT0FBQTtBQUFrRCxJQUFBWSxlQUFBLEVBZGxEO0FBQ0E7QUFBQSxTQUFBQyx5QkFBQUMsQ0FBQSw2QkFBQUMsT0FBQSxtQkFBQUMsQ0FBQSxPQUFBRCxPQUFBLElBQUFFLENBQUEsT0FBQUYsT0FBQSxZQUFBRix3QkFBQSxZQUFBQSx5QkFBQUMsQ0FBQSxXQUFBQSxDQUFBLEdBQUFHLENBQUEsR0FBQUQsQ0FB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