UNPKG

@elastic/react-search-ui

Version:

A React library for building search experiences

266 lines (232 loc) 31.6 kB
import _slicedToArray from "@babel/runtime/helpers/slicedToArray"; import _objectWithoutProperties from "@babel/runtime/helpers/objectWithoutProperties"; import _classCallCheck from "@babel/runtime/helpers/classCallCheck"; import _createClass from "@babel/runtime/helpers/createClass"; import _possibleConstructorReturn from "@babel/runtime/helpers/possibleConstructorReturn"; import _getPrototypeOf from "@babel/runtime/helpers/getPrototypeOf"; import _assertThisInitialized from "@babel/runtime/helpers/assertThisInitialized"; import _inherits from "@babel/runtime/helpers/inherits"; import _defineProperty from "@babel/runtime/helpers/defineProperty"; function ownKeys(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { keys.push.apply(keys, Object.getOwnPropertySymbols(object)); } if (enumerableOnly) keys = keys.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; }); return keys; } function _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i] != null ? arguments[i] : {}; if (i % 2) { ownKeys(source, true).forEach(function (key) { _defineProperty(target, key, source[key]); }); } else if (Object.getOwnPropertyDescriptors) { Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)); } else { ownKeys(source).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } } return target; } import PropTypes from "prop-types"; import { Component } from "react"; import { SearchBox } from "@elastic/react-search-ui-views"; import { withSearch } from ".."; import { Result, Suggestion } from "../types"; export var SearchBoxContainer = /*#__PURE__*/ function (_Component) { _inherits(SearchBoxContainer, _Component); function SearchBoxContainer() { var _getPrototypeOf2; var _this; _classCallCheck(this, SearchBoxContainer); for (var _len = arguments.length, args = new Array(_len), _key = 0; _key < _len; _key++) { args[_key] = arguments[_key]; } _this = _possibleConstructorReturn(this, (_getPrototypeOf2 = _getPrototypeOf(SearchBoxContainer)).call.apply(_getPrototypeOf2, [this].concat(args))); _defineProperty(_assertThisInitialized(_this), "state", { isFocused: false }); _defineProperty(_assertThisInitialized(_this), "handleFocus", function () { _this.setState({ isFocused: true }); }); _defineProperty(_assertThisInitialized(_this), "handleBlur", function () { _this.setState({ isFocused: false }); }); _defineProperty(_assertThisInitialized(_this), "completeSuggestion", function (searchTerm) { var _this$props = _this.props, shouldClearFilters = _this$props.shouldClearFilters, setSearchTerm = _this$props.setSearchTerm; setSearchTerm(searchTerm, { shouldClearFilters: shouldClearFilters }); }); _defineProperty(_assertThisInitialized(_this), "handleSubmit", function (e) { var _this$props2 = _this.props, shouldClearFilters = _this$props2.shouldClearFilters, searchTerm = _this$props2.searchTerm, setSearchTerm = _this$props2.setSearchTerm; e.preventDefault(); setSearchTerm(searchTerm, { shouldClearFilters: shouldClearFilters }); }); _defineProperty(_assertThisInitialized(_this), "handleChange", function (value) { var _this$props3 = _this.props, autocompleteMinimumCharacters = _this$props3.autocompleteMinimumCharacters, autocompleteResults = _this$props3.autocompleteResults, autocompleteSuggestions = _this$props3.autocompleteSuggestions, shouldClearFilters = _this$props3.shouldClearFilters, searchAsYouType = _this$props3.searchAsYouType, setSearchTerm = _this$props3.setSearchTerm, debounceLength = _this$props3.debounceLength; var options = _objectSpread({ autocompleteMinimumCharacters: autocompleteMinimumCharacters }, (autocompleteResults || autocompleteSuggestions || searchAsYouType) && { debounce: debounceLength || 200 }, { shouldClearFilters: shouldClearFilters, refresh: !!searchAsYouType, autocompleteResults: !!autocompleteResults, autocompleteSuggestions: !!autocompleteSuggestions }); setSearchTerm(value, options); }); _defineProperty(_assertThisInitialized(_this), "handleNotifyAutocompleteSelected", function (selection) { var _this$props4 = _this.props, autocompleteResults = _this$props4.autocompleteResults, trackAutocompleteClickThrough = _this$props4.trackAutocompleteClickThrough; // Because suggestions don't count as clickthroughs, only // results if (autocompleteResults && autocompleteResults.shouldTrackClickThrough !== false && !selection.suggestion) { var _autocompleteResults$ = autocompleteResults.clickThroughTags, clickThroughTags = _autocompleteResults$ === void 0 ? [] : _autocompleteResults$; var id = selection.id.raw; trackAutocompleteClickThrough(id, clickThroughTags); } }); _defineProperty(_assertThisInitialized(_this), "defaultOnSelectAutocomplete", function (selection) { var autocompleteResults = _this.props.autocompleteResults; _this.handleNotifyAutocompleteSelected(selection); if (!selection.suggestion) { var url = selection[autocompleteResults.urlField] ? selection[autocompleteResults.urlField].raw : ""; if (url) { var target = autocompleteResults.linkTarget || "_self"; window.open(url, target); } } else { _this.completeSuggestion(selection.suggestion); } }); return _this; } _createClass(SearchBoxContainer, [{ key: "render", value: function render() { var _this2 = this; var isFocused = this.state.isFocused; var _this$props5 = this.props, autocompleteMinimumCharacters = _this$props5.autocompleteMinimumCharacters, autocompleteResults = _this$props5.autocompleteResults, autocompleteSuggestions = _this$props5.autocompleteSuggestions, autocompletedResults = _this$props5.autocompletedResults, autocompletedSuggestions = _this$props5.autocompletedSuggestions, className = _this$props5.className, autocompleteView = _this$props5.autocompleteView, inputProps = _this$props5.inputProps, inputView = _this$props5.inputView, onSelectAutocomplete = _this$props5.onSelectAutocomplete, onSubmit = _this$props5.onSubmit, searchTerm = _this$props5.searchTerm, view = _this$props5.view, rest = _objectWithoutProperties(_this$props5, ["autocompleteMinimumCharacters", "autocompleteResults", "autocompleteSuggestions", "autocompletedResults", "autocompletedSuggestions", "className", "autocompleteView", "inputProps", "inputView", "onSelectAutocomplete", "onSubmit", "searchTerm", "view"]); var View = view || SearchBox; var useAutocomplete = (!!autocompleteResults || !!autocompleteSuggestions) && searchTerm.length >= autocompleteMinimumCharacters; var autocompletedSuggestionsCount = Object.entries(autocompletedSuggestions // eslint-disable-next-line no-unused-vars ).reduce(function (acc, _ref) { var _ref2 = _slicedToArray(_ref, 2), _ = _ref2[0], value = _ref2[1]; return acc + value.length; }, 0); var allAutocompletedItemsCount = autocompletedSuggestionsCount + autocompletedResults.length; var handleOnSelectAutocomplete; if (onSelectAutocomplete) { handleOnSelectAutocomplete = function handleOnSelectAutocomplete(selection) { onSelectAutocomplete(selection, { notifyAutocompleteSelected: _this2.handleNotifyAutocompleteSelected, completeSuggestion: _this2.completeSuggestion, autocompleteResults: _this2.props.autocompleteResults }, _this2.defaultOnSelectAutocomplete); }; } return View(_objectSpread({ allAutocompletedItemsCount: allAutocompletedItemsCount, autocompleteView: autocompleteView, autocompleteResults: autocompleteResults, autocompleteSuggestions: autocompleteSuggestions, autocompletedResults: autocompletedResults, autocompletedSuggestions: autocompletedSuggestions, className: className, autocompletedSuggestionsCount: autocompletedSuggestionsCount, completeSuggestion: this.completeSuggestion, isFocused: isFocused, notifyAutocompleteSelected: this.handleNotifyAutocompleteSelected, onChange: function onChange(value) { return _this2.handleChange(value); }, onSelectAutocomplete: handleOnSelectAutocomplete || this.defaultOnSelectAutocomplete, onSubmit: onSubmit ? function (e) { e.preventDefault(); onSubmit(searchTerm); } : this.handleSubmit, useAutocomplete: useAutocomplete, value: searchTerm, inputProps: _objectSpread({ onFocus: this.handleFocus, onBlur: this.handleBlur }, inputProps), inputView: inputView }, rest)); } }]); return SearchBoxContainer; }(Component); _defineProperty(SearchBoxContainer, "propTypes", { // Props autocompleteMinimumCharacters: PropTypes.number, autocompleteResults: PropTypes.oneOfType([PropTypes.bool, PropTypes.shape({ clickThroughTags: PropTypes.arrayOf(PropTypes.string), linkTarget: PropTypes.string, sectionTitle: PropTypes.string, shouldTrackClickThrough: PropTypes.bool, titleField: PropTypes.string.isRequired, urlField: PropTypes.string.isRequired })]), autocompleteSuggestions: PropTypes.oneOfType([PropTypes.bool, PropTypes.exact({ sectionTitle: PropTypes.string }), PropTypes.objectOf(PropTypes.exact({ sectionTitle: PropTypes.string }))]), autocompleteView: PropTypes.func, className: PropTypes.string, shouldClearFilters: PropTypes.bool, debounceLength: PropTypes.number, inputProps: PropTypes.object, inputView: PropTypes.func, onSelectAutocomplete: PropTypes.func, onSubmit: PropTypes.func, searchAsYouType: PropTypes.bool, view: PropTypes.func, // State autocompletedResults: PropTypes.arrayOf(Result).isRequired, autocompletedSuggestions: PropTypes.objectOf(PropTypes.arrayOf(Suggestion)).isRequired, searchTerm: PropTypes.string.isRequired, // Actions setSearchTerm: PropTypes.func.isRequired, trackAutocompleteClickThrough: PropTypes.func.isRequired }); _defineProperty(SearchBoxContainer, "defaultProps", { autocompleteMinimumCharacters: 0, shouldClearFilters: true }); export default withSearch(function (_ref3) { var autocompletedResults = _ref3.autocompletedResults, autocompletedSuggestions = _ref3.autocompletedSuggestions, searchTerm = _ref3.searchTerm, setSearchTerm = _ref3.setSearchTerm, trackAutocompleteClickThrough = _ref3.trackAutocompleteClickThrough; return { autocompletedResults: autocompletedResults, autocompletedSuggestions: autocompletedSuggestions, searchTerm: searchTerm, setSearchTerm: setSearchTerm, trackAutocompleteClickThrough: trackAutocompleteClickThrough }; })(SearchBoxContainer); //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9jb250YWluZXJzL1NlYXJjaEJveC5qcyJdLCJuYW1lcyI6WyJQcm9wVHlwZXMiLCJDb21wb25lbnQiLCJTZWFyY2hCb3giLCJ3aXRoU2VhcmNoIiwiUmVzdWx0IiwiU3VnZ2VzdGlvbiIsIlNlYXJjaEJveENvbnRhaW5lciIsImlzRm9jdXNlZCIsInNldFN0YXRlIiwic2VhcmNoVGVybSIsInByb3BzIiwic2hvdWxkQ2xlYXJGaWx0ZXJzIiwic2V0U2VhcmNoVGVybSIsImUiLCJwcmV2ZW50RGVmYXVsdCIsInZhbHVlIiwiYXV0b2NvbXBsZXRlTWluaW11bUNoYXJhY3RlcnMiLCJhdXRvY29tcGxldGVSZXN1bHRzIiwiYXV0b2NvbXBsZXRlU3VnZ2VzdGlvbnMiLCJzZWFyY2hBc1lvdVR5cGUiLCJkZWJvdW5jZUxlbmd0aCIsIm9wdGlvbnMiLCJkZWJvdW5jZSIsInJlZnJlc2giLCJzZWxlY3Rpb24iLCJ0cmFja0F1dG9jb21wbGV0ZUNsaWNrVGhyb3VnaCIsInNob3VsZFRyYWNrQ2xpY2tUaHJvdWdoIiwic3VnZ2VzdGlvbiIsImNsaWNrVGhyb3VnaFRhZ3MiLCJpZCIsInJhdyIsImhhbmRsZU5vdGlmeUF1dG9jb21wbGV0ZVNlbGVjdGVkIiwidXJsIiwidXJsRmllbGQiLCJ0YXJnZXQiLCJsaW5rVGFyZ2V0Iiwid2luZG93Iiwib3BlbiIsImNvbXBsZXRlU3VnZ2VzdGlvbiIsInN0YXRlIiwiYXV0b2NvbXBsZXRlZFJlc3VsdHMiLCJhdXRvY29tcGxldGVkU3VnZ2VzdGlvbnMiLCJjbGFzc05hbWUiLCJhdXRvY29tcGxldGVWaWV3IiwiaW5wdXRQcm9wcyIsImlucHV0VmlldyIsIm9uU2VsZWN0QXV0b2NvbXBsZXRlIiwib25TdWJtaXQiLCJ2aWV3IiwicmVzdCIsIlZpZXciLCJ1c2VBdXRvY29tcGxldGUiLCJsZW5ndGgiLCJhdXRvY29tcGxldGVkU3VnZ2VzdGlvbnNDb3VudCIsIk9iamVjdCIsImVudHJpZXMiLCJyZWR1Y2UiLCJhY2MiLCJfIiwiYWxsQXV0b2NvbXBsZXRlZEl0ZW1zQ291bnQiLCJoYW5kbGVPblNlbGVjdEF1dG9jb21wbGV0ZSIsIm5vdGlmeUF1dG9jb21wbGV0ZVNlbGVjdGVkIiwiZGVmYXVsdE9uU2VsZWN0QXV0b2NvbXBsZXRlIiwib25DaGFuZ2UiLCJoYW5kbGVDaGFuZ2UiLCJoYW5kbGVTdWJtaXQiLCJvbkZvY3VzIiwiaGFuZGxlRm9jdXMiLCJvbkJsdXIiLCJoYW5kbGVCbHVyIiwibnVtYmVyIiwib25lT2ZUeXBlIiwiYm9vbCIsInNoYXBlIiwiYXJyYXlPZiIsInN0cmluZyIsInNlY3Rpb25UaXRsZSIsInRpdGxlRmllbGQiLCJpc1JlcXVpcmVkIiwiZXhhY3QiLCJvYmplY3RPZiIsImZ1bmMiLCJvYmplY3QiXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7O0FBQUEsT0FBT0EsU0FBUCxNQUFzQixZQUF0QjtBQUNBLFNBQVNDLFNBQVQsUUFBMEIsT0FBMUI7QUFDQSxTQUFTQyxTQUFULFFBQTBCLGdDQUExQjtBQUVBLFNBQVNDLFVBQVQsUUFBMkIsSUFBM0I7QUFDQSxTQUFTQyxNQUFULEVBQWlCQyxVQUFqQixRQUFtQyxVQUFuQztBQUVBLFdBQWFDLGtCQUFiO0FBQUE7QUFBQTtBQUFBOztBQUFBO0FBQUE7O0FBQUE7O0FBQUE7O0FBQUE7QUFBQTtBQUFBOztBQUFBOztBQUFBLDREQW1EVTtBQUNOQyxNQUFBQSxTQUFTLEVBQUU7QUFETCxLQW5EVjs7QUFBQSxrRUF1RGdCLFlBQU07QUFDbEIsWUFBS0MsUUFBTCxDQUFjO0FBQ1pELFFBQUFBLFNBQVMsRUFBRTtBQURDLE9BQWQ7QUFHRCxLQTNESDs7QUFBQSxpRUE2RGUsWUFBTTtBQUNqQixZQUFLQyxRQUFMLENBQWM7QUFDWkQsUUFBQUEsU0FBUyxFQUFFO0FBREMsT0FBZDtBQUdELEtBakVIOztBQUFBLHlFQW1FdUIsVUFBQUUsVUFBVSxFQUFJO0FBQUEsd0JBQ2EsTUFBS0MsS0FEbEI7QUFBQSxVQUN6QkMsa0JBRHlCLGVBQ3pCQSxrQkFEeUI7QUFBQSxVQUNMQyxhQURLLGVBQ0xBLGFBREs7QUFFakNBLE1BQUFBLGFBQWEsQ0FBQ0gsVUFBRCxFQUFhO0FBQ3hCRSxRQUFBQSxrQkFBa0IsRUFBbEJBO0FBRHdCLE9BQWIsQ0FBYjtBQUdELEtBeEVIOztBQUFBLG1FQTBFaUIsVUFBQUUsQ0FBQyxFQUFJO0FBQUEseUJBQ3dDLE1BQUtILEtBRDdDO0FBQUEsVUFDVkMsa0JBRFUsZ0JBQ1ZBLGtCQURVO0FBQUEsVUFDVUYsVUFEVixnQkFDVUEsVUFEVjtBQUFBLFVBQ3NCRyxhQUR0QixnQkFDc0JBLGFBRHRCO0FBR2xCQyxNQUFBQSxDQUFDLENBQUNDLGNBQUY7QUFDQUYsTUFBQUEsYUFBYSxDQUFDSCxVQUFELEVBQWE7QUFDeEJFLFFBQUFBLGtCQUFrQixFQUFsQkE7QUFEd0IsT0FBYixDQUFiO0FBR0QsS0FqRkg7O0FBQUEsbUVBbUZpQixVQUFBSSxLQUFLLEVBQUk7QUFBQSx5QkFTbEIsTUFBS0wsS0FUYTtBQUFBLFVBRXBCTSw2QkFGb0IsZ0JBRXBCQSw2QkFGb0I7QUFBQSxVQUdwQkMsbUJBSG9CLGdCQUdwQkEsbUJBSG9CO0FBQUEsVUFJcEJDLHVCQUpvQixnQkFJcEJBLHVCQUpvQjtBQUFBLFVBS3BCUCxrQkFMb0IsZ0JBS3BCQSxrQkFMb0I7QUFBQSxVQU1wQlEsZUFOb0IsZ0JBTXBCQSxlQU5vQjtBQUFBLFVBT3BCUCxhQVBvQixnQkFPcEJBLGFBUG9CO0FBQUEsVUFRcEJRLGNBUm9CLGdCQVFwQkEsY0FSb0I7O0FBV3RCLFVBQU1DLE9BQU87QUFDWEwsUUFBQUEsNkJBQTZCLEVBQTdCQTtBQURXLFNBRVAsQ0FBQ0MsbUJBQW1CLElBQ3RCQyx1QkFERyxJQUVIQyxlQUZFLEtBRWtCO0FBQ3BCRyxRQUFBQSxRQUFRLEVBQUVGLGNBQWMsSUFBSTtBQURSLE9BSlg7QUFPWFQsUUFBQUEsa0JBQWtCLEVBQWxCQSxrQkFQVztBQVFYWSxRQUFBQSxPQUFPLEVBQUUsQ0FBQyxDQUFDSixlQVJBO0FBU1hGLFFBQUFBLG1CQUFtQixFQUFFLENBQUMsQ0FBQ0EsbUJBVFo7QUFVWEMsUUFBQUEsdUJBQXVCLEVBQUUsQ0FBQyxDQUFDQTtBQVZoQixRQUFiOztBQWFBTixNQUFBQSxhQUFhLENBQUNHLEtBQUQsRUFBUU0sT0FBUixDQUFiO0FBQ0QsS0E1R0g7O0FBQUEsdUZBOEdxQyxVQUFBRyxTQUFTLEVBQUk7QUFBQSx5QkFDaUIsTUFBS2QsS0FEdEI7QUFBQSxVQUN0Q08sbUJBRHNDLGdCQUN0Q0EsbUJBRHNDO0FBQUEsVUFDakJRLDZCQURpQixnQkFDakJBLDZCQURpQixFQUU5QztBQUNBOztBQUNBLFVBQ0VSLG1CQUFtQixJQUNuQkEsbUJBQW1CLENBQUNTLHVCQUFwQixLQUFnRCxLQURoRCxJQUVBLENBQUNGLFNBQVMsQ0FBQ0csVUFIYixFQUlFO0FBQUEsb0NBQ2tDVixtQkFEbEMsQ0FDUVcsZ0JBRFI7QUFBQSxZQUNRQSxnQkFEUixzQ0FDMkIsRUFEM0I7QUFFQSxZQUFNQyxFQUFFLEdBQUdMLFNBQVMsQ0FBQ0ssRUFBVixDQUFhQyxHQUF4QjtBQUNBTCxRQUFBQSw2QkFBNkIsQ0FBQ0ksRUFBRCxFQUFLRCxnQkFBTCxDQUE3QjtBQUNEO0FBQ0YsS0EzSEg7O0FBQUEsa0ZBNkhnQyxVQUFBSixTQUFTLEVBQUk7QUFBQSxVQUNqQ1AsbUJBRGlDLEdBQ1QsTUFBS1AsS0FESSxDQUNqQ08sbUJBRGlDOztBQUd6QyxZQUFLYyxnQ0FBTCxDQUFzQ1AsU0FBdEM7O0FBQ0EsVUFBSSxDQUFDQSxTQUFTLENBQUNHLFVBQWYsRUFBMkI7QUFDekIsWUFBTUssR0FBRyxHQUFHUixTQUFTLENBQUNQLG1CQUFtQixDQUFDZ0IsUUFBckIsQ0FBVCxHQUNSVCxTQUFTLENBQUNQLG1CQUFtQixDQUFDZ0IsUUFBckIsQ0FBVCxDQUF3Q0gsR0FEaEMsR0FFUixFQUZKOztBQUdBLFlBQUlFLEdBQUosRUFBUztBQUNQLGNBQU1FLE1BQU0sR0FBR2pCLG1CQUFtQixDQUFDa0IsVUFBcEIsSUFBa0MsT0FBakQ7QUFDQUMsVUFBQUEsTUFBTSxDQUFDQyxJQUFQLENBQVlMLEdBQVosRUFBaUJFLE1BQWpCO0FBQ0Q7QUFDRixPQVJELE1BUU87QUFDTCxjQUFLSSxrQkFBTCxDQUF3QmQsU0FBUyxDQUFDRyxVQUFsQztBQUNEO0FBQ0YsS0E1SUg7O0FBQUE7QUFBQTs7QUFBQTtBQUFBO0FBQUEsNkJBOElXO0FBQUE7O0FBQUEsVUFDQ3BCLFNBREQsR0FDZSxLQUFLZ0MsS0FEcEIsQ0FDQ2hDLFNBREQ7O0FBQUEseUJBaUJILEtBQUtHLEtBakJGO0FBQUEsVUFHTE0sNkJBSEssZ0JBR0xBLDZCQUhLO0FBQUEsVUFJTEMsbUJBSkssZ0JBSUxBLG1CQUpLO0FBQUEsVUFLTEMsdUJBTEssZ0JBS0xBLHVCQUxLO0FBQUEsVUFNTHNCLG9CQU5LLGdCQU1MQSxvQkFOSztBQUFBLFVBT0xDLHdCQVBLLGdCQU9MQSx3QkFQSztBQUFBLFVBUUxDLFNBUkssZ0JBUUxBLFNBUks7QUFBQSxVQVNMQyxnQkFUSyxnQkFTTEEsZ0JBVEs7QUFBQSxVQVVMQyxVQVZLLGdCQVVMQSxVQVZLO0FBQUEsVUFXTEMsU0FYSyxnQkFXTEEsU0FYSztBQUFBLFVBWUxDLG9CQVpLLGdCQVlMQSxvQkFaSztBQUFBLFVBYUxDLFFBYkssZ0JBYUxBLFFBYks7QUFBQSxVQWNMdEMsVUFkSyxnQkFjTEEsVUFkSztBQUFBLFVBZUx1QyxJQWZLLGdCQWVMQSxJQWZLO0FBQUEsVUFnQkZDLElBaEJFOztBQW1CUCxVQUFNQyxJQUFJLEdBQUdGLElBQUksSUFBSTlDLFNBQXJCO0FBQ0EsVUFBTWlELGVBQWUsR0FDbkIsQ0FBQyxDQUFDLENBQUNsQyxtQkFBRixJQUF5QixDQUFDLENBQUNDLHVCQUE1QixLQUNBVCxVQUFVLENBQUMyQyxNQUFYLElBQXFCcEMsNkJBRnZCO0FBR0EsVUFBTXFDLDZCQUE2QixHQUFHQyxNQUFNLENBQUNDLE9BQVAsQ0FDcENkLHdCQURvQyxDQUVwQztBQUZvQyxRQUdwQ2UsTUFIb0MsQ0FHN0IsVUFBQ0MsR0FBRDtBQUFBO0FBQUEsWUFBT0MsQ0FBUDtBQUFBLFlBQVUzQyxLQUFWOztBQUFBLGVBQXFCMEMsR0FBRyxHQUFHMUMsS0FBSyxDQUFDcUMsTUFBakM7QUFBQSxPQUg2QixFQUdZLENBSFosQ0FBdEM7QUFJQSxVQUFNTywwQkFBMEIsR0FDOUJOLDZCQUE2QixHQUFHYixvQkFBb0IsQ0FBQ1ksTUFEdkQ7QUFHQSxVQUFJUSwwQkFBSjs7QUFDQSxVQUFJZCxvQkFBSixFQUEwQjtBQUN4QmMsUUFBQUEsMEJBQTBCLEdBQUcsb0NBQUFwQyxTQUFTLEVBQUk7QUFDeENzQixVQUFBQSxvQkFBb0IsQ0FDbEJ0QixTQURrQixFQUVsQjtBQUNFcUMsWUFBQUEsMEJBQTBCLEVBQUUsTUFBSSxDQUFDOUIsZ0NBRG5DO0FBRUVPLFlBQUFBLGtCQUFrQixFQUFFLE1BQUksQ0FBQ0Esa0JBRjNCO0FBR0VyQixZQUFBQSxtQkFBbUIsRUFBRSxNQUFJLENBQUNQLEtBQUwsQ0FBV087QUFIbEMsV0FGa0IsRUFPbEIsTUFBSSxDQUFDNkMsMkJBUGEsQ0FBcEI7QUFTRCxTQVZEO0FBV0Q7O0FBRUQsYUFBT1osSUFBSTtBQUNUUyxRQUFBQSwwQkFBMEIsRUFBRUEsMEJBRG5CO0FBRVRoQixRQUFBQSxnQkFBZ0IsRUFBaEJBLGdCQUZTO0FBR1QxQixRQUFBQSxtQkFBbUIsRUFBRUEsbUJBSFo7QUFJVEMsUUFBQUEsdUJBQXVCLEVBQUVBLHVCQUpoQjtBQUtUc0IsUUFBQUEsb0JBQW9CLEVBQUVBLG9CQUxiO0FBTVRDLFFBQUFBLHdCQUF3QixFQUFFQSx3QkFOakI7QUFPVEMsUUFBQUEsU0FBUyxFQUFUQSxTQVBTO0FBUVRXLFFBQUFBLDZCQUE2QixFQUFFQSw2QkFSdEI7QUFTVGYsUUFBQUEsa0JBQWtCLEVBQUUsS0FBS0Esa0JBVGhCO0FBVVQvQixRQUFBQSxTQUFTLEVBQUVBLFNBVkY7QUFXVHNELFFBQUFBLDBCQUEwQixFQUFFLEtBQUs5QixnQ0FYeEI7QUFZVGdDLFFBQUFBLFFBQVEsRUFBRSxrQkFBQWhELEtBQUs7QUFBQSxpQkFBSSxNQUFJLENBQUNpRCxZQUFMLENBQWtCakQsS0FBbEIsQ0FBSjtBQUFBLFNBWk47QUFhVCtCLFFBQUFBLG9CQUFvQixFQUNsQmMsMEJBQTBCLElBQUksS0FBS0UsMkJBZDVCO0FBZVRmLFFBQUFBLFFBQVEsRUFBRUEsUUFBUSxHQUNkLFVBQUFsQyxDQUFDLEVBQUk7QUFDSEEsVUFBQUEsQ0FBQyxDQUFDQyxjQUFGO0FBQ0FpQyxVQUFBQSxRQUFRLENBQUN0QyxVQUFELENBQVI7QUFDRCxTQUphLEdBS2QsS0FBS3dELFlBcEJBO0FBcUJUZCxRQUFBQSxlQUFlLEVBQUVBLGVBckJSO0FBc0JUcEMsUUFBQUEsS0FBSyxFQUFFTixVQXRCRTtBQXVCVG1DLFFBQUFBLFVBQVU7QUFDUnNCLFVBQUFBLE9BQU8sRUFBRSxLQUFLQyxXQUROO0FBRVJDLFVBQUFBLE1BQU0sRUFBRSxLQUFLQztBQUZMLFdBR0x6QixVQUhLLENBdkJEO0FBNEJUQyxRQUFBQSxTQUFTLEVBQVRBO0FBNUJTLFNBNkJOSSxJQTdCTSxFQUFYO0FBK0JEO0FBMU5IOztBQUFBO0FBQUEsRUFBd0NoRCxTQUF4Qzs7Z0JBQWFLLGtCLGVBQ1E7QUFDakI7QUFDQVUsRUFBQUEsNkJBQTZCLEVBQUVoQixTQUFTLENBQUNzRSxNQUZ4QjtBQUdqQnJELEVBQUFBLG1CQUFtQixFQUFFakIsU0FBUyxDQUFDdUUsU0FBVixDQUFvQixDQUN2Q3ZFLFNBQVMsQ0FBQ3dFLElBRDZCLEVBRXZDeEUsU0FBUyxDQUFDeUUsS0FBVixDQUFnQjtBQUNkN0MsSUFBQUEsZ0JBQWdCLEVBQUU1QixTQUFTLENBQUMwRSxPQUFWLENBQWtCMUUsU0FBUyxDQUFDMkUsTUFBNUIsQ0FESjtBQUVkeEMsSUFBQUEsVUFBVSxFQUFFbkMsU0FBUyxDQUFDMkUsTUFGUjtBQUdkQyxJQUFBQSxZQUFZLEVBQUU1RSxTQUFTLENBQUMyRSxNQUhWO0FBSWRqRCxJQUFBQSx1QkFBdUIsRUFBRTFCLFNBQVMsQ0FBQ3dFLElBSnJCO0FBS2RLLElBQUFBLFVBQVUsRUFBRTdFLFNBQVMsQ0FBQzJFLE1BQVYsQ0FBaUJHLFVBTGY7QUFNZDdDLElBQUFBLFFBQVEsRUFBRWpDLFNBQVMsQ0FBQzJFLE1BQVYsQ0FBaUJHO0FBTmIsR0FBaEIsQ0FGdUMsQ0FBcEIsQ0FISjtBQWNqQjVELEVBQUFBLHVCQUF1QixFQUFFbEIsU0FBUyxDQUFDdUUsU0FBVixDQUFvQixDQUMzQ3ZFLFNBQVMsQ0FBQ3dFLElBRGlDLEVBRTNDeEUsU0FBUyxDQUFDK0UsS0FBVixDQUFnQjtBQUNkSCxJQUFBQSxZQUFZLEVBQUU1RSxTQUFTLENBQUMyRTtBQURWLEdBQWhCLENBRjJDLEVBSzNDM0UsU0FBUyxDQUFDZ0YsUUFBVixDQUNFaEYsU0FBUyxDQUFDK0UsS0FBVixDQUFnQjtBQUNkSCxJQUFBQSxZQUFZLEVBQUU1RSxTQUFTLENBQUMyRTtBQURWLEdBQWhCLENBREYsQ0FMMkMsQ0FBcEIsQ0FkUjtBQXlCakJoQyxFQUFBQSxnQkFBZ0IsRUFBRTNDLFNBQVMsQ0FBQ2lGLElBekJYO0FBMEJqQnZDLEVBQUFBLFNBQVMsRUFBRTFDLFNBQVMsQ0FBQzJFLE1BMUJKO0FBMkJqQmhFLEVBQUFBLGtCQUFrQixFQUFFWCxTQUFTLENBQUN3RSxJQTNCYjtBQTRCakJwRCxFQUFBQSxjQUFjLEVBQUVwQixTQUFTLENBQUNzRSxNQTVCVDtBQTZCakIxQixFQUFBQSxVQUFVLEVBQUU1QyxTQUFTLENBQUNrRixNQTdCTDtBQThCakJyQyxFQUFBQSxTQUFTLEVBQUU3QyxTQUFTLENBQUNpRixJQTlCSjtBQStCakJuQyxFQUFBQSxvQkFBb0IsRUFBRTlDLFNBQVMsQ0FBQ2lGLElBL0JmO0FBZ0NqQmxDLEVBQUFBLFFBQVEsRUFBRS9DLFNBQVMsQ0FBQ2lGLElBaENIO0FBaUNqQjlELEVBQUFBLGVBQWUsRUFBRW5CLFNBQVMsQ0FBQ3dFLElBakNWO0FBa0NqQnhCLEVBQUFBLElBQUksRUFBRWhELFNBQVMsQ0FBQ2lGLElBbENDO0FBbUNqQjtBQUNBekMsRUFBQUEsb0JBQW9CLEVBQUV4QyxTQUFTLENBQUMwRSxPQUFWLENBQWtCdEUsTUFBbEIsRUFBMEIwRSxVQXBDL0I7QUFxQ2pCckMsRUFBQUEsd0JBQXdCLEVBQUV6QyxTQUFTLENBQUNnRixRQUFWLENBQW1CaEYsU0FBUyxDQUFDMEUsT0FBVixDQUFrQnJFLFVBQWxCLENBQW5CLEVBQ3ZCeUUsVUF0Q2M7QUF1Q2pCckUsRUFBQUEsVUFBVSxFQUFFVCxTQUFTLENBQUMyRSxNQUFWLENBQWlCRyxVQXZDWjtBQXdDakI7QUFDQWxFLEVBQUFBLGFBQWEsRUFBRVosU0FBUyxDQUFDaUYsSUFBVixDQUFlSCxVQXpDYjtBQTBDakJyRCxFQUFBQSw2QkFBNkIsRUFBRXpCLFNBQVMsQ0FBQ2lGLElBQVYsQ0FBZUg7QUExQzdCLEM7O2dCQURSeEUsa0Isa0JBOENXO0FBQ3BCVSxFQUFBQSw2QkFBNkIsRUFBRSxDQURYO0FBRXBCTCxFQUFBQSxrQkFBa0IsRUFBRTtBQUZBLEM7O0FBK0t4QixlQUFlUixVQUFVLENBQ3ZCO0FBQUEsTUFDRXFDLG9CQURGLFNBQ0VBLG9CQURGO0FBQUEsTUFFRUMsd0JBRkYsU0FFRUEsd0JBRkY7QUFBQSxNQUdFaEMsVUFIRixTQUdFQSxVQUhGO0FBQUEsTUFJRUcsYUFKRixTQUlFQSxhQUpGO0FBQUEsTUFLRWEsNkJBTEYsU0FLRUEsNkJBTEY7QUFBQSxTQU1PO0FBQ0xlLElBQUFBLG9CQUFvQixFQUFwQkEsb0JBREs7QUFFTEMsSUFBQUEsd0JBQXdCLEVBQXhCQSx3QkFGSztBQUdMaEMsSUFBQUEsVUFBVSxFQUFWQSxVQUhLO0FBSUxHLElBQUFBLGFBQWEsRUFBYkEsYUFKSztBQUtMYSxJQUFBQSw2QkFBNkIsRUFBN0JBO0FBTEssR0FOUDtBQUFBLENBRHVCLENBQVYsQ0FjYm5CLGtCQWRhLENBQWYiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgUHJvcFR5cGVzIGZyb20gXCJwcm9wLXR5cGVzXCI7XG5pbXBvcnQgeyBDb21wb25lbnQgfSBmcm9tIFwicmVhY3RcIjtcbmltcG9ydCB7IFNlYXJjaEJveCB9IGZyb20gXCJAZWxhc3RpYy9yZWFjdC1zZWFyY2gtdWktdmlld3NcIjtcblxuaW1wb3J0IHsgd2l0aFNlYXJjaCB9IGZyb20gXCIuLlwiO1xuaW1wb3J0IHsgUmVzdWx0LCBTdWdnZXN0aW9uIH0gZnJvbSBcIi4uL3R5cGVzXCI7XG5cbmV4cG9ydCBjbGFzcyBTZWFyY2hCb3hDb250YWluZXIgZXh0ZW5kcyBDb21wb25lbnQge1xuICBzdGF0aWMgcHJvcFR5cGVzID0ge1xuICAgIC8vIFByb3BzXG4gICAgYXV0b2NvbXBsZXRlTWluaW11bUNoYXJhY3RlcnM6IFByb3BUeXBlcy5udW1iZXIsXG4gICAgYXV0b2NvbXBsZXRlUmVzdWx0czogUHJvcFR5cGVzLm9uZU9mVHlwZShbXG4gICAgICBQcm9wVHlwZXMuYm9vbCxcbiAgICAgIFByb3BUeXBlcy5zaGFwZSh7XG4gICAgICAgIGNsaWNrVGhyb3VnaFRhZ3M6IFByb3BUeXBlcy5hcnJheU9mKFByb3BUeXBlcy5zdHJpbmcpLFxuICAgICAgICBsaW5rVGFyZ2V0OiBQcm9wVHlwZXMuc3RyaW5nLFxuICAgICAgICBzZWN0aW9uVGl0bGU6IFByb3BUeXBlcy5zdHJpbmcsXG4gICAgICAgIHNob3VsZFRyYWNrQ2xpY2tUaHJvdWdoOiBQcm9wVHlwZXMuYm9vbCxcbiAgICAgICAgdGl0bGVGaWVsZDogUHJvcFR5cGVzLnN0cmluZy5pc1JlcXVpcmVkLFxuICAgICAgICB1cmxGaWVsZDogUHJvcFR5cGVzLnN0cmluZy5pc1JlcXVpcmVkXG4gICAgICB9KVxuICAgIF0pLFxuICAgIGF1dG9jb21wbGV0ZVN1Z2dlc3Rpb25zOiBQcm9wVHlwZXMub25lT2ZUeXBlKFtcbiAgICAgIFByb3BUeXBlcy5ib29sLFxuICAgICAgUHJvcFR5cGVzLmV4YWN0KHtcbiAgICAgICAgc2VjdGlvblRpdGxlOiBQcm9wVHlwZXMuc3RyaW5nXG4gICAgICB9KSxcbiAgICAgIFByb3BUeXBlcy5vYmplY3RPZihcbiAgICAgICAgUHJvcFR5cGVzLmV4YWN0KHtcbiAgICAgICAgICBzZWN0aW9uVGl0bGU6IFByb3BUeXBlcy5zdHJpbmdcbiAgICAgICAgfSlcbiAgICAgIClcbiAgICBdKSxcbiAgICBhdXRvY29tcGxldGVWaWV3OiBQcm9wVHlwZXMuZnVuYyxcbiAgICBjbGFzc05hbWU6IFByb3BUeXBlcy5zdHJpbmcsXG4gICAgc2hvdWxkQ2xlYXJGaWx0ZXJzOiBQcm9wVHlwZXMuYm9vbCxcbiAgICBkZWJvdW5jZUxlbmd0aDogUHJvcFR5cGVzLm51bWJlcixcbiAgICBpbnB1dFByb3BzOiBQcm9wVHlwZXMub2JqZWN0LFxuICAgIGlucHV0VmlldzogUHJvcFR5cGVzLmZ1bmMsXG4gICAgb25TZWxlY3RBdXRvY29tcGxldGU6IFByb3BUeXBlcy5mdW5jLFxuICAgIG9uU3VibWl0OiBQcm9wVHlwZXMuZnVuYyxcbiAgICBzZWFyY2hBc1lvdVR5cGU6IFByb3BUeXBlcy5ib29sLFxuICAgIHZpZXc6IFByb3BUeXBlcy5mdW5jLFxuICAgIC8vIFN0YXRlXG4gICAgYXV0b2NvbXBsZXRlZFJlc3VsdHM6IFByb3BUeXBlcy5hcnJheU9mKFJlc3VsdCkuaXNSZXF1aXJlZCxcbiAgICBhdXRvY29tcGxldGVkU3VnZ2VzdGlvbnM6IFByb3BUeXBlcy5vYmplY3RPZihQcm9wVHlwZXMuYXJyYXlPZihTdWdnZXN0aW9uKSlcbiAgICAgIC5pc1JlcXVpcmVkLFxuICAgIHNlYXJjaFRlcm06IFByb3BUeXBlcy5zdHJpbmcuaXNSZXF1aXJlZCxcbiAgICAvLyBBY3Rpb25zXG4gICAgc2V0U2VhcmNoVGVybTogUHJvcFR5cGVzLmZ1bmMuaXNSZXF1aXJlZCxcbiAgICB0cmFja0F1dG9jb21wbGV0ZUNsaWNrVGhyb3VnaDogUHJvcFR5cGVzLmZ1bmMuaXNSZXF1aXJlZFxuICB9O1xuXG4gIHN0YXRpYyBkZWZhdWx0UHJvcHMgPSB7XG4gICAgYXV0b2NvbXBsZXRlTWluaW11bUNoYXJhY3RlcnM6IDAsXG4gICAgc2hvdWxkQ2xlYXJGaWx0ZXJzOiB0cnVlXG4gIH07XG5cbiAgc3RhdGUgPSB7XG4gICAgaXNGb2N1c2VkOiBmYWxzZVxuICB9O1xuXG4gIGhhbmRsZUZvY3VzID0gKCkgPT4ge1xuICAgIHRoaXMuc2V0U3RhdGUoe1xuICAgICAgaXNGb2N1c2VkOiB0cnVlXG4gICAgfSk7XG4gIH07XG5cbiAgaGFuZGxlQmx1ciA9ICgpID0+IHtcbiAgICB0aGlzLnNldFN0YXRlKHtcbiAgICAgIGlzRm9jdXNlZDogZmFsc2VcbiAgICB9KTtcbiAgfTtcblxuICBjb21wbGV0ZVN1Z2dlc3Rpb24gPSBzZWFyY2hUZXJtID0+IHtcbiAgICBjb25zdCB7IHNob3VsZENsZWFyRmlsdGVycywgc2V0U2VhcmNoVGVybSB9ID0gdGhpcy5wcm9wcztcbiAgICBzZXRTZWFyY2hUZXJtKHNlYXJjaFRlcm0sIHtcbiAgICAgIHNob3VsZENsZWFyRmlsdGVyc1xuICAgIH0pO1xuICB9O1xuXG4gIGhhbmRsZVN1Ym1pdCA9IGUgPT4ge1xuICAgIGNvbnN0IHsgc2hvdWxkQ2xlYXJGaWx0ZXJzLCBzZWFyY2hUZXJtLCBzZXRTZWFyY2hUZXJtIH0gPSB0aGlzLnByb3BzO1xuXG4gICAgZS5wcmV2ZW50RGVmYXVsdCgpO1xuICAgIHNldFNlYXJjaFRlcm0oc2VhcmNoVGVybSwge1xuICAgICAgc2hvdWxkQ2xlYXJGaWx0ZXJzXG4gICAgfSk7XG4gIH07XG5cbiAgaGFuZGxlQ2hhbmdlID0gdmFsdWUgPT4ge1xuICAgIGNvbnN0IHtcbiAgICAgIGF1dG9jb21wbGV0ZU1pbmltdW1DaGFyYWN0ZXJzLFxuICAgICAgYXV0b2NvbXBsZXRlUmVzdWx0cyxcbiAgICAgIGF1dG9jb21wbGV0ZVN1Z2dlc3Rpb25zLFxuICAgICAgc2hvdWxkQ2xlYXJGaWx0ZXJzLFxuICAgICAgc2VhcmNoQXNZb3VUeXBlLFxuICAgICAgc2V0U2VhcmNoVGVybSxcbiAgICAgIGRlYm91bmNlTGVuZ3RoXG4gICAgfSA9IHRoaXMucHJvcHM7XG5cbiAgICBjb25zdCBvcHRpb25zID0ge1xuICAgICAgYXV0b2NvbXBsZXRlTWluaW11bUNoYXJhY3RlcnMsXG4gICAgICAuLi4oKGF1dG9jb21wbGV0ZVJlc3VsdHMgfHxcbiAgICAgICAgYXV0b2NvbXBsZXRlU3VnZ2VzdGlvbnMgfHxcbiAgICAgICAgc2VhcmNoQXNZb3VUeXBlKSAmJiB7XG4gICAgICAgIGRlYm91bmNlOiBkZWJvdW5jZUxlbmd0aCB8fCAyMDBcbiAgICAgIH0pLFxuICAgICAgc2hvdWxkQ2xlYXJGaWx0ZXJzLFxuICAgICAgcmVmcmVzaDogISFzZWFyY2hBc1lvdVR5cGUsXG4gICAgICBhdXRvY29tcGxldGVSZXN1bHRzOiAhIWF1dG9jb21wbGV0ZVJlc3VsdHMsXG4gICAgICBhdXRvY29tcGxldGVTdWdnZXN0aW9uczogISFhdXRvY29tcGxldGVTdWdnZXN0aW9uc1xuICAgIH07XG5cbiAgICBzZXRTZWFyY2hUZXJtKHZhbHVlLCBvcHRpb25zKTtcbiAgfTtcblxuICBoYW5kbGVOb3RpZnlBdXRvY29tcGxldGVTZWxlY3RlZCA9IHNlbGVjdGlvbiA9PiB7XG4gICAgY29uc3QgeyBhdXRvY29tcGxldGVSZXN1bHRzLCB0cmFja0F1dG9jb21wbGV0ZUNsaWNrVGhyb3VnaCB9ID0gdGhpcy5wcm9wcztcbiAgICAvLyBCZWNhdXNlIHN1Z2dlc3Rpb25zIGRvbid0IGNvdW50IGFzIGNsaWNrdGhyb3VnaHMsIG9ubHlcbiAgICAvLyByZXN1bHRzXG4gICAgaWYgKFxuICAgICAgYXV0b2NvbXBsZXRlUmVzdWx0cyAmJlxuICAgICAgYXV0b2NvbXBsZXRlUmVzdWx0cy5zaG91bGRUcmFja0NsaWNrVGhyb3VnaCAhPT0gZmFsc2UgJiZcbiAgICAgICFzZWxlY3Rpb24uc3VnZ2VzdGlvblxuICAgICkge1xuICAgICAgY29uc3QgeyBjbGlja1Rocm91Z2hUYWdzID0gW10gfSA9IGF1dG9jb21wbGV0ZVJlc3VsdHM7XG4gICAgICBjb25zdCBpZCA9IHNlbGVjdGlvbi5pZC5yYXc7XG4gICAgICB0cmFja0F1dG9jb21wbGV0ZUNsaWNrVGhyb3VnaChpZCwgY2xpY2tUaHJvdWdoVGFncyk7XG4gICAgfVxuICB9O1xuXG4gIGRlZmF1bHRPblNlbGVjdEF1dG9jb21wbGV0ZSA9IHNlbGVjdGlvbiA9PiB7XG4gICAgY29uc3QgeyBhdXRvY29tcGxldGVSZXN1bHRzIH0gPSB0aGlzLnByb3BzO1xuXG4gICAgdGhpcy5oYW5kbGVOb3RpZnlBdXRvY29tcGxldGVTZWxlY3RlZChzZWxlY3Rpb24pO1xuICAgIGlmICghc2VsZWN0aW9uLnN1Z2dlc3Rpb24pIHtcbiAgICAgIGNvbnN0IHVybCA9IHNlbGVjdGlvblthdXRvY29tcGxldGVSZXN1bHRzLnVybEZpZWxkXVxuICAgICAgICA/IHNlbGVjdGlvblthdXRvY29tcGxldGVSZXN1bHRzLnVybEZpZWxkXS5yYXdcbiAgICAgICAgOiBcIlwiO1xuICAgICAgaWYgKHVybCkge1xuICAgICAgICBjb25zdCB0YXJnZXQgPSBhdXRvY29tcGxldGVSZXN1bHRzLmxpbmtUYXJnZXQgfHwgXCJfc2VsZlwiO1xuICAgICAgICB3aW5kb3cub3Blbih1cmwsIHRhcmdldCk7XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuY29tcGxldGVTdWdnZXN0aW9uKHNlbGVjdGlvbi5zdWdnZXN0aW9uKTtcbiAgICB9XG4gIH07XG5cbiAgcmVuZGVyKCkge1xuICAgIGNvbnN0IHsgaXNGb2N1c2VkIH0gPSB0aGlzLnN0YXRlO1xuICAgIGNvbnN0IHtcbiAgICAgIGF1dG9jb21wbGV0ZU1pbmltdW1DaGFyYWN0ZXJzLFxuICAgICAgYXV0b2NvbXBsZXRlUmVzdWx0cyxcbiAgICAgIGF1dG9jb21wbGV0ZVN1Z2dlc3Rpb25zLFxuICAgICAgYXV0b2NvbXBsZXRlZFJlc3VsdHMsXG4gICAgICBhdXRvY29tcGxldGVkU3VnZ2VzdGlvbnMsXG4gICAgICBjbGFzc05hbWUsXG4gICAgICBhdXRvY29tcGxldGVWaWV3LFxuICAgICAgaW5wdXRQcm9wcyxcbiAgICAgIGlucHV0VmlldyxcbiAgICAgIG9uU2VsZWN0QXV0b2NvbXBsZXRlLFxuICAgICAgb25TdWJtaXQsXG4gICAgICBzZWFyY2hUZXJtLFxuICAgICAgdmlldyxcbiAgICAgIC4uLnJlc3RcbiAgICB9ID0gdGhpcy5wcm9wcztcblxuICAgIGNvbnN0IFZpZXcgPSB2aWV3IHx8IFNlYXJjaEJveDtcbiAgICBjb25zdCB1c2VBdXRvY29tcGxldGUgPVxuICAgICAgKCEhYXV0b2NvbXBsZXRlUmVzdWx0cyB8fCAhIWF1dG9jb21wbGV0ZVN1Z2dlc3Rpb25zKSAmJlxuICAgICAgc2VhcmNoVGVybS5sZW5ndGggPj0gYXV0b2NvbXBsZXRlTWluaW11bUNoYXJhY3RlcnM7XG4gICAgY29uc3QgYXV0b2NvbXBsZXRlZFN1Z2dlc3Rpb25zQ291bnQgPSBPYmplY3QuZW50cmllcyhcbiAgICAgIGF1dG9jb21wbGV0ZWRTdWdnZXN0aW9uc1xuICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLXVudXNlZC12YXJzXG4gICAgKS5yZWR1Y2UoKGFjYywgW18sIHZhbHVlXSkgPT4gYWNjICsgdmFsdWUubGVuZ3RoLCAwKTtcbiAgICBjb25zdCBhbGxBdXRvY29tcGxldGVkSXRlbXNDb3VudCA9XG4gICAgICBhdXRvY29tcGxldGVkU3VnZ2VzdGlvbnNDb3VudCArIGF1dG9jb21wbGV0ZWRSZXN1bHRzLmxlbmd0aDtcblxuICAgIGxldCBoYW5kbGVPblNlbGVjdEF1dG9jb21wbGV0ZTtcbiAgICBpZiAob25TZWxlY3RBdXRvY29tcGxldGUpIHtcbiAgICAgIGhhbmRsZU9uU2VsZWN0QXV0b2NvbXBsZXRlID0gc2VsZWN0aW9uID0+IHtcbiAgICAgICAgb25TZWxlY3RBdXRvY29tcGxldGUoXG4gICAgICAgICAgc2VsZWN0aW9uLFxuICAgICAgICAgIHtcbiAgICAgICAgICAgIG5vdGlmeUF1dG9jb21wbGV0ZVNlbGVjdGVkOiB0aGlzLmhhbmRsZU5vdGlmeUF1dG9jb21wbGV0ZVNlbGVjdGVkLFxuICAgICAgICAgICAgY29tcGxldGVTdWdnZXN0aW9uOiB0aGlzLmNvbXBsZXRlU3VnZ2VzdGlvbixcbiAgICAgICAgICAgIGF1dG9jb21wbGV0ZVJlc3VsdHM6IHRoaXMucHJvcHMuYXV0b2NvbXBsZXRlUmVzdWx0c1xuICAgICAgICAgIH0sXG4gICAgICAgICAgdGhpcy5kZWZhdWx0T25TZWxlY3RBdXRvY29tcGxldGVcbiAgICAgICAgKTtcbiAgICAgIH07XG4gICAgfVxuXG4gICAgcmV0dXJuIFZpZXcoe1xuICAgICAgYWxsQXV0b2NvbXBsZXRlZEl0ZW1zQ291bnQ6IGFsbEF1dG9jb21wbGV0ZWRJdGVtc0NvdW50LFxuICAgICAgYXV0b2NvbXBsZXRlVmlldyxcbiAgICAgIGF1dG9jb21wbGV0ZVJlc3VsdHM6IGF1dG9jb21wbGV0ZVJlc3VsdHMsXG4gICAgICBhdXRvY29tcGxldGVTdWdnZXN0aW9uczogYXV0b2NvbXBsZXRlU3VnZ2VzdGlvbnMsXG4gICAgICBhdXRvY29tcGxldGVkUmVzdWx0czogYXV0b2NvbXBsZXRlZFJlc3VsdHMsXG4gICAgICBhdXRvY29tcGxldGVkU3VnZ2VzdGlvbnM6IGF1dG9jb21wbGV0ZWRTdWdnZXN0aW9ucyxcbiAgICAgIGNsYXNzTmFtZSxcbiAgICAgIGF1dG9jb21wbGV0ZWRTdWdnZXN0aW9uc0NvdW50OiBhdXRvY29tcGxldGVkU3VnZ2VzdGlvbnNDb3VudCxcbiAgICAgIGNvbXBsZXRlU3VnZ2VzdGlvbjogdGhpcy5jb21wbGV0ZVN1Z2dlc3Rpb24sXG4gICAgICBpc0ZvY3VzZWQ6IGlzRm9jdXNlZCxcbiAgICAgIG5vdGlmeUF1dG9jb21wbGV0ZVNlbGVjdGVkOiB0aGlzLmhhbmRsZU5vdGlmeUF1dG9jb21wbGV0ZVNlbGVjdGVkLFxuICAgICAgb25DaGFuZ2U6IHZhbHVlID0+IHRoaXMuaGFuZGxlQ2hhbmdlKHZhbHVlKSxcbiAgICAgIG9uU2VsZWN0QXV0b2NvbXBsZXRlOlxuICAgICAgICBoYW5kbGVPblNlbGVjdEF1dG9jb21wbGV0ZSB8fCB0aGlzLmRlZmF1bHRPblNlbGVjdEF1dG9jb21wbGV0ZSxcbiAgICAgIG9uU3VibWl0OiBvblN1Ym1pdFxuICAgICAgICA/IGUgPT4ge1xuICAgICAgICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICAgICAgb25TdWJtaXQoc2VhcmNoVGVybSk7XG4gICAgICAgICAgfVxuICAgICAgICA6IHRoaXMuaGFuZGxlU3VibWl0LFxuICAgICAgdXNlQXV0b2NvbXBsZXRlOiB1c2VBdXRvY29tcGxldGUsXG4gICAgICB2YWx1ZTogc2VhcmNoVGVybSxcbiAgICAgIGlucHV0UHJvcHM6IHtcbiAgICAgICAgb25Gb2N1czogdGhpcy5oYW5kbGVGb2N1cyxcbiAgICAgICAgb25CbHVyOiB0aGlzLmhhbmRsZUJsdXIsXG4gICAgICAgIC4uLmlucHV0UHJvcHNcbiAgICAgIH0sXG4gICAgICBpbnB1dFZpZXcsXG4gICAgICAuLi5yZXN0XG4gICAgfSk7XG4gIH1cbn1cblxuZXhwb3J0IGRlZmF1bHQgd2l0aFNlYXJjaChcbiAgKHtcbiAgICBhdXRvY29tcGxldGVkUmVzdWx0cyxcbiAgICBhdXRvY29tcGxldGVkU3VnZ2VzdGlvbnMsXG4gICAgc2VhcmNoVGVybSxcbiAgICBzZXRTZWFyY2hUZXJtLFxuICAgIHRyYWNrQXV0b2NvbXBsZXRlQ2xpY2tUaHJvdWdoXG4gIH0pID0+ICh7XG4gICAgYXV0b2NvbXBsZXRlZFJlc3VsdHMsXG4gICAgYXV0b2NvbXBsZXRlZFN1Z2dlc3Rpb25zLFxuICAgIHNlYXJjaFRlcm0sXG4gICAgc2V0U2VhcmNoVGVybSxcbiAgICB0cmFja0F1dG9jb21wbGV0ZUNsaWNrVGhyb3VnaFxuICB9KVxuKShTZWFyY2hCb3hDb250YWluZXIpO1xuIl19