react-lightning-design-components
Version:
Salesforce Lightning Design System components built with React 16
408 lines (365 loc) • 37 kB
JavaScript
'use strict';
Object.defineProperty(exports, "__esModule", {
value: true
});
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 _moment = require('moment');
var _moment2 = _interopRequireDefault(_moment);
var _Button = require('./Button');
var _Button2 = _interopRequireDefault(_Button);
var _Picklist = require('./Picklist');
var _Picklist2 = _interopRequireDefault(_Picklist);
var _reactOnclickoutside = require('react-onclickoutside');
var _reactOnclickoutside2 = _interopRequireDefault(_reactOnclickoutside);
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
function createCalendarObject(date) {
var d = (0, _moment2.default)(date, 'YYYY-MM-DD');
if (!d.isValid()) {
d = (0, _moment2.default)();
}
var year = d.year();
var month = d.month();
var first = (0, _moment2.default)(d).startOf('month').startOf('week');
var last = (0, _moment2.default)(d).endOf('month').endOf('week');
var weeks = [];
var days = [];
for (var dd = first; dd.isBefore(last); dd = dd.add(1, 'd')) {
days.push({
year: dd.year(),
month: dd.month(),
date: dd.date(),
value: dd.format('YYYY-MM-DD')
});
if (days.length === 7) {
weeks.push(days);
days = [];
}
}
return { year: year, month: month, weeks: weeks };
}
function cancelEvent(e) {
e.preventDefault();
e.stopPropagation();
}
var Datepicker = function (_Component) {
(0, _inherits3.default)(Datepicker, _Component);
function Datepicker(props) {
(0, _classCallCheck3.default)(this, Datepicker);
var _this = (0, _possibleConstructorReturn3.default)(this, (Datepicker.__proto__ || (0, _getPrototypeOf2.default)(Datepicker)).call(this, props));
_this.handleClickOutside = _this.handleClickOutside.bind(_this);
var targetDate = _this.props.selectedDate || (0, _moment2.default)().format('YYYY-MM-DD');
_this.state = { targetDate: targetDate };
_this.monthRef = _this.monthRef.bind(_this);
_this.datepickerRef = _this.datepickerRef.bind(_this);
return _this;
}
(0, _createClass3.default)(Datepicker, [{
key: 'componentDidMount',
value: function componentDidMount() {
if (this.props.autoFocus) {
var targetDate = this.props.selectedDate || (0, _moment2.default)().format('YYYY-MM-DD');
this.focusDate(targetDate);
}
}
}, {
key: 'componentDidUpdate',
value: function componentDidUpdate() {
if (this.state.focusDate && (this.state.targetDate || this.props.selectedDate)) {
this.focusDate(this.state.targetDate || this.props.selectedDate);
/* eslint-disable react/no-did-update-set-state */
this.setState({ focusDate: false });
}
}
}, {
key: 'onDateKeyDown',
value: function onDateKeyDown(date, e) {
var targetDate = this.state.targetDate || this.props.selectedDate;
if (e.keyCode === 13 || e.keyCode === 32) {
// return / space
this.onDateClick(date);
e.preventDefault();
e.stopPropagation();
} else if (e.keyCode >= 37 && e.keyCode <= 40) {
// cursor key
if (e.keyCode === 37) {
targetDate = (0, _moment2.default)(targetDate).add(-1, e.shiftKey ? 'months' : 'days');
} else if (e.keyCode === 39) {
// right arrow key
targetDate = (0, _moment2.default)(targetDate).add(1, e.shiftKey ? 'months' : 'days');
} else if (e.keyCode === 38) {
// up arrow key
targetDate = (0, _moment2.default)(targetDate).add(-1, e.shiftKey ? 'years' : 'weeks');
} else if (e.keyCode === 40) {
// down arrow key
targetDate = (0, _moment2.default)(targetDate).add(1, e.shiftKey ? 'years' : 'weeks');
}
targetDate = targetDate.format('YYYY-MM-DD');
this.setState({ targetDate: targetDate, focusDate: true });
e.preventDefault();
e.stopPropagation();
}
}
}, {
key: 'onDateClick',
value: function onDateClick(date) {
if (this.props.onSelect) {
this.props.onSelect(date);
}
}
}, {
key: 'onDateFocus',
value: function onDateFocus(date) {
if (this.state.targetDate !== date) {
this.setState({ targetDate: date });
}
}
}, {
key: 'onYearChange',
value: function onYearChange(item) {
var targetDate = this.state.targetDate || this.props.selectedDate;
targetDate = (0, _moment2.default)(targetDate).year(item.value).format('YYYY-MM-DD');
this.setState({ targetDate: targetDate });
}
}, {
key: 'onMonthChange',
value: function onMonthChange(month) {
var targetDate = this.state.targetDate || this.props.selectedDate;
targetDate = (0, _moment2.default)(targetDate).add(month, 'months').format('YYYY-MM-DD');
this.setState({ targetDate: targetDate });
}
}, {
key: 'onKeyDown',
value: function onKeyDown(e) {
if (e.keyCode === 27) {
// ESC
if (this.props.onClose) {
this.props.onClose();
}
}
}
// provided by 'react-onclickoutside'
}, {
key: 'handleClickOutside',
value: function handleClickOutside(e) {
if (this.props.onBlur) {
this.props.onBlur(e);
}
}
}, {
key: 'focusDate',
value: function focusDate(date) {
var el = _reactDom2.default.findDOMNode(this.month);
var dateEl = el.querySelector('.slds-day[data-date-value="' + date + '"]');
if (dateEl) {
dateEl.focus();
}
}
}, {
key: 'monthRef',
value: function monthRef(ref) {
this.month = ref;
}
}, {
key: 'datepickerRef',
value: function datepickerRef(ref) {
this.datepicker = ref;
}
}, {
key: 'renderFilter',
value: function renderFilter(cal) {
/* eslint-disable max-len */
var startYear = this.props.userCurrentYear ? (0, _moment2.default)().year() : cal.year;
var minYear = startYear - this.props.backRange;
return _react2.default.createElement(
'div',
{ className: 'slds-datepicker__filter slds-grid' },
_react2.default.createElement(
'div',
{ className: 'slds-datepicker__filter--month slds-grid slds-grid--align-spread slds-size--2-of-3' },
_react2.default.createElement(
'div',
{ className: 'slds-align-middle' },
_react2.default.createElement(_Button2.default, {
className: 'slds-align-middle',
type: 'icon-container',
icon: 'left',
size: 'small',
alt: 'Previous Month',
onClick: this.onMonthChange.bind(this, -1)
})
),
_react2.default.createElement(
'h2',
{ className: 'slds-align-middle' },
_moment2.default.monthsShort()[cal.month]
),
_react2.default.createElement(
'div',
{ className: 'slds-align-middle' },
_react2.default.createElement(_Button2.default, {
className: 'slds-align-middle',
type: 'icon-container',
icon: 'right',
size: 'small',
alt: 'Next Month',
onClick: this.onMonthChange.bind(this, 1)
})
)
),
_react2.default.createElement(
'div',
{ className: 'slds-size--1-of-3' },
_react2.default.createElement(
_Picklist2.default,
{
className: 'slds-picklist--fluid slds-shrink-none',
value: cal.year,
maxHeight: this.props.pickListHeight,
onSelect: this.onYearChange.bind(this)
},
new Array(this.props.backRange + this.props.futureRange).join('_').split('_').map(function (a, i) {
var year = minYear + i;
return _react2.default.createElement(_Picklist.PicklistItem, { key: year, label: year, value: year });
})
)
)
);
}
}, {
key: 'renderMonth',
value: function renderMonth(cal, selectedDate, today) {
var _this2 = this;
return _react2.default.createElement(
'table',
{ className: 'datepicker__month', role: 'grid', 'aria-labelledby': 'month', ref: this.monthRef },
_react2.default.createElement(
'thead',
null,
_react2.default.createElement(
'tr',
null,
_moment2.default.weekdaysMin(true).map(function (wd, i) {
return _react2.default.createElement(
'th',
{ key: i },
_react2.default.createElement(
'abbr',
{ title: _moment2.default.weekdays(true, i) },
wd
)
);
})
)
),
_react2.default.createElement(
'tbody',
null,
cal.weeks.map(function (days, i) {
return _react2.default.createElement(
'tr',
{ key: i },
days.map(_this2.renderDate.bind(_this2, cal, selectedDate, today))
);
})
)
);
}
}, {
key: 'renderDate',
value: function renderDate(cal, selectedDate, today, d, i) {
var enabled = d.year === cal.year && d.month === cal.month;
if (this.props.disablePastDateSelection) enabled = d.value >= today;
var selected = d.value === selectedDate;
var isToday = d.value === today;
var dateClassName = (0, _classnames2.default)({
'slds-disabled-text': !enabled,
'slds-is-selected': selected,
'slds-is-today': isToday
});
return _react2.default.createElement(
'td',
{
className: dateClassName,
key: i,
headers: _moment2.default.weekdays(i),
role: 'gridcell',
'aria-disabled': !enabled,
'aria-selected': selected
},
_react2.default.createElement(
'span',
{
className: 'slds-day',
tabIndex: enabled ? 0 : -1,
onClick: enabled ? this.onDateClick.bind(this, d.value) : null,
onKeyDown: enabled ? this.onDateKeyDown.bind(this, d.value) : null,
onFocus: enabled ? this.onDateFocus.bind(this, d.value) : cancelEvent,
'data-date-value': d.value
},
d.date
)
);
}
}, {
key: 'render',
value: function render() {
var _props = this.props,
className = _props.className,
selectedDate = _props.selectedDate;
var today = (0, _moment2.default)().format('YYYY-MM-DD');
var targetDate = this.state.targetDate || selectedDate;
var cal = createCalendarObject(targetDate);
var datepickerClassNames = (0, _classnames2.default)('slds-datepicker', className);
return _react2.default.createElement(
'div',
{
className: datepickerClassNames,
ref: this.datepickerRef,
'aria-hidden': false,
onKeyDown: this.onKeyDown.bind(this)
},
this.renderFilter(cal),
this.renderMonth(cal, selectedDate, today)
);
}
}]);
return Datepicker;
}(_react.Component);
Datepicker.defaultProps = {
backRange: 100,
futureRange: 30,
userCurrentYear: true,
pickListHeight: 5
};
Datepicker.propTypes = {
className: _propTypes2.default.string,
selectedDate: _propTypes2.default.string,
autoFocus: _propTypes2.default.bool,
onSelect: _propTypes2.default.func,
onBlur: _propTypes2.default.func,
onClose: _propTypes2.default.func,
disablePastDateSelection: _propTypes2.default.bool,
userCurrentYear: _propTypes2.default.bool,
backRange: _propTypes2.default.number,
futureRange: _propTypes2.default.number,
pickListHeight: _propTypes2.default.oneOf([5, 7, 10])
};
exports.default = (0, _reactOnclickoutside2.default)(Datepicker);
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9zY3JpcHRzL0RhdGVwaWNrZXIuanMiXSwibmFtZXMiOlsiY3JlYXRlQ2FsZW5kYXJPYmplY3QiLCJkYXRlIiwiZCIsImlzVmFsaWQiLCJ5ZWFyIiwibW9udGgiLCJmaXJzdCIsInN0YXJ0T2YiLCJsYXN0IiwiZW5kT2YiLCJ3ZWVrcyIsImRheXMiLCJkZCIsImlzQmVmb3JlIiwiYWRkIiwicHVzaCIsInZhbHVlIiwiZm9ybWF0IiwibGVuZ3RoIiwiY2FuY2VsRXZlbnQiLCJlIiwicHJldmVudERlZmF1bHQiLCJzdG9wUHJvcGFnYXRpb24iLCJEYXRlcGlja2VyIiwicHJvcHMiLCJoYW5kbGVDbGlja091dHNpZGUiLCJiaW5kIiwidGFyZ2V0RGF0ZSIsInNlbGVjdGVkRGF0ZSIsInN0YXRlIiwibW9udGhSZWYiLCJkYXRlcGlja2VyUmVmIiwiYXV0b0ZvY3VzIiwiZm9jdXNEYXRlIiwic2V0U3RhdGUiLCJrZXlDb2RlIiwib25EYXRlQ2xpY2siLCJzaGlmdEtleSIsIm9uU2VsZWN0IiwiaXRlbSIsIm9uQ2xvc2UiLCJvbkJsdXIiLCJlbCIsImZpbmRET01Ob2RlIiwiZGF0ZUVsIiwicXVlcnlTZWxlY3RvciIsImZvY3VzIiwicmVmIiwiZGF0ZXBpY2tlciIsImNhbCIsInN0YXJ0WWVhciIsInVzZXJDdXJyZW50WWVhciIsIm1pblllYXIiLCJiYWNrUmFuZ2UiLCJvbk1vbnRoQ2hhbmdlIiwibW9udGhzU2hvcnQiLCJwaWNrTGlzdEhlaWdodCIsIm9uWWVhckNoYW5nZSIsIkFycmF5IiwiZnV0dXJlUmFuZ2UiLCJqb2luIiwic3BsaXQiLCJtYXAiLCJhIiwiaSIsInRvZGF5Iiwid2Vla2RheXNNaW4iLCJ3ZCIsIndlZWtkYXlzIiwicmVuZGVyRGF0ZSIsImVuYWJsZWQiLCJkaXNhYmxlUGFzdERhdGVTZWxlY3Rpb24iLCJzZWxlY3RlZCIsImlzVG9kYXkiLCJkYXRlQ2xhc3NOYW1lIiwib25EYXRlS2V5RG93biIsIm9uRGF0ZUZvY3VzIiwiY2xhc3NOYW1lIiwiZGF0ZXBpY2tlckNsYXNzTmFtZXMiLCJvbktleURvd24iLCJyZW5kZXJGaWx0ZXIiLCJyZW5kZXJNb250aCIsImRlZmF1bHRQcm9wcyIsInByb3BUeXBlcyIsInN0cmluZyIsImJvb2wiLCJmdW5jIiwibnVtYmVyIiwib25lT2YiXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBQUE7Ozs7QUFDQTs7OztBQUNBOzs7O0FBQ0E7Ozs7QUFDQTs7OztBQUNBOzs7O0FBQ0E7Ozs7QUFDQTs7Ozs7O0FBRUEsU0FBU0Esb0JBQVQsQ0FBOEJDLElBQTlCLEVBQW9DO0FBQ2xDLE1BQUlDLElBQUksc0JBQU9ELElBQVAsRUFBYSxZQUFiLENBQVI7QUFDQSxNQUFJLENBQUNDLEVBQUVDLE9BQUYsRUFBTCxFQUFrQjtBQUNoQkQsUUFBSSx1QkFBSjtBQUNEO0FBQ0QsTUFBTUUsT0FBT0YsRUFBRUUsSUFBRixFQUFiO0FBQ0EsTUFBTUMsUUFBUUgsRUFBRUcsS0FBRixFQUFkO0FBQ0EsTUFBTUMsUUFBUSxzQkFBT0osQ0FBUCxFQUFVSyxPQUFWLENBQWtCLE9BQWxCLEVBQTJCQSxPQUEzQixDQUFtQyxNQUFuQyxDQUFkO0FBQ0EsTUFBTUMsT0FBTyxzQkFBT04sQ0FBUCxFQUFVTyxLQUFWLENBQWdCLE9BQWhCLEVBQXlCQSxLQUF6QixDQUErQixNQUEvQixDQUFiO0FBQ0EsTUFBTUMsUUFBUSxFQUFkO0FBQ0EsTUFBSUMsT0FBTyxFQUFYO0FBQ0EsT0FBSyxJQUFJQyxLQUFLTixLQUFkLEVBQXFCTSxHQUFHQyxRQUFILENBQVlMLElBQVosQ0FBckIsRUFBd0NJLEtBQUtBLEdBQUdFLEdBQUgsQ0FBTyxDQUFQLEVBQVUsR0FBVixDQUE3QyxFQUE2RDtBQUMzREgsU0FBS0ksSUFBTCxDQUFVO0FBQ1JYLFlBQU1RLEdBQUdSLElBQUgsRUFERTtBQUVSQyxhQUFPTyxHQUFHUCxLQUFILEVBRkM7QUFHUkosWUFBTVcsR0FBR1gsSUFBSCxFQUhFO0FBSVJlLGFBQU9KLEdBQUdL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QVcsaUJBQVgsRUFBOEJELFNBQTlCLENBQTdCO0FBQ0EsYUFDRTtBQUFBO0FBQUE7QUFDRSxxQkFBWUMsb0JBRGQ7QUFFRSxlQUFLLEtBQUsvQyxhQUZaO0FBR0UseUJBQWMsS0FIaEI7QUFJRSxxQkFBWSxLQUFLZ0QsU0FBTCxDQUFlckQsSUFBZixDQUFvQixJQUFwQjtBQUpkO0FBTUksYUFBS3NELFlBQUwsQ0FBa0IvQixHQUFsQixDQU5KO0FBT0ksYUFBS2dDLFdBQUwsQ0FBaUJoQyxHQUFqQixFQUFzQnJCLFlBQXRCLEVBQW9DcUMsS0FBcEM7QUFQSixPQURGO0FBV0Q7Ozs7O0FBR0gxQyxXQUFXMkQsWUFBWCxHQUEwQjtBQUN4QjdCLGFBQVcsR0FEYTtBQUV4Qk0sZUFBYSxFQUZXO0FBR3hCUixtQkFBaUIsSUFITztBQUl4Qkssa0JBQWdCOztBQUpRLENBQTFCOztBQVFBakMsV0FBVzRELFNBQVgsR0FBdUI7QUFDckJOLGFBQVcsb0JBQVVPLE1BREE7QUFFckJ4RCxnQkFBYyxvQkFBVXdELE1BRkg7QUFHckJwRCxhQUFXLG9CQUFVcUQsSUFIQTtBQUlyQi9DLFlBQVUsb0JBQVVnRCxJQUpDO0FBS3JCN0MsVUFBUSxvQkFBVTZDLElBTEc7QUFNckI5QyxXQUFTLG9CQUFVOEMsSUFORTtBQU9yQmYsNEJBQTBCLG9CQUFVYyxJQVBmO0FBUXJCbEMsbUJBQWlCLG9CQUFVa0MsSUFSTjtBQVNyQmhDLGFBQVcsb0JBQVVrQyxNQVRBO0FBVXJCNUIsZUFBYSxvQkFBVTRCLE1BVkY7QUFXckIvQixrQkFBZ0Isb0JBQVVnQyxLQUFWLENBQWdCLENBQUMsQ0FBRCxFQUFJLENBQUosRUFBTyxFQUFQLENBQWhCO0FBWEssQ0FBdkI7O2tCQWNlLG1DQUFlakUsVUFBZixDIiwiZmlsZSI6IkRhdGVwaWNrZXIuanMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgUmVhY3QsIHsgQ29tcG9uZW50IH0gZnJvbSAncmVhY3QnO1xuaW1wb3J0IFByb3BUeXBlcyBmcm9tICdwcm9wLXR5cGVzJztcbmltcG9ydCBSZWFjdERPTSBmcm9tICdyZWFjdC1kb20nO1xuaW1wb3J0IGNsYXNzbmFtZXMgZnJvbSAnY2xhc3NuYW1lcyc7XG5pbXBvcnQgbW9tZW50IGZyb20gJ21vbWVudCc7XG5pbXBvcnQgQnV0dG9uIGZyb20gJy4vQnV0dG9uJztcbmltcG9ydCB7IGRlZmF1bHQgYXMgUGlja2xpc3QsIFBpY2tsaXN0SXRlbSB9IGZyb20gJy4vUGlja2xpc3QnO1xuaW1wb3J0IG9uQ2xpY2tPdXRzaWRlIGZyb20gJ3JlYWN0LW9uY2xpY2tvdXRzaWRlJztcblxuZnVuY3Rpb24gY3JlYXRlQ2FsZW5kYXJPYmplY3QoZGF0ZSkge1xuICBsZXQgZCA9IG1vbWVudChkYXRlLCAnWVlZWS1NTS1ERCcpO1xuICBpZiAoIWQuaXNWYWxpZCgpKSB7XG4gICAgZCA9IG1vbWVudCgpO1xuICB9XG4gIGNvbnN0IHllYXIgPSBkLnllYXIoKTtcbiAgY29uc3QgbW9udGggPSBkLm1vbnRoKCk7XG4gIGNvbnN0IGZpcnN0ID0gbW9tZW50KGQpLnN0YXJ0T2YoJ21vbnRoJykuc3RhcnRPZignd2VlaycpO1xuICBjb25zdCBsYXN0ID0gbW9tZW50KGQpLmVuZE9mKCdtb250aCcpLmVuZE9mKCd3ZWVrJyk7XG4gIGNvbnN0IHdlZWtzID0gW107XG4gIGxldCBkYXlzID0gW107XG4gIGZvciAobGV0IGRkID0gZmlyc3Q7IGRkLmlzQmVmb3JlKGxhc3QpOyBkZCA9IGRkLmFkZCgxLCAnZCcpKSB7XG4gICAgZGF5cy5wdXNoKHtcbiAgICAgIHllYXI6IGRkLnllYXIoKSxcbiAgICAgIG1vbnRoOiBkZC5tb250aCgpLFxuICAgICAgZGF0ZTogZGQuZGF0ZSgpLFxuICAgICAgdmFsdWU6IGRkLmZvcm1hdCgnWVlZWS1NTS1ERCcpLFxuICAgIH0pO1xuICAgIGlmIChkYXlzLmxlbmd0aCA9PT0gNykge1xuICAgICAgd2Vla3MucHVzaChkYXlzKTtcbiAgICAgIGRheXMgPSBbXTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIHsgeWVhciwgbW9udGgsIHdlZWtzIH07XG59XG5cbmZ1bmN0aW9uIGNhbmNlbEV2ZW50KGUpIHtcbiAgZS5wcmV2ZW50RGVmYXVsdCgpO1xuICBlLnN0b3BQcm9wYWdhdGlvbigpO1xufVxuXG5jbGFzcyBEYXRlcGlja2VyIGV4dGVuZHMgQ29tcG9uZW50IHtcbiAgY29uc3RydWN0b3IocHJvcHMpIHtcbiAgICBzdXBlcihwcm9wcyk7XG4gICAgdGhpcy5oYW5kbGVDbGlja091dHNpZGUgPSB0aGlzLmhhbmRsZUNsaWNrT3V0c2lkZS5iaW5kKHRoaXMpO1xuICAgIGNvbnN0IHRhcmdldERhdGUgPSB0aGlzLnByb3BzLnNlbGVjdGVkRGF0ZSB8fCBtb21lbnQoKS5mb3JtYXQoJ1lZWVktTU0tREQnKTtcbiAgICB0aGlzLnN0YXRlID0geyB0YXJnZXREYXRlIH07XG4gICAgdGhpcy5tb250aFJlZiA9IHRoaXMubW9udGhSZWYuYmluZCh0aGlzKTtcbiAgICB0aGlzLmRhdGVwaWNrZXJSZWYgPSB0aGlzLmRhdGVwaWNrZXJSZWYuYmluZCh0aGlzKTtcbiAgfVxuXG4gIGNvbXBvbmVudERpZE1vdW50KCkge1xuICAgIGlmICh0aGlzLnByb3BzLmF1dG9Gb2N1cykge1xuICAgICAgY29uc3QgdGFyZ2V0RGF0ZSA9IHRoaXMucHJvcHMuc2VsZWN0ZWREYXRlIHx8IG1vbWVudCgpLmZvcm1hdCgnWVlZWS1NTS1ERCcpO1xuICAgICAgdGhpcy5mb2N1c0RhdGUodGFyZ2V0RGF0ZSk7XG4gICAgfVxuICB9XG5cbiAgY29tcG9uZW50RGlkVXBkYXRlKCkge1xuICAgIGlmICh0aGlzLnN0YXRlLmZvY3VzRGF0ZSAmJiAodGhpcy5zdGF0ZS50YXJnZXREYXRlIHx8IHRoaXMucHJvcHMuc2VsZWN0ZWREYXRlKSkge1xuICAgICAgdGhpcy5mb2N1c0RhdGUodGhpcy5zdGF0ZS50YXJnZXREYXRlIHx8IHRoaXMucHJvcHMuc2VsZWN0ZWREYXRlKTtcbiAgICAgIC8qIGVzbGludC1kaXNhYmxlIHJlYWN0L25vLWRpZC11cGRhdGUtc2V0LXN0YXRlICovXG4gICAgICB0aGlzLnNldFN0YXRlKHsgZm9jdXNEYXRlOiBmYWxzZSB9KTtcbiAgICB9XG4gIH1cblxuICBvbkRhdGVLZXlEb3duKGRhdGUsIGUpIHtcbiAgICBsZXQgdGFyZ2V0RGF0ZSA9IHRoaXMuc3RhdGUudGFyZ2V0RGF0ZSB8fCB0aGlzLnByb3BzLnNlbGVjdGVkRGF0ZTtcbiAgICBpZiAoZS5rZXlDb2RlID09PSAxMyB8fCBlLmtleUNvZGUgPT09IDMyKSB7IC8vIHJldHVybiAvIHNwYWNlXG4gICAgICB0aGlzLm9uRGF0ZUNsaWNrKGRhdGUpO1xuICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgZS5zdG9wUHJvcGFnYXRpb24oKTtcbiAgICB9IGVsc2UgaWYgKGUua2V5Q29kZSA+PSAzNyAmJiBlLmtleUNvZGUgPD0gNDApIHsgLy8gY3Vyc29yIGtleVxuICAgICAgaWYgKGUua2V5Q29kZSA9PT0gMzcpIHtcbiAgICAgICAgdGFyZ2V0RGF0ZSA9IG1vbWVudCh0YXJnZXREYXRlKS5hZGQoLTEsIGUuc2hpZnRLZXkgPyAnbW9udGhzJyA6ICdkYXlzJyk7XG4gICAgICB9IGVsc2UgaWYgKGUua2V5Q29kZSA9PT0gMzkpIHsgLy8gcmlnaHQgYXJyb3cga2V5XG4gICAgICAgIHRhcmdldERhdGUgPSBtb21lbnQodGFyZ2V0RGF0ZSkuYWRkKDEsIGUuc2hpZnRLZXkgPyAnbW9udGhzJyA6ICdkYXlzJyk7XG4gICAgICB9IGVsc2UgaWYgKGUua2V5Q29kZSA9PT0gMzgpIHsgLy8gdXAgYXJyb3cga2V5XG4gICAgICAgIHRhcmdldERhdGUgPSBtb21lbnQodGFyZ2V0RGF0ZSkuYWRkKC0xLCBlLnNoaWZ0S2V5ID8gJ3llYXJzJyA6ICd3ZWVrcycpO1xuICAgICAgfSBlbHNlIGlmIChlLmtleUNvZGUgPT09IDQwKSB7IC8vIGRvd24gYXJyb3cga2V5XG4gICAgICAgIHRhcmdldERhdGUgPSBtb21lbnQodGFyZ2V0RGF0ZSkuYWRkKDEsIGUuc2hpZnRLZXkgPyAneWVhcnMnIDogJ3dlZWtzJyk7XG4gICAgICB9XG4gICAgICB0YXJnZXREYXRlID0gdGFyZ2V0RGF0ZS5mb3JtYXQoJ1lZWVktTU0tREQnKTtcbiAgICAgIHRoaXMuc2V0U3RhdGUoeyB0YXJnZXREYXRlLCBmb2N1c0RhdGU6IHRydWUgfSk7XG4gICAgICBlLnByZXZlbnREZWZhdWx0KCk7XG4gICAgICBlLnN0b3BQcm9wYWdhdGlvbigpO1xuICAgIH1cbiAgfVxuXG4gIG9uRGF0ZUNsaWNrKGRhdGUpIHtcbiAgICBpZiAodGhpcy5wcm9wcy5vblNlbGVjdCkge1xuICAgICAgdGhpcy5wcm9wcy5vblNlbGVjdChkYXRlKTtcbiAgICB9XG4gIH1cblxuICBvbkRhdGVGb2N1cyhkYXRlKSB7XG4gICAgaWYgKHRoaXMuc3RhdGUudGFyZ2V0RGF0ZSAhPT0gZGF0ZSkge1xuICAgICAgdGhpcy5zZXRTdGF0ZSh7IHRhcmdldERhdGU6IGRhdGUgfSk7XG4gICAgfVxuICB9XG5cbiAgb25ZZWFyQ2hhbmdlKGl0ZW0pIHtcbiAgICBsZXQgdGFyZ2V0RGF0ZSA9IHRoaXMuc3RhdGUudGFyZ2V0RGF0ZSB8fCB0aGlzLnByb3BzLnNlbGVjdGVkRGF0ZTtcbiAgICB0YXJnZXREYXRlID0gbW9tZW50KHRhcmdldERhdGUpLnllYXIoaXRlbS52YWx1ZSkuZm9ybWF0KCdZWVlZLU1NLUREJyk7XG4gICAgdGhpcy5zZXRTdGF0ZSh7IHRhcmdldERhdGUgfSk7XG4gIH1cblxuICBvbk1vbnRoQ2hhbmdlKG1vbnRoKSB7XG4gICAgbGV0IHRhcmdldERhdGUgPSB0aGlzLnN0YXRlLnRhcmdldERhdGUgfHwgdGhpcy5wcm9wcy5zZWxlY3RlZERhdGU7XG4gICAgdGFyZ2V0RGF0ZSA9IG1vbWVudCh0YXJnZXREYXRlKS5hZGQobW9udGgsICdtb250aHMnKS5mb3JtYXQoJ1lZWVktTU0tREQnKTtcbiAgICB0aGlzLnNldFN0YXRlKHsgdGFyZ2V0RGF0ZSB9KTtcbiAgfVxuXG4gIG9uS2V5RG93bihlKSB7XG4gICAgaWYgKGUua2V5Q29kZSA9PT0gMjcpIHsgLy8gRVNDXG4gICAgICBpZiAodGhpcy5wcm9wcy5vbkNsb3NlKSB7XG4gICAgICAgIHRoaXMucHJvcHMub25DbG9zZSgpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIC8vIHByb3ZpZGVkIGJ5ICdyZWFjdC1vbmNsaWNrb3V0c2lkZSdcbiAgaGFuZGxlQ2xpY2tPdXRzaWRlKGUpIHtcbiAgICBpZiAodGhpcy5wcm9wcy5vbkJsdXIpIHtcbiAgICAgIHRoaXMucHJvcHMub25CbHVyKGUpO1xuICAgIH1cbiAgfVxuXG4gIGZvY3VzRGF0ZShkYXRlKSB7XG4gICAgY29uc3QgZWwgPSBSZWFjdERPTS5maW5kRE9NTm9kZSh0aGlzLm1vbnRoKTtcbiAgICBjb25zdCBkYXRlRWwgPSBlbC5xdWVyeVNlbGVjdG9yKGAuc2xkcy1kYXlbZGF0YS1kYXRlLXZhbHVlPVwiJHtkYXRlfVwiXWApO1xuICAgIGlmIChkYXRlRWwpIHtcbiAgICAgIGRhdGVFbC5mb2N1cygpO1xuICAgIH1cbiAgfVxuXG4gIG1vbnRoUmVmKHJlZikge1xuICAgIHRoaXMubW9udGggPSByZWY7XG4gIH1cblxuICBkYXRlcGlja2VyUmVmKHJlZikge1xuICAgIHRoaXMuZGF0ZXBpY2tlciA9IHJlZjtcbiAgfVxuXG4gIHJlbmRlckZpbHRlcihjYWwpIHtcbiAgICAvKiBlc2xpbnQtZGlzYWJsZSBtYXgtbGVuICovXG4gICAgY29uc3Qgc3RhcnRZZWFyID0gdGhpcy5wcm9wcy51c2VyQ3VycmVudFllYXIgPyBtb21lbnQoKS55ZWFyKCkgOiBjYWwueWVhcjtcbiAgICBjb25zdCBtaW5ZZWFyID0gc3RhcnRZZWFyIC0gdGhpcy5wcm9wcy5iYWNrUmFuZ2U7XG4gICAgcmV0dXJuIChcbiAgICAgIDxkaXYgY2xhc3NOYW1lPSdzbGRzLWRhdGVwaWNrZXJfX2ZpbHRlciBzbGRzLWdyaWQnPlxuICAgICAgICA8ZGl2IGNsYXNzTmFtZT0nc2xkcy1kYXRlcGlja2VyX19maWx0ZXItLW1vbnRoIHNsZHMtZ3JpZCBzbGRzLWdyaWQtLWFsaWduLXNwcmVhZCBzbGRzLXNpemUtLTItb2YtMyc+XG4gICAgICAgICAgPGRpdiBjbGFzc05hbWU9J3NsZHMtYWxpZ24tbWlkZGxlJz5cbiAgICAgICAgICAgIDxCdXR0b25cbiAgICAgICAgICAgICAgY2xhc3NOYW1lPSdzbGRzLWFsaWduLW1pZGRsZSdcbiAgICAgICAgICAgICAgdHlwZT0naWNvbi1jb250YWluZXInXG4gICAgICAgICAgICAgIGljb249J2xlZnQnXG4gICAgICAgICAgICAgIHNpemU9J3NtYWxsJ1xuICAgICAgICAgICAgICBhbHQ9J1ByZXZpb3VzIE1vbnRoJ1xuICAgICAgICAgICAgICBvbkNsaWNrPXsgdGhpcy5vbk1vbnRoQ2hhbmdlLmJpbmQodGhpcywgLTEpIH1cbiAgICAgICAgICAgIC8+XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgPGgyIGNsYXNzTmFtZT0nc2xkcy1hbGlnbi1taWRkbGUnPnsgbW9tZW50Lm1vbnRoc1Nob3J0KClbY2FsLm1vbnRoXSB9PC9oMj5cbiAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT0nc2xkcy1hbGlnbi1taWRkbGUnPlxuICAgICAgICAgICAgPEJ1dHRvblxuICAgICAgICAgICAgICBjbGFzc05hbWU9J3NsZHMtYWxpZ24tbWlkZGxlJ1xuICAgICAgICAgICAgICB0eXBlPSdpY29uLWNvbnRhaW5lcidcbiAgICAgICAgICAgICAgaWNvbj0ncmlnaHQnXG4gICAgICAgICAgICAgIHNpemU9J3NtYWxsJ1xuICAgICAgICAgICAgICBhbHQ9J05leHQgTW9udGgnXG4gICAgICAgICAgICAgIG9uQ2xpY2s9eyB0aGlzLm9uTW9udGhDaGFuZ2UuYmluZCh0aGlzLCAxKSB9XG4gICAgICAgICAgICAvPlxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICA8L2Rpdj5cbiAgICAgICAgPGRpdiBjbGFzc05hbWU9J3NsZHMtc2l6ZS0tMS1vZi0zJz5cbiAgICAgICAgICA8UGlja2xpc3RcbiAgICAgICAgICAgIGNsYXNzTmFtZT0nc2xkcy1waWNrbGlzdC0tZmx1aWQgc2xkcy1zaHJpbmstbm9uZSdcbiAgICAgICAgICAgIHZhbHVlPXsgY2FsLnllYXIgfVxuICAgICAgICAgICAgbWF4SGVpZ2h0PXt0aGlzLnByb3BzLnBpY2tMaXN0SGVpZ2h0fVxuICAgICAgICAgICAgb25TZWxlY3Q9eyB0aGlzLm9uWWVhckNoYW5nZS5iaW5kKHRoaXMpIH1cbiAgICAgICAgICA+XG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgIG5ldyBBcnJheSgodGhpcy5wcm9wcy5iYWNrUmFuZ2UgKyB0aGlzLnByb3BzLmZ1dHVyZVJhbmdlKSkuam9pbignXycpLnNwbGl0KCdfJylcbiAgICAgICAgICAgICAgICAubWFwKChhLCBpKSA9PiB7XG4gICAgICAgICAgICAgICAgICBsZXQgeWVhciA9IG1pblllYXIgKyBpO1xuICAgICAgICAgICAgICAgICAgcmV0dXJuIDxQaWNrbGlzdEl0ZW0ga2V5PXsgeWVhciB9IGxhYmVsPXsgeWVhciB9IHZhbHVlPXsgeWVhciB9IC8+O1xuICAgICAgICAgICAgICAgIH0pXG4gICAgICAgICAgICB9XG4gICAgICAgICAgPC9QaWNrbGlzdD5cbiAgICAgICAgPC9kaXY+XG4gICAgICA8L2Rpdj5cbiAgICApO1xuICB9XG5cbiAgcmVuZGVyTW9udGgoY2FsLCBzZWxlY3RlZERhdGUsIHRvZGF5KSB7XG4gICAgcmV0dXJuIChcbiAgICAgIDx0YWJsZSBjbGFzc05hbWU9J2RhdGVwaWNrZXJfX21vbnRoJyByb2xlPSdncmlkJyBhcmlhLWxhYmVsbGVkYnk9J21vbnRoJyByZWY9e3RoaXMubW9udGhSZWZ9PlxuICAgICAgICA8dGhlYWQ+XG4gICAgICAgICAgPHRyPlxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICBtb21lbnQud2Vla2RheXNNaW4odHJ1ZSkubWFwKCh3ZCwgaSkgPT4gKFxuICAgICAgICAgICAgICAgIDx0aCBrZXk9eyBpIH0+XG4gICAgICAgICAgICAgICAgICA8YWJiciB0aXRsZT17IG1vbWVudC53ZWVrZGF5cyh0cnVlLCBpKSB9Pnsgd2QgfTwvYWJicj5cbiAgICAgICAgICAgICAgICA8L3RoPlxuICAgICAgICAgICAgICApKVxuICAgICAgICAgICAgfVxuICAgICAgICAgIDwvdHI+XG4gICAgICAgIDwvdGhlYWQ+XG4gICAgICAgIDx0Ym9keT5cbiAgICAgICAgICB7XG4gICAgICAgICAgICBjYWwud2Vla3MubWFwKChkYXlzLCBpKSA9PiAoXG4gICAgICAgICAgICAgIDx0ciBrZXk9eyBpIH0+eyBkYXlzLm1hcCh0aGlzLnJlbmRlckRhdGUuYmluZCh0aGlzLCBjYWwsIHNlbGVjdGVkRGF0ZSwgdG9kYXkpKSB9PC90cj5cbiAgICAgICAgICAgICkpXG4gICAgICAgICAgfVxuICAgICAgICA8L3Rib2R5PlxuICAgICAgPC90YWJsZT5cbiAgICApO1xuICB9XG5cbiAgcmVuZGVyRGF0ZShjYWwsIHNlbGVjdGVkRGF0ZSwgdG9kYXksIGQsIGkpIHtcbiAgICBsZXQgZW5hYmxlZCA9IGQueWVhciA9PT0gY2FsLnllYXIgJiYgZC5tb250aCA9PT0gY2FsLm1vbnRoO1xuICAgIGlmICh0aGlzLnByb3BzLmRpc2FibGVQYXN0RGF0ZVNlbGVjdGlvbikgZW5hYmxlZCA9IGQudmFsdWUgPj0gdG9kYXk7XG4gICAgY29uc3Qgc2VsZWN0ZWQgPSBkLnZhbHVlID09PSBzZWxlY3RlZERhdGU7XG4gICAgY29uc3QgaXNUb2RheSA9IGQudmFsdWUgPT09IHRvZGF5O1xuICAgIGNvbnN0IGRhdGVDbGFzc05hbWUgPSBjbGFzc25hbWVzKHtcbiAgICAgICdzbGRzLWRpc2FibGVkLXRleHQnOiAhZW5hYmxlZCxcbiAgICAgICdzbGRzLWlzLXNlbGVjdGVkJzogc2VsZWN0ZWQsXG4gICAgICAnc2xkcy1pcy10b2RheSc6IGlzVG9kYXksXG4gICAgfSk7XG4gICAgcmV0dXJuIChcbiAgICAgIDx0ZFxuICAgICAgICBjbGFzc05hbWU9eyBkYXRlQ2xhc3NOYW1lIH1cbiAgICAgICAga2V5PXsgaSB9XG4gICAgICAgIGhlYWRlcnM9eyBtb21lbnQud2Vla2RheXMoaSkgfVxuICAgICAgICByb2xlPSdncmlkY2VsbCdcbiAgICAgICAgYXJpYS1kaXNhYmxlZD17ICFlbmFibGVkIH1cbiAgICAgICAgYXJpYS1zZWxlY3RlZD17IHNlbGVjdGVkIH1cbiAgICAgID5cbiAgICAgICAgPHNwYW5cbiAgICAgICAgICBjbGFzc05hbWU9J3NsZHMtZGF5J1xuICAgICAgICAgIHRhYkluZGV4PXsgZW5hYmxlZCA/IDAgOiAtMSB9XG4gICAgICAgICAgb25DbGljaz17IGVuYWJsZWQgPyB0aGlzLm9uRGF0ZUNsaWNrLmJpbmQodGhpcywgZC52YWx1ZSkgOiBudWxsIH1cbiAgICAgICAgICBvbktleURvd249eyBlbmFibGVkID8gdGhpcy5vbkRhdGVLZXlEb3duLmJpbmQodGhpcywgZC52YWx1ZSkgOiBudWxsIH1cbiAgICAgICAgICBvbkZvY3VzPXsgZW5hYmxlZCA/IHRoaXMub25EYXRlRm9jdXMuYmluZCh0aGlzLCBkLnZhbHVlKSA6IGNhbmNlbEV2ZW50IH1cbiAgICAgICAgICBkYXRhLWRhdGUtdmFsdWU9eyBkLnZhbHVlIH1cbiAgICAgICAgPnsgZC5kYXRlIH08L3NwYW4+XG4gICAgICA8L3RkPlxuICAgICk7XG4gIH1cblxuICByZW5kZXIoKSB7XG4gICAgY29uc3QgeyBjbGFzc05hbWUsIHNlbGVjdGVkRGF0ZSB9ID0gdGhpcy5wcm9wcztcbiAgICBjb25zdCB0b2RheSA9IG1vbWVudCgpLmZvcm1hdCgnWVlZWS1NTS1ERCcpO1xuICAgIGNvbnN0IHRhcmdldERhdGUgPSB0aGlzLnN0YXRlLnRhcmdldERhdGUgfHwgc2VsZWN0ZWREYXRlO1xuICAgIGNvbnN0IGNhbCA9IGNyZWF0ZUNhbGVuZGFyT2JqZWN0KHRhcmdldERhdGUpO1xuICAgIGNvbnN0IGRhdGVwaWNrZXJDbGFzc05hbWVzID0gY2xhc3NuYW1lcygnc2xkcy1kYXRlcGlja2VyJywgY2xhc3NOYW1lKTtcbiAgICByZXR1cm4gKFxuICAgICAgPGRpdlxuICAgICAgICBjbGFzc05hbWU9eyBkYXRlcGlja2VyQ2xhc3NOYW1lcyB9XG4gICAgICAgIHJlZj17dGhpcy5kYXRlcGlja2VyUmVmfVxuICAgICAgICBhcmlhLWhpZGRlbj17IGZhbHNlIH1cbiAgICAgICAgb25LZXlEb3duPXsgdGhpcy5vbktleURvd24uYmluZCh0aGlzKSB9XG4gICAgICA+XG4gICAgICAgIHsgdGhpcy5yZW5kZXJGaWx0ZXIoY2FsKSB9XG4gICAgICAgIHsgdGhpcy5yZW5kZXJNb250aChjYWwsIHNlbGVjdGVkRGF0ZSwgdG9kYXkpIH1cbiAgICAgIDwvZGl2PlxuICAgICk7XG4gIH1cbn1cblxuRGF0ZXBpY2tlci5kZWZhdWx0UHJvcHMgPSB7XG4gIGJhY2tSYW5nZTogMTAwLFxuICBmdXR1cmVSYW5nZTogMzAsXG4gIHVzZXJDdXJyZW50WWVhcjogdHJ1ZSxcbiAgcGlja0xpc3RIZWlnaHQ6IDUsXG5cbn07XG5cbkRhdGVwaWNrZXIucHJvcFR5cGVzID0ge1xuICBjbGFzc05hbWU6IFByb3BUeXBlcy5zdHJpbmcsXG4gIHNlbGVjdGVkRGF0ZTogUHJvcFR5cGVzLnN0cmluZyxcbiAgYXV0b0ZvY3VzOiBQcm9wVHlwZXMuYm9vbCxcbiAgb25TZWxlY3Q6IFByb3BUeXBlcy5mdW5jLFxuICBvbkJsdXI6IFByb3BUeXBlcy5mdW5jLFxuICBvbkNsb3NlOiBQcm9wVHlwZXMuZnVuYyxcbiAgZGlzYWJsZVBhc3REYXRlU2VsZWN0aW9uOiBQcm9wVHlwZXMuYm9vbCxcbiAgdXNlckN1cnJlbnRZZWFyOiBQcm9wVHlwZXMuYm9vbCxcbiAgYmFja1JhbmdlOiBQcm9wVHlwZXMubnVtYmVyLFxuICBmdXR1cmVSYW5nZTogUHJvcFR5cGVzLm51bWJlcixcbiAgcGlja0xpc3RIZWlnaHQ6IFByb3BUeXBlcy5vbmVPZihbNSwgNywgMTBdKSxcbn07XG5cbmV4cG9ydCBkZWZhdWx0IG9uQ2xpY2tPdXRzaWRlKERhdGVwaWNrZXIpO1xuIl19