react-lightning-design-components
Version:
Salesforce Lightning Design System components built with React 16
323 lines (274 loc) • 28.8 kB
JavaScript
'use strict';
Object.defineProperty(exports, "__esModule", {
value: true
});
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 _reactDom = require('react-dom');
var _reactDom2 = _interopRequireDefault(_reactDom);
var _propTypes = require('prop-types');
var _propTypes2 = _interopRequireDefault(_propTypes);
var _classnames = require('classnames');
var _classnames2 = _interopRequireDefault(_classnames);
var _Button = require('./Button');
var _Button2 = _interopRequireDefault(_Button);
var _DropdownMenu = require('./DropdownMenu');
var _DropdownMenu2 = _interopRequireDefault(_DropdownMenu);
var _util = require('./util');
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
var DropdownButton = function (_Component) {
(0, _inherits3.default)(DropdownButton, _Component);
function DropdownButton(props) {
(0, _classCallCheck3.default)(this, DropdownButton);
var _this = (0, _possibleConstructorReturn3.default)(this, (DropdownButton.__proto__ || (0, _getPrototypeOf2.default)(DropdownButton)).call(this, props));
_this.state = { opened: false };
_this.currentWidth = 0;
(0, _util.registerStyle)('no-hover-popup', [['.slds-dropdown-trigger:hover .slds-dropdown--menu.react-slds-no-hover-popup', '{ visibility: hidden; opacity: 0; }'], ['.slds-dropdown-trigger.react-slds-dropdown-opened .slds-dropdown--menu', '{ visibility: visible !important; opacity: 1 !important; }']]);
_this.triggerRef = _this.triggerRef.bind(_this);
_this.dropdownRef = _this.dropdownRef.bind(_this);
return _this;
}
(0, _createClass3.default)(DropdownButton, [{
key: 'onBlur',
value: function onBlur() {
var _this2 = this;
setTimeout(function () {
if (!_this2.isFocusedInComponent()) {
_this2.setState({ opened: false });
if (_this2.props.onBlur) {
_this2.props.onBlur();
}
}
}, 10);
}
}, {
key: 'onKeyDown',
value: function onKeyDown(e) {
var _this3 = this;
if (e.keyCode === 40) {
// down
e.preventDefault();
e.stopPropagation();
if (!this.state.opened) {
this.setState({ opened: true });
if (this.props.onClick) {
this.props.onClick(e);
}
setTimeout(function () {
_this3.focusToTargetItemEl();
}, 20);
} else {
this.focusToTargetItemEl();
}
} else if (e.keyCode === 27) {
// ESC
e.preventDefault();
e.stopPropagation();
this.setState({ opened: false });
}
}
}, {
key: 'onTriggerClick',
value: function onTriggerClick() {
if (this.props.inheritWidth) {
this.currentWidth = this.getCurrentWidth();
}
var triggerElem = _reactDom2.default.findDOMNode(this.trigger);
if (triggerElem !== document.activeElement) triggerElem.focus();
if (!this.props.hoverPopup) {
this.setState({ opened: !this.state.opened });
}
if (this.props.onClick) {
var _props;
(_props = this.props).onClick.apply(_props, arguments);
}
}
}, {
key: 'onMenuItemClick',
value: function onMenuItemClick() {
var _this4 = this;
if (!this.props.hoverPopup) {
setTimeout(function () {
var triggerElem = _reactDom2.default.findDOMNode(_this4.trigger);
if (triggerElem) triggerElem.focus();
if (triggerElem) _this4.setState({ opened: false });
if (_this4.props.focusOnInput) _this4.props.focusOnInput();
}, 10);
}
if (this.props.onMenuItemClick) {
var _props2;
(_props2 = this.props).onMenuItemClick.apply(_props2, arguments);
}
}
}, {
key: 'onMenuClose',
value: function onMenuClose() {
var triggerElem = _reactDom2.default.findDOMNode(this.trigger);
triggerElem.focus();
this.setState({ opened: false });
}
}, {
key: 'getCurrentWidth',
value: function getCurrentWidth() {
var htmlElemnt = _reactDom2.default.findDOMNode(this) || {};
return htmlElemnt.offsetWidth || 0;
}
}, {
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);
var firstItemEl = dropdownEl.querySelector('.slds-is-selected > .react-slds-menuitem[tabIndex]') || dropdownEl.querySelector('.react-slds-menuitem[tabIndex]');
if (firstItemEl) {
firstItemEl.focus();
}
}
}, {
key: 'triggerRef',
value: function triggerRef(ref) {
this.trigger = ref;
}
}, {
key: 'dropdownRef',
value: function dropdownRef(ref) {
this.dropdown = ref;
}
}, {
key: 'renderButton',
value: function renderButton(_ref) {
var grouped = _ref.grouped,
isFirstInGroup = _ref.isFirstInGroup,
isLastInGroup = _ref.isLastInGroup,
props = (0, _objectWithoutProperties3.default)(_ref, ['grouped', 'isFirstInGroup', 'isLastInGroup']);
var pprops = (0, _extends3.default)({}, props);
delete pprops.onMenuItemClick;
delete pprops.inheritWidth;
delete pprops.focusOnInput;
var button = _react2.default.createElement(_Button2.default, (0, _extends3.default)({}, pprops, {
'aria-haspopup': true,
ref: this.triggerRef,
onClick: this.onTriggerClick.bind(this),
onKeyDown: this.onKeyDown.bind(this),
onBlur: this.onBlur.bind(this)
}));
if (grouped) {
var noneStyle = { display: 'none' };
return _react2.default.createElement(
'div',
{ className: 'slds-button-group' },
isFirstInGroup ? null : _react2.default.createElement('button', { className: 'slds-button', style: noneStyle }),
button,
isLastInGroup ? null : _react2.default.createElement('button', { className: 'slds-button', style: noneStyle })
);
}
return button;
}
}, {
key: 'render',
value: function render() {
var _props3 = this.props,
inheritWidth = _props3.inheritWidth,
className = _props3.className,
listClassName = _props3.listClassName,
menuClassName = _props3.menuClassName,
_props3$menuAlign = _props3.menuAlign,
menuAlign = _props3$menuAlign === undefined ? 'left' : _props3$menuAlign,
menuSize = _props3.menuSize,
nubbinTop = _props3.nubbinTop,
hoverPopup = _props3.hoverPopup,
menuHeader = _props3.menuHeader,
type = _props3.type,
label = _props3.label,
children = _props3.children,
backgroundColor = _props3.backgroundColor,
keyCodesToCloseMenu = _props3.keyCodesToCloseMenu,
props = (0, _objectWithoutProperties3.default)(_props3, ['inheritWidth', 'className', 'listClassName', 'menuClassName', 'menuAlign', 'menuSize', 'nubbinTop', 'hoverPopup', 'menuHeader', 'type', 'label', 'children', 'backgroundColor', 'keyCodesToCloseMenu']);
var icon = this.props.icon;
var dropdownClassNames = (0, _classnames2.default)(className, 'slds-dropdown-trigger', {
'slds-button-space-left': !props.grouped,
'react-slds-dropdown-opened': this.state.opened
});
var iconMore = null;
if (!label && !icon) {
icon = 'down';
}
if (label || type === 'icon-more') {
iconMore = 'down';
}
return _react2.default.createElement(
'div',
{ className: dropdownClassNames, style: { backgroundColor: backgroundColor } },
this.renderButton((0, _extends3.default)({ type: type, label: label, icon: icon, iconMore: iconMore }, props)),
_react2.default.createElement(
_DropdownMenu2.default,
{
className: menuClassName,
listClassName: listClassName,
align: menuAlign,
minWidth: inheritWidth ? this.currentWidth : 0,
header: menuHeader,
size: menuSize,
nubbinTop: nubbinTop,
hoverPopup: hoverPopup,
ref: this.dropdownRef,
onMenuItemClick: this.onMenuItemClick.bind(this),
onMenuClose: this.onMenuClose.bind(this),
onBlur: this.onBlur.bind(this),
keyCodesToCloseMenu: keyCodesToCloseMenu
},
children
)
);
}
}]);
return DropdownButton;
}(_react.Component);
exports.default = DropdownButton;
DropdownButton.propTypes = {
className: _propTypes2.default.string,
listClassName: _propTypes2.default.string,
menuClassName: _propTypes2.default.string,
label: _propTypes2.default.node,
type: _propTypes2.default.string,
icon: _propTypes2.default.string,
menuAlign: _propTypes2.default.oneOf(['left', 'center', 'right']),
menuSize: _propTypes2.default.oneOf(['small', 'medium', 'large']),
menuHeader: _propTypes2.default.string,
nubbinTop: _propTypes2.default.bool,
hoverPopup: _propTypes2.default.bool,
onBlur: _propTypes2.default.func,
onClick: _propTypes2.default.func,
onMenuItemClick: _propTypes2.default.func,
grouped: _propTypes2.default.bool,
isFirstInGroup: _propTypes2.default.bool,
isLastInGroup: _propTypes2.default.bool,
children: _propTypes2.default.node,
inheritWidth: _propTypes2.default.bool,
backgroundColor: _propTypes2.default.string,
focusOnInput: _propTypes2.default.func,
keyCodesToCloseMenu: _propTypes2.default.arrayOf(_propTypes2.default.number)
};
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9zY3JpcHRzL0Ryb3Bkb3duQnV0dG9uLmpzIl0sIm5hbWVzIjpbIkRyb3Bkb3duQnV0dG9uIiwicHJvcHMiLCJzdGF0ZSIsIm9wZW5lZCIsImN1cnJlbnRXaWR0aCIsInRyaWdnZXJSZWYiLCJiaW5kIiwiZHJvcGRvd25SZWYiLCJzZXRUaW1lb3V0IiwiaXNGb2N1c2VkSW5Db21wb25lbnQiLCJzZXRTdGF0ZSIsIm9uQmx1ciIsImUiLCJrZXlDb2RlIiwicHJldmVudERlZmF1bHQiLCJzdG9wUHJvcGFnYXRpb24iLCJvbkNsaWNrIiwiZm9jdXNUb1RhcmdldEl0ZW1FbCIsImluaGVyaXRXaWR0aCIsImdldEN1cnJlbnRXaWR0aCIsInRyaWdnZXJFbGVtIiwiZmluZERPTU5vZGUiLCJ0cmlnZ2VyIiwiZG9jdW1lbnQiLCJhY3RpdmVFbGVtZW50IiwiZm9jdXMiLCJob3ZlclBvcHVwIiwiZm9jdXNPbklucHV0Iiwib25NZW51SXRlbUNsaWNrIiwiaHRtbEVsZW1udCIsIm9mZnNldFdpZHRoIiwicm9vdEVsIiwidGFyZ2V0RWwiLCJwYXJlbnROb2RlIiwiZHJvcGRvd25FbCIsImRyb3Bkb3duIiwiZmlyc3RJdGVtRWwiLCJxdWVyeVNlbGVjdG9yIiwicmVmIiwiZ3JvdXBlZCIsImlzRmlyc3RJbkdyb3VwIiwiaXNMYXN0SW5Hcm91cCIsInBwcm9wcyIsImJ1dHRvbiIsIm9uVHJpZ2dlckNsaWNrIiwib25LZXlEb3duIiwibm9uZVN0eWxlIiwiZGlzcGxheSIsImNsYXNzTmFtZSIsImxpc3RDbGFzc05hbWUiLCJtZW51Q2xhc3NOYW1lIiwibWVudUFsaWduIiwibWVudVNpemUiLCJudWJiaW5Ub3AiLCJtZW51SGVhZGVyIiwidHlwZSIsImxhYmVsIiwiY2hpbGRyZW4iLCJiYWNrZ3JvdW5kQ29sb3IiLCJrZXlDb2Rlc1RvQ2xvc2VNZW51IiwiaWNvbiIsImRyb3Bkb3duQ2xhc3NOYW1lcyIsImljb25Nb3JlIiwicmVuZGVyQnV0dG9uIiwib25NZW51Q2xvc2UiLCJwcm9wVHlwZXMiLCJzdHJpbmciLCJub2RlIiwib25lT2YiLCJib29sIiwiZnVuYyIsImFycmF5T2YiLCJudW1iZXIiXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFBQTs7OztBQUNBOzs7O0FBQ0E7Ozs7QUFDQTs7OztBQUNBOzs7O0FBQ0E7Ozs7QUFDQTs7OztJQUVxQkEsYzs7O0FBQ25CLDBCQUFZQyxLQUFaLEVBQW1CO0FBQUE7O0FBQUEsc0pBQ1hBLEtBRFc7O0FBRWpCLFVBQUtDLEtBQUwsR0FBYSxFQUFFQyxRQUFRLEtBQVYsRUFBYjtBQUNBLFVBQUtDLFlBQUwsR0FBb0IsQ0FBcEI7QUFDQSw2QkFBYyxnQkFBZCxFQUFnQyxDQUM5QixDQUNFLDZFQURGLEVBRUUscUNBRkYsQ0FEOEIsRUFLOUIsQ0FDRSx3RUFERixFQUVFLDREQUZGLENBTDhCLENBQWhDOztBQVdBLFVBQUtDLFVBQUwsR0FBa0IsTUFBS0EsVUFBTCxDQUFnQkMsSUFBaEIsT0FBbEI7QUFDQSxVQUFLQyxXQUFMLEdBQW1CLE1BQUtBLFdBQUwsQ0FBaUJELElBQWpCLE9BQW5CO0FBaEJpQjtBQWlCbEI7Ozs7NkJBRVE7QUFBQTs7QUFDUEUsaUJBQVcsWUFBTTtBQUNmLFlBQUksQ0FBQyxPQUFLQyxvQkFBTCxFQUFMLEVBQWtDO0FBQ2hDLGlCQUFLQyxRQUFMLENBQWMsRUFBRVAsUUFBUSxLQUFWLEVBQWQ7QUFDQSxjQUFJLE9BQUtGLEtBQUwsQ0FBV1UsTUFBZixFQUF1QjtBQUNyQixtQkFBS1YsS0FBTCxDQUFXVSxNQUFYO0FBQ0Q7QUFDRjtBQUNGLE9BUEQsRUFPRyxFQVBIO0FBUUQ7Ozs4QkFFU0MsQyxFQUFHO0FBQUE7O0FBQ1gsVUFBSUEsRUFBRUMsT0FBRixLQUFjLEVBQWxCLEVBQXNCO0FBQUU7QUFDdEJELFVBQUVFLGNBQUY7QUFDQUYsVUFBRUcsZUFBRjtBQUNBLFlBQUksQ0FBQyxLQUFLYixLQUFMLENBQVdDLE1BQWhCLEVBQXdCO0FBQ3RCLGVBQUtP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NUIsaUJBQWUsb0JBQVU0QixJQWpCQTtBQWtCekJaLFlBQVUsb0JBQVVVLElBbEJLO0FBbUJ6QmpELGdCQUFjLG9CQUFVbUQsSUFuQkM7QUFvQnpCWCxtQkFBaUIsb0JBQVVRLE1BcEJGO0FBcUJ6QnZDLGdCQUFjLG9CQUFVMkMsSUFyQkM7QUFzQnpCWCx1QkFBcUIsb0JBQVVZLE9BQVYsQ0FBa0Isb0JBQVVDLE1BQTVCO0FBdEJJLENBQTNCIiwiZmlsZSI6IkRyb3Bkb3duQnV0dG9uLmpzIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IFJlYWN0LCB7IENvbXBvbmVudCB9IGZyb20gJ3JlYWN0JztcbmltcG9ydCBSZWFjdERPTSBmcm9tICdyZWFjdC1kb20nO1xuaW1wb3J0IFByb3BUeXBlcyBmcm9tICdwcm9wLXR5cGVzJztcbmltcG9ydCBjbGFzc25hbWVzIGZyb20gJ2NsYXNzbmFtZXMnO1xuaW1wb3J0IEJ1dHRvbiBmcm9tICcuL0J1dHRvbic7XG5pbXBvcnQgRHJvcGRvd25NZW51IGZyb20gJy4vRHJvcGRvd25NZW51JztcbmltcG9ydCB7IHJlZ2lzdGVyU3R5bGUgfSBmcm9tICcuL3V0aWwnO1xuXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBEcm9wZG93bkJ1dHRvbiBleHRlbmRzIENvbXBvbmVudCB7XG4gIGNvbnN0cnVjdG9yKHByb3BzKSB7XG4gICAgc3VwZXIocHJvcHMpO1xuICAgIHRoaXMuc3RhdGUgPSB7IG9wZW5lZDogZmFsc2UgfTtcbiAgICB0aGlzLmN1cnJlbnRXaWR0aCA9IDA7XG4gICAgcmVnaXN0ZXJTdHlsZSgnbm8taG92ZXItcG9wdXAnLCBbXG4gICAgICBbXG4gICAgICAgICcuc2xkcy1kcm9wZG93bi10cmlnZ2VyOmhvdmVyIC5zbGRzLWRyb3Bkb3duLS1tZW51LnJlYWN0LXNsZHMtbm8taG92ZXItcG9wdXAnLFxuICAgICAgICAneyB2aXNpYmlsaXR5OiBoaWRkZW47IG9wYWNpdHk6IDA7IH0nLFxuICAgICAgXSxcbiAgICAgIFtcbiAgICAgICAgJy5zbGRzLWRyb3Bkb3duLXRyaWdnZXIucmVhY3Qtc2xkcy1kcm9wZG93bi1vcGVuZWQgLnNsZHMtZHJvcGRvd24tLW1lbnUnLFxuICAgICAgICAneyB2aXNpYmlsaXR5OiB2aXNpYmxlICFpbXBvcnRhbnQ7IG9wYWNpdHk6IDEgIWltcG9ydGFudDsgfScsXG4gICAgICBdLFxuICAgIF0pO1xuXG4gICAgdGhpcy50cmlnZ2VyUmVmID0gdGhpcy50cmlnZ2VyUmVmLmJpbmQodGhpcyk7XG4gICAgdGhpcy5kcm9wZG93blJlZiA9IHRoaXMuZHJvcGRvd25SZWYuYmluZCh0aGlzKTtcbiAgfVxuXG4gIG9uQmx1cigpIHtcbiAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgIGlmICghdGhpcy5pc0ZvY3VzZWRJbkNvbXBvbmVudCgpKSB7XG4gICAgICAgIHRoaXMuc2V0U3RhdGUoeyBvcGVuZWQ6IGZhbHNlIH0pO1xuICAgICAgICBpZiAodGhpcy5wcm9wcy5vbkJsdXIpIHtcbiAgICAgICAgICB0aGlzLnByb3BzLm9uQmx1cigpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfSwgMTApO1xuICB9XG5cbiAgb25LZXlEb3duKGUpIHtcbiAgICBpZiAoZS5rZXlDb2RlID09PSA0MCkgeyAvLyBkb3duXG4gICAgICBlLnByZXZlbnREZWZhdWx0KCk7XG4gICAgICBlLnN0b3BQcm9wYWdhdGlvbigpO1xuICAgICAgaWYgKCF0aGlzLnN0YXRlLm9wZW5lZCkge1xuICAgICAgICB0aGlzLnNldFN0YXRlKHsgb3BlbmVkOiB0cnVlIH0pO1xuICAgICAgICBpZiAodGhpcy5wcm9wcy5vbkNsaWNrKSB7XG4gICAgICAgICAgdGhpcy5wcm9wcy5vbkNsaWNrKGUpO1xuICAgICAgICB9XG4gICAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICAgIHRoaXMuZm9jdXNUb1RhcmdldEl0ZW1FbCgpO1xuICAgICAgICB9LCAyMCk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aGlzLmZvY3VzVG9UYXJnZXRJdGVtRWwoKTtcbiAgICAgIH1cbiAgICB9IGVsc2UgaWYgKGUua2V5Q29kZSA9PT0gMjcpIHsgLy8gRVNDXG4gICAgICBlLnByZXZlbnREZWZhdWx0KCk7XG4gICAgICBlLnN0b3BQcm9wYWdhdGlvbigpO1xuICAgICAgdGhpcy5zZXRTdGF0ZSh7IG9wZW5lZDogZmFsc2UgfSk7XG4gICAgfVxuICB9XG5cbiAgb25UcmlnZ2VyQ2xpY2soLi4uYXJncykge1xuICAgIGlmICh0aGlzLnByb3BzLmluaGVyaXRXaWR0aCkge1xuICAgICAgdGhpcy5jdXJyZW50V2lkdGggPSB0aGlzLmdldEN1cnJlbnRXaWR0aCgpO1xuICAgIH1cblxuICAgIGNvbnN0IHRyaWdnZXJFbGVtID0gUmVhY3RET00uZmluZERPTU5vZGUodGhpcy50cmlnZ2VyKTtcbiAgICBpZiAodHJpZ2dlckVsZW0gIT09IGRvY3VtZW50LmFjdGl2ZUVsZW1lbnQpIHRyaWdnZXJFbGVtLmZvY3VzKCk7XG5cbiAgICBpZiAoIXRoaXMucHJvcHMuaG92ZXJQb3B1cCkge1xuICAgICAgdGhpcy5zZXRTdGF0ZSh7IG9wZW5lZDogIXRoaXMuc3RhdGUub3BlbmVkIH0pO1xuICAgIH1cbiAgICBpZiAodGhpcy5wcm9wcy5vbkNsaWNrKSB7XG4gICAgICB0aGlzLnByb3BzLm9uQ2xpY2soLi4uYXJncyk7XG4gICAgfVxuICB9XG5cbiAgb25NZW51SXRlbUNsaWNrKC4uLmFyZ3MpIHtcbiAgICBpZiAoIXRoaXMucHJvcHMuaG92ZXJQb3B1cCkge1xuICAgICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgIGNvbnN0IHRyaWdnZXJFbGVtID0gUmVhY3RET00uZmluZERPTU5vZGUodGhpcy50cmlnZ2VyKTtcbiAgICAgICAgaWYgKHRyaWdnZXJFbGVtKSB0cmlnZ2VyRWxlbS5mb2N1cygpO1xuICAgICAgICBpZiAodHJpZ2dlckVsZW0pIHRoaXMuc2V0U3RhdGUoeyBvcGVuZWQ6IGZhbHNlIH0pO1xuICAgICAgICBpZiAodGhpcy5wcm9wcy5mb2N1c09uSW5wdXQpIHRoaXMucHJvcHMuZm9jdXNPbklucHV0KCk7XG4gICAgICB9LCAxMCk7XG4gICAgfVxuICAgIGlmICh0aGlzLnByb3BzLm9uTWVudUl0ZW1DbGljaykge1xuICAgICAgdGhpcy5wcm9wcy5vbk1lbnVJdGVtQ2xpY2soLi4uYXJncyk7XG4gICAgfVxuICB9XG5cbiAgb25NZW51Q2xvc2UoKSB7XG4gICAgY29uc3QgdHJpZ2dlckVsZW0gPSBSZWFjdERPTS5maW5kRE9NTm9kZSh0aGlzLnRyaWdnZXIpO1xuICAgIHRyaWdnZXJFbGVtLmZvY3VzKCk7XG4gICAgdGhpcy5zZXRTdGF0ZSh7IG9wZW5lZDogZmFsc2UgfSk7XG4gIH1cblxuICBnZXRDdXJyZW50V2lkdGgoKSB7XG4gICAgY29uc3QgaHRtbEVsZW1udCA9IFJlYWN0RE9NLmZpbmRET01Ob2RlKHRoaXMpIHx8IHt9O1xuICAgIHJldHVybiBodG1sRWxlbW50Lm9mZnNldFdpZHRoIHx8IDA7XG4gIH1cblxuICBpc0ZvY3VzZWRJbkNvbXBvbmVudCgpIHtcbiAgICBjb25zdCByb290RWwgPSBSZWFjdERPTS5maW5kRE9NTm9kZSh0aGlzKTtcbiAgICBsZXQgdGFyZ2V0RWwgPSBkb2N1bWVudC5hY3RpdmVFbGVtZW50O1xuICAgIHdoaWxlICh0YXJnZXRFbCAmJiB0YXJnZXRFbCAhPT0gcm9vdEVsKSB7XG4gICAgICB0YXJnZXRFbCA9IHRhcmdldEVsLnBhcmVudE5vZGU7XG4gICAgfVxuICAgIHJldHVybiAhIXRhcmdldEVsO1xuICB9XG5cbiAgZm9jdXNUb1RhcmdldEl0ZW1FbCgpIHtcbiAgICBjb25zdCBkcm9wZG93bkVsID0gUmVhY3RET00uZmluZERPTU5vZGUodGhpcy5kcm9wZG93bik7XG4gICAgY29uc3QgZmlyc3RJdGVtRWwgPVxuICAgICAgZHJvcGRvd25FbC5xdWVyeVNlbGVjdG9yKCcuc2xkcy1pcy1zZWxlY3RlZCA+IC5yZWFjdC1zbGRzLW1lbnVpdGVtW3RhYkluZGV4XScpIHx8XG4gICAgICBkcm9wZG93bkVsLnF1ZXJ5U2VsZWN0b3IoJy5yZWFjdC1zbGRzLW1lbnVpdGVtW3RhYkluZGV4XScpO1xuICAgIGlmIChmaXJzdEl0ZW1FbCkge1xuICAgICAgZmlyc3RJdGVtRWwuZm9jdXMoKTtcbiAgICB9XG4gIH1cblxuICB0cmlnZ2VyUmVmKHJlZikge1xuICAgIHRoaXMudHJpZ2dlciA9IHJlZjtcbiAgfVxuXG4gIGRyb3Bkb3duUmVmKHJlZikge1xuICAgIHRoaXMuZHJvcGRvd24gPSByZWY7XG4gIH1cblxuICByZW5kZXJCdXR0b24oeyBncm91cGVkLCBpc0ZpcnN0SW5Hcm91cCwgaXNMYXN0SW5Hcm91cCwgLi4ucHJvcHMgfSkge1xuICAgIGNvbnN0IHBwcm9wcyA9IHsgLi4ucHJvcHMgfTtcbiAgICBkZWxldGUgcHByb3BzLm9uTWVudUl0ZW1DbGljaztcbiAgICBkZWxldGUgcHByb3BzLmluaGVyaXRXaWR0aDtcbiAgICBkZWxldGUgcHByb3BzLmZvY3VzT25JbnB1dDtcbiAgICBjb25zdCBidXR0b24gPSAoXG4gICAgICA8QnV0dG9uXG4gICAgICAgIHsgLi4ucHByb3BzIH1cbiAgICAgICAgYXJpYS1oYXNwb3B1cFxuICAgICAgICByZWY9e3RoaXMudHJpZ2dlclJlZn1cbiAgICAgICAgb25DbGljaz17IHRoaXMub25UcmlnZ2VyQ2xpY2suYmluZCh0aGlzKSB9XG4gICAgICAgIG9uS2V5RG93bj17IHRoaXMub25LZXlEb3duLmJpbmQodGhpcykgfVxuICAgICAgICBvbkJsdXI9eyB0aGlzLm9uQmx1ci5iaW5kKHRoaXMpIH1cbiAgICAgIC8+XG4gICAgKTtcblxuICAgIGlmIChncm91cGVkKSB7XG4gICAgICBjb25zdCBub25lU3R5bGUgPSB7IGRpc3BsYXk6ICdub25lJyB9O1xuICAgICAgcmV0dXJuIChcbiAgICAgICAgPGRpdiBjbGFzc05hbWU9J3NsZHMtYnV0dG9uLWdyb3VwJz5cbiAgICAgICAgICB7IGlzRmlyc3RJbkdyb3VwID8gbnVsbCA6IDxidXR0b24gY2xhc3NOYW1lPSdzbGRzLWJ1dHRvbicgc3R5bGU9eyBub25lU3R5bGUgfT48L2J1dHRvbj4gfVxuICAgICAgICAgIHsgYnV0dG9uIH1cbiAgICAgICAgICB7IGlzTGFzdEluR3JvdXAgPyBudWxsIDogPGJ1dHRvbiBjbGFzc05hbWU9J3NsZHMtYnV0dG9uJyBzdHlsZT17IG5vbmVTdHlsZSB9PjwvYnV0dG9uPiB9XG4gICAgICAgIDwvZGl2PlxuICAgICAgKTtcbiAgICB9XG5cbiAgICByZXR1cm4gYnV0dG9uO1xuICB9XG5cbiAgcmVuZGVyKCkge1xuICAgIGNvbnN0IHtcbiAgICAgIGluaGVyaXRXaWR0aCxcbiAgICAgIGNsYXNzTmFtZSwgbGlzdENsYXNzTmFtZSwgbWVudUNsYXNzTmFtZSwgbWVudUFsaWduID0gJ2xlZnQnLCBtZW51U2l6ZSwgbnViYmluVG9wLCBob3ZlclBvcHVwLFxuICAgICAgbWVudUhlYWRlciwgdHlwZSwgbGFiZWwsIGNoaWxkcmVuLCBiYWNrZ3JvdW5kQ29sb3IsIGtleUNvZGVzVG9DbG9zZU1lbnUsIC4uLnByb3BzLFxuICAgIH0gPSB0aGlzLnByb3BzO1xuICAgIGxldCB7IGljb24gfSA9IHRoaXMucHJvcHM7XG4gICAgY29uc3QgZHJvcGRvd25DbGFzc05hbWVzID0gY2xhc3NuYW1lcyhcbiAgICAgIGNsYXNzTmFtZSxcbiAgICAgICdzbGRzLWRyb3Bkb3duLXRyaWdnZXInLFxuICAgICAge1xuICAgICAgICAnc2xkcy1idXR0b24tc3BhY2UtbGVmdCc6ICFwcm9wcy5ncm91cGVkLFxuICAgICAgICAncmVhY3Qtc2xkcy1kcm9wZG93bi1vcGVuZWQnOiB0aGlzLnN0YXRlLm9wZW5lZCxcbiAgICAgIH1cbiAgICApO1xuICAgIGxldCBpY29uTW9yZSA9IG51bGw7XG4gICAgaWYgKCFsYWJlbCAmJiAhaWNvbikge1xuICAgICAgaWNvbiA9ICdkb3duJztcbiAgICB9XG4gICAgaWYgKGxhYmVsIHx8IHR5cGUgPT09ICdpY29uLW1vcmUnKSB7XG4gICAgICBpY29uTW9yZSA9ICdkb3duJztcbiAgICB9XG4gICAgcmV0dXJuIChcbiAgICAgIDxkaXYgY2xhc3NOYW1lPXsgZHJvcGRvd25DbGFzc05hbWVzIH0gc3R5bGU9e3sgYmFja2dyb3VuZENvbG9yIH19PlxuICAgICAgICB7IHRoaXMucmVuZGVyQnV0dG9uKHsgdHlwZSwgbGFiZWwsIGljb24sIGljb25Nb3JlLCAuLi5wcm9wcyB9KSB9XG4gICAgICAgIDxEcm9wZG93bk1lbnVcbiAgICAgICAgICBjbGFzc05hbWU9e21lbnVDbGFzc05hbWV9XG4gICAgICAgICAgbGlzdENsYXNzTmFtZT17bGlzdENsYXNzTmFtZX1cbiAgICAgICAgICBhbGlnbj17IG1lbnVBbGlnbiB9XG4gICAgICAgICAgbWluV2lkdGg9e2luaGVyaXRXaWR0aCA/IHRoaXMuY3VycmVudFdpZHRoIDogMH1cbiAgICAgICAgICBoZWFkZXI9eyBtZW51SGVhZGVyIH1cbiAgICAgICAgICBzaXplPXsgbWVudVNpemUgfVxuICAgICAgICAgIG51YmJpblRvcD17IG51YmJpblRvcCB9XG4gICAgICAgICAgaG92ZXJQb3B1cD17IGhvdmVyUG9wdXAgfVxuICAgICAgICAgIHJlZj17dGhpcy5kcm9wZG93blJlZn1cbiAgICAgICAgICBvbk1lbnVJdGVtQ2xpY2s9eyB0aGlzLm9uTWVudUl0ZW1DbGljay5iaW5kKHRoaXMpIH1cbiAgICAgICAgICBvbk1lbnVDbG9zZT17IHRoaXMub25NZW51Q2xvc2UuYmluZCh0aGlzKSB9XG4gICAgICAgICAgb25CbHVyPXsgdGhpcy5vbkJsdXIuYmluZCh0aGlzKSB9XG4gICAgICAgICAga2V5Q29kZXNUb0Nsb3NlTWVudT17IGtleUNvZGVzVG9DbG9zZU1lbnUgfVxuICAgICAgICA+XG4gICAgICAgICAgeyBjaGlsZHJlbiB9XG4gICAgICAgIDwvRHJvcGRvd25NZW51PlxuICAgICAgPC9kaXY+XG4gICAgKTtcbiAgfVxuXG59XG5cbkRyb3Bkb3duQnV0dG9uLnByb3BUeXBlcyA9IHtcbiAgY2xhc3NOYW1lOiBQcm9wVHlwZXMuc3RyaW5nLFxuICBsaXN0Q2xhc3NOYW1lOiBQcm9wVHlwZXMuc3RyaW5nLFxuICBtZW51Q2xhc3NOYW1lOiBQcm9wVHlwZXMuc3RyaW5nLFxuICBsYWJlbDogUHJvcFR5cGVzLm5vZGUsXG4gIHR5cGU6IFByb3BUeXBlcy5zdHJpbmcsXG4gIGljb246IFByb3BUeXBlcy5zdHJpbmcsXG4gIG1lbnVBbGlnbjogUHJvcFR5cGVzLm9uZU9mKFsnbGVmdCcsICdjZW50ZXInLCAncmlnaHQnXSksXG4gIG1lbnVTaXplOiBQcm9wVHlwZXMub25lT2YoWydzbWFsbCcsICdtZWRpdW0nLCAnbGFyZ2UnXSksXG4gIG1lbnVIZWFkZXI6IFByb3BUeXBlcy5zdHJpbmcsXG4gIG51YmJpblRvcDogUHJvcFR5cGVzLmJvb2wsXG4gIGhvdmVyUG9wdXA6IFByb3BUeXBlcy5ib29sLFxuICBvbkJsdXI6IFByb3BUeXBlcy5mdW5jLFxuICBvbkNsaWNrOiBQcm9wVHlwZXMuZnVuYyxcbiAgb25NZW51SXRlbUNsaWNrOiBQcm9wVHlwZXMuZnVuYyxcbiAgZ3JvdXBlZDogUHJvcFR5cGVzLmJvb2wsXG4gIGlzRmlyc3RJbkdyb3VwOiBQcm9wVHlwZXMuYm9vbCxcbiAgaXNMYXN0SW5Hcm91cDogUHJvcFR5cGVzLmJvb2wsXG4gIGNoaWxkcmVuOiBQcm9wVHlwZXMubm9kZSxcbiAgaW5oZXJpdFdpZHRoOiBQcm9wVHlwZXMuYm9vbCxcbiAgYmFja2dyb3VuZENvbG9yOiBQcm9wVHlwZXMuc3RyaW5nLFxuICBmb2N1c09uSW5wdXQ6IFByb3BUeXBlcy5mdW5jLFxuICBrZXlDb2Rlc1RvQ2xvc2VNZW51OiBQcm9wVHlwZXMuYXJyYXlPZihQcm9wVHlwZXMubnVtYmVyKSxcbn07XG4iXX0=