UNPKG

react-lightning-design-components

Version:

Salesforce Lightning Design System components built with React 16

451 lines (400 loc) 40.7 kB
'use strict'; Object.defineProperty(exports, "__esModule", { value: true }); exports.PicklistItem = undefined; var _extends2 = require('babel-runtime/helpers/extends'); var _extends3 = _interopRequireDefault(_extends2); var _objectWithoutProperties2 = require('babel-runtime/helpers/objectWithoutProperties'); var _objectWithoutProperties3 = _interopRequireDefault(_objectWithoutProperties2); var _getPrototypeOf = require('babel-runtime/core-js/object/get-prototype-of'); var _getPrototypeOf2 = _interopRequireDefault(_getPrototypeOf); var _classCallCheck2 = require('babel-runtime/helpers/classCallCheck'); var _classCallCheck3 = _interopRequireDefault(_classCallCheck2); var _createClass2 = require('babel-runtime/helpers/createClass'); var _createClass3 = _interopRequireDefault(_createClass2); var _possibleConstructorReturn2 = require('babel-runtime/helpers/possibleConstructorReturn'); var _possibleConstructorReturn3 = _interopRequireDefault(_possibleConstructorReturn2); var _inherits2 = require('babel-runtime/helpers/inherits'); var _inherits3 = _interopRequireDefault(_inherits2); var _react = require('react'); var _react2 = _interopRequireDefault(_react); var _propTypes = require('prop-types'); var _propTypes2 = _interopRequireDefault(_propTypes); var _reactDom = require('react-dom'); var _reactDom2 = _interopRequireDefault(_reactDom); var _classnames = require('classnames'); var _classnames2 = _interopRequireDefault(_classnames); var _uuid = require('uuid'); var _uuid2 = _interopRequireDefault(_uuid); var _FormElement = require('./FormElement'); var _FormElement2 = _interopRequireDefault(_FormElement); var _Icon = require('./Icon'); var _Icon2 = _interopRequireDefault(_Icon); var _DropdownMenu = require('./DropdownMenu'); var _DropdownMenu2 = _interopRequireDefault(_DropdownMenu); function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } var Picklist = function (_Component) { (0, _inherits3.default)(Picklist, _Component); function Picklist(props) { (0, _classCallCheck3.default)(this, Picklist); var _this = (0, _possibleConstructorReturn3.default)(this, (Picklist.__proto__ || (0, _getPrototypeOf2.default)(Picklist)).call(this, props)); _this.state = { id: 'form-element-' + (0, _uuid2.default)(), opened: props.defaultOpened, value: props.defaultValue }; _this.picklistButtonRef = _this.picklistButtonRef.bind(_this); _this.dropdownRef = _this.dropdownRef.bind(_this); return _this; } (0, _createClass3.default)(Picklist, [{ key: 'componentDidUpdate', value: function componentDidUpdate(prevProps, prevState) { if (this.props.onValueChange && prevState.value !== this.state.value) { this.props.onValueChange(this.state.value, prevState.value); } if (this.props.focusOnOpen && prevState.opened === false && this.state.opened === true) { this.focusToTargetItemEl(); } } }, { key: 'onClick', value: function onClick(e) { var onDropDownClick = this.props.onDropDownClick; this.setState(function (state) { return { opened: !state.opened }; }); if (onDropDownClick) onDropDownClick(e); } }, { key: 'onPicklistItemClick', value: function onPicklistItemClick(item, e) { var _this2 = this; this.setState({ value: item.value }); if (this.props.onChange) { this.props.onChange(e, item.value); } if (this.props.onSelect) { this.props.onSelect(item); } setTimeout(function () { _this2.setState({ opened: false }); if (_this2.props.onComplete) { _this2.props.onComplete(); } var picklistButtonEl = _reactDom2.default.findDOMNode(_this2.picklistButton); if (picklistButtonEl) { picklistButtonEl.focus(); } }, 200); e.preventDefault(); e.stopPropagation(); } }, { key: 'onPicklistClose', value: function onPicklistClose() { var picklistButtonEl = _reactDom2.default.findDOMNode(this.picklistButton); picklistButtonEl.focus(); this.setState({ opened: false }); } }, { key: 'onBlur', value: function onBlur() { var _this3 = this; setTimeout(function () { if (!_this3.isFocusedInComponent()) { _this3.setState({ opened: false }); if (_this3.props.onBlur) { _this3.props.onBlur(); } if (_this3.props.onComplete) { _this3.props.onComplete(); } } }, 10); } }, { key: 'onKeydown', value: function onKeydown(e) { if (e.keyCode === 40) { // down e.preventDefault(); e.stopPropagation(); if (!this.state.opened) { this.setState({ opened: true }); } else { this.focusToTargetItemEl(); } } else if (e.keyCode === 27) { // ESC e.preventDefault(); e.stopPropagation(); this.setState({ opened: false }); if (this.props.onComplete) { this.props.onComplete(); } } if (this.props.onKeyDown) { this.props.onKeyDown(e); } } }, { key: 'onDropdownScroll', value: function onDropdownScroll(page) { if (this.props.onScroll) { this.props.onScroll(page); } } }, { key: 'getSelectedValue', value: function getSelectedValue() { var _props = this.props, defaultValue = _props.defaultValue, value = _props.value; return typeof value !== 'undefined' ? value : typeof this.state.value !== 'undefined' ? this.state.value : defaultValue; } }, { key: 'getSelectedItemLabel', value: function getSelectedItemLabel() { var selectedValue = this.getSelectedValue(); var selected = null; _react2.default.Children.forEach(this.props.children, function (item) { if (item.props.value === selectedValue) { selected = item.props.label || item.props.children; } }); return selected || this.props.selectedText; } }, { key: 'isFocusedInComponent', value: function isFocusedInComponent() { var rootEl = _reactDom2.default.findDOMNode(this); var targetEl = document.activeElement; while (targetEl && targetEl !== rootEl) { targetEl = targetEl.parentNode; } return !!targetEl; } }, { key: 'focusToTargetItemEl', value: function focusToTargetItemEl() { var dropdownEl = _reactDom2.default.findDOMNode(this.dropdown); if (!dropdownEl) return; var firstItemEl = dropdownEl.querySelector('.slds-is-selected > .react-slds-menuitem[tabIndex]') || dropdownEl.querySelector('.react-slds-menuitem[tabIndex]'); if (firstItemEl) { firstItemEl.focus(); } } }, { key: 'picklistButtonRef', value: function picklistButtonRef(ref) { this.picklistButton = ref; } }, { key: 'dropdownRef', value: function dropdownRef(ref) { this.dropdown = ref; } }, { key: 'renderPicklist', value: function renderPicklist(props) { var className = props.className, id = props.id, htmlAttributes = props.htmlAttributes, buttonClassName = props.buttonClassName, pprops = (0, _objectWithoutProperties3.default)(props, ['className', 'id', 'htmlAttributes', 'buttonClassName']); delete pprops.initialValue; delete pprops.onUpdate; delete pprops.valid; delete pprops.invalid; delete pprops.dirty; delete pprops.pristine; delete pprops.active; delete pprops.touched; delete pprops.visited; delete pprops.maxHeight; delete pprops.onValueChange; delete pprops.defaultOpened; delete pprops.menuSize; delete pprops.selectedText; delete pprops.onBlur; delete pprops.hasMore; delete pprops.onScroll; delete pprops.resetPageLoader; delete pprops.pageStart; delete pprops.useNone; delete pprops.noneText; delete pprops.align; delete pprops.focusOnOpen; delete pprops.onDropDownClick; var picklistClassNames = (0, _classnames2.default)(className, 'slds-picklist'); return _react2.default.createElement( 'div', { className: picklistClassNames, 'aria-expanded': this.state.opened }, _react2.default.createElement( 'button', (0, _extends3.default)({ id: id, ref: this.picklistButtonRef, className: (0, _classnames2.default)('slds-picklist__label slds-button slds-button--neutral', buttonClassName), type: 'button', 'aria-haspopup': true, onClick: this.onClick.bind(this), onBlur: this.onBlur.bind(this), onKeyDown: this.onKeydown.bind(this) }, pprops), _react2.default.createElement( 'span', (0, _extends3.default)({ className: 'slds-truncate' }, htmlAttributes), this.getSelectedItemLabel() || _react2.default.createElement( 'span', null, '\xA0' ) ), _react2.default.createElement(_Icon2.default, { icon: 'down' }) ) ); } }, { key: 'renderNoneMenuItem', value: function renderNoneMenuItem() { var _props2 = this.props, required = _props2.required, noneText = _props2.noneText; return _react2.default.createElement(PicklistItem, { disabled: required, value: null, onBlur: this.onBlur.bind(this), selected: this.getSelectedValue() === null, label: noneText }); } }, { key: 'renderDropdown', value: function renderDropdown() { var _props3 = this.props, menuSize = _props3.menuSize, children = _props3.children, maxHeight = _props3.maxHeight, hasMore = _props3.hasMore, pageStart = _props3.pageStart, resetPageLoader = _props3.resetPageLoader, useNone = _props3.useNone, align = _props3.align; return this.state.opened ? _react2.default.createElement( _DropdownMenu2.default, { ref: this.dropdownRef, maxHeight: maxHeight, size: menuSize, onMenuItemClick: this.onPicklistItemClick.bind(this), onMenuClose: this.onPicklistClose.bind(this), hasMore: hasMore, pageStart: pageStart, resetPageLoader: resetPageLoader, onScroll: this.onDropdownScroll.bind(this), align: align, onBlur: this.onBlur.bind(this) }, useNone && this.renderNoneMenuItem(), _react2.default.Children.map(children, this.renderPicklistItem.bind(this)) ) : _react2.default.createElement('div', { ref: this.dropdownRef }); } }, { key: 'renderPicklistItem', value: function renderPicklistItem(item) { var selected = item.props.value === this.getSelectedValue(); var onBlur = this.onBlur.bind(this); return _react2.default.cloneElement(item, { selected: selected, onBlur: onBlur }); } }, { key: 'render', value: function render() { var id = this.props.id || this.state.id; var _props4 = this.props, label = _props4.label, required = _props4.required, error = _props4.error, totalCols = _props4.totalCols, cols = _props4.cols, tooltip = _props4.tooltip, props = (0, _objectWithoutProperties3.default)(_props4, ['label', 'required', 'error', 'totalCols', 'cols', 'tooltip']); var dropdown = this.renderDropdown(); var formElemProps = { id: id, label: label, required: required, error: error, totalCols: totalCols, cols: cols, dropdown: dropdown, tooltip: tooltip }; return _react2.default.createElement( _FormElement2.default, formElemProps, this.renderPicklist((0, _extends3.default)({}, props, { id: id })) ); } }]); return Picklist; }(_react.Component); exports.default = Picklist; Picklist.defaultProps = { maxHeight: 10, focusOnOpen: true }; Picklist.propTypes = { id: _propTypes2.default.string, className: _propTypes2.default.string, label: _propTypes2.default.string, required: _propTypes2.default.bool, error: _propTypes2.default.oneOfType([_propTypes2.default.bool, _propTypes2.default.string, _propTypes2.default.shape({ message: _propTypes2.default.string })]), totalCols: _propTypes2.default.number, cols: _propTypes2.default.number, name: _propTypes2.default.string, value: _propTypes2.default.any, defaultValue: _propTypes2.default.any, selectedText: _propTypes2.default.oneOfType([_propTypes2.default.string, _propTypes2.default.node]), defaultOpened: _propTypes2.default.bool, onChange: _propTypes2.default.func, onDropDownClick: _propTypes2.default.func, onValueChange: _propTypes2.default.func, onSelect: _propTypes2.default.func, onComplete: _propTypes2.default.func, onKeyDown: _propTypes2.default.func, onBlur: _propTypes2.default.func, menuSize: _propTypes2.default.string, children: _propTypes2.default.node, maxHeight: _propTypes2.default.oneOf([5, 7, 10]), htmlAttributes: _propTypes2.default.object, hasMore: _propTypes2.default.bool, pageStart: _propTypes2.default.number, resetPageLoader: _propTypes2.default.bool, onScroll: _propTypes2.default.func, useNone: _propTypes2.default.bool, noneText: _propTypes2.default.string, align: _propTypes2.default.oneOf(['left', 'center', 'right']), focusOnOpen: _propTypes2.default.bool, buttonClassName: _propTypes2.default.string, tooltip: _propTypes2.default.element }; Picklist.isFormElement = true; var PicklistItem = function PicklistItem(_ref) { var label = _ref.label, selected = _ref.selected, children = _ref.children, props = (0, _objectWithoutProperties3.default)(_ref, ['label', 'selected', 'children']); return _react2.default.createElement( _DropdownMenu.DropdownMenuItem, (0, _extends3.default)({ icon: selected ? 'check' : 'none', role: 'menuitemradio', selected: selected }, props), label || children ); }; exports.PicklistItem = PicklistItem; PicklistItem.propTypes = { label: _propTypes2.default.oneOfType([_propTypes2.default.string, _propTypes2.default.number]), selected: _propTypes2.default.bool, value: _propTypes2.default.any, children: _propTypes2.default.node }; //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9zY3JpcHRzL1BpY2tsaXN0LmpzIl0sIm5hbWVzIjpbIlBpY2tsaXN0IiwicHJvcHMiLCJzdGF0ZSIsImlkIiwib3BlbmVkIiwiZGVmYXVsdE9wZW5lZCIsInZhbHVlIiwiZGVmYXVsdFZhbHVlIiwicGlja2xpc3RCdXR0b25SZWYiLCJiaW5kIiwiZHJvcGRvd25SZWYiLCJwcmV2UHJvcHMiLCJwcmV2U3RhdGUiLCJvblZhbHVlQ2hhbmdlIiwiZm9jdXNPbk9wZW4iLCJmb2N1c1RvVGFyZ2V0SXRlbUVsIiwiZSIsIm9uRHJvcERvd25DbGljayIsInNldFN0YXRlIiwiaXRlbSIsIm9uQ2hhbmdlIiwib25TZWxlY3QiLCJzZXRUaW1lb3V0Iiwib25Db21wbGV0ZSIsInBpY2tsaXN0QnV0dG9uRWwiLCJmaW5kRE9NTm9kZSIsInBpY2tsaXN0QnV0dG9uIiwiZm9jdXMiLCJwcmV2ZW50RGVmYXVsdCIsInN0b3BQcm9wYWdhdGlvbiIsImlzRm9jdXNlZEluQ29tcG9uZW50Iiwib25CbHVyIiwia2V5Q29kZSIsIm9uS2V5RG93biIsInBhZ2UiLCJvblNjcm9sbCIsInNlbGVjdGVkVmFsdWUiLCJnZXRTZWxlY3RlZFZhbHVlIiwic2VsZWN0ZWQiLCJDaGlsZHJlbiIsImZvckVhY2giLCJjaGlsZHJlbiIsImxhYmVsIiwic2VsZWN0ZWRUZXh0Iiwicm9vdEVsIiwidGFyZ2V0RWwiLCJkb2N1bWVudCIsImFjdGl2ZUVsZW1lbnQiLCJwYXJlbnROb2RlIiwiZHJvcGRvd25FbCIsImRyb3Bkb3duIiwiZmlyc3RJdGVtRWwiLCJxdWVyeVNlbGVjdG9yIiwicmVmIiwiY2xhc3NOYW1lIiwiaHRtbEF0dHJpYnV0ZXMiLCJidXR0b25DbGFzc05hbWUiLCJwcHJvcHMiLCJpbml0aWFsVmFsdWUiLCJvblVwZGF0ZSIsInZhbGlkIiwiaW52YWxpZCIsImRpcnR5IiwicHJpc3RpbmUiLCJhY3RpdmUiLCJ0b3VjaGVkIiwidmlzaXRlZCIsIm1heEhlaWdodCIsIm1lbnVTaXplIiwiaGFzTW9yZSIsInJlc2V0UGFnZUxvYWRlciIsInBhZ2VTdGFydCIsInVzZU5vbmUiLCJub25lVGV4dCIsImFsaWduIiwicGlja2xpc3RDbGFzc05hbWVzIiwib25DbGljayIsIm9uS2V5ZG93biIsImdldFNlbGVjdGVkSXRlbUxhYmVsIiwicmVxdWlyZWQiLCJvblBpY2tsaXN0SXRlbUNsaWNrIiwib25QaWNrbGlzdENsb3NlIiwib25Ecm9wZG93blNjcm9sbCIsInJlbmRlck5vbmVNZW51SXRlbSIsIm1hcCIsInJlbmRlclBpY2tsaXN0SXRlbSIsImNsb25lRWxlbWVudCIsImVycm9yIiwidG90YWxDb2xzIiwiY29scyIsInRvb2x0aXAiLCJyZW5kZXJEcm9wZG93biIsImZvcm1FbGVtUHJvcHMiLCJyZW5kZXJQaWNrbGlzdCIsImRlZmF1bHRQcm9wcyIsInByb3BUeXBlcyIsInN0cmluZyIsImJvb2wiLCJvbmVPZlR5cGUiLCJzaGFwZSIsIm1lc3NhZ2UiLCJudW1iZXIiLCJuYW1lIiwiYW55Iiwibm9kZSIsImZ1bmMiLCJvbmVPZiIsIm9iamVjdCIsImVsZW1lbnQiLCJpc0Zvcm1FbGVtZW50IiwiUGlja2xpc3RJdGVtIl0sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQUFBOzs7O0FBQ0E7Ozs7QUFDQTs7OztBQUNBOzs7O0FBQ0E7Ozs7QUFDQTs7OztBQUNBOzs7O0FBQ0E7Ozs7OztJQUVxQkEsUTs7O0FBQ25CLG9CQUFZQyxLQUFaLEVBQW1CO0FBQUE7O0FBQUEsMElBQ1hBLEtBRFc7O0FBRWpCLFVBQUtDLEtBQUwsR0FBYTtBQUNYQyw0QkFBb0IscUJBRFQ7QUFFWEMsY0FBUUgsTUFBTUksYUFGSDtBQUdYQyxhQUFPTCxNQUFNTTtBQUhGLEtBQWI7QUFLQSxVQUFLQyxpQkFBTCxHQUF5QixNQUFLQSxpQkFBTCxDQUF1QkMsSUFBdkIsT0FBekI7QUFDQSxVQUFLQyxXQUFMLEdBQW1CLE1BQUtBLFdBQUwsQ0FBaUJELElBQWpCLE9BQW5C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L0QsWUFBVSxvQkFBVTJELElBRkc7QUFHdkIzRixTQUFPLG9CQUFVaUcsR0FITTtBQUl2QjlELFlBQVUsb0JBQVUrRDtBQUpHLENBQXpCIiwiZmlsZSI6IlBpY2tsaXN0LmpzIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IFJlYWN0LCB7IENvbXBvbmVudCB9IGZyb20gJ3JlYWN0JztcbmltcG9ydCBQcm9wVHlwZXMgZnJvbSAncHJvcC10eXBlcyc7XG5pbXBvcnQgUmVhY3RET00gZnJvbSAncmVhY3QtZG9tJztcbmltcG9ydCBjbGFzc25hbWVzIGZyb20gJ2NsYXNzbmFtZXMnO1xuaW1wb3J0IHV1aWQgZnJvbSAndXVpZCc7XG5pbXBvcnQgRm9ybUVsZW1lbnQgZnJvbSAnLi9Gb3JtRWxlbWVudCc7XG5pbXBvcnQgSWNvbiBmcm9tICcuL0ljb24nO1xuaW1wb3J0IHsgZGVmYXVsdCBhcyBEcm9wZG93bk1lbnUsIERyb3Bkb3duTWVudUl0ZW0gfSBmcm9tICcuL0Ryb3Bkb3duTWVudSc7XG5cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIFBpY2tsaXN0IGV4dGVuZHMgQ29tcG9uZW50IHtcbiAgY29uc3RydWN0b3IocHJvcHMpIHtcbiAgICBzdXBlcihwcm9wcyk7XG4gICAgdGhpcy5zdGF0ZSA9IHtcbiAgICAgIGlkOiBgZm9ybS1lbGVtZW50LSR7dXVpZCgpfWAsXG4gICAgICBvcGVuZWQ6IHByb3BzLmRlZmF1bHRPcGVuZWQsXG4gICAgICB2YWx1ZTogcHJvcHMuZGVmYXVsdFZhbHVlLFxuICAgIH07XG4gICAgdGhpcy5waWNrbGlzdEJ1dHRvblJlZiA9IHRoaXMucGlja2xpc3RCdXR0b25SZWYuYmluZCh0aGlzKTtcbiAgICB0aGlzLmRyb3Bkb3duUmVmID0gdGhpcy5kcm9wZG93blJlZi5iaW5kKHRoaXMpO1xuICB9XG5cbiAgY29tcG9uZW50RGlkVXBkYXRlKHByZXZQcm9wcywgcHJldlN0YXRlKSB7XG4gICAgaWYgKHRoaXMucHJvcHMub25WYWx1ZUNoYW5nZSAmJiBwcmV2U3RhdGUudmFsdWUgIT09IHRoaXMuc3RhdGUudmFsdWUpIHtcbiAgICAgIHRoaXMucHJvcHMub25WYWx1ZUNoYW5nZSh0aGlzLnN0YXRlLnZhbHVlLCBwcmV2U3RhdGUudmFsdWUpO1xuICAgIH1cbiAgICBpZiAodGhpcy5wcm9wcy5mb2N1c09uT3BlbiAmJiBwcmV2U3RhdGUub3BlbmVkID09PSBmYWxzZSAmJiB0aGlzLnN0YXRlLm9wZW5lZCA9PT0gdHJ1ZSkge1xuICAgICAgdGhpcy5mb2N1c1RvVGFyZ2V0SXRlbUVsKCk7XG4gICAgfVxuICB9XG5cbiAgb25DbGljayhlKSB7XG4gICAgY29uc3QgeyBvbkRyb3BEb3duQ2xpY2sgfSA9IHRoaXMucHJvcHM7XG4gICAgdGhpcy5zZXRTdGF0ZSgoc3RhdGUgPT4gKHsgb3BlbmVkOiAhc3RhdGUub3BlbmVkIH0pKSk7XG4gICAgaWYgKG9uRHJvcERvd25DbGljaykgb25Ecm9wRG93bkNsaWNrKGUpO1xuICB9XG5cbiAgb25QaWNrbGlzdEl0ZW1DbGljayhpdGVtLCBlKSB7XG4gICAgdGhpcy5zZXRTdGF0ZSh7IHZhbHVlOiBpdGVtLnZhbHVlIH0pO1xuICAgIGlmICh0aGlzLnByb3BzLm9uQ2hhbmdlKSB7XG4gICAgICB0aGlzLnByb3BzLm9uQ2hhbmdlKGUsIGl0ZW0udmFsdWUpO1xuICAgIH1cbiAgICBpZiAodGhpcy5wcm9wcy5vblNlbGVjdCkge1xuICAgICAgdGhpcy5wcm9wcy5vblNlbGVjdChpdGVtKTtcbiAgICB9XG4gICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICB0aGlzLnNldFN0YXRlKHsgb3BlbmVkOiBmYWxzZSB9KTtcbiAgICAgIGlmICh0aGlzLnByb3BzLm9uQ29tcGxldGUpIHtcbiAgICAgICAgdGhpcy5wcm9wcy5vbkNvbXBsZXRlKCk7XG4gICAgICB9XG4gICAgICBjb25zdCBwaWNrbGlzdEJ1dHRvbkVsID0gUmVhY3RET00uZmluZERPTU5vZGUodGhpcy5waWNrbGlzdEJ1dHRvbik7XG4gICAgICBpZiAocGlja2xpc3RCdXR0b25FbCkge1xuICAgICAgICBwaWNrbGlzdEJ1dHRvbkVsLmZvY3VzKCk7XG4gICAgICB9XG4gICAgfSwgMjAwKTtcbiAgICBlLnByZXZlbnREZWZhdWx0KCk7XG4gICAgZS5zdG9wUHJvcGFnYXRpb24oKTtcbiAgfVxuXG4gIG9uUGlja2xpc3RDbG9zZSgpIHtcbiAgICBjb25zdCBwaWNrbGlzdEJ1dHRvbkVsID0gUmVhY3RET00uZmluZERPTU5vZGUodGhpcy5waWNrbGlzdEJ1dHRvbik7XG4gICAgcGlja2xpc3RCdXR0b25FbC5mb2N1cygpO1xuICAgIHRoaXMuc2V0U3RhdGUoeyBvcGVuZWQ6IGZhbHNlIH0pO1xuICB9XG5cbiAgb25CbHVyKCkge1xuICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgaWYgKCF0aGlzLmlzRm9jdXNlZEluQ29tcG9uZW50KCkpIHtcbiAgICAgICAgdGhpcy5zZXRTdGF0ZSh7IG9wZW5lZDogZmFsc2UgfSk7XG4gICAgICAgIGlmICh0aGlzLnByb3BzLm9uQmx1cikge1xuICAgICAgICAgIHRoaXMucHJvcHMub25CbHVyKCk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHRoaXMucHJvcHMub25Db21wbGV0ZSkge1xuICAgICAgICAgIHRoaXMucHJvcHMub25Db21wbGV0ZSgpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfSwgMTApO1xuICB9XG5cbiAgb25LZXlkb3duKGUpIHtcbiAgICBpZiAoZS5rZXlDb2RlID09PSA0MCkge1xuICAgICAgLy8gZG93blxuICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgZS5zdG9wUHJvcGFnYXRpb24oKTtcbiAgICAgIGlmICghdGhpcy5zdGF0ZS5vcGVuZWQpIHtcbiAgICAgICAgdGhpcy5zZXRTdGF0ZSh7IG9wZW5lZDogdHJ1ZSB9KTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRoaXMuZm9jdXNUb1RhcmdldEl0ZW1FbCgpO1xuICAgICAgfVxuICAgIH0gZWxzZSBpZiAoZS5rZXlDb2RlID09PSAyNykge1xuICAgICAgLy8gRVNDXG4gICAgICBlLnByZXZlbnREZWZhdWx0KCk7XG4gICAgICBlLnN0b3BQcm9wYWdhdGlvbigpO1xuICAgICAgdGhpcy5zZXRTdGF0ZSh7IG9wZW5lZDogZmFsc2UgfSk7XG4gICAgICBpZiAodGhpcy5wcm9wcy5vbkNvbXBsZXRlKSB7XG4gICAgICAgIHRoaXMucHJvcHMub25Db21wbGV0ZSgpO1xuICAgICAgfVxuICAgIH1cbiAgICBpZiAodGhpcy5wcm9wcy5vbktleURvd24pIHtcbiAgICAgIHRoaXMucHJvcHMub25LZXlEb3duKGUpO1xuICAgIH1cbiAgfVxuXG4gIG9uRHJvcGRvd25TY3JvbGwocGFnZSkge1xuICAgIGlmICh0aGlzLnByb3BzLm9uU2Nyb2xsKSB7XG4gICAgICB0aGlzLnByb3BzLm9uU2Nyb2xsKHBhZ2UpO1xuICAgIH1cbiAgfVxuXG4gIGdldFNlbGVjdGVkVmFsdWUoKSB7XG4gICAgY29uc3QgeyBkZWZhdWx0VmFsdWUsIHZhbHVlIH0gPSB0aGlzLnByb3BzO1xuICAgIHJldHVybiB0eXBlb2YgdmFsdWUgIT09ICd1bmRlZmluZWQnXG4gICAgICA/IHZhbHVlXG4gICAgICA6IHR5cGVvZiB0aGlzLnN0YXRlLnZhbHVlICE9PSAndW5kZWZpbmVkJyA/IHRoaXMuc3RhdGUudmFsdWUgOiBkZWZhdWx0VmFsdWU7XG4gIH1cblxuICBnZXRTZWxlY3RlZEl0ZW1MYWJlbCgpIHtcbiAgICBjb25zdCBzZWxlY3RlZFZhbHVlID0gdGhpcy5nZXRTZWxlY3RlZFZhbHVlKCk7XG4gICAgbGV0IHNlbGVjdGVkID0gbnVsbDtcbiAgICBSZWFjdC5DaGlsZHJlbi5mb3JFYWNoKHRoaXMucHJvcHMuY2hpbGRyZW4sIGl0ZW0gPT4ge1xuICAgICAgaWYgKGl0ZW0ucHJvcHMudmFsdWUgPT09IHNlbGVjdGVkVmFsdWUpIHtcbiAgICAgICAgc2VsZWN0ZWQgPSBpdGVtLnByb3BzLmxhYmVsIHx8IGl0ZW0ucHJvcHMuY2hpbGRyZW47XG4gICAgICB9XG4gICAgfSk7XG4gICAgcmV0dXJuIHNlbGVjdGVkIHx8IHRoaXMucHJvcHMuc2VsZWN0ZWRUZXh0O1xuICB9XG5cbiAgaXNGb2N1c2VkSW5Db21wb25lbnQoKSB7XG4gICAgY29uc3Qgcm9vdEVsID0gUmVhY3RET00uZmluZERPTU5vZGUodGhpcyk7XG4gICAgbGV0IHRhcmdldEVsID0gZG9jdW1lbnQuYWN0aXZlRWxlbWVudDtcbiAgICB3aGlsZSAodGFyZ2V0RWwgJiYgdGFyZ2V0RWwgIT09IHJvb3RFbCkge1xuICAgICAgdGFyZ2V0RWwgPSB0YXJnZXRFbC5wYXJlbnROb2RlO1xuICAgIH1cbiAgICByZXR1cm4gISF0YXJnZXRFbDtcbiAgfVxuXG4gIGZvY3VzVG9UYXJnZXRJdGVtRWwoKSB7XG4gICAgY29uc3QgZHJvcGRvd25FbCA9IFJlYWN0RE9NLmZpbmRET01Ob2RlKHRoaXMuZHJvcGRvd24pO1xuICAgIGlmICghZHJvcGRvd25FbCkgcmV0dXJuO1xuICAgIGNvbnN0IGZpcnN0SXRlbUVsID1cbiAgICAgIGRyb3Bkb3duRWwucXVlcnlTZWxlY3RvcignLnNsZHMtaXMtc2VsZWN0ZWQgPiAucmVhY3Qtc2xkcy1tZW51aXRlbVt0YWJJbmRleF0nKSB8fFxuICAgICAgZHJvcGRvd25FbC5xdWVyeVNlbGVjdG9yKCcucmVhY3Qtc2xkcy1tZW51aXRlbVt0YWJJbmRleF0nKTtcbiAgICBpZiAoZmlyc3RJdGVtRWwpIHtcbiAgICAgIGZpcnN0SXRlbUVsLmZvY3VzKCk7XG4gICAgfVxuICB9XG5cbiAgcGlja2xpc3RCdXR0b25SZWYocmVmKSB7XG4gICAgdGhpcy5waWNrbGlzdEJ1dHRvbiA9IHJlZjtcbiAgfVxuXG4gIGRyb3Bkb3duUmVmKHJlZikge1xuICAgIHRoaXMuZHJvcGRvd24gPSByZWY7XG4gIH1cblxuICByZW5kZXJQaWNrbGlzdChwcm9wcykge1xuICAgIGNvbnN0IHsgY2xhc3NOYW1lLCBpZCwgaHRtbEF0dHJpYnV0ZXMsIGJ1dHRvbkNsYXNzTmFtZSwgLi4ucHByb3BzIH0gPSBwcm9wcztcbiAgICBkZWxldGUgcHByb3BzLmluaXRpYWxWYWx1ZTtcbiAgICBkZWxldGUgcHByb3BzLm9uVXBkYXRlO1xuICAgIGRlbGV0ZSBwcHJvcHMudmFsaWQ7XG4gICAgZGVsZXRlIHBwcm9wcy5pbnZhbGlkO1xuICAgIGRlbGV0ZSBwcHJvcHMuZGlydHk7XG4gICAgZGVsZXRlIHBwcm9wcy5wcmlzdGluZTtcbiAgICBkZWxldGUgcHByb3BzLmFjdGl2ZTtcbiAgICBkZWxldGUgcHByb3BzLnRvdWNoZWQ7XG4gICAgZGVsZXRlIHBwcm9wcy52aXNpdGVkO1xuICAgIGRlbGV0ZSBwcHJvcHMubWF4SGVpZ2h0O1xuICAgIGRlbGV0ZSBwcHJvcHMub25WYWx1ZUNoYW5nZTtcbiAgICBkZWxldGUgcHByb3BzLmRlZmF1bHRPcGVuZWQ7XG4gICAgZGVsZXRlIHBwcm9wcy5tZW51U2l6ZTtcbiAgICBkZWxldGUgcHByb3BzLnNlbGVjdGVkVGV4dDtcbiAgICBkZWxldGUgcHByb3BzLm9uQmx1cjtcbiAgICBkZWxldGUgcHByb3BzLmhhc01vcmU7XG4gICAgZGVsZXRlIHBwcm9wcy5vblNjcm9sbDtcbiAgICBkZWxldGUgcHByb3BzLnJlc2V0UGFnZUxvYWRlcjtcbiAgICBkZWxldGUgcHByb3BzLnBhZ2VTdGFydDtcbiAgICBkZWxldGUgcHByb3BzLnVzZU5vbmU7XG4gICAgZGVsZXRlIHBwcm9wcy5ub25lVGV4dDtcbiAgICBkZWxldGUgcHByb3BzLmFsaWduO1xuICAgIGRlbGV0ZSBwcHJvcHMuZm9jdXNPbk9wZW47XG4gICAgZGVsZXRlIHBwcm9wcy5vbkRyb3BEb3duQ2xpY2s7XG4gICAgY29uc3QgcGlja2xpc3RDbGFzc05hbWVzID0gY2xhc3NuYW1lcyhjbGFzc05hbWUsICdzbGRzLXBpY2tsaXN0Jyk7XG4gICAgcmV0dXJuIChcbiAgICAgIDxkaXYgY2xhc3NOYW1lPXtwaWNrbGlzdENsYXNzTmFtZXN9IGFyaWEtZXhwYW5kZWQ9e3RoaXMuc3RhdGUub3BlbmVkfT5cbiAgICAgICAgPGJ1dHRvblxuICAgICAgICAgIGlkPXtpZH1cbiAgICAgICAgICByZWY9e3RoaXMucGlja2xpc3RCdXR0b25SZWZ9XG4gICAgICAgICAgY2xhc3NOYW1lPXtjbGFzc25hbWVzKCdzbGRzLXBpY2tsaXN0X19sYWJlbCBzbGRzLWJ1dHRvbiBzbGRzLWJ1dHRvbi0tbmV1dHJhbCcsXG4gICAgICAgICAgICBidXR0b25DbGFzc05hbWUpfVxuICAgICAgICAgIHR5cGU9J2J1dHRvbidcbiAgICAgICAgICBhcmlhLWhhc3BvcHVwXG4gICAgICAgICAgb25DbGljaz17dGhpcy5vbkNsaWNrLmJpbmQodGhpcyl9XG4gICAgICAgICAgb25CbHVyPXt0aGlzLm9uQmx1ci5iaW5kKHRoaXMpfVxuICAgICAgICAgIG9uS2V5RG93bj17dGhpcy5vbktleWRvd24uYmluZCh0aGlzKX1cbiAgICAgICAgICB7Li4ucHByb3BzfVxuICAgICAgICA+XG4gICAgICAgICAgPHNwYW4gY2xhc3NOYW1lPSdzbGRzLXRydW5jYXRlJyB7Li4uaHRtbEF0dHJpYnV0ZXN9PlxuICAgICAgICAgICAge3RoaXMuZ2V0U2VsZWN0ZWRJdGVtTGFiZWwoKSB8fCA8c3Bhbj4mbmJzcDs8L3NwYW4+fVxuICAgICAgICAgIDwvc3Bhbj5cbiAgICAgICAgICA8SWNvbiBpY29uPSdkb3duJyAvPlxuICAgICAgICA8L2J1dHRvbj5cbiAgICAgIDwvZGl2PlxuICAgICk7XG4gIH1cblxuICByZW5kZXJOb25lTWVudUl0ZW0oKSB7XG4gICAgY29uc3QgeyByZXF1aXJlZCwgbm9uZVRleHQgfSA9IHRoaXMucHJvcHM7XG4gICAgcmV0dXJuIChcbiAgICAgIDxQaWNrbGlzdEl0ZW1cbiAgICAgICAgZGlzYWJsZWQ9e3JlcXVpcmVkfVxuICAgICAgICB2YWx1ZT17bnVsbH1cbiAgICAgICAgb25CbHVyPXt0aGlzLm9uQmx1ci5iaW5kKHRoaXMpfVxuICAgICAgICBzZWxlY3RlZD17dGhpcy5nZXRTZWxlY3RlZFZhbHVlKCkgPT09IG51bGx9XG4gICAgICAgIGxhYmVsPXtub25lVGV4dH1cbiAgICAgIC8+XG4gICAgKTtcbiAgfVxuXG4gIHJlbmRlckRyb3Bkb3duKCkge1xuICAgIGNvbnN0IHtcbiAgICAgIG1lbnVTaXplLFxuICAgICAgY2hpbGRyZW4sXG4gICAgICBtYXhIZWlnaHQsXG4gICAgICBoYXNNb3JlLFxuICAgICAgcGFnZVN0YXJ0LFxuICAgICAgcmVzZXRQYWdlTG9hZGVyLFxuICAgICAgdXNlTm9uZSxcbiAgICAgIGFsaWduLFxuICAgIH0gPSB0aGlzLnByb3BzO1xuICAgIHJldHVybiB0aGlzLnN0YXRlLm9wZW5lZCA/IChcbiAgICAgIDxEcm9wZG93bk1lbnVcbiAgICAgICAgcmVmPXt0aGlzLmRyb3Bkb3duUmVmfVxuICAgICAgICBtYXhIZWlnaHQ9e21heEhlaWdodH1cbiAgICAgICAgc2l6ZT17bWVudVNpemV9XG4gICAgICAgIG9uTWVudUl0ZW1DbGljaz17dGhpcy5vblBpY2tsaXN0SXRlbUNsaWNrLmJpbmQodGhpcyl9XG4gICAgICAgIG9uTWVudUNsb3NlPXt0aGlzLm9uUGlja2xpc3RDbG9zZS5iaW5kKHRoaXMpfVxuICAgICAgICBoYXNNb3JlPXtoYXNNb3JlfVxuICAgICAgICBwYWdlU3RhcnQ9e3BhZ2VTdGFydH1cbiAgICAgICAgcmVzZXRQYWdlTG9hZGVyPXtyZXNldFBhZ2VMb2FkZXJ9XG4gICAgICAgIG9uU2Nyb2xsPXt0aGlzLm9uRHJvcGRvd25TY3JvbGwuYmluZCh0aGlzKX1cbiAgICAgICAgYWxpZ249e2FsaWdufVxuICAgICAgICBvbkJsdXI9e3RoaXMub25CbHVyLmJpbmQodGhpcyl9XG4gICAgICA+XG4gICAgICAgIHt1c2VOb25lICYmIHRoaXMucmVuZGVyTm9uZU1lbnVJdGVtKCl9XG4gICAgICAgIHtSZWFjdC5DaGlsZHJlbi5tYXAoY2hpbGRyZW4sIHRoaXMucmVuZGVyUGlja2xpc3RJdGVtLmJpbmQodGhpcykpfVxuICAgICAgPC9Ecm9wZG93bk1lbnU+XG4gICAgKSA6IChcbiAgICAgIDxkaXYgcmVmPXt0aGlzLmRyb3Bkb3duUmVmfSAvPlxuICAgICk7XG4gIH1cblxuICByZW5kZXJQaWNrbGlzdEl0ZW0oaXRlbSkge1xuICAgIGNvbnN0IHNlbGVjdGVkID0gaXRlbS5wcm9wcy52YWx1ZSA9PT0gdGhpcy5nZXRTZWxlY3RlZFZhbHVlKCk7XG4gICAgY29uc3Qgb25CbHVyID0gdGhpcy5vbkJsdXIuYmluZCh0aGlzKTtcbiAgICByZXR1cm4gUmVhY3QuY2xvbmVFbGVtZW50KGl0ZW0sIHsgc2VsZWN0ZWQsIG9uQmx1ciB9KTtcbiAgfVxuXG4gIHJlbmRlcigpIHtcbiAgICBjb25zdCBpZCA9IHRoaXMucHJvcHMuaWQgfHwgdGhpcy5zdGF0ZS5pZDtcbiAgICBjb25zdCB7IGxhYmVsLCByZXF1aXJlZCwgZXJyb3IsIHRvdGFsQ29scywgY29scywgdG9vbHRpcCwgLi4ucHJvcHMgfSA9IHRoaXMucHJvcHM7XG4gICAgY29uc3QgZHJvcGRvd24gPSB0aGlzLnJlbmRlckRyb3Bkb3duKCk7XG4gICAgY29uc3QgZm9ybUVsZW1Qcm9wcyA9IHsgaWQsIGxhYmVsLCByZXF1aXJlZCwgZXJyb3IsIHRvdGFsQ29scywgY29scywgZHJvcGRvd24sIHRvb2x0aXAgfTtcbiAgICByZXR1cm4gPEZvcm1FbGVtZW50IHsuLi5mb3JtRWxlbVByb3BzfT57dGhpcy5yZW5kZXJQaWNrbGlzdCh7IC4uLnByb3BzLCBpZCB9KX08L0Zvcm1FbGVtZW50PjtcbiAgfVxufVxuUGlja2xpc3QuZGVmYXVsdFByb3BzID0ge1xuICBtYXhIZWlnaHQ6IDEwLFxuICBmb2N1c09uT3BlbjogdHJ1ZSxcbn07XG5cblBpY2tsaXN0LnByb3BUeXBlcyA9IHtcbiAgaWQ6IFByb3BUeXBlcy5zdHJpbmcsXG4gIGNsYXNzTmFtZTogUHJvcFR5cGVzLnN0cmluZyxcbiAgbGFiZWw6IFByb3BUeXBlcy5zdHJpbmcsXG4gIHJlcXVpcmVkOiBQcm9wVHlwZXMuYm9vbCxcbiAgZXJyb3I6IFByb3BUeXBlcy5vbmVPZlR5cGUoW1xuICAgIFByb3BUeXBlcy5ib29sLFxuICAgIFByb3BUeXBlcy5zdHJpbmcsXG4gICAgUHJvcFR5cGVzLnNoYXBlKHtcbiAgICAgIG1lc3NhZ2U6IFByb3BUeXBlcy5zdHJpbmcsXG4gICAgfSksXG4gIF0pLFxuICB0b3RhbENvbHM6IFByb3BUeXBlcy5udW1iZXIsXG4gIGNvbHM6IFByb3BUeXBlcy5udW1iZXIsXG4gIG5hbWU6IFByb3BUeXBlcy5zdHJpbmcsXG4gIHZhbHVlOiBQcm9wVHlwZXMuYW55LFxuICBkZWZhdWx0VmFsdWU6IFByb3BUeXBlcy5hbnksXG4gIHNlbGVjdGVkVGV4dDogUHJvcFR5cGVzLm9uZU9mVHlwZShbUHJvcFR5cGVzLnN0cmluZywgUHJvcFR5cGVzLm5vZGVdKSxcbiAgZGVmYXVsdE9wZW5lZDogUHJvcFR5cGVzLmJvb2wsXG4gIG9uQ2hhbmdlOiBQcm9wVHlwZXMuZnVuYyxcbiAgb25Ecm9wRG93bkNsaWNrOiBQcm9wVHlwZXMuZnVuYyxcbiAgb25WYWx1ZUNoYW5nZTogUHJvcFR5cGVzLmZ1bmMsXG4gIG9uU2VsZWN0OiBQcm9wVHlwZXMuZnVuYyxcbiAgb25Db21wbGV0ZTogUHJvcFR5cGVzLmZ1bmMsXG4gIG9uS2V5RG93bjogUHJvcFR5cGVzLmZ1bmMsXG4gIG9uQmx1cjogUHJvcFR5cGVzLmZ1bmMsXG4gIG1lbnVTaXplOiBQcm9wVHlwZXMuc3RyaW5nLFxuICBjaGlsZHJlbjogUHJvcFR5cGVzLm5vZGUsXG4gIG1heEhlaWdodDogUHJvcFR5cGVzLm9uZU9mKFs1LCA3LCAxMF0pLFxuICBodG1sQXR0cmlidXRlczogUHJvcFR5cGVzLm9iamVjdCxcbiAgaGFzTW9yZTogUHJvcFR5cGVzLmJvb2wsXG4gIHBhZ2VTdGFydDogUHJvcFR5cGVzLm51bWJlcixcbiAgcmVzZXRQYWdlTG9hZGVyOiBQcm9wVHlwZXMuYm9vbCxcbiAgb25TY3JvbGw6IFByb3BUeXBlcy5mdW5jLFxuICB1c2VOb25lOiBQcm9wVHlwZXMuYm9vbCxcbiAgbm9uZVRleHQ6IFByb3BUeXBlcy5zdHJpbmcsXG4gIGFsaWduOiBQcm9wVHlwZXMub25lT2YoWydsZWZ0JywgJ2NlbnRlcicsICdyaWdodCddKSxcbiAgZm9jdXNPbk9wZW46IFByb3BUeXBlcy5ib29sLFxuICBidXR0b25DbGFzc05hbWU6IFByb3BUeXBlcy5zdHJpbmcsXG4gIHRvb2x0aXA6IFByb3BUeXBlcy5lbGVtZW50LFxufTtcblxuUGlja2xpc3QuaXNGb3JtRWxlbWVudCA9IHRydWU7XG5cbmV4cG9ydCBjb25zdCBQaWNrbGlzdEl0ZW0gPSAoeyBsYWJlbCwgc2VsZWN0ZWQsIGNoaWxkcmVuLCAuLi5wcm9wcyB9KSA9PiAoXG4gIDxEcm9wZG93bk1lbnVJdGVtXG4gICAgaWNvbj17c2VsZWN0ZWQgPyAnY2hlY2snIDogJ25vbmUnfVxuICAgIHJvbGU9J21lbnVpdGVtcmFkaW8nXG4gICAgc2VsZWN0ZWQ9e3NlbGVjdGVkfVxuICAgIHsuLi5wcm9wc31cbiAgPlxuICAgIHtsYWJlbCB8fCBjaGlsZHJlbn1cbiAgPC9Ecm9wZG93bk1lbnVJdGVtPlxuKTtcblxuUGlja2xpc3RJdGVtLnByb3BUeXBlcyA9IHtcbiAgbGFiZWw6IFByb3BUeXBlcy5vbmVPZlR5cGUoW1Byb3BUeXBlcy5zdHJpbmcsIFByb3BUeXBlcy5udW1iZXJdKSxcbiAgc2VsZWN0ZWQ6IFByb3BUeXBlcy5ib29sLFxuICB2YWx1ZTogUHJvcFR5cGVzLmFueSxcbiAgY2hpbGRyZW46IFByb3BUeXBlcy5ub2RlLFxufTtcbiJdfQ==