UNPKG

react-modalx

Version:
247 lines (225 loc) 30.7 kB
!function(e){if("object"==typeof exports&&"undefined"!=typeof module)module.exports=e();else if("function"==typeof define&&define.amd)define([],e);else{var f;"undefined"!=typeof window?f=window:"undefined"!=typeof global?f=global:"undefined"!=typeof self&&(f=self),f.Modal=e()}}(function(){var define,module,exports;return (function e(t,n,r){function s(o,u){if(!n[o]){if(!t[o]){var a=typeof require=="function"&&require;if(!u&&a)return a(o,!0);if(i)return i(o,!0);var f=new Error("Cannot find module '"+o+"'");throw f.code="MODULE_NOT_FOUND",f}var l=n[o]={exports:{}};t[o][0].call(l.exports,function(e){var n=t[o][1][e];return s(n?n:e)},l,l.exports,e,t,n,r)}return n[o].exports}var i=typeof require=="function"&&require;for(var o=0;o<r.length;o++)s(r[o]);return s})({"./src/index.js":[function(require,module,exports){ var Portal = require('./Portal.js'); module.exports = React.createClass({displayName: "exports", getInitialState: function () { return { portalElementPrefix: 'ReactModal', isOpen: false }; }, getDefaultProps: function() { return { title: 'Modal window', showTitle: false, titleTag: 'h1', description: '', showDescription: false, descriptionTag: 'p' }; }, componentDidMount: function () { if (typeof this.portalElement === 'undefined') { this.portalElement = document.createElement('div'); this.portalElement.className = "ReactModalContainer"; document.body.appendChild(this.portalElement); } this.renderPortal(this.props, this.state); }, componentWillReceiveProps: function(props) { this.renderPortal(props, this.state); }, componentWillUnmount: function () { document.body.removeChild(this.portalElement); }, componentDidUpdate: function() { this.renderPortal(this.props, this.state) }, close: function() { this.setState({isOpen: false}); }, open: function() { this.setState({isOpen: true}); }, renderPortal: function (props, state) { this.modal = React.render(React.createElement(Portal, React.__spread({}, props, state, {close: this.close, open: this.open})), this.portalElement); }, render: function () { return null; } }); },{"./Portal.js":"C:\\Users\\Nicklas\\IdeaProjects\\ReactModal\\src\\Portal.js"}],"C:\\Users\\Nicklas\\IdeaProjects\\ReactModal\\src\\ClassHelper.js":[function(require,module,exports){ function addClass( classname, element ) { var cn = element.className; //test for existance if( cn.indexOf( classname ) != -1 ) { return; } //add a space if the element already has class if( cn != '' ) { classname = ' '+classname; } element.className = cn+classname; } function removeClass( classname, element ) { var cn = element.className; var rxp = new RegExp( "\\s?\\b"+classname+"\\b", "g" ); cn = cn.replace( rxp, '' ); element.className = cn; } module.exports = { addClass: addClass, removeClass: removeClass }; },{}],"C:\\Users\\Nicklas\\IdeaProjects\\ReactModal\\src\\IdHelper.js":[function(require,module,exports){ module.exports = { generateId: function (prefix) { return (prefix || 'GEN_ID-') + new Date().getTime() + '-' + Math.random(); } }; },{}],"C:\\Users\\Nicklas\\IdeaProjects\\ReactModal\\src\\Portal.js":[function(require,module,exports){ var FocusHelper = require('./focusHelper.js'); var ClassHelper = require('./ClassHelper.js'); var IdGenerator = require('./IdHelper.js'); module.exports = React.createClass({displayName: "exports", focusAfterClose: undefined, componentDidMount: function () { if (this.props.isOpen === true) { this.focusFirst(); } }, componentDidUpdate: function () { if (this.props.isOpen) { ClassHelper.addClass('modal-open', document.body); this.focusFirst(); } else { this.restoreFocus(); ClassHelper.removeClass('modal-open', document.body); } }, keyHandler: function (event) { switch (event.keyCode) { case 27: //ESC this.props.close(); event.stopPropagation(); event.preventDefault(); break; case 9: //Tab if (this.handleTabbing(event.shiftKey)) { event.stopPropagation(); event.preventDefault(); } break; } }, handleTabbing: function (shiftKey) { var tabbables = FocusHelper.findTabbables(this.refs.content.getDOMNode()); if (tabbables.length === 0) { return; } var lastValidTabbable = shiftKey ? tabbables[0] : tabbables[tabbables.length - 1]; var currentFocus = document.activeElement; if (currentFocus === lastValidTabbable) { var newFocusElement = shiftKey ? tabbables[tabbables.length - 1] : tabbables[0]; newFocusElement.focus(); return true; } return false; }, focusFirst: function () { this.focusAfterClose = document.activeElement; var tabbables = FocusHelper.findTabbables(this.refs.content.getDOMNode()); if (tabbables.length > 0) { tabbables[0].focus(); } }, restoreFocus: function () { if (this.focusAfterClose) { this.focusAfterClose.focus(); this.focusAfterClose = undefined; } }, render: function () { if (!this.props.isOpen) { return null; } var children = this.props.children; if (!children.hasOwnProperty('length')) { children = [children]; } children = children.map(function (child) { child.props.open = this.props.open; child.props.close = this.props.close; return child; }.bind(this)); var title = createAriaOptional('title', this.props.title, this.props.showTitle, this.props.titleTag); var description = createAriaOptional('description', this.props.description, this.props.showDescription, this.props.descriptionTag); console.log('title', title); return ( React.createElement("div", {tabIndex: "-1", onKeyDown: this.keyHandler, role: "dialog", "aria-labelledby": title.id, "aria-describedby": description.id}, React.createElement("div", {className: "backdrop", onClick: this.props.close}), React.createElement("div", {className: "centering"}, title.hidden, description.hidden, React.createElement("div", {className: "content", ref: "content"}, title.visible, description.visible, children ) ) ) ); } }); function createAriaOptional(idPrefix, content, visibility, tag) { var id = IdGenerator.generateId('react-modalx-' + idPrefix + '-'); var tagComponents = tag.split('.'); var tagType = tagComponents[0]; var className = ''; if (tagComponents.length === 2) { var className = tagComponents[1]; } var element = React.createElement(tagType, {id: id, className: className}, content); return { id: id, hidden: visibility ? null : element, visible: visibility ? element : null }; } },{"./ClassHelper.js":"C:\\Users\\Nicklas\\IdeaProjects\\ReactModal\\src\\ClassHelper.js","./IdHelper.js":"C:\\Users\\Nicklas\\IdeaProjects\\ReactModal\\src\\IdHelper.js","./focusHelper.js":"C:\\Users\\Nicklas\\IdeaProjects\\ReactModal\\src\\focusHelper.js"}],"C:\\Users\\Nicklas\\IdeaProjects\\ReactModal\\src\\focusHelper.js":[function(require,module,exports){ function focusable(element, isTabIndexNotNaN) { var nodeName = element.nodeName.toLowerCase(); return (/input|select|textarea|button|object/.test(nodeName) ? !element.disabled : "a" === nodeName ? element.href || isTabIndexNotNaN : isTabIndexNotNaN) && visible(element); } function hidden(el) { return (el.offsetWidth <= 0 && el.offsetHeight <= 0) || el.style.display === 'none'; } function visible(element) { while (element) { if (element === document.body) break; if (hidden(element)) return false; element = element.parentNode; } return true; } function tabbable(element) { var tabIndex = element.getAttribute('tabindex'); if (tabIndex === null) tabIndex = undefined; var isTabIndexNaN = isNaN(tabIndex); return (isTabIndexNaN || tabIndex >= 0) && focusable(element, !isTabIndexNaN); } function findTabbables(container) { return [].slice.call(container.querySelectorAll('*'), 0).filter(function (element) { return tabbable(element) }); } module.exports = { findTabbables: findTabbables }; },{}]},{},["./src/index.js"])("./src/index.js") }); //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIm5vZGVfbW9kdWxlc1xcYnJvd3NlcmlmeVxcbm9kZV9tb2R1bGVzXFxicm93c2VyLXBhY2tcXF9wcmVsdWRlLmpzIiwiQzpcXFVzZXJzXFxOaWNrbGFzXFxJZGVhUHJvamVjdHNcXFJlYWN0TW9kYWxcXHNyY1xcaW5kZXguanMiLCJDOlxcVXNlcnNcXE5pY2tsYXNcXElkZWFQcm9qZWN0c1xcUmVhY3RNb2RhbFxcc3JjXFxDbGFzc0hlbHBlci5qcyIsIkM6XFxVc2Vyc1xcTmlja2xhc1xcSWRlYVByb2plY3RzXFxSZWFjdE1vZGFsXFxzcmNcXElkSGVscGVyLmpzIiwiQzpcXFVzZXJzXFxOaWNrbGFzXFxJZGVhUHJvamVjdHNcXFJlYWN0TW9kYWxcXHNyY1xcUG9ydGFsLmpzIiwiQzpcXFVzZXJzXFxOaWNrbGFzXFxJZGVhUHJvamVjdHNcXFJlYWN0TW9kYWxcXHNyY1xcZm9jdXNIZWxwZXIuanMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7QUNBQSxJQUFJLE1BQU0sR0FBRyxPQUFPLENBQUMsYUFBYSxDQUFDLENBQUM7O0FBRXBDLG9DQUFvQyx1QkFBQTtJQUNoQyxlQUFlLEVBQUUsWUFBWTtRQUN6QixPQUFPO1lBQ0gsbUJBQW1CLEVBQUUsWUFBWTtZQUNqQyxNQUFNLEVBQUUsS0FBSztTQUNoQixDQUFDO0tBQ0w7SUFDRCxlQUFlLEVBQUUsV0FBVztRQUN4QixPQUFPO1lBQ0gsS0FBSyxFQUFFLGNBQWM7WUFDckIsU0FBUyxFQUFFLEtBQUs7WUFDaEIsUUFBUSxFQUFFLElBQUk7WUFDZCxXQUFXLEVBQUUsRUFBRTtZQUNmLGVBQWUsRUFBRSxLQUFLO0FBQ2xDLFlBQVksY0FBYyxFQUFFLEdBQUc7O1NBRXRCLENBQUM7S0FDTDtJQUNELGlCQUFpQixFQUFFLFlBQVk7UUFDM0IsSUFBSSxPQUFPLElBQUksQ0FBQyxhQUFhLEtBQUssV0FBVyxFQUFFO1lBQzNDLElBQUksQ0FBQyxhQUFhLEdBQUcsUUFBUSxDQUFDLGFBQWEsQ0FBQyxLQUFLLENB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LEtBQUssUUFBUSxDQUFDLElBQUksRUFBRSxNQUFNO1FBQ3JDLElBQUksTUFBTSxDQUFDLE9BQU8sQ0FBQyxFQUFFLE9BQU8sS0FBSyxDQUFDO1FBQ2xDLE9BQU8sR0FBRyxPQUFPLENBQUMsVUFBVSxDQUFDO0tBQ2hDO0lBQ0QsT0FBTyxJQUFJLENBQUM7Q0FDZjtBQUNELFNBQVMsUUFBUSxDQUFDLE9BQU8sRUFBRTtJQUN2QixJQUFJLFFBQVEsR0FBRyxPQUFPLENBQUMsWUFBWSxDQUFDLFVBQVUsQ0FBQyxDQUFDO0lBQ2hELElBQUksUUFBUSxLQUFLLElBQUksRUFBRSxRQUFRLEdBQUcsU0FBUyxDQUFDO0lBQzVDLElBQUksYUFBYSxHQUFHLEtBQUssQ0FBQyxRQUFRLENBQUMsQ0FBQztJQUNwQyxPQUFPLENBQUMsYUFBYSxJQUFJLFFBQVEsSUFBSSxDQUFDLEtBQUssU0FBUyxDQUFDLE9BQU8sRUFBRSxDQUFDLGFBQWEsQ0FBQyxDQUFDO0NBQ2pGO0FBQ0QsU0FBUyxhQUFhLENBQUMsU0FBUyxFQUFFO0lBQzlCLE9BQU8sRUFBRSxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLGdCQUFnQixDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxVQUFVLE9BQU8sRUFBRTtRQUMvRSxPQUFPLFFBQVEsQ0FBQyxPQUFPLENBQUM7S0FDM0IsQ0FBQyxDQUFDO0FBQ1AsQ0FBQztBQUNEOztBQUVBLE1BQU0sQ0FBQyxPQUFPLEdBQUc7SUFDYixhQUFhLEVBQUUsYUFBYTtDQUMvQiIsImZpbGUiOiJnZW5lcmF0ZWQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlc0NvbnRlbnQiOlsiKGZ1bmN0aW9uIGUodCxuLHIpe2Z1bmN0aW9uIHMobyx1KXtpZighbltvXSl7aWYoIXRbb10pe3ZhciBhPXR5cGVvZiByZXF1aXJlPT1cImZ1bmN0aW9uXCImJnJlcXVpcmU7aWYoIXUmJmEpcmV0dXJuIGEobywhMCk7aWYoaSlyZXR1cm4gaShvLCEwKTt2YXIgZj1uZXcgRXJyb3IoXCJDYW5ub3QgZmluZCBtb2R1bGUgJ1wiK28rXCInXCIpO3Rocm93IGYuY29kZT1cIk1PRFVMRV9OT1RfRk9VTkRcIixmfXZhciBsPW5bb109e2V4cG9ydHM6e319O3Rbb11bMF0uY2FsbChsLmV4cG9ydHMsZnVuY3Rpb24oZSl7dmFyIG49dFtvXVsxXVtlXTtyZXR1cm4gcyhuP246ZSl9LGwsbC5leHBvcnRzLGUsdCxuLHIpfXJldHVybiBuW29dLmV4cG9ydHN9dmFyIGk9dHlwZW9mIHJlcXVpcmU9PVwiZnVuY3Rpb25cIiYmcmVxdWlyZTtmb3IodmFyIG89MDtvPHIubGVuZ3RoO28rKylzKHJbb10pO3JldHVybiBzfSkiLCJ2YXIgUG9ydGFsID0gcmVxdWlyZSgnLi9Qb3J0YWwuanMnKTtcblxubW9kdWxlLmV4cG9ydHMgPSBSZWFjdC5jcmVhdGVDbGFzcyh7XG4gICAgZ2V0SW5pdGlhbFN0YXRlOiBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICBwb3J0YWxFbGVtZW50UHJlZml4OiAnUmVhY3RNb2RhbCcsXG4gICAgICAgICAgICBpc09wZW46IGZhbHNlXG4gICAgICAgIH07XG4gICAgfSxcbiAgICBnZXREZWZhdWx0UHJvcHM6IGZ1bmN0aW9uKCkge1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgdGl0bGU6ICdNb2RhbCB3aW5kb3cnLFxuICAgICAgICAgICAgc2hvd1RpdGxlOiBmYWxzZSxcbiAgICAgICAgICAgIHRpdGxlVGFnOiAnaDEnLFxuICAgICAgICAgICAgZGVzY3JpcHRpb246ICcnLFxuICAgICAgICAgICAgc2hvd0Rlc2NyaXB0aW9uOiBmYWxzZSxcbiAgICAgICAgICAgIGRlc2NyaXB0aW9uVGFnOiAncCdcblxuICAgICAgICB9O1xuICAgIH0sXG4gICAgY29tcG9uZW50RGlkTW91bnQ6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgaWYgKHR5cGVvZiB0aGlzLnBvcnRhbEVsZW1lbnQgPT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgICAgICB0aGlzLnBvcnRhbEVsZW1lbnQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKTtcbiAgICAgICAgICAgIHRoaXMucG9ydGFsRWxlbWVudC5jbGFzc05hbWUgPSBcIlJlYWN0TW9kYWxDb250YWluZXJcIjtcbiAgICAgICAgICAgIGRvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQodGhpcy5wb3J0YWxFbGVtZW50KTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLnJlbmRlclBvcnRhbCh0aGlzLnByb3BzLCB0aGlzLnN0YXRlKTtcbiAgICB9LFxuICAgIGNvbXBvbmVudFdpbGxSZWNlaXZlUHJvcHM6IGZ1bmN0aW9uKHByb3BzKSB7XG4gICAgICAgIHRoaXMucmVuZGVyUG9ydGFsKHByb3BzLCB0aGlzLnN0YXRlKTtcbiAgICB9LFxuICAgIGNvbXBvbmVudFdpbGxVbm1vdW50OiBmdW5jdGlvbiAoKSB7XG4gICAgICAgIGRvY3VtZW50LmJvZHkucmVtb3ZlQ2hpbGQodGhpcy5wb3J0YWxFbGVtZW50KTtcbiAgICB9LFxuICAgIGNvbXBvbmVudERpZFVwZGF0ZTogZnVuY3Rpb24oKSB7XG4gICAgICAgIHRoaXMucmVuZGVyUG9ydGFsKHRoaXMucHJvcHMsIHRoaXMuc3RhdGUpXG4gICAgfSxcbiAgICBjbG9zZTogZnVuY3Rpb24oKSB7XG4gICAgICAgIHRoaXMuc2V0U3RhdGUoe2lzT3BlbjogZmFsc2V9KTtcbiAgICB9LFxuICAgIG9wZW46IGZ1bmN0aW9uKCkge1xuICAgICAgICB0aGlzLnNldFN0YXRlKHtpc09wZW46IHRydWV9KTtcbiAgICB9LFxuICAgIHJlbmRlclBvcnRhbDogZnVuY3Rpb24gKHByb3BzLCBzdGF0ZSkge1xuICAgICAgICB0aGlzLm1vZGFsID0gUmVhY3QucmVuZGVyKDxQb3J0YWwgey4uLnByb3BzfSB7Li4uc3RhdGV9IGNsb3NlPXt0aGlzLmNsb3NlfSBvcGVuPXt0aGlzLm9wZW59Lz4sIHRoaXMucG9ydGFsRWxlbWVudCk7XG4gICAgfSxcbiAgICByZW5kZXI6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxufSk7IiwiZnVuY3Rpb24gYWRkQ2xhc3MoIGNsYXNzbmFtZSwgZWxlbWVudCApIHtcclxuICAgIHZhciBjbiA9IGVsZW1lbnQuY2xhc3NOYW1lO1xyXG4gICAgLy90ZXN0IGZvciBleGlzdGFuY2VcclxuICAgIGlmKCBjbi5pbmRleE9mKCBjbGFzc25hbWUgKSAhPSAtMSApIHtcclxuICAgICAgICByZXR1cm47XHJcbiAgICB9XHJcbiAgICAvL2FkZCBhIHNwYWNlIGlmIHRoZSBlbGVtZW50IGFscmVhZHkgaGFzIGNsYXNzXHJcbiAgICBpZiggY24gIT0gJycgKSB7XHJcbiAgICAgICAgY2xhc3NuYW1lID0gJyAnK2NsYXNzbmFtZTtcclxuICAgIH1cclxuICAgIGVsZW1lbnQuY2xhc3NOYW1lID0gY24rY2xhc3NuYW1lO1xyXG59XHJcblxyXG5mdW5jdGlvbiByZW1vdmVDbGFzcyggY2xhc3NuYW1lLCBlbGVtZW50ICkge1xyXG4gICAgdmFyIGNuID0gZWxlbWVudC5jbGFzc05hbWU7XHJcbiAgICB2YXIgcnhwID0gbmV3IFJlZ0V4cCggXCJcXFxccz9cXFxcYlwiK2NsYXNzbmFtZStcIlxcXFxiXCIsIFwiZ1wiICk7XHJcbiAgICBjbiA9IGNuLnJlcGxhY2UoIHJ4cCwgJycgKTtcclxuICAgIGVsZW1lbnQuY2xhc3NOYW1lID0gY247XHJcbn1cclxuXHJcbm1vZHVsZS5leHBvcnRzID0ge1xyXG4gICAgYWRkQ2xhc3M6IGFkZENsYXNzLFxyXG4gICAgcmVtb3ZlQ2xhc3M6IHJlbW92ZUNsYXNzXHJcbn07IiwibW9kdWxlLmV4cG9ydHMgPSB7XHJcbiAgICBnZW5lcmF0ZUlkOiBmdW5jdGlvbiAocHJlZml4KSB7XHJcbiAgICAgICAgcmV0dXJuIChwcmVmaXggfHwgJ0dFTl9JRC0nKSArIG5ldyBEYXRlKCkuZ2V0VGltZSgpICsgJy0nICsgTWF0aC5yYW5kb20oKTtcclxuICAgIH1cclxufTsiLCJ2YXIgRm9jdXNIZWxwZXIgPSByZXF1aXJlKCcuL2ZvY3VzSGVscGVyLmpzJyk7XG52YXIgQ2xhc3NIZWxwZXIgPSByZXF1aXJlKCcuL0NsYXNzSGVscGVyLmpzJyk7XG52YXIgSWRHZW5lcmF0b3IgPSByZXF1aXJlKCcuL0lkSGVscGVyLmpzJyk7XG5cbm1vZHVsZS5leHBvcnRzID0gUmVhY3QuY3JlYXRlQ2xhc3Moe1xuICAgIGZvY3VzQWZ0ZXJDbG9zZTogdW5kZWZpbmVkLFxuICAgIGNvbXBvbmVudERpZE1vdW50OiBmdW5jdGlvbiAoKSB7XG4gICAgICAgIGlmICh0aGlzLnByb3BzLmlzT3BlbiA9PT0gdHJ1ZSkge1xuICAgICAgICAgICAgdGhpcy5mb2N1c0ZpcnN0KCk7XG4gICAgICAgIH1cbiAgICB9LFxuICAgIGNvbXBvbmVudERpZFVwZGF0ZTogZnVuY3Rpb24gKCkge1xuICAgICAgICBpZiAodGhpcy5wcm9wcy5pc09wZW4pIHtcbiAgICAgICAgICAgIENsYXNzSGVscGVyLmFkZENsYXNzKCdtb2RhbC1vcGVuJywgZG9jdW1lbnQuYm9keSk7XG4gICAgICAgICAgICB0aGlzLmZvY3VzRmlyc3QoKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMucmVzdG9yZUZvY3VzKCk7XG4gICAgICAgICAgICBDbGFzc0hlbHBlci5yZW1vdmVDbGFzcygnbW9kYWwtb3BlbicsIGRvY3VtZW50LmJvZHkpO1xuICAgICAgICB9XG4gICAgfSxcbiAgICBrZXlIYW5kbGVyOiBmdW5jdGlvbiAoZXZlbnQpIHtcbiAgICAgICAgc3dpdGNoIChldmVudC5rZXlDb2RlKSB7XG4gICAgICAgICAgICBjYXNlIDI3OiAvL0VTQ1xuICAgICAgICAgICAgICAgIHRoaXMucHJvcHMuY2xvc2UoKTtcbiAgICAgICAgICAgICAgICBldmVudC5zdG9wUHJvcGFnYXRpb24oKTtcbiAgICAgICAgICAgICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgY2FzZSA5OiAvL1RhYlxuICAgICAgICAgICAgICAgIGlmICh0aGlzLmhhbmRsZVRhYmJpbmcoZXZlbnQuc2hpZnRLZXkpKSB7XG4gICAgICAgICAgICAgICAgICAgIGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpO1xuICAgICAgICAgICAgICAgICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgIH0sXG4gICAgaGFuZGxlVGFiYmluZzogZnVuY3Rpb24gKHNoaWZ0S2V5KSB7XG4gICAgICAgIHZhciB0YWJiYWJsZXMgPSBGb2N1c0hlbHBlci5maW5kVGFiYmFibGVzKHRoaXMucmVmcy5jb250ZW50LmdldERPTU5vZGUoKSk7XG4gICAgICAgIGlmICh0YWJiYWJsZXMubGVuZ3RoID09PSAwKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICB2YXIgbGFzdFZhbGlkVGFiYmFibGUgPSBzaGlmdEtleSA/IHRhYmJhYmxlc1swXSA6IHRhYmJhYmxlc1t0YWJiYWJsZXMubGVuZ3RoIC0gMV07XG4gICAgICAgIHZhciBjdXJyZW50Rm9jdXMgPSBkb2N1bWVudC5hY3RpdmVFbGVtZW50O1xuXG4gICAgICAgIGlmIChjdXJyZW50Rm9jdXMgPT09IGxhc3RWYWxpZFRhYmJhYmxlKSB7XG4gICAgICAgICAgICB2YXIgbmV3Rm9jdXNFbGVtZW50ID0gc2hpZnRLZXkgPyB0YWJiYWJsZXNbdGFiYmFibGVzLmxlbmd0aCAtIDFdIDogdGFiYmFibGVzWzBdO1xuICAgICAgICAgICAgbmV3Rm9jdXNFbGVtZW50LmZvY3VzKCk7XG4gICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgfSxcbiAgICBmb2N1c0ZpcnN0OiBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHRoaXMuZm9jdXNBZnRlckNsb3NlID0gZG9jdW1lbnQuYWN0aXZlRWxlbWVudDtcbiAgICAgICAgdmFyIHRhYmJhYmxlcyA9IEZvY3VzSGVscGVyLmZpbmRUYWJiYWJsZXModGhpcy5yZWZzLmNvbnRlbnQuZ2V0RE9NTm9kZSgpKTtcbiAgICAgICAgaWYgKHRhYmJhYmxlcy5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICB0YWJiYWJsZXNbMF0uZm9jdXMoKTtcbiAgICAgICAgfVxuICAgIH0sXG4gICAgcmVzdG9yZUZvY3VzOiBmdW5jdGlvbiAoKSB7XG4gICAgICAgIGlmICh0aGlzLmZvY3VzQWZ0ZXJDbG9zZSkge1xuICAgICAgICAgICAgdGhpcy5mb2N1c0FmdGVyQ2xvc2UuZm9jdXMoKTtcbiAgICAgICAgICAgIHRoaXMuZm9jdXNBZnRlckNsb3NlID0gdW5kZWZpbmVkO1xuICAgICAgICB9XG4gICAgfSxcbiAgICByZW5kZXI6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgaWYgKCF0aGlzLnByb3BzLmlzT3Blbikge1xuICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgIH1cblxuICAgICAgICB2YXIgY2hpbGRyZW4gPSB0aGlzLnByb3BzLmNoaWxkcmVuO1xuICAgICAgICBpZiAoIWNoaWxkcmVuLmhhc093blByb3BlcnR5KCdsZW5ndGgnKSkge1xuICAgICAgICAgICAgY2hpbGRyZW4gPSBbY2hpbGRyZW5dO1xuICAgICAgICB9XG5cbiAgICAgICAgY2hpbGRyZW4gPSBjaGlsZHJlbi5tYXAoZnVuY3Rpb24gKGNoaWxkKSB7XG4gICAgICAgICAgICBjaGlsZC5wcm9wcy5vcGVuID0gdGhpcy5wcm9wcy5vcGVuO1xuICAgICAgICAgICAgY2hpbGQucHJvcHMuY2xvc2UgPSB0aGlzLnByb3BzLmNsb3NlO1xuICAgICAgICAgICAgcmV0dXJuIGNoaWxkO1xuICAgICAgICB9LmJpbmQodGhpcykpO1xuXG4gICAgICAgIHZhciB0aXRsZSA9IGNyZWF0ZUFyaWFPcHRpb25hbCgndGl0bGUnLCB0aGlzLnByb3BzLnRpdGxlLCB0aGlzLnByb3BzLnNob3dUaXRsZSwgdGhpcy5wcm9wcy50aXRsZVRhZyk7XG4gICAgICAgIHZhciBkZXNjcmlwdGlvbiA9IGNyZWF0ZUFyaWFPcHRpb25hbCgnZGVzY3JpcHRpb24nLCB0aGlzLnByb3BzLmRlc2NyaXB0aW9uLCB0aGlzLnByb3BzLnNob3dEZXNjcmlwdGlvbiwgdGhpcy5wcm9wcy5kZXNjcmlwdGlvblRhZyk7XG4gICAgICAgIGNvbnNvbGUubG9nKCd0aXRsZScsIHRpdGxlKTtcblxuICAgICAgICByZXR1cm4gKFxuICAgICAgICAgICAgPGRpdiB0YWJJbmRleD1cIi0xXCIgb25LZXlEb3duPXt0aGlzLmtleUhhbmRsZXJ9IHJvbGU9XCJkaWFsb2dcIiBhcmlhLWxhYmVsbGVkYnk9e3RpdGxlLmlkfSBhcmlhLWRlc2NyaWJlZGJ5PXtkZXNjcmlwdGlvbi5pZH0+XG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJiYWNrZHJvcFwiIG9uQ2xpY2s9e3RoaXMucHJvcHMuY2xvc2V9PjwvZGl2PlxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPVwiY2VudGVyaW5nXCI+XG4gICAgICAgICAgICAgICAgICAgIHt0aXRsZS5oaWRkZW59XG4gICAgICAgICAgICAgICAgICAgIHtkZXNjcmlwdGlvbi5oaWRkZW59XG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPVwiY29udGVudFwiIHJlZj1cImNvbnRlbnRcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgIHt0aXRsZS52aXNpYmxlfVxuICAgICAgICAgICAgICAgICAgICAgICAge2Rlc2NyaXB0aW9uLnZpc2libGV9XG4gICAgICAgICAgICAgICAgICAgICAgICB7Y2hpbGRyZW59XG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICk7XG4gICAgfVxufSk7XG5mdW5jdGlvbiBjcmVhdGVBcmlhT3B0aW9uYWwoaWRQcmVmaXgsIGNvbnRlbnQsIHZpc2liaWxpdHksIHRhZykge1xuICAgIHZhciBpZCA9IElkR2VuZXJhdG9yLmdlbmVyYXRlSWQoJ3JlYWN0LW1vZGFseC0nICsgaWRQcmVmaXggKyAnLScpO1xuXG4gICAgdmFyIHRhZ0NvbXBvbmVudHMgPSB0YWcuc3BsaXQoJy4nKTtcbiAgICB2YXIgdGFnVHlwZSA9IHRhZ0NvbXBvbmVudHNbMF07XG4gICAgdmFyIGNsYXNzTmFtZSA9ICcnO1xuXG4gICAgaWYgKHRhZ0NvbXBvbmVudHMubGVuZ3RoID09PSAyKSB7XG4gICAgICAgIHZhciBjbGFzc05hbWUgPSB0YWdDb21wb25lbnRzWzFdO1xuICAgIH1cblxuICAgIHZhciBlbGVtZW50ID0gUmVhY3QuY3JlYXRlRWxlbWVudCh0YWdUeXBlLCB7aWQ6IGlkLCBjbGFzc05hbWU6IGNsYXNzTmFtZX0sIGNvbnRlbnQpO1xuICAgIHJldHVybiB7XG4gICAgICAgIGlkOiBpZCxcbiAgICAgICAgaGlkZGVuOiB2aXNpYmlsaXR5ID8gbnVsbCA6IGVsZW1lbnQsXG4gICAgICAgIHZpc2libGU6IHZpc2liaWxpdHkgPyBlbGVtZW50IDogbnVsbFxuICAgIH07XG59IiwiZnVuY3Rpb24gZm9jdXNhYmxlKGVsZW1lbnQsIGlzVGFiSW5kZXhOb3ROYU4pIHtcbiAgICB2YXIgbm9kZU5hbWUgPSBlbGVtZW50Lm5vZGVOYW1lLnRvTG93ZXJDYXNlKCk7XG4gICAgcmV0dXJuICgvaW5wdXR8c2VsZWN0fHRleHRhcmVhfGJ1dHRvbnxvYmplY3QvLnRlc3Qobm9kZU5hbWUpID9cbiAgICAgICAgICAgICFlbGVtZW50LmRpc2FibGVkIDpcbiAgICAgICAgICAgIFwiYVwiID09PSBub2RlTmFtZSA/XG4gICAgICAgICAgICBlbGVtZW50LmhyZWYgfHwgaXNUYWJJbmRleE5vdE5hTiA6XG4gICAgICAgICAgICAgICAgaXNUYWJJbmRleE5vdE5hTikgJiYgdmlzaWJsZShlbGVtZW50KTtcbn1cbmZ1bmN0aW9uIGhpZGRlbihlbCkge1xuICAgIHJldHVybiAoZWwub2Zmc2V0V2lkdGggPD0gMCAmJiBlbC5vZmZzZXRIZWlnaHQgPD0gMCkgfHxcbiAgICAgICAgZWwuc3R5bGUuZGlzcGxheSA9PT0gJ25vbmUnO1xufVxuXG5mdW5jdGlvbiB2aXNpYmxlKGVsZW1lbnQpIHtcbiAgICB3aGlsZSAoZWxlbWVudCkge1xuICAgICAgICBpZiAoZWxlbWVudCA9PT0gZG9jdW1lbnQuYm9keSkgYnJlYWs7XG4gICAgICAgIGlmIChoaWRkZW4oZWxlbWVudCkpIHJldHVybiBmYWxzZTtcbiAgICAgICAgZWxlbWVudCA9IGVsZW1lbnQucGFyZW50Tm9kZTtcbiAgICB9XG4gICAgcmV0dXJuIHRydWU7XG59XG5mdW5jdGlvbiB0YWJiYWJsZShlbGVtZW50KSB7XG4gICAgdmFyIHRhYkluZGV4ID0gZWxlbWVudC5nZXRBdHRyaWJ1dGUoJ3RhYmluZGV4Jyk7XG4gICAgaWYgKHRhYkluZGV4ID09PSBudWxsKSB0YWJJbmRleCA9IHVuZGVmaW5lZDtcbiAgICB2YXIgaXNUYWJJbmRleE5hTiA9IGlzTmFOKHRhYkluZGV4KTtcbiAgICByZXR1cm4gKGlzVGFiSW5kZXhOYU4gfHwgdGFiSW5kZXggPj0gMCkgJiYgZm9jdXNhYmxlKGVsZW1lbnQsICFpc1RhYkluZGV4TmFOKTtcbn1cbmZ1bmN0aW9uIGZpbmRUYWJiYWJsZXMoY29udGFpbmVyKSB7XG4gICAgcmV0dXJuIFtdLnNsaWNlLmNhbGwoY29udGFpbmVyLnF1ZXJ5U2VsZWN0b3JBbGwoJyonKSwgMCkuZmlsdGVyKGZ1bmN0aW9uIChlbGVtZW50KSB7XG4gICAgICAgIHJldHVybiB0YWJiYWJsZShlbGVtZW50KVxuICAgIH0pO1xufVxuXG5cbm1vZHVsZS5leHBvcnRzID0ge1xuICAgIGZpbmRUYWJiYWJsZXM6IGZpbmRUYWJiYWJsZXNcbn07Il19