UNPKG

react-lightning-design-components

Version:

Salesforce Lightning Design System components built with React 16

393 lines (337 loc) 34.1 kB
'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 _classnames = require('classnames'); var _classnames2 = _interopRequireDefault(_classnames); var _uuid = require('uuid'); var _uuid2 = _interopRequireDefault(_uuid); var _FormElement = require('./FormElement'); var _FormElement2 = _interopRequireDefault(_FormElement); var _Input = require('./Input'); var _Input2 = _interopRequireDefault(_Input); var _Icon = require('./Icon'); var _Icon2 = _interopRequireDefault(_Icon); var _DropdownMenu = require('./DropdownMenu'); var _DropdownMenu2 = _interopRequireDefault(_DropdownMenu); var _util = require('./util'); var _propTypes = require('prop-types'); var _propTypes2 = _interopRequireDefault(_propTypes); function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } var TimeInput = function (_React$Component) { (0, _inherits3.default)(TimeInput, _React$Component); function TimeInput(props) { (0, _classCallCheck3.default)(this, TimeInput); var _this = (0, _possibleConstructorReturn3.default)(this, (TimeInput.__proto__ || (0, _getPrototypeOf2.default)(TimeInput)).call(this, props)); _this.state = { id: 'form-element-' + (0, _uuid2.default)(), opened: props.defaultOpened || false }; _this.onMenuItemClick = _this.onMenuItemClick.bind(_this); _this.inputRef = _this.inputRef.bind(_this); _this.dropdownRef = _this.dropdownRef.bind(_this); _this.timeepoch = { 10: 600, 15: 900, 20: 1200, 25: 1500, 30: 1800, DAY: 86400 }; (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; }']]); return _this; } (0, _createClass3.default)(TimeInput, [{ key: 'componentWillMount', value: function componentWillMount() { this.options = this.buildTimeOptions(); } }, { key: 'componentDidUpdate', value: function componentDidUpdate(prevProps, prevState) { if (this.props.onValueChange && prevState.value !== this.state.value) { this.props.onValueChange(this.state.value, prevState.value); } } }, { key: 'onMenuItemClick', value: function onMenuItemClick(event) { var value = event.target.textContent; this.closeTimePopUp(); this.setState({ value: value, inputValue: value }); } }, { key: 'onDropdownBlur', value: function onDropdownBlur(e) { // const target = e.currentTarget; var relatedTarget = e.relatedTarget || document.activeElement; var rootElement = _reactDom2.default.findDOMNode(this); if (relatedTarget && !rootElement.contains(relatedTarget)) { this.closeTimePopUp(); } } }, { key: 'onInputKeyDown', value: function onInputKeyDown(e) { var _this2 = this; if (e.keyCode === 13) { // return key e.preventDefault(); e.stopPropagation(); if (this.props.onComplete) { setTimeout(function () { _this2.props.onComplete(); }, 10); } } else if (e.keyCode === 27) { // esc this.closeTimePopUp(); } if (this.props.onKeyDown) { this.props.onKeyDown(e); } } }, { key: 'onInputChange', value: function onInputChange(e) { var inputValue = e.target.value; this.setState({ inputValue: inputValue, value: inputValue }); if (this.props.onChange) { this.props.onChange(e, inputValue); } } }, { key: 'onInputBlur', value: function onInputBlur() { var _this3 = this; setTimeout(function () { if (!_this3.isFocusedInComponent()) { _this3.closeTimePopUp(); if (_this3.props.onBlur) { _this3.props.onBlur(); } if (_this3.props.onComplete) { _this3.props.onComplete(); } } }, 10); } }, { 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() { if (this.state.opened) { var inputEl = _reactDom2.default.findDOMNode(this.input); setTimeout(function () { inputEl.focus(); }, 20); } } }, { key: 'toggleTimemenu', value: function toggleTimemenu() { var _this4 = this; setTimeout(function () { _this4.setState({ opened: !_this4.state.opened }); _this4.focusToTargetItemEl(); }, 10); } }, { key: 'closeTimePopUp', value: function closeTimePopUp() { var _this5 = this; setTimeout(function () { _this5.setState({ opened: false }); }, 10); } }, { key: 'buildTimeOptions', value: function buildTimeOptions() { var _ref = [this.props.resolution, this.props.format, this.props.inputValue], resolution = _ref[0], format = _ref[1], inputValue = _ref[2]; // min 10 - max 30 || default 30 min || format 12||24 var step = resolution in this.timeepoch ? resolution : 30; var loops = this.timeepoch.DAY / this.timeepoch[step] + 1; var hour = 0, min = 0, AMPM = 'AM'; var minToDisplay = 0, hour12format = 0, hour24format = 0, finalOption = 0; var isSelected = 'none'; var options = []; while (loops) { minToDisplay = min === 0 ? '00' : min; hour12format = hour > 12 ? hour - 12 : hour; hour12format = hour === 0 ? 12 : hour12format; hour12format = hour12format < 10 ? '0' + hour12format : hour12format; // optional hour24format = hour < 10 ? '0' + hour : hour; // optional finalOption = format === 12 ? hour12format + ':' + minToDisplay + ' ' + AMPM : hour24format + ':' + minToDisplay; isSelected = finalOption === inputValue ? 'check' : 'none'; options.push(_react2.default.createElement( _DropdownMenu.DropdownMenuItem, { key: loops, onClick: this.onMenuItemClick, icon: isSelected, value: finalOption }, finalOption )); min += step; if (min === 60) { hour += 1; min = 0; } if (hour === 12 && min === 0) { AMPM = AMPM === 'AM' ? 'PM' : 'AM'; } loops--; } return options; } }, { key: 'inputRef', value: function inputRef(ref) { this.input = ref; } }, { key: 'dropdownRef', value: function dropdownRef(ref) { this.dropdown = ref; } }, { key: 'renderInput', value: function renderInput(_ref2) { var inputValue = _ref2.inputValue, openMenuOnInputClick = _ref2.openMenuOnInputClick, dontUseDefaultValue = _ref2.dontUseDefaultValue, props = (0, _objectWithoutProperties3.default)(_ref2, ['inputValue', 'openMenuOnInputClick', 'dontUseDefaultValue']); var internalInputValue = dontUseDefaultValue ? this.state.inputValue : this.state.inputValue || inputValue; return _react2.default.createElement( 'div', { className: 'slds-input-has-icon slds-input-has-icon--right' }, _react2.default.createElement(_Input2.default, (0, _extends3.default)({ ref: this.inputRef }, props, { value: internalInputValue, onKeyDown: this.onInputKeyDown.bind(this), onChange: this.onInputChange.bind(this), onBlur: this.onInputBlur.bind(this), onClick: openMenuOnInputClick ? this.toggleTimemenu.bind(this) : undefined })), _react2.default.createElement(_Icon2.default, { icon: 'clock', className: 'slds-input__icon', style: { cursor: 'pointer' }, onClick: this.toggleTimemenu.bind(this) }) ); } }, { key: 'render', value: function render() { var id = this.props.id || this.state.id; var _props = this.props, className = _props.className, totalCols = _props.totalCols, cols = _props.cols, label = _props.label, required = _props.required, error = _props.error, maxHeight = _props.maxHeight, tooltip = _props.tooltip, props = (0, _objectWithoutProperties3.default)(_props, ['className', 'totalCols', 'cols', 'label', 'required', 'error', 'maxHeight', 'tooltip']); var dropdownClassNames = (0, _classnames2.default)(className, 'slds-dropdown-trigger', { 'react-slds-dropdown-opened': this.state.opened }); var formElemProps = { id: id, totalCols: totalCols, cols: cols, label: label, required: required, error: error, tooltip: tooltip }; delete props.resolution; delete props.onValueChange; return _react2.default.createElement( _FormElement2.default, (0, _extends3.default)({ key: id }, formElemProps), _react2.default.createElement( 'div', { className: dropdownClassNames }, this.renderInput((0, _extends3.default)({ id: id }, props)), _react2.default.createElement( _DropdownMenu2.default, { align: 'left', size: 'small', autoFocus: true, ref: this.dropdownRef, maxHeight: maxHeight, onKeyDown: this.onInputKeyDown.bind(this), onBlur: this.onDropdownBlur.bind(this) }, this.options ) ) ); } }]); return TimeInput; }(_react2.default.Component); exports.default = TimeInput; TimeInput.propTypes = { id: _propTypes2.default.string, className: _propTypes2.default.string, label: _propTypes2.default.string, required: _propTypes2.default.bool, format: _propTypes2.default.number, resolution: _propTypes2.default.number, inputValue: _propTypes2.default.string, maxHeight: _propTypes2.default.number, onMenuItemClick: _propTypes2.default.func, 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, value: _propTypes2.default.string, onKeyDown: _propTypes2.default.func, onBlur: _propTypes2.default.func, defaultValue: _propTypes2.default.string, defaultOpened: _propTypes2.default.bool, dateFormat: _propTypes2.default.string, onChange: _propTypes2.default.func, onValueChange: _propTypes2.default.func, onComplete: _propTypes2.default.func, dontUseDefaultValue: _propTypes2.default.bool, openMenuOnInputClick: _propTypes2.default.bool, tooltip: _propTypes2.default.element }; TimeInput.isFormElement = true; //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9zY3JpcHRzL1RpbWVJbnB1dC5qcyJdLCJuYW1lcyI6WyJUaW1lSW5wdXQiLCJwcm9wcyIsInN0YXRlIiwiaWQiLCJvcGVuZWQiLCJkZWZhdWx0T3BlbmVkIiwib25NZW51SXRlbUNsaWNrIiwiYmluZCIsImlucHV0UmVmIiwiZHJvcGRvd25SZWYiLCJ0aW1lZXBvY2giLCJEQVkiLCJvcHRpb25zIiwiYnVpbGRUaW1lT3B0aW9ucyIsInByZXZQcm9wcyIsInByZXZTdGF0ZSIsIm9uVmFsdWVDaGFuZ2UiLCJ2YWx1ZSIsImV2ZW50IiwidGFyZ2V0IiwidGV4dENvbnRlbnQiLCJjbG9zZVRpbWVQb3BVcCIsInNldFN0YXRlIiwiaW5wdXRWYWx1ZSIsImUiLCJyZWxhdGVkVGFyZ2V0IiwiZG9jdW1lbnQiLCJhY3RpdmVFbGVtZW50Iiwicm9vdEVsZW1lbnQiLCJmaW5kRE9NTm9kZSIsImNvbnRhaW5zIiwia2V5Q29kZSIsInByZXZlbnREZWZhdWx0Iiwic3RvcFByb3BhZ2F0aW9uIiwib25Db21wbGV0ZSIsInNldFRpbWVvdXQiLCJvbktleURvd24iLCJvbkNoYW5nZSIsImlzRm9jdXNlZEluQ29tcG9uZW50Iiwib25CbHVyIiwicm9vdEVsIiwidGFyZ2V0RWwiLCJwYXJlbnROb2RlIiwiaW5wdXRFbCIsImlucHV0IiwiZm9jdXMiLCJmb2N1c1RvVGFyZ2V0SXRlbUVsIiwicmVzb2x1dGlvbiIsImZvcm1hdCIsInN0ZXAiLCJsb29wcyIsImhvdXIiLCJtaW4iLCJBTVBNIiwibWluVG9EaXNwbGF5IiwiaG91cjEyZm9ybWF0IiwiaG91cjI0Zm9ybWF0IiwiZmluYWxPcHRpb24iLCJpc1NlbGVjdGVkIiwicHVzaCIsInJlZiIsImRyb3Bkb3duIiwib3Blbk1lbnVPbklucHV0Q2xpY2siLCJkb250VXNlRGVmYXVsdFZhbHVlIiwiaW50ZXJuYWxJbnB1dFZhbHVlIiwib25JbnB1dEtleURvd24iLCJvbklucHV0Q2hhbmdlIiwib25JbnB1dEJsdXIiLCJ0b2dnbGVUaW1lbWVudSIsInVuZGVmaW5lZCIsImN1cnNvciIsImNsYXNzTmFtZSIsInRvdGFsQ29scyIsImNvbHMiLCJsYWJlbCIsInJlcXVpcmVkIiwiZXJyb3IiLCJtYXhIZWlnaHQiLCJ0b29sdGlwIiwiZHJvcGRvd25DbGFzc05hbWVzIiwiZm9ybUVsZW1Qcm9wcyIsInJlbmRlcklucHV0Iiwib25Ecm9wZG93bkJsdXIiLCJDb21wb25lbnQiLCJwcm9wVHlwZXMiLCJzdHJpbmciLCJib29sIiwibnVtYmVyIiwiZnVuYyIsIm9uZU9mVHlwZSIsInNoYXBlIiwibWVzc2FnZSIsImRlZmF1bHRWYWx1ZSIsImRhdGVGb3JtYXQiLCJlbGVtZW50IiwiaXNGb3JtRWxlbWVudCJdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQUFBOzs7O0FBQ0E7Ozs7QUFDQTs7OztBQUNBOzs7O0FBQ0E7Ozs7QUFDQTs7OztBQUNBOzs7O0FBQ0E7Ozs7QUFDQTs7QUFDQTs7Ozs7O0lBRXFCQSxTOzs7QUFDbkIscUJBQVlDLEtBQVosRUFBbUI7QUFBQTs7QUFBQSw0SUFDWEEsS0FEVzs7QUFFakIsVUFBS0MsS0FBTCxHQUFhO0FBQ1hDLDRCQUFvQixxQkFEVDtBQUVYQyxjQUFRSCxNQUFNSSxhQUFOLElBQXVCO0FBRnBCLEtBQWI7QUFJQSxVQUFLQyxlQUFMLEdBQXVCLE1BQUtBLGVBQUwsQ0FBcUJDLElBQXJCLE9BQXZCO0FBQ0EsVUFBS0MsUUFBTCxHQUFnQixNQUFLQSxRQUFMLENBQWNELElBQWQsT0FBaEI7QUFDQSxVQUFLRSxXQUFMLEdBQW1CLE1BQUtBLFdBQUwsQ0FBaUJGLElBQWpCLE9BQW5COztBQUVBLFVBQUtHLFNBQUwsR0FBaUI7QUFDZixVQUFJLEdBRFc7QUFFZixVQUFJLEdBRlc7QUFHZixVQUFJLElBSFc7QUFJZixVQUFJLElBSlc7QUFLZixVQUFJLElBTFc7QUFNZkMsV0FBSztBQU5VLEtBQWpCO0FBUUEsNkJBQWMsZ0JBQWQsRUFBZ0MsQ0FDOUIsQ0FD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QUFNcEJ4QyxjQUFZLG9CQUFVd0MsTUFORjtBQU9wQmhFLGNBQVksb0JBQVU4RCxNQVBGO0FBUXBCUixhQUFXLG9CQUFVVSxNQVJEO0FBU3BCakYsbUJBQWlCLG9CQUFVa0YsSUFUUDtBQVVwQlosU0FBTyxvQkFBVWEsU0FBVixDQUFvQixDQUN6QixvQkFBVUgsSUFEZSxFQUV6QixvQkFBVUQsTUFGZSxFQUd6QixvQkFBVUssS0FBVixDQUFnQjtBQUNkQyxhQUFTLG9CQUFVTjtBQURMLEdBQWhCLENBSHlCLENBQXBCLENBVmE7QUFpQnBCYixhQUFXLG9CQUFVZSxNQWpCRDtBQWtCcEJkLFFBQU0sb0JBQVVjLE1BbEJJO0FBbUJwQnRFLFNBQU8sb0JBQVVvRSxNQW5CRztBQW9CcEJqRCxhQUFXLG9CQUFVb0QsSUFwQkQ7QUFxQnBCakQsVUFBUSxvQkFBVWlELElBckJFO0FBc0JwQkksZ0JBQWMsb0JBQVVQLE1BdEJKO0FBdUJwQmhGLGlCQUFlLG9CQUFVaUYsSUF2Qkw7QUF3QnBCTyxjQUFZLG9CQUFVUixNQXhCRjtBQXlCcEJoRCxZQUFVLG9CQUFVbUQsSUF6QkE7QUEwQnBCeEUsaUJBQWUsb0JBQVV3RSxJQTFCTDtBQTJCcEJ0RCxjQUFZLG9CQUFVc0QsSUEzQkY7QUE0QnBCekIsdUJBQXFCLG9CQUFVdUIsSUE1Qlg7QUE2QnBCeEIsd0JBQXNCLG9CQUFVd0IsSUE3Qlo7QUE4QnBCUixXQUFTLG9CQUFVZ0I7QUE5QkMsQ0FBdEI7O0FBaUNBOUYsVUFBVStGLGFBQVYsR0FBMEIsSUFBMUIiLCJmaWxlIjoiVGltZUlucHV0LmpzIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IFJlYWN0IGZyb20gJ3JlYWN0JztcbmltcG9ydCBSZWFjdERPTSBmcm9tICdyZWFjdC1kb20nO1xuaW1wb3J0IGNsYXNzbmFtZXMgZnJvbSAnY2xhc3NuYW1lcyc7XG5pbXBvcnQgdXVpZCBmcm9tICd1dWlkJztcbmltcG9ydCBGb3JtRWxlbWVudCBmcm9tICcuL0Zvcm1FbGVtZW50JztcbmltcG9ydCBJbnB1dCBmcm9tICcuL0lucHV0JztcbmltcG9ydCBJY29uIGZyb20gJy4vSWNvbic7XG5pbXBvcnQgRHJvcGRvd25NZW51LCB7IERyb3Bkb3duTWVudUl0ZW0gfSBmcm9tICcuL0Ryb3Bkb3duTWVudSc7XG5pbXBvcnQgeyByZWdpc3RlclN0eWxlIH0gZnJvbSAnLi91dGlsJztcbmltcG9ydCBQcm9wVHlwZXMgZnJvbSAncHJvcC10eXBlcyc7XG5cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIFRpbWVJbnB1dCBleHRlbmRzIFJlYWN0LkNvbXBvbmVudCB7XG4gIGNvbnN0cnVjdG9yKHByb3BzKSB7XG4gICAgc3VwZXIocHJvcHMpO1xuICAgIHRoaXMuc3RhdGUgPSB7XG4gICAgICBpZDogYGZvcm0tZWxlbWVudC0ke3V1aWQoKX1gLFxuICAgICAgb3BlbmVkOiBwcm9wcy5kZWZhdWx0T3BlbmVkIHx8IGZhbHNlLFxuICAgIH07XG4gICAgdGhpcy5vbk1lbnVJdGVtQ2xpY2sgPSB0aGlzLm9uTWVudUl0ZW1DbGljay5iaW5kKHRoaXMpO1xuICAgIHRoaXMuaW5wdXRSZWYgPSB0aGlzLmlucHV0UmVmLmJpbmQodGhpcyk7XG4gICAgdGhpcy5kcm9wZG93blJlZiA9IHRoaXMuZHJvcGRvd25SZWYuYmluZCh0aGlzKTtcblxuICAgIHRoaXMudGltZWVwb2NoID0ge1xuICAgICAgMTA6IDYwMCxcbiAgICAgIDE1OiA5MDAsXG4gICAgICAyMDogMTIwMCxcbiAgICAgIDI1OiAxNTAwLFxuICAgICAgMzA6IDE4MDAsXG4gICAgICBEQVk6IDg2NDAwLFxuICAgIH07XG4gICAgcmVnaXN0ZXJTdHlsZSgnbm8taG92ZXItcG9wdXAnLCBbXG4gICAgICBbXG4gICAgICAgICcuc2xkcy1kcm9wZG93bi10cmlnZ2VyOmhvdmVyIC5zbGRzLWRyb3Bkb3duLS1tZW51LnJlYWN0LXNsZHMtbm8taG92ZXItcG9wdXAnLFxuICAgICAgICAneyB2aXNpYmlsaXR5OiBoaWRkZW47IG9wYWNpdHk6IDA7IH0nLFxuICAgICAgXSxcbiAgICAgIFtcbiAgICAgICAgJy5zbGRzLWRyb3Bkb3duLXRyaWdnZXIucmVhY3Qtc2xkcy1kcm9wZG93bi1vcGVuZWQgLnNsZHMtZHJvcGRvd24tLW1lbnUnLFxuICAgICAgICAneyB2aXNpYmlsaXR5OiB2aXNpYmxlICFpbXBvcnRhbnQ7IG9wYWNpdHk6IDEgIWltcG9ydGFudDsgfScsXG4gICAgICBdLFxuICAgIF0pO1xuICB9XG5cbiAgY29tcG9uZW50V2lsbE1vdW50KCkge1xuICAgIHRoaXMub3B0aW9ucyA9IHRoaXMuYnVpbGRUaW1lT3B0aW9ucygpO1xuICB9XG5cbiAgY29tcG9uZW50RGlkVXBkYXRlKHByZXZQcm9wcywgcHJldlN0YXRlKSB7XG4gICAgaWYgKHRoaXMucHJvcHMub25WYWx1ZUNoYW5nZSAmJiBwcmV2U3RhdGUudmFsdWUgIT09IHRoaXMuc3RhdGUudmFsdWUpIHtcbiAgICAgIHRoaXMucHJvcHMub25WYWx1ZUNoYW5nZSh0aGlzLnN0YXRlLnZhbHVlLCBwcmV2U3RhdGUudmFsdWUpO1xuICAgIH1cbiAgfVxuXG4gIG9uTWVudUl0ZW1DbGljayhldmVudCkge1xuICAgIGNvbnN0IHZhbHVlID0gZXZlbnQudGFyZ2V0LnRleHRDb250ZW50O1xuICAgIHRoaXMuY2xvc2VUaW1lUG9wVXAoKTtcbiAgICB0aGlzLnNldFN0YXRlKHsgdmFsdWUsIGlucHV0VmFsdWU6IHZhbHVlIH0pO1xuICB9XG5cbiAgb25Ecm9wZG93bkJsdXIoZSkge1xuICAgIC8vIGNvbnN0IHRhcmdldCA9IGUuY3VycmVudFRhcmdldDtcbiAgICBjb25zdCByZWxhdGVkVGFyZ2V0ID0gZS5yZWxhdGVkVGFyZ2V0IHx8IGRvY3VtZW50LmFjdGl2ZUVsZW1lbnQ7XG4gICAgY29uc3Qgcm9vdEVsZW1lbnQgPSBSZWFjdERPTS5maW5kRE9NTm9kZSh0aGlzKTtcbiAgICBpZiAocmVsYXRlZFRhcmdldCAmJiAhcm9vdEVsZW1lbnQuY29udGFpbnMocmVsYXRlZFRhcmdldCkpIHtcbiAgICAgIHRoaXMuY2xvc2VUaW1lUG9wVXAoKTtcbiAgICB9XG4gIH1cblxuICBvbklucHV0S2V5RG93bihlKSB7XG4gICAgaWYgKGUua2V5Q29kZSA9PT0gMTMpIHtcbiAgICAgIC8vIHJldHVybiBrZXlcbiAgICAgIGUucHJldmVudERlZmF1bHQoKTtcbiAgICAgIGUuc3RvcFByb3BhZ2F0aW9uKCk7XG4gICAgICBpZiAodGhpcy5wcm9wcy5vbkNvbXBsZXRlKSB7XG4gICAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICAgIHRoaXMucHJvcHMub25Db21wbGV0ZSgpO1xuICAgICAgICB9LCAxMCk7XG4gICAgICB9XG4gICAgfSBlbHNlIGlmIChlLmtleUNvZGUgPT09IDI3KSB7XG4gICAgICAvLyBlc2NcbiAgICAgIHRoaXMuY2xvc2VUaW1lUG9wVXAoKTtcbiAgICB9XG4gICAgaWYgKHRoaXMucHJvcHMub25LZXlEb3duKSB7XG4gICAgICB0aGlzLnByb3BzLm9uS2V5RG93bihlKTtcbiAgICB9XG4gIH1cblxuICBvbklucHV0Q2hhbmdlKGUpIHtcbiAgICBjb25zdCBpbnB1dFZhbHVlID0gZS50YXJnZXQudmFsdWU7XG4gICAgdGhpcy5zZXRTdGF0ZSh7IGlucHV0VmFsdWUsIHZhbHVlOiBpbnB1dFZhbHVlIH0pO1xuICAgIGlmICh0aGlzLnByb3BzLm9uQ2hhbmdlKSB7XG4gICAgICB0aGlzLnByb3BzLm9uQ2hhbmdlKGUsIGlucHV0VmFsdWUpO1xuICAgIH1cbiAgfVxuXG4gIG9uSW5wdXRCbHVyKCkge1xuICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgaWYgKCF0aGlzLmlzRm9jdXNlZEluQ29tcG9uZW50KCkpIHtcbiAgICAgICAgdGhpcy5jbG9zZVRpbWVQb3BVcCgpO1xuICAgICAgICBpZiAodGhpcy5wcm9wcy5vbkJsdXIpIHtcbiAgICAgICAgICB0aGlzLnByb3BzLm9uQmx1cigpO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0aGlzLnByb3BzLm9uQ29tcGxldGUpIHtcbiAgICAgICAgICB0aGlzLnByb3BzLm9uQ29tcGxldGUoKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0sIDEwKTtcbiAgfVxuXG4gIGlzRm9jdXNlZEluQ29tcG9uZW50KCkge1xuICAgIGNvbnN0IHJvb3RFbCA9IFJlYWN0RE9NLmZpbmRET01Ob2RlKHRoaXMpO1xuICAgIGxldCB0YXJnZXRFbCA9IGRvY3VtZW50LmFjdGl2ZUVsZW1lbnQ7XG4gICAgd2hpbGUgKHRhcmdldEVsICYmIHRhcmdldEVsICE9PSByb290RWwpIHtcbiAgICAgIHRhcmdldEVsID0gdGFyZ2V0RWwucGFyZW50Tm9kZTtcbiAgICB9XG4gICAgcmV0dXJuICEhdGFyZ2V0RWw7XG4gIH1cblxuICBmb2N1c1RvVGFyZ2V0SXRlbUVsKCkge1xuICAgIGlmICh0aGlzLnN0YXRlLm9wZW5lZCkge1xuICAgICAgY29uc3QgaW5wdXRFbCA9IFJlYWN0RE9NLmZpbmRET01Ob2RlKHRoaXMuaW5wdXQpO1xuICAgICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgIGlucHV0RWwuZm9jdXMoKTtcbiAgICAgIH0sIDIwKTtcbiAgICB9XG4gIH1cblxuICB0b2dnbGVUaW1lbWVudSgpIHtcbiAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgIHRoaXMuc2V0U3RhdGUoeyBvcGVuZWQ6ICF0aGlzLnN0YXRlLm9wZW5lZCB9KTtcbiAgICAgIHRoaXMuZm9jdXNUb1RhcmdldEl0ZW1FbCgpO1xuICAgIH0sIDEwKTtcbiAgfVxuXG4gIGNsb3NlVGltZVBvcFVwKCkge1xuICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgdGhpcy5zZXRTdGF0ZSh7IG9wZW5lZDogZmFsc2UgfSk7XG4gICAgfSwgMTApO1xuICB9XG5cbiAgYnVpbGRUaW1lT3B0aW9ucygpIHtcbiAgICBjb25zdCBbcmVzb2x1dGlvbiwgZm9ybWF0LCBpbnB1dFZhbHVlXSA9IFtcbiAgICAgIHRoaXMucHJvcHMucmVzb2x1dGlvbixcbiAgICAgIHRoaXMucHJvcHMuZm9ybWF0LFxuICAgICAgdGhpcy5wcm9wcy5pbnB1dFZhbHVlLFxuICAgIF07XG4gICAgLy8gbWluIDEwIC0gbWF4IDMwIHx8IGRlZmF1bHQgMzAgbWluIHx8IGZvcm1hdCAxMnx8MjRcbiAgICBjb25zdCBzdGVwID0gcmVzb2x1dGlvbiBpbiB0aGlzLnRpbWVlcG9jaCA/IHJlc29sdXRpb24gOiAzMDtcbiAgICBsZXQgbG9vcHMgPSB0aGlzLnRpbWVlcG9jaC5EQVkgLyB0aGlzLnRpbWVlcG9jaFtzdGVwXSArIDE7XG4gICAgbGV0IFtob3VyLCBtaW4sIEFNUE1dID0gWzAsIDAsICdBTSddO1xuICAgIGxldCBbbWluVG9EaXNwbGF5LCBob3VyMTJmb3JtYXQsIGhvdXIyNGZvcm1hdCwgZmluYWxPcHRpb25dID0gWzAsIDAsIDAsIDBdO1xuICAgIGxldCBpc1NlbGVjdGVkID0gJ25vbmUnO1xuICAgIGNvbnN0IG9wdGlvbnMgPSBbXTtcblxuICAgIHdoaWxlIChsb29wcykge1xuICAgICAgbWluVG9EaXNwbGF5ID0gbWluID09PSAwID8gJzAwJyA6IG1pbjtcbiAgICAgIGhvdXIxMmZvcm1hdCA9IGhvdXIgPiAxMiA/IGhvdXIgLSAxMiA6IGhvdXI7XG4gICAgICBob3VyMTJmb3JtYXQgPSBob3VyID09PSAwID8gMTIgOiBob3VyMTJmb3JtYXQ7XG4gICAgICBob3VyMTJmb3JtYXQgPSBob3VyMTJmb3JtYXQgPCAxMCA/IGAwJHtob3VyMTJmb3JtYXR9YCA6IGhvdXIxMmZvcm1hdDsgLy8gb3B0aW9uYWxcbiAgICAgIGhvdXIyNGZvcm1hdCA9IGhvdXIgPCAxMCA/IGAwJHtob3VyfWAgOiBob3VyOyAvLyBvcHRpb25hbFxuICAgICAgZmluYWxPcHRpb24gPVxuICAgICAgICBmb3JtYXQgPT09IDEyXG4gICAgICAgICAgPyBgJHtob3VyMTJmb3JtYXR9OiR7bWluVG9EaXNwbGF5fSAke0FNUE19YFxuICAgICAgICAgIDogYCR7aG91cjI0Zm9ybWF0fToke21pblRvRGlzcGxheX1gO1xuICAgICAgaXNTZWxlY3RlZCA9IGZpbmFsT3B0aW9uID09PSBpbnB1dFZhbHVlID8gJ2NoZWNrJyA6ICdub25lJztcbiAgICAgIG9wdGlvbnMucHVzaChcbiAgICAgICAgPERyb3Bkb3duTWVudUl0ZW1cbiAgICAgICAgICBrZXk9e2xvb3BzfVxuICAgICAgICAgIG9uQ2xpY2s9e3RoaXMub25NZW51SXRlbUNsaWNrfVxuICAgICAgICAgIGljb249e2lzU2VsZWN0ZWR9XG4gICAgICAgICAgdmFsdWU9e2ZpbmFsT3B0aW9ufVxuICAgICAgICA+XG4gICAgICAgICAge2ZpbmFsT3B0aW9ufVxuICAgICAgICA8L0Ryb3Bkb3duTWVudUl0ZW0+XG4gICAgICApO1xuICAgICAgbWluICs9IHN0ZXA7XG4gICAgICBpZiAobWluID09PSA2MCkge1xuICAgICAgICBob3VyICs9IDE7XG4gICAgICAgIG1pbiA9IDA7XG4gICAgICB9XG4gICAgICBpZiAoaG91ciA9PT0gMTIgJiYgbWluID09PSAwKSB7XG4gICAgICAgIEFNUE0gPSBBTVBNID09PSAnQU0nID8gJ1BNJyA6ICdBTSc7XG4gICAgICB9XG4gICAgICBsb29wcy0tO1xuICAgIH1cbiAgICByZXR1cm4gb3B0aW9ucztcbiAgfVxuXG4gIGlucHV0UmVmKHJlZikge1xuICAgIHRoaXMuaW5wdXQgPSByZWY7XG4gIH1cblxuICBkcm9wZG93blJlZihyZWYpIHtcbiAgICB0aGlzLmRyb3Bkb3duID0gcmVmO1xuICB9XG5cbiAgcmVuZGVySW5wdXQoe1xuICAgIGlucHV0VmFsdWUsXG4gICAgb3Blbk1lbnVPbklucHV0Q2xpY2ssXG4gICAgZG9udFVzZURlZmF1bHRWYWx1ZSxcbiAgICAuLi5wcm9wcyxcbiAgfSkge1xuICAgIGNvbnN0IGludGVybmFsSW5wdXRWYWx1ZSA9IGRvbnRVc2VEZWZhdWx0VmFsdWVcbiAgICAgID8gdGhpcy5zdGF0ZS5pbnB1dFZhbHVlXG4gICAgICA6IHRoaXMuc3RhdGUuaW5wdXRWYWx1ZSB8fCBpbnB1dFZhbHVlO1xuICAgIHJldHVybiAoXG4gICAgICA8ZGl2IGNsYXNzTmFtZT0nc2xkcy1pbnB1dC1oYXMtaWNvbiBzbGRzLWlucHV0LWhhcy1pY29uLS1yaWdodCc+XG4gICAgICAgIDxJbnB1dFxuICAgICAgICAgIHJlZj17dGhpcy5pbnB1dFJlZn1cbiAgICAgICAgICB7Li4ucHJvcHN9XG4gICAgICAgICAgdmFsdWU9e2ludGVybmFsSW5wdXRWYWx1ZX1cbiAgICAgICAgICBvbktleURvd249e3RoaXMub25JbnB1dEtleURvd24uYmluZCh0aGlzKX1cbiAgICAgICAgICBvbkNoYW5nZT17dGhpcy5vbklucHV0Q2hhbmdlLmJpbmQodGhpcyl9XG4gICAgICAgICAgb25CbHVyPXt0aGlzLm9uSW5wdXRCbHVyLmJpbmQodGhpcyl9XG4gICAgICAgICAgb25DbGljaz17XG4gICAgICAgICAgICBvcGVuTWVudU9uSW5wdXRDbGljayA/IHRoaXMudG9nZ2xlVGltZW1lbnUuYmluZCh0aGlzKSA6IHVuZGVmaW5lZFxuICAgICAgICAgIH1cbiAgICAgICAgLz5cbiAgICAgICAgPEljb25cbiAgICAgICAgICBpY29uPSdjbG9jaydcbiAgICAgICAgICBjbGFzc05hbWU9J3NsZHMtaW5wdXRfX2ljb24nXG4gICAgICAgICAgc3R5bGU9e3sgY3Vyc29yOiAncG9pbnRlcicgfX1cbiAgICAgICAgICBvbkNsaWNrPXt0aGlzLnRvZ2dsZVRpbWVtZW51LmJpbmQodGhpcyl9XG4gICAgICAgIC8+XG4gICAgICA8L2Rpdj5cbiAgICApO1xuICB9XG5cbiAgcmVuZGVyKCkge1xuICAgIGNvbnN0IGlkID0gdGhpcy5wcm9wcy5pZCB8fCB0aGlzLnN0YXRlLmlkO1xuICAgIGNvbnN0IHtcbiAgICAgIGNsYXNzTmFtZSxcbiAgICAgIHRvdGFsQ29scyxcbiAgICAgIGNvbHMsXG4gICAgICBsYWJlbCxcbiAgICAgIHJlcXVpcmVkLFxuICAgICAgZXJyb3IsXG4gICAgICBtYXhIZWlnaHQsXG4gICAgICB0b29sdGlwLFxuICAgICAgLi4ucHJvcHMsXG4gICAgfSA9IHRoaXMucHJvcHM7XG5cbiAgICBjb25zdCBkcm9wZG93bkNsYXNzTmFtZXMgPSBjbGFzc25hbWVzKGNsYXNzTmFtZSwgJ3NsZHMtZHJvcGRvd24tdHJpZ2dlcicsIHtcbiAgICAgICdyZWFjdC1zbGRzLWRyb3Bkb3duLW9wZW5lZCc6IHRoaXMuc3RhdGUub3BlbmVkLFxuICAgIH0pO1xuXG4gICAgY29uc3QgZm9ybUVsZW1Qcm9wcyA9IHsgaWQsIHRvdGFsQ29scywgY29scywgbGFiZWwsIHJlcXVpcmVkLCBlcnJvciwgdG9vbHRpcCB9O1xuICAgIGRlbGV0ZSBwcm9wcy5yZXNvbHV0aW9uO1xuICAgIGRlbGV0ZSBwcm9wcy5vblZhbHVlQ2hhbmdlO1xuICAgIHJldHVybiAoXG4gICAgICA8Rm9ybUVsZW1lbnQga2V5PXtpZH0gey4uLmZvcm1FbGVtUHJvcHN9PlxuICAgICAgICA8ZGl2IGNsYXNzTmFtZT17ZHJvcGRvd25DbGFzc05hbWVzfT5cbiAgICAgICAgICB7dGhpcy5yZW5kZXJJbnB1dCh7IGlkLCAuLi5wcm9wcyB9KX1cbiAgICAgICAgICA8RHJvcGRvd25NZW51XG4gICAgICAgICAgICBhbGlnbj17J2xlZnQnfVxuICAgICAgICAgICAgc2l6ZT17J3NtYWxsJ31cbiAgICAgICAgICAgIGF1dG9Gb2N1c1xuICAgICAgICAgICAgcmVmPXt0aGlzLmRyb3Bkb3duUmVmfVxuICAgICAgICAgICAgbWF4SGVpZ2h0PXttYXhIZWlnaHR9XG4gICAgICAgICAgICBvbktleURvd249e3RoaXMub25JbnB1dEtleURvd24uYmluZCh0aGlzKX1cbiAgICAgICAgICAgIG9uQmx1cj17dGhpcy5vbkRyb3Bkb3duQmx1ci5iaW5kKHRoaXMpfVxuICAgICAgICAgID5cbiAgICAgICAgICAgIHt0aGlzLm9wdGlvbnN9XG4gICAgICAgICAgPC9Ecm9wZG93bk1lbnU+XG4gICAgICAgIDwvZGl2PlxuICAgICAgPC9Gb3JtRWxlbWVudD5cbiAgICApO1xuICB9XG59XG5cblRpbWVJbnB1dC5wcm9wVHlwZXMgPSB7XG4gIGlkOiBQcm9wVHlwZXMuc3RyaW5nLFxuICBjbGFzc05hbWU6IFByb3BUeXBlcy5zdHJpbmcsXG4gIGxhYmVsOiBQcm9wVHlwZXMuc3RyaW5nLFxuICByZXF1aXJlZDogUHJvcFR5cGVzLmJvb2wsXG4gIGZvcm1hdDogUHJvcFR5cGVzLm51bWJlcixcbiAgcmVzb2x1dGlvbjogUHJvcFR5cGVzLm51bWJlcixcbiAgaW5wdXRWYWx1ZTogUHJvcFR5cGVzLnN0cmluZyxcbiAgbWF4SGVpZ2h0OiBQcm9wVHlwZXMubnVtYmVyLFxuICBvbk1lbnVJdGVtQ2xpY2s6IFByb3BUeXBlcy5mdW5jLFxuICBlcnJvcjogUHJvcFR5cGVzLm9uZU9mVHlwZShbXG4gICAgUHJvcFR5cGVzLmJvb2wsXG4gICAgUHJvcFR5cGVzLnN0cmluZyxcbiAgICBQcm9wVHlwZXMuc2hhcGUoe1xuICAgICAgbWVzc2FnZTogUHJvcFR5cGVzLnN0cmluZyxcbiAgICB9KSxcbiAgXSksXG4gIHRvdGFsQ29sczogUHJvcFR5cGVzLm51bWJlcixcbiAgY29sczogUHJvcFR5cGVzLm51bWJlcixcbiAgdmFsdWU6IFByb3BUeXBlcy5zdHJpbmcsXG4gIG9uS2V5RG93bjogUHJvcFR5cGVzLmZ1bmMsXG4gIG9uQmx1cjogUHJvcFR5cGVzLmZ1bmMsXG4gIGRlZmF1bHRWYWx1ZTogUHJvcFR5cGVzLnN0cmluZyxcbiAgZGVmYXVsdE9wZW5lZDogUHJvcFR5cGVzLmJvb2wsXG4gIGRhdGVGb3JtYXQ6IFByb3BUeXBlcy5zdHJpbmcsXG4gIG9uQ2hhbmdlOiBQcm9wVHlwZXMuZnVuYyxcbiAgb25WYWx1ZUNoYW5nZTogUHJvcFR5cGVzLmZ1bmMsXG4gIG9uQ29tcGxldGU6IFByb3BUeXBlcy5mdW5jLFxuICBkb250VXNlRGVmYXVsdFZhbHVlOiBQcm9wVHlwZXMuYm9vbCxcbiAgb3Blbk1lbnVPbklucHV0Q2xpY2s6IFByb3BUeXBlcy5ib29sLFxuICB0b29sdGlwOiBQcm9wVHlwZXMuZWxlbWVudCxcbn07XG5cblRpbWVJbnB1dC5pc0Zvcm1FbGVtZW50ID0gdHJ1ZTtcbiJdfQ==