focus-components-v3
Version:
Focus web components to build applications (based on Material Design)
318 lines (269 loc) • 30.4 kB
JavaScript
Object.defineProperty(exports, "__esModule", {
value: true
});
var _extends = Object.assign || function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; };
var _react = require('react');
var _react2 = _interopRequireDefault(_react);
var _reactDom = require('react-dom');
var _reactDom2 = _interopRequireDefault(_reactDom);
var _includes = require('lodash/includes');
var _includes2 = _interopRequireDefault(_includes);
var _i18next = require('i18next');
var _i18next2 = _interopRequireDefault(_i18next);
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
function _defaults(obj, defaults) { var keys = Object.getOwnPropertyNames(defaults); for (var i = 0; i < keys.length; i++) { var key = keys[i]; var value = Object.getOwnPropertyDescriptor(defaults, key); if (value && value.configurable && obj[key] === undefined) { Object.defineProperty(obj, key, value); } } return obj; }
function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }
function _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return call && (typeof call === "object" || typeof call === "function") ? call : self; }
function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function, not " + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : _defaults(subClass, superClass); }
/**
* Small overlay component used to listen to scroll and prevent it to leave the Modal component
*/
var ModalOverlay = function (_Component) {
_inherits(ModalOverlay, _Component);
function ModalOverlay(props) {
_classCallCheck(this, ModalOverlay);
var _this = _possibleConstructorReturn(this, _Component.call(this, props));
_this._hideBodyOverflow = _this._hideBodyOverflow.bind(_this);
_this._restoreBodyOverflow = _this._restoreBodyOverflow.bind(_this);
return _this;
}
ModalOverlay.prototype.componentDidMount = function componentDidMount() {
this._hideBodyOverflow();
};
/**
* Store the body overgflow property, and set it to hidden
* @private
*/
ModalOverlay.prototype._hideBodyOverflow = function _hideBodyOverflow() {
document.body.style['overflow-y'] = 'hidden';
};
/**
* Restore body overflow property
* @private
*/
ModalOverlay.prototype._restoreBodyOverflow = function _restoreBodyOverflow() {
document.body.style['overflow-y'] = 'auto';
};
/**
* Component will unmount event handler.
* Remove the mouse wheel listener.
*/
ModalOverlay.prototype.componentWillUnmount = function componentWillUnmount() {
// ReactDOM.findDOMNode(this.refs.overlay).removeEventListener('mousewheel', this._onScroll);
this._restoreBodyOverflow();
};
/**
* Render the component
* @return {XML} the rendered HTML
*/
ModalOverlay.prototype.render = function render() {
var _props = this.props,
children = _props.children,
clickHandler = _props.clickHandler,
show = _props.show;
var otherProps = clickHandler ? { onClick: clickHandler } : {};
return _react2.default.createElement(
'div',
_extends({ className: 'animated fadeIn', 'data-animation': 'fadeIn', 'data-closing-animation': 'fadeOut', 'data-focus': 'modal-overlay', 'data-visible': show, ref: 'overlay' }, otherProps),
children
);
};
return ModalOverlay;
}(_react.Component);
;
ModalOverlay.displayName = 'ModalOverlay';
ModalOverlay.propTypes = {
children: _react.PropTypes.object,
clickHandler: _react.PropTypes.func,
show: _react.PropTypes.bool
};
ModalOverlay.defaultProps = {
show: false
};
/**
* The modal component configuration
* @type {Object}
*/
var Modal = function (_Component2) {
_inherits(Modal, _Component2);
function Modal(props) {
_classCallCheck(this, Modal);
var _this2 = _possibleConstructorReturn(this, _Component2.call(this, props));
_this2._onWheel = _this2._onWheel.bind(_this2);
_this2.toggleOpen = _this2.toggleOpen.bind(_this2);
_this2._getAnimationProps = _this2._getAnimationProps.bind(_this2);
_this2._closePopin = _this2._closePopin.bind(_this2);
_this2.state = {
opened: _this2.props.open
};
return _this2;
}
Modal.prototype.componentWillUnmount = function componentWillUnmount() {
window.clearTimeout(this._openTimeoutID);
};
/**
* Wheel event handler.
* @param {object} event wheel event
*/
Modal.prototype._onWheel = function _onWheel(event) {
_reactDom2.default.findDOMNode(this.refs['modal-window']).scrollTop += 0 < event.deltaY ? 100 : -100;
};
Modal.prototype._closePopin = function _closePopin() {
var _this3 = this;
var timeout = 0;
if (opened) {
var modalWindow = _reactDom2.default.findDOMNode(this.refs['modal-window']);
var modalOverlay = _reactDom2.default.findDOMNode(this.refs['modal-overlay']);
modalWindow.classList.remove(modalWindow.getAttribute('data-animation'));
modalWindow.classList.add(modalWindow.getAttribute('data-closing-animation'));
modalOverlay.classList.remove(modalOverlay.getAttribute('data-animation'));
modalOverlay.classList.add(modalOverlay.getAttribute('data-closing-animation'));
timeout = 200;
}
var opened = this.state.opened;
var onModalClose = this.props.onModalClose;
if (opened && onModalClose) {
onModalClose();
}
this._openTimeoutID = setTimeout(function () {
// Store the current modal state
var wasOpened = _this3.state.opened;
// If it was opened, then we are closing it, so restore the body overflow before closing.
if (wasOpened && _this3.refs['modal-overlay']) {
_this3.refs['modal-overlay']._restoreBodyOverflow();
}
_this3.setState({
opened: !wasOpened
}, function () {
if (_this3.refs['modal-overlay']) {
if (!wasOpened) {
// We just opened the modal, so store and hide the body overflow.
_this3.refs['modal-overlay']._hideBodyOverflow();
}
}
});
}, timeout);
};
/**
* Toggle the modal's open state
*/
Modal.prototype.toggleOpen = function toggleOpen() {
var opened = this.state.opened;
var _props2 = this.props,
ConfirmContentComponent = _props2.ConfirmContentComponent,
confirmFunction = _props2.confirmFunction;
if (opened && confirmFunction) {
confirmFunction(ConfirmContentComponent, {
resolve: this._closePopin
});
} else {
this._closePopin();
}
};
/**
* Render the component
* @return {XML} the rendered HTML
*/
Modal.prototype.render = function render() {
// test for this.state.opened and return an Overlay component if true
var _props3 = this.props,
children = _props3.children,
level = _props3.level,
modal = _props3.modal,
overlay = _props3.overlay,
size = _props3.size,
type = _props3.type;
var animationProps = this._getAnimationProps();
return _react2.default.createElement(
'div',
{ 'data-focus': 'modal', 'data-level': level, 'data-size': size, 'data-type': type },
this.state.opened && _react2.default.createElement(
ModalOverlay,
{ clickHandler: !modal && this.toggleOpen, ref: 'modal-overlay', resize: 'full' === type, show: overlay },
_react2.default.createElement(
'div',
_extends({}, animationProps, { 'data-focus': 'modal-window', onClick: this._preventModalClose, ref: 'modal-window' }),
_react2.default.createElement(
'i',
{ className: 'material-icons', 'data-focus': 'modal-window-close', onClick: this.toggleOpen },
'close'
),
_react2.default.createElement(
'div',
{ onWheel: this._onWheel },
children
)
)
)
);
};
/**
* Compute the animation classes
* @return {Object} the props to attach to the component
* @private
*/
Modal.prototype._getAnimationProps = function _getAnimationProps() {
var openingAnimation = void 0;
var closingAnimation = void 0;
switch (this.props.type) {
case 'from-menu':
openingAnimation = 'slideInLeft';
closingAnimation = 'slideOutLeft';
break;
case 'from-right':
openingAnimation = 'slideInRight';
closingAnimation = 'slideOutRight';
break;
default:
openingAnimation = 'zoomIn';
closingAnimation = 'zoomOut';
break;
}
return {
className: 'animated ' + openingAnimation,
'data-animation': openingAnimation,
'data-closing-animation': closingAnimation
};
};
/**
* Prevent modal close when there's a click on the modal window
* @param {Object} event - raised by the click
* @private
*/
Modal.prototype._preventModalClose = function _preventModalClose(event) {
event.stopPropagation();
};
return Modal;
}(_react.Component);
;
Modal.displayName = 'Modal';
Modal.defaultProps = {
ConfirmContentComponent: function ConfirmContentComponent() {
return _react2.default.createElement(
'span',
null,
_i18next2.default.t('focus.components.modal.confirmation.text')
);
},
level: 0,
modal: false,
open: false,
overlay: true,
size: 'medium',
type: 'full'
};
Modal.propTypes = {
confirmFunction: _react.PropTypes.func,
ConfirmContentComponent: _react.PropTypes.func,
level: _react.PropTypes.number.isRequired,
modal: _react.PropTypes.bool.isRequired,
onModalClose: _react.PropTypes.func,
open: _react.PropTypes.bool.isRequired,
overlay: _react.PropTypes.bool.isRequired,
size: _react.PropTypes.oneOf(['small', 'medium', 'large']).isRequired,
type: _react.PropTypes.string.isRequired
};
exports.default = Modal;
module.exports = exports['default'];
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbImZyLUZSLmpzIl0sIm5hbWVzIjpbIk1vZGFsT3ZlcmxheSIsInByb3BzIiwiX2hpZGVCb2R5T3ZlcmZsb3ciLCJiaW5kIiwiX3Jlc3RvcmVCb2R5T3ZlcmZsb3ciLCJjb21wb25lbnREaWRNb3VudCIsImRvY3VtZW50IiwiYm9keSIsInN0eWxlIiwiY29tcG9uZW50V2lsbFVubW91bnQiLCJyZW5kZXIiLCJjaGlsZHJlbiIsImNsaWNrSGFuZGxlciIsInNob3ciLCJvdGhlclByb3BzIiwib25DbGljayIsImRpc3BsYXlOYW1lIiwicHJvcFR5cGVzIiwib2JqZWN0IiwiZnVuYyIsImJvb2wiLCJkZWZhdWx0UHJvcHMiLCJNb2RhbCIsIl9vbldoZWVsIiwidG9nZ2xlT3BlbiIsIl9nZXRBbmltYXRpb25Qcm9wcyIsIl9jbG9zZVBvcGluIiwic3RhdGUiLCJvcGVuZWQiLCJvcGVuIiwid2luZG93IiwiY2xlYXJUaW1lb3V0IiwiX29wZW5UaW1lb3V0SUQiLCJldmVudCIsImZpbmRET01Ob2RlIiwicmVmcyIsInNjcm9sbFRvcCIsImRlbHRhWSIsInRpbWVvdXQiLCJtb2RhbFdpbmRvdyIsIm1vZGFsT3ZlcmxheSIsImNsYXNzTGlzdCIsInJlbW92ZSIsImdldEF0dHJpYnV0ZSIsImFkZCIsIm9uTW9kYWxDbG9zZSIsInNldFRpbWVvdXQiLCJ3YXNPcGVuZWQiLCJzZXRTdGF0ZSIsIkNvbmZpcm1Db250ZW50Q29tcG9uZW50IiwiY29uZmlybUZ1bmN0aW9uIiwicmVzb2x2ZSIsImxldmVsIiwibW9kYWwiLCJvdmVybGF5Iiwic2l6ZSIsInR5cGUiLCJhbmltYXRpb25Qcm9wcyIsIl9wcmV2ZW50TW9kYWxDbG9zZSIsIm9wZW5pbmdBbmltYXRpb24iLCJjbG9zaW5nQW5pbWF0aW9uIiwiY2xhc3NOYW1lIiwic3RvcFByb3BhZ2F0aW9uIiwidCIsIm51bWJlciIsImlzUmVxdWlyZWQiLCJvbmVPZiIsInN0cmluZyJdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7QUFBQTs7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RlU7QUFHakJDLFdBQU8sS0FIVTtBQUlqQnhCLFVBQU0sS0FKVztBQUtqQnlCLGFBQVMsSUFMUTtBQU1qQkMsVUFBTSxRQU5XO0FBT2pCQyxVQUFNO0FBUFcsQ0FBckI7QUFTQWxDLE1BQU1MLFNBQU4sR0FBa0I7QUFDZGlDLHFCQUFpQixpQkFBVS9CLElBRGI7QUFFZDhCLDZCQUF5QixpQkFBVTlCLElBRnJCO0FBR2RpQyxXQUFPLGlCQUFVWSxNQUFWLENBQWlCQyxVQUhWO0FBSWRaLFdBQU8saUJBQVVqQyxJQUFWLENBQWU2QyxVQUpSO0FBS2RwQixrQkFBYyxpQkFBVTFCLElBTFY7QUFNZFUsVUFBTSxpQkFBVVQsSUFBVixDQUFlNkMsVUFOUDtBQU9kWCxhQUFTLGlCQUFVbEMsSUFBVixDQUFlNkMsVUFQVjtBQVFkVixVQUFNLGlCQUFVVyxLQUFWLENBQWdCLENBQUMsT0FBRCxFQUFVLFFBQVYsRUFBb0IsT0FBcEIsQ0FBaEIsRUFBOENELFVBUnRDO0FBU2RULFVBQU0saUJBQVVXLE1BQVYsQ0FBaUJGO0FBVFQsQ0FBbEI7a0JBV2UzQyxLIiwiZmlsZSI6ImZyLUZSLmpzIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IFJlYWN0LCB7UHJvcFR5cGVzLCBDb21wb25lbnR9IGZyb20gJ3JlYWN0JztcclxuaW1wb3J0IFJlYWN0RE9NIGZyb20gJ3JlYWN0LWRvbSc7XHJcbmltcG9ydCBpbmNsdWRlcyBmcm9tICdsb2Rhc2gvaW5jbHVkZXMnO1xyXG5pbXBvcnQgaTE4bmV4dCBmcm9tICdpMThuZXh0JztcclxuXHJcbi8qKlxyXG4qIFNtYWxsIG92ZXJsYXkgY29tcG9uZW50IHVzZWQgdG8gbGlzdGVuIHRvIHNjcm9sbCBhbmQgcHJldmVudCBpdCB0byBsZWF2ZSB0aGUgTW9kYWwgY29tcG9uZW50XHJcbiovXHJcbmNsYXNzIE1vZGFsT3ZlcmxheSBleHRlbmRzIENvbXBvbmVudCB7XHJcbiAgICBjb25zdHJ1Y3Rvcihwcm9wcykge1xyXG4gICAgICAgIHN1cGVyKHByb3BzKTtcclxuICAgICAgICB0aGlzLl9oaWRlQm9keU92ZXJmbG93ID0gdGhpcy5faGlkZUJvZHlPdmVyZmxvdy5iaW5kKHRoaXMpO1xyXG4gICAgICAgIHRoaXMuX3Jlc3RvcmVCb2R5T3ZlcmZsb3cgPSB0aGlzLl9yZXN0b3JlQm9keU92ZXJmbG93LmJpbmQodGhpcyk7XHJcbiAgICB9XHJcbiAgICBjb21wb25lbnREaWRNb3VudCgpIHtcclxuICAgICAgICB0aGlzLl9oaWRlQm9keU92ZXJmbG93KCk7XHJcbiAgICB9XHJcbiAgICAvKipcclxuICAgICogU3RvcmUgdGhlIGJvZHkgb3ZlcmdmbG93IHByb3BlcnR5LCBhbmQgc2V0IGl0IHRvIGhpZGRlblxyXG4gICAgKiBAcHJpdmF0ZVxyXG4gICAgKi9cclxuICAgIF9oaWRlQm9keU92ZXJmbG93KCkge1xyXG4gICAgICAgIGRvY3VtZW50LmJvZHkuc3R5bGVbJ292ZXJmbG93LXknXSA9ICdoaWRkZW4nO1xyXG4gICAgfTtcclxuICAgIC8qKlxyXG4gICAgKiBSZXN0b3JlIGJvZHkgb3ZlcmZsb3cgcHJvcGVydHlcclxuICAgICogQHByaXZhdGVcclxuICAgICovXHJcbiAgICBfcmVzdG9yZUJvZHlPdmVyZmxvdygpIHtcclxuICAgICAgICBkb2N1bWVudC5ib2R5LnN0eWxlWydvdmVyZmxvdy15J10gPSAnYXV0byc7XHJcbiAgICB9O1xyXG4gICAgLyoqXHJcbiAgICAqIENvbXBvbmVudCB3aWxsIHVubW91bnQgZXZlbnQgaGFuZGxlci5cclxuICAgICogUmVtb3ZlIHRoZSBtb3VzZSB3aGVlbCBsaXN0ZW5lci5cclxuICAgICovXHJcbiAgICBjb21wb25lbnRXaWxsVW5tb3VudCgpIHtcclxuICAgICAgICAvLyBSZWFjdERPTS5maW5kRE9NTm9kZSh0aGlzLnJlZnMub3ZlcmxheSkucmVtb3ZlRXZlbnRMaXN0ZW5lcignbW91c2V3aGVlbCcsIHRoaXMuX29uU2Nyb2xsKTtcclxuICAgICAgICB0aGlzLl9yZXN0b3JlQm9keU92ZXJmbG93KCk7XHJcbiAgICB9O1xyXG4gICAgLyoqXHJcbiAgICAqIFJlbmRlciB0aGUgY29tcG9uZW50XHJcbiAgICAqIEByZXR1cm4ge1hNTH0gdGhlIHJlbmRlcmVkIEhUTUxcclxuICAgICovXHJcbiAgICByZW5kZXIoKSB7XHJcbiAgICAgICAgY29uc3Qge2NoaWxkcmVuLCBjbGlja0hhbmRsZXIsIHNob3d9ID0gdGhpcy5wcm9wcztcclxuICAgICAgICBjb25zdCBvdGhlclByb3BzID0gY2xpY2tIYW5kbGVyID8geyBvbkNsaWNrOiBjbGlja0hhbmRsZXIgfSA6IHt9O1xyXG4gICAgICAgIHJldHVybiAoXHJcbiAgICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPSdhbmltYXRlZCBmYWRlSW4nIGRhdGEtYW5pbWF0aW9uPSdmYWRlSW4nIGRhdGEtY2xvc2luZy1hbmltYXRpb249J2ZhZGVPdXQnIGRhdGEtZm9jdXM9J21vZGFsLW92ZXJsYXknIGRhdGEtdmlzaWJsZT17c2hvd30gcmVmPSdvdmVybGF5JyB7Li4ub3RoZXJQcm9wc30+XHJcbiAgICAgICAgICAgICAgICB7Y2hpbGRyZW59XHJcbiAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICk7XHJcbiAgICB9O1xyXG59O1xyXG5Nb2RhbE92ZXJsYXkuZGlzcGxheU5hbWUgPSAnTW9kYWxPdmVybGF5JztcclxuTW9kYWxPdmVybGF5LnByb3BUeXBlcyA9IHtcclxuICAgIGNoaWxkcmVuOiBQcm9wVHlwZXMub2JqZWN0LFxyXG4gICAgY2xpY2tIYW5kbGVyOiBQcm9wVHlwZXMuZnVuYyxcclxuICAgIHNob3c6IFByb3BUeXBlcy5ib29sXHJcbn07XHJcbk1vZGFsT3ZlcmxheS5kZWZhdWx0UHJvcHMgPSB7XHJcbiAgICBzaG93OiBmYWxzZVxyXG59O1xyXG5cclxuXHJcbi8qKlxyXG4qIFRoZSBtb2RhbCBjb21wb25lbnQgY29uZmlndXJhdGlvblxyXG4qIEB0eXBlIHtPYmplY3R9XHJcbiovXHJcbmNsYXNzIE1vZGFsIGV4dGVuZHMgQ29tcG9uZW50IHtcclxuICAgIGNvbnN0cnVjdG9yKHByb3BzKSB7XHJcbiAgICAgICAgc3VwZXIocHJvcHMpO1xyXG4gICAgICAgIHRoaXMuX29uV2hlZWwgPSB0aGlzLl9vbldoZWVsLmJpbmQodGhpcyk7XHJcbiAgICAgICAgdGhpcy50b2dnbGVPcGVuID0gdGhpcy50b2dnbGVPcGVuLmJpbmQodGhpcyk7XHJcbiAgICAgICAgdGhpcy5fZ2V0QW5pbWF0aW9uUHJvcHMgPSB0aGlzLl9nZXRBbmltYXRpb25Qcm9wcy5iaW5kKHRoaXMpO1xyXG4gICAgICAgIHRoaXMuX2Nsb3NlUG9waW4gPSB0aGlzLl9jbG9zZVBvcGluLmJpbmQodGhpcyk7XHJcbiAgICAgICAgdGhpcy5zdGF0ZSA9IHtcclxuICAgICAgICAgICAgb3BlbmVkOiB0aGlzLnByb3BzLm9wZW5cclxuICAgICAgICB9O1xyXG4gICAgfTtcclxuXHJcbiAgICBjb21wb25lbnRXaWxsVW5tb3VudCgpIHtcclxuICAgICAgICB3aW5kb3cuY2xlYXJUaW1lb3V0KHRoaXMuX29wZW5UaW1lb3V0SUQpO1xyXG4gICAgfTtcclxuXHJcbiAgICAvKipcclxuICAgICogV2hlZWwgZXZlbnQgaGFuZGxlci5cclxuICAgICogQHBhcmFtICB7b2JqZWN0fSBldmVudCB3aGVlbCBldmVudFxyXG4gICAgKi9cclxuICAgIF9vbldoZWVsKGV2ZW50KSB7XHJcbiAgICAgICAgUmVhY3RET00uZmluZERPTU5vZGUodGhpcy5yZWZzWydtb2RhbC13aW5kb3cnXSkuc2Nyb2xsVG9wICs9IDAgPCBldmVudC5kZWx0YVkgPyAxMDAgOiAtMTAwO1xyXG4gICAgfTtcclxuXHJcbiAgICBfY2xvc2VQb3BpbigpIHtcclxuICAgICAgICBsZXQgdGltZW91dCA9IDA7XHJcbiAgICAgICAgaWYgKG9wZW5lZCkge1xyXG4gICAgICAgICAgICBjb25zdCBtb2RhbFdpbmRvdyA9IFJlYWN0RE9NLmZpbmRET01Ob2RlKHRoaXMucmVmc1snbW9kYWwtd2luZG93J10pO1xyXG4gICAgICAgICAgICBjb25zdCBtb2RhbE92ZXJsYXkgPSBSZWFjdERPTS5maW5kRE9NTm9kZSh0aGlzLnJlZnNbJ21vZGFsLW92ZXJsYXknXSk7XHJcbiAgICAgICAgICAgIG1vZGFsV2luZG93LmNsYXNzTGlzdC5yZW1vdmUobW9kYWxXaW5kb3cuZ2V0QXR0cmlidXRlKCdkYXRhLWFuaW1hdGlvbicpKTtcclxuICAgICAgICAgICAgbW9kYWxXaW5kb3cuY2xhc3NMaXN0LmFkZChtb2RhbFdpbmRvdy5nZXRBdHRyaWJ1dGUoJ2RhdGEtY2xvc2luZy1hbmltYXRpb24nKSk7XHJcbiAgICAgICAgICAgIG1vZGFsT3ZlcmxheS5jbGFzc0xpc3QucmVtb3ZlKG1vZGFsT3ZlcmxheS5nZXRBdHRyaWJ1dGUoJ2RhdGEtYW5pbWF0aW9uJykpO1xyXG4gICAgICAgICAgICBtb2RhbE92ZXJsYXkuY2xhc3NMaXN0LmFkZChtb2RhbE92ZXJsYXkuZ2V0QXR0cmlidXRlKCdkYXRhLWNsb3NpbmctYW5pbWF0aW9uJykpO1xyXG4gICAgICAgICAgICB0aW1lb3V0ID0gMjAwO1xyXG4gICAgICAgIH1cclxuICAgICAgICBjb25zdCB7b3BlbmVkfSA9IHRoaXMuc3RhdGU7XHJcbiAgICAgICAgY29uc3Qge29uTW9kYWxDbG9zZX0gPSB0aGlzLnByb3BzO1xyXG4gICAgICAgIGlmIChvcGVuZWQgJiYgb25Nb2RhbENsb3NlKSB7XHJcbiAgICAgICAgICAgIG9uTW9kYWxDbG9zZSgpO1xyXG4gICAgICAgIH1cclxuICAgICAgICB0aGlzLl9vcGVuVGltZW91dElEID0gc2V0VGltZW91dCgoKSA9PiB7XHJcbiAgICAgICAgICAgIC8vIFN0b3JlIHRoZSBjdXJyZW50IG1vZGFsIHN0YXRlXHJcbiAgICAgICAgICAgIGNvbnN0IHdhc09wZW5lZCA9IHRoaXMuc3RhdGUub3BlbmVkO1xyXG4gICAgICAgICAgICAvLyBJZiBpdCB3YXMgIG9wZW5lZCwgdGhlbiB3ZSBhcmUgY2xvc2luZyBpdCwgc28gcmVzdG9yZSB0aGUgYm9keSBvdmVyZmxvdyBiZWZvcmUgY2xvc2luZy5cclxuICAgICAgICAgICAgaWYgKHdhc09wZW5lZCAmJiB0aGlzLnJlZnNbJ21vZGFsLW92ZXJsYXknXSkge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5yZWZzWydtb2RhbC1vdmVybGF5J10uX3Jlc3RvcmVCb2R5T3ZlcmZsb3coKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB0aGlzLnNldFN0YXRlKHtcclxuICAgICAgICAgICAgICAgIG9wZW5lZDogIXdhc09wZW5lZFxyXG4gICAgICAgICAgICB9LCAoKSA9PiB7XHJcbiAgICAgICAgICAgICAgICBpZiAodGhpcy5yZWZzWydtb2RhbC1vdmVybGF5J10pIHtcclxuICAgICAgICAgICAgICAgICAgICBpZiAoIXdhc09wZW5lZCkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBXZSBqdXN0IG9wZW5lZCB0aGUgbW9kYWwsIHNvIHN0b3JlIGFuZCBoaWRlIHRoZSBib2R5IG92ZXJmbG93LlxyXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnJlZnNbJ21vZGFsLW92ZXJsYXknXS5faGlkZUJvZHlPdmVyZmxvdygpO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgfSwgdGltZW91dCk7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAqIFRvZ2dsZSB0aGUgbW9kYWwncyBvcGVuIHN0YXRlXHJcbiAgICAqL1xyXG4gICAgdG9nZ2xlT3BlbigpIHtcclxuICAgICAgICBjb25zdCB7b3BlbmVkfSA9IHRoaXMuc3RhdGU7XHJcbiAgICAgICAgY29uc3Qge0NvbmZpcm1Db250ZW50Q29tcG9uZW50LCBjb25maXJtRnVuY3Rpb259ID0gdGhpcy5wcm9wcztcclxuICAgICAgICBpZihvcGVuZWQgJiYgY29uZmlybUZ1bmN0aW9uKSB7XHJcbiAgICAgICAgICAgIGNvbmZpcm1GdW5jdGlvbihcclxuICAgICAgICAgICAgICAgIENvbmZpcm1Db250ZW50Q29tcG9uZW50LFxyXG4gICAgICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgICAgIHJlc29sdmU6IHRoaXMuX2Nsb3NlUG9waW5cclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgKTtcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICB0aGlzLl9jbG9zZVBvcGluKCk7XHJcbiAgICAgICAgfVxyXG4gICAgfTtcclxuXHJcbiAgICAvKipcclxuICAgICogUmVuZGVyIHRoZSBjb21wb25lbnRcclxuICAgICogQHJldHVybiB7WE1MfSB0aGUgcmVuZGVyZWQgSFRNTFxyXG4gICAgKi9cclxuICAgIHJlbmRlcigpIHsgLy8gdGVzdCBmb3IgdGhpcy5zdGF0ZS5vcGVuZWQgYW5kIHJldHVybiBhbiBPdmVybGF5IGNvbXBvbmVudCBpZiB0cnVlXHJcbiAgICAgICAgY29uc3Qge2NoaWxkcmVuLCBsZXZlbCwgbW9kYWwsIG92ZXJsYXksIHNpemUsIHR5cGV9ID0gdGhpcy5wcm9wcztcclxuICAgICAgICBjb25zdCBhbmltYXRpb25Qcm9wcyA9IHRoaXMuX2dldEFuaW1hdGlvblByb3BzKCk7XHJcbiAgICAgICAgcmV0dXJuIChcclxuICAgICAgICAgICAgPGRpdiBkYXRhLWZvY3VzPSdtb2RhbCcgZGF0YS1sZXZlbD17bGV2ZWx9IGRhdGEtc2l6ZT17c2l6ZX0gZGF0YS10eXBlPXt0eXBlfSA+XHJcbiAgICAgICAgICAgICAgICB7dGhpcy5zdGF0ZS5vcGVuZWQgJiZcclxuICAgICAgICAgICAgICAgICAgICA8TW9kYWxPdmVybGF5IGNsaWNrSGFuZGxlcj17IW1vZGFsICYmIHRoaXMudG9nZ2xlT3Blbn0gcmVmPSdtb2RhbC1vdmVybGF5JyByZXNpemU9eydmdWxsJyA9PT0gdHlwZX0gc2hvdz17b3ZlcmxheX0+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgey4uLmFuaW1hdGlvblByb3BzfSBkYXRhLWZvY3VzPSdtb2RhbC13aW5kb3cnIG9uQ2xpY2s9e3RoaXMuX3ByZXZlbnRNb2RhbENsb3NlfSByZWY9J21vZGFsLXdpbmRvdyc+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aSBjbGFzc05hbWU9J21hdGVyaWFsLWljb25zJyBkYXRhLWZvY3VzPSdtb2RhbC13aW5kb3ctY2xvc2UnIG9uQ2xpY2s9e3RoaXMudG9nZ2xlT3Blbn0+Y2xvc2U8L2k+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IG9uV2hlZWw9e3RoaXMuX29uV2hlZWx9PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHtjaGlsZHJlbn1cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICA8L01vZGFsT3ZlcmxheT5cclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgKTtcclxuICAgIH07XHJcblxyXG4gICAgLyoqXHJcbiAgICAqIENvbXB1dGUgdGhlIGFuaW1hdGlvbiBjbGFzc2VzXHJcbiAgICAqIEByZXR1cm4ge09iamVjdH0gdGhlIHByb3BzIHRvIGF0dGFjaCB0byB0aGUgY29tcG9uZW50XHJcbiAgICAqIEBwcml2YXRlXHJcbiAgICAqL1xyXG4gICAgX2dldEFuaW1hdGlvblByb3BzKCkge1xyXG4gICAgICAgIGxldCBvcGVuaW5nQW5pbWF0aW9uO1xyXG4gICAgICAgIGxldCBjbG9zaW5nQW5pbWF0aW9uO1xyXG4gICAgICAgIHN3aXRjaCAodGhpcy5wcm9wcy50eXBlKSB7XHJcbiAgICAgICAgICAgIGNhc2UgJ2Zyb20tbWVudSc6XHJcbiAgICAgICAgICAgIG9wZW5pbmdBbmltYXRpb24gPSAnc2xpZGVJbkxlZnQnO1xyXG4gICAgICAgICAgICBjbG9zaW5nQW5pbWF0aW9uID0gJ3NsaWRlT3V0TGVmdCc7XHJcbiAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICBjYXNlICdmcm9tLXJpZ2h0JzpcclxuICAgICAgICAgICAgb3BlbmluZ0FuaW1hdGlvbiA9ICdzbGlkZUluUmlnaHQnO1xyXG4gICAgICAgICAgICBjbG9zaW5nQW5pbWF0aW9uID0gJ3NsaWRlT3V0UmlnaHQnO1xyXG4gICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgZGVmYXVsdDpcclxuICAgICAgICAgICAgb3BlbmluZ0FuaW1hdGlvbiA9ICd6b29tSW4nO1xyXG4gICAgICAgICAgICBjbG9zaW5nQW5pbWF0aW9uID0gJ3pvb21PdXQnO1xyXG4gICAgICAgICAgICBicmVhaztcclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuICh7XHJcbiAgICAgICAgICAgIGNsYXNzTmFtZTogYGFuaW1hdGVkICR7b3BlbmluZ0FuaW1hdGlvbn1gLFxyXG4gICAgICAgICAgICAnZGF0YS1hbmltYXRpb24nOiBvcGVuaW5nQW5pbWF0aW9uLFxyXG4gICAgICAgICAgICAnZGF0YS1jbG9zaW5nLWFuaW1hdGlvbic6IGNsb3NpbmdBbmltYXRpb25cclxuICAgICAgICB9KTtcclxuICAgIH07XHJcblxyXG4gICAgLyoqXHJcbiAgICAqIFByZXZlbnQgbW9kYWwgY2xvc2Ugd2hlbiB0aGVyZSdzIGEgY2xpY2sgb24gdGhlIG1vZGFsIHdpbmRvd1xyXG4gICAgKiBAcGFyYW0ge09iamVjdH0gZXZlbnQgLSByYWlzZWQgYnkgdGhlIGNsaWNrXHJcbiAgICAqIEBwcml2YXRlXHJcbiAgICAqL1xyXG4gICAgX3ByZXZlbnRNb2RhbENsb3NlKGV2ZW50KSB7XHJcbiAgICAgICAgZXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7XHJcbiAgICB9O1xyXG59O1xyXG5cclxuTW9kYWwuZGlzcGxheU5hbWUgPSAnTW9kYWwnO1xyXG5Nb2RhbC5kZWZhdWx0UHJvcHMgPSB7XHJcbiAgICBDb25maXJtQ29udGVudENvbXBvbmVudDogKCkgPT4gPHNwYW4+e2kxOG5leHQudCgnZm9jdXMuY29tcG9uZW50cy5tb2RhbC5jb25maXJtYXRpb24udGV4dCcpfTwvc3Bhbj4sXHJcbiAgICBsZXZlbDogMCxcclxuICAgIG1vZGFsOiBmYWxzZSxcclxuICAgIG9wZW46IGZhbHNlLFxyXG4gICAgb3ZlcmxheTogdHJ1ZSxcclxuICAgIHNpemU6ICdtZWRpdW0nLFxyXG4gICAgdHlwZTogJ2Z1bGwnXHJcbn07XHJcbk1vZGFsLnByb3BUeXBlcyA9IHtcclxuICAgIGNvbmZpcm1GdW5jdGlvbjogUHJvcFR5cGVzLmZ1bmMsXHJcbiAgICBDb25maXJtQ29udGVudENvbXBvbmVudDogUHJvcFR5cGVzLmZ1bmMsXHJcbiAgICBsZXZlbDogUHJvcFR5cGVzLm51bWJlci5pc1JlcXVpcmVkLFxyXG4gICAgbW9kYWw6IFByb3BUeXBlcy5ib29sLmlzUmVxdWlyZWQsXHJcbiAgICBvbk1vZGFsQ2xvc2U6IFByb3BUeXBlcy5mdW5jLFxyXG4gICAgb3BlbjogUHJvcFR5cGVzLmJvb2wuaXNSZXF1aXJlZCxcclxuICAgIG92ZXJsYXk6IFByb3BUeXBlcy5ib29sLmlzUmVxdWlyZWQsXHJcbiAgICBzaXplOiBQcm9wVHlwZXMub25lT2YoWydzbWFsbCcsICdtZWRpdW0nLCAnbGFyZ2UnXSkuaXNSZXF1aXJlZCxcclxuICAgIHR5cGU6IFByb3BUeXBlcy5zdHJpbmcuaXNSZXF1aXJlZFxyXG59O1xyXG5leHBvcnQgZGVmYXVsdCBNb2RhbDtcclxuIl19
;